Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid
[sfrench/cifs-2.6.git] / arch / powerpc / sysdev / of_rtc.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Instantiate mmio-mapped RTC chips based on device tree information
4  *
5  * Copyright 2007 David Gibson <dwg@au1.ibm.com>, IBM Corporation.
6  */
7 #include <linux/kernel.h>
8 #include <linux/of.h>
9 #include <linux/init.h>
10 #include <linux/of_address.h>
11 #include <linux/of_platform.h>
12 #include <linux/slab.h>
13
14 static __initdata struct {
15         const char *compatible;
16         char *plat_name;
17 } of_rtc_table[] = {
18         { "ds1743-nvram", "rtc-ds1742" },
19 };
20
21 void __init of_instantiate_rtc(void)
22 {
23         struct device_node *node;
24         int err;
25         int i;
26
27         for (i = 0; i < ARRAY_SIZE(of_rtc_table); i++) {
28                 char *plat_name = of_rtc_table[i].plat_name;
29
30                 for_each_compatible_node(node, NULL,
31                                          of_rtc_table[i].compatible) {
32                         struct resource *res;
33
34                         res = kmalloc(sizeof(*res), GFP_KERNEL);
35                         if (!res) {
36                                 printk(KERN_ERR "OF RTC: Out of memory "
37                                        "allocating resource structure for %pOF\n",
38                                        node);
39                                 continue;
40                         }
41
42                         err = of_address_to_resource(node, 0, res);
43                         if (err) {
44                                 printk(KERN_ERR "OF RTC: Error "
45                                        "translating resources for %pOF\n",
46                                        node);
47                                 continue;
48                         }
49
50                         printk(KERN_INFO "OF_RTC: %pOF is a %s @ 0x%llx-0x%llx\n",
51                                node, plat_name,
52                                (unsigned long long)res->start,
53                                (unsigned long long)res->end);
54                         platform_device_register_simple(plat_name, -1, res, 1);
55                 }
56         }
57 }