diff options
author | Mattia Dongili <malattia@linux.it> | 2008-01-14 04:05:45 -0500 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2008-01-24 00:47:27 -0500 |
commit | 3eb8749a37990b505ab94466038c067444bbd7eb (patch) | |
tree | 9992f641ba48d17c9699fecd5fb7f5bf24657f15 /drivers/misc | |
parent | 425ef5d75de25c53b6dc79008fe3678d2fe7e8ed (diff) |
sony-laptop: add Type4 model
Recent Vaio models (UX, SZ and presumably TZ and others) add more
events and a slightly different handling of Fn key events for
additional hotkeys (s1, s2, zoom-in/out, etc.).
Signed-off-by: Mattia Dongili <malattia@linux.it>
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/misc')
-rw-r--r-- | drivers/misc/sony-laptop.c | 295 |
1 files changed, 184 insertions, 111 deletions
diff --git a/drivers/misc/sony-laptop.c b/drivers/misc/sony-laptop.c index 98692862fbc..70d5cc5969a 100644 --- a/drivers/misc/sony-laptop.c +++ b/drivers/misc/sony-laptop.c | |||
@@ -146,68 +146,70 @@ struct sony_laptop_keypress { | |||
146 | * and input layer indexes in the keymap | 146 | * and input layer indexes in the keymap |
147 | */ | 147 | */ |
148 | static int sony_laptop_input_index[] = { | 148 | static int sony_laptop_input_index[] = { |
149 | -1, /* no event */ | 149 | -1, /* 0 no event */ |
150 | -1, /* SONYPI_EVENT_JOGDIAL_DOWN */ | 150 | -1, /* 1 SONYPI_EVENT_JOGDIAL_DOWN */ |
151 | -1, /* SONYPI_EVENT_JOGDIAL_UP */ | 151 | -1, /* 2 SONYPI_EVENT_JOGDIAL_UP */ |
152 | -1, /* SONYPI_EVENT_JOGDIAL_DOWN_PRESSED */ | 152 | -1, /* 3 SONYPI_EVENT_JOGDIAL_DOWN_PRESSED */ |
153 | -1, /* SONYPI_EVENT_JOGDIAL_UP_PRESSED */ | 153 | -1, /* 4 SONYPI_EVENT_JOGDIAL_UP_PRESSED */ |
154 | -1, /* SONYPI_EVENT_JOGDIAL_PRESSED */ | 154 | -1, /* 5 SONYPI_EVENT_JOGDIAL_PRESSED */ |
155 | -1, /* SONYPI_EVENT_JOGDIAL_RELEASED */ | 155 | -1, /* 6 SONYPI_EVENT_JOGDIAL_RELEASED */ |
156 | 0, /* SONYPI_EVENT_CAPTURE_PRESSED */ | 156 | 0, /* 7 SONYPI_EVENT_CAPTURE_PRESSED */ |
157 | 1, /* SONYPI_EVENT_CAPTURE_RELEASED */ | 157 | 1, /* 8 SONYPI_EVENT_CAPTURE_RELEASED */ |
158 | 2, /* SONYPI_EVENT_CAPTURE_PARTIALPRESSED */ | 158 | 2, /* 9 SONYPI_EVENT_CAPTURE_PARTIALPRESSED */ |
159 | 3, /* SONYPI_EVENT_CAPTURE_PARTIALRELEASED */ | 159 | 3, /* 10 SONYPI_EVENT_CAPTURE_PARTIALRELEASED */ |
160 | 4, /* SONYPI_EVENT_FNKEY_ESC */ | 160 | 4, /* 11 SONYPI_EVENT_FNKEY_ESC */ |
161 | 5, /* SONYPI_EVENT_FNKEY_F1 */ | 161 | 5, /* 12 SONYPI_EVENT_FNKEY_F1 */ |
162 | 6, /* SONYPI_EVENT_FNKEY_F2 */ | 162 | 6, /* 13 SONYPI_EVENT_FNKEY_F2 */ |
163 | 7, /* SONYPI_EVENT_FNKEY_F3 */ | 163 | 7, /* 14 SONYPI_EVENT_FNKEY_F3 */ |
164 | 8, /* SONYPI_EVENT_FNKEY_F4 */ | 164 | 8, /* 15 SONYPI_EVENT_FNKEY_F4 */ |
165 | 9, /* SONYPI_EVENT_FNKEY_F5 */ | 165 | 9, /* 16 SONYPI_EVENT_FNKEY_F5 */ |
166 | 10, /* SONYPI_EVENT_FNKEY_F6 */ | 166 | 10, /* 17 SONYPI_EVENT_FNKEY_F6 */ |
167 | 11, /* SONYPI_EVENT_FNKEY_F7 */ | 167 | 11, /* 18 SONYPI_EVENT_FNKEY_F7 */ |
168 | 12, /* SONYPI_EVENT_FNKEY_F8 */ | 168 | 12, /* 19 SONYPI_EVENT_FNKEY_F8 */ |
169 | 13, /* SONYPI_EVENT_FNKEY_F9 */ | 169 | 13, /* 20 SONYPI_EVENT_FNKEY_F9 */ |
170 | 14, /* SONYPI_EVENT_FNKEY_F10 */ | 170 | 14, /* 21 SONYPI_EVENT_FNKEY_F10 */ |
171 | 15, /* SONYPI_EVENT_FNKEY_F11 */ | 171 | 15, /* 22 SONYPI_EVENT_FNKEY_F11 */ |
172 | 16, /* SONYPI_EVENT_FNKEY_F12 */ | 172 | 16, /* 23 SONYPI_EVENT_FNKEY_F12 */ |
173 | 17, /* SONYPI_EVENT_FNKEY_1 */ | 173 | 17, /* 24 SONYPI_EVENT_FNKEY_1 */ |
174 | 18, /* SONYPI_EVENT_FNKEY_2 */ | 174 | 18, /* 25 SONYPI_EVENT_FNKEY_2 */ |
175 | 19, /* SONYPI_EVENT_FNKEY_D */ | 175 | 19, /* 26 SONYPI_EVENT_FNKEY_D */ |
176 | 20, /* SONYPI_EVENT_FNKEY_E */ | 176 | 20, /* 27 SONYPI_EVENT_FNKEY_E */ |
177 | 21, /* SONYPI_EVENT_FNKEY_F */ | 177 | 21, /* 28 SONYPI_EVENT_FNKEY_F */ |
178 | 22, /* SONYPI_EVENT_FNKEY_S */ | 178 | 22, /* 29 SONYPI_EVENT_FNKEY_S */ |
179 | 23, /* SONYPI_EVENT_FNKEY_B */ | 179 | 23, /* 30 SONYPI_EVENT_FNKEY_B */ |
180 | 24, /* SONYPI_EVENT_BLUETOOTH_PRESSED */ | 180 | 24, /* 31 SONYPI_EVENT_BLUETOOTH_PRESSED */ |
181 | 25, /* SONYPI_EVENT_PKEY_P1 */ | 181 | 25, /* 32 SONYPI_EVENT_PKEY_P1 */ |
182 | 26, /* SONYPI_EVENT_PKEY_P2 */ | 182 | 26, /* 33 SONYPI_EVENT_PKEY_P2 */ |
183 | 27, /* SONYPI_EVENT_PKEY_P3 */ | 183 | 27, /* 34 SONYPI_EVENT_PKEY_P3 */ |
184 | 28, /* SONYPI_EVENT_BACK_PRESSED */ | 184 | 28, /* 35 SONYPI_EVENT_BACK_PRESSED */ |
185 | -1, /* SONYPI_EVENT_LID_CLOSED */ | 185 | -1, /* 36 SONYPI_EVENT_LID_CLOSED */ |
186 | -1, /* SONYPI_EVENT_LID_OPENED */ | 186 | -1, /* 37 SONYPI_EVENT_LID_OPENED */ |
187 | 29, /* SONYPI_EVENT_BLUETOOTH_ON */ | 187 | 29, /* 38 SONYPI_EVENT_BLUETOOTH_ON */ |
188 | 30, /* SONYPI_EVENT_BLUETOOTH_OFF */ | 188 | 30, /* 39 SONYPI_EVENT_BLUETOOTH_OFF */ |
189 | 31, /* SONYPI_EVENT_HELP_PRESSED */ | 189 | 31, /* 40 SONYPI_EVENT_HELP_PRESSED */ |
190 | 32, /* SONYPI_EVENT_FNKEY_ONLY */ | 190 | 32, /* 41 SONYPI_EVENT_FNKEY_ONLY */ |
191 | 33, /* SONYPI_EVENT_JOGDIAL_FAST_DOWN */ | 191 | 33, /* 42 SONYPI_EVENT_JOGDIAL_FAST_DOWN */ |
192 | 34, /* SONYPI_EVENT_JOGDIAL_FAST_UP */ | 192 | 34, /* 43 SONYPI_EVENT_JOGDIAL_FAST_UP */ |
193 | 35, /* SONYPI_EVENT_JOGDIAL_FAST_DOWN_PRESSED */ | 193 | 35, /* 44 SONYPI_EVENT_JOGDIAL_FAST_DOWN_PRESSED */ |
194 | 36, /* SONYPI_EVENT_JOGDIAL_FAST_UP_PRESSED */ | 194 | 36, /* 45 SONYPI_EVENT_JOGDIAL_FAST_UP_PRESSED */ |
195 | 37, /* SONYPI_EVENT_JOGDIAL_VFAST_DOWN */ | 195 | 37, /* 46 SONYPI_EVENT_JOGDIAL_VFAST_DOWN */ |
196 | 38, /* SONYPI_EVENT_JOGDIAL_VFAST_UP */ | 196 | 38, /* 47 SONYPI_EVENT_JOGDIAL_VFAST_UP */ |
197 | 39, /* SONYPI_EVENT_JOGDIAL_VFAST_DOWN_PRESSED */ | 197 | 39, /* 48 SONYPI_EVENT_JOGDIAL_VFAST_DOWN_PRESSED */ |
198 | 40, /* SONYPI_EVENT_JOGDIAL_VFAST_UP_PRESSED */ | 198 | 40, /* 49 SONYPI_EVENT_JOGDIAL_VFAST_UP_PRESSED */ |
199 | 41, /* SONYPI_EVENT_ZOOM_PRESSED */ | 199 | 41, /* 50 SONYPI_EVENT_ZOOM_PRESSED */ |
200 | 42, /* SONYPI_EVENT_THUMBPHRASE_PRESSED */ | 200 | 42, /* 51 SONYPI_EVENT_THUMBPHRASE_PRESSED */ |
201 | 43, /* SONYPI_EVENT_MEYE_FACE */ | 201 | 43, /* 52 SONYPI_EVENT_MEYE_FACE */ |
202 | 44, /* SONYPI_EVENT_MEYE_OPPOSITE */ | 202 | 44, /* 53 SONYPI_EVENT_MEYE_OPPOSITE */ |
203 | 45, /* SONYPI_EVENT_MEMORYSTICK_INSERT */ | 203 | 45, /* 54 SONYPI_EVENT_MEMORYSTICK_INSERT */ |
204 | 46, /* SONYPI_EVENT_MEMORYSTICK_EJECT */ | 204 | 46, /* 55 SONYPI_EVENT_MEMORYSTICK_EJECT */ |
205 | -1, /* SONYPI_EVENT_ANYBUTTON_RELEASED */ | 205 | -1, /* 56 SONYPI_EVENT_ANYBUTTON_RELEASED */ |
206 | -1, /* SONYPI_EVENT_BATTERY_INSERT */ | 206 | -1, /* 57 SONYPI_EVENT_BATTERY_INSERT */ |
207 | -1, /* SONYPI_EVENT_BATTERY_REMOVE */ | 207 | -1, /* 58 SONYPI_EVENT_BATTERY_REMOVE */ |
208 | -1, /* SONYPI_EVENT_FNKEY_RELEASED */ | 208 | -1, /* 59 SONYPI_EVENT_FNKEY_RELEASED */ |
209 | 47, /* SONYPI_EVENT_WIRELESS_ON */ | 209 | 47, /* 60 SONYPI_EVENT_WIRELESS_ON */ |
210 | 48, /* SONYPI_EVENT_WIRELESS_OFF */ | 210 | 48, /* 61 SONYPI_EVENT_WIRELESS_OFF */ |
211 | 49, /* 62 SONYPI_EVENT_ZOOM_IN_PRESSED */ | ||
212 | 50, /* 63 SONYPI_EVENT_ZOOM_OUT_PRESSED */ | ||
211 | }; | 213 | }; |
212 | 214 | ||
213 | static int sony_laptop_input_keycode_map[] = { | 215 | static int sony_laptop_input_keycode_map[] = { |
@@ -260,6 +262,8 @@ static int sony_laptop_input_keycode_map[] = { | |||
260 | KEY_RESERVED, /* 46 SONYPI_EVENT_MEMORYSTICK_EJECT */ | 262 | KEY_RESERVED, /* 46 SONYPI_EVENT_MEMORYSTICK_EJECT */ |
261 | KEY_WLAN, /* 47 SONYPI_EVENT_WIRELESS_ON */ | 263 | KEY_WLAN, /* 47 SONYPI_EVENT_WIRELESS_ON */ |
262 | KEY_WLAN, /* 48 SONYPI_EVENT_WIRELESS_OFF */ | 264 | KEY_WLAN, /* 48 SONYPI_EVENT_WIRELESS_OFF */ |
265 | KEY_ZOOMIN, /* 49 SONYPI_EVENT_ZOOM_IN_PRESSED */ | ||
266 | KEY_ZOOMOUT /* 50 SONYPI_EVENT_ZOOM_OUT_PRESSED */ | ||
263 | }; | 267 | }; |
264 | 268 | ||
265 | /* release buttons after a short delay if pressed */ | 269 | /* release buttons after a short delay if pressed */ |
@@ -1178,10 +1182,12 @@ static struct acpi_driver sony_nc_driver = { | |||
1178 | #define SONYPI_DEVICE_TYPE1 0x00000001 | 1182 | #define SONYPI_DEVICE_TYPE1 0x00000001 |
1179 | #define SONYPI_DEVICE_TYPE2 0x00000002 | 1183 | #define SONYPI_DEVICE_TYPE2 0x00000002 |
1180 | #define SONYPI_DEVICE_TYPE3 0x00000004 | 1184 | #define SONYPI_DEVICE_TYPE3 0x00000004 |
1185 | #define SONYPI_DEVICE_TYPE4 0x00000008 | ||
1181 | 1186 | ||
1182 | #define SONYPI_TYPE1_OFFSET 0x04 | 1187 | #define SONYPI_TYPE1_OFFSET 0x04 |
1183 | #define SONYPI_TYPE2_OFFSET 0x12 | 1188 | #define SONYPI_TYPE2_OFFSET 0x12 |
1184 | #define SONYPI_TYPE3_OFFSET 0x12 | 1189 | #define SONYPI_TYPE3_OFFSET 0x12 |
1190 | #define SONYPI_TYPE4_OFFSET 0x12 | ||
1185 | 1191 | ||
1186 | struct sony_pic_ioport { | 1192 | struct sony_pic_ioport { |
1187 | struct acpi_resource_io io1; | 1193 | struct acpi_resource_io io1; |
@@ -1202,7 +1208,7 @@ struct sonypi_eventtypes { | |||
1202 | 1208 | ||
1203 | struct device_ctrl { | 1209 | struct device_ctrl { |
1204 | int model; | 1210 | int model; |
1205 | int (*handle_irq)(void); | 1211 | int (*handle_irq)(const u8, const u8); |
1206 | u16 evport_offset; | 1212 | u16 evport_offset; |
1207 | u8 has_camera; | 1213 | u8 has_camera; |
1208 | u8 has_bluetooth; | 1214 | u8 has_bluetooth; |
@@ -1277,6 +1283,7 @@ static struct sonypi_event sonypi_joggerev[] = { | |||
1277 | static struct sonypi_event sonypi_captureev[] = { | 1283 | static struct sonypi_event sonypi_captureev[] = { |
1278 | { 0x05, SONYPI_EVENT_CAPTURE_PARTIALPRESSED }, | 1284 | { 0x05, SONYPI_EVENT_CAPTURE_PARTIALPRESSED }, |
1279 | { 0x07, SONYPI_EVENT_CAPTURE_PRESSED }, | 1285 | { 0x07, SONYPI_EVENT_CAPTURE_PRESSED }, |
1286 | { 0x40, SONYPI_EVENT_CAPTURE_PRESSED }, | ||
1280 | { 0x01, SONYPI_EVENT_CAPTURE_PARTIALRELEASED }, | 1287 | { 0x01, SONYPI_EVENT_CAPTURE_PARTIALRELEASED }, |
1281 | { 0, 0 } | 1288 | { 0, 0 } |
1282 | }; | 1289 | }; |
@@ -1313,7 +1320,6 @@ static struct sonypi_event sonypi_pkeyev[] = { | |||
1313 | { 0x01, SONYPI_EVENT_PKEY_P1 }, | 1320 | { 0x01, SONYPI_EVENT_PKEY_P1 }, |
1314 | { 0x02, SONYPI_EVENT_PKEY_P2 }, | 1321 | { 0x02, SONYPI_EVENT_PKEY_P2 }, |
1315 | { 0x04, SONYPI_EVENT_PKEY_P3 }, | 1322 | { 0x04, SONYPI_EVENT_PKEY_P3 }, |
1316 | { 0x5c, SONYPI_EVENT_PKEY_P1 }, | ||
1317 | { 0, 0 } | 1323 | { 0, 0 } |
1318 | }; | 1324 | }; |
1319 | 1325 | ||
@@ -1355,6 +1361,8 @@ static struct sonypi_event sonypi_lidev[] = { | |||
1355 | /* The set of possible zoom events */ | 1361 | /* The set of possible zoom events */ |
1356 | static struct sonypi_event sonypi_zoomev[] = { | 1362 | static struct sonypi_event sonypi_zoomev[] = { |
1357 | { 0x39, SONYPI_EVENT_ZOOM_PRESSED }, | 1363 | { 0x39, SONYPI_EVENT_ZOOM_PRESSED }, |
1364 | { 0x10, SONYPI_EVENT_ZOOM_IN_PRESSED }, | ||
1365 | { 0x20, SONYPI_EVENT_ZOOM_OUT_PRESSED }, | ||
1358 | { 0, 0 } | 1366 | { 0, 0 } |
1359 | }; | 1367 | }; |
1360 | 1368 | ||
@@ -1424,55 +1432,19 @@ static struct sonypi_eventtypes type3_events[] = { | |||
1424 | { 0x31, SONYPI_PKEY_MASK, sonypi_pkeyev }, | 1432 | { 0x31, SONYPI_PKEY_MASK, sonypi_pkeyev }, |
1425 | { 0 }, | 1433 | { 0 }, |
1426 | }; | 1434 | }; |
1427 | 1435 | static struct sonypi_eventtypes type4_events[] = { | |
1428 | static struct device_ctrl spic_types[] = { | 1436 | { 0, 0xffffffff, sonypi_releaseev }, |
1429 | { | 1437 | { 0x21, SONYPI_FNKEY_MASK, sonypi_fnkeyev }, |
1430 | .model = SONYPI_DEVICE_TYPE1, | 1438 | { 0x31, SONYPI_WIRELESS_MASK, sonypi_wlessev }, |
1431 | .handle_irq = NULL, | 1439 | { 0x31, SONYPI_MEMORYSTICK_MASK, sonypi_memorystickev }, |
1432 | .evport_offset = SONYPI_TYPE1_OFFSET, | 1440 | { 0x41, SONYPI_BATTERY_MASK, sonypi_batteryev }, |
1433 | .event_types = type1_events, | 1441 | { 0x05, SONYPI_PKEY_MASK, sonypi_pkeyev }, |
1434 | }, | 1442 | { 0x05, SONYPI_ZOOM_MASK, sonypi_zoomev }, |
1435 | { | 1443 | { 0x05, SONYPI_CAPTURE_MASK, sonypi_captureev }, |
1436 | .model = SONYPI_DEVICE_TYPE2, | 1444 | { 0 }, |
1437 | .handle_irq = NULL, | ||
1438 | .evport_offset = SONYPI_TYPE2_OFFSET, | ||
1439 | .event_types = type2_events, | ||
1440 | }, | ||
1441 | { | ||
1442 | .model = SONYPI_DEVICE_TYPE3, | ||
1443 | .handle_irq = NULL, | ||
1444 | .evport_offset = SONYPI_TYPE3_OFFSET, | ||
1445 | .event_types = type3_events, | ||
1446 | }, | ||
1447 | }; | 1445 | }; |
1448 | 1446 | ||
1449 | static void sony_pic_detect_device_type(struct sony_pic_dev *dev) | 1447 | /* low level spic calls */ |
1450 | { | ||
1451 | struct pci_dev *pcidev; | ||
1452 | |||
1453 | if ((pcidev = pci_get_device(PCI_VENDOR_ID_INTEL, | ||
1454 | PCI_DEVICE_ID_INTEL_82371AB_3, NULL))) | ||
1455 | dev->control = &spic_types[0]; | ||
1456 | |||
1457 | else if ((pcidev = pci_get_device(PCI_VENDOR_ID_INTEL, | ||
1458 | PCI_DEVICE_ID_INTEL_ICH6_1, NULL))) | ||
1459 | dev->control = &spic_types[2]; | ||
1460 | |||
1461 | else if ((pcidev = pci_get_device(PCI_VENDOR_ID_INTEL, | ||
1462 | PCI_DEVICE_ID_INTEL_ICH7_1, NULL))) | ||
1463 | dev->control = &spic_types[2]; | ||
1464 | |||
1465 | else | ||
1466 | dev->control = &spic_types[1]; | ||
1467 | |||
1468 | if (pcidev) | ||
1469 | pci_dev_put(pcidev); | ||
1470 | |||
1471 | printk(KERN_INFO DRV_PFX "detected Type%d model\n", | ||
1472 | dev->control->model == SONYPI_DEVICE_TYPE1 ? 1 : | ||
1473 | dev->control->model == SONYPI_DEVICE_TYPE2 ? 2 : 3); | ||
1474 | } | ||
1475 | |||
1476 | #define ITERATIONS_LONG 10000 | 1448 | #define ITERATIONS_LONG 10000 |
1477 | #define ITERATIONS_SHORT 10 | 1449 | #define ITERATIONS_SHORT 10 |
1478 | #define wait_on_command(command, iterations) { \ | 1450 | #define wait_on_command(command, iterations) { \ |
@@ -1528,6 +1500,100 @@ static u8 sony_pic_call3(u8 dev, u8 fn, u8 v) | |||
1528 | return v1; | 1500 | return v1; |
1529 | } | 1501 | } |
1530 | 1502 | ||
1503 | /* | ||
1504 | * minidrivers for SPIC models | ||
1505 | */ | ||
1506 | static int type4_handle_irq(const u8 data_mask, const u8 ev) | ||
1507 | { | ||
1508 | /* | ||
1509 | * 0x31 could mean we have to take some extra action and wait for | ||
1510 | * the next irq for some Type4 models, it will generate a new | ||
1511 | * irq and we can read new data from the device: | ||
1512 | * - 0x5c and 0x5f requires 0xA0 | ||
1513 | * - 0x61 requires 0xB3 | ||
1514 | */ | ||
1515 | if (data_mask == 0x31) { | ||
1516 | if (ev == 0x5c || ev == 0x5f) | ||
1517 | sony_pic_call1(0xA0); | ||
1518 | else if (ev == 0x61) | ||
1519 | sony_pic_call1(0xB3); | ||
1520 | return 0; | ||
1521 | } | ||
1522 | return 1; | ||
1523 | } | ||
1524 | |||
1525 | static struct device_ctrl spic_types[] = { | ||
1526 | { | ||
1527 | .model = SONYPI_DEVICE_TYPE1, | ||
1528 | .handle_irq = NULL, | ||
1529 | .evport_offset = SONYPI_TYPE1_OFFSET, | ||
1530 | .event_types = type1_events, | ||
1531 | }, | ||
1532 | { | ||
1533 | .model = SONYPI_DEVICE_TYPE2, | ||
1534 | .handle_irq = NULL, | ||
1535 | .evport_offset = SONYPI_TYPE2_OFFSET, | ||
1536 | .event_types = type2_events, | ||
1537 | }, | ||
1538 | { | ||
1539 | .model = SONYPI_DEVICE_TYPE3, | ||
1540 | .handle_irq = NULL, | ||
1541 | .evport_offset = SONYPI_TYPE3_OFFSET, | ||
1542 | .event_types = type3_events, | ||
1543 | }, | ||
1544 | { | ||
1545 | .model = SONYPI_DEVICE_TYPE4, | ||
1546 | .handle_irq = type4_handle_irq, | ||
1547 | .evport_offset = SONYPI_TYPE4_OFFSET, | ||
1548 | .event_types = type4_events, | ||
1549 | }, | ||
1550 | }; | ||
1551 | |||
1552 | static void sony_pic_detect_device_type(struct sony_pic_dev *dev) | ||
1553 | { | ||
1554 | struct pci_dev *pcidev; | ||
1555 | |||
1556 | pcidev = pci_get_device(PCI_VENDOR_ID_INTEL, | ||
1557 | PCI_DEVICE_ID_INTEL_82371AB_3, NULL); | ||
1558 | if (pcidev) { | ||
1559 | dev->control = &spic_types[0]; | ||
1560 | goto out; | ||
1561 | } | ||
1562 | |||
1563 | pcidev = pci_get_device(PCI_VENDOR_ID_INTEL, | ||
1564 | PCI_DEVICE_ID_INTEL_ICH6_1, NULL); | ||
1565 | if (pcidev) { | ||
1566 | dev->control = &spic_types[2]; | ||
1567 | goto out; | ||
1568 | } | ||
1569 | |||
1570 | pcidev = pci_get_device(PCI_VENDOR_ID_INTEL, | ||
1571 | PCI_DEVICE_ID_INTEL_ICH7_1, NULL); | ||
1572 | if (pcidev) { | ||
1573 | dev->control = &spic_types[3]; | ||
1574 | goto out; | ||
1575 | } | ||
1576 | |||
1577 | pcidev = pci_get_device(PCI_VENDOR_ID_INTEL, | ||
1578 | PCI_DEVICE_ID_INTEL_ICH8_4, NULL); | ||
1579 | if (pcidev) { | ||
1580 | dev->control = &spic_types[3]; | ||
1581 | goto out; | ||
1582 | } | ||
1583 | |||
1584 | /* default */ | ||
1585 | dev->control = &spic_types[1]; | ||
1586 | |||
1587 | out: | ||
1588 | if (pcidev) | ||
1589 | pci_dev_put(pcidev); | ||
1590 | |||
1591 | printk(KERN_INFO DRV_PFX "detected Type%d model\n", | ||
1592 | dev->control->model == SONYPI_DEVICE_TYPE1 ? 1 : | ||
1593 | dev->control->model == SONYPI_DEVICE_TYPE2 ? 2 : | ||
1594 | dev->control->model == SONYPI_DEVICE_TYPE3 ? 3 : 4); | ||
1595 | } | ||
1596 | |||
1531 | /* camera tests and poweron/poweroff */ | 1597 | /* camera tests and poweron/poweroff */ |
1532 | #define SONYPI_CAMERA_PICTURE 5 | 1598 | #define SONYPI_CAMERA_PICTURE 5 |
1533 | #define SONYPI_CAMERA_CONTROL 0x10 | 1599 | #define SONYPI_CAMERA_CONTROL 0x10 |
@@ -2406,6 +2472,13 @@ static irqreturn_t sony_pic_irq(int irq, void *dev_id) | |||
2406 | } | 2472 | } |
2407 | } | 2473 | } |
2408 | } | 2474 | } |
2475 | /* Still not able to decode the event try to pass | ||
2476 | * it over to the minidriver | ||
2477 | */ | ||
2478 | if (dev->control->handle_irq && | ||
2479 | dev->control->handle_irq(data_mask, ev) == 0) | ||
2480 | return IRQ_HANDLED; | ||
2481 | |||
2409 | dprintk("unknown event ([%.2x] [%.2x]) at port 0x%.4x(+0x%.2x)\n", | 2482 | dprintk("unknown event ([%.2x] [%.2x]) at port 0x%.4x(+0x%.2x)\n", |
2410 | ev, data_mask, dev->cur_ioport->io1.minimum, | 2483 | ev, data_mask, dev->cur_ioport->io1.minimum, |
2411 | dev->control->evport_offset); | 2484 | dev->control->evport_offset); |