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/module.h> |
16 | #include <linux/mc146818rtc.h> |
17 | #include <linux/of_address.h> |
18 | |
19 | |
20 | static int __init add_rtc(void) |
21 | { |
22 | struct device_node *np; |
23 | struct platform_device *pd; |
24 | struct resource res[2]; |
25 | unsigned int num_res = 1; |
26 | int ret; |
27 | |
28 | memset(&res, 0, sizeof(res)); |
29 | |
30 | np = of_find_compatible_node(NULL, NULL, compat: "pnpPNP,b00" ); |
31 | if (!np) |
32 | return -ENODEV; |
33 | |
34 | ret = of_address_to_resource(dev: np, index: 0, r: &res[0]); |
35 | of_node_put(node: np); |
36 | if (ret) |
37 | return ret; |
38 | |
39 | /* |
40 | * RTC_PORT(x) is hardcoded in asm/mc146818rtc.h. Verify that the |
41 | * address provided by the device node matches. |
42 | */ |
43 | if (res[0].start != RTC_PORT(0)) |
44 | return -EINVAL; |
45 | |
46 | np = of_find_compatible_node(NULL, NULL, compat: "chrp,iic" ); |
47 | if (!np) |
48 | np = of_find_compatible_node(NULL, NULL, compat: "pnpPNP,000" ); |
49 | if (np) { |
50 | of_node_put(node: np); |
51 | /* |
52 | * Use a fixed interrupt value of 8 since on PPC if we are |
53 | * using this its off an i8259 which we ensure has interrupt |
54 | * numbers 0..15. |
55 | */ |
56 | res[1].start = 8; |
57 | res[1].end = 8; |
58 | res[1].flags = IORESOURCE_IRQ; |
59 | num_res++; |
60 | } |
61 | |
62 | pd = platform_device_register_simple(name: "rtc_cmos" , id: -1, |
63 | res: &res[0], num: num_res); |
64 | |
65 | return PTR_ERR_OR_ZERO(ptr: pd); |
66 | } |
67 | fs_initcall(add_rtc); |
68 | |
69 | MODULE_LICENSE("GPL" ); |
70 | |