Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Input: wistron - convert to dynamic input_dev allocation

Signed-off-by: Dmitry Torokhov <dtor@mail.ru>

+37 -16
+37 -16
drivers/input/misc/wistron_btns.c
··· 149 149 return -ENOMEM; 150 150 } 151 151 152 - static void __exit unmap_bios(void) 152 + static inline void unmap_bios(void) 153 153 { 154 154 iounmap(bios_code_map_base); 155 155 iounmap(bios_data_map_base); ··· 180 180 call_bios(&regs); 181 181 } 182 182 183 - static void __exit bios_detach(void) 183 + static void bios_detach(void) 184 184 { 185 185 struct regs regs; 186 186 ··· 342 342 343 343 /* Input layer interface */ 344 344 345 - static struct input_dev input_dev = { 346 - .name = "Wistron laptop buttons", 347 - }; 345 + static struct input_dev *input_dev; 348 346 349 - static void __init setup_input_dev(void) 347 + static int __init setup_input_dev(void) 350 348 { 351 349 const struct key_entry *key; 350 + int error; 351 + 352 + input_dev = input_allocate_device(); 353 + if (!input_dev) 354 + return -ENOMEM; 355 + 356 + input_dev->name = "Wistron laptop buttons"; 357 + input_dev->phys = "wistron/input0"; 358 + input_dev->id.bustype = BUS_HOST; 352 359 353 360 for (key = keymap; key->type != KE_END; key++) { 354 361 if (key->type == KE_KEY) { 355 - input_dev.evbit[LONG(EV_KEY)] = BIT(EV_KEY); 356 - input_dev.keybit[LONG(key->keycode)] 357 - |= BIT(key->keycode); 362 + input_dev->evbit[LONG(EV_KEY)] = BIT(EV_KEY); 363 + set_bit(key->keycode, input_dev->keybit); 358 364 } 359 365 } 360 366 361 - input_register_device(&input_dev); 367 + error = input_register_device(input_dev); 368 + if (error) { 369 + input_free_device(input_dev); 370 + return error; 371 + } 372 + 373 + return 0; 362 374 } 363 375 364 376 static void report_key(unsigned keycode) 365 377 { 366 - input_report_key(&input_dev, keycode, 1); 367 - input_sync(&input_dev); 368 - input_report_key(&input_dev, keycode, 0); 369 - input_sync(&input_dev); 378 + input_report_key(input_dev, keycode, 1); 379 + input_sync(input_dev); 380 + input_report_key(input_dev, keycode, 0); 381 + input_sync(input_dev); 370 382 } 371 383 372 384 /* Driver core */ ··· 449 437 err = select_keymap(); 450 438 if (err) 451 439 return err; 440 + 452 441 err = map_bios(); 453 442 if (err) 454 443 return err; 444 + 455 445 bios_attach(); 456 446 cmos_address = bios_get_cmos_address(); 447 + 457 448 if (have_wifi) { 458 449 u16 wifi = bios_get_default_setting(WIFI); 459 450 if (wifi & 1) ··· 467 452 if (have_wifi) 468 453 bios_set_state(WIFI, wifi_enabled); 469 454 } 455 + 470 456 if (have_bluetooth) { 471 457 u16 bt = bios_get_default_setting(BLUETOOTH); 472 458 if (bt & 1) ··· 479 463 bios_set_state(BLUETOOTH, bluetooth_enabled); 480 464 } 481 465 482 - setup_input_dev(); 466 + err = setup_input_dev(); 467 + if (err) { 468 + bios_detach(); 469 + unmap_bios(); 470 + return err; 471 + } 483 472 484 473 poll_bios(1); /* Flush stale event queue and arm timer */ 485 474 ··· 494 473 static void __exit wb_module_exit(void) 495 474 { 496 475 del_timer_sync(&poll_timer); 497 - input_unregister_device(&input_dev); 476 + input_unregister_device(input_dev); 498 477 bios_detach(); 499 478 unmap_bios(); 500 479 }