Loading drivers/auxdisplay/panel.c +89 −113 Original line number Diff line number Diff line Loading @@ -1519,106 +1519,9 @@ static void keypad_init(void) static void panel_attach(struct parport *port) { int selected_keypad_type = NOT_SET; struct pardev_cb panel_cb; if (port->number != parport) return; if (pprt) { pr_err("%s: port->number=%d parport=%d, already registered!\n", __func__, port->number, parport); return; } memset(&panel_cb, 0, sizeof(panel_cb)); panel_cb.private = &pprt; /* panel_cb.flags = 0 should be PARPORT_DEV_EXCL? */ pprt = parport_register_dev_model(port, "panel", &panel_cb, 0); if (!pprt) { pr_err("%s: port->number=%d parport=%d, parport_register_device() failed\n", __func__, port->number, parport); return; } if (parport_claim(pprt)) { pr_err("could not claim access to parport%d. Aborting.\n", parport); goto err_unreg_device; } /* must init LCD first, just in case an IRQ from the keypad is * generated at keypad init */ if (lcd.enabled) { lcd_init(); if (!lcd.charlcd || charlcd_register(lcd.charlcd)) goto err_unreg_device; } if (keypad.enabled) { keypad_init(); if (misc_register(&keypad_dev)) goto err_lcd_unreg; } return; err_lcd_unreg: if (scan_timer.function) del_timer_sync(&scan_timer); if (lcd.enabled) charlcd_unregister(lcd.charlcd); err_unreg_device: kfree(lcd.charlcd); lcd.charlcd = NULL; parport_unregister_device(pprt); pprt = NULL; } static void panel_detach(struct parport *port) { if (port->number != parport) return; if (!pprt) { pr_err("%s: port->number=%d parport=%d, nothing to unregister.\n", __func__, port->number, parport); return; } if (scan_timer.function) del_timer_sync(&scan_timer); if (keypad.enabled) { misc_deregister(&keypad_dev); keypad_initialized = 0; } if (lcd.enabled) { charlcd_unregister(lcd.charlcd); lcd.initialized = false; kfree(lcd.charlcd->drvdata); kfree(lcd.charlcd); lcd.charlcd = NULL; } /* TODO: free all input signals */ parport_release(pprt); parport_unregister_device(pprt); pprt = NULL; } static struct parport_driver panel_driver = { .name = "panel", .match_port = panel_attach, .detach = panel_detach, .devmodel = true, }; /* init function */ static int __init panel_init_module(void) { int selected_keypad_type = NOT_SET, err; /* take care of an eventual profile */ switch (profile) { case PANEL_PROFILE_CUSTOM: Loading Loading @@ -1710,29 +1613,102 @@ static int __init panel_init_module(void) if (!lcd.enabled && !keypad.enabled) { /* no device enabled, let's exit */ pr_err("panel driver disabled.\n"); return -ENODEV; return; } err = parport_register_driver(&panel_driver); if (err) { pr_err("could not register with parport. Aborting.\n"); return err; if (port->number != parport) return; if (pprt) { pr_err("%s: port->number=%d parport=%d, already registered!\n", __func__, port->number, parport); return; } if (pprt) pr_info("panel driver registered on parport%d (io=0x%lx).\n", parport, pprt->port->base); else pr_info("panel driver not yet registered\n"); return 0; memset(&panel_cb, 0, sizeof(panel_cb)); panel_cb.private = &pprt; /* panel_cb.flags = 0 should be PARPORT_DEV_EXCL? */ pprt = parport_register_dev_model(port, "panel", &panel_cb, 0); if (!pprt) { pr_err("%s: port->number=%d parport=%d, parport_register_device() failed\n", __func__, port->number, parport); return; } if (parport_claim(pprt)) { pr_err("could not claim access to parport%d. Aborting.\n", parport); goto err_unreg_device; } /* must init LCD first, just in case an IRQ from the keypad is * generated at keypad init */ if (lcd.enabled) { lcd_init(); if (!lcd.charlcd || charlcd_register(lcd.charlcd)) goto err_unreg_device; } if (keypad.enabled) { keypad_init(); if (misc_register(&keypad_dev)) goto err_lcd_unreg; } return; err_lcd_unreg: if (scan_timer.function) del_timer_sync(&scan_timer); if (lcd.enabled) charlcd_unregister(lcd.charlcd); err_unreg_device: kfree(lcd.charlcd); lcd.charlcd = NULL; parport_unregister_device(pprt); pprt = NULL; } static void __exit panel_cleanup_module(void) static void panel_detach(struct parport *port) { parport_unregister_driver(&panel_driver); if (port->number != parport) return; if (!pprt) { pr_err("%s: port->number=%d parport=%d, nothing to unregister.\n", __func__, port->number, parport); return; } if (scan_timer.function) del_timer_sync(&scan_timer); if (keypad.enabled) { misc_deregister(&keypad_dev); keypad_initialized = 0; } if (lcd.enabled) { charlcd_unregister(lcd.charlcd); lcd.initialized = false; kfree(lcd.charlcd->drvdata); kfree(lcd.charlcd); lcd.charlcd = NULL; } module_init(panel_init_module); module_exit(panel_cleanup_module); /* TODO: free all input signals */ parport_release(pprt); parport_unregister_device(pprt); pprt = NULL; } static struct parport_driver panel_driver = { .name = "panel", .match_port = panel_attach, .detach = panel_detach, .devmodel = true, }; module_parport_driver(panel_driver); MODULE_AUTHOR("Willy Tarreau"); MODULE_LICENSE("GPL"); Loading
drivers/auxdisplay/panel.c +89 −113 Original line number Diff line number Diff line Loading @@ -1519,106 +1519,9 @@ static void keypad_init(void) static void panel_attach(struct parport *port) { int selected_keypad_type = NOT_SET; struct pardev_cb panel_cb; if (port->number != parport) return; if (pprt) { pr_err("%s: port->number=%d parport=%d, already registered!\n", __func__, port->number, parport); return; } memset(&panel_cb, 0, sizeof(panel_cb)); panel_cb.private = &pprt; /* panel_cb.flags = 0 should be PARPORT_DEV_EXCL? */ pprt = parport_register_dev_model(port, "panel", &panel_cb, 0); if (!pprt) { pr_err("%s: port->number=%d parport=%d, parport_register_device() failed\n", __func__, port->number, parport); return; } if (parport_claim(pprt)) { pr_err("could not claim access to parport%d. Aborting.\n", parport); goto err_unreg_device; } /* must init LCD first, just in case an IRQ from the keypad is * generated at keypad init */ if (lcd.enabled) { lcd_init(); if (!lcd.charlcd || charlcd_register(lcd.charlcd)) goto err_unreg_device; } if (keypad.enabled) { keypad_init(); if (misc_register(&keypad_dev)) goto err_lcd_unreg; } return; err_lcd_unreg: if (scan_timer.function) del_timer_sync(&scan_timer); if (lcd.enabled) charlcd_unregister(lcd.charlcd); err_unreg_device: kfree(lcd.charlcd); lcd.charlcd = NULL; parport_unregister_device(pprt); pprt = NULL; } static void panel_detach(struct parport *port) { if (port->number != parport) return; if (!pprt) { pr_err("%s: port->number=%d parport=%d, nothing to unregister.\n", __func__, port->number, parport); return; } if (scan_timer.function) del_timer_sync(&scan_timer); if (keypad.enabled) { misc_deregister(&keypad_dev); keypad_initialized = 0; } if (lcd.enabled) { charlcd_unregister(lcd.charlcd); lcd.initialized = false; kfree(lcd.charlcd->drvdata); kfree(lcd.charlcd); lcd.charlcd = NULL; } /* TODO: free all input signals */ parport_release(pprt); parport_unregister_device(pprt); pprt = NULL; } static struct parport_driver panel_driver = { .name = "panel", .match_port = panel_attach, .detach = panel_detach, .devmodel = true, }; /* init function */ static int __init panel_init_module(void) { int selected_keypad_type = NOT_SET, err; /* take care of an eventual profile */ switch (profile) { case PANEL_PROFILE_CUSTOM: Loading Loading @@ -1710,29 +1613,102 @@ static int __init panel_init_module(void) if (!lcd.enabled && !keypad.enabled) { /* no device enabled, let's exit */ pr_err("panel driver disabled.\n"); return -ENODEV; return; } err = parport_register_driver(&panel_driver); if (err) { pr_err("could not register with parport. Aborting.\n"); return err; if (port->number != parport) return; if (pprt) { pr_err("%s: port->number=%d parport=%d, already registered!\n", __func__, port->number, parport); return; } if (pprt) pr_info("panel driver registered on parport%d (io=0x%lx).\n", parport, pprt->port->base); else pr_info("panel driver not yet registered\n"); return 0; memset(&panel_cb, 0, sizeof(panel_cb)); panel_cb.private = &pprt; /* panel_cb.flags = 0 should be PARPORT_DEV_EXCL? */ pprt = parport_register_dev_model(port, "panel", &panel_cb, 0); if (!pprt) { pr_err("%s: port->number=%d parport=%d, parport_register_device() failed\n", __func__, port->number, parport); return; } if (parport_claim(pprt)) { pr_err("could not claim access to parport%d. Aborting.\n", parport); goto err_unreg_device; } /* must init LCD first, just in case an IRQ from the keypad is * generated at keypad init */ if (lcd.enabled) { lcd_init(); if (!lcd.charlcd || charlcd_register(lcd.charlcd)) goto err_unreg_device; } if (keypad.enabled) { keypad_init(); if (misc_register(&keypad_dev)) goto err_lcd_unreg; } return; err_lcd_unreg: if (scan_timer.function) del_timer_sync(&scan_timer); if (lcd.enabled) charlcd_unregister(lcd.charlcd); err_unreg_device: kfree(lcd.charlcd); lcd.charlcd = NULL; parport_unregister_device(pprt); pprt = NULL; } static void __exit panel_cleanup_module(void) static void panel_detach(struct parport *port) { parport_unregister_driver(&panel_driver); if (port->number != parport) return; if (!pprt) { pr_err("%s: port->number=%d parport=%d, nothing to unregister.\n", __func__, port->number, parport); return; } if (scan_timer.function) del_timer_sync(&scan_timer); if (keypad.enabled) { misc_deregister(&keypad_dev); keypad_initialized = 0; } if (lcd.enabled) { charlcd_unregister(lcd.charlcd); lcd.initialized = false; kfree(lcd.charlcd->drvdata); kfree(lcd.charlcd); lcd.charlcd = NULL; } module_init(panel_init_module); module_exit(panel_cleanup_module); /* TODO: free all input signals */ parport_release(pprt); parport_unregister_device(pprt); pprt = NULL; } static struct parport_driver panel_driver = { .name = "panel", .match_port = panel_attach, .detach = panel_detach, .devmodel = true, }; module_parport_driver(panel_driver); MODULE_AUTHOR("Willy Tarreau"); MODULE_LICENSE("GPL");