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, "pnpPNP,b00"); 31 if (!np) 32 return -ENODEV; 33 34 ret = of_address_to_resource(np, 0, &res[0]); 35 of_node_put(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, "chrp,iic"); 47 if (!np) 48 np = of_find_compatible_node(NULL, NULL, "pnpPNP,000"); 49 if (np) { 50 of_node_put(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("rtc_cmos", -1, 63 &res[0], num_res); 64 65 return PTR_ERR_OR_ZERO(pd); 66 } 67 fs_initcall(add_rtc); 68 69 MODULE_LICENSE("GPL"); 70