xref: /rk3399_rockchip-uboot/arch/arm/mach-rockchip/usbplug.c (revision ef777ce68bc2da9f8913dca4c402dab32ca652bc)
1 /*
2  * (C) Copyright 2020-2023 Rockchip Electronics Co., Ltd.
3  *
4  * SPDX-License-Identifier:     GPL-2.0+
5  */
6 
7 #include <common.h>
8 #include <debug_uart.h>
9 #include <malloc.h>
10 #include <mmc.h>
11 #include <stdlib.h>
12 
13 DECLARE_GLOBAL_DATA_PTR;
14 
15 struct bootdev_list {
16 	u32 if_type;
17 	u8 devnum;
18 	u8 iomux_routing;
19 };
20 
21 #if CONFIG_IS_ENABLED(ROCKCHIP_RK3588)
22 static const struct bootdev_list dev_list[] = {
23 	{IF_TYPE_MMC, 0, 0},
24 	{IF_TYPE_MTD, 0, 0}, /* BLK_MTD_NAND */
25 	{IF_TYPE_MTD, 1, 0}, /* BLK_MTD_SPI_NAND FSPI M0 */
26 	{IF_TYPE_MTD, 1, 1}, /* BLK_MTD_SPI_NAND FSPI M1 */
27 	{IF_TYPE_MTD, 1, 2}, /* BLK_MTD_SPI_NAND FSPI M2 */
28 	{IF_TYPE_MTD, 2, 0}, /* BLK_MTD_SPI_NOR FSPI M0 */
29 	{IF_TYPE_MTD, 2, 1}, /* BLK_MTD_SPI_NOR FSPI M1 */
30 	{IF_TYPE_MTD, 2, 2}, /* BLK_MTD_SPI_NOR FSPI M2 */
31 	{IF_TYPE_RKNAND, 2, 0},
32 };
33 #else
34 static const struct bootdev_list dev_list[] = {
35 	{IF_TYPE_MMC, 0, 0},
36 	{IF_TYPE_MTD, 0, 0}, /* BLK_MTD_NAND */
37 	{IF_TYPE_MTD, 1, 0}, /* BLK_MTD_SPI_NAND */
38 	{IF_TYPE_MTD, 2, 0}, /* BLK_MTD_SPI_NOR */
39 	{IF_TYPE_RKNAND, 0, 0},
40 };
41 #endif
42 
43 static struct blk_desc *boot_blk_desc;
44 struct blk_desc *rockchip_get_bootdev(void)
45 {
46 	return boot_blk_desc;
47 }
48 
49 __weak void board_set_iomux(enum if_type if_type, int devnum, int routing)
50 {
51 }
52 
53 struct blk_desc *usbplug_blk_get_devnum_by_type(enum if_type if_type, int devnum)
54 {
55 	struct blk_desc *blk_desc = NULL;
56 	u8 iomux_routing;
57 	int i = 0;
58 
59 	for (i = 0; i < ARRAY_SIZE(dev_list); i++) {
60 		if (if_type != dev_list[i].if_type || devnum != dev_list[i].devnum)
61 			continue;
62 		iomux_routing = dev_list[i].iomux_routing;
63 		switch (if_type) {
64 #ifdef CONFIG_MMC
65 		case IF_TYPE_MMC:
66 			board_set_iomux(if_type, devnum, iomux_routing);
67 			mmc_initialize(gd->bd);
68 			break;
69 #endif
70 		case IF_TYPE_MTD:
71 			board_set_iomux(if_type, devnum, iomux_routing);
72 			break;
73 		default:
74 			printf("Bootdev 0x%x is not support\n", if_type);
75 			return NULL;
76 		}
77 
78 		printf("scandev: %s %d m%d\n", blk_get_if_type_name(if_type), devnum, iomux_routing);
79 		blk_desc = blk_get_devnum_by_type(if_type, devnum);
80 		if (blk_desc)
81 			break;
82 	}
83 
84 	boot_blk_desc = blk_desc;
85 
86 	return blk_desc;
87 }
88 
89 static char *bootdev_rockusb_cmd(void)
90 {
91 	struct blk_desc *blk_desc = NULL;
92 	u32 if_type = IF_TYPE_UNKNOWN;
93 	u8 devnum, iomux_routing;
94 	char *cmd;
95 	int i = 0;
96 
97 	for (i = 0; i < ARRAY_SIZE(dev_list); i++) {
98 		if_type = dev_list[i].if_type;
99 		devnum = dev_list[i].devnum;
100 		iomux_routing = dev_list[i].iomux_routing;
101 		switch (if_type) {
102 #ifdef CONFIG_MMC
103 		case IF_TYPE_MMC:
104 			board_set_iomux(if_type, devnum, iomux_routing);
105 			mmc_initialize(gd->bd);
106 			break;
107 #endif
108 		case IF_TYPE_MTD:
109 			board_set_iomux(if_type, devnum, iomux_routing);
110 			break;
111 		default:
112 			printf("Bootdev 0x%x is not support\n", if_type);
113 			return NULL;
114 		}
115 
116 		printf("Scandev: %s %d m%d\n", blk_get_if_type_name(if_type), devnum, iomux_routing);
117 		blk_desc = blk_get_devnum_by_type(if_type, devnum);
118 		if (blk_desc)
119 			break;
120 	}
121 
122 	boot_blk_desc = blk_desc;
123 
124 	if (!if_type) {
125 		printf("No boot device\n");
126 		return NULL;
127 	}
128 
129 	printf("Bootdev: %s %d\n", blk_get_if_type_name(if_type), devnum);
130 
131 	cmd = malloc(32);
132 	if (!cmd)
133 		return NULL;
134 
135 	snprintf(cmd, 32, "rockusb 0 %s %d", blk_get_if_type_name(if_type), devnum);
136 
137 	return cmd;
138 }
139 
140 int board_init(void)
141 {
142 	return run_command(bootdev_rockusb_cmd(), 0);
143 }
144 
145