diff options
author | Bjorn Helgaas <bjorn.helgaas@hp.com> | 2006-03-14 00:12:24 -0500 |
---|---|---|
committer | Dmitry Torokhov <dtor_core@ameritech.net> | 2006-03-14 00:12:24 -0500 |
commit | 2bfc3c6e9516ece6856ec7904319650a5d4d9871 (patch) | |
tree | 2958c37edcfd54b09a699fcce72d4ac71e754240 /drivers/input | |
parent | dd55563f635751327eb06ae569d4761a0220f2e0 (diff) |
Input: i8042 - fix logic around pnp_register_driver()
Do not assume that pnp_register_driver() returns the number of
devices claimed.
Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Diffstat (limited to 'drivers/input')
-rw-r--r-- | drivers/input/serio/i8042-x86ia64io.h | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h index a4c6f3522723..f606e96bc2f4 100644 --- a/drivers/input/serio/i8042-x86ia64io.h +++ b/drivers/input/serio/i8042-x86ia64io.h | |||
@@ -192,7 +192,9 @@ static struct dmi_system_id __initdata i8042_dmi_nomux_table[] = { | |||
192 | #include <linux/pnp.h> | 192 | #include <linux/pnp.h> |
193 | 193 | ||
194 | static int i8042_pnp_kbd_registered; | 194 | static int i8042_pnp_kbd_registered; |
195 | static unsigned int i8042_pnp_kbd_devices; | ||
195 | static int i8042_pnp_aux_registered; | 196 | static int i8042_pnp_aux_registered; |
197 | static unsigned int i8042_pnp_aux_devices; | ||
196 | 198 | ||
197 | static int i8042_pnp_command_reg; | 199 | static int i8042_pnp_command_reg; |
198 | static int i8042_pnp_data_reg; | 200 | static int i8042_pnp_data_reg; |
@@ -219,6 +221,7 @@ static int i8042_pnp_kbd_probe(struct pnp_dev *dev, const struct pnp_device_id * | |||
219 | strncat(i8042_pnp_kbd_name, pnp_dev_name(dev), sizeof(i8042_pnp_kbd_name)); | 221 | strncat(i8042_pnp_kbd_name, pnp_dev_name(dev), sizeof(i8042_pnp_kbd_name)); |
220 | } | 222 | } |
221 | 223 | ||
224 | i8042_pnp_kbd_devices++; | ||
222 | return 0; | 225 | return 0; |
223 | } | 226 | } |
224 | 227 | ||
@@ -239,6 +242,7 @@ static int i8042_pnp_aux_probe(struct pnp_dev *dev, const struct pnp_device_id * | |||
239 | strncat(i8042_pnp_aux_name, pnp_dev_name(dev), sizeof(i8042_pnp_aux_name)); | 242 | strncat(i8042_pnp_aux_name, pnp_dev_name(dev), sizeof(i8042_pnp_aux_name)); |
240 | } | 243 | } |
241 | 244 | ||
245 | i8042_pnp_aux_devices++; | ||
242 | return 0; | 246 | return 0; |
243 | } | 247 | } |
244 | 248 | ||
@@ -287,21 +291,23 @@ static void i8042_pnp_exit(void) | |||
287 | 291 | ||
288 | static int __init i8042_pnp_init(void) | 292 | static int __init i8042_pnp_init(void) |
289 | { | 293 | { |
290 | int result_kbd = 0, result_aux = 0; | ||
291 | char kbd_irq_str[4] = { 0 }, aux_irq_str[4] = { 0 }; | 294 | char kbd_irq_str[4] = { 0 }, aux_irq_str[4] = { 0 }; |
295 | int err; | ||
292 | 296 | ||
293 | if (i8042_nopnp) { | 297 | if (i8042_nopnp) { |
294 | printk(KERN_INFO "i8042: PNP detection disabled\n"); | 298 | printk(KERN_INFO "i8042: PNP detection disabled\n"); |
295 | return 0; | 299 | return 0; |
296 | } | 300 | } |
297 | 301 | ||
298 | if ((result_kbd = pnp_register_driver(&i8042_pnp_kbd_driver)) >= 0) | 302 | err = pnp_register_driver(&i8042_pnp_kbd_driver); |
303 | if (!err) | ||
299 | i8042_pnp_kbd_registered = 1; | 304 | i8042_pnp_kbd_registered = 1; |
300 | 305 | ||
301 | if ((result_aux = pnp_register_driver(&i8042_pnp_aux_driver)) >= 0) | 306 | err = pnp_register_driver(&i8042_pnp_aux_driver); |
307 | if (!err) | ||
302 | i8042_pnp_aux_registered = 1; | 308 | i8042_pnp_aux_registered = 1; |
303 | 309 | ||
304 | if (result_kbd <= 0 && result_aux <= 0) { | 310 | if (!i8042_pnp_kbd_devices && !i8042_pnp_aux_devices) { |
305 | i8042_pnp_exit(); | 311 | i8042_pnp_exit(); |
306 | #if defined(__ia64__) | 312 | #if defined(__ia64__) |
307 | return -ENODEV; | 313 | return -ENODEV; |
@@ -311,24 +317,24 @@ static int __init i8042_pnp_init(void) | |||
311 | #endif | 317 | #endif |
312 | } | 318 | } |
313 | 319 | ||
314 | if (result_kbd > 0) | 320 | if (i8042_pnp_kbd_devices) |
315 | snprintf(kbd_irq_str, sizeof(kbd_irq_str), | 321 | snprintf(kbd_irq_str, sizeof(kbd_irq_str), |
316 | "%d", i8042_pnp_kbd_irq); | 322 | "%d", i8042_pnp_kbd_irq); |
317 | if (result_aux > 0) | 323 | if (i8042_pnp_aux_devices) |
318 | snprintf(aux_irq_str, sizeof(aux_irq_str), | 324 | snprintf(aux_irq_str, sizeof(aux_irq_str), |
319 | "%d", i8042_pnp_aux_irq); | 325 | "%d", i8042_pnp_aux_irq); |
320 | 326 | ||
321 | printk(KERN_INFO "PNP: PS/2 Controller [%s%s%s] at %#x,%#x irq %s%s%s\n", | 327 | printk(KERN_INFO "PNP: PS/2 Controller [%s%s%s] at %#x,%#x irq %s%s%s\n", |
322 | i8042_pnp_kbd_name, (result_kbd > 0 && result_aux > 0) ? "," : "", | 328 | i8042_pnp_kbd_name, (i8042_pnp_kbd_devices && i8042_pnp_aux_devices) ? "," : "", |
323 | i8042_pnp_aux_name, | 329 | i8042_pnp_aux_name, |
324 | i8042_pnp_data_reg, i8042_pnp_command_reg, | 330 | i8042_pnp_data_reg, i8042_pnp_command_reg, |
325 | kbd_irq_str, (result_kbd > 0 && result_aux > 0) ? "," : "", | 331 | kbd_irq_str, (i8042_pnp_kbd_devices && i8042_pnp_aux_devices) ? "," : "", |
326 | aux_irq_str); | 332 | aux_irq_str); |
327 | 333 | ||
328 | #if defined(__ia64__) | 334 | #if defined(__ia64__) |
329 | if (result_kbd <= 0) | 335 | if (!i8042_pnp_kbd_devices) |
330 | i8042_nokbd = 1; | 336 | i8042_nokbd = 1; |
331 | if (result_aux <= 0) | 337 | if (!i8042_pnp_aux_devices) |
332 | i8042_noaux = 1; | 338 | i8042_noaux = 1; |
333 | #endif | 339 | #endif |
334 | 340 | ||