Merge tag 'renesas-drivers-for-v4.13' of https://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6-microblaze.git] / drivers / soc / renesas / rcar-sysc.c
index 4d0125d..dcad5c4 100644 (file)
@@ -2,7 +2,7 @@
  * R-Car SYSC Power management support
  *
  * Copyright (C) 2014  Magnus Damm
- * Copyright (C) 2015-2016 Glider bvba
+ * Copyright (C) 2015-2017 Glider bvba
  *
  * This file is subject to the terms and conditions of the GNU General Public
  * License.  See the file "COPYING" in the main directory of this archive
@@ -332,6 +332,12 @@ static int __init rcar_sysc_pd_init(void)
 
        info = match->data;
 
+       if (info->init) {
+               error = info->init();
+               if (error)
+                       return error;
+       }
+
        has_cpg_mstp = of_find_compatible_node(NULL, NULL,
                                               "renesas,cpg-mstp-clocks");
 
@@ -375,6 +381,11 @@ static int __init rcar_sysc_pd_init(void)
                const struct rcar_sysc_area *area = &info->areas[i];
                struct rcar_sysc_pd *pd;
 
+               if (!area->name) {
+                       /* Skip NULLified area */
+                       continue;
+               }
+
                pd = kzalloc(sizeof(*pd) + strlen(area->name) + 1, GFP_KERNEL);
                if (!pd) {
                        error = -ENOMEM;
@@ -404,6 +415,18 @@ out_put:
 }
 early_initcall(rcar_sysc_pd_init);
 
+void __init rcar_sysc_nullify(struct rcar_sysc_area *areas,
+                             unsigned int num_areas, u8 id)
+{
+       unsigned int i;
+
+       for (i = 0; i < num_areas; i++)
+               if (areas[i].isr_bit == id) {
+                       areas[i].name = NULL;
+                       return;
+               }
+}
+
 void __init rcar_sysc_init(phys_addr_t base, u32 syscier)
 {
        u32 syscimr;