patch-2.4.18 linux/drivers/char/sonypi.c
Next file: linux/drivers/char/sonypi.h
Previous file: linux/drivers/char/softdog.c
Back to the patch index
Back to the overall index
- Lines: 203
- Date:
Thu Feb 7 16:59:00 2002
- Orig file:
linux.orig/drivers/char/sonypi.c
- Orig date:
Mon Feb 18 20:18:39 2002
diff -Naur -X /home/marcelo/lib/dontdiff linux.orig/drivers/char/sonypi.c linux/drivers/char/sonypi.c
@@ -109,25 +109,29 @@
return result;
}
-static void sonypi_ecrset(u16 addr, u16 value) {
+static void sonypi_ecrset(u8 addr, u8 value) {
- wait_on_command(1, inw_p(SONYPI_CST_IOPORT) & 3);
- outw_p(0x81, SONYPI_CST_IOPORT);
- wait_on_command(0, inw_p(SONYPI_CST_IOPORT) & 2);
- outw_p(addr, SONYPI_DATA_IOPORT);
- wait_on_command(0, inw_p(SONYPI_CST_IOPORT) & 2);
- outw_p(value, SONYPI_DATA_IOPORT);
- wait_on_command(0, inw_p(SONYPI_CST_IOPORT) & 2);
-}
-
-static u16 sonypi_ecrget(u16 addr) {
-
- wait_on_command(1, inw_p(SONYPI_CST_IOPORT) & 3);
- outw_p(0x80, SONYPI_CST_IOPORT);
- wait_on_command(0, inw_p(SONYPI_CST_IOPORT) & 2);
- outw_p(addr, SONYPI_DATA_IOPORT);
- wait_on_command(0, inw_p(SONYPI_CST_IOPORT) & 2);
- return inw_p(SONYPI_DATA_IOPORT);
+ wait_on_command(1, inb_p(SONYPI_CST_IOPORT) & 3);
+ outb_p(0x81, SONYPI_CST_IOPORT);
+ wait_on_command(0, inb_p(SONYPI_CST_IOPORT) & 2);
+ outb_p(addr, SONYPI_DATA_IOPORT);
+ wait_on_command(0, inb_p(SONYPI_CST_IOPORT) & 2);
+ outb_p(value, SONYPI_DATA_IOPORT);
+ wait_on_command(0, inb_p(SONYPI_CST_IOPORT) & 2);
+}
+
+static u8 sonypi_ecrget(u8 addr) {
+
+ wait_on_command(1, inb_p(SONYPI_CST_IOPORT) & 3);
+ outb_p(0x80, SONYPI_CST_IOPORT);
+ wait_on_command(0, inb_p(SONYPI_CST_IOPORT) & 2);
+ outb_p(addr, SONYPI_DATA_IOPORT);
+ wait_on_command(0, inb_p(SONYPI_CST_IOPORT) & 2);
+ return inb_p(SONYPI_DATA_IOPORT);
+}
+
+static u16 sonypi_ecrget16(u8 addr) {
+ return sonypi_ecrget(addr) | (sonypi_ecrget(addr + 1) << 8);
}
/* Initializes the device - this comes from the AML code in the ACPI bios */
@@ -286,19 +290,38 @@
sonypi_device.camera_power = 1;
}
+/* sets the bluetooth subsystem power state */
+static void sonypi_setbluetoothpower(u8 state) {
+
+ state = (state != 0);
+ if (sonypi_device.bluetooth_power && state)
+ return;
+ if (!sonypi_device.bluetooth_power && !state)
+ return;
+
+ sonypi_call2(0x96, state);
+ sonypi_call1(0x93);
+ sonypi_device.bluetooth_power = state;
+}
+
/* Interrupt handler: some event is available */
void sonypi_irq(int irq, void *dev_id, struct pt_regs *regs) {
u8 v1, v2, event = 0;
int i;
u8 sonypi_jogger_ev, sonypi_fnkey_ev;
+ u8 sonypi_capture_ev, sonypi_bluetooth_ev;
if (sonypi_device.model == SONYPI_DEVICE_MODEL_TYPE2) {
sonypi_jogger_ev = SONYPI_TYPE2_JOGGER_EV;
sonypi_fnkey_ev = SONYPI_TYPE2_FNKEY_EV;
+ sonypi_capture_ev = SONYPI_TYPE2_CAPTURE_EV;
+ sonypi_bluetooth_ev = SONYPI_TYPE2_BLUETOOTH_EV;
}
else {
sonypi_jogger_ev = SONYPI_TYPE1_JOGGER_EV;
sonypi_fnkey_ev = SONYPI_TYPE1_FNKEY_EV;
+ sonypi_capture_ev = SONYPI_TYPE1_CAPTURE_EV;
+ sonypi_bluetooth_ev = SONYPI_TYPE1_BLUETOOTH_EV;
}
v1 = inb_p(sonypi_device.ioport1);
@@ -318,7 +341,7 @@
goto found;
}
}
- if ((v2 & SONYPI_CAPTURE_EV) == SONYPI_CAPTURE_EV) {
+ if ((v2 & sonypi_capture_ev) == sonypi_capture_ev) {
for (i = 0; sonypi_captureev[i].event; i++)
if (sonypi_captureev[i].data == v1) {
event = sonypi_captureev[i].event;
@@ -332,7 +355,7 @@
goto found;
}
}
- if ((v2 & SONYPI_BLUETOOTH_EV) == SONYPI_BLUETOOTH_EV) {
+ if ((v2 & sonypi_bluetooth_ev) == sonypi_bluetooth_ev) {
for (i = 0; sonypi_blueev[i].event; i++)
if (sonypi_blueev[i].data == v1) {
event = sonypi_blueev[i].event;
@@ -510,24 +533,74 @@
static int sonypi_misc_ioctl(struct inode *ip, struct file *fp,
unsigned int cmd, unsigned long arg) {
int ret = 0;
- u8 val;
+ u8 val8;
+ u16 val16;
down(&sonypi_device.lock);
switch (cmd) {
- case SONYPI_IOCGBRT:
- val = sonypi_ecrget(0x96) & 0xff;
- if (copy_to_user((u8 *)arg, &val, sizeof(val))) {
- ret = -EFAULT;
- goto out;
- }
- break;
- case SONYPI_IOCSBRT:
- if (copy_from_user(&val, (u8 *)arg, sizeof(val))) {
- ret = -EFAULT;
- goto out;
- }
- sonypi_ecrset(0x96, val);
- break;
+ case SONYPI_IOCGBRT:
+ val8 = sonypi_ecrget(0x96);
+ if (copy_to_user((u8 *)arg, &val8, sizeof(val8))) {
+ ret = -EFAULT;
+ goto out;
+ }
+ break;
+ case SONYPI_IOCSBRT:
+ if (copy_from_user(&val8, (u8 *)arg, sizeof(val8))) {
+ ret = -EFAULT;
+ goto out;
+ }
+ sonypi_ecrset(0x96, val8);
+ break;
+ case SONYPI_IOCGBAT1CAP:
+ val16 = sonypi_ecrget16(0xb2);
+ if (copy_to_user((u16 *)arg, &val16, sizeof(val16))) {
+ ret = -EFAULT;
+ goto out;
+ }
+ break;
+ case SONYPI_IOCGBAT1REM:
+ val16 = sonypi_ecrget16(0xa2);
+ if (copy_to_user((u16 *)arg, &val16, sizeof(val16))) {
+ ret = -EFAULT;
+ goto out;
+ }
+ break;
+ case SONYPI_IOCGBAT2CAP:
+ val16 = sonypi_ecrget16(0xba);
+ if (copy_to_user((u16 *)arg, &val16, sizeof(val16))) {
+ ret = -EFAULT;
+ goto out;
+ }
+ break;
+ case SONYPI_IOCGBAT2REM:
+ val16 = sonypi_ecrget16(0xaa);
+ if (copy_to_user((u16 *)arg, &val16, sizeof(val16))) {
+ ret = -EFAULT;
+ goto out;
+ }
+ break;
+ case SONYPI_IOCGBATFLAGS:
+ val8 = sonypi_ecrget(0x81) & 0x07;
+ if (copy_to_user((u8 *)arg, &val8, sizeof(val8))) {
+ ret = -EFAULT;
+ goto out;
+ }
+ break;
+ case SONYPI_IOCGBLUE:
+ val8 = sonypi_device.bluetooth_power;
+ if (copy_to_user((u8 *)arg, &val8, sizeof(val8))) {
+ ret = -EFAULT;
+ goto out;
+ }
+ break;
+ case SONYPI_IOCSBLUE:
+ if (copy_from_user(&val8, (u8 *)arg, sizeof(val8))) {
+ ret = -EFAULT;
+ goto out;
+ }
+ sonypi_setbluetoothpower(val8);
+ break;
default:
ret = -EINVAL;
}
@@ -562,6 +635,7 @@
sonypi_device.model = SONYPI_DEVICE_MODEL_TYPE2;
sonypi_initq();
init_MUTEX(&sonypi_device.lock);
+ sonypi_device.bluetooth_power = 0;
if (pcidev && pci_enable_device(pcidev)) {
printk(KERN_ERR "sonypi: pci_enable_device failed\n");
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)