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"); 72