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