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 | |
| 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>
| -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 | ||
