provide rtc_cmos platform device
Recently (around 2.6.25) I've noticed that RTC no longer works for me. It turned out this is because I use pnpacpi=off kernel option to work around the parport_pc bugs. I always did so, but RTC used to work fine in the past, and now it have regressed. The patch fixes the problem by creating the platform device for the RTC when PNP is disabled. This may also help running the PNP-enabled kernel on an older PCs. Signed-off-by: Stas Sergeev <stsp@aknet.ru> Cc: David Brownell <david-b@pacbell.net> Cc: Ingo Molnar <mingo@elte.hu> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Bjorn Helgaas <bjorn.helgaas@hp.com> Cc: Adam Belay <ambx1@neo.rr.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
643b52b9c0
commit
1da2e3d679
|
@ -4,6 +4,8 @@
|
|||
#include <linux/acpi.h>
|
||||
#include <linux/bcd.h>
|
||||
#include <linux/mc146818rtc.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pnp.h>
|
||||
|
||||
#include <asm/time.h>
|
||||
#include <asm/vsyscall.h>
|
||||
|
@ -197,3 +199,35 @@ unsigned long long native_read_tsc(void)
|
|||
}
|
||||
EXPORT_SYMBOL(native_read_tsc);
|
||||
|
||||
|
||||
static struct resource rtc_resources[] = {
|
||||
[0] = {
|
||||
.start = RTC_PORT(0),
|
||||
.end = RTC_PORT(1),
|
||||
.flags = IORESOURCE_IO,
|
||||
},
|
||||
[1] = {
|
||||
.start = RTC_IRQ,
|
||||
.end = RTC_IRQ,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
}
|
||||
};
|
||||
|
||||
static struct platform_device rtc_device = {
|
||||
.name = "rtc_cmos",
|
||||
.id = -1,
|
||||
.resource = rtc_resources,
|
||||
.num_resources = ARRAY_SIZE(rtc_resources),
|
||||
};
|
||||
|
||||
static __init int add_rtc_cmos(void)
|
||||
{
|
||||
#ifdef CONFIG_PNP
|
||||
if (!pnp_platform_devices)
|
||||
platform_device_register(&rtc_device);
|
||||
#else
|
||||
platform_device_register(&rtc_device);
|
||||
#endif /* CONFIG_PNP */
|
||||
return 0;
|
||||
}
|
||||
device_initcall(add_rtc_cmos);
|
||||
|
|
|
@ -905,19 +905,7 @@ static struct pnp_driver cmos_pnp_driver = {
|
|||
.resume = cmos_pnp_resume,
|
||||
};
|
||||
|
||||
static int __init cmos_init(void)
|
||||
{
|
||||
return pnp_register_driver(&cmos_pnp_driver);
|
||||
}
|
||||
module_init(cmos_init);
|
||||
|
||||
static void __exit cmos_exit(void)
|
||||
{
|
||||
pnp_unregister_driver(&cmos_pnp_driver);
|
||||
}
|
||||
module_exit(cmos_exit);
|
||||
|
||||
#else /* no PNP */
|
||||
#endif /* CONFIG_PNP */
|
||||
|
||||
/*----------------------------------------------------------------*/
|
||||
|
||||
|
@ -958,20 +946,33 @@ static struct platform_driver cmos_platform_driver = {
|
|||
|
||||
static int __init cmos_init(void)
|
||||
{
|
||||
#ifdef CONFIG_PNP
|
||||
if (pnp_platform_devices)
|
||||
return pnp_register_driver(&cmos_pnp_driver);
|
||||
else
|
||||
return platform_driver_probe(&cmos_platform_driver,
|
||||
cmos_platform_probe);
|
||||
#else
|
||||
return platform_driver_probe(&cmos_platform_driver,
|
||||
cmos_platform_probe);
|
||||
#endif /* CONFIG_PNP */
|
||||
}
|
||||
module_init(cmos_init);
|
||||
|
||||
static void __exit cmos_exit(void)
|
||||
{
|
||||
#ifdef CONFIG_PNP
|
||||
if (pnp_platform_devices)
|
||||
pnp_unregister_driver(&cmos_pnp_driver);
|
||||
else
|
||||
platform_driver_unregister(&cmos_platform_driver);
|
||||
#else
|
||||
platform_driver_unregister(&cmos_platform_driver);
|
||||
#endif /* CONFIG_PNP */
|
||||
}
|
||||
module_exit(cmos_exit);
|
||||
|
||||
|
||||
#endif /* !PNP */
|
||||
|
||||
MODULE_AUTHOR("David Brownell");
|
||||
MODULE_DESCRIPTION("Driver for PC-style 'CMOS' RTCs");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
Loading…
Reference in New Issue