imx: ventana: Add support for GW551x

The GW551x is a small form factor board based on the IMX6 SoC that includes:
 * up to 512MB DDR3 memory
 * up to 2GB NAND flash
 * 1x miniPCIe socket (with USB)
 * HDMI out (micro-HDMI)
 * HDMI in (micro-HDMI)
 * TTL level I/O (supported by GW16111 breakout board):
  * I2C
  * 2x UART
  * CAN
  * 2x DIO (GPIO/PWM)
  * USB OTG

Signed-off-by: Tim Harvey <tharvey@gateworks.com>
This commit is contained in:
Tim Harvey 2015-04-08 12:54:45 -07:00 committed by Stefano Babic
parent 0c81b14fac
commit 75f21e3131
4 changed files with 121 additions and 12 deletions

View File

@ -81,8 +81,14 @@ read_eeprom(int bus, struct ventana_board_info *info)
type = GW54xx; type = GW54xx;
break; break;
case '5': case '5':
type = GW552x; if (info->model[4] == '1') {
break; type = GW551x;
break;
} else if (info->model[4] == '2') {
type = GW552x;
break;
}
/* fall through */
default: default:
printf("EEPROM: Unknown model in EEPROM: %s\n", info->model); printf("EEPROM: Unknown model in EEPROM: %s\n", info->model);
type = GW_UNKNOWN; type = GW_UNKNOWN;

View File

@ -400,7 +400,7 @@ int board_eth_init(bd_t *bis)
setup_iomux_enet(); setup_iomux_enet();
#ifdef CONFIG_FEC_MXC #ifdef CONFIG_FEC_MXC
if (board_type != GW552x) if (board_type != GW551x && board_type != GW552x)
cpu_eth_init(bis); cpu_eth_init(bis);
#endif #endif
@ -679,6 +679,15 @@ static iomux_v3_cfg_t const gw54xx_gpio_pads[] = {
IOMUX_PADS(PAD_DISP0_DAT23__GPIO5_IO17 | DIO_PAD_CFG), IOMUX_PADS(PAD_DISP0_DAT23__GPIO5_IO17 | DIO_PAD_CFG),
}; };
static iomux_v3_cfg_t const gw551x_gpio_pads[] = {
/* PANLED# */
IOMUX_PADS(PAD_KEY_ROW0__GPIO4_IO07 | DIO_PAD_CFG),
/* PCI_RST# */
IOMUX_PADS(PAD_GPIO_0__GPIO1_IO00 | DIO_PAD_CFG),
/* PCIESKT_WDIS# */
IOMUX_PADS(PAD_GPIO_17__GPIO7_IO12 | DIO_PAD_CFG),
};
static iomux_v3_cfg_t const gw552x_gpio_pads[] = { static iomux_v3_cfg_t const gw552x_gpio_pads[] = {
/* PANLEDG# */ /* PANLEDG# */
IOMUX_PADS(PAD_KEY_COL0__GPIO4_IO06 | DIO_PAD_CFG), IOMUX_PADS(PAD_KEY_COL0__GPIO4_IO06 | DIO_PAD_CFG),
@ -720,6 +729,7 @@ struct ventana {
int num_pads; int num_pads;
/* DIO pinmux/val */ /* DIO pinmux/val */
struct dio_cfg dio_cfg[4]; struct dio_cfg dio_cfg[4];
int num_gpios;
/* various gpios (0 if non-existent) */ /* various gpios (0 if non-existent) */
int leds[3]; int leds[3];
int pcie_rst; int pcie_rst;
@ -765,6 +775,7 @@ static struct ventana gpio_cfg[] = {
4 4
}, },
}, },
.num_gpios = 4,
.leds = { .leds = {
IMX_GPIO_NR(4, 6), IMX_GPIO_NR(4, 6),
IMX_GPIO_NR(4, 10), IMX_GPIO_NR(4, 10),
@ -808,6 +819,7 @@ static struct ventana gpio_cfg[] = {
4 4
}, },
}, },
.num_gpios = 4,
.leds = { .leds = {
IMX_GPIO_NR(4, 6), IMX_GPIO_NR(4, 6),
IMX_GPIO_NR(4, 10), IMX_GPIO_NR(4, 10),
@ -850,6 +862,7 @@ static struct ventana gpio_cfg[] = {
0 0
}, },
}, },
.num_gpios = 4,
.leds = { .leds = {
IMX_GPIO_NR(4, 6), IMX_GPIO_NR(4, 6),
IMX_GPIO_NR(4, 7), IMX_GPIO_NR(4, 7),
@ -894,6 +907,7 @@ static struct ventana gpio_cfg[] = {
0 0
}, },
}, },
.num_gpios = 4,
.leds = { .leds = {
IMX_GPIO_NR(4, 6), IMX_GPIO_NR(4, 6),
IMX_GPIO_NR(4, 7), IMX_GPIO_NR(4, 7),
@ -937,6 +951,7 @@ static struct ventana gpio_cfg[] = {
4 4
}, },
}, },
.num_gpios = 4,
.leds = { .leds = {
IMX_GPIO_NR(4, 6), IMX_GPIO_NR(4, 6),
IMX_GPIO_NR(4, 7), IMX_GPIO_NR(4, 7),
@ -952,10 +967,10 @@ static struct ventana gpio_cfg[] = {
.wdis = IMX_GPIO_NR(5, 17), .wdis = IMX_GPIO_NR(5, 17),
}, },
/* GW552x */ /* GW551x */
{ {
.gpio_pads = gw552x_gpio_pads, .gpio_pads = gw551x_gpio_pads,
.num_pads = ARRAY_SIZE(gw552x_gpio_pads)/2, .num_pads = ARRAY_SIZE(gw551x_gpio_pads)/2,
.dio_cfg = { .dio_cfg = {
{ {
{ IOMUX_PADS(PAD_SD1_DAT0__GPIO1_IO16) }, { IOMUX_PADS(PAD_SD1_DAT0__GPIO1_IO16) },
@ -976,12 +991,39 @@ static struct ventana gpio_cfg[] = {
3 3
}, },
{ {
{ IOMUX_PADS(PAD_SD1_CLK__GPIO1_IO20) }, { IOMUX_PADS(PAD_SD1_CMD__GPIO1_IO18) },
IMX_GPIO_NR(2, 10), IMX_GPIO_NR(1, 18),
{ 0, 0 }, { IOMUX_PADS(PAD_SD1_CMD__PWM4_OUT) },
0 4
}, },
}, },
.num_gpios = 2,
.leds = {
IMX_GPIO_NR(4, 7),
},
.pcie_rst = IMX_GPIO_NR(1, 0),
.wdis = IMX_GPIO_NR(7, 12),
},
/* GW552x */
{
.gpio_pads = gw552x_gpio_pads,
.num_pads = ARRAY_SIZE(gw552x_gpio_pads)/2,
.dio_cfg = {
{
{ IOMUX_PADS(PAD_SD1_DAT2__GPIO1_IO19) },
IMX_GPIO_NR(1, 19),
{ IOMUX_PADS(PAD_SD1_DAT2__PWM2_OUT) },
2
},
{
{ IOMUX_PADS(PAD_SD1_DAT1__GPIO1_IO17) },
IMX_GPIO_NR(1, 17),
{ IOMUX_PADS(PAD_SD1_DAT1__PWM3_OUT) },
3
},
},
.num_gpios = 4,
.leds = { .leds = {
IMX_GPIO_NR(4, 6), IMX_GPIO_NR(4, 6),
IMX_GPIO_NR(4, 7), IMX_GPIO_NR(4, 7),
@ -1138,6 +1180,8 @@ static void setup_board_gpio(int board)
iomux_v3_cfg_t ctrl = DIO_PAD_CFG; iomux_v3_cfg_t ctrl = DIO_PAD_CFG;
unsigned cputype = is_cpu_type(MXC_CPU_MX6Q) ? 0 : 1; unsigned cputype = is_cpu_type(MXC_CPU_MX6Q) ? 0 : 1;
if (!cfg->gpio_padmux[0] && !cfg->gpio_padmux[1])
continue;
sprintf(arg, "dio%d", i); sprintf(arg, "dio%d", i);
if (!hwconfig(arg)) if (!hwconfig(arg))
continue; continue;
@ -1430,7 +1474,7 @@ int misc_init_r(void)
sprintf(fdt, "%s-%s.dtb", cputype, str); sprintf(fdt, "%s-%s.dtb", cputype, str);
setenv("fdt_file1", fdt); setenv("fdt_file1", fdt);
} }
if (board_type != GW552x) if (board_type != GW551x && board_type != GW552x)
str[4] = 'x'; str[4] = 'x';
str[5] = 'x'; str[5] = 'x';
str[6] = 0; str[6] = 0;

View File

@ -220,6 +220,50 @@ static struct mx6_ddr3_cfg mt41k256m16ha_125 = {
* calibration - these are the various CPU/DDR3 combinations we support * calibration - these are the various CPU/DDR3 combinations we support
*/ */
static struct mx6_mmdc_calibration mx6dq_128x16_mmdc_calib = {
/* write leveling calibration determine */
.p0_mpwldectrl0 = 0x00190017,
/* Read DQS Gating calibration */
.p0_mpdgctrl0 = 0x43380347,
/* Read Calibration: DQS delay relative to DQ read access */
.p0_mprddlctl = 0x3C313539,
/* Write Calibration: DQ/DM delay relative to DQS write access */
.p0_mpwrdlctl = 0x36393C39,
};
static struct mx6_mmdc_calibration mx6dq_256x16_mmdc_calib = {
/* write leveling calibration determine */
.p0_mpwldectrl0 = 0x00190017,
/* Read DQS Gating calibration */
.p0_mpdgctrl0 = 0x43380347,
/* Read Calibration: DQS delay relative to DQ read access */
.p0_mprddlctl = 0x3C313539,
/* Write Calibration: DQ/DM delay relative to DQS write access */
.p0_mpwrdlctl = 0x36393C39,
};
static struct mx6_mmdc_calibration mx6sdl_128x16_mmdc_calib = {
/* write leveling calibration determine */
.p0_mpwldectrl0 = 0x00190017,
/* Read DQS Gating calibration */
.p0_mpdgctrl0 = 0x43380347,
/* Read Calibration: DQS delay relative to DQ read access */
.p0_mprddlctl = 0x3C313539,
/* Write Calibration: DQ/DM delay relative to DQS write access */
.p0_mpwrdlctl = 0x36393C39,
};
static struct mx6_mmdc_calibration mx6sdl_256x16_mmdc_calib = {
/* write leveling calibration determine */
.p0_mpwldectrl0 = 0x00190017,
/* Read DQS Gating calibration */
.p0_mpdgctrl0 = 0x43380347,
/* Read Calibration: DQS delay relative to DQ read access */
.p0_mprddlctl = 0x3C313539,
/* Write Calibration: DQ/DM delay relative to DQS write access */
.p0_mpwrdlctl = 0x36393C39,
};
static struct mx6_mmdc_calibration mx6dq_128x32_mmdc_calib = { static struct mx6_mmdc_calibration mx6dq_128x32_mmdc_calib = {
/* write leveling calibration determine */ /* write leveling calibration determine */
.p0_mpwldectrl0 = 0x00190017, .p0_mpwldectrl0 = 0x00190017,
@ -363,7 +407,21 @@ static void spl_dram_init(int width, int size_mb, int board_model)
* mx6_ddr_sysinfo - board-specific memory architecture (width/cs/etc) * mx6_ddr_sysinfo - board-specific memory architecture (width/cs/etc)
* mx6_ddr_cfg - chip specific timing/layout details * mx6_ddr_cfg - chip specific timing/layout details
*/ */
if (width == 32 && size_mb == 512) { if (width == 16 && size_mb == 256) {
mem = &mt41k128m16jt_125;
if (is_cpu_type(MXC_CPU_MX6Q))
calib = &mx6dq_128x16_mmdc_calib;
else
calib = &mx6sdl_128x16_mmdc_calib;
debug("2gB density\n");
} else if (width == 16 && size_mb == 512) {
mem = &mt41k256m16ha_125;
if (is_cpu_type(MXC_CPU_MX6Q))
calib = &mx6dq_256x16_mmdc_calib;
else
calib = &mx6sdl_256x16_mmdc_calib;
debug("4gB density\n");
} else if (width == 32 && size_mb == 512) {
mem = &mt41k128m16jt_125; mem = &mt41k128m16jt_125;
if (is_cpu_type(MXC_CPU_MX6Q)) if (is_cpu_type(MXC_CPU_MX6Q))
calib = &mx6dq_128x32_mmdc_calib; calib = &mx6dq_128x32_mmdc_calib;

View File

@ -109,6 +109,7 @@ enum {
GW52xx, GW52xx,
GW53xx, GW53xx,
GW54xx, GW54xx,
GW551x,
GW552x, GW552x,
GW_UNKNOWN, GW_UNKNOWN,
GW_BADCRC, GW_BADCRC,