uboot/board/freescale/ls1046aqds/ls1046aqds.c
<<
>>
Prefs
   1/*
   2 * Copyright 2016 Freescale Semiconductor, Inc.
   3 *
   4 * SPDX-License-Identifier:     GPL-2.0+
   5 */
   6
   7#include <common.h>
   8#include <i2c.h>
   9#include <fdt_support.h>
  10#include <asm/io.h>
  11#include <asm/arch/clock.h>
  12#include <asm/arch/fsl_serdes.h>
  13#include <asm/arch/fdt.h>
  14#include <asm/arch/soc.h>
  15#include <ahci.h>
  16#include <hwconfig.h>
  17#include <mmc.h>
  18#include <scsi.h>
  19#include <fm_eth.h>
  20#include <fsl_csu.h>
  21#include <fsl_esdhc.h>
  22#include <fsl_ifc.h>
  23#include <spl.h>
  24
  25#include "../common/vid.h"
  26#include "../common/qixis.h"
  27#include "ls1046aqds_qixis.h"
  28
  29DECLARE_GLOBAL_DATA_PTR;
  30
  31enum {
  32        MUX_TYPE_GPIO,
  33};
  34
  35int checkboard(void)
  36{
  37        char buf[64];
  38#ifndef CONFIG_SD_BOOT
  39        u8 sw;
  40#endif
  41
  42        puts("Board: LS1046AQDS, boot from ");
  43
  44#ifdef CONFIG_SD_BOOT
  45        puts("SD\n");
  46#else
  47        sw = QIXIS_READ(brdcfg[0]);
  48        sw = (sw & QIXIS_LBMAP_MASK) >> QIXIS_LBMAP_SHIFT;
  49
  50        if (sw < 0x8)
  51                printf("vBank: %d\n", sw);
  52        else if (sw == 0x8)
  53                puts("PromJet\n");
  54        else if (sw == 0x9)
  55                puts("NAND\n");
  56        else if (sw == 0xF)
  57                printf("QSPI\n");
  58        else
  59                printf("invalid setting of SW%u\n", QIXIS_LBMAP_SWITCH);
  60#endif
  61
  62        printf("Sys ID: 0x%02x, Sys Ver: 0x%02x\n",
  63               QIXIS_READ(id), QIXIS_READ(arch));
  64
  65        printf("FPGA:  v%d (%s), build %d\n",
  66               (int)QIXIS_READ(scver), qixis_read_tag(buf),
  67               (int)qixis_read_minor());
  68
  69        return 0;
  70}
  71
  72bool if_board_diff_clk(void)
  73{
  74        u8 diff_conf = QIXIS_READ(brdcfg[11]);
  75
  76        return diff_conf & 0x40;
  77}
  78
  79unsigned long get_board_sys_clk(void)
  80{
  81        u8 sysclk_conf = QIXIS_READ(brdcfg[1]);
  82
  83        switch (sysclk_conf & 0x0f) {
  84        case QIXIS_SYSCLK_64:
  85                return 64000000;
  86        case QIXIS_SYSCLK_83:
  87                return 83333333;
  88        case QIXIS_SYSCLK_100:
  89                return 100000000;
  90        case QIXIS_SYSCLK_125:
  91                return 125000000;
  92        case QIXIS_SYSCLK_133:
  93                return 133333333;
  94        case QIXIS_SYSCLK_150:
  95                return 150000000;
  96        case QIXIS_SYSCLK_160:
  97                return 160000000;
  98        case QIXIS_SYSCLK_166:
  99                return 166666666;
 100        }
 101
 102        return 66666666;
 103}
 104
 105unsigned long get_board_ddr_clk(void)
 106{
 107        u8 ddrclk_conf = QIXIS_READ(brdcfg[1]);
 108
 109        if (if_board_diff_clk())
 110                return get_board_sys_clk();
 111        switch ((ddrclk_conf & 0x30) >> 4) {
 112        case QIXIS_DDRCLK_100:
 113                return 100000000;
 114        case QIXIS_DDRCLK_125:
 115                return 125000000;
 116        case QIXIS_DDRCLK_133:
 117                return 133333333;
 118        }
 119
 120        return 66666666;
 121}
 122
 123#ifdef CONFIG_LPUART
 124u32 get_lpuart_clk(void)
 125{
 126        return gd->bus_clk;
 127}
 128#endif
 129
 130int select_i2c_ch_pca9547(u8 ch)
 131{
 132        int ret;
 133
 134        ret = i2c_write(I2C_MUX_PCA_ADDR_PRI, 0, 1, &ch, 1);
 135        if (ret) {
 136                puts("PCA: failed to select proper channel\n");
 137                return ret;
 138        }
 139
 140        return 0;
 141}
 142
 143int dram_init(void)
 144{
 145        /*
 146         * When resuming from deep sleep, the I2C channel may not be
 147         * in the default channel. So, switch to the default channel
 148         * before accessing DDR SPD.
 149         */
 150        select_i2c_ch_pca9547(I2C_MUX_CH_DEFAULT);
 151        gd->ram_size = initdram(0);
 152
 153        return 0;
 154}
 155
 156int i2c_multiplexer_select_vid_channel(u8 channel)
 157{
 158        return select_i2c_ch_pca9547(channel);
 159}
 160
 161int board_early_init_f(void)
 162{
 163#ifdef CONFIG_HAS_FSL_XHCI_USB
 164        struct ccsr_scfg *scfg = (struct ccsr_scfg *)CONFIG_SYS_FSL_SCFG_ADDR;
 165        u32 usb_pwrfault;
 166#endif
 167#ifdef CONFIG_LPUART
 168        u8 uart;
 169#endif
 170
 171#ifdef CONFIG_SYS_I2C_EARLY_INIT
 172        i2c_early_init_f();
 173#endif
 174        fsl_lsch2_early_init_f();
 175
 176#ifdef CONFIG_HAS_FSL_XHCI_USB
 177        out_be32(&scfg->rcwpmuxcr0, 0x3333);
 178        out_be32(&scfg->usbdrvvbus_selcr, SCFG_USBDRVVBUS_SELCR_USB1);
 179        usb_pwrfault = (SCFG_USBPWRFAULT_DEDICATED <<
 180                        SCFG_USBPWRFAULT_USB3_SHIFT) |
 181                        (SCFG_USBPWRFAULT_DEDICATED <<
 182                        SCFG_USBPWRFAULT_USB2_SHIFT) |
 183                        (SCFG_USBPWRFAULT_SHARED <<
 184                        SCFG_USBPWRFAULT_USB1_SHIFT);
 185        out_be32(&scfg->usbpwrfault_selcr, usb_pwrfault);
 186#endif
 187
 188#ifdef CONFIG_LPUART
 189        /* We use lpuart0 as system console */
 190        uart = QIXIS_READ(brdcfg[14]);
 191        uart &= ~CFG_UART_MUX_MASK;
 192        uart |= CFG_LPUART_EN << CFG_UART_MUX_SHIFT;
 193        QIXIS_WRITE(brdcfg[14], uart);
 194#endif
 195
 196        return 0;
 197}
 198
 199#ifdef CONFIG_FSL_DEEP_SLEEP
 200/* determine if it is a warm boot */
 201bool is_warm_boot(void)
 202{
 203#define DCFG_CCSR_CRSTSR_WDRFR  (1 << 3)
 204        struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
 205
 206        if (in_be32(&gur->crstsr) & DCFG_CCSR_CRSTSR_WDRFR)
 207                return 1;
 208
 209        return 0;
 210}
 211#endif
 212
 213int config_board_mux(int ctrl_type)
 214{
 215        u8 reg14;
 216
 217        reg14 = QIXIS_READ(brdcfg[14]);
 218
 219        switch (ctrl_type) {
 220        case MUX_TYPE_GPIO:
 221                reg14 = (reg14 & (~0x6)) | 0x2;
 222                break;
 223        default:
 224                puts("Unsupported mux interface type\n");
 225                return -1;
 226        }
 227
 228        QIXIS_WRITE(brdcfg[14], reg14);
 229
 230        return 0;
 231}
 232
 233int config_serdes_mux(void)
 234{
 235        return 0;
 236}
 237
 238#ifdef CONFIG_MISC_INIT_R
 239int misc_init_r(void)
 240{
 241        if (hwconfig("gpio"))
 242                config_board_mux(MUX_TYPE_GPIO);
 243
 244        return 0;
 245}
 246#endif
 247
 248int board_init(void)
 249{
 250        select_i2c_ch_pca9547(I2C_MUX_CH_DEFAULT);
 251
 252#ifdef CONFIG_SYS_FSL_SERDES
 253        config_serdes_mux();
 254#endif
 255
 256#ifdef CONFIG_LAYERSCAPE_NS_ACCESS
 257        enable_layerscape_ns_access();
 258#endif
 259
 260        if (adjust_vdd(0))
 261                printf("Warning: Adjusting core voltage failed.\n");
 262
 263        return 0;
 264}
 265
 266#ifdef CONFIG_OF_BOARD_SETUP
 267int ft_board_setup(void *blob, bd_t *bd)
 268{
 269        u64 base[CONFIG_NR_DRAM_BANKS];
 270        u64 size[CONFIG_NR_DRAM_BANKS];
 271        u8 reg;
 272
 273        /* fixup DT for the two DDR banks */
 274        base[0] = gd->bd->bi_dram[0].start;
 275        size[0] = gd->bd->bi_dram[0].size;
 276        base[1] = gd->bd->bi_dram[1].start;
 277        size[1] = gd->bd->bi_dram[1].size;
 278
 279        fdt_fixup_memory_banks(blob, base, size, 2);
 280        ft_cpu_setup(blob, bd);
 281
 282#ifdef CONFIG_SYS_DPAA_FMAN
 283        fdt_fixup_fman_ethernet(blob);
 284        fdt_fixup_board_enet(blob);
 285#endif
 286
 287        reg = QIXIS_READ(brdcfg[0]);
 288        reg = (reg & QIXIS_LBMAP_MASK) >> QIXIS_LBMAP_SHIFT;
 289
 290        /* Disable IFC if QSPI is enabled */
 291        if (reg == 0xF)
 292                do_fixup_by_compat(blob, "fsl,ifc",
 293                                   "status", "disabled", 8 + 1, 1);
 294
 295        return 0;
 296}
 297#endif
 298
 299u8 flash_read8(void *addr)
 300{
 301        return __raw_readb(addr + 1);
 302}
 303
 304void flash_write16(u16 val, void *addr)
 305{
 306        u16 shftval = (((val >> 8) & 0xff) | ((val << 8) & 0xff00));
 307
 308        __raw_writew(shftval, addr);
 309}
 310
 311u16 flash_read16(void *addr)
 312{
 313        u16 val = __raw_readw(addr);
 314
 315        return (((val) >> 8) & 0x00ff) | (((val) << 8) & 0xff00);
 316}
 317