]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - board/karo/tx6/tx6qdl.c
karo: tx6: replace open coded interpretation of cpurev by calls to is_cpu_type()
[karo-tx-uboot.git] / board / karo / tx6 / tx6qdl.c
index 090ade17a589c14f367d28bb781dc526c98d32f4..6a0564ef94b260deb14bbb4eeba90a3fadfdc0bd 100644 (file)
@@ -1,17 +1,7 @@
 /*
  * Copyright (C) 2012-2015 Lothar Waßmann <LW@KARO-electronics.de>
  *
- * See file CREDITS for list of people who contributed to this
- * project.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
+ * SPDX-License-Identifier:     GPL-2.0+
  *
  */
 #include <common.h>
@@ -69,10 +59,6 @@ DECLARE_GLOBAL_DATA_PTR;
 
 #define MUX_CFG_SION                   IOMUX_PAD(0, 0, IOMUX_CONFIG_SION, 0, 0, 0)
 
-enum {
-       MX6_PAD_DECL(GARBAGE, 0, 0, 0, 0, 0, 0)
-};
-
 char __uboot_img_end[0] __attribute__((section(".__uboot_img_end")));
 #ifdef CONFIG_SECURE_BOOT
 char __csf_data[0] __attribute__((section(".__csf_data")));
@@ -243,7 +229,7 @@ static void tx6_i2c_recover(void)
 /* placed in section '.data' to prevent overwriting relocation info
  * overlayed with bss
  */
-static u32 wrsr __attribute__((section(".data")));
+static u32 wrsr __data;
 
 #define WRSR_POR                       (1 << 4)
 #define WRSR_TOUT                      (1 << 1)
@@ -303,36 +289,83 @@ static void print_reset_cause(void)
 
 static const char __data *tx6_mod_suffix;
 
+#ifdef CONFIG_IMX6_THERMAL
+#include <thermal.h>
+#include <imx_thermal.h>
+#include <fuse.h>
+
+static void print_temperature(void)
+{
+       struct udevice *thermal_dev;
+       int cpu_tmp, minc, maxc, ret;
+       char const *grade_str;
+       static u32 __data thermal_calib;
+
+       puts("Temperature: ");
+       switch (get_cpu_temp_grade(&minc, &maxc)) {
+       case TEMP_AUTOMOTIVE:
+               grade_str = "Automotive";
+               break;
+       case TEMP_INDUSTRIAL:
+               grade_str = "Industrial";
+               break;
+       case TEMP_EXTCOMMERCIAL:
+               grade_str = "Extended Commercial";
+               break;
+       default:
+               grade_str = "Commercial";
+       }
+       printf("%s grade (%dC to %dC)", grade_str, minc, maxc);
+       ret = uclass_get_device(UCLASS_THERMAL, 0, &thermal_dev);
+       if (ret == 0) {
+               ret = thermal_get_temp(thermal_dev, &cpu_tmp);
+
+               if (ret == 0)
+                       printf(" at %dC", cpu_tmp);
+               else
+                       puts(" - failed to read sensor data");
+       } else {
+               puts(" - no sensor device found");
+       }
+
+       if (fuse_read(1, 6, &thermal_calib) == 0) {
+               printf(" - calibration data 0x%08x\n", thermal_calib);
+       } else {
+               puts(" - Failed to read thermal calib fuse\n");
+       }
+}
+#else
+static inline void print_temperature(void)
+{
+}
+#endif
+
 int checkboard(void)
 {
        u32 cpurev = get_cpu_rev();
        char *cpu_str = "?";
 
-       switch ((cpurev >> 12) & 0xff) {
-       case MXC_CPU_MX6SL:
+       if (is_cpu_type(MXC_CPU_MX6SL)) {
                cpu_str = "SL";
                tx6_mod_suffix = "?";
-               break;
-       case MXC_CPU_MX6DL:
+       } else if (is_cpu_type(MXC_CPU_MX6DL)) {
                cpu_str = "DL";
                tx6_mod_suffix = "U";
-               break;
-       case MXC_CPU_MX6SOLO:
+       } else if (is_cpu_type(MXC_CPU_MX6SOLO)) {
                cpu_str = "SOLO";
                tx6_mod_suffix = "S";
-               break;
-       case MXC_CPU_MX6Q:
+       } else if (is_cpu_type(MXC_CPU_MX6Q)) {
                cpu_str = "Q";
                tx6_mod_suffix = "Q";
-               break;
        }
 
-       printf("CPU:   Freescale i.MX6%s rev%d.%d at %d MHz\n",
+       printf("CPU:         Freescale i.MX6%s rev%d.%d at %d MHz\n",
                cpu_str,
                (cpurev & 0x000F0) >> 4,
                (cpurev & 0x0000F) >> 0,
                mxc_get_clock(MXC_ARM_CLK) / 1000000);
 
+       print_temperature();
        print_reset_cause();
 #ifdef CONFIG_MX6_TEMPERATURE_HOT
        check_cpu_temperature(1);
@@ -341,10 +374,9 @@ int checkboard(void)
        return 0;
 }
 
+/* serial port not initialized at this point */
 int board_early_init_f(void)
 {
-       debug("%s@%d: \n", __func__, __LINE__);
-
        return 0;
 }
 
@@ -364,7 +396,7 @@ static bool tx6_temp_check_enabled = true;
 #endif
 #endif /* CONFIG_TX6_NAND */
 
-#define TX6_DDR_SZ     (ffs(PHYS_SDRAM_1_WIDTH / 16) - 1)
+#define TX6_DDR_SZ     (ffs(CONFIG_SYS_SDRAM_BUS_WIDTH / 16) - 1)
 
 static char tx6_mem_table[] = {
        '4', /* 256MiB SDRAM 16bit; 128MiB NAND */
@@ -417,8 +449,6 @@ static int tx6_pmic_probe(void)
 
        debug("%s@%d: \n", __func__, __LINE__);
 
-//     i2c_init_all();
-
        for (i = 0; i < ARRAY_SIZE(tx6_mod_revs); i++) {
                u8 i2c_addr = tx6_mod_revs[i].addr;
                int ret = i2c_probe(i2c_addr);
@@ -432,46 +462,20 @@ static int tx6_pmic_probe(void)
        return -EINVAL;
 }
 
-static inline int __checkboard(void)
-{
-       u32 cpurev = get_cpu_rev();
-       int cpu_variant = (cpurev >> 12) & 0xff;
-       int pmic_id;
-
-       debug("%s@%d: \n", __func__, __LINE__);
-
-       pmic_id = tx6_pmic_probe();
-       if (pmic_id >= 0)
-               pmic_addr = tx6_mod_revs[pmic_id].addr;
-
-       printf("Board: Ka-Ro TX6%s-%d%d%d%c\n",
-               tx6_mod_suffix,
-               cpu_variant == MXC_CPU_MX6Q ? 1 : 8,
-               is_lvds(), tx6_get_mod_rev(pmic_id),
-               tx6_mem_suffix());
-
-       get_hab_status();
-
-       debug("%s@%d: done\n", __func__, __LINE__);
-       return 0;
-}
-
 int board_init(void)
 {
        int ret;
-       u32 cpurev = get_cpu_rev();
-       int cpu_variant = (cpurev >> 12) & 0xff;
        int pmic_id;
 
        debug("%s@%d: \n", __func__, __LINE__);
 
        pmic_id = tx6_pmic_probe();
-       if (pmic_id >= 0)
+       if (pmic_id >= 0 && pmic_id < ARRAY_SIZE(tx6_mod_revs))
                pmic_addr = tx6_mod_revs[pmic_id].addr;
 
        printf("Board: Ka-Ro TX6%s-%d%d%d%c\n",
                tx6_mod_suffix,
-               cpu_variant == MXC_CPU_MX6Q ? 1 : 8,
+               is_cpu_type(MXC_CPU_MX6Q) ? 1 : 8,
                is_lvds(), tx6_get_mod_rev(pmic_id),
                tx6_mem_suffix());
 
@@ -498,7 +502,7 @@ int board_init(void)
                return 0;
        }
 
-       ret = tx6_pmic_init(pmic_addr);
+       ret = tx6_pmic_init(pmic_addr, NULL, 0);
        if (ret) {
                printf("Failed to setup PMIC voltages: %d\n", ret);
                hang();
@@ -700,7 +704,7 @@ static void tx6_init_mac(void)
 {
        u8 mac[ETH_ALEN];
 
-       imx_get_mac_from_fuse(-1, mac);
+       imx_get_mac_from_fuse(0, mac);
        if (!is_valid_ethaddr(mac)) {
                printf("No valid MAC address programmed\n");
                return;
@@ -792,14 +796,12 @@ static const struct gpio stk5_gpios[] = {
 };
 
 #ifdef CONFIG_LCD
-static u16 tx6_cmap[256];
 vidinfo_t panel_info = {
        /* set to max. size supported by SoC */
        .vl_col = 1920,
        .vl_row = 1080,
 
        .vl_bpix = LCD_COLOR32,    /* Bits per pixel, 0: 1bpp, 1: 2bpp, 2: 4bpp, 3: 8bpp ... */
-       .cmap = tx6_cmap,
 };
 
 static struct fb_videomode tx6_fb_modes[] = {
@@ -1082,6 +1084,7 @@ void lcd_ctrl_init(void *lcdbase)
 
        if (!lcd_enabled) {
                debug("LCD disabled\n");
+               goto disable;
                return;
        }
 
@@ -1089,6 +1092,7 @@ void lcd_ctrl_init(void *lcdbase)
                debug("Disabling LCD\n");
                lcd_enabled = 0;
                setenv("splashimage", NULL);
+               goto disable;
                return;
        }
 
@@ -1098,6 +1102,7 @@ void lcd_ctrl_init(void *lcdbase)
        if (video_mode == NULL) {
                debug("Disabling LCD\n");
                lcd_enabled = 0;
+               goto disable;
                return;
        }
        vm = video_mode;
@@ -1111,6 +1116,7 @@ void lcd_ctrl_init(void *lcdbase)
                                fb_mode.xres, fb_mode.yres,
                                panel_info.vl_col, panel_info.vl_row);
                        lcd_enabled = 0;
+                       goto disable;
                        return;
                }
        }
@@ -1202,12 +1208,14 @@ void lcd_ctrl_init(void *lcdbase)
                        printf(" %s", p->name);
                }
                printf("\n");
+               goto disable;
                return;
        }
        if (p->xres > panel_info.vl_col || p->yres > panel_info.vl_row) {
                printf("video resolution: %dx%d exceeds hardware limits: %dx%d\n",
                        p->xres, p->yres, panel_info.vl_col, panel_info.vl_row);
                lcd_enabled = 0;
+               goto disable;
                return;
        }
        panel_info.vl_col = p->xres;
@@ -1266,6 +1274,7 @@ void lcd_ctrl_init(void *lcdbase)
                lcd_enabled = 0;
                printf("Invalid %s bus width: %d\n", is_lvds() ? "LVDS" : "LCD",
                        lcd_bus_width);
+               goto disable;
                return;
        }
        if (is_lvds()) {
@@ -1277,6 +1286,7 @@ void lcd_ctrl_init(void *lcdbase)
                if (lvds_chan_mask == 0) {
                        printf("No LVDS channel active\n");
                        lcd_enabled = 0;
+                       goto disable;
                        return;
                }
 
@@ -1306,6 +1316,13 @@ void lcd_ctrl_init(void *lcdbase)
        } else {
                debug("Skipping initialization of LCD controller\n");
        }
+       return;
+
+disable:
+       lcd_enabled = 0;
+       panel_info.vl_col = 0;
+       panel_info.vl_row = 0;
+
 }
 #else
 #define lcd_enabled 0
@@ -1367,15 +1384,7 @@ static void tx6qdl_set_cpu_clock(void)
 
 int board_late_init(void)
 {
-       int ret = 0;
        const char *baseboard;
-#if 1
-       /* override secure_boot fuse */
-       struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
-       struct fuse_bank0_regs *fuse = (void *)ocotp->bank[0].fuse_regs;
-
-       writel(0x12, &fuse->cfg5);
-#endif
 
        debug("%s@%d: \n", __func__, __LINE__);
 
@@ -1419,7 +1428,8 @@ int board_late_init(void)
        } else {
                printf("WARNING: Unsupported baseboard: '%s'\n",
                        baseboard);
-               ret = -EINVAL;
+               if (!had_ctrlc())
+                       return -EINVAL;
        }
 
 exit:
@@ -1427,7 +1437,7 @@ exit:
 
        gpio_set_value(TX6_RESET_OUT_GPIO, 1);
        clear_ctrlc();
-       return ret;
+       return 0;
 }
 
 #ifdef CONFIG_SERIAL_TAG
@@ -1474,7 +1484,6 @@ int ft_board_setup(void *blob, bd_t *bd)
                karo_fdt_enable_node(blob, "stk5led", 0);
 
        fdt_fixup_mtdparts(blob, nodes, ARRAY_SIZE(nodes));
-       fdt_fixup_ethernet(blob);
 
        karo_fdt_fixup_touchpanel(blob, tx6_touchpanels,
                                ARRAY_SIZE(tx6_touchpanels));