Commit 72f22b1e authored by Bjorn Helgaas's avatar Bjorn Helgaas Committed by Linus Torvalds

rtc-cmos: look for PNP RTC first, then for platform RTC

We shouldn't rely on "pnp_platform_devices" to tell us whether there
is a PNP RTC device.

I introduced "pnp_platform_devices", but I think it was a mistake.
All it tells us is whether we found any PNPBIOS or PNPACPI devices.
Many machines have some PNP devices, but do not describe the RTC
via PNP.  On those machines, we need to do the platform driver probe
to find the RTC.

We should just register the PNP driver and see whether it claims anything.
If we don't find a PNP RTC, fall back to the platform driver probe.

This (in conjunction with the arch/x86/kernel/rtc.c patch to add
a platform RTC device when PNP doesn't have one) should resolve
these issues:

    http://bugzilla.kernel.org/show_bug.cgi?id=11580
    https://bugzilla.redhat.com/show_bug.cgi?id=451188Signed-off-by: default avatarBjorn Helgaas <bjorn.helgaas@hp.com>
Acked-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
Acked-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
Reported-by: default avatarRik Theys <rik.theys@esat.kuleuven.be>
Reported-by: shr_msn@yahoo.com.tw
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 758a7f7b
...@@ -1120,29 +1120,32 @@ static struct platform_driver cmos_platform_driver = { ...@@ -1120,29 +1120,32 @@ static struct platform_driver cmos_platform_driver = {
static int __init cmos_init(void) static int __init cmos_init(void)
{ {
int retval = 0;
#ifdef CONFIG_PNP #ifdef CONFIG_PNP
if (pnp_platform_devices) pnp_register_driver(&cmos_pnp_driver);
return pnp_register_driver(&cmos_pnp_driver); #endif
else
return platform_driver_probe(&cmos_platform_driver, if (!cmos_rtc.dev)
cmos_platform_probe); retval = platform_driver_probe(&cmos_platform_driver,
#else cmos_platform_probe);
return platform_driver_probe(&cmos_platform_driver,
cmos_platform_probe); if (retval == 0)
#endif /* CONFIG_PNP */ return 0;
#ifdef CONFIG_PNP
pnp_unregister_driver(&cmos_pnp_driver);
#endif
return retval;
} }
module_init(cmos_init); module_init(cmos_init);
static void __exit cmos_exit(void) static void __exit cmos_exit(void)
{ {
#ifdef CONFIG_PNP #ifdef CONFIG_PNP
if (pnp_platform_devices) pnp_unregister_driver(&cmos_pnp_driver);
pnp_unregister_driver(&cmos_pnp_driver); #endif
else
platform_driver_unregister(&cmos_platform_driver);
#else
platform_driver_unregister(&cmos_platform_driver); platform_driver_unregister(&cmos_platform_driver);
#endif /* CONFIG_PNP */
} }
module_exit(cmos_exit); module_exit(cmos_exit);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment