|
|
|
@@ -47,11 +47,6 @@ DECLARE_GLOBAL_DATA_PTR;
|
|
|
|
|
#define SPI_PAD_CTRL (PAD_CTL_HYS | PAD_CTL_SPEED_MED | \
|
|
|
|
|
PAD_CTL_DSE_40ohm | PAD_CTL_SRE_FAST)
|
|
|
|
|
|
|
|
|
|
#define I2C_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE | \
|
|
|
|
|
PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED | \
|
|
|
|
|
PAD_CTL_DSE_40ohm | PAD_CTL_HYS | \
|
|
|
|
|
PAD_CTL_ODE | PAD_CTL_SRE_FAST)
|
|
|
|
|
|
|
|
|
|
#define OTGID_PAD_CTRL (PAD_CTL_PKE | PAD_CTL_PUE | \
|
|
|
|
|
PAD_CTL_PUS_47K_UP | PAD_CTL_SPEED_LOW |\
|
|
|
|
|
PAD_CTL_DSE_80ohm | PAD_CTL_HYS | \
|
|
|
|
@@ -155,157 +150,55 @@ static void setup_iomux_fec(void)
|
|
|
|
|
imx_iomux_v3_setup_multiple_pads(fec_pads, ARRAY_SIZE(fec_pads));
|
|
|
|
|
|
|
|
|
|
/* Power up LAN8720 PHY */
|
|
|
|
|
gpio_request(ETH_PHY_POWER, "eth_pwr");
|
|
|
|
|
gpio_direction_output(ETH_PHY_POWER , 1);
|
|
|
|
|
udelay(15000);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#define USDHC1_CD_GPIO IMX_GPIO_NR(4, 7)
|
|
|
|
|
#define USDHC2_CD_GPIO IMX_GPIO_NR(5, 0)
|
|
|
|
|
#define USDHC3_CD_GPIO IMX_GPIO_NR(3, 22)
|
|
|
|
|
|
|
|
|
|
static struct fsl_esdhc_cfg usdhc_cfg[3] = {
|
|
|
|
|
{USDHC1_BASE_ADDR},
|
|
|
|
|
{USDHC2_BASE_ADDR, 0, 4},
|
|
|
|
|
{USDHC3_BASE_ADDR, 0, 4},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
int board_mmc_get_env_dev(int devno)
|
|
|
|
|
{
|
|
|
|
|
return devno;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int board_mmc_getcd(struct mmc *mmc)
|
|
|
|
|
{
|
|
|
|
|
struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
|
|
|
|
|
int ret = 0;
|
|
|
|
|
|
|
|
|
|
switch (cfg->esdhc_base) {
|
|
|
|
|
case USDHC1_BASE_ADDR:
|
|
|
|
|
ret = !gpio_get_value(USDHC1_CD_GPIO);
|
|
|
|
|
break;
|
|
|
|
|
case USDHC2_BASE_ADDR:
|
|
|
|
|
ret = !gpio_get_value(USDHC2_CD_GPIO);
|
|
|
|
|
break;
|
|
|
|
|
case USDHC3_BASE_ADDR:
|
|
|
|
|
ret = !gpio_get_value(USDHC3_CD_GPIO);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int board_mmc_init(bd_t *bis)
|
|
|
|
|
{
|
|
|
|
|
#ifndef CONFIG_SPL_BUILD
|
|
|
|
|
int i, ret;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* According to the board_mmc_init() the following map is done:
|
|
|
|
|
* (U-Boot device node) (Physical Port)
|
|
|
|
|
* mmc0 USDHC1
|
|
|
|
|
* mmc1 USDHC2
|
|
|
|
|
* mmc2 USDHC3
|
|
|
|
|
*/
|
|
|
|
|
for (i = 0; i < CONFIG_SYS_FSL_USDHC_NUM; i++) {
|
|
|
|
|
switch (i) {
|
|
|
|
|
case 0:
|
|
|
|
|
imx_iomux_v3_setup_multiple_pads(
|
|
|
|
|
usdhc1_pads, ARRAY_SIZE(usdhc1_pads));
|
|
|
|
|
gpio_direction_input(USDHC1_CD_GPIO);
|
|
|
|
|
usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
|
|
|
|
|
break;
|
|
|
|
|
case 1:
|
|
|
|
|
imx_iomux_v3_setup_multiple_pads(
|
|
|
|
|
usdhc2_pads, ARRAY_SIZE(usdhc2_pads));
|
|
|
|
|
gpio_direction_input(USDHC2_CD_GPIO);
|
|
|
|
|
usdhc_cfg[1].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
imx_iomux_v3_setup_multiple_pads(
|
|
|
|
|
usdhc3_pads, ARRAY_SIZE(usdhc3_pads));
|
|
|
|
|
gpio_direction_input(USDHC3_CD_GPIO);
|
|
|
|
|
usdhc_cfg[2].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
printf("Warning: you configured more USDHC controllers"
|
|
|
|
|
"(%d) than supported by the board\n", i + 1);
|
|
|
|
|
return -EINVAL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ret = fsl_esdhc_initialize(bis, &usdhc_cfg[i]);
|
|
|
|
|
if (ret) {
|
|
|
|
|
printf("Warning: failed to initialize "
|
|
|
|
|
"mmc dev %d\n", i);
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
#else
|
|
|
|
|
struct src *src_regs = (struct src *)SRC_BASE_ADDR;
|
|
|
|
|
u32 val;
|
|
|
|
|
u32 port;
|
|
|
|
|
|
|
|
|
|
val = readl(&src_regs->sbmr1);
|
|
|
|
|
|
|
|
|
|
/* Boot from USDHC */
|
|
|
|
|
port = (val >> 11) & 0x3;
|
|
|
|
|
switch (port) {
|
|
|
|
|
case 0:
|
|
|
|
|
imx_iomux_v3_setup_multiple_pads(usdhc1_pads,
|
|
|
|
|
ARRAY_SIZE(usdhc1_pads));
|
|
|
|
|
gpio_direction_input(USDHC1_CD_GPIO);
|
|
|
|
|
usdhc_cfg[0].esdhc_base = USDHC1_BASE_ADDR;
|
|
|
|
|
usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
|
|
|
|
|
break;
|
|
|
|
|
case 1:
|
|
|
|
|
imx_iomux_v3_setup_multiple_pads(usdhc2_pads,
|
|
|
|
|
ARRAY_SIZE(usdhc2_pads));
|
|
|
|
|
gpio_direction_input(USDHC2_CD_GPIO);
|
|
|
|
|
usdhc_cfg[0].esdhc_base = USDHC2_BASE_ADDR;
|
|
|
|
|
usdhc_cfg[0].max_bus_width = 4;
|
|
|
|
|
usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
imx_iomux_v3_setup_multiple_pads(usdhc3_pads,
|
|
|
|
|
ARRAY_SIZE(usdhc3_pads));
|
|
|
|
|
gpio_direction_input(USDHC3_CD_GPIO);
|
|
|
|
|
usdhc_cfg[0].esdhc_base = USDHC3_BASE_ADDR;
|
|
|
|
|
usdhc_cfg[0].max_bus_width = 4;
|
|
|
|
|
usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gd->arch.sdhc_clk = usdhc_cfg[0].sdhc_clk;
|
|
|
|
|
return fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_SYS_I2C_MXC
|
|
|
|
|
#define PC MUX_PAD_CTRL(I2C_PAD_CTRL)
|
|
|
|
|
/* I2C1 for PMIC */
|
|
|
|
|
struct i2c_pads_info i2c_pad_info1 = {
|
|
|
|
|
.sda = {
|
|
|
|
|
.i2c_mode = MX6_PAD_I2C1_SDA__I2C1_SDA | PC,
|
|
|
|
|
.gpio_mode = MX6_PAD_I2C1_SDA__GPIO_3_13 | PC,
|
|
|
|
|
.gp = IMX_GPIO_NR(3, 13),
|
|
|
|
|
},
|
|
|
|
|
.scl = {
|
|
|
|
|
.i2c_mode = MX6_PAD_I2C1_SCL__I2C1_SCL | PC,
|
|
|
|
|
.gpio_mode = MX6_PAD_I2C1_SCL__GPIO_3_12 | PC,
|
|
|
|
|
.gp = IMX_GPIO_NR(3, 12),
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_DM_PMIC_PFUZE100
|
|
|
|
|
int power_init_board(void)
|
|
|
|
|
{
|
|
|
|
|
struct pmic *p;
|
|
|
|
|
struct udevice *dev;
|
|
|
|
|
int ret;
|
|
|
|
|
u32 dev_id, rev_id, i;
|
|
|
|
|
u32 switch_num = 6;
|
|
|
|
|
u32 offset = PFUZE100_SW1CMODE;
|
|
|
|
|
|
|
|
|
|
p = pfuze_common_init(I2C_PMIC);
|
|
|
|
|
if (!p)
|
|
|
|
|
return -ENODEV;
|
|
|
|
|
ret = pmic_get("pfuze100", &dev);
|
|
|
|
|
if (ret == -ENODEV)
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
return pfuze_mode_init(p, APS_PFM);
|
|
|
|
|
if (ret != 0)
|
|
|
|
|
return ret;
|
|
|
|
|
|
|
|
|
|
dev_id = pmic_reg_read(dev, PFUZE100_DEVICEID);
|
|
|
|
|
rev_id = pmic_reg_read(dev, PFUZE100_REVID);
|
|
|
|
|
printf("PMIC: PFUZE100! DEV_ID=0x%x REV_ID=0x%x\n", dev_id, rev_id);
|
|
|
|
|
|
|
|
|
|
/* set SW1AB staby volatage 0.975V */
|
|
|
|
|
pmic_clrsetbits(dev, PFUZE100_SW1ABSTBY, 0x3f, 0x1b);
|
|
|
|
|
|
|
|
|
|
/* set SW1AB/VDDARM step ramp up time from 16us to 4us/25mV */
|
|
|
|
|
pmic_clrsetbits(dev, PFUZE100_SW1ABCONF, 0xc0, 0x40);
|
|
|
|
|
|
|
|
|
|
/* set SW1C staby volatage 0.975V */
|
|
|
|
|
pmic_clrsetbits(dev, PFUZE100_SW1CSTBY, 0x3f, 0x1b);
|
|
|
|
|
|
|
|
|
|
/* set SW1C/VDDSOC step ramp up time to from 16us to 4us/25mV */
|
|
|
|
|
pmic_clrsetbits(dev, PFUZE100_SW1CCONF, 0xc0, 0x40);
|
|
|
|
|
|
|
|
|
|
/* Init mode to APS_PFM */
|
|
|
|
|
pmic_reg_write(dev, PFUZE100_SW1ABMODE, APS_PFM);
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < switch_num - 1; i++)
|
|
|
|
|
pmic_reg_write(dev, offset + i * SWITCH_SIZE, APS_PFM);
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
@@ -374,9 +267,7 @@ int board_ehci_hcd_init(int port)
|
|
|
|
|
int board_early_init_f(void)
|
|
|
|
|
{
|
|
|
|
|
setup_iomux_uart();
|
|
|
|
|
#ifdef CONFIG_MXC_SPI
|
|
|
|
|
setup_spi();
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -385,8 +276,9 @@ int board_init(void)
|
|
|
|
|
/* address of boot parameters */
|
|
|
|
|
gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
|
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_SYS_I2C_MXC
|
|
|
|
|
setup_i2c(0, CONFIG_SYS_I2C_SPEED, 0x7f, &i2c_pad_info1);
|
|
|
|
|
#ifdef CONFIG_MXC_SPI
|
|
|
|
|
gpio_request(IMX_GPIO_NR(4, 11), "spi_cs");
|
|
|
|
|
setup_spi();
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_FEC_MXC
|
|
|
|
@@ -411,6 +303,76 @@ int checkboard(void)
|
|
|
|
|
#include <spl.h>
|
|
|
|
|
#include <libfdt.h>
|
|
|
|
|
|
|
|
|
|
#define USDHC1_CD_GPIO IMX_GPIO_NR(4, 7)
|
|
|
|
|
#define USDHC2_CD_GPIO IMX_GPIO_NR(5, 0)
|
|
|
|
|
#define USDHC3_CD_GPIO IMX_GPIO_NR(3, 22)
|
|
|
|
|
|
|
|
|
|
static struct fsl_esdhc_cfg usdhc_cfg[3] = {
|
|
|
|
|
{USDHC1_BASE_ADDR},
|
|
|
|
|
{USDHC2_BASE_ADDR, 0, 4},
|
|
|
|
|
{USDHC3_BASE_ADDR, 0, 4},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
int board_mmc_getcd(struct mmc *mmc)
|
|
|
|
|
{
|
|
|
|
|
struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
|
|
|
|
|
int ret = 0;
|
|
|
|
|
|
|
|
|
|
switch (cfg->esdhc_base) {
|
|
|
|
|
case USDHC1_BASE_ADDR:
|
|
|
|
|
ret = !gpio_get_value(USDHC1_CD_GPIO);
|
|
|
|
|
break;
|
|
|
|
|
case USDHC2_BASE_ADDR:
|
|
|
|
|
ret = !gpio_get_value(USDHC2_CD_GPIO);
|
|
|
|
|
break;
|
|
|
|
|
case USDHC3_BASE_ADDR:
|
|
|
|
|
ret = !gpio_get_value(USDHC3_CD_GPIO);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int board_mmc_init(bd_t *bis)
|
|
|
|
|
{
|
|
|
|
|
struct src *src_regs = (struct src *)SRC_BASE_ADDR;
|
|
|
|
|
u32 val;
|
|
|
|
|
u32 port;
|
|
|
|
|
|
|
|
|
|
val = readl(&src_regs->sbmr1);
|
|
|
|
|
|
|
|
|
|
/* Boot from USDHC */
|
|
|
|
|
port = (val >> 11) & 0x3;
|
|
|
|
|
switch (port) {
|
|
|
|
|
case 0:
|
|
|
|
|
imx_iomux_v3_setup_multiple_pads(usdhc1_pads,
|
|
|
|
|
ARRAY_SIZE(usdhc1_pads));
|
|
|
|
|
gpio_direction_input(USDHC1_CD_GPIO);
|
|
|
|
|
usdhc_cfg[0].esdhc_base = USDHC1_BASE_ADDR;
|
|
|
|
|
usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
|
|
|
|
|
break;
|
|
|
|
|
case 1:
|
|
|
|
|
imx_iomux_v3_setup_multiple_pads(usdhc2_pads,
|
|
|
|
|
ARRAY_SIZE(usdhc2_pads));
|
|
|
|
|
gpio_direction_input(USDHC2_CD_GPIO);
|
|
|
|
|
usdhc_cfg[0].esdhc_base = USDHC2_BASE_ADDR;
|
|
|
|
|
usdhc_cfg[0].max_bus_width = 4;
|
|
|
|
|
usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC2_CLK);
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
imx_iomux_v3_setup_multiple_pads(usdhc3_pads,
|
|
|
|
|
ARRAY_SIZE(usdhc3_pads));
|
|
|
|
|
gpio_direction_input(USDHC3_CD_GPIO);
|
|
|
|
|
usdhc_cfg[0].esdhc_base = USDHC3_BASE_ADDR;
|
|
|
|
|
usdhc_cfg[0].max_bus_width = 4;
|
|
|
|
|
usdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC3_CLK);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
gd->arch.sdhc_clk = usdhc_cfg[0].sdhc_clk;
|
|
|
|
|
return fsl_esdhc_initialize(bis, &usdhc_cfg[0]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const struct mx6sl_iomux_ddr_regs mx6_ddr_ioregs = {
|
|
|
|
|
.dram_sdqs0 = 0x00003030,
|
|
|
|
|
.dram_sdqs1 = 0x00003030,
|
|
|
|
|