uboot/board/freescale/ls1012ardb/ls1012ardb.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * Copyright 2016 Freescale Semiconductor, Inc.
   4 */
   5
   6#include <common.h>
   7#include <command.h>
   8#include <fdt_support.h>
   9#include <hang.h>
  10#include <i2c.h>
  11#include <asm/cache.h>
  12#include <init.h>
  13#include <asm/global_data.h>
  14#include <asm/io.h>
  15#include <asm/arch/clock.h>
  16#include <asm/arch/fsl_serdes.h>
  17#ifdef CONFIG_FSL_LS_PPA
  18#include <asm/arch/ppa.h>
  19#endif
  20#include <asm/arch/mmu.h>
  21#include <asm/arch/soc.h>
  22#include <hwconfig.h>
  23#include <ahci.h>
  24#include <mmc.h>
  25#include <scsi.h>
  26#include <fsl_esdhc.h>
  27#include <env_internal.h>
  28#include <fsl_mmdc.h>
  29#include <netdev.h>
  30#include <fsl_sec.h>
  31#include <net/pfe_eth/pfe/pfe_hw.h>
  32
  33DECLARE_GLOBAL_DATA_PTR;
  34
  35#define BOOT_FROM_UPPER_BANK    0x2
  36#define BOOT_FROM_LOWER_BANK    0x1
  37
  38int checkboard(void)
  39{
  40#ifdef CONFIG_TARGET_LS1012ARDB
  41        u8 in1;
  42        int ret, bus_num = 0;
  43
  44        puts("Board: LS1012ARDB ");
  45
  46        /* Initialize i2c early for Serial flash bank information */
  47#if CONFIG_IS_ENABLED(DM_I2C)
  48        struct udevice *dev;
  49
  50        ret = i2c_get_chip_for_busnum(bus_num, I2C_MUX_IO_ADDR,
  51                                      1, &dev);
  52        if (ret) {
  53                printf("%s: Cannot find udev for a bus %d\n", __func__,
  54                       bus_num);
  55                return -ENXIO;
  56        }
  57        ret = dm_i2c_read(dev, I2C_MUX_IO_1, &in1, 1);
  58#else /* Non DM I2C support - will be removed */
  59        i2c_set_bus_num(bus_num);
  60        ret = i2c_read(I2C_MUX_IO_ADDR, I2C_MUX_IO_1, 1, &in1, 1);
  61#endif
  62        if (ret < 0) {
  63                printf("Error reading i2c boot information!\n");
  64                return 0; /* Don't want to hang() on this error */
  65        }
  66
  67        puts("Version");
  68        switch (in1 & SW_REV_MASK) {
  69        case SW_REV_A:
  70                puts(": RevA");
  71                break;
  72        case SW_REV_B:
  73                puts(": RevB");
  74                break;
  75        case SW_REV_C:
  76                puts(": RevC");
  77                break;
  78        case SW_REV_C1:
  79                puts(": RevC1");
  80                break;
  81        case SW_REV_C2:
  82                puts(": RevC2");
  83                break;
  84        case SW_REV_D:
  85                puts(": RevD");
  86                break;
  87        case SW_REV_E:
  88                puts(": RevE");
  89                break;
  90        default:
  91                puts(": unknown");
  92                break;
  93        }
  94
  95        printf(", boot from QSPI");
  96        if ((in1 & SW_BOOT_MASK) == SW_BOOT_EMU)
  97                puts(": emu\n");
  98        else if ((in1 & SW_BOOT_MASK) == SW_BOOT_BANK1)
  99                puts(": bank1\n");
 100        else if ((in1 & SW_BOOT_MASK) == SW_BOOT_BANK2)
 101                puts(": bank2\n");
 102        else
 103                puts("unknown\n");
 104#else
 105
 106        puts("Board: LS1012A2G5RDB ");
 107#endif
 108        return 0;
 109}
 110
 111#ifdef CONFIG_TFABOOT
 112int dram_init(void)
 113{
 114        gd->ram_size = tfa_get_dram_size();
 115        if (!gd->ram_size)
 116                gd->ram_size = CONFIG_SYS_SDRAM_SIZE;
 117
 118        return 0;
 119}
 120#else
 121int dram_init(void)
 122{
 123#ifndef CONFIG_TFABOOT
 124        static const struct fsl_mmdc_info mparam = {
 125                0x05180000,     /* mdctl */
 126                0x00030035,     /* mdpdc */
 127                0x12554000,     /* mdotc */
 128                0xbabf7954,     /* mdcfg0 */
 129                0xdb328f64,     /* mdcfg1 */
 130                0x01ff00db,     /* mdcfg2 */
 131                0x00001680,     /* mdmisc */
 132                0x0f3c8000,     /* mdref */
 133                0x00002000,     /* mdrwd */
 134                0x00bf1023,     /* mdor */
 135                0x0000003f,     /* mdasp */
 136                0x0000022a,     /* mpodtctrl */
 137                0xa1390003,     /* mpzqhwctrl */
 138        };
 139
 140        mmdc_init(&mparam);
 141#endif
 142
 143        gd->ram_size = CONFIG_SYS_SDRAM_SIZE;
 144#if !defined(CONFIG_SPL) || defined(CONFIG_SPL_BUILD)
 145        /* This will break-before-make MMU for DDR */
 146        update_early_mmu_table();
 147#endif
 148
 149        return 0;
 150}
 151#endif
 152
 153
 154int board_early_init_f(void)
 155{
 156        fsl_lsch2_early_init_f();
 157
 158        return 0;
 159}
 160
 161int board_init(void)
 162{
 163        struct ccsr_cci400 *cci = (struct ccsr_cci400 *)(CONFIG_SYS_IMMR +
 164                                        CONFIG_SYS_CCI400_OFFSET);
 165        /*
 166         * Set CCI-400 control override register to enable barrier
 167         * transaction
 168         */
 169        if (current_el() == 3)
 170                out_le32(&cci->ctrl_ord, CCI400_CTRLORD_EN_BARRIER);
 171
 172#ifdef CONFIG_SYS_FSL_ERRATUM_A010315
 173        erratum_a010315();
 174#endif
 175
 176#ifdef CONFIG_ENV_IS_NOWHERE
 177        gd->env_addr = (ulong)&default_environment[0];
 178#endif
 179
 180#ifdef CONFIG_FSL_CAAM
 181        sec_init();
 182#endif
 183
 184#ifdef CONFIG_FSL_LS_PPA
 185        ppa_init();
 186#endif
 187        return 0;
 188}
 189
 190#ifdef CONFIG_FSL_PFE
 191void board_quiesce_devices(void)
 192{
 193        pfe_command_stop(0, NULL);
 194}
 195#endif
 196
 197#ifdef CONFIG_TARGET_LS1012ARDB
 198int esdhc_status_fixup(void *blob, const char *compat)
 199{
 200        char esdhc1_path[] = "/soc/esdhc@1580000";
 201        bool sdhc2_en = false;
 202        u8 mux_sdhc2;
 203        u8 io = 0;
 204        int ret, bus_num = 0;
 205
 206#if CONFIG_IS_ENABLED(DM_I2C)
 207        struct udevice *dev;
 208
 209        ret = i2c_get_chip_for_busnum(bus_num, I2C_MUX_IO_ADDR,
 210                                      1, &dev);
 211        if (ret) {
 212                printf("%s: Cannot find udev for a bus %d\n", __func__,
 213                       bus_num);
 214                return -ENXIO;
 215        }
 216        ret = dm_i2c_read(dev, I2C_MUX_IO_1, &io, 1);
 217#else
 218        i2c_set_bus_num(bus_num);
 219        /* IO1[7:3] is the field of board revision info. */
 220        ret = i2c_read(I2C_MUX_IO_ADDR, I2C_MUX_IO_1, 1, &io, 1);
 221#endif
 222        if (ret < 0) {
 223                printf("Error reading i2c boot information!\n");
 224                return 0;
 225        }
 226
 227        /* hwconfig method is used for RevD and later versions. */
 228        if ((io & SW_REV_MASK) <= SW_REV_D) {
 229#ifdef CONFIG_HWCONFIG
 230                if (hwconfig("esdhc1"))
 231                        sdhc2_en = true;
 232#endif
 233        } else {
 234                /*
 235                 * The I2C IO-expander for mux select is used to control
 236                 * the muxing of various onboard interfaces.
 237                 *
 238                 * IO0[3:2] indicates SDHC2 interface demultiplexer
 239                 * select lines.
 240                 *      00 - SDIO wifi
 241                 *      01 - GPIO (to Arduino)
 242                 *      10 - eMMC Memory
 243                 *      11 - SPI
 244                 */
 245#if CONFIG_IS_ENABLED(DM_I2C)
 246                ret = dm_i2c_read(dev, I2C_MUX_IO_0, &io, 1);
 247#else
 248                ret = i2c_read(I2C_MUX_IO_ADDR, I2C_MUX_IO_0, 1, &io, 1);
 249#endif
 250                if (ret < 0) {
 251                        printf("Error reading i2c boot information!\n");
 252                        return 0;
 253                }
 254
 255                mux_sdhc2 = (io & 0x0c) >> 2;
 256                /* Enable SDHC2 only when use SDIO wifi and eMMC */
 257                if (mux_sdhc2 == 2 || mux_sdhc2 == 0)
 258                        sdhc2_en = true;
 259        }
 260        if (sdhc2_en)
 261                do_fixup_by_path(blob, esdhc1_path, "status", "okay",
 262                                 sizeof("okay"), 1);
 263        else
 264                do_fixup_by_path(blob, esdhc1_path, "status", "disabled",
 265                                 sizeof("disabled"), 1);
 266        return 0;
 267}
 268#endif
 269
 270int ft_board_setup(void *blob, struct bd_info *bd)
 271{
 272        arch_fixup_fdt(blob);
 273
 274        ft_cpu_setup(blob, bd);
 275
 276        return 0;
 277}
 278
 279static int switch_to_bank1(void)
 280{
 281        u8 data = 0xf4, chip_addr = 0x24, offset_addr = 0x03;
 282        int ret, bus_num = 0;
 283
 284#if CONFIG_IS_ENABLED(DM_I2C)
 285        struct udevice *dev;
 286
 287        ret = i2c_get_chip_for_busnum(bus_num, chip_addr,
 288                                      1, &dev);
 289        if (ret) {
 290                printf("%s: Cannot find udev for a bus %d\n", __func__,
 291                       bus_num);
 292                return -ENXIO;
 293        }
 294        /*
 295         * --------------------------------------------------------------------
 296         * |bus |I2C address|       Device     |          Notes               |
 297         * --------------------------------------------------------------------
 298         * |I2C1|0x24, 0x25,| IO expander (CFG,| Provides 16bits of General   |
 299         * |    |0x26       | RESET, and INT/  | Purpose parallel Input/Output|
 300         * |    |           | KW41GPIO) - NXP  | (GPIO) expansion for the     |
 301         * |    |           | PCAL9555AHF      | I2C bus                      |
 302         * ----- --------------------------------------------------------------
 303         * - mount three IO expander(PCAL9555AHF) on I2C1
 304         *
 305         * PCAL9555A device address
 306         *           slave address
 307         *  --------------------------------------
 308         *  | 0 | 1 | 0 | 0 | A2 | A1 | A0 | R/W |
 309         *  --------------------------------------
 310         *  |     fixed     | hardware selectable|
 311         *
 312         * Output port 1(Pinter register bits = 0x03)
 313         *
 314         * P1_[7~0] = 0xf4
 315         * P1_0 <---> CFG_MUX_QSPI_S0
 316         * P1_1 <---> CFG_MUX_QSPI_S1
 317         * CFG_MUX_QSPI_S[1:0] = 0b00
 318         *
 319         * QSPI chip-select demultiplexer select
 320         * ---------------------------------------------------------------------
 321         * CFG_MUX_QSPI_S1|CFG_MUX_QSPI_S0|              Values
 322         * ---------------------------------------------------------------------
 323         *    0           | 0            |CS routed to SPI memory bank1(default)
 324         * ---------------------------------------------------------------------
 325         *    0           | 1             |CS routed to SPI memory bank2
 326         * ---------------------------------------------------------------------
 327         *
 328         */
 329        ret = dm_i2c_write(dev, offset_addr, &data, 1);
 330#else /* Non DM I2C support - will be removed */
 331        i2c_set_bus_num(bus_num);
 332        ret = i2c_write(chip_addr, offset_addr, 1, &data, 1);
 333#endif
 334
 335        if (ret) {
 336                printf("i2c write error to chip : %u, addr : %u, data : %u\n",
 337                       chip_addr, offset_addr, data);
 338        }
 339
 340        return ret;
 341}
 342
 343static int switch_to_bank2(void)
 344{
 345        u8 data[2] = {0xfc, 0xf5}, offset_addr[2] = {0x7, 0x3};
 346        u8 chip_addr = 0x24;
 347        int ret, i, bus_num = 0;
 348
 349#if CONFIG_IS_ENABLED(DM_I2C)
 350        struct udevice *dev;
 351
 352        ret = i2c_get_chip_for_busnum(bus_num, chip_addr,
 353                                      1, &dev);
 354        if (ret) {
 355                printf("%s: Cannot find udev for a bus %d\n", __func__,
 356                       bus_num);
 357                return -ENXIO;
 358        }
 359#else /* Non DM I2C support - will be removed */
 360        i2c_set_bus_num(bus_num);
 361#endif
 362
 363        /*
 364         * 1th step: config port 1
 365         *      - the port 1 pin is enabled as an output
 366         * 2th step: output port 1
 367         *      - P1_[7:0] output 0xf5,
 368         *        then CFG_MUX_QSPI_S[1:0] equal to 0b01,
 369         *        CS routed to SPI memory bank2
 370         */
 371        for (i = 0; i < sizeof(data); i++) {
 372#if CONFIG_IS_ENABLED(DM_I2C)
 373                ret = dm_i2c_write(dev, offset_addr[i], &data[i], 1);
 374#else /* Non DM I2C support - will be removed */
 375                ret = i2c_write(chip_addr, offset_addr[i], 1, &data[i], 1);
 376#endif
 377                if (ret) {
 378                        printf("i2c write error to chip : %u, addr : %u, data : %u\n",
 379                               chip_addr, offset_addr[i], data[i]);
 380                        goto err;
 381                }
 382        }
 383
 384err:
 385        return ret;
 386}
 387
 388static int convert_flash_bank(int bank)
 389{
 390        int ret = 0;
 391
 392        switch (bank) {
 393        case BOOT_FROM_UPPER_BANK:
 394                ret = switch_to_bank2();
 395                break;
 396        case BOOT_FROM_LOWER_BANK:
 397                ret = switch_to_bank1();
 398                break;
 399        default:
 400                ret = CMD_RET_USAGE;
 401                break;
 402        };
 403
 404        return ret;
 405}
 406
 407static int flash_bank_cmd(struct cmd_tbl *cmdtp, int flag, int argc,
 408                          char *const argv[])
 409{
 410        if (argc != 2)
 411                return CMD_RET_USAGE;
 412        if (strcmp(argv[1], "1") == 0)
 413                convert_flash_bank(BOOT_FROM_LOWER_BANK);
 414        else if (strcmp(argv[1], "2") == 0)
 415                convert_flash_bank(BOOT_FROM_UPPER_BANK);
 416        else
 417                return CMD_RET_USAGE;
 418
 419        return 0;
 420}
 421
 422U_BOOT_CMD(
 423        boot_bank, 2, 0, flash_bank_cmd,
 424        "Flash bank Selection Control",
 425        "bank[1-lower bank/2-upper bank] (e.g. boot_bank 1)"
 426);
 427