Home | History | Annotate | Download | only in p1010rdb
      1 // SPDX-License-Identifier: GPL-2.0+
      2 /*
      3  * Copyright 2010-2011 Freescale Semiconductor, Inc.
      4  */
      5 
      6 #include <common.h>
      7 #include <asm/processor.h>
      8 #include <asm/mmu.h>
      9 #include <asm/cache.h>
     10 #include <asm/immap_85xx.h>
     11 #include <asm/io.h>
     12 #include <miiphy.h>
     13 #include <linux/libfdt.h>
     14 #include <fdt_support.h>
     15 #include <fsl_mdio.h>
     16 #include <tsec.h>
     17 #include <mmc.h>
     18 #include <netdev.h>
     19 #include <pci.h>
     20 #include <asm/fsl_serdes.h>
     21 #include <fsl_ifc.h>
     22 #include <asm/fsl_pci.h>
     23 #include <hwconfig.h>
     24 #include <i2c.h>
     25 
     26 DECLARE_GLOBAL_DATA_PTR;
     27 
     28 #define GPIO4_PCIE_RESET_SET		0x08000000
     29 #define MUX_CPLD_CAN_UART		0x00
     30 #define MUX_CPLD_TDM			0x01
     31 #define MUX_CPLD_SPICS0_FLASH		0x00
     32 #define MUX_CPLD_SPICS0_SLIC		0x02
     33 #define PMUXCR1_IFC_MASK       0x00ffff00
     34 #define PMUXCR1_SDHC_MASK      0x00fff000
     35 #define PMUXCR1_SDHC_ENABLE    0x00555000
     36 
     37 enum {
     38 	MUX_TYPE_IFC,
     39 	MUX_TYPE_SDHC,
     40 	MUX_TYPE_SPIFLASH,
     41 	MUX_TYPE_TDM,
     42 	MUX_TYPE_CAN,
     43 	MUX_TYPE_CS0_NOR,
     44 	MUX_TYPE_CS0_NAND,
     45 };
     46 
     47 enum {
     48 	I2C_READ_BANK,
     49 	I2C_READ_PCB_VER,
     50 };
     51 
     52 static uint sd_ifc_mux;
     53 
     54 struct cpld_data {
     55 	u8 cpld_ver; /* cpld revision */
     56 #if defined(CONFIG_TARGET_P1010RDB_PA)
     57 	u8 pcba_ver; /* pcb revision number */
     58 	u8 twindie_ddr3;
     59 	u8 res1[6];
     60 	u8 bank_sel; /* NOR Flash bank */
     61 	u8 res2[5];
     62 	u8 usb2_sel;
     63 	u8 res3[1];
     64 	u8 porsw_sel;
     65 	u8 tdm_can_sel;
     66 	u8 spi_cs0_sel; /* SPI CS0 SLIC/SPI Flash */
     67 	u8 por0; /* POR Options */
     68 	u8 por1; /* POR Options */
     69 	u8 por2; /* POR Options */
     70 	u8 por3; /* POR Options */
     71 #elif defined(CONFIG_TARGET_P1010RDB_PB)
     72 	u8 rom_loc;
     73 #endif
     74 };
     75 
     76 int board_early_init_f(void)
     77 {
     78 	ccsr_gpio_t *pgpio = (void *)(CONFIG_SYS_MPC85xx_GPIO_ADDR);
     79 	struct fsl_ifc ifc = {(void *)CONFIG_SYS_IFC_ADDR, (void *)NULL};
     80 	/* Clock configuration to access CPLD using IFC(GPCM) */
     81 	setbits_be32(&ifc.gregs->ifc_gcr, 1 << IFC_GCR_TBCTL_TRN_TIME_SHIFT);
     82 	/*
     83 	* Reset PCIe slots via GPIO4
     84 	*/
     85 	setbits_be32(&pgpio->gpdir, GPIO4_PCIE_RESET_SET);
     86 	setbits_be32(&pgpio->gpdat, GPIO4_PCIE_RESET_SET);
     87 
     88 	return 0;
     89 }
     90 
     91 int board_early_init_r(void)
     92 {
     93 	const unsigned int flashbase = CONFIG_SYS_FLASH_BASE;
     94 	int flash_esel = find_tlb_idx((void *)flashbase, 1);
     95 
     96 	/*
     97 	 * Remap Boot flash region to caching-inhibited
     98 	 * so that flash can be erased properly.
     99 	 */
    100 
    101 	/* Flush d-cache and invalidate i-cache of any FLASH data */
    102 	flush_dcache();
    103 	invalidate_icache();
    104 
    105 	if (flash_esel == -1) {
    106 		/* very unlikely unless something is messed up */
    107 		puts("Error: Could not find TLB for FLASH BASE\n");
    108 		flash_esel = 2;	/* give our best effort to continue */
    109 	} else {
    110 		/* invalidate existing TLB entry for flash */
    111 		disable_tlb(flash_esel);
    112 	}
    113 
    114 	set_tlb(1, flashbase, CONFIG_SYS_FLASH_BASE_PHYS,
    115 			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
    116 			0, flash_esel, BOOKE_PAGESZ_16M, 1);
    117 
    118 	set_tlb(1, flashbase + 0x1000000,
    119 			CONFIG_SYS_FLASH_BASE_PHYS + 0x1000000,
    120 			MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
    121 			0, flash_esel+1, BOOKE_PAGESZ_16M, 1);
    122 	return 0;
    123 }
    124 
    125 #ifdef CONFIG_PCI
    126 void pci_init_board(void)
    127 {
    128 	fsl_pcie_init_board(0);
    129 }
    130 #endif /* ifdef CONFIG_PCI */
    131 
    132 int config_board_mux(int ctrl_type)
    133 {
    134 	ccsr_gur_t __iomem *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
    135 	u8 tmp;
    136 
    137 #if defined(CONFIG_TARGET_P1010RDB_PA)
    138 	struct cpld_data *cpld_data = (void *)(CONFIG_SYS_CPLD_BASE);
    139 
    140 	switch (ctrl_type) {
    141 	case MUX_TYPE_IFC:
    142 		i2c_set_bus_num(I2C_PCA9557_BUS_NUM);
    143 		tmp = 0xf0;
    144 		i2c_write(I2C_PCA9557_ADDR1, 3, 1, &tmp, 1);
    145 		tmp = 0x01;
    146 		i2c_write(I2C_PCA9557_ADDR1, 1, 1, &tmp, 1);
    147 		sd_ifc_mux = MUX_TYPE_IFC;
    148 		clrbits_be32(&gur->pmuxcr, PMUXCR1_IFC_MASK);
    149 		break;
    150 	case MUX_TYPE_SDHC:
    151 		i2c_set_bus_num(I2C_PCA9557_BUS_NUM);
    152 		tmp = 0xf0;
    153 		i2c_write(I2C_PCA9557_ADDR1, 3, 1, &tmp, 1);
    154 		tmp = 0x05;
    155 		i2c_write(I2C_PCA9557_ADDR1, 1, 1, &tmp, 1);
    156 		sd_ifc_mux = MUX_TYPE_SDHC;
    157 		clrsetbits_be32(&gur->pmuxcr, PMUXCR1_SDHC_MASK,
    158 				PMUXCR1_SDHC_ENABLE);
    159 		break;
    160 	case MUX_TYPE_SPIFLASH:
    161 		out_8(&cpld_data->spi_cs0_sel, MUX_CPLD_SPICS0_FLASH);
    162 		break;
    163 	case MUX_TYPE_TDM:
    164 		out_8(&cpld_data->tdm_can_sel, MUX_CPLD_TDM);
    165 		out_8(&cpld_data->spi_cs0_sel, MUX_CPLD_SPICS0_SLIC);
    166 		break;
    167 	case MUX_TYPE_CAN:
    168 		out_8(&cpld_data->tdm_can_sel, MUX_CPLD_CAN_UART);
    169 		break;
    170 	default:
    171 		break;
    172 	}
    173 #elif defined(CONFIG_TARGET_P1010RDB_PB)
    174 	uint orig_bus = i2c_get_bus_num();
    175 	i2c_set_bus_num(I2C_PCA9557_BUS_NUM);
    176 
    177 	switch (ctrl_type) {
    178 	case MUX_TYPE_IFC:
    179 		i2c_read(I2C_PCA9557_ADDR2, 0, 1, &tmp, 1);
    180 		clrbits_8(&tmp, 0x04);
    181 		i2c_write(I2C_PCA9557_ADDR2, 1, 1, &tmp, 1);
    182 		i2c_read(I2C_PCA9557_ADDR2, 3, 1, &tmp, 1);
    183 		clrbits_8(&tmp, 0x04);
    184 		i2c_write(I2C_PCA9557_ADDR2, 3, 1, &tmp, 1);
    185 		sd_ifc_mux = MUX_TYPE_IFC;
    186 		clrbits_be32(&gur->pmuxcr, PMUXCR1_IFC_MASK);
    187 		break;
    188 	case MUX_TYPE_SDHC:
    189 		i2c_read(I2C_PCA9557_ADDR2, 0, 1, &tmp, 1);
    190 		setbits_8(&tmp, 0x04);
    191 		i2c_write(I2C_PCA9557_ADDR2, 1, 1, &tmp, 1);
    192 		i2c_read(I2C_PCA9557_ADDR2, 3, 1, &tmp, 1);
    193 		clrbits_8(&tmp, 0x04);
    194 		i2c_write(I2C_PCA9557_ADDR2, 3, 1, &tmp, 1);
    195 		sd_ifc_mux = MUX_TYPE_SDHC;
    196 		clrsetbits_be32(&gur->pmuxcr, PMUXCR1_SDHC_MASK,
    197 				PMUXCR1_SDHC_ENABLE);
    198 		break;
    199 	case MUX_TYPE_SPIFLASH:
    200 		i2c_read(I2C_PCA9557_ADDR2, 0, 1, &tmp, 1);
    201 		clrbits_8(&tmp, 0x80);
    202 		i2c_write(I2C_PCA9557_ADDR2, 1, 1, &tmp, 1);
    203 		i2c_read(I2C_PCA9557_ADDR2, 3, 1, &tmp, 1);
    204 		clrbits_8(&tmp, 0x80);
    205 		i2c_write(I2C_PCA9557_ADDR2, 3, 1, &tmp, 1);
    206 		break;
    207 	case MUX_TYPE_TDM:
    208 		i2c_read(I2C_PCA9557_ADDR2, 0, 1, &tmp, 1);
    209 		setbits_8(&tmp, 0x82);
    210 		i2c_write(I2C_PCA9557_ADDR2, 1, 1, &tmp, 1);
    211 		i2c_read(I2C_PCA9557_ADDR2, 3, 1, &tmp, 1);
    212 		clrbits_8(&tmp, 0x82);
    213 		i2c_write(I2C_PCA9557_ADDR2, 3, 1, &tmp, 1);
    214 		break;
    215 	case MUX_TYPE_CAN:
    216 		i2c_read(I2C_PCA9557_ADDR2, 0, 1, &tmp, 1);
    217 		clrbits_8(&tmp, 0x02);
    218 		i2c_write(I2C_PCA9557_ADDR2, 1, 1, &tmp, 1);
    219 		i2c_read(I2C_PCA9557_ADDR2, 3, 1, &tmp, 1);
    220 		clrbits_8(&tmp, 0x02);
    221 		i2c_write(I2C_PCA9557_ADDR2, 3, 1, &tmp, 1);
    222 		break;
    223 	case MUX_TYPE_CS0_NOR:
    224 		i2c_read(I2C_PCA9557_ADDR2, 0, 1, &tmp, 1);
    225 		clrbits_8(&tmp, 0x08);
    226 		i2c_write(I2C_PCA9557_ADDR2, 1, 1, &tmp, 1);
    227 		i2c_read(I2C_PCA9557_ADDR2, 3, 1, &tmp, 1);
    228 		clrbits_8(&tmp, 0x08);
    229 		i2c_write(I2C_PCA9557_ADDR2, 3, 1, &tmp, 1);
    230 		break;
    231 	case MUX_TYPE_CS0_NAND:
    232 		i2c_read(I2C_PCA9557_ADDR2, 0, 1, &tmp, 1);
    233 		setbits_8(&tmp, 0x08);
    234 		i2c_write(I2C_PCA9557_ADDR2, 1, 1, &tmp, 1);
    235 		i2c_read(I2C_PCA9557_ADDR2, 3, 1, &tmp, 1);
    236 		clrbits_8(&tmp, 0x08);
    237 		i2c_write(I2C_PCA9557_ADDR2, 3, 1, &tmp, 1);
    238 		break;
    239 	default:
    240 		break;
    241 	}
    242 	i2c_set_bus_num(orig_bus);
    243 #endif
    244 	return 0;
    245 }
    246 
    247 #ifdef CONFIG_TARGET_P1010RDB_PB
    248 int i2c_pca9557_read(int type)
    249 {
    250 	u8 val;
    251 
    252 	i2c_set_bus_num(I2C_PCA9557_BUS_NUM);
    253 	i2c_read(I2C_PCA9557_ADDR2, 0, 1, &val, 1);
    254 
    255 	switch (type) {
    256 	case I2C_READ_BANK:
    257 		val = (val & 0x10) >> 4;
    258 		break;
    259 	case I2C_READ_PCB_VER:
    260 		val = ((val & 0x60) >> 5) + 1;
    261 		break;
    262 	default:
    263 		break;
    264 	}
    265 
    266 	return val;
    267 }
    268 #endif
    269 
    270 int checkboard(void)
    271 {
    272 	struct cpu_type *cpu;
    273 	struct cpld_data *cpld_data = (void *)(CONFIG_SYS_CPLD_BASE);
    274 	u8 val;
    275 
    276 	cpu = gd->arch.cpu;
    277 #if defined(CONFIG_TARGET_P1010RDB_PA)
    278 	printf("Board: %sRDB-PA, ", cpu->name);
    279 #elif defined(CONFIG_TARGET_P1010RDB_PB)
    280 	printf("Board: %sRDB-PB, ", cpu->name);
    281 	i2c_set_bus_num(I2C_PCA9557_BUS_NUM);
    282 	i2c_init(CONFIG_SYS_FSL_I2C_SPEED, CONFIG_SYS_FSL_I2C_SLAVE);
    283 	val = 0x0;  /* no polarity inversion */
    284 	i2c_write(I2C_PCA9557_ADDR2, 2, 1, &val, 1);
    285 #endif
    286 
    287 #ifdef CONFIG_SDCARD
    288 	/* switch to IFC to read info from CPLD */
    289 	config_board_mux(MUX_TYPE_IFC);
    290 #endif
    291 
    292 #if defined(CONFIG_TARGET_P1010RDB_PA)
    293 	val = (in_8(&cpld_data->pcba_ver) & 0xf);
    294 	printf("PCB: v%x.0\n", val);
    295 #elif defined(CONFIG_TARGET_P1010RDB_PB)
    296 	val = in_8(&cpld_data->cpld_ver);
    297 	printf("CPLD: v%x.%x, ", val >> 4, val & 0xf);
    298 	printf("PCB: v%x.0, ", i2c_pca9557_read(I2C_READ_PCB_VER));
    299 	val = in_8(&cpld_data->rom_loc) & 0xf;
    300 	puts("Boot from: ");
    301 	switch (val) {
    302 	case 0xf:
    303 		config_board_mux(MUX_TYPE_CS0_NOR);
    304 		printf("NOR vBank%d\n", i2c_pca9557_read(I2C_READ_BANK));
    305 		break;
    306 	case 0xe:
    307 		puts("SDHC\n");
    308 		val = 0x60; /* set pca9557 pin input/output */
    309 		i2c_write(I2C_PCA9557_ADDR2, 3, 1, &val, 1);
    310 		break;
    311 	case 0x5:
    312 		config_board_mux(MUX_TYPE_IFC);
    313 		config_board_mux(MUX_TYPE_CS0_NAND);
    314 		puts("NAND\n");
    315 		break;
    316 	case 0x6:
    317 		config_board_mux(MUX_TYPE_IFC);
    318 		puts("SPI\n");
    319 		break;
    320 	default:
    321 		puts("unknown\n");
    322 		break;
    323 	}
    324 #endif
    325 	return 0;
    326 }
    327 
    328 int board_eth_init(bd_t *bis)
    329 {
    330 #ifdef CONFIG_TSEC_ENET
    331 	struct fsl_pq_mdio_info mdio_info;
    332 	struct tsec_info_struct tsec_info[4];
    333 	struct cpu_type *cpu;
    334 	int num = 0;
    335 
    336 	cpu = gd->arch.cpu;
    337 
    338 #ifdef CONFIG_TSEC1
    339 	SET_STD_TSEC_INFO(tsec_info[num], 1);
    340 	num++;
    341 #endif
    342 #ifdef CONFIG_TSEC2
    343 	SET_STD_TSEC_INFO(tsec_info[num], 2);
    344 	num++;
    345 #endif
    346 #ifdef CONFIG_TSEC3
    347 	/* P1014 and it's derivatives do not support eTSEC3 */
    348 	if (cpu->soc_ver != SVR_P1014) {
    349 		SET_STD_TSEC_INFO(tsec_info[num], 3);
    350 		num++;
    351 	}
    352 #endif
    353 	if (!num) {
    354 		printf("No TSECs initialized\n");
    355 		return 0;
    356 	}
    357 
    358 	mdio_info.regs = (struct tsec_mii_mng *)CONFIG_SYS_MDIO_BASE_ADDR;
    359 	mdio_info.name = DEFAULT_MII_NAME;
    360 
    361 	fsl_pq_mdio_init(bis, &mdio_info);
    362 
    363 	tsec_eth_init(bis, tsec_info, num);
    364 #endif
    365 
    366 	return pci_eth_init(bis);
    367 }
    368 
    369 #if defined(CONFIG_OF_BOARD_SETUP)
    370 void fdt_del_flexcan(void *blob)
    371 {
    372 	int nodeoff = 0;
    373 
    374 	while ((nodeoff = fdt_node_offset_by_compatible(blob, 0,
    375 				"fsl,p1010-flexcan")) >= 0) {
    376 		fdt_del_node(blob, nodeoff);
    377 	}
    378 }
    379 
    380 void fdt_del_spi_flash(void *blob)
    381 {
    382 	int nodeoff = 0;
    383 
    384 	while ((nodeoff = fdt_node_offset_by_compatible(blob, 0,
    385 				"spansion,s25sl12801")) >= 0) {
    386 		fdt_del_node(blob, nodeoff);
    387 	}
    388 }
    389 
    390 void fdt_del_spi_slic(void *blob)
    391 {
    392 	int nodeoff = 0;
    393 
    394 	while ((nodeoff = fdt_node_offset_by_compatible(blob, 0,
    395 				"zarlink,le88266")) >= 0) {
    396 		fdt_del_node(blob, nodeoff);
    397 	}
    398 }
    399 
    400 void fdt_del_tdm(void *blob)
    401 {
    402 	int nodeoff = 0;
    403 
    404 	while ((nodeoff = fdt_node_offset_by_compatible(blob, 0,
    405 				"fsl,starlite-tdm")) >= 0) {
    406 		fdt_del_node(blob, nodeoff);
    407 	}
    408 }
    409 
    410 void fdt_del_sdhc(void *blob)
    411 {
    412 	int nodeoff = 0;
    413 
    414 	while ((nodeoff = fdt_node_offset_by_compatible(blob, 0,
    415 			"fsl,esdhc")) >= 0) {
    416 		fdt_del_node(blob, nodeoff);
    417 	}
    418 }
    419 
    420 void fdt_del_ifc(void *blob)
    421 {
    422 	int nodeoff = 0;
    423 
    424 	while ((nodeoff = fdt_node_offset_by_compatible(blob, 0,
    425 				"fsl,ifc")) >= 0) {
    426 		fdt_del_node(blob, nodeoff);
    427 	}
    428 }
    429 
    430 void fdt_disable_uart1(void *blob)
    431 {
    432 	int nodeoff;
    433 
    434 	nodeoff = fdt_node_offset_by_compat_reg(blob, "fsl,ns16550",
    435 					CONFIG_SYS_NS16550_COM2);
    436 
    437 	if (nodeoff > 0) {
    438 		fdt_status_disabled(blob, nodeoff);
    439 	} else {
    440 		printf("WARNING unable to set status for fsl,ns16550 "
    441 			"uart1: %s\n", fdt_strerror(nodeoff));
    442 	}
    443 }
    444 
    445 int ft_board_setup(void *blob, bd_t *bd)
    446 {
    447 	phys_addr_t base;
    448 	phys_size_t size;
    449 	struct cpu_type *cpu;
    450 
    451 	cpu = gd->arch.cpu;
    452 
    453 	ft_cpu_setup(blob, bd);
    454 
    455 	base = env_get_bootm_low();
    456 	size = env_get_bootm_size();
    457 
    458 #if defined(CONFIG_PCI)
    459 	FT_FSL_PCI_SETUP;
    460 #endif
    461 
    462 	fdt_fixup_memory(blob, (u64)base, (u64)size);
    463 
    464 #if defined(CONFIG_HAS_FSL_DR_USB)
    465 	fsl_fdt_fixup_dr_usb(blob, bd);
    466 #endif
    467 
    468        /* P1014 and it's derivatives don't support CAN and eTSEC3 */
    469 	if (cpu->soc_ver == SVR_P1014) {
    470 		fdt_del_flexcan(blob);
    471 		fdt_del_node_and_alias(blob, "ethernet2");
    472 	}
    473 
    474 	/* Delete IFC node as IFC pins are multiplexing with SDHC */
    475 	if (sd_ifc_mux != MUX_TYPE_IFC)
    476 		fdt_del_ifc(blob);
    477 	else
    478 		fdt_del_sdhc(blob);
    479 
    480 	if (hwconfig_subarg_cmp("fsl_p1010mux", "tdm_can", "can")) {
    481 		fdt_del_tdm(blob);
    482 		fdt_del_spi_slic(blob);
    483 	} else if (hwconfig_subarg_cmp("fsl_p1010mux", "tdm_can", "tdm")) {
    484 		fdt_del_flexcan(blob);
    485 		fdt_del_spi_flash(blob);
    486 		fdt_disable_uart1(blob);
    487 	} else {
    488 		/*
    489 		 * If we don't set fsl_p1010mux:tdm_can to "can" or "tdm"
    490 		 * explicitly, defaultly spi_cs_sel to spi-flash instead of
    491 		 * to tdm/slic.
    492 		 */
    493 		fdt_del_tdm(blob);
    494 		fdt_del_flexcan(blob);
    495 		fdt_disable_uart1(blob);
    496 	}
    497 
    498 	return 0;
    499 }
    500 #endif
    501 
    502 #ifdef CONFIG_SDCARD
    503 int board_mmc_init(bd_t *bis)
    504 {
    505 	config_board_mux(MUX_TYPE_SDHC);
    506 		return -1;
    507 }
    508 #else
    509 void board_reset(void)
    510 {
    511 	/* mux to IFC to enable CPLD for reset */
    512 	if (sd_ifc_mux != MUX_TYPE_IFC)
    513 		config_board_mux(MUX_TYPE_IFC);
    514 }
    515 #endif
    516 
    517 
    518 int misc_init_r(void)
    519 {
    520 	ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
    521 
    522 	if (hwconfig_subarg_cmp("fsl_p1010mux", "tdm_can", "can")) {
    523 		clrbits_be32(&gur->pmuxcr, MPC85xx_PMUXCR_CAN1_TDM |
    524 				MPC85xx_PMUXCR_CAN1_UART |
    525 				MPC85xx_PMUXCR_CAN2_TDM |
    526 				MPC85xx_PMUXCR_CAN2_UART);
    527 		config_board_mux(MUX_TYPE_CAN);
    528 	} else if (hwconfig_subarg_cmp("fsl_p1010mux", "tdm_can", "tdm")) {
    529 		clrbits_be32(&gur->pmuxcr, MPC85xx_PMUXCR_CAN2_UART |
    530 				MPC85xx_PMUXCR_CAN1_UART);
    531 		setbits_be32(&gur->pmuxcr, MPC85xx_PMUXCR_CAN2_TDM |
    532 				MPC85xx_PMUXCR_CAN1_TDM);
    533 		clrbits_be32(&gur->pmuxcr2, MPC85xx_PMUXCR2_UART_GPIO);
    534 		setbits_be32(&gur->pmuxcr2, MPC85xx_PMUXCR2_UART_TDM);
    535 		config_board_mux(MUX_TYPE_TDM);
    536 	} else {
    537 		/* defaultly spi_cs_sel to flash */
    538 		config_board_mux(MUX_TYPE_SPIFLASH);
    539 	}
    540 
    541 	if (hwconfig("esdhc"))
    542 		config_board_mux(MUX_TYPE_SDHC);
    543 	else if (hwconfig("ifc"))
    544 		config_board_mux(MUX_TYPE_IFC);
    545 
    546 #ifdef CONFIG_TARGET_P1010RDB_PB
    547 	setbits_be32(&gur->pmuxcr2, MPC85xx_PMUXCR2_GPIO01_DRVVBUS);
    548 #endif
    549 	return 0;
    550 }
    551 
    552 #ifndef CONFIG_SPL_BUILD
    553 static int pin_mux_cmd(cmd_tbl_t *cmdtp, int flag, int argc,
    554 				char * const argv[])
    555 {
    556 	if (argc < 2)
    557 		return CMD_RET_USAGE;
    558 	if (strcmp(argv[1], "ifc") == 0)
    559 		config_board_mux(MUX_TYPE_IFC);
    560 	else if (strcmp(argv[1], "sdhc") == 0)
    561 		config_board_mux(MUX_TYPE_SDHC);
    562 	else
    563 		return CMD_RET_USAGE;
    564 	return 0;
    565 }
    566 
    567 U_BOOT_CMD(
    568 	mux, 2, 0, pin_mux_cmd,
    569 	"configure multiplexing pin for IFC/SDHC bus in runtime",
    570 	"bus_type (e.g. mux sdhc)"
    571 );
    572 #endif
    573