uboot/board/freescale/mx53loco/mx53loco.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * Copyright (C) 2011 Freescale Semiconductor, Inc.
   4 * Jason Liu <r64343@freescale.com>
   5 */
   6
   7#include <common.h>
   8#include <init.h>
   9#include <log.h>
  10#include <asm/global_data.h>
  11#include <asm/io.h>
  12#include <asm/arch/imx-regs.h>
  13#include <asm/arch/sys_proto.h>
  14#include <asm/arch/crm_regs.h>
  15#include <asm/arch/clock.h>
  16#include <asm/arch/iomux-mx53.h>
  17#include <asm/arch/clock.h>
  18#include <env.h>
  19#include <linux/errno.h>
  20#include <asm/mach-imx/mx5_video.h>
  21#include <i2c.h>
  22#include <input.h>
  23#include <fsl_esdhc_imx.h>
  24#include <asm/gpio.h>
  25#include <power/pmic.h>
  26#include <dialog_pmic.h>
  27#include <fsl_pmic.h>
  28#include <linux/fb.h>
  29#include <ipu_pixfmt.h>
  30
  31#define MX53LOCO_LCD_POWER              IMX_GPIO_NR(3, 24)
  32
  33DECLARE_GLOBAL_DATA_PTR;
  34
  35#ifdef CONFIG_REVISION_TAG
  36u32 get_board_rev(void)
  37{
  38        struct iim_regs *iim = (struct iim_regs *)IMX_IIM_BASE;
  39        struct fuse_bank *bank = &iim->bank[0];
  40        struct fuse_bank0_regs *fuse =
  41                (struct fuse_bank0_regs *)bank->fuse_regs;
  42
  43        int rev = readl(&fuse->gp[6]);
  44
  45        if (!i2c_probe(CONFIG_SYS_DIALOG_PMIC_I2C_ADDR))
  46                rev = 0;
  47
  48        return (get_cpu_rev() & ~(0xF << 8)) | (rev & 0xF) << 8;
  49}
  50#endif
  51
  52#define UART_PAD_CTRL   (PAD_CTL_HYS | PAD_CTL_DSE_HIGH | \
  53                         PAD_CTL_PUS_100K_UP | PAD_CTL_ODE)
  54
  55static void setup_iomux_uart(void)
  56{
  57        static const iomux_v3_cfg_t uart_pads[] = {
  58                NEW_PAD_CTRL(MX53_PAD_CSI0_DAT11__UART1_RXD_MUX, UART_PAD_CTRL),
  59                NEW_PAD_CTRL(MX53_PAD_CSI0_DAT10__UART1_TXD_MUX, UART_PAD_CTRL),
  60        };
  61
  62        imx_iomux_v3_setup_multiple_pads(uart_pads, ARRAY_SIZE(uart_pads));
  63}
  64
  65#define I2C_PAD_CTRL    (PAD_CTL_SRE_FAST | PAD_CTL_DSE_HIGH | \
  66                         PAD_CTL_PUS_100K_UP | PAD_CTL_ODE)
  67
  68static void setup_iomux_i2c(void)
  69{
  70        static const iomux_v3_cfg_t i2c1_pads[] = {
  71                NEW_PAD_CTRL(MX53_PAD_CSI0_DAT8__I2C1_SDA, I2C_PAD_CTRL),
  72                NEW_PAD_CTRL(MX53_PAD_CSI0_DAT9__I2C1_SCL, I2C_PAD_CTRL),
  73        };
  74
  75        imx_iomux_v3_setup_multiple_pads(i2c1_pads, ARRAY_SIZE(i2c1_pads));
  76}
  77
  78static int power_init(void)
  79{
  80        unsigned int val;
  81        int ret;
  82        struct pmic *p;
  83
  84        if (!i2c_probe(CONFIG_SYS_DIALOG_PMIC_I2C_ADDR)) {
  85                ret = pmic_dialog_init(I2C_PMIC);
  86                if (ret)
  87                        return ret;
  88
  89                p = pmic_get("DIALOG_PMIC");
  90                if (!p)
  91                        return -ENODEV;
  92
  93                env_set("fdt_file", "imx53-qsb.dtb");
  94
  95                /* Set VDDA to 1.25V */
  96                val = DA9052_BUCKCORE_BCOREEN | DA_BUCKCORE_VBCORE_1_250V;
  97                ret = pmic_reg_write(p, DA9053_BUCKCORE_REG, val);
  98                if (ret) {
  99                        printf("Writing to BUCKCORE_REG failed: %d\n", ret);
 100                        return ret;
 101                }
 102
 103                pmic_reg_read(p, DA9053_SUPPLY_REG, &val);
 104                val |= DA9052_SUPPLY_VBCOREGO;
 105                ret = pmic_reg_write(p, DA9053_SUPPLY_REG, val);
 106                if (ret) {
 107                        printf("Writing to SUPPLY_REG failed: %d\n", ret);
 108                        return ret;
 109                }
 110
 111                /* Set Vcc peripheral to 1.30V */
 112                ret = pmic_reg_write(p, DA9053_BUCKPRO_REG, 0x62);
 113                if (ret) {
 114                        printf("Writing to BUCKPRO_REG failed: %d\n", ret);
 115                        return ret;
 116                }
 117
 118                ret = pmic_reg_write(p, DA9053_SUPPLY_REG, 0x62);
 119                if (ret) {
 120                        printf("Writing to SUPPLY_REG failed: %d\n", ret);
 121                        return ret;
 122                }
 123
 124                return ret;
 125        }
 126
 127        if (!i2c_probe(CONFIG_SYS_FSL_PMIC_I2C_ADDR)) {
 128                ret = pmic_init(I2C_0);
 129                if (ret)
 130                        return ret;
 131
 132                p = pmic_get("FSL_PMIC");
 133                if (!p)
 134                        return -ENODEV;
 135
 136                env_set("fdt_file", "imx53-qsrb.dtb");
 137
 138                /* Set VDDGP to 1.25V for 1GHz on SW1 */
 139                pmic_reg_read(p, REG_SW_0, &val);
 140                val = (val & ~SWx_VOLT_MASK_MC34708) | SWx_1_250V_MC34708;
 141                ret = pmic_reg_write(p, REG_SW_0, val);
 142                if (ret) {
 143                        printf("Writing to REG_SW_0 failed: %d\n", ret);
 144                        return ret;
 145                }
 146
 147                /* Set VCC as 1.30V on SW2 */
 148                pmic_reg_read(p, REG_SW_1, &val);
 149                val = (val & ~SWx_VOLT_MASK_MC34708) | SWx_1_300V_MC34708;
 150                ret = pmic_reg_write(p, REG_SW_1, val);
 151                if (ret) {
 152                        printf("Writing to REG_SW_1 failed: %d\n", ret);
 153                        return ret;
 154                }
 155
 156                /* Set global reset timer to 4s */
 157                pmic_reg_read(p, REG_POWER_CTL2, &val);
 158                val = (val & ~TIMER_MASK_MC34708) | TIMER_4S_MC34708;
 159                ret = pmic_reg_write(p, REG_POWER_CTL2, val);
 160                if (ret) {
 161                        printf("Writing to REG_POWER_CTL2 failed: %d\n", ret);
 162                        return ret;
 163                }
 164
 165                /* Set VUSBSEL and VUSBEN for USB PHY supply*/
 166                pmic_reg_read(p, REG_MODE_0, &val);
 167                val |= (VUSBSEL_MC34708 | VUSBEN_MC34708);
 168                ret = pmic_reg_write(p, REG_MODE_0, val);
 169                if (ret) {
 170                        printf("Writing to REG_MODE_0 failed: %d\n", ret);
 171                        return ret;
 172                }
 173
 174                /* Set SWBST to 5V in auto mode */
 175                val = SWBST_AUTO;
 176                ret = pmic_reg_write(p, SWBST_CTRL, val);
 177                if (ret) {
 178                        printf("Writing to SWBST_CTRL failed: %d\n", ret);
 179                        return ret;
 180                }
 181
 182                return ret;
 183        }
 184
 185        return -1;
 186}
 187
 188static void clock_1GHz(void)
 189{
 190        int ret;
 191        u32 ref_clk = MXC_HCLK;
 192        /*
 193         * After increasing voltage to 1.25V, we can switch
 194         * CPU clock to 1GHz and DDR to 400MHz safely
 195         */
 196        ret = mxc_set_clock(ref_clk, 1000, MXC_ARM_CLK);
 197        if (ret)
 198                printf("CPU:   Switch CPU clock to 1GHZ failed\n");
 199
 200        ret = mxc_set_clock(ref_clk, 400, MXC_PERIPH_CLK);
 201        ret |= mxc_set_clock(ref_clk, 400, MXC_DDR_CLK);
 202        if (ret)
 203                printf("CPU:   Switch DDR clock to 400MHz failed\n");
 204}
 205
 206int board_early_init_f(void)
 207{
 208        setup_iomux_uart();
 209        setup_iomux_lcd();
 210
 211        return 0;
 212}
 213
 214/*
 215 * Do not overwrite the console
 216 * Use always serial for U-Boot console
 217 */
 218int overwrite_console(void)
 219{
 220        return 1;
 221}
 222
 223int board_init(void)
 224{
 225        gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
 226
 227        mxc_set_sata_internal_clock();
 228        setup_iomux_i2c();
 229
 230        return 0;
 231}
 232
 233int board_late_init(void)
 234{
 235        if (!power_init())
 236                clock_1GHz();
 237
 238        return 0;
 239}
 240
 241int checkboard(void)
 242{
 243        puts("Board: MX53 LOCO\n");
 244
 245        return 0;
 246}
 247