Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1da2e3d6 authored by Stas Sergeev's avatar Stas Sergeev Committed by Linus Torvalds
Browse files

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: default avatarStas 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: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 643b52b9
Loading
Loading
Loading
Loading
+34 −0
Original line number Original line Diff line number Diff line
@@ -4,6 +4,8 @@
#include <linux/acpi.h>
#include <linux/acpi.h>
#include <linux/bcd.h>
#include <linux/bcd.h>
#include <linux/mc146818rtc.h>
#include <linux/mc146818rtc.h>
#include <linux/platform_device.h>
#include <linux/pnp.h>


#include <asm/time.h>
#include <asm/time.h>
#include <asm/vsyscall.h>
#include <asm/vsyscall.h>
@@ -197,3 +199,35 @@ unsigned long long native_read_tsc(void)
}
}
EXPORT_SYMBOL(native_read_tsc);
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);
+16 −15
Original line number Original line Diff line number Diff line
@@ -905,19 +905,7 @@ static struct pnp_driver cmos_pnp_driver = {
	.resume		= cmos_pnp_resume,
	.resume		= cmos_pnp_resume,
};
};


static int __init cmos_init(void)
#endif	/* CONFIG_PNP */
{
	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 */


/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/


@@ -958,20 +946,33 @@ static struct platform_driver cmos_platform_driver = {


static int __init cmos_init(void)
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,
	return platform_driver_probe(&cmos_platform_driver,
			cmos_platform_probe);
			cmos_platform_probe);
#endif /* CONFIG_PNP */
}
}
module_init(cmos_init);
module_init(cmos_init);


static void __exit cmos_exit(void)
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);
		platform_driver_unregister(&cmos_platform_driver);
#else
	platform_driver_unregister(&cmos_platform_driver);
#endif /* CONFIG_PNP */
}
}
module_exit(cmos_exit);
module_exit(cmos_exit);




#endif	/* !PNP */

MODULE_AUTHOR("David Brownell");
MODULE_AUTHOR("David Brownell");
MODULE_DESCRIPTION("Driver for PC-style 'CMOS' RTCs");
MODULE_DESCRIPTION("Driver for PC-style 'CMOS' RTCs");
MODULE_LICENSE("GPL");
MODULE_LICENSE("GPL");