android13/u-boot/arch/arm/mach-rockchip/usbplug.c

145 lines
3.2 KiB
C

/*
* (C) Copyright 2020-2023 Rockchip Electronics Co., Ltd.
*
* SPDX-License-Identifier: GPL-2.0+
*/
#include <common.h>
#include <debug_uart.h>
#include <malloc.h>
#include <mmc.h>
#include <stdlib.h>
DECLARE_GLOBAL_DATA_PTR;
struct bootdev_list {
u32 if_type;
u8 devnum;
u8 iomux_routing;
};
#if CONFIG_IS_ENABLED(ROCKCHIP_RK3588)
static const struct bootdev_list dev_list[] = {
{IF_TYPE_MMC, 0, 0},
{IF_TYPE_MTD, 0, 0}, /* BLK_MTD_NAND */
{IF_TYPE_MTD, 1, 0}, /* BLK_MTD_SPI_NAND FSPI M0 */
{IF_TYPE_MTD, 1, 1}, /* BLK_MTD_SPI_NAND FSPI M1 */
{IF_TYPE_MTD, 1, 2}, /* BLK_MTD_SPI_NAND FSPI M2 */
{IF_TYPE_MTD, 2, 0}, /* BLK_MTD_SPI_NOR FSPI M0 */
{IF_TYPE_MTD, 2, 1}, /* BLK_MTD_SPI_NOR FSPI M1 */
{IF_TYPE_MTD, 2, 2}, /* BLK_MTD_SPI_NOR FSPI M2 */
{IF_TYPE_RKNAND, 2, 0},
};
#else
static const struct bootdev_list dev_list[] = {
{IF_TYPE_MMC, 0, 0},
{IF_TYPE_MTD, 0, 0}, /* BLK_MTD_NAND */
{IF_TYPE_MTD, 1, 0}, /* BLK_MTD_SPI_NAND */
{IF_TYPE_MTD, 2, 0}, /* BLK_MTD_SPI_NOR */
{IF_TYPE_RKNAND, 0, 0},
};
#endif
static struct blk_desc *boot_blk_desc;
struct blk_desc *rockchip_get_bootdev(void)
{
return boot_blk_desc;
}
__weak void board_set_iomux(enum if_type if_type, int devnum, int routing)
{
}
struct blk_desc *usbplug_blk_get_devnum_by_type(enum if_type if_type, int devnum)
{
struct blk_desc *blk_desc = NULL;
u8 iomux_routing;
int i = 0;
for (i = 0; i < ARRAY_SIZE(dev_list); i++) {
if (if_type != dev_list[i].if_type || devnum != dev_list[i].devnum)
continue;
iomux_routing = dev_list[i].iomux_routing;
switch (if_type) {
#ifdef CONFIG_MMC
case IF_TYPE_MMC:
board_set_iomux(if_type, devnum, iomux_routing);
mmc_initialize(gd->bd);
break;
#endif
case IF_TYPE_MTD:
board_set_iomux(if_type, devnum, iomux_routing);
break;
default:
printf("Bootdev 0x%x is not support\n", if_type);
return NULL;
}
printf("scandev: %s %d m%d\n", blk_get_if_type_name(if_type), devnum, iomux_routing);
blk_desc = blk_get_devnum_by_type(if_type, devnum);
if (blk_desc)
break;
}
boot_blk_desc = blk_desc;
return blk_desc;
}
static char *bootdev_rockusb_cmd(void)
{
struct blk_desc *blk_desc = NULL;
u32 if_type = IF_TYPE_UNKNOWN;
u8 devnum, iomux_routing;
char *cmd;
int i = 0;
for (i = 0; i < ARRAY_SIZE(dev_list); i++) {
if_type = dev_list[i].if_type;
devnum = dev_list[i].devnum;
iomux_routing = dev_list[i].iomux_routing;
switch (if_type) {
#ifdef CONFIG_MMC
case IF_TYPE_MMC:
board_set_iomux(if_type, devnum, iomux_routing);
mmc_initialize(gd->bd);
break;
#endif
case IF_TYPE_MTD:
board_set_iomux(if_type, devnum, iomux_routing);
break;
default:
printf("Bootdev 0x%x is not support\n", if_type);
return NULL;
}
printf("Scandev: %s %d m%d\n", blk_get_if_type_name(if_type), devnum, iomux_routing);
blk_desc = blk_get_devnum_by_type(if_type, devnum);
if (blk_desc)
break;
}
boot_blk_desc = blk_desc;
if (!if_type) {
printf("No boot device\n");
return NULL;
}
printf("Bootdev: %s %d\n", blk_get_if_type_name(if_type), devnum);
cmd = malloc(32);
if (!cmd)
return NULL;
snprintf(cmd, 32, "rockusb 0 %s %d", blk_get_if_type_name(if_type), devnum);
return cmd;
}
int board_init(void)
{
return run_command(bootdev_rockusb_cmd(), 0);
}