diff options
Diffstat (limited to 'drivers/input/serio/i8042.c')
-rw-r--r-- | drivers/input/serio/i8042.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c index eb3ff94af58c..bc56e52b945f 100644 --- a/drivers/input/serio/i8042.c +++ b/drivers/input/serio/i8042.c | |||
@@ -87,8 +87,22 @@ static bool i8042_bypass_aux_irq_test; | |||
87 | 87 | ||
88 | #include "i8042.h" | 88 | #include "i8042.h" |
89 | 89 | ||
90 | /* | ||
91 | * i8042_lock protects serialization between i8042_command and | ||
92 | * the interrupt handler. | ||
93 | */ | ||
90 | static DEFINE_SPINLOCK(i8042_lock); | 94 | static DEFINE_SPINLOCK(i8042_lock); |
91 | 95 | ||
96 | /* | ||
97 | * Writers to AUX and KBD ports as well as users issuing i8042_command | ||
98 | * directly should acquire i8042_mutex (by means of calling | ||
99 | * i8042_lock_chip() and i8042_unlock_ship() helpers) to ensure that | ||
100 | * they do not disturb each other (unfortunately in many i8042 | ||
101 | * implementations write to one of the ports will immediately abort | ||
102 | * command that is being processed by another port). | ||
103 | */ | ||
104 | static DEFINE_MUTEX(i8042_mutex); | ||
105 | |||
92 | struct i8042_port { | 106 | struct i8042_port { |
93 | struct serio *serio; | 107 | struct serio *serio; |
94 | int irq; | 108 | int irq; |
@@ -113,6 +127,18 @@ static struct platform_device *i8042_platform_device; | |||
113 | 127 | ||
114 | static irqreturn_t i8042_interrupt(int irq, void *dev_id); | 128 | static irqreturn_t i8042_interrupt(int irq, void *dev_id); |
115 | 129 | ||
130 | void i8042_lock_chip(void) | ||
131 | { | ||
132 | mutex_lock(&i8042_mutex); | ||
133 | } | ||
134 | EXPORT_SYMBOL(i8042_lock_chip); | ||
135 | |||
136 | void i8042_unlock_chip(void) | ||
137 | { | ||
138 | mutex_unlock(&i8042_mutex); | ||
139 | } | ||
140 | EXPORT_SYMBOL(i8042_unlock_chip); | ||
141 | |||
116 | /* | 142 | /* |
117 | * The i8042_wait_read() and i8042_wait_write functions wait for the i8042 to | 143 | * The i8042_wait_read() and i8042_wait_write functions wait for the i8042 to |
118 | * be ready for reading values from it / writing values to it. | 144 | * be ready for reading values from it / writing values to it. |
@@ -1161,6 +1187,21 @@ static void __devexit i8042_unregister_ports(void) | |||
1161 | } | 1187 | } |
1162 | } | 1188 | } |
1163 | 1189 | ||
1190 | /* | ||
1191 | * Checks whether port belongs to i8042 controller. | ||
1192 | */ | ||
1193 | bool i8042_check_port_owner(const struct serio *port) | ||
1194 | { | ||
1195 | int i; | ||
1196 | |||
1197 | for (i = 0; i < I8042_NUM_PORTS; i++) | ||
1198 | if (i8042_ports[i].serio == port) | ||
1199 | return true; | ||
1200 | |||
1201 | return false; | ||
1202 | } | ||
1203 | EXPORT_SYMBOL(i8042_check_port_owner); | ||
1204 | |||
1164 | static void i8042_free_irqs(void) | 1205 | static void i8042_free_irqs(void) |
1165 | { | 1206 | { |
1166 | if (i8042_aux_irq_registered) | 1207 | if (i8042_aux_irq_registered) |