diff options
author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2008-06-17 12:02:44 -0400 |
---|---|---|
committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2008-06-17 12:02:44 -0400 |
commit | 15439dd37f92f930ac7fc65a4f261834e4215bb0 (patch) | |
tree | ec8e4a7cffd1cbb55ae4970c3172fa9a6fb0c0f7 /drivers/input | |
parent | 39ab9ddeb3e9573a1ea9a17a1431ea5c81681964 (diff) | |
parent | 90d95ef617a535a8832bdcb8dee07bf591e5dd82 (diff) |
Merge branch 'for-linus' into next
Conflicts:
drivers/input/mouse/appletouch.c
Diffstat (limited to 'drivers/input')
-rw-r--r-- | drivers/input/keyboard/atkbd.c | 2 | ||||
-rw-r--r-- | drivers/input/keyboard/pxa27x_keypad.c | 38 | ||||
-rw-r--r-- | drivers/input/misc/Kconfig | 1 | ||||
-rw-r--r-- | drivers/input/misc/apanel.c | 1 | ||||
-rw-r--r-- | drivers/input/mouse/appletouch.c | 49 | ||||
-rw-r--r-- | drivers/input/serio/i8042-x86ia64io.h | 14 | ||||
-rw-r--r-- | drivers/input/serio/i8042.c | 41 | ||||
-rw-r--r-- | drivers/input/tablet/gtco.c | 17 | ||||
-rw-r--r-- | drivers/input/touchscreen/wm9713.c | 22 | ||||
-rw-r--r-- | drivers/input/touchscreen/wm97xx-core.c | 25 |
10 files changed, 155 insertions, 55 deletions
diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c index 56857d1e56d5..c27537be82ae 100644 --- a/drivers/input/keyboard/atkbd.c +++ b/drivers/input/keyboard/atkbd.c | |||
@@ -807,6 +807,8 @@ static int atkbd_activate(struct atkbd *atkbd) | |||
807 | static void atkbd_cleanup(struct serio *serio) | 807 | static void atkbd_cleanup(struct serio *serio) |
808 | { | 808 | { |
809 | struct atkbd *atkbd = serio_get_drvdata(serio); | 809 | struct atkbd *atkbd = serio_get_drvdata(serio); |
810 | |||
811 | atkbd_disable(atkbd); | ||
810 | ps2_command(&atkbd->ps2dev, NULL, ATKBD_CMD_RESET_BAT); | 812 | ps2_command(&atkbd->ps2dev, NULL, ATKBD_CMD_RESET_BAT); |
811 | } | 813 | } |
812 | 814 | ||
diff --git a/drivers/input/keyboard/pxa27x_keypad.c b/drivers/input/keyboard/pxa27x_keypad.c index c7c9599b315d..6f1516f50750 100644 --- a/drivers/input/keyboard/pxa27x_keypad.c +++ b/drivers/input/keyboard/pxa27x_keypad.c | |||
@@ -138,6 +138,9 @@ static void pxa27x_keypad_build_keycode(struct pxa27x_keypad *keypad) | |||
138 | set_bit(code, input_dev->keybit); | 138 | set_bit(code, input_dev->keybit); |
139 | } | 139 | } |
140 | 140 | ||
141 | for (i = 0; i < pdata->direct_key_num; i++) | ||
142 | set_bit(pdata->direct_key_map[i], input_dev->keybit); | ||
143 | |||
141 | keypad->rotary_up_key[0] = pdata->rotary0_up_key; | 144 | keypad->rotary_up_key[0] = pdata->rotary0_up_key; |
142 | keypad->rotary_up_key[1] = pdata->rotary1_up_key; | 145 | keypad->rotary_up_key[1] = pdata->rotary1_up_key; |
143 | keypad->rotary_down_key[0] = pdata->rotary0_down_key; | 146 | keypad->rotary_down_key[0] = pdata->rotary0_down_key; |
@@ -145,17 +148,21 @@ static void pxa27x_keypad_build_keycode(struct pxa27x_keypad *keypad) | |||
145 | keypad->rotary_rel_code[0] = pdata->rotary0_rel_code; | 148 | keypad->rotary_rel_code[0] = pdata->rotary0_rel_code; |
146 | keypad->rotary_rel_code[1] = pdata->rotary1_rel_code; | 149 | keypad->rotary_rel_code[1] = pdata->rotary1_rel_code; |
147 | 150 | ||
148 | if (pdata->rotary0_up_key && pdata->rotary0_down_key) { | 151 | if (pdata->enable_rotary0) { |
149 | set_bit(pdata->rotary0_up_key, input_dev->keybit); | 152 | if (pdata->rotary0_up_key && pdata->rotary0_down_key) { |
150 | set_bit(pdata->rotary0_down_key, input_dev->keybit); | 153 | set_bit(pdata->rotary0_up_key, input_dev->keybit); |
151 | } else | 154 | set_bit(pdata->rotary0_down_key, input_dev->keybit); |
152 | set_bit(pdata->rotary0_rel_code, input_dev->relbit); | 155 | } else |
153 | 156 | set_bit(pdata->rotary0_rel_code, input_dev->relbit); | |
154 | if (pdata->rotary1_up_key && pdata->rotary1_down_key) { | 157 | } |
155 | set_bit(pdata->rotary1_up_key, input_dev->keybit); | 158 | |
156 | set_bit(pdata->rotary1_down_key, input_dev->keybit); | 159 | if (pdata->enable_rotary1) { |
157 | } else | 160 | if (pdata->rotary1_up_key && pdata->rotary1_down_key) { |
158 | set_bit(pdata->rotary1_rel_code, input_dev->relbit); | 161 | set_bit(pdata->rotary1_up_key, input_dev->keybit); |
162 | set_bit(pdata->rotary1_down_key, input_dev->keybit); | ||
163 | } else | ||
164 | set_bit(pdata->rotary1_rel_code, input_dev->relbit); | ||
165 | } | ||
159 | } | 166 | } |
160 | 167 | ||
161 | static inline unsigned int lookup_matrix_keycode( | 168 | static inline unsigned int lookup_matrix_keycode( |
@@ -493,8 +500,13 @@ static int __devinit pxa27x_keypad_probe(struct platform_device *pdev) | |||
493 | keypad->input_dev = input_dev; | 500 | keypad->input_dev = input_dev; |
494 | input_set_drvdata(input_dev, keypad); | 501 | input_set_drvdata(input_dev, keypad); |
495 | 502 | ||
496 | input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP) | | 503 | input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP); |
497 | BIT_MASK(EV_REL); | 504 | if ((keypad->pdata->enable_rotary0 && |
505 | keypad->pdata->rotary0_rel_code) || | ||
506 | (keypad->pdata->enable_rotary1 && | ||
507 | keypad->pdata->rotary1_rel_code)) { | ||
508 | input_dev->evbit[0] |= BIT_MASK(EV_REL); | ||
509 | } | ||
498 | 510 | ||
499 | pxa27x_keypad_build_keycode(keypad); | 511 | pxa27x_keypad_build_keycode(keypad); |
500 | platform_set_drvdata(pdev, keypad); | 512 | platform_set_drvdata(pdev, keypad); |
diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig index 3ad8bd9f7543..432699d61c58 100644 --- a/drivers/input/misc/Kconfig +++ b/drivers/input/misc/Kconfig | |||
@@ -15,7 +15,6 @@ if INPUT_MISC | |||
15 | config INPUT_PCSPKR | 15 | config INPUT_PCSPKR |
16 | tristate "PC Speaker support" | 16 | tristate "PC Speaker support" |
17 | depends on PCSPKR_PLATFORM | 17 | depends on PCSPKR_PLATFORM |
18 | depends on SND_PCSP=n | ||
19 | help | 18 | help |
20 | Say Y here if you want the standard PC Speaker to be used for | 19 | Say Y here if you want the standard PC Speaker to be used for |
21 | bells and whistles. | 20 | bells and whistles. |
diff --git a/drivers/input/misc/apanel.c b/drivers/input/misc/apanel.c index 9531d8c7444f..d82f7f727f7a 100644 --- a/drivers/input/misc/apanel.c +++ b/drivers/input/misc/apanel.c | |||
@@ -20,7 +20,6 @@ | |||
20 | #include <linux/module.h> | 20 | #include <linux/module.h> |
21 | #include <linux/ioport.h> | 21 | #include <linux/ioport.h> |
22 | #include <linux/io.h> | 22 | #include <linux/io.h> |
23 | #include <linux/module.h> | ||
24 | #include <linux/input-polldev.h> | 23 | #include <linux/input-polldev.h> |
25 | #include <linux/i2c.h> | 24 | #include <linux/i2c.h> |
26 | #include <linux/workqueue.h> | 25 | #include <linux/workqueue.h> |
diff --git a/drivers/input/mouse/appletouch.c b/drivers/input/mouse/appletouch.c index 6867c914b024..1f41ae94f26b 100644 --- a/drivers/input/mouse/appletouch.c +++ b/drivers/input/mouse/appletouch.c | |||
@@ -564,6 +564,21 @@ static void atp_close(struct input_dev *input) | |||
564 | dev->open = 0; | 564 | dev->open = 0; |
565 | } | 565 | } |
566 | 566 | ||
567 | static int atp_handle_geyser(struct atp *dev) | ||
568 | { | ||
569 | struct usb_device *udev = dev->udev; | ||
570 | |||
571 | if (dev->type != ATP_FOUNTAIN) { | ||
572 | /* switch to raw sensor mode */ | ||
573 | if (atp_geyser_init(udev)) | ||
574 | return -EIO; | ||
575 | |||
576 | printk(KERN_INFO "appletouch: Geyser mode initialized.\n"); | ||
577 | } | ||
578 | |||
579 | return 0; | ||
580 | } | ||
581 | |||
567 | static int atp_probe(struct usb_interface *iface, | 582 | static int atp_probe(struct usb_interface *iface, |
568 | const struct usb_device_id *id) | 583 | const struct usb_device_id *id) |
569 | { | 584 | { |
@@ -608,14 +623,6 @@ static int atp_probe(struct usb_interface *iface, | |||
608 | else | 623 | else |
609 | dev->datalen = 64; | 624 | dev->datalen = 64; |
610 | 625 | ||
611 | if (dev->type != ATP_FOUNTAIN) { | ||
612 | /* switch to raw sensor mode */ | ||
613 | if (atp_geyser_init(udev)) | ||
614 | goto err_free_devs; | ||
615 | |||
616 | printk(KERN_INFO "appletouch: Geyser mode initialized.\n"); | ||
617 | } | ||
618 | |||
619 | dev->urb = usb_alloc_urb(0, GFP_KERNEL); | 626 | dev->urb = usb_alloc_urb(0, GFP_KERNEL); |
620 | if (!dev->urb) | 627 | if (!dev->urb) |
621 | goto err_free_devs; | 628 | goto err_free_devs; |
@@ -629,6 +636,10 @@ static int atp_probe(struct usb_interface *iface, | |||
629 | usb_rcvintpipe(udev, int_in_endpointAddr), | 636 | usb_rcvintpipe(udev, int_in_endpointAddr), |
630 | dev->data, dev->datalen, atp_complete, dev, 1); | 637 | dev->data, dev->datalen, atp_complete, dev, 1); |
631 | 638 | ||
639 | error = atp_handle_geyser(dev); | ||
640 | if (error) | ||
641 | goto err_free_buffer; | ||
642 | |||
632 | usb_make_path(udev, dev->phys, sizeof(dev->phys)); | 643 | usb_make_path(udev, dev->phys, sizeof(dev->phys)); |
633 | strlcat(dev->phys, "/input0", sizeof(dev->phys)); | 644 | strlcat(dev->phys, "/input0", sizeof(dev->phys)); |
634 | 645 | ||
@@ -721,6 +732,20 @@ static void atp_disconnect(struct usb_interface *iface) | |||
721 | printk(KERN_INFO "input: appletouch disconnected\n"); | 732 | printk(KERN_INFO "input: appletouch disconnected\n"); |
722 | } | 733 | } |
723 | 734 | ||
735 | static int atp_recover(struct atp *dev) | ||
736 | { | ||
737 | int error; | ||
738 | |||
739 | error = atp_handle_geyser(dev); | ||
740 | if (error) | ||
741 | return error; | ||
742 | |||
743 | if (dev->open && usb_submit_urb(dev->urb, GFP_ATOMIC)) | ||
744 | return -EIO; | ||
745 | |||
746 | return 0; | ||
747 | } | ||
748 | |||
724 | static int atp_suspend(struct usb_interface *iface, pm_message_t message) | 749 | static int atp_suspend(struct usb_interface *iface, pm_message_t message) |
725 | { | 750 | { |
726 | struct atp *dev = usb_get_intfdata(iface); | 751 | struct atp *dev = usb_get_intfdata(iface); |
@@ -741,12 +766,20 @@ static int atp_resume(struct usb_interface *iface) | |||
741 | return 0; | 766 | return 0; |
742 | } | 767 | } |
743 | 768 | ||
769 | static int atp_reset_resume(struct usb_interface *iface) | ||
770 | { | ||
771 | struct atp *dev = usb_get_intfdata(iface); | ||
772 | |||
773 | return atp_recover(dev); | ||
774 | } | ||
775 | |||
744 | static struct usb_driver atp_driver = { | 776 | static struct usb_driver atp_driver = { |
745 | .name = "appletouch", | 777 | .name = "appletouch", |
746 | .probe = atp_probe, | 778 | .probe = atp_probe, |
747 | .disconnect = atp_disconnect, | 779 | .disconnect = atp_disconnect, |
748 | .suspend = atp_suspend, | 780 | .suspend = atp_suspend, |
749 | .resume = atp_resume, | 781 | .resume = atp_resume, |
782 | .reset_resume = atp_reset_resume, | ||
750 | .id_table = atp_table, | 783 | .id_table = atp_table, |
751 | }; | 784 | }; |
752 | 785 | ||
diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h index 2289e3a8f25c..9818359d26e2 100644 --- a/drivers/input/serio/i8042-x86ia64io.h +++ b/drivers/input/serio/i8042-x86ia64io.h | |||
@@ -193,6 +193,13 @@ static struct dmi_system_id __initdata i8042_dmi_nomux_table[] = { | |||
193 | }, | 193 | }, |
194 | }, | 194 | }, |
195 | { | 195 | { |
196 | .ident = "Fujitsu-Siemens Amilo Pro 2030", | ||
197 | .matches = { | ||
198 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | ||
199 | DMI_MATCH(DMI_PRODUCT_NAME, "AMILO PRO V2030"), | ||
200 | }, | ||
201 | }, | ||
202 | { | ||
196 | /* | 203 | /* |
197 | * No data is coming from the touchscreen unless KBC | 204 | * No data is coming from the touchscreen unless KBC |
198 | * is in legacy mode. | 205 | * is in legacy mode. |
@@ -336,6 +343,13 @@ static struct dmi_system_id __initdata i8042_dmi_dritek_table[] = { | |||
336 | }, | 343 | }, |
337 | }, | 344 | }, |
338 | { | 345 | { |
346 | .ident = "Acer TravelMate 660", | ||
347 | .matches = { | ||
348 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
349 | DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 660"), | ||
350 | }, | ||
351 | }, | ||
352 | { | ||
339 | .ident = "Acer TravelMate 2490", | 353 | .ident = "Acer TravelMate 2490", |
340 | .matches = { | 354 | .matches = { |
341 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | 355 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c index 65a74cfc187b..170f71ee5772 100644 --- a/drivers/input/serio/i8042.c +++ b/drivers/input/serio/i8042.c | |||
@@ -885,6 +885,20 @@ static long i8042_panic_blink(long count) | |||
885 | 885 | ||
886 | #undef DELAY | 886 | #undef DELAY |
887 | 887 | ||
888 | #ifdef CONFIG_X86 | ||
889 | static void i8042_dritek_enable(void) | ||
890 | { | ||
891 | char param = 0x90; | ||
892 | int error; | ||
893 | |||
894 | error = i8042_command(¶m, 0x1059); | ||
895 | if (error) | ||
896 | printk(KERN_WARNING | ||
897 | "Failed to enable DRITEK extension: %d\n", | ||
898 | error); | ||
899 | } | ||
900 | #endif | ||
901 | |||
888 | #ifdef CONFIG_PM | 902 | #ifdef CONFIG_PM |
889 | /* | 903 | /* |
890 | * Here we try to restore the original BIOS settings. We only want to | 904 | * Here we try to restore the original BIOS settings. We only want to |
@@ -938,10 +952,20 @@ static int i8042_resume(struct platform_device *dev) | |||
938 | i8042_ctr |= I8042_CTR_AUXDIS | I8042_CTR_KBDDIS; | 952 | i8042_ctr |= I8042_CTR_AUXDIS | I8042_CTR_KBDDIS; |
939 | i8042_ctr &= ~(I8042_CTR_AUXINT | I8042_CTR_KBDINT); | 953 | i8042_ctr &= ~(I8042_CTR_AUXINT | I8042_CTR_KBDINT); |
940 | if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) { | 954 | if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) { |
941 | printk(KERN_ERR "i8042: Can't write CTR to resume\n"); | 955 | printk(KERN_WARNING "i8042: Can't write CTR to resume, retrying...\n"); |
942 | return -EIO; | 956 | msleep(50); |
957 | if (i8042_command(&i8042_ctr, I8042_CMD_CTL_WCTR)) { | ||
958 | printk(KERN_ERR "i8042: CTR write retry failed\n"); | ||
959 | return -EIO; | ||
960 | } | ||
943 | } | 961 | } |
944 | 962 | ||
963 | |||
964 | #ifdef CONFIG_X86 | ||
965 | if (i8042_dritek) | ||
966 | i8042_dritek_enable(); | ||
967 | #endif | ||
968 | |||
945 | if (i8042_mux_present) { | 969 | if (i8042_mux_present) { |
946 | if (i8042_set_mux_mode(1, NULL) || i8042_enable_mux_ports()) | 970 | if (i8042_set_mux_mode(1, NULL) || i8042_enable_mux_ports()) |
947 | printk(KERN_WARNING | 971 | printk(KERN_WARNING |
@@ -1160,6 +1184,11 @@ static int __devinit i8042_probe(struct platform_device *dev) | |||
1160 | if (error) | 1184 | if (error) |
1161 | return error; | 1185 | return error; |
1162 | 1186 | ||
1187 | #ifdef CONFIG_X86 | ||
1188 | if (i8042_dritek) | ||
1189 | i8042_dritek_enable(); | ||
1190 | #endif | ||
1191 | |||
1163 | if (!i8042_noaux) { | 1192 | if (!i8042_noaux) { |
1164 | error = i8042_setup_aux(); | 1193 | error = i8042_setup_aux(); |
1165 | if (error && error != -ENODEV && error != -EBUSY) | 1194 | if (error && error != -ENODEV && error != -EBUSY) |
@@ -1171,14 +1200,6 @@ static int __devinit i8042_probe(struct platform_device *dev) | |||
1171 | if (error) | 1200 | if (error) |
1172 | goto out_fail; | 1201 | goto out_fail; |
1173 | } | 1202 | } |
1174 | #ifdef CONFIG_X86 | ||
1175 | if (i8042_dritek) { | ||
1176 | char param = 0x90; | ||
1177 | error = i8042_command(¶m, 0x1059); | ||
1178 | if (error) | ||
1179 | goto out_fail; | ||
1180 | } | ||
1181 | #endif | ||
1182 | /* | 1203 | /* |
1183 | * Ok, everything is ready, let's register all serio ports | 1204 | * Ok, everything is ready, let's register all serio ports |
1184 | */ | 1205 | */ |
diff --git a/drivers/input/tablet/gtco.c b/drivers/input/tablet/gtco.c index c5a8661a1baa..1e748e46d12e 100644 --- a/drivers/input/tablet/gtco.c +++ b/drivers/input/tablet/gtco.c | |||
@@ -830,7 +830,7 @@ static int gtco_probe(struct usb_interface *usbinterface, | |||
830 | struct gtco *gtco; | 830 | struct gtco *gtco; |
831 | struct input_dev *input_dev; | 831 | struct input_dev *input_dev; |
832 | struct hid_descriptor *hid_desc; | 832 | struct hid_descriptor *hid_desc; |
833 | char *report = NULL; | 833 | char *report; |
834 | int result = 0, retry; | 834 | int result = 0, retry; |
835 | int error; | 835 | int error; |
836 | struct usb_endpoint_descriptor *endpoint; | 836 | struct usb_endpoint_descriptor *endpoint; |
@@ -916,12 +916,16 @@ static int gtco_probe(struct usb_interface *usbinterface, | |||
916 | le16_to_cpu(hid_desc->wDescriptorLength), | 916 | le16_to_cpu(hid_desc->wDescriptorLength), |
917 | 5000); /* 5 secs */ | 917 | 5000); /* 5 secs */ |
918 | 918 | ||
919 | if (result == le16_to_cpu(hid_desc->wDescriptorLength)) | 919 | dbg("usb_control_msg result: %d", result); |
920 | if (result == le16_to_cpu(hid_desc->wDescriptorLength)) { | ||
921 | parse_hid_report_descriptor(gtco, report, result); | ||
920 | break; | 922 | break; |
923 | } | ||
921 | } | 924 | } |
922 | 925 | ||
926 | kfree(report); | ||
927 | |||
923 | /* If we didn't get the report, fail */ | 928 | /* If we didn't get the report, fail */ |
924 | dbg("usb_control_msg result: :%d", result); | ||
925 | if (result != le16_to_cpu(hid_desc->wDescriptorLength)) { | 929 | if (result != le16_to_cpu(hid_desc->wDescriptorLength)) { |
926 | err("Failed to get HID Report Descriptor of size: %d", | 930 | err("Failed to get HID Report Descriptor of size: %d", |
927 | hid_desc->wDescriptorLength); | 931 | hid_desc->wDescriptorLength); |
@@ -929,12 +933,6 @@ static int gtco_probe(struct usb_interface *usbinterface, | |||
929 | goto err_free_urb; | 933 | goto err_free_urb; |
930 | } | 934 | } |
931 | 935 | ||
932 | /* Now we parse the report */ | ||
933 | parse_hid_report_descriptor(gtco, report, result); | ||
934 | |||
935 | /* Now we delete it */ | ||
936 | kfree(report); | ||
937 | |||
938 | /* Create a device file node */ | 936 | /* Create a device file node */ |
939 | usb_make_path(gtco->usbdev, gtco->usbpath, sizeof(gtco->usbpath)); | 937 | usb_make_path(gtco->usbdev, gtco->usbpath, sizeof(gtco->usbpath)); |
940 | strlcat(gtco->usbpath, "/input0", sizeof(gtco->usbpath)); | 938 | strlcat(gtco->usbpath, "/input0", sizeof(gtco->usbpath)); |
@@ -988,7 +986,6 @@ static int gtco_probe(struct usb_interface *usbinterface, | |||
988 | usb_buffer_free(gtco->usbdev, REPORT_MAX_SIZE, | 986 | usb_buffer_free(gtco->usbdev, REPORT_MAX_SIZE, |
989 | gtco->buffer, gtco->buf_dma); | 987 | gtco->buffer, gtco->buf_dma); |
990 | err_free_devs: | 988 | err_free_devs: |
991 | kfree(report); | ||
992 | input_free_device(input_dev); | 989 | input_free_device(input_dev); |
993 | kfree(gtco); | 990 | kfree(gtco); |
994 | return error; | 991 | return error; |
diff --git a/drivers/input/touchscreen/wm9713.c b/drivers/input/touchscreen/wm9713.c index 01278bd7e65c..838458792ea0 100644 --- a/drivers/input/touchscreen/wm9713.c +++ b/drivers/input/touchscreen/wm9713.c | |||
@@ -85,6 +85,15 @@ module_param(delay, int, 0); | |||
85 | MODULE_PARM_DESC(delay, "Set adc sample delay."); | 85 | MODULE_PARM_DESC(delay, "Set adc sample delay."); |
86 | 86 | ||
87 | /* | 87 | /* |
88 | * Set five_wire = 1 to use a 5 wire touchscreen. | ||
89 | * | ||
90 | * NOTE: Five wire mode does not allow for readback of pressure. | ||
91 | */ | ||
92 | static int five_wire; | ||
93 | module_param(five_wire, int, 0); | ||
94 | MODULE_PARM_DESC(five_wire, "Set to '1' to use 5-wire touchscreen."); | ||
95 | |||
96 | /* | ||
88 | * Set adc mask function. | 97 | * Set adc mask function. |
89 | * | 98 | * |
90 | * Sources of glitch noise, such as signals driving an LCD display, may feed | 99 | * Sources of glitch noise, such as signals driving an LCD display, may feed |
@@ -162,6 +171,19 @@ static void wm9713_phy_init(struct wm97xx *wm) | |||
162 | 64000 / rpu); | 171 | 64000 / rpu); |
163 | } | 172 | } |
164 | 173 | ||
174 | /* Five wire panel? */ | ||
175 | if (five_wire) { | ||
176 | dig3 |= WM9713_45W; | ||
177 | dev_info(wm->dev, "setting 5-wire touchscreen mode."); | ||
178 | |||
179 | if (pil) { | ||
180 | dev_warn(wm->dev, | ||
181 | "Pressure measurement not supported in 5 " | ||
182 | "wire mode, disabling\n"); | ||
183 | pil = 0; | ||
184 | } | ||
185 | } | ||
186 | |||
165 | /* touchpanel pressure */ | 187 | /* touchpanel pressure */ |
166 | if (pil == 2) { | 188 | if (pil == 2) { |
167 | dig3 |= WM9712_PIL; | 189 | dig3 |= WM9712_PIL; |
diff --git a/drivers/input/touchscreen/wm97xx-core.c b/drivers/input/touchscreen/wm97xx-core.c index e9c7ea46b6e3..cdc24ad314e0 100644 --- a/drivers/input/touchscreen/wm97xx-core.c +++ b/drivers/input/touchscreen/wm97xx-core.c | |||
@@ -608,6 +608,17 @@ static int wm97xx_probe(struct device *dev) | |||
608 | goto alloc_err; | 608 | goto alloc_err; |
609 | } | 609 | } |
610 | 610 | ||
611 | /* set up physical characteristics */ | ||
612 | wm->codec->phy_init(wm); | ||
613 | |||
614 | /* load gpio cache */ | ||
615 | wm->gpio[0] = wm97xx_reg_read(wm, AC97_GPIO_CFG); | ||
616 | wm->gpio[1] = wm97xx_reg_read(wm, AC97_GPIO_POLARITY); | ||
617 | wm->gpio[2] = wm97xx_reg_read(wm, AC97_GPIO_STICKY); | ||
618 | wm->gpio[3] = wm97xx_reg_read(wm, AC97_GPIO_WAKEUP); | ||
619 | wm->gpio[4] = wm97xx_reg_read(wm, AC97_GPIO_STATUS); | ||
620 | wm->gpio[5] = wm97xx_reg_read(wm, AC97_MISC_AFE); | ||
621 | |||
611 | wm->input_dev = input_allocate_device(); | 622 | wm->input_dev = input_allocate_device(); |
612 | if (wm->input_dev == NULL) { | 623 | if (wm->input_dev == NULL) { |
613 | ret = -ENOMEM; | 624 | ret = -ENOMEM; |
@@ -616,6 +627,7 @@ static int wm97xx_probe(struct device *dev) | |||
616 | 627 | ||
617 | /* set up touch configuration */ | 628 | /* set up touch configuration */ |
618 | wm->input_dev->name = "wm97xx touchscreen"; | 629 | wm->input_dev->name = "wm97xx touchscreen"; |
630 | wm->input_dev->phys = "wm97xx"; | ||
619 | wm->input_dev->open = wm97xx_ts_input_open; | 631 | wm->input_dev->open = wm97xx_ts_input_open; |
620 | wm->input_dev->close = wm97xx_ts_input_close; | 632 | wm->input_dev->close = wm97xx_ts_input_close; |
621 | set_bit(EV_ABS, wm->input_dev->evbit); | 633 | set_bit(EV_ABS, wm->input_dev->evbit); |
@@ -634,17 +646,6 @@ static int wm97xx_probe(struct device *dev) | |||
634 | if (ret < 0) | 646 | if (ret < 0) |
635 | goto dev_alloc_err; | 647 | goto dev_alloc_err; |
636 | 648 | ||
637 | /* set up physical characteristics */ | ||
638 | wm->codec->phy_init(wm); | ||
639 | |||
640 | /* load gpio cache */ | ||
641 | wm->gpio[0] = wm97xx_reg_read(wm, AC97_GPIO_CFG); | ||
642 | wm->gpio[1] = wm97xx_reg_read(wm, AC97_GPIO_POLARITY); | ||
643 | wm->gpio[2] = wm97xx_reg_read(wm, AC97_GPIO_STICKY); | ||
644 | wm->gpio[3] = wm97xx_reg_read(wm, AC97_GPIO_WAKEUP); | ||
645 | wm->gpio[4] = wm97xx_reg_read(wm, AC97_GPIO_STATUS); | ||
646 | wm->gpio[5] = wm97xx_reg_read(wm, AC97_MISC_AFE); | ||
647 | |||
648 | /* register our battery device */ | 649 | /* register our battery device */ |
649 | wm->battery_dev = platform_device_alloc("wm97xx-battery", -1); | 650 | wm->battery_dev = platform_device_alloc("wm97xx-battery", -1); |
650 | if (!wm->battery_dev) { | 651 | if (!wm->battery_dev) { |
@@ -801,7 +802,7 @@ void wm97xx_unregister_mach_ops(struct wm97xx *wm) | |||
801 | EXPORT_SYMBOL_GPL(wm97xx_unregister_mach_ops); | 802 | EXPORT_SYMBOL_GPL(wm97xx_unregister_mach_ops); |
802 | 803 | ||
803 | static struct device_driver wm97xx_driver = { | 804 | static struct device_driver wm97xx_driver = { |
804 | .name = "ac97", | 805 | .name = "wm97xx-ts", |
805 | .bus = &ac97_bus_type, | 806 | .bus = &ac97_bus_type, |
806 | .owner = THIS_MODULE, | 807 | .owner = THIS_MODULE, |
807 | .probe = wm97xx_probe, | 808 | .probe = wm97xx_probe, |