xref: /linux/arch/powerpc/sysdev/rtc_cmos_setup.c (revision a1ff5a7d78a036d6c2178ee5acd6ba4946243800)
193ab4718SWade Farnsworth /*
293ab4718SWade Farnsworth  * Setup code for PC-style Real-Time Clock.
393ab4718SWade Farnsworth  *
493ab4718SWade Farnsworth  * Author: Wade Farnsworth <wfarnsworth@mvista.com>
593ab4718SWade Farnsworth  *
693ab4718SWade Farnsworth  * 2007 (c) MontaVista Software, Inc. This file is licensed under
793ab4718SWade Farnsworth  * the terms of the GNU General Public License version 2. This program
893ab4718SWade Farnsworth  * is licensed "as is" without any warranty of any kind, whether express
993ab4718SWade Farnsworth  * or implied.
1093ab4718SWade Farnsworth  */
1193ab4718SWade Farnsworth 
1293ab4718SWade Farnsworth #include <linux/platform_device.h>
1393ab4718SWade Farnsworth #include <linux/err.h>
1493ab4718SWade Farnsworth #include <linux/init.h>
157dfe293cSPaul Gortmaker #include <linux/module.h>
1693ab4718SWade Farnsworth #include <linux/mc146818rtc.h>
17e6f6390aSChristophe Leroy #include <linux/of_address.h>
1893ab4718SWade Farnsworth 
1993ab4718SWade Farnsworth 
add_rtc(void)2093ab4718SWade Farnsworth static int  __init add_rtc(void)
2193ab4718SWade Farnsworth {
2293ab4718SWade Farnsworth 	struct device_node *np;
2393ab4718SWade Farnsworth 	struct platform_device *pd;
24ada3ea6fSKumar Gala 	struct resource res[2];
25e517881eSAnton Vorontsov 	unsigned int num_res = 1;
2693ab4718SWade Farnsworth 	int ret;
2793ab4718SWade Farnsworth 
28ada3ea6fSKumar Gala 	memset(&res, 0, sizeof(res));
29ada3ea6fSKumar Gala 
3093ab4718SWade Farnsworth 	np = of_find_compatible_node(NULL, NULL, "pnpPNP,b00");
3193ab4718SWade Farnsworth 	if (!np)
3293ab4718SWade Farnsworth 		return -ENODEV;
3393ab4718SWade Farnsworth 
34ada3ea6fSKumar Gala 	ret = of_address_to_resource(np, 0, &res[0]);
3593ab4718SWade Farnsworth 	of_node_put(np);
3693ab4718SWade Farnsworth 	if (ret)
3793ab4718SWade Farnsworth 		return ret;
3893ab4718SWade Farnsworth 
3993ab4718SWade Farnsworth 	/*
4093ab4718SWade Farnsworth 	 * RTC_PORT(x) is hardcoded in asm/mc146818rtc.h.  Verify that the
4193ab4718SWade Farnsworth 	 * address provided by the device node matches.
4293ab4718SWade Farnsworth 	 */
43ada3ea6fSKumar Gala 	if (res[0].start != RTC_PORT(0))
4493ab4718SWade Farnsworth 		return -EINVAL;
4593ab4718SWade Farnsworth 
46e517881eSAnton Vorontsov 	np = of_find_compatible_node(NULL, NULL, "chrp,iic");
47e517881eSAnton Vorontsov 	if (!np)
48e517881eSAnton Vorontsov 		np = of_find_compatible_node(NULL, NULL, "pnpPNP,000");
49e517881eSAnton Vorontsov 	if (np) {
50e517881eSAnton Vorontsov 		of_node_put(np);
51e517881eSAnton Vorontsov 		/*
52e517881eSAnton Vorontsov 		 * Use a fixed interrupt value of 8 since on PPC if we are
53e517881eSAnton Vorontsov 		 * using this its off an i8259 which we ensure has interrupt
54e517881eSAnton Vorontsov 		 * numbers 0..15.
55e517881eSAnton Vorontsov 		 */
56ada3ea6fSKumar Gala 		res[1].start = 8;
57ada3ea6fSKumar Gala 		res[1].end = 8;
58ada3ea6fSKumar Gala 		res[1].flags = IORESOURCE_IRQ;
59e517881eSAnton Vorontsov 		num_res++;
60e517881eSAnton Vorontsov 	}
61ada3ea6fSKumar Gala 
6293ab4718SWade Farnsworth 	pd = platform_device_register_simple("rtc_cmos", -1,
63e517881eSAnton Vorontsov 					     &res[0], num_res);
64ada3ea6fSKumar Gala 
658c6ffba0SRusty Russell 	return PTR_ERR_OR_ZERO(pd);
6693ab4718SWade Farnsworth }
6793ab4718SWade Farnsworth fs_initcall(add_rtc);
683fbe9d41SAdrian Bunk 
69*9c5f6473SJeff Johnson MODULE_DESCRIPTION("PPC RTC CMOS driver");
703fbe9d41SAdrian Bunk MODULE_LICENSE("GPL");
71