From: Dmitry Torokhov Input: make i8042 a platform device instead of system device so its serio ports have proper parent Signed-off-by: Dmitry Torokhov Signed-off-by: Andrew Morton --- 25-akpm/drivers/input/serio/i8042.c | 60 ++++++++++++++++++++---------------- 1 files changed, 34 insertions(+), 26 deletions(-) diff -puN drivers/input/serio/i8042.c~input-convert-i8042-into-a-platform-device drivers/input/serio/i8042.c --- 25/drivers/input/serio/i8042.c~input-convert-i8042-into-a-platform-device 2004-06-27 22:51:05.444367392 -0700 +++ 25-akpm/drivers/input/serio/i8042.c 2004-06-27 22:51:05.449366632 -0700 @@ -21,6 +21,7 @@ #include #include #include +#include #include @@ -101,9 +102,9 @@ static unsigned char i8042_initial_ctr; static unsigned char i8042_ctr; static unsigned char i8042_mux_open; static unsigned char i8042_mux_present; -static unsigned char i8042_sysdev_initialized; static struct pm_dev *i8042_pm_dev; static struct timer_list i8042_timer; +static struct platform_device *i8042_platform_device; /* * Shared IRQ's require a device pointer, but this driver doesn't support @@ -855,7 +856,7 @@ static int i8042_notify_sys(struct notif return NOTIFY_DONE; } -static struct notifier_block i8042_notifier= +static struct notifier_block i8042_notifier = { i8042_notify_sys, NULL, @@ -865,25 +866,27 @@ static struct notifier_block i8042_notif /* * Suspend/resume handlers for the new PM scheme (driver model) */ -static int i8042_suspend(struct sys_device *dev, u32 state) +static int i8042_suspend(struct device *dev, u32 state, u32 level) { - return i8042_controller_suspend(); + return level == SUSPEND_DISABLE ? i8042_controller_suspend() : 0; } -static int i8042_resume(struct sys_device *dev) +static int i8042_resume(struct device *dev, u32 level) { - return i8042_controller_resume(); + return level == RESUME_ENABLE ? i8042_controller_resume() : 0; } -static struct sysdev_class kbc_sysclass = { - set_kset_name("i8042"), - .suspend = i8042_suspend, - .resume = i8042_resume, -}; +static void i8042_shutdown(struct device *dev) +{ + i8042_controller_cleanup(); +} -static struct sys_device device_i8042 = { - .id = 0, - .cls = &kbc_sysclass, +static struct device_driver i8042_driver = { + .name = "i8042", + .bus = &platform_bus_type, + .suspend = i8042_suspend, + .resume = i8042_resume, + .shutdown = i8042_shutdown, }; /* @@ -914,6 +917,7 @@ static struct serio * __init i8042_alloc serio->open = i8042_open, serio->close = i8042_close, serio->port_data = &i8042_kbd_values, + serio->dev.parent = &i8042_platform_device->dev; strlcpy(serio->name, "i8042 Kbd Port", sizeof(serio->name)); strlcpy(serio->phys, I8042_KBD_PHYS_DESC, sizeof(serio->phys)); } @@ -933,6 +937,7 @@ static struct serio * __init i8042_alloc serio->open = i8042_open; serio->close = i8042_close; serio->port_data = &i8042_aux_values, + serio->dev.parent = &i8042_platform_device->dev; strlcpy(serio->name, "i8042 Aux Port", sizeof(serio->name)); strlcpy(serio->phys, I8042_AUX_PHYS_DESC, sizeof(serio->phys)); } @@ -957,6 +962,7 @@ static struct serio * __init i8042_alloc serio->open = i8042_open; serio->close = i8042_close; serio->port_data = values; + serio->dev.parent = &i8042_platform_device->dev; snprintf(serio->name, sizeof(serio->name), "i8042 Aux-%d Port", index); snprintf(serio->phys, sizeof(serio->phys), I8042_MUX_PHYS_DESC, index + 1); } @@ -967,6 +973,7 @@ static struct serio * __init i8042_alloc int __init i8042_init(void) { int i; + int err; dbg_init(); @@ -989,6 +996,16 @@ int __init i8042_init(void) } #endif + err = driver_register(&i8042_driver); + if (err) + return err; + + i8042_platform_device = platform_device_register_simple("i8042", -1, NULL, 0); + if (IS_ERR(i8042_platform_device)) { + driver_unregister(&i8042_driver); + return PTR_ERR(i8042_platform_device); + } + if (!i8042_noaux && !i8042_check_aux(&i8042_aux_values)) { if (!i8042_nomux && !i8042_check_mux(&i8042_aux_values)) for (i = 0; i < I8042_NUM_MUX_PORTS; i++) { @@ -1009,13 +1026,6 @@ int __init i8042_init(void) mod_timer(&i8042_timer, jiffies + I8042_POLL_PERIOD); - if (sysdev_class_register(&kbc_sysclass) == 0) { - if (sysdev_register(&device_i8042) == 0) - i8042_sysdev_initialized = 1; - else - sysdev_class_unregister(&kbc_sysclass); - } - i8042_pm_dev = pm_register(PM_SYS_DEV, PM_SYS_UNKNOWN, i8042_pm_callback); register_reboot_notifier(&i8042_notifier); @@ -1032,11 +1042,6 @@ void __exit i8042_exit(void) if (i8042_pm_dev) pm_unregister(i8042_pm_dev); - if (i8042_sysdev_initialized) { - sysdev_unregister(&device_i8042); - sysdev_class_unregister(&kbc_sysclass); - } - i8042_controller_cleanup(); if (i8042_kbd_values.exists) @@ -1051,6 +1056,9 @@ void __exit i8042_exit(void) del_timer_sync(&i8042_timer); + platform_device_unregister(i8042_platform_device); + driver_unregister(&i8042_driver); + i8042_platform_exit(); } _