karo: fdt: fix karo_fdt_del_prop() function
authorLothar Waßmann <LW@KARO-electronics.de>
Mon, 25 Aug 2014 12:20:00 +0000 (14:20 +0200)
committerLothar Waßmann <LW@KARO-electronics.de>
Mon, 25 Aug 2014 12:20:00 +0000 (14:20 +0200)
Don't delete the nodes referenced by the phandle found in the
designated property.

board/karo/common/fdt.c
board/karo/common/karo.h

index 24618a2..997239a 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * (C) Copyright 2012,2013 Lothar Waßmann <LW@KARO-electronics.de>
+ * (C) Copyright 2012-2014 Lothar Waßmann <LW@KARO-electronics.de>
  *
  * See file CREDITS for list of people who contributed to this
  * project.
@@ -413,37 +413,28 @@ void karo_fdt_fixup_flexcan(void *blob, int xcvr_present)
        }
 }
 
-void karo_fdt_del_prop(void *blob, const char *compat, phys_addr_t offs,
-                       const char *prop)
+void karo_fdt_del_prop(void *blob, const char *compat, u32 offs,
+                       const char *propname)
 {
-       int ret;
-       int offset;
-       const uint32_t *phandle;
-       uint32_t ph = 0;
-
-       offset = fdt_node_offset_by_compat_reg(blob, compat, offs);
-       if (offset <= 0)
-               return;
+       int offset = -1;
+       const fdt32_t *reg = NULL;
 
-       phandle = fdt_getprop(blob, offset, prop, NULL);
-       if (phandle) {
-               ph = fdt32_to_cpu(*phandle);
-       }
-
-       debug("Removing property '%s' from node %s@%08lx\n", prop, compat, offs);
-       ret = fdt_delprop(blob, offset, prop);
-       if (ret == 0)
-               karo_set_fdtsize(blob);
+       while (1) {
+               offset = fdt_node_offset_by_compatible(blob, offset, compat);
+               if (offset <= 0)
+                       return;
 
-       if (!ph)
-               return;
+               reg = fdt_getprop(blob, offset, "reg", NULL);
+               if (reg == NULL)
+                       return;
 
-       offset = fdt_node_offset_by_phandle(blob, ph);
-       if (offset <= 0)
-               return;
+               if (fdt32_to_cpu(*reg) == offs)
+                       break;
+       }
+       debug("Removing property '%s' from node %s@%x\n",
+               propname, compat, offs);
+       fdt_delprop(blob, offset, propname);
 
-       debug("Removing node @ %08x\n", offset);
-       fdt_del_node(blob, offset);
        karo_set_fdtsize(blob);
 }
 
index fac2ecb..7264df1 100644 (file)
@@ -30,7 +30,7 @@ void karo_fdt_fixup_touchpanel(void *blob, const char *panels[],
 void karo_fdt_fixup_usb_otg(void *blob, const char *node, const char *phy,
                        const char *phy_supply);
 void karo_fdt_fixup_flexcan(void *blob, int xcvr_present);
-void karo_fdt_del_prop(void *blob, const char *compat, phys_addr_t offs,
+void karo_fdt_del_prop(void *blob, const char *compat, u32 offs,
                const char *prop);
 void karo_fdt_enable_node(void *blob, const char *node, int enable);
 int karo_fdt_get_fb_mode(void *blob, const char *name,
@@ -59,7 +59,7 @@ static inline void karo_fdt_fixup_flexcan(void *blob, int xcvr_present)
 {
 }
 static inline void karo_fdt_del_prop(void *blob, const char *compat,
-                               phys_addr_t offs, const char *prop)
+                               u32 offs, const char *prop)
 {
 }
 static inline void karo_fdt_enable_node(void *blob, const char *node,