diff options
Diffstat (limited to 'drivers/char/sonypi.c')
-rw-r--r-- | drivers/char/sonypi.c | 106 |
1 files changed, 59 insertions, 47 deletions
diff --git a/drivers/char/sonypi.c b/drivers/char/sonypi.c index 36ae9ad2598c..f86c15587238 100644 --- a/drivers/char/sonypi.c +++ b/drivers/char/sonypi.c | |||
@@ -424,10 +424,6 @@ static struct sonypi_eventtypes { | |||
424 | 424 | ||
425 | #define SONYPI_BUF_SIZE 128 | 425 | #define SONYPI_BUF_SIZE 128 |
426 | 426 | ||
427 | /* The name of the devices for the input device drivers */ | ||
428 | #define SONYPI_JOG_INPUTNAME "Sony Vaio Jogdial" | ||
429 | #define SONYPI_KEY_INPUTNAME "Sony Vaio Keys" | ||
430 | |||
431 | /* Correspondance table between sonypi events and input layer events */ | 427 | /* Correspondance table between sonypi events and input layer events */ |
432 | static struct { | 428 | static struct { |
433 | int sonypiev; | 429 | int sonypiev; |
@@ -490,8 +486,8 @@ static struct sonypi_device { | |||
490 | struct fasync_struct *fifo_async; | 486 | struct fasync_struct *fifo_async; |
491 | int open_count; | 487 | int open_count; |
492 | int model; | 488 | int model; |
493 | struct input_dev input_jog_dev; | 489 | struct input_dev *input_jog_dev; |
494 | struct input_dev input_key_dev; | 490 | struct input_dev *input_key_dev; |
495 | struct work_struct input_work; | 491 | struct work_struct input_work; |
496 | struct kfifo *input_fifo; | 492 | struct kfifo *input_fifo; |
497 | spinlock_t input_fifo_lock; | 493 | spinlock_t input_fifo_lock; |
@@ -779,8 +775,8 @@ static void input_keyrelease(void *data) | |||
779 | 775 | ||
780 | static void sonypi_report_input_event(u8 event) | 776 | static void sonypi_report_input_event(u8 event) |
781 | { | 777 | { |
782 | struct input_dev *jog_dev = &sonypi_device.input_jog_dev; | 778 | struct input_dev *jog_dev = sonypi_device.input_jog_dev; |
783 | struct input_dev *key_dev = &sonypi_device.input_key_dev; | 779 | struct input_dev *key_dev = sonypi_device.input_key_dev; |
784 | struct sonypi_keypress kp = { NULL }; | 780 | struct sonypi_keypress kp = { NULL }; |
785 | int i; | 781 | int i; |
786 | 782 | ||
@@ -1171,19 +1167,17 @@ static int sonypi_disable(void) | |||
1171 | #ifdef CONFIG_PM | 1167 | #ifdef CONFIG_PM |
1172 | static int old_camera_power; | 1168 | static int old_camera_power; |
1173 | 1169 | ||
1174 | static int sonypi_suspend(struct device *dev, pm_message_t state, u32 level) | 1170 | static int sonypi_suspend(struct device *dev, pm_message_t state) |
1175 | { | 1171 | { |
1176 | if (level == SUSPEND_DISABLE) { | 1172 | old_camera_power = sonypi_device.camera_power; |
1177 | old_camera_power = sonypi_device.camera_power; | 1173 | sonypi_disable(); |
1178 | sonypi_disable(); | 1174 | |
1179 | } | ||
1180 | return 0; | 1175 | return 0; |
1181 | } | 1176 | } |
1182 | 1177 | ||
1183 | static int sonypi_resume(struct device *dev, u32 level) | 1178 | static int sonypi_resume(struct device *dev) |
1184 | { | 1179 | { |
1185 | if (level == RESUME_ENABLE) | 1180 | sonypi_enable(old_camera_power); |
1186 | sonypi_enable(old_camera_power); | ||
1187 | return 0; | 1181 | return 0; |
1188 | } | 1182 | } |
1189 | #endif | 1183 | #endif |
@@ -1203,6 +1197,47 @@ static struct device_driver sonypi_driver = { | |||
1203 | .shutdown = sonypi_shutdown, | 1197 | .shutdown = sonypi_shutdown, |
1204 | }; | 1198 | }; |
1205 | 1199 | ||
1200 | static int __devinit sonypi_create_input_devices(void) | ||
1201 | { | ||
1202 | struct input_dev *jog_dev; | ||
1203 | struct input_dev *key_dev; | ||
1204 | int i; | ||
1205 | |||
1206 | sonypi_device.input_jog_dev = jog_dev = input_allocate_device(); | ||
1207 | if (!jog_dev) | ||
1208 | return -ENOMEM; | ||
1209 | |||
1210 | jog_dev->name = "Sony Vaio Jogdial"; | ||
1211 | jog_dev->id.bustype = BUS_ISA; | ||
1212 | jog_dev->id.vendor = PCI_VENDOR_ID_SONY; | ||
1213 | |||
1214 | jog_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL); | ||
1215 | jog_dev->keybit[LONG(BTN_MOUSE)] = BIT(BTN_MIDDLE); | ||
1216 | jog_dev->relbit[0] = BIT(REL_WHEEL); | ||
1217 | |||
1218 | sonypi_device.input_key_dev = key_dev = input_allocate_device(); | ||
1219 | if (!key_dev) { | ||
1220 | input_free_device(jog_dev); | ||
1221 | sonypi_device.input_jog_dev = NULL; | ||
1222 | return -ENOMEM; | ||
1223 | } | ||
1224 | |||
1225 | key_dev->name = "Sony Vaio Keys"; | ||
1226 | key_dev->id.bustype = BUS_ISA; | ||
1227 | key_dev->id.vendor = PCI_VENDOR_ID_SONY; | ||
1228 | |||
1229 | /* Initialize the Input Drivers: special keys */ | ||
1230 | key_dev->evbit[0] = BIT(EV_KEY); | ||
1231 | for (i = 0; sonypi_inputkeys[i].sonypiev; i++) | ||
1232 | if (sonypi_inputkeys[i].inputev) | ||
1233 | set_bit(sonypi_inputkeys[i].inputev, key_dev->keybit); | ||
1234 | |||
1235 | input_register_device(jog_dev); | ||
1236 | input_register_device(key_dev); | ||
1237 | |||
1238 | return 0; | ||
1239 | } | ||
1240 | |||
1206 | static int __devinit sonypi_probe(void) | 1241 | static int __devinit sonypi_probe(void) |
1207 | { | 1242 | { |
1208 | int i, ret; | 1243 | int i, ret; |
@@ -1298,34 +1333,10 @@ static int __devinit sonypi_probe(void) | |||
1298 | } | 1333 | } |
1299 | 1334 | ||
1300 | if (useinput) { | 1335 | if (useinput) { |
1301 | /* Initialize the Input Drivers: jogdial */ | ||
1302 | int i; | ||
1303 | sonypi_device.input_jog_dev.evbit[0] = | ||
1304 | BIT(EV_KEY) | BIT(EV_REL); | ||
1305 | sonypi_device.input_jog_dev.keybit[LONG(BTN_MOUSE)] = | ||
1306 | BIT(BTN_MIDDLE); | ||
1307 | sonypi_device.input_jog_dev.relbit[0] = BIT(REL_WHEEL); | ||
1308 | sonypi_device.input_jog_dev.name = SONYPI_JOG_INPUTNAME; | ||
1309 | sonypi_device.input_jog_dev.id.bustype = BUS_ISA; | ||
1310 | sonypi_device.input_jog_dev.id.vendor = PCI_VENDOR_ID_SONY; | ||
1311 | |||
1312 | input_register_device(&sonypi_device.input_jog_dev); | ||
1313 | printk(KERN_INFO "%s input method installed.\n", | ||
1314 | sonypi_device.input_jog_dev.name); | ||
1315 | |||
1316 | /* Initialize the Input Drivers: special keys */ | ||
1317 | sonypi_device.input_key_dev.evbit[0] = BIT(EV_KEY); | ||
1318 | for (i = 0; sonypi_inputkeys[i].sonypiev; i++) | ||
1319 | if (sonypi_inputkeys[i].inputev) | ||
1320 | set_bit(sonypi_inputkeys[i].inputev, | ||
1321 | sonypi_device.input_key_dev.keybit); | ||
1322 | sonypi_device.input_key_dev.name = SONYPI_KEY_INPUTNAME; | ||
1323 | sonypi_device.input_key_dev.id.bustype = BUS_ISA; | ||
1324 | sonypi_device.input_key_dev.id.vendor = PCI_VENDOR_ID_SONY; | ||
1325 | 1336 | ||
1326 | input_register_device(&sonypi_device.input_key_dev); | 1337 | ret = sonypi_create_input_devices(); |
1327 | printk(KERN_INFO "%s input method installed.\n", | 1338 | if (ret) |
1328 | sonypi_device.input_key_dev.name); | 1339 | goto out_inputdevices; |
1329 | 1340 | ||
1330 | spin_lock_init(&sonypi_device.input_fifo_lock); | 1341 | spin_lock_init(&sonypi_device.input_fifo_lock); |
1331 | sonypi_device.input_fifo = | 1342 | sonypi_device.input_fifo = |
@@ -1375,8 +1386,9 @@ static int __devinit sonypi_probe(void) | |||
1375 | out_platformdev: | 1386 | out_platformdev: |
1376 | kfifo_free(sonypi_device.input_fifo); | 1387 | kfifo_free(sonypi_device.input_fifo); |
1377 | out_infifo: | 1388 | out_infifo: |
1378 | input_unregister_device(&sonypi_device.input_key_dev); | 1389 | input_unregister_device(sonypi_device.input_key_dev); |
1379 | input_unregister_device(&sonypi_device.input_jog_dev); | 1390 | input_unregister_device(sonypi_device.input_jog_dev); |
1391 | out_inputdevices: | ||
1380 | free_irq(sonypi_device.irq, sonypi_irq); | 1392 | free_irq(sonypi_device.irq, sonypi_irq); |
1381 | out_reqirq: | 1393 | out_reqirq: |
1382 | release_region(sonypi_device.ioport1, sonypi_device.region_size); | 1394 | release_region(sonypi_device.ioport1, sonypi_device.region_size); |
@@ -1402,8 +1414,8 @@ static void __devexit sonypi_remove(void) | |||
1402 | platform_device_unregister(sonypi_device.pdev); | 1414 | platform_device_unregister(sonypi_device.pdev); |
1403 | 1415 | ||
1404 | if (useinput) { | 1416 | if (useinput) { |
1405 | input_unregister_device(&sonypi_device.input_key_dev); | 1417 | input_unregister_device(sonypi_device.input_key_dev); |
1406 | input_unregister_device(&sonypi_device.input_jog_dev); | 1418 | input_unregister_device(sonypi_device.input_jog_dev); |
1407 | kfifo_free(sonypi_device.input_fifo); | 1419 | kfifo_free(sonypi_device.input_fifo); |
1408 | } | 1420 | } |
1409 | 1421 | ||