| 
									
										
										
										
											2007-07-11 02:55:46 +10:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Setup code for PC-style Real-Time Clock. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Author: Wade Farnsworth <wfarnsworth@mvista.com> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 2007 (c) MontaVista Software, Inc. This file is licensed under | 
					
						
							|  |  |  |  * the terms of the GNU General Public License version 2. This program | 
					
						
							|  |  |  |  * is licensed "as is" without any warranty of any kind, whether express | 
					
						
							|  |  |  |  * or implied. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <linux/platform_device.h>
 | 
					
						
							|  |  |  | #include <linux/err.h>
 | 
					
						
							|  |  |  | #include <linux/init.h>
 | 
					
						
							|  |  |  | #include <linux/mc146818rtc.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <asm/prom.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int  __init add_rtc(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	struct device_node *np; | 
					
						
							|  |  |  | 	struct platform_device *pd; | 
					
						
							| 
									
										
										
										
											2007-08-16 23:44:00 -05:00
										 |  |  | 	struct resource res[2]; | 
					
						
							| 
									
										
										
										
											2008-06-12 03:04:31 +04:00
										 |  |  | 	unsigned int num_res = 1; | 
					
						
							| 
									
										
										
										
											2007-07-11 02:55:46 +10:00
										 |  |  | 	int ret; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-16 23:44:00 -05:00
										 |  |  | 	memset(&res, 0, sizeof(res)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-07-11 02:55:46 +10:00
										 |  |  | 	np = of_find_compatible_node(NULL, NULL, "pnpPNP,b00"); | 
					
						
							|  |  |  | 	if (!np) | 
					
						
							|  |  |  | 		return -ENODEV; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-08-16 23:44:00 -05:00
										 |  |  | 	ret = of_address_to_resource(np, 0, &res[0]); | 
					
						
							| 
									
										
										
										
											2007-07-11 02:55:46 +10:00
										 |  |  | 	of_node_put(np); | 
					
						
							|  |  |  | 	if (ret) | 
					
						
							|  |  |  | 		return ret; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/*
 | 
					
						
							|  |  |  | 	 * RTC_PORT(x) is hardcoded in asm/mc146818rtc.h.  Verify that the | 
					
						
							|  |  |  | 	 * address provided by the device node matches. | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2007-08-16 23:44:00 -05:00
										 |  |  | 	if (res[0].start != RTC_PORT(0)) | 
					
						
							| 
									
										
										
										
											2007-07-11 02:55:46 +10:00
										 |  |  | 		return -EINVAL; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-12 03:04:31 +04:00
										 |  |  | 	np = of_find_compatible_node(NULL, NULL, "chrp,iic"); | 
					
						
							|  |  |  | 	if (!np) | 
					
						
							|  |  |  | 		np = of_find_compatible_node(NULL, NULL, "pnpPNP,000"); | 
					
						
							|  |  |  | 	if (np) { | 
					
						
							|  |  |  | 		of_node_put(np); | 
					
						
							|  |  |  | 		/*
 | 
					
						
							|  |  |  | 		 * Use a fixed interrupt value of 8 since on PPC if we are | 
					
						
							|  |  |  | 		 * using this its off an i8259 which we ensure has interrupt | 
					
						
							|  |  |  | 		 * numbers 0..15. | 
					
						
							|  |  |  | 		 */ | 
					
						
							|  |  |  | 		res[1].start = 8; | 
					
						
							|  |  |  | 		res[1].end = 8; | 
					
						
							|  |  |  | 		res[1].flags = IORESOURCE_IRQ; | 
					
						
							|  |  |  | 		num_res++; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2007-08-16 23:44:00 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-07-11 02:55:46 +10:00
										 |  |  | 	pd = platform_device_register_simple("rtc_cmos", -1, | 
					
						
							| 
									
										
										
										
											2008-06-12 03:04:31 +04:00
										 |  |  | 					     &res[0], num_res); | 
					
						
							| 
									
										
										
										
											2007-08-16 23:44:00 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-07-11 02:55:46 +10:00
										 |  |  | 	if (IS_ERR(pd)) | 
					
						
							|  |  |  | 		return PTR_ERR(pd); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | fs_initcall(add_rtc); | 
					
						
							| 
									
										
										
										
											2008-04-15 00:19:42 +10:00
										 |  |  | 
 | 
					
						
							|  |  |  | MODULE_LICENSE("GPL"); |