]> git.hungrycats.org Git - linux/commitdiff
[PATCH] sonypi driver update
authorStelian Pop <stelian@popies.net>
Sun, 31 Aug 2003 07:01:15 +0000 (00:01 -0700)
committerLinus Torvalds <torvalds@home.osdl.org>
Sun, 31 Aug 2003 07:01:15 +0000 (00:01 -0700)
This updates the sonypi driver to the latest version:
        * document the fact that FX501/FX702 laptops are not supported

        * add battery insert/remove events (thanks to Daniel K.)

        * improve the event detection using a different port offset
          on 'type2' models (thanks to Daniel K.)

Documentation/sonypi.txt
drivers/char/sonypi.c
drivers/char/sonypi.h
include/linux/sonypi.h

index e66812867f27b125ed97e0841ca65b2a33550e47..70850dce1ea1529a50cbb263b188805c3a8aad29 100644 (file)
@@ -8,7 +8,9 @@ Sony Programmable I/O Control Device Driver Readme
        Copyright (C) 2000 Andrew Tridgell <tridge@samba.org>
 
 This driver enables access to the Sony Programmable I/O Control Device which
-can be found in many (all ?) Sony Vaio laptops.
+can be found in many Sony Vaio laptops. Some newer Sony laptops (seems to be
+limited to new FX series laptops, at least the FX501 and the FX702) lack a
+sonypi device and are not supported at all by this driver.
 
 It will give access (through a user space utility) to some events those laptops
 generate, like:
@@ -96,6 +98,7 @@ where:
                                SONYPI_THUMBPHRASE_MASK         0x0200
                                SONYPI_MEYE_MASK                0x0400
                                SONYPI_MEMORYSTICK_MASK         0x0800
+                               SONYPI_BATTERY_MASK             0x1000
 
        useinput:       if set (which is the default) jogdial events are
                        forwarded to the input subsystem as mouse wheel
index 82047e882684c3f0b31bf05179d1d943e03bfef8..7627d4281a59bda2e60cea21303820fcb667f975 100644 (file)
@@ -308,7 +308,7 @@ static irqreturn_t sonypi_irq(int irq, void *dev_id, struct pt_regs *regs) {
        int i, j;
 
        v1 = inb_p(sonypi_device.ioport1);
-       v2 = inb_p(sonypi_device.ioport2);
+       v2 = inb_p(sonypi_device.ioport1 + sonypi_device.evtype_offset);
 
        for (i = 0; sonypi_eventtypes[i].model; i++) {
                if (sonypi_device.model != sonypi_eventtypes[i].model)
@@ -670,11 +670,13 @@ static int __devinit sonypi_probe(struct pci_dev *pcidev) {
        if (sonypi_device.model == SONYPI_DEVICE_MODEL_TYPE2) {
                ioport_list = sonypi_type2_ioport_list;
                sonypi_device.region_size = SONYPI_TYPE2_REGION_SIZE;
+               sonypi_device.evtype_offset = SONYPI_TYPE2_EVTYPE_OFFSET;
                irq_list = sonypi_type2_irq_list;
        }
        else {
                ioport_list = sonypi_type1_ioport_list;
                sonypi_device.region_size = SONYPI_TYPE1_REGION_SIZE;
+               sonypi_device.evtype_offset = SONYPI_TYPE1_EVTYPE_OFFSET;
                irq_list = sonypi_type1_irq_list;
        }
 
index f0907e3f9ce9dc76c396d99c1b4ac3cb2f885046..03bd837fafa996aaf89a9dc5a04fe0d88e5706e4 100644 (file)
 #define SONYPI_BASE                    0x50
 #define SONYPI_G10A                    (SONYPI_BASE+0x14)
 #define SONYPI_TYPE1_REGION_SIZE       0x08
+#define SONYPI_TYPE1_EVTYPE_OFFSET     0x04
 
 /* type2 series specifics */
 #define SONYPI_SIRQ                    0x9b
 #define SONYPI_SLOB                    0x9c
 #define SONYPI_SHIB                    0x9d
 #define SONYPI_TYPE2_REGION_SIZE       0x20
+#define SONYPI_TYPE2_EVTYPE_OFFSET     0x12
 
 /* battery / brightness addresses */
 #define SONYPI_BAT_FLAGS       0x81
@@ -167,6 +169,7 @@ static struct sonypi_irq_list sonypi_type2_irq_list[] = {
 #define SONYPI_THUMBPHRASE_MASK                        0x00000200
 #define SONYPI_MEYE_MASK                       0x00000400
 #define SONYPI_MEMORYSTICK_MASK                        0x00000800
+#define SONYPI_BATTERY_MASK                    0x00001000
 
 struct sonypi_event {
        u8      data;
@@ -293,6 +296,13 @@ static struct sonypi_event sonypi_memorystickev[] = {
        { 0, 0 }
 };
 
+/* The set of possible battery events */
+static struct sonypi_event sonypi_batteryev[] = {
+       { 0x20, SONYPI_EVENT_BATTERY_INSERT },
+       { 0x30, SONYPI_EVENT_BATTERY_REMOVE },
+       { 0, 0 }
+};
+
 struct sonypi_eventtypes {
        int                     model;
        u8                      data;
@@ -307,19 +317,22 @@ struct sonypi_eventtypes {
        { SONYPI_DEVICE_MODEL_TYPE1, 0x20, SONYPI_FNKEY_MASK, sonypi_fnkeyev },
        { SONYPI_DEVICE_MODEL_TYPE1, 0x30, SONYPI_BLUETOOTH_MASK, sonypi_blueev },
        { SONYPI_DEVICE_MODEL_TYPE1, 0x40, SONYPI_PKEY_MASK, sonypi_pkeyev },
+       { SONYPI_DEVICE_MODEL_TYPE1, 0x30, SONYPI_MEMORYSTICK_MASK, sonypi_memorystickev },
+       { SONYPI_DEVICE_MODEL_TYPE1, 0x40, SONYPI_BATTERY_MASK, sonypi_batteryev },
 
        { SONYPI_DEVICE_MODEL_TYPE2, 0, 0xffffffff, sonypi_releaseev },
        { SONYPI_DEVICE_MODEL_TYPE2, 0x38, SONYPI_LID_MASK, sonypi_lidev },
-       { SONYPI_DEVICE_MODEL_TYPE2, 0x08, SONYPI_JOGGER_MASK, sonypi_joggerev },
+       { SONYPI_DEVICE_MODEL_TYPE2, 0x11, SONYPI_JOGGER_MASK, sonypi_joggerev },
        { SONYPI_DEVICE_MODEL_TYPE2, 0x08, SONYPI_CAPTURE_MASK, sonypi_captureev },
-       { SONYPI_DEVICE_MODEL_TYPE2, 0x08, SONYPI_FNKEY_MASK, sonypi_fnkeyev },
-       { SONYPI_DEVICE_MODEL_TYPE2, 0x08, SONYPI_BLUETOOTH_MASK, sonypi_blueev },
+       { SONYPI_DEVICE_MODEL_TYPE2, 0x21, SONYPI_FNKEY_MASK, sonypi_fnkeyev },
+       { SONYPI_DEVICE_MODEL_TYPE2, 0x31, SONYPI_BLUETOOTH_MASK, sonypi_blueev },
        { SONYPI_DEVICE_MODEL_TYPE2, 0x08, SONYPI_PKEY_MASK, sonypi_pkeyev },
-       { SONYPI_DEVICE_MODEL_TYPE2, 0x08, SONYPI_BACK_MASK, sonypi_backev },
+       { SONYPI_DEVICE_MODEL_TYPE2, 0x11, SONYPI_BACK_MASK, sonypi_backev },
        { SONYPI_DEVICE_MODEL_TYPE2, 0x08, SONYPI_HELP_MASK, sonypi_helpev },
        { SONYPI_DEVICE_MODEL_TYPE2, 0x08, SONYPI_ZOOM_MASK, sonypi_zoomev },
        { SONYPI_DEVICE_MODEL_TYPE2, 0x08, SONYPI_THUMBPHRASE_MASK, sonypi_thumbphraseev },
-       { SONYPI_DEVICE_MODEL_TYPE2, 0x08, SONYPI_MEMORYSTICK_MASK, sonypi_memorystickev },
+       { SONYPI_DEVICE_MODEL_TYPE2, 0x31, SONYPI_MEMORYSTICK_MASK, sonypi_memorystickev },
+       { SONYPI_DEVICE_MODEL_TYPE2, 0x41, SONYPI_BATTERY_MASK, sonypi_batteryev },
 
        { 0, 0, 0, 0 }
 };
@@ -354,6 +367,7 @@ struct sonypi_device {
        u16 ioport1;
        u16 ioport2;
        u16 region_size;
+       u16 evtype_offset;
        int camera_power;
        int bluetooth_power;
        struct semaphore lock;
index d9ac90a87712bf7a65e501459f8c22f96a981d64..1ad9711e6aa20c885cf45d684dac8cfc641081c2 100644 (file)
@@ -94,6 +94,8 @@
 #define SONYPI_EVENT_MEMORYSTICK_INSERT                54
 #define SONYPI_EVENT_MEMORYSTICK_EJECT         55
 #define SONYPI_EVENT_ANYBUTTON_RELEASED                56
+#define SONYPI_EVENT_BATTERY_INSERT            57
+#define SONYPI_EVENT_BATTERY_REMOVE            58
 
 /* get/set brightness */
 #define SONYPI_IOCGBRT         _IOR('v', 0, __u8)