]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
upgrade to upstream version 2013.07 KARO-TX6-2013-08-23
authorLothar Waßmann <LW@KARO-electronics.de>
Fri, 23 Aug 2013 15:27:09 +0000 (17:27 +0200)
committerLothar Waßmann <LW@KARO-electronics.de>
Fri, 23 Aug 2013 15:27:09 +0000 (17:27 +0200)
25 files changed:
Makefile
arch/arm/cpu/arm926ejs/mxs/clock.c
arch/arm/cpu/arm926ejs/mxs/mxs.c
arch/arm/cpu/arm926ejs/mxs/timer.c
arch/arm/cpu/armv7/omap-common/boot-common.c
arch/arm/imx-common/timer.c
arch/arm/include/asm/arch-mxs/clock.h
arch/arm/include/asm/arch-mxs/regs-ssp.h
arch/arm/lib/board.c
board/karo/common/fdt.c
board/karo/tx28/tx28.c
board/karo/tx53/lowlevel_init.S
board/karo/tx6/lowlevel_init.S
common/cmd_fdt.c
common/lcd.c
drivers/mmc/fsl_esdhc.c
drivers/mmc/omap_hsmmc.c
drivers/mtd/nand/mxc_nand.c
drivers/net/fec_mxc.c
drivers/video/ipu_common.c
drivers/video/mxc_ipuv3_fb.c
include/configs/tx48.h
include/configs/tx51.h
include/configs/tx53.h
include/configs/tx6.h

index b82feebefa3167810b8bc3428e5a360e63ab6ed8..261bde92efe74af5fa465799a58419eea49c296a 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -509,7 +509,7 @@ $(obj)u-boot.ais:       $(obj)spl/u-boot-spl.bin $(obj)u-boot.img
                        $(obj)u-boot.ais
 
 
-$(obj)u-boot.sb:       $(obj)u-boot $(obj)spl/u-boot-spl.bin elftosb
+$(obj)u-boot.sb:       $(obj)u-boot.bin $(obj)spl/u-boot-spl.bin elftosb
                $(MAKE) -C $(SRCTREE)/$(CPUDIR)/$(SOC)/ $(OBJTREE)/u-boot.sb
 
 # On x600 (SPEAr600) U-Boot is appended to U-Boot SPL.
index e9d8800f8c1b30f26d3598bdbb18d14732949638..8b5ad018ea7d3000c093f14c2090ccc810ceb650 100644 (file)
 #define MXC_SSPCLK_MAX MXC_SSPCLK3
 #endif
 
-static uint32_t mxs_get_pclk(void)
+static struct mxs_clkctrl_regs *clkctrl_regs = (void *)MXS_CLKCTRL_BASE;
+
+static uint32_t get_frac_clk(uint32_t refclk, uint32_t div, uint32_t _mask)
 {
-       struct mxs_clkctrl_regs *clkctrl_regs =
-               (struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE;
+       uint32_t mask = (_mask + 1) >> 1;
+       uint32_t acc = div;
+       int period = 0;
+       int mult = 0;
+
+       if (div & mask)
+               return 0;
+
+       do {
+               acc += div;
+               if (acc & mask) {
+                       acc &= ~mask;
+                       mult++;
+               }
+               period++;
+       } while (acc != div);
 
+       return refclk * mult / period;
+}
+
+static uint32_t mxs_get_pclk(void)
+{
        uint32_t clkctrl, clkseq, div;
        uint8_t clkfrac, frac;
 
        clkctrl = readl(&clkctrl_regs->hw_clkctrl_cpu);
 
-       /* No support of fractional divider calculation */
+       div = clkctrl & CLKCTRL_CPU_DIV_CPU_MASK;
+       clkfrac = readb(&clkctrl_regs->hw_clkctrl_frac0[CLKCTRL_FRAC0_CPU]);
+       frac = clkfrac & CLKCTRL_FRAC_FRAC_MASK;
+       clkseq = readl(&clkctrl_regs->hw_clkctrl_clkseq);
+
        if (clkctrl &
                (CLKCTRL_CPU_DIV_XTAL_FRAC_EN | CLKCTRL_CPU_DIV_CPU_FRAC_EN)) {
-               return 0;
+               uint32_t refclk, mask;
+
+               if (clkseq & CLKCTRL_CLKSEQ_BYPASS_CPU) {
+                       refclk = XTAL_FREQ_MHZ;
+                       mask = CLKCTRL_CPU_DIV_XTAL_MASK >>
+                               CLKCTRL_CPU_DIV_XTAL_OFFSET;
+                       div = (clkctrl & CLKCTRL_CPU_DIV_XTAL_MASK) >>
+                               CLKCTRL_CPU_DIV_XTAL_OFFSET;
+               } else {
+                       refclk = PLL_FREQ_MHZ * PLL_FREQ_COEF / frac;
+                       mask = CLKCTRL_CPU_DIV_CPU_MASK;
+               }
+               return get_frac_clk(refclk, div, mask);
        }
 
-       clkseq = readl(&clkctrl_regs->hw_clkctrl_clkseq);
-
        /* XTAL Path */
        if (clkseq & CLKCTRL_CLKSEQ_BYPASS_CPU) {
                div = (clkctrl & CLKCTRL_CPU_DIV_XTAL_MASK) >>
@@ -60,35 +95,26 @@ static uint32_t mxs_get_pclk(void)
        }
 
        /* REF Path */
-       clkfrac = readb(&clkctrl_regs->hw_clkctrl_frac0[CLKCTRL_FRAC0_CPU]);
-       frac = clkfrac & CLKCTRL_FRAC_FRAC_MASK;
-       div = clkctrl & CLKCTRL_CPU_DIV_CPU_MASK;
        return (PLL_FREQ_MHZ * PLL_FREQ_COEF / frac) / div;
 }
 
 static uint32_t mxs_get_hclk(void)
 {
-       struct mxs_clkctrl_regs *clkctrl_regs =
-               (struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE;
-
        uint32_t div;
        uint32_t clkctrl;
+       uint32_t refclk = mxs_get_pclk();
 
        clkctrl = readl(&clkctrl_regs->hw_clkctrl_hbus);
+       div = clkctrl & CLKCTRL_HBUS_DIV_MASK;
 
-       /* No support of fractional divider calculation */
        if (clkctrl & CLKCTRL_HBUS_DIV_FRAC_EN)
-               return 0;
+               return get_frac_clk(refclk, div, CLKCTRL_HBUS_DIV_MASK);
 
-       div = clkctrl & CLKCTRL_HBUS_DIV_MASK;
-       return mxs_get_pclk() / div;
+       return refclk / div;
 }
 
 static uint32_t mxs_get_emiclk(void)
 {
-       struct mxs_clkctrl_regs *clkctrl_regs =
-               (struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE;
-
        uint32_t clkctrl, clkseq, div;
        uint8_t clkfrac, frac;
 
@@ -111,8 +137,6 @@ static uint32_t mxs_get_emiclk(void)
 
 static uint32_t mxs_get_gpmiclk(void)
 {
-       struct mxs_clkctrl_regs *clkctrl_regs =
-               (struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE;
 #if defined(CONFIG_MX23)
        uint8_t *reg =
                &clkctrl_regs->hw_clkctrl_frac0[CLKCTRL_FRAC0_CPU];
@@ -144,8 +168,6 @@ static uint32_t mxs_get_gpmiclk(void)
  */
 void mxs_set_ioclk(enum mxs_ioclock io, uint32_t freq)
 {
-       struct mxs_clkctrl_regs *clkctrl_regs =
-               (struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE;
        uint32_t div;
        int io_reg;
 
@@ -177,14 +199,14 @@ void mxs_set_ioclk(enum mxs_ioclock io, uint32_t freq)
  */
 static uint32_t mxs_get_ioclk(enum mxs_ioclock io)
 {
-       struct mxs_clkctrl_regs *clkctrl_regs =
-               (struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE;
        uint8_t ret;
        int io_reg;
 
-       if ((io < MXC_IOCLK0) || (io > MXC_IOCLK1))
+       if ((io < MXC_IOCLK0) || (io > MXC_IOCLK1)) {
+               printf("%s: IO clock selector %u out of range %u..%u\n",
+                       __func__, io, MXC_IOCLK0, MXC_IOCLK1);
                return 0;
-
+       }
        io_reg = CLKCTRL_FRAC0_IO0 - io;        /* Register order is reversed */
 
        ret = readb(&clkctrl_regs->hw_clkctrl_frac0[io_reg]) &
@@ -198,8 +220,6 @@ static uint32_t mxs_get_ioclk(enum mxs_ioclock io)
  */
 void mxs_set_sspclk(enum mxs_sspclock ssp, uint32_t freq, int xtal)
 {
-       struct mxs_clkctrl_regs *clkctrl_regs =
-               (struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE;
        uint32_t clk, clkreg;
 
        if (ssp > MXC_SSPCLK_MAX)
@@ -242,9 +262,7 @@ void mxs_set_sspclk(enum mxs_sspclock ssp, uint32_t freq, int xtal)
  */
 static uint32_t mxs_get_sspclk(enum mxs_sspclock ssp)
 {
-       struct mxs_clkctrl_regs *clkctrl_regs =
-               (struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE;
-       uint32_t clkreg;
+       uint32_t *clkreg;
        uint32_t clk, tmp;
 
        if (ssp > MXC_SSPCLK_MAX)
@@ -254,11 +272,10 @@ static uint32_t mxs_get_sspclk(enum mxs_sspclock ssp)
        if (tmp & (CLKCTRL_CLKSEQ_BYPASS_SSP0 << ssp))
                return XTAL_FREQ_KHZ;
 
-       clkreg = (uint32_t)(&clkctrl_regs->hw_clkctrl_ssp0) +
-                       (ssp * sizeof(struct mxs_register_32));
+       clkreg = &clkctrl_regs->hw_clkctrl_ssp0 +
+                       ssp * sizeof(struct mxs_register_32);
 
        tmp = readl(clkreg) & CLKCTRL_SSP_DIV_MASK;
-
        if (tmp == 0)
                return 0;
 
@@ -311,8 +328,6 @@ void mxs_set_ssp_busclock(unsigned int bus, uint32_t freq)
 
 void mxs_set_lcdclk(uint32_t freq)
 {
-       struct mxs_clkctrl_regs *clkctrl_regs =
-               (struct mxs_clkctrl_regs *)MXS_CLKCTRL_BASE;
        uint32_t fp, x, k_rest, k_best, x_best, tk;
        int32_t k_best_l = 999, k_best_t = 0, x_best_l = 0xff, x_best_t = 0xff;
 
@@ -402,6 +417,21 @@ void mxs_set_lcdclk(uint32_t freq)
 #endif
 }
 
+static uint32_t mxs_get_xbus_clk(void)
+{
+       uint32_t div;
+       uint32_t clkctrl;
+       uint32_t refclk = mxs_get_pclk();
+
+       clkctrl = readl(&clkctrl_regs->hw_clkctrl_xbus);
+       div = clkctrl & CLKCTRL_XBUS_DIV_MASK;
+
+       if (clkctrl & CLKCTRL_XBUS_DIV_FRAC_EN)
+               return get_frac_clk(refclk, div, CLKCTRL_XBUS_DIV_MASK);
+
+       return refclk / div;
+}
+
 uint32_t mxc_get_clock(enum mxc_clock clk)
 {
        switch (clk) {
@@ -430,6 +460,10 @@ uint32_t mxc_get_clock(enum mxc_clock clk)
        case MXC_SSP3_CLK:
                return mxs_get_sspclk(MXC_SSPCLK3);
 #endif
+       case MXC_XBUS_CLK:
+               return mxs_get_xbus_clk() * 1000000;
+       default:
+               printf("Invalid clock selector %u\n", clk);
        }
 
        return 0;
index b00e40485f52ae9bfe6dc72faeaabe3e7aa0738c..66d5169087140658859106b403077e9e41b9f2e0 100644 (file)
@@ -228,12 +228,21 @@ int print_cpuinfo(void)
 }
 #endif
 
+#define pr_clk(n, c) {                                         \
+       unsigned long clk = c;  \
+       printf("%-5s  %3lu.%03lu MHz\n", #n ":", clk / 1000000, \
+               clk / 1000 % 1000);                             \
+}
+
 int do_mx28_showclocks(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
 {
-       printf("CPU:   %3d MHz\n", mxc_get_clock(MXC_ARM_CLK) / 1000000);
-       printf("BUS:   %3d MHz\n", mxc_get_clock(MXC_AHB_CLK) / 1000000);
-       printf("EMI:   %3d MHz\n", mxc_get_clock(MXC_EMI_CLK));
-       printf("GPMI:  %3d MHz\n", mxc_get_clock(MXC_GPMI_CLK) / 1000000);
+       pr_clk(CPU, mxc_get_clock(MXC_ARM_CLK));
+       pr_clk(APBH, mxc_get_clock(MXC_AHB_CLK));
+       pr_clk(APBX, mxc_get_clock(MXC_XBUS_CLK));
+       pr_clk(IO0, mxc_get_clock(MXC_IO0_CLK) * 1000);
+       pr_clk(IO1, mxc_get_clock(MXC_IO1_CLK) * 1000);
+       pr_clk(EMI, mxc_get_clock(MXC_EMI_CLK) * 1000000);
+       pr_clk(GPMI, mxc_get_clock(MXC_GPMI_CLK));
        return 0;
 }
 
index 20693e2a94cd4c1ddf68e3086fce4818ff9606fd..12789327ccb65dbcb18b5b3c5eb66be53dd17a8e 100644 (file)
@@ -74,7 +74,7 @@ int timer_init(void)
                TIMROT_TIMCTRLn_SELECT_1KHZ_XTAL,
                &timrot_regs->hw_timrot_timctrl0);
 
-       /* Set fixed_count to maximal value */
+       /* Set fixed_count to maximum value */
 #if defined(CONFIG_MX23)
        writel(TIMER_LOAD_VAL - 1, &timrot_regs->hw_timrot_timcount0);
 #elif defined(CONFIG_MX28)
@@ -89,8 +89,7 @@ int timer_init(void)
        writel(20 * MXS_INCREMENTER_HZ,
                &timrot_regs->hw_timrot_fixed_count0);
        gd->arch.lastinc = TIMER_LOAD_VAL - 20 * MXS_INCREMENTER_HZ;
-#endif
-#ifdef DEBUG_TIMER_WRAP
+
        /* Make the usec counter roll over 30 seconds after startup */
        writel(-30000000, MXS_HW_DIGCTL_MICROSECONDS);
 #endif
index 6b9ce369f5efe8d1a6d9871258cd119d9d84385b..ad383872c57f706a65a8171c756c2b815e92a194 100644 (file)
@@ -59,7 +59,7 @@ void save_omap_boot_params(void)
 #ifdef CONFIG_SPL_BUILD
 u32 spl_boot_device(void)
 {
-       return (u32) (gd->arch.omap_boot_params.omap_bootdevice);
+       return gd->arch.omap_boot_params.omap_bootdevice;
 }
 
 u32 spl_boot_mode(void)
index a4b0137cf3f68986accca9c42889ff64d5de6727..92712a6de55b86a2432bbbf02ac694566b2c3b68 100644 (file)
@@ -36,10 +36,18 @@ static inline unsigned long long tick_to_time(unsigned long long tick)
 {
        tick *= CONFIG_SYS_HZ;
        do_div(tick, MXC_CLK32);
-
        return tick;
 }
 
+static inline unsigned long time_to_tick(unsigned long time)
+{
+       unsigned long long ticks = (unsigned long long)time;
+
+       ticks *= MXC_CLK32;
+       do_div(ticks, CONFIG_SYS_HZ);
+       return ticks;
+}
+
 static inline unsigned long long us_to_tick(unsigned long long usec)
 {
        usec = usec * MXC_CLK32 + 999999;
@@ -91,25 +99,36 @@ ulong get_timer_masked(void)
         * 5 * 10^9 days... and get_ticks() * CONFIG_SYS_HZ wraps in
         * 5 * 10^6 days - long enough.
         */
+       /*
+        * LW: get_ticks() returns a long long with the top 32 bits always ZERO!
+        * Thus the calculation above is not true.
+        * A 64bit timer value would only make sense if it was
+        * consistently used throughout the code. Thus also the parameter
+        * to get_timer() and its return value would need to be 64bit wide!
+        */
        return tick_to_time(get_ticks());
 }
 
 ulong get_timer(ulong base)
 {
-       return get_timer_masked() - base;
+       return tick_to_time(get_ticks() - time_to_tick(base));
 }
 
 /* delay x useconds AND preserve advance timstamp value */
 void __udelay(unsigned long usec)
 {
-       unsigned long long tmp;
-       ulong tmo;
+       unsigned long start = __raw_readl(&cur_gpt->counter);
+       unsigned long ticks;
+
+       if (usec == 0)
+               return;
 
-       tmo = us_to_tick(usec);
-       tmp = get_ticks() + tmo;        /* get current timestamp */
+       ticks = us_to_tick(usec);
+       if (ticks == 0)
+               ticks++;
 
-       while (get_ticks() < tmp)       /* loop till event */
-                /*NOP*/;
+       while (__raw_readl(&cur_gpt->counter) - start < ticks)
+               /* loop till event */;
 }
 
 /*
index fc9d75b50940504c874f914cb3d8731e23ce67a7..d3bc95b8240ac270c8fa5920dde868bdffbacf83 100644 (file)
@@ -25,6 +25,7 @@ enum mxc_clock {
        MXC_SSP2_CLK,
        MXC_SSP3_CLK,
 #endif
+       MXC_XBUS_CLK,
 };
 
 enum mxs_ioclock {
index be74e4b1cffb58f6ee5332a71d32023393c8848a..464e9e0914b6f4d02cd8502499c3fbda1af4b13d 100644 (file)
 #ifndef        __ASSEMBLY__
 #if defined(CONFIG_MX23)
 struct mxs_ssp_regs {
-       mxs_reg_32(hw_ssp_ctrl0)
-       mxs_reg_32(hw_ssp_cmd0)
-       mxs_reg_32(hw_ssp_cmd1)
-       mxs_reg_32(hw_ssp_compref)
-       mxs_reg_32(hw_ssp_compmask)
-       mxs_reg_32(hw_ssp_timing)
-       mxs_reg_32(hw_ssp_ctrl1)
-       mxs_reg_32(hw_ssp_data)
-       mxs_reg_32(hw_ssp_sdresp0)
-       mxs_reg_32(hw_ssp_sdresp1)
-       mxs_reg_32(hw_ssp_sdresp2)
-       mxs_reg_32(hw_ssp_sdresp3)
-       mxs_reg_32(hw_ssp_status)
-
-       uint32_t        reserved1[12];
-
-       mxs_reg_32(hw_ssp_debug)
-       mxs_reg_32(hw_ssp_version)
+       mxs_reg_32(hw_ssp_ctrl0);
+       mxs_reg_32(hw_ssp_cmd0);
+       mxs_reg_32(hw_ssp_cmd1);
+       mxs_reg_32(hw_ssp_compref);
+       mxs_reg_32(hw_ssp_compmask);
+       mxs_reg_32(hw_ssp_timing);
+       mxs_reg_32(hw_ssp_ctrl1);
+       mxs_reg_32(hw_ssp_data);
+       mxs_reg_32(hw_ssp_sdresp0);
+       mxs_reg_32(hw_ssp_sdresp1);
+       mxs_reg_32(hw_ssp_sdresp2);
+       mxs_reg_32(hw_ssp_sdresp3);
+       mxs_reg_32(hw_ssp_status);
+       reg_32(reserved[3]);
+       mxs_reg_32(hw_ssp_debug);
+       mxs_reg_32(hw_ssp_version);
 };
 #elif defined(CONFIG_MX28)
 struct mxs_ssp_regs {
index 9c72a5353fe2cdd865f9896e915a45a89ecec5fb..ad78e7366761bca5615dce7e8cd7285c56c97bb0 100644 (file)
@@ -451,6 +451,7 @@ void board_init_f(ulong bootflag)
        gd->relocaddr = addr;
        gd->start_addr_sp = addr_sp;
        gd->reloc_off = addr - _TEXT_BASE;
+
        debug("relocation Offset is: %08lx\n", gd->reloc_off);
        if (new_fdt) {
                memcpy(new_fdt, gd->fdt_blob, fdt_size);
@@ -523,7 +524,7 @@ void board_init_r(gd_t *id, ulong dest_addr)
        debug("monitor flash len: %08lX\n", monitor_flash_len);
        board_init();   /* Setup chipselects */
        /*
-        * TODO: printing of the clock inforamtion of the board is now
+        * TODO: printing of the clock information of the board is now
         * implemented as part of bdinfo command. Currently only support for
         * davinci SOC's is added. Remove this check once all the board
         * implement this.
index 06b56181c6c4abca285472680d786b24cb8e2e4d..76b8b7882a5226c9a0a6a7a54faeccd0a6eb6d3d 100644 (file)
@@ -171,6 +171,8 @@ void karo_fdt_fixup_usb_otg(void *blob, const char *node, const char *phy)
        int off;
        int ret;
        const uint32_t *ph;
+       int disable_otg = 0;
+       int disable_phy_pins = 1;
 
        debug("OTG mode is '%s'\n", otg_mode ? otg_mode : "<UNSET>");
 
@@ -182,23 +184,32 @@ void karo_fdt_fixup_usb_otg(void *blob, const char *node, const char *phy)
 
        if (otg_mode && (strcmp(otg_mode, "device") == 0 ||
                                strcmp(otg_mode, "gadget") == 0)) {
+               debug("Setting dr_mode to 'peripheral'\n");
                ret = fdt_setprop_string(blob, off, "dr_mode", "peripheral");
-               phy = NULL;
        } else if (otg_mode && strcmp(otg_mode, "host") == 0) {
+               debug("Setting dr_mode to 'host'\n");
                ret = fdt_setprop_string(blob, off, "dr_mode", "host");
-               phy = NULL;
+               disable_phy_pins = 0;
+       } 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");
        } else {
                if (otg_mode && strcmp(otg_mode, "none") != 0)
                        printf("Invalid 'otg_mode' setting '%s'; disabling usbotg port\n",
                                otg_mode);
-               ret = fdt_setprop_string(blob, off, "status", "disabled");
+               disable_otg = 1;
+               ret = 0;
        }
-       if (ret)
-               goto out;
 
-       if (phy == NULL)
+       if ((!disable_phy_pins && !disable_otg) || ret)
                goto out;
 
+       if (disable_otg) {
+               ret = fdt_setprop_string(blob, off, "status", "disabled");
+               if (ret)
+                       goto out;
+       }
+
        ph = fdt_getprop(blob, off, phy, NULL);
        if (ph == NULL) {
                printf("Failed to find '%s' phandle in node '%s'\n", phy,
@@ -212,12 +223,19 @@ void karo_fdt_fixup_usb_otg(void *blob, const char *node, const char *phy)
                        phy, fdt32_to_cpu(*ph));
                goto out;
        }
-       ret = fdt_setprop_string(blob, off, "status", "disabled");
 
+       if (disable_otg) {
+               debug("Disabling usbphy\n");
+               ret = fdt_setprop_string(blob, off, "status", "disabled");
+       } else {
+               debug("Removing host pins from usbphy\n");
+               ret = fdt_delprop(blob, off, "pinctrl-0");
+       }
 out:
        if (ret)
                printf("Failed to update usbotg: %d\n", ret);
-       printf("node '%s' updated\n", node);
+       else
+               debug("node '%s' updated\n", node);
        karo_set_fdtsize(blob);
 }
 
index 622522dedc3de38eedb02fc46ecf777c6902f42e..c56876b76698f70664f260ab521f3ad3dc2674b6 100644 (file)
@@ -115,8 +115,16 @@ static inline void random_init(void)
        }
 }
 
+#define RTC_PERSISTENT0_CLK32_MASK     (RTC_PERSISTENT0_CLOCKSOURCE |  \
+                                       RTC_PERSISTENT0_XTAL32KHZ_PWRUP)
+static u32 boot_cause __attribute__((section("data")));
+
 int board_early_init_f(void)
 {
+       struct mxs_rtc_regs *rtc_regs = (void *)MXS_RTC_BASE;
+       u32 rtc_stat;
+       int timeout = 5000;
+
        random_init();
 
        /* IO0 clock at 480MHz */
@@ -131,6 +139,25 @@ int board_early_init_f(void)
 
        gpio_request_array(tx28_gpios, ARRAY_SIZE(tx28_gpios));
        mxs_iomux_setup_multiple_pads(tx28_pads, ARRAY_SIZE(tx28_pads));
+
+       while ((rtc_stat = readl(&rtc_regs->hw_rtc_stat)) &
+               RTC_STAT_STALE_REGS_PERSISTENT0) {
+               if (timeout-- < 0)
+                       return 0;
+               udelay(1);
+       }
+       boot_cause = readl(&rtc_regs->hw_rtc_persistent0);
+       if ((boot_cause & RTC_PERSISTENT0_CLK32_MASK) !=
+               RTC_PERSISTENT0_CLK32_MASK) {
+               if (boot_cause & RTC_PERSISTENT0_CLOCKSOURCE)
+                       goto rtc_err;
+               writel(RTC_PERSISTENT0_CLK32_MASK,
+                       &rtc_regs->hw_rtc_persistent0_set);
+       }
+       return 0;
+
+rtc_err:
+       serial_puts("Inconsistent value in RTC_PERSISTENT0 register; power-on-reset required\n");
        return 0;
 }
 
@@ -742,9 +769,85 @@ int board_late_init(void)
        return 0;
 }
 
+#define BOOT_CAUSE_MASK                (RTC_PERSISTENT0_EXTERNAL_RESET |       \
+                               RTC_PERSISTENT0_ALARM_WAKE |            \
+                               RTC_PERSISTENT0_THERMAL_RESET)
+
+static void thermal_init(void)
+{
+       struct mxs_power_regs *power_regs = (void *)MXS_POWER_BASE;
+       struct mxs_clkctrl_regs *clkctrl_regs = (void *)MXS_CLKCTRL_BASE;
+
+       writel(POWER_THERMAL_LOW_POWER | POWER_THERMAL_OFFSET_ADJ_ENABLE |
+               POWER_THERMAL_OFFSET_ADJ_OFFSET(3),
+               &power_regs->hw_power_thermal);
+
+       writel(CLKCTRL_RESET_EXTERNAL_RESET_ENABLE |
+               CLKCTRL_RESET_THERMAL_RESET_ENABLE,
+               &clkctrl_regs->hw_clkctrl_reset);
+}
+
 int checkboard(void)
 {
-       printf("Board: Ka-Ro TX28-4%sxx\n", TX28_MOD_SUFFIX);
+       struct mxs_power_regs *power_regs = (void *)MXS_POWER_BASE;
+       u32 pwr_sts = readl(&power_regs->hw_power_sts);
+       u32 pwrup_src = (pwr_sts >> 24) & 0x3f;
+       const char *dlm = "";
+
+       printf("Board: Ka-Ro TX28-4%sx%d\n", TX28_MOD_SUFFIX,
+               CONFIG_SDRAM_SIZE / SZ_128M);
+
+       printf("POWERUP Source: ");
+       if (pwrup_src & (3 << 0)) {
+               printf("%sPSWITCH %s voltage", dlm,
+                       pwrup_src & (1 << 1) ? "HIGH" : "MID");
+               dlm = " | ";
+       }
+       if (pwrup_src & (1 << 4)) {
+               printf("%sRTC", dlm);
+               dlm = " | ";
+       }
+       if (pwrup_src & (1 << 5)) {
+               printf("%s5V", dlm);
+               dlm = " | ";
+       }
+       printf("\n");
+
+       if (boot_cause & BOOT_CAUSE_MASK) {
+               dlm="";
+               printf("Last boot cause: ");
+               if (boot_cause & RTC_PERSISTENT0_EXTERNAL_RESET) {
+                       printf("%sEXTERNAL", dlm);
+                       dlm = " | ";
+               }
+               if (boot_cause & RTC_PERSISTENT0_THERMAL_RESET) {
+                       printf("%sTHERMAL", dlm);
+                       dlm = " | ";
+               }
+               if (*dlm != '\0')
+                       printf(" RESET");
+               if (boot_cause & RTC_PERSISTENT0_ALARM_WAKE) {
+                       printf("%sALARM WAKE", dlm);
+                       dlm = " | ";
+               }
+               printf("\n");
+       }
+
+       while (pwr_sts & POWER_STS_THERMAL_WARNING) {
+               static int first = 1;
+
+               if (first) {
+                       printf("CPU too hot to boot\n");
+                       first = 0;
+               }
+               if (tstc())
+                       break;
+               pwr_sts = readl(&power_regs->hw_power_sts);
+       }
+
+       if (!(boot_cause & RTC_PERSISTENT0_THERMAL_RESET))
+               thermal_init();
+
        return 0;
 }
 
@@ -753,16 +856,85 @@ int checkboard(void)
 #include <jffs2/jffs2.h>
 #include <mtd_node.h>
 struct node_info tx28_nand_nodes[] = {
-       { "gpmi-nand", MTD_DEV_TYPE_NAND, },
+       { "fsl,imx28-gpmi-nand", MTD_DEV_TYPE_NAND, },
 };
 #else
 #define fdt_fixup_mtdparts(b,n,c) do { } while (0)
 #endif
 
-static void tx28_fixup_flexcan(void *blob)
+static int flexcan_enabled(void *blob)
 {
-       karo_fdt_del_prop(blob, "fsl,imx28-flexcan", 0x80032000, "transceiver-switch");
-       karo_fdt_del_prop(blob, "fsl,imx28-flexcan", 0x80034000, "transceiver-switch");
+       const char *status;
+       int off = fdt_path_offset(blob, "can0");
+
+       if (off < 0) {
+               printf("node 'can0' not found\n");
+       } else {
+               status = fdt_getprop(blob, off, "status", NULL);
+               if (status && strcmp(status, "okay") == 0) {
+                       printf("can0 is enabled\n");
+                       return 1;
+               }
+       }
+       off = fdt_path_offset(blob, "can1");
+       if (off < 0) {
+               printf("node 'can1' not found\n");
+               return 0;
+       }
+       status = fdt_getprop(blob, off, "status", NULL);
+       if (status && strcmp(status, "okay") == 0) {
+               printf("can1 is enabled\n");
+               return 1;
+       }
+       printf("can driver disabled\n");
+       return 0;
+}
+
+static void tx28_set_lcd_pins(void *blob, const char *name)
+{
+       int off = fdt_path_offset(blob, name);
+       u32 ph;
+       const struct fdt_property *pc;
+       int len;
+
+       if (off < 0)
+               return;
+
+       ph = fdt32_to_cpu(fdt_create_phandle(blob, off));
+       if (!ph)
+               return;
+
+       off = fdt_path_offset(blob, "lcdif");
+       if (off < 0)
+               return;
+
+       pc = fdt_get_property(blob, off, "pinctrl-0", &len);
+       if (!pc || len < sizeof(ph))
+               return;
+
+       memcpy((void *)pc->data, &ph, sizeof(ph));
+       fdt_setprop(blob, off, "pinctrl-0", pc->data, len);
+}
+
+static void tx28_fixup_flexcan(void *blob, int stk5_v5)
+{
+       const char *can_xcvr = "disabled";
+
+       if (stk5_v5) {
+               if (flexcan_enabled(blob)) {
+                       tx28_set_lcd_pins(blob, "lcdif_23bit_pins_a");
+                       can_xcvr = "okay";
+               } else {
+                       tx28_set_lcd_pins(blob, "lcdif_24bit_pins_a");
+               }
+       } else {
+               const char *otg_mode = getenv("otg_mode");
+
+               if (otg_mode && (strcmp(otg_mode, "host") == 0))
+                       karo_fdt_enable_node(blob, "can1", 0);
+       }
+       fdt_find_and_setprop(blob, "/regulators/can-xcvr", "status",
+                       can_xcvr, strlen(can_xcvr) + 1, 1);
 }
 
 static void tx28_fixup_fec(void *blob)
@@ -773,6 +945,7 @@ static void tx28_fixup_fec(void *blob)
 void ft_board_setup(void *blob, bd_t *bd)
 {
        const char *baseboard = getenv("baseboard");
+       int stk5_v5 = baseboard != NULL && (strcmp(baseboard, "stk5-v5") == 0);
 
 #ifdef CONFIG_TX28_S
        /* TX28-41xx (aka TX28S) has no external RTC
@@ -781,20 +954,12 @@ void ft_board_setup(void *blob, bd_t *bd)
        karo_fdt_remove_node(blob, "ds1339");
        karo_fdt_remove_node(blob, "gpio5");
 #endif
-       if (baseboard != NULL && strcmp(baseboard, "stk5-v5") == 0) {
+       if (stk5_v5) {
                karo_fdt_remove_node(blob, "stk5led");
        } else {
-               tx28_fixup_flexcan(blob);
                tx28_fixup_fec(blob);
        }
-
-       if (baseboard != NULL && strcmp(baseboard, "stk5-v3") == 0) {
-               const char *otg_mode = getenv("otg_mode");
-
-               if (otg_mode && (strcmp(otg_mode, "device") == 0 ||
-                                       strcmp(otg_mode, "gadget") == 0))
-                       karo_fdt_enable_node(blob, "can1", 0);
-       }
+       tx28_fixup_flexcan(blob, stk5_v5);
 
        fdt_fixup_mtdparts(blob, tx28_nand_nodes, ARRAY_SIZE(tx28_nand_nodes));
        fdt_fixup_ethernet(blob);
index 85b204df6a3598f6d3c011613028592fb8834500..ba8d961aacd1d7955f0c38ca9a41b76818d54057 100644 (file)
@@ -15,7 +15,6 @@
 #define SDRAM_SIZE             PHYS_SDRAM_1_SIZE
 #endif
 
-#define REG_CCOSR              0x60
 
 #define REG_CCGR0              0x68
 #define REG_CCGR1              0x6c
@@ -383,10 +382,7 @@ dcd_start:
        MXC_DCD_ITEM(CCM_BASE_ADDR + REG_CCGR6, 0x0f00030f)
        MXC_DCD_ITEM(CCM_BASE_ADDR + REG_CCGR7, 0xfff00000)
        MXC_DCD_ITEM(CCM_BASE_ADDR + REG_CMEOR, 0x00000000)
-#if 1
-       MXC_DCD_ITEM(CCM_BASE_ADDR + REG_CCOSR, (1 << 24) | (0xe << 16))
-       MXC_DCD_ITEM(IOMUXC_BASE_ADDR + 0x320, 0x4)     /* GPIO_3 => CLKO2 */
-#endif
+
        MXC_DCD_ITEM(IOMUXC_BASE_ADDR + 0x340, 0x11)    /* GPIO_17 => RESET_OUT */
 
        MXC_DCD_ITEM(0x63fd800c, 0x00000000)    /* M4IF: MUX NFC signals on WEIM */
index 95f0b6d9a90822100647eb9858f9ea5f89dca71d..e358faa608d9596f0f09d056b1fc2985393a0e4e 100644 (file)
@@ -3,8 +3,6 @@
 #include <asm/arch/imx-regs.h>
 #include <generated/asm-offsets.h>
 
-//#define DO_WL_CALIB
-
 #ifndef CCM_CCR
 #error asm-offsets not included
 #endif
index 3a9edd6468c3b47d06fb51018be99651e51077c7..e17c3f1d51b83ddc51eb1023e0d87d9a0e79cf12 100644 (file)
@@ -992,7 +992,7 @@ static char fdt_help_text[] =
        "fdt rsvmem delete <index>           - Delete a mem reserves\n"
        "fdt chosen [<start> <end>]          - Add/update the /chosen branch in the tree\n"
        "                                        <start>/<end> - initrd start/end addr\n"
-       "NOTE: Dereference aliases by omiting the leading '/', "
+       "NOTE: Dereference aliases by omitting the leading '/', "
                "e.g. fdt print ethernet0.";
 #endif
 
index 8ba13160c44b4a35f728b9b49c79c0b319af98e3..0a8835e83cab3068cc7b0a453c741b723695be41 100644 (file)
@@ -1074,6 +1074,7 @@ int lcd_display_bitmap(ulong bmp_image, int x, int y)
                                fb[2] = *bmap++; /* R */
                                fb += 4;
                        }
+                       bmap += (padded_width - width) * 4;
                        fb -= lcd_line_length + width * (bpix / 8);
                }
                break;
index 55482dd33654445b41fc2a39bab444f6a3791bd9..e64288ab8c1dd7e978691930fbbff65241b0dbf8 100644 (file)
@@ -274,7 +274,6 @@ esdhc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd, struct mmc_data *data)
        if (cmd->cmdidx == MMC_CMD_STOP_TRANSMISSION)
                return 0;
 #endif
-
        esdhc_write32(&regs->irqstat, -1);
 
        sync();
index c6dfd3931be41edd2e0a4d758730fa67f17cb122..67d6b6862554c8150aea1b3c3786a58e5b0c424a 100644 (file)
@@ -215,12 +215,12 @@ void mmc_init_stream(struct hsmmc *mmc_base)
 
 static int mmc_init_setup(struct mmc *mmc)
 {
-       struct hsmmc *mmc_base;
+       struct omap_hsmmc_data *priv_data = mmc->priv;
+       struct hsmmc *mmc_base = priv_data->base_addr;
        unsigned int reg_val;
        unsigned int dsor;
        ulong start;
 
-       mmc_base = ((struct omap_hsmmc_data *)mmc->priv)->base_addr;
        mmc_board_init(mmc);
 
        writel(readl(&mmc_base->sysconfig) | MMC_SOFTRESET,
@@ -301,11 +301,11 @@ static void mmc_reset_controller_fsm(struct hsmmc *mmc_base, u32 bit)
 static int mmc_send_cmd(struct mmc *mmc, struct mmc_cmd *cmd,
                        struct mmc_data *data)
 {
-       struct hsmmc *mmc_base;
+       struct omap_hsmmc_data *priv_data = mmc->priv;
+       struct hsmmc *mmc_base = priv_data->base_addr;
        unsigned int flags, mmc_stat;
        ulong start;
 
-       mmc_base = ((struct omap_hsmmc_data *)mmc->priv)->base_addr;
        start = get_timer(0);
        while ((readl(&mmc_base->pstate) & (DATI_MASK | CMDI_MASK)) != 0) {
                if (get_timer(start) > MAX_RETRY_MS) {
@@ -528,11 +528,11 @@ static int mmc_write_data(struct hsmmc *mmc_base, const char *buf,
 
 static void mmc_set_ios(struct mmc *mmc)
 {
-       struct hsmmc *mmc_base;
+       struct omap_hsmmc_data *priv_data = mmc->priv;
+       struct hsmmc *mmc_base = priv_data->base_addr;
        unsigned int dsor = 0;
        ulong start;
 
-       mmc_base = ((struct omap_hsmmc_data *)mmc->priv)->base_addr;
        /* configue bus width */
        switch (mmc->bus_width) {
        case 8:
index 57f4e796402d34e0560bc28bd4063611395a14f3..f4528f20bd377d1c053611e7e75cdc617e5c950c 100644 (file)
@@ -130,10 +130,6 @@ static int is_16bit_nand(void)
 #define NFC_VERSION            "unknown"
 #endif
 
-#ifndef CONFIG_MXC_NAND_IP_REGS_BASE
-#define CONFIG_MXC_NAND_IP_REGS_BASE   0
-#endif
-
 /* Addresses for NFC registers */
 #define NFC_V1_V2_BUF_SIZE             (host->regs + 0x00)
 #define NFC_V1_V2_BUF_ADDR             (host->regs + 0x04)
index c36c6f9d235dea14a251820167102791638d97fd..b621f8f00b672658269ad7f7f4e1440f22f4cc05 100644 (file)
@@ -508,6 +508,7 @@ static int fec_open(struct eth_device *edev)
        {
                u32 ecr = readl(&fec->eth->ecntrl) & ~FEC_ECNTRL_SPEED;
                u32 rcr = readl(&fec->eth->r_cntrl) & ~FEC_RCNTRL_RMII_10T;
+
                if (speed == _1000BASET)
                        ecr |= FEC_ECNTRL_SPEED;
                else if (speed != _100BASET)
index dd050daea3c5dcefa8b1b61184caa277d18ac70f..98a8003f81a4eaebd39fb98956057548648da397 100644 (file)
@@ -266,7 +266,6 @@ static int ipu_pixel_clk_set_parent(struct clk *clk, struct clk *parent)
        if (ret)
                goto err;
        __raw_writel(di_gen, DI_GENERAL(clk->id));
-debug("%s@%d:\n", __func__, __LINE__);
        ipu_pixel_clk_recalc(clk);
        clk->disable(clk->parent);
        clk->parent = parent;
index d7232ad1d62be8baf8131e6d79c3b211a90d25f0..6a147d5186af55d5a0cbccdff9cfd5c772154d7b 100644 (file)
@@ -11,6 +11,7 @@
  * SPDX-License-Identifier:    GPL-2.0+
  */
 
+/* #define DEBUG */
 #include <common.h>
 #include <asm/errno.h>
 #include <linux/string.h>
index 0ee481440c8a6def0a92a93bb07b030b7c916eaa..64f42e023b2e80c1469fb474c1105366bb37fea7 100644 (file)
@@ -10,8 +10,8 @@
  *
  */
 
-#ifndef __CONFIGS_TX48_H
-#define __CONFIGS_TX48_H
+#ifndef __CONFIG_H
+#define __CONFIG_H
 
 #include <asm/sizes.h>
 
 #define CONFIG_SYS_SPL_MALLOC_START    (PHYS_SDRAM_1 + SZ_2M + SZ_32K)
 #define CONFIG_SYS_SPL_MALLOC_SIZE     SZ_1M
 
-#endif /* __CONFIGS_TX48_H */
+#endif /* __CONFIG_H */
index e0fde5cd18a3319aa1861ecbe57a0ebbe8bbc6e4..5005a47ebc949f193b72134b2f67ed7d46e81f19 100644 (file)
@@ -4,10 +4,11 @@
  * SPDX-License-Identifier:      GPL-2.0
  *
  */
-#ifndef __CONFIGS_TX51_H
-#define __CONFIGS_TX51_H
 
-#define CONFIG_MX51                            /* must be set before including imx-regs.h */
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+#define CONFIG_MX51                    /* must be set before including imx-regs.h */
 
 #include <asm/sizes.h>
 #include <asm/arch/imx-regs.h>
@@ -16,7 +17,7 @@
  * Ka-Ro TX51 board - SoC configuration
  */
 #define CONFIG_SYS_MX5_IOMUX_V3
-#define CONFIG_MXC_GPIO                                /* GPIO control */
+#define CONFIG_MXC_GPIO                        /* GPIO control */
 #define CONFIG_SYS_MX5_HCLK            24000000
 #define CONFIG_SYS_DDR_CLKSEL          0
 #define CONFIG_SYS_HZ                  1000    /* Ticks per second */
  */
 #include <config_cmd_default.h>
 #define CONFIG_CMD_CACHE
-#if 0
-#define CONFIG_CMD_IIM
-#endif
 #define CONFIG_CMD_MMC
 #define CONFIG_CMD_NAND
 #define CONFIG_CMD_MTDPARTS
 #define CONFIG_MTD_DEVICE
 #define CONFIG_ENV_IS_IN_NAND
 #define CONFIG_NAND_MXC
-#define CONFIG_MXC_NAND_REGS_BASE      NFC_BASE_ADDR_AXI // 0xcfff0000
-#define CONFIG_MXC_NAND_IP_REGS_BASE   NFC_BASE_ADDR // 0x83fdb000
+#define CONFIG_MXC_NAND_REGS_BASE      NFC_BASE_ADDR_AXI
+#define CONFIG_MXC_NAND_IP_REGS_BASE   NFC_BASE_ADDR
 #define CONFIG_MXC_NAND_HWECC
 #define CONFIG_CMD_NAND_TRIMFFS
 #define CONFIG_SYS_MAX_FLASH_SECT      1024
 #define CONFIG_FSL_IIM
 #endif
 
-#endif /* __CONFIGS_TX51_H */
+#endif /* __CONFIG_H */
index 8044fd09b2a321ec695b1906aca9881e41c3a75a..3b2eb240f37869c0afa1bcb95166a7e95466ab5b 100644 (file)
@@ -5,10 +5,10 @@
  *
  */
 
-#ifndef __CONFIGS_TX53_H
-#define __CONFIGS_TX53_H
+#ifndef __CONFIG_H
+#define __CONFIG_H
 
-#define CONFIG_MX53                            /* must be set before including imx-regs.h */
+#define CONFIG_MX53                    /* must be set before including imx-regs.h */
 
 #include <asm/sizes.h>
 #include <asm/arch/imx-regs.h>
@@ -16,9 +16,9 @@
 /*
  * Ka-Ro TX53 board - SoC configuration
  */
-#define CONFIG_TX53                            /* TX53 SoM */
+#define CONFIG_TX53                    /* TX53 SoM */
 #define CONFIG_SYS_MX5_IOMUX_V3
-#define CONFIG_MXC_GPIO                                /* GPIO control */
+#define CONFIG_MXC_GPIO                        /* GPIO control */
 #define CONFIG_SYS_MX5_HCLK            24000000
 #define CONFIG_SYS_DDR_CLKSEL          0
 #define CONFIG_SYS_HZ                  1000    /* Ticks per second */
  */
 #include <config_cmd_default.h>
 #define CONFIG_CMD_CACHE
-#if 0
-#define CONFIG_CMD_IIM
-#endif
 #define CONFIG_CMD_MMC
 #define CONFIG_CMD_NAND
 #define CONFIG_CMD_MTDPARTS
 #define CONFIG_MTD_DEVICE
 #define CONFIG_ENV_IS_IN_NAND
 #define CONFIG_NAND_MXC
-#define CONFIG_MXC_NAND_REGS_BASE      NFC_BASE_ADDR_AXI // 0xf7ff0000
-#define CONFIG_MXC_NAND_IP_REGS_BASE   NFC_BASE_ADDR // 0x63fdb000
+#define CONFIG_MXC_NAND_REGS_BASE      NFC_BASE_ADDR_AXI
+#define CONFIG_MXC_NAND_IP_REGS_BASE   NFC_BASE_ADDR
 #define CONFIG_MXC_NAND_HWECC
 #define CONFIG_CMD_NAND_TRIMFFS
 #define CONFIG_SYS_MAX_FLASH_SECT      1024
 #define CONFIG_MMC
 #define CONFIG_GENERIC_MMC
 #define CONFIG_FSL_ESDHC
-#if 0
-#define CONFIG_SYS_FSL_ESDHC_USE_PIO
-#endif
 #define CONFIG_SYS_FSL_ESDHC_ADDR      0
 #define CONFIG_SYS_FSL_ESDHC_NUM       2
 
 #define CONFIG_FSL_IIM
 #endif
 
-#endif /* __CONFIGS_TX53_H */
+#endif /* __CONFIG_H */
index a9a50113870505241ca8b83d0e958d8f6ca334b3..24058cb25965590140a48ff293f6f6c55da460c8 100644 (file)
@@ -5,8 +5,8 @@
  *
  */
 
-#ifndef __TX6_H
-#define __TX6_H
+#ifndef __CONFIG_H
+#define __CONFIG_H
 
 #include <asm/sizes.h>
 #include <asm/arch/imx-regs.h>
 #define CONFIG_SYS_INIT_SP_ADDR                (CONFIG_SYS_SDRAM_BASE + 0x1000 - /* Fix this */ \
                                        GENERATED_GBL_DATA_SIZE)
 
-#endif /* __CONFIGS_TX6_H */
+#endif /* __CONFIG_H */