1*22258fa4SDavid Gibson /* 2*22258fa4SDavid Gibson * Instantiate mmio-mapped RTC chips based on device tree information 3*22258fa4SDavid Gibson * 4*22258fa4SDavid Gibson * Copyright 2007 David Gibson <[email protected]>, IBM Corporation. 5*22258fa4SDavid Gibson * 6*22258fa4SDavid Gibson * This program is free software; you can redistribute it and/or modify it 7*22258fa4SDavid Gibson * under the terms of the GNU General Public License as published by the 8*22258fa4SDavid Gibson * Free Software Foundation; either version 2 of the License, or (at your 9*22258fa4SDavid Gibson * option) any later version. 10*22258fa4SDavid Gibson */ 11*22258fa4SDavid Gibson #include <linux/kernel.h> 12*22258fa4SDavid Gibson #include <linux/of.h> 13*22258fa4SDavid Gibson #include <linux/init.h> 14*22258fa4SDavid Gibson #include <linux/of_platform.h> 15*22258fa4SDavid Gibson 16*22258fa4SDavid Gibson static __initdata struct { 17*22258fa4SDavid Gibson const char *compatible; 18*22258fa4SDavid Gibson char *plat_name; 19*22258fa4SDavid Gibson } of_rtc_table[] = { 20*22258fa4SDavid Gibson { "ds1743-nvram", "rtc-ds1742" }, 21*22258fa4SDavid Gibson }; 22*22258fa4SDavid Gibson 23*22258fa4SDavid Gibson void __init of_instantiate_rtc(void) 24*22258fa4SDavid Gibson { 25*22258fa4SDavid Gibson struct device_node *node; 26*22258fa4SDavid Gibson int err; 27*22258fa4SDavid Gibson int i; 28*22258fa4SDavid Gibson 29*22258fa4SDavid Gibson for (i = 0; i < ARRAY_SIZE(of_rtc_table); i++) { 30*22258fa4SDavid Gibson char *plat_name = of_rtc_table[i].plat_name; 31*22258fa4SDavid Gibson 32*22258fa4SDavid Gibson for_each_compatible_node(node, NULL, 33*22258fa4SDavid Gibson of_rtc_table[i].compatible) { 34*22258fa4SDavid Gibson struct resource *res; 35*22258fa4SDavid Gibson 36*22258fa4SDavid Gibson res = kmalloc(sizeof(*res), GFP_KERNEL); 37*22258fa4SDavid Gibson if (!res) { 38*22258fa4SDavid Gibson printk(KERN_ERR "OF RTC: Out of memory " 39*22258fa4SDavid Gibson "allocating resource structure for %s\n", 40*22258fa4SDavid Gibson node->full_name); 41*22258fa4SDavid Gibson continue; 42*22258fa4SDavid Gibson } 43*22258fa4SDavid Gibson 44*22258fa4SDavid Gibson err = of_address_to_resource(node, 0, res); 45*22258fa4SDavid Gibson if (err) { 46*22258fa4SDavid Gibson printk(KERN_ERR "OF RTC: Error " 47*22258fa4SDavid Gibson "translating resources for %s\n", 48*22258fa4SDavid Gibson node->full_name); 49*22258fa4SDavid Gibson continue; 50*22258fa4SDavid Gibson } 51*22258fa4SDavid Gibson 52*22258fa4SDavid Gibson printk(KERN_INFO "OF_RTC: %s is a %s @ 0x%llx-0x%llx\n", 53*22258fa4SDavid Gibson node->full_name, plat_name, 54*22258fa4SDavid Gibson (unsigned long long)res->start, 55*22258fa4SDavid Gibson (unsigned long long)res->end); 56*22258fa4SDavid Gibson platform_device_register_simple(plat_name, -1, res, 1); 57*22258fa4SDavid Gibson } 58*22258fa4SDavid Gibson } 59*22258fa4SDavid Gibson } 60