xref: /linux-6.15/arch/powerpc/sysdev/of_rtc.c (revision 81d7cac4)
12874c5fdSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
222258fa4SDavid Gibson /*
322258fa4SDavid Gibson  * Instantiate mmio-mapped RTC chips based on device tree information
422258fa4SDavid Gibson  *
522258fa4SDavid Gibson  * Copyright 2007 David Gibson <[email protected]>, IBM Corporation.
622258fa4SDavid Gibson  */
722258fa4SDavid Gibson #include <linux/kernel.h>
822258fa4SDavid Gibson #include <linux/init.h>
9*81d7cac4SRob Herring #include <linux/of.h>
1026a2056eSRob Herring #include <linux/of_address.h>
11*81d7cac4SRob Herring #include <linux/platform_device.h>
125a0e3ad6STejun Heo #include <linux/slab.h>
1322258fa4SDavid Gibson 
144d5c5badSChristophe Leroy #include <asm/prom.h>
154d5c5badSChristophe Leroy 
1622258fa4SDavid Gibson static __initdata struct {
1722258fa4SDavid Gibson 	const char *compatible;
1822258fa4SDavid Gibson 	char *plat_name;
1922258fa4SDavid Gibson } of_rtc_table[] = {
2022258fa4SDavid Gibson 	{ "ds1743-nvram", "rtc-ds1742" },
2122258fa4SDavid Gibson };
2222258fa4SDavid Gibson 
of_instantiate_rtc(void)2322258fa4SDavid Gibson void __init of_instantiate_rtc(void)
2422258fa4SDavid Gibson {
2522258fa4SDavid Gibson 	struct device_node *node;
2622258fa4SDavid Gibson 	int err;
2722258fa4SDavid Gibson 	int i;
2822258fa4SDavid Gibson 
2922258fa4SDavid Gibson 	for (i = 0; i < ARRAY_SIZE(of_rtc_table); i++) {
3022258fa4SDavid Gibson 		char *plat_name = of_rtc_table[i].plat_name;
3122258fa4SDavid Gibson 
3222258fa4SDavid Gibson 		for_each_compatible_node(node, NULL,
3322258fa4SDavid Gibson 					 of_rtc_table[i].compatible) {
3422258fa4SDavid Gibson 			struct resource *res;
3522258fa4SDavid Gibson 
3622258fa4SDavid Gibson 			res = kmalloc(sizeof(*res), GFP_KERNEL);
3722258fa4SDavid Gibson 			if (!res) {
3822258fa4SDavid Gibson 				printk(KERN_ERR "OF RTC: Out of memory "
39b7c670d6SRob Herring 				       "allocating resource structure for %pOF\n",
40b7c670d6SRob Herring 				       node);
4122258fa4SDavid Gibson 				continue;
4222258fa4SDavid Gibson 			}
4322258fa4SDavid Gibson 
4422258fa4SDavid Gibson 			err = of_address_to_resource(node, 0, res);
4522258fa4SDavid Gibson 			if (err) {
4622258fa4SDavid Gibson 				printk(KERN_ERR "OF RTC: Error "
47b7c670d6SRob Herring 				       "translating resources for %pOF\n",
48b7c670d6SRob Herring 				       node);
4922258fa4SDavid Gibson 				continue;
5022258fa4SDavid Gibson 			}
5122258fa4SDavid Gibson 
52b7c670d6SRob Herring 			printk(KERN_INFO "OF_RTC: %pOF is a %s @ 0x%llx-0x%llx\n",
53b7c670d6SRob Herring 			       node, plat_name,
5422258fa4SDavid Gibson 			       (unsigned long long)res->start,
5522258fa4SDavid Gibson 			       (unsigned long long)res->end);
5622258fa4SDavid Gibson 			platform_device_register_simple(plat_name, -1, res, 1);
5722258fa4SDavid Gibson 		}
5822258fa4SDavid Gibson 	}
5922258fa4SDavid Gibson }
60