Merge branch 'fix/misc' into for-linus
[linux-2.6] / arch / powerpc / sysdev / rtc_cmos_setup.c
1 /*
2  * Setup code for PC-style Real-Time Clock.
3  *
4  * Author: Wade Farnsworth <wfarnsworth@mvista.com>
5  *
6  * 2007 (c) MontaVista Software, Inc. This file is licensed under
7  * the terms of the GNU General Public License version 2. This program
8  * is licensed "as is" without any warranty of any kind, whether express
9  * or implied.
10  */
11
12 #include <linux/platform_device.h>
13 #include <linux/err.h>
14 #include <linux/init.h>
15 #include <linux/mc146818rtc.h>
16
17 #include <asm/prom.h>
18
19 static int  __init add_rtc(void)
20 {
21         struct device_node *np;
22         struct platform_device *pd;
23         struct resource res[2];
24         unsigned int num_res = 1;
25         int ret;
26
27         memset(&res, 0, sizeof(res));
28
29         np = of_find_compatible_node(NULL, NULL, "pnpPNP,b00");
30         if (!np)
31                 return -ENODEV;
32
33         ret = of_address_to_resource(np, 0, &res[0]);
34         of_node_put(np);
35         if (ret)
36                 return ret;
37
38         /*
39          * RTC_PORT(x) is hardcoded in asm/mc146818rtc.h.  Verify that the
40          * address provided by the device node matches.
41          */
42         if (res[0].start != RTC_PORT(0))
43                 return -EINVAL;
44
45         np = of_find_compatible_node(NULL, NULL, "chrp,iic");
46         if (!np)
47                 np = of_find_compatible_node(NULL, NULL, "pnpPNP,000");
48         if (np) {
49                 of_node_put(np);
50                 /*
51                  * Use a fixed interrupt value of 8 since on PPC if we are
52                  * using this its off an i8259 which we ensure has interrupt
53                  * numbers 0..15.
54                  */
55                 res[1].start = 8;
56                 res[1].end = 8;
57                 res[1].flags = IORESOURCE_IRQ;
58                 num_res++;
59         }
60
61         pd = platform_device_register_simple("rtc_cmos", -1,
62                                              &res[0], num_res);
63
64         if (IS_ERR(pd))
65                 return PTR_ERR(pd);
66
67         return 0;
68 }
69 fs_initcall(add_rtc);
70
71 MODULE_LICENSE("GPL");