]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - board/karo/common/fdt.c
karo: fdt: remove 'vbus-supply' from usbotg node when otg_mode=peripheral
[karo-tx-uboot.git] / board / karo / common / fdt.c
index a6d1951fd1b5f3ab95d308e1b9144c9945b73b52..387208c78e4e317e36ce96a4079121c39812337f 100644 (file)
@@ -48,50 +48,6 @@ static void karo_set_fdtsize(void *fdt)
        setenv_hex("fdtsize", fdt_totalsize(fdt));
 }
 
-static int karo_load_part(const char *part, void *addr, size_t len)
-{
-       int ret;
-       struct mtd_device *dev;
-       struct part_info *part_info;
-       u8 part_num;
-       size_t actual;
-
-       debug("Initializing mtd_parts\n");
-       ret = mtdparts_init();
-       if (ret)
-               return ret;
-
-       debug("Trying to find NAND partition '%s'\n", part);
-       ret = find_dev_and_part(part, &dev, &part_num, &part_info);
-       if (ret) {
-               printf("Failed to find flash partition '%s': %d\n",
-                       part, ret);
-
-               return ret;
-       }
-       debug("Found partition '%s': offset=%08x size=%08x\n",
-               part, part_info->offset, part_info->size);
-       if (part_info->size < len) {
-               printf("Warning: partition '%s' smaller than requested size: %u; truncating data to %u byte\n",
-                       part, len, part_info->size);
-               len = part_info->size;
-       }
-       debug("Reading NAND partition '%s' to %p\n", part, addr);
-       ret = nand_read_skip_bad(&nand_info[0], part_info->offset, &len,
-                               &actual, len, addr);
-       if (ret) {
-               printf("Failed to load partition '%s' to %p\n", part, addr);
-               return ret;
-       }
-       if (actual < len)
-               printf("Read only %u of %u bytes due to bad blocks\n",
-                       actual, len);
-
-       debug("Read %u byte from partition '%s' @ offset %08x\n",
-               len, part, part_info->offset);
-       return 0;
-}
-
 static void *karo_fdt_load_dtb(void)
 {
        int ret;
@@ -253,7 +209,7 @@ static int karo_fdt_disable_node_phandle(void *blob, const char *parent,
 
        ph = fdt_getprop(blob, off, name, NULL);
        if (ph == NULL) {
-               printf("Failed to find '%s' phandle in node '%s'\n", name,
+               debug("Failed to find '%s' phandle in node '%s'\n", name,
                        fdt_get_name(blob, off, NULL));
                return -FDT_ERR_NOTFOUND;
        }
@@ -294,6 +250,7 @@ void karo_fdt_fixup_usb_otg(void *blob, const char *node, const char *phy)
        } else if (otg_mode && strcmp(otg_mode, "otg") == 0) {
                debug("Setting dr_mode to 'host'\n");
                ret = fdt_setprop_string(blob, off, "dr_mode", "otg");
+               disable_phy_pins = 0;
        } else {
                if (otg_mode && strcmp(otg_mode, "none") != 0)
                        printf("Invalid 'otg_mode' setting '%s'; disabling usbotg port\n",
@@ -316,7 +273,11 @@ void karo_fdt_fixup_usb_otg(void *blob, const char *node, const char *phy)
                        goto out;
 
                ret = karo_fdt_disable_node_phandle(blob, node, phy);
+       } else if (disable_phy_pins) {
+               debug("Removing 'vbus-supply' from usbotg node\n");
+               fdt_delprop(blob, off, "vbus-supply");
        }
+
 out:
        if (ret)
                printf("Failed to update usbotg: %s\n", fdt_strerror(ret));
@@ -380,21 +341,32 @@ static inline void karo_fdt_set_lcd_pins(void *blob, const char *name)
 void karo_fdt_fixup_flexcan(void *blob, int xcvr_present)
 {
        int ret;
-       const char *xcvr_status = xcvr_present ? "disabled" : NULL;
+       const char *xcvr_status = "disabled";
        const char *otg_mode = getenv("otg_mode");
 
-#ifndef CONFIG_SYS_LVDS_IF
        if (xcvr_present) {
                if (karo_fdt_flexcan_enabled(blob)) {
-                       karo_fdt_set_lcd_pins(blob, "lcdif_23bit_pins_a");
-                       xcvr_status = NULL;
-               } else {
+                       if (!is_lvds()) {
+                               debug("Changing LCD to use 23bits only\n");
+                               karo_fdt_set_lcd_pins(blob, "lcdif_23bit_pins_a");
+                               xcvr_status = NULL;
+                       }
+               } else if (!is_lvds()) {
+                       debug("Changing LCD to use 24bits\n");
                        karo_fdt_set_lcd_pins(blob, "lcdif_24bit_pins_a");
                }
        } else {
-               karo_fdt_set_lcd_pins(blob, "lcdif_24bit_pins_a");
+               int off = fdt_path_offset(blob, "can0");
+
+               if (off >= 0)
+                       fdt_delprop(blob, off, "xceiver-supply");
+               off = fdt_path_offset(blob, "can1");
+               if (off >= 0)
+                       fdt_delprop(blob, off, "xceiver-supply");
+               if (!is_lvds())
+                       karo_fdt_set_lcd_pins(blob, "lcdif_24bit_pins_a");
        }
-#endif
+
        if (otg_mode && strcmp(otg_mode, "host") == 0)
                karo_fdt_enable_node(blob, "can1", 0);
 
@@ -767,6 +739,7 @@ int karo_fdt_update_fb_mode(void *blob, const char *name)
        return off;
 }
 
+#ifdef CONFIG_SYS_LVDS_IF
 int karo_fdt_get_lcd_bus_width(const void *blob, int default_width)
 {
        int off = fdt_path_offset(blob, "display");
@@ -819,16 +792,29 @@ u8 karo_fdt_get_lvds_channels(const void *blob)
        }
        return lvds_chan_mask;
 }
+#endif
 
 int karo_fdt_get_backlight_polarity(const void *blob)
 {
-       int off = fdt_path_offset(blob, "/backlight");
+#ifdef CONFIG_SYS_LVDS_IF
+       const char *backlight_node = "/backlight0";
+#else
+       const char *backlight_node = "/backlight";
+#endif
+       int off = fdt_path_offset(blob, "backlight"); /* first try alias */
        const struct fdt_property *prop;
        int len;
 
        if (off < 0) {
-               printf("/backlight node not found in DT\n");
-               return off;
+               /*
+                * if no 'backlight' alias exists try finding '/backlight0'
+                * or '/backlight' depending on LVDS or not
+                */
+               off = fdt_path_offset(blob, backlight_node);
+               if (off < 0) {
+                       printf("/backlight node not found in DT\n");
+                       return off;
+               }
        }
 
        prop = fdt_get_property(blob, off, "pwms", &len);