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 int ret; 25 26 memset(&res, 0, sizeof(res)); 27 28 np = of_find_compatible_node(NULL, NULL, "pnpPNP,b00"); 29 if (!np) 30 return -ENODEV; 31 32 ret = of_address_to_resource(np, 0, &res[0]); 33 of_node_put(np); 34 if (ret) 35 return ret; 36 37 /* 38 * RTC_PORT(x) is hardcoded in asm/mc146818rtc.h. Verify that the 39 * address provided by the device node matches. 40 */ 41 if (res[0].start != RTC_PORT(0)) 42 return -EINVAL; 43 44 /* Use a fixed interrupt value of 8 since on PPC if we are using this 45 * its off an i8259 which we ensure has interrupt numbers 0..15. */ 46 res[1].start = 8; 47 res[1].end = 8; 48 res[1].flags = IORESOURCE_IRQ; 49 50 pd = platform_device_register_simple("rtc_cmos", -1, 51 &res[0], 2); 52 53 if (IS_ERR(pd)) 54 return PTR_ERR(pd); 55 56 return 0; 57 } 58 fs_initcall(add_rtc); 59 60 MODULE_LICENSE("GPL"); 61