diff options
Diffstat (limited to 'drivers/input/serio')
-rw-r--r-- | drivers/input/serio/hp_sdc.c | 1 | ||||
-rw-r--r-- | drivers/input/serio/i8042-sparcio.h | 19 | ||||
-rw-r--r-- | drivers/input/serio/rpckbd.c | 2 | ||||
-rw-r--r-- | drivers/input/serio/serio.c | 55 |
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 | ||
102 | static int __init i8042_platform_init(void) | 104 | static 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 | ||
137 | static inline void i8042_platform_exit(void) | 135 | static 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 */ | ||
144 | static int __init i8042_platform_init(void) | ||
145 | { | ||
146 | return -ENODEV; | ||
147 | } | ||
148 | |||
149 | static 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); | |||
63 | static struct bus_type serio_bus; | 63 | static struct bus_type serio_bus; |
64 | 64 | ||
65 | static void serio_add_port(struct serio *serio); | 65 | static void serio_add_port(struct serio *serio); |
66 | static void serio_reconnect_port(struct serio *serio); | 66 | static int serio_reconnect_port(struct serio *serio); |
67 | static void serio_disconnect_port(struct serio *serio); | 67 | static void serio_disconnect_port(struct serio *serio); |
68 | static void serio_reconnect_chain(struct serio *serio); | ||
68 | static void serio_attach_driver(struct serio_driver *drv); | 69 | static void serio_attach_driver(struct serio_driver *drv); |
69 | 70 | ||
70 | static int serio_connect_driver(struct serio *serio, struct serio_driver *drv) | 71 | static int serio_connect_driver(struct serio *serio, struct serio_driver *drv) |
@@ -161,6 +162,7 @@ static void serio_find_driver(struct serio *serio) | |||
161 | enum serio_event_type { | 162 | enum 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 | */ | ||
634 | static 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 | */ |
625 | static void serio_reconnect_port(struct serio *serio) | 649 | static 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 | ||
674 | void serio_reconnect(struct serio *serio) | 696 | void 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 | ||
928 | static int serio_resume(struct device *dev) | 950 | static 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 */ |