aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/serio
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/input/serio')
-rw-r--r--drivers/input/serio/hp_sdc.c1
-rw-r--r--drivers/input/serio/i8042-sparcio.h19
-rw-r--r--drivers/input/serio/rpckbd.c2
-rw-r--r--drivers/input/serio/serio.c55
4 files changed, 51 insertions, 26 deletions
diff --git a/drivers/input/serio/hp_sdc.c b/drivers/input/serio/hp_sdc.c
index aad664d5259f..0d395979b2d1 100644
--- a/drivers/input/serio/hp_sdc.c
+++ b/drivers/input/serio/hp_sdc.c
@@ -70,7 +70,6 @@
70#include <linux/semaphore.h> 70#include <linux/semaphore.h>
71#include <linux/slab.h> 71#include <linux/slab.h>
72#include <linux/hil.h> 72#include <linux/hil.h>
73#include <linux/semaphore.h>
74#include <asm/io.h> 73#include <asm/io.h>
75#include <asm/system.h> 74#include <asm/system.h>
76 75
diff --git a/drivers/input/serio/i8042-sparcio.h b/drivers/input/serio/i8042-sparcio.h
index d9ca55891cd7..66bafe308b0c 100644
--- a/drivers/input/serio/i8042-sparcio.h
+++ b/drivers/input/serio/i8042-sparcio.h
@@ -41,6 +41,8 @@ static inline void i8042_write_command(int val)
41 writeb(val, kbd_iobase + 0x64UL); 41 writeb(val, kbd_iobase + 0x64UL);
42} 42}
43 43
44#ifdef CONFIG_PCI
45
44#define OBP_PS2KBD_NAME1 "kb_ps2" 46#define OBP_PS2KBD_NAME1 "kb_ps2"
45#define OBP_PS2KBD_NAME2 "keyboard" 47#define OBP_PS2KBD_NAME2 "keyboard"
46#define OBP_PS2MS_NAME1 "kdmouse" 48#define OBP_PS2MS_NAME1 "kdmouse"
@@ -101,9 +103,6 @@ static struct of_platform_driver sparc_i8042_driver = {
101 103
102static int __init i8042_platform_init(void) 104static int __init i8042_platform_init(void)
103{ 105{
104#ifndef CONFIG_PCI
105 return -ENODEV;
106#else
107 struct device_node *root = of_find_node_by_path("/"); 106 struct device_node *root = of_find_node_by_path("/");
108 107
109 if (!strcmp(root->name, "SUNW,JavaStation-1")) { 108 if (!strcmp(root->name, "SUNW,JavaStation-1")) {
@@ -131,17 +130,25 @@ static int __init i8042_platform_init(void)
131 i8042_reset = 1; 130 i8042_reset = 1;
132 131
133 return 0; 132 return 0;
134#endif /* CONFIG_PCI */
135} 133}
136 134
137static inline void i8042_platform_exit(void) 135static inline void i8042_platform_exit(void)
138{ 136{
139#ifdef CONFIG_PCI
140 struct device_node *root = of_find_node_by_path("/"); 137 struct device_node *root = of_find_node_by_path("/");
141 138
142 if (strcmp(root->name, "SUNW,JavaStation-1")) 139 if (strcmp(root->name, "SUNW,JavaStation-1"))
143 of_unregister_driver(&sparc_i8042_driver); 140 of_unregister_driver(&sparc_i8042_driver);
144#endif
145} 141}
146 142
143#else /* !CONFIG_PCI */
144static int __init i8042_platform_init(void)
145{
146 return -ENODEV;
147}
148
149static inline void i8042_platform_exit(void)
150{
151}
152#endif /* !CONFIG_PCI */
153
147#endif /* _I8042_SPARCIO_H */ 154#endif /* _I8042_SPARCIO_H */
diff --git a/drivers/input/serio/rpckbd.c b/drivers/input/serio/rpckbd.c
index 1567b7782478..7f36edd34f8b 100644
--- a/drivers/input/serio/rpckbd.c
+++ b/drivers/input/serio/rpckbd.c
@@ -35,7 +35,7 @@
35#include <linux/platform_device.h> 35#include <linux/platform_device.h>
36 36
37#include <asm/irq.h> 37#include <asm/irq.h>
38#include <asm/hardware.h> 38#include <mach/hardware.h>
39#include <asm/io.h> 39#include <asm/io.h>
40#include <asm/hardware/iomd.h> 40#include <asm/hardware/iomd.h>
41#include <asm/system.h> 41#include <asm/system.h>
diff --git a/drivers/input/serio/serio.c b/drivers/input/serio/serio.c
index 78f2abb5c11b..2f12d60eee3b 100644
--- a/drivers/input/serio/serio.c
+++ b/drivers/input/serio/serio.c
@@ -63,8 +63,9 @@ static LIST_HEAD(serio_list);
63static struct bus_type serio_bus; 63static struct bus_type serio_bus;
64 64
65static void serio_add_port(struct serio *serio); 65static void serio_add_port(struct serio *serio);
66static void serio_reconnect_port(struct serio *serio); 66static int serio_reconnect_port(struct serio *serio);
67static void serio_disconnect_port(struct serio *serio); 67static void serio_disconnect_port(struct serio *serio);
68static void serio_reconnect_chain(struct serio *serio);
68static void serio_attach_driver(struct serio_driver *drv); 69static void serio_attach_driver(struct serio_driver *drv);
69 70
70static int serio_connect_driver(struct serio *serio, struct serio_driver *drv) 71static int serio_connect_driver(struct serio *serio, struct serio_driver *drv)
@@ -161,6 +162,7 @@ static void serio_find_driver(struct serio *serio)
161enum serio_event_type { 162enum serio_event_type {
162 SERIO_RESCAN_PORT, 163 SERIO_RESCAN_PORT,
163 SERIO_RECONNECT_PORT, 164 SERIO_RECONNECT_PORT,
165 SERIO_RECONNECT_CHAIN,
164 SERIO_REGISTER_PORT, 166 SERIO_REGISTER_PORT,
165 SERIO_ATTACH_DRIVER, 167 SERIO_ATTACH_DRIVER,
166}; 168};
@@ -315,6 +317,10 @@ static void serio_handle_event(void)
315 serio_find_driver(event->object); 317 serio_find_driver(event->object);
316 break; 318 break;
317 319
320 case SERIO_RECONNECT_CHAIN:
321 serio_reconnect_chain(event->object);
322 break;
323
318 case SERIO_ATTACH_DRIVER: 324 case SERIO_ATTACH_DRIVER:
319 serio_attach_driver(event->object); 325 serio_attach_driver(event->object);
320 break; 326 break;
@@ -470,7 +476,7 @@ static ssize_t serio_rebind_driver(struct device *dev, struct device_attribute *
470 if (!strncmp(buf, "none", count)) { 476 if (!strncmp(buf, "none", count)) {
471 serio_disconnect_port(serio); 477 serio_disconnect_port(serio);
472 } else if (!strncmp(buf, "reconnect", count)) { 478 } else if (!strncmp(buf, "reconnect", count)) {
473 serio_reconnect_port(serio); 479 serio_reconnect_chain(serio);
474 } else if (!strncmp(buf, "rescan", count)) { 480 } else if (!strncmp(buf, "rescan", count)) {
475 serio_disconnect_port(serio); 481 serio_disconnect_port(serio);
476 serio_find_driver(serio); 482 serio_find_driver(serio);
@@ -620,14 +626,30 @@ static void serio_destroy_port(struct serio *serio)
620} 626}
621 627
622/* 628/*
629 * Reconnect serio port (re-initialize attached device).
630 * If reconnect fails (old device is no longer attached or
631 * there was no device to begin with) we do full rescan in
632 * hope of finding a driver for the port.
633 */
634static int serio_reconnect_port(struct serio *serio)
635{
636 int error = serio_reconnect_driver(serio);
637
638 if (error) {
639 serio_disconnect_port(serio);
640 serio_find_driver(serio);
641 }
642
643 return error;
644}
645
646/*
623 * Reconnect serio port and all its children (re-initialize attached devices) 647 * Reconnect serio port and all its children (re-initialize attached devices)
624 */ 648 */
625static void serio_reconnect_port(struct serio *serio) 649static void serio_reconnect_chain(struct serio *serio)
626{ 650{
627 do { 651 do {
628 if (serio_reconnect_driver(serio)) { 652 if (serio_reconnect_port(serio)) {
629 serio_disconnect_port(serio);
630 serio_find_driver(serio);
631 /* Ok, old children are now gone, we are done */ 653 /* Ok, old children are now gone, we are done */
632 break; 654 break;
633 } 655 }
@@ -673,7 +695,7 @@ void serio_rescan(struct serio *serio)
673 695
674void serio_reconnect(struct serio *serio) 696void serio_reconnect(struct serio *serio)
675{ 697{
676 serio_queue_event(serio, NULL, SERIO_RECONNECT_PORT); 698 serio_queue_event(serio, NULL, SERIO_RECONNECT_CHAIN);
677} 699}
678 700
679/* 701/*
@@ -927,19 +949,16 @@ static int serio_suspend(struct device *dev, pm_message_t state)
927 949
928static int serio_resume(struct device *dev) 950static int serio_resume(struct device *dev)
929{ 951{
930 struct serio *serio = to_serio_port(dev); 952 /*
931 953 * Driver reconnect can take a while, so better let kseriod
932 if (dev->power.power_state.event != PM_EVENT_ON && 954 * deal with it.
933 serio_reconnect_driver(serio)) { 955 */
934 /* 956 if (dev->power.power_state.event != PM_EVENT_ON) {
935 * Driver re-probing can take a while, so better let kseriod 957 dev->power.power_state = PMSG_ON;
936 * deal with it. 958 serio_queue_event(to_serio_port(dev), NULL,
937 */ 959 SERIO_RECONNECT_PORT);
938 serio_rescan(serio);
939 } 960 }
940 961
941 dev->power.power_state = PMSG_ON;
942
943 return 0; 962 return 0;
944} 963}
945#endif /* CONFIG_PM */ 964#endif /* CONFIG_PM */