xref: /rk3399_rockchip-uboot/arch/arm/mach-rockchip/usbplug.c (revision a4719b90cc2f09e5348b830d61f32ab6d991069a)
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 #include <scsi.h>
13 
14 DECLARE_GLOBAL_DATA_PTR;
15 
16 struct bootdev_list {
17 	u32 if_type;
18 	u8 devnum;
19 	u8 iomux_routing;
20 };
21 
22 #if CONFIG_IS_ENABLED(ROCKCHIP_RK3588)
23 static const struct bootdev_list dev_list[] = {
24 	{IF_TYPE_MMC, 0, 0},
25 	{IF_TYPE_MTD, 0, 0}, /* BLK_MTD_NAND */
26 	{IF_TYPE_MTD, 1, 0}, /* BLK_MTD_SPI_NAND FSPI M0 */
27 	{IF_TYPE_MTD, 1, 1}, /* BLK_MTD_SPI_NAND FSPI M1 */
28 	{IF_TYPE_MTD, 1, 2}, /* BLK_MTD_SPI_NAND FSPI M2 */
29 	{IF_TYPE_MTD, 2, 0}, /* BLK_MTD_SPI_NOR FSPI M0 */
30 	{IF_TYPE_MTD, 2, 1}, /* BLK_MTD_SPI_NOR FSPI M1 */
31 	{IF_TYPE_MTD, 2, 2}, /* BLK_MTD_SPI_NOR FSPI M2 */
32 };
33 #elif CONFIG_IS_ENABLED(ROCKCHIP_RK3576)
34 static const struct bootdev_list dev_list[] = {
35 	{IF_TYPE_SCSI, 0, 0},
36 	{IF_TYPE_MMC, 0, 0},
37 	{IF_TYPE_MTD, 1, 0}, /* BLK_MTD_SPI_NAND FSPI0 M0 */
38 	{IF_TYPE_MTD, 1, 1}, /* BLK_MTD_SPI_NAND FSPI1 M0 */
39 	{IF_TYPE_MTD, 1, 2}, /* BLK_MTD_SPI_NAND FSPI1 M1 */
40 	{IF_TYPE_MTD, 2, 0}, /* BLK_MTD_SPI_NOR FSPI0 M0 */
41 	{IF_TYPE_MTD, 2, 1}, /* BLK_MTD_SPI_NOR FSPI1 M0 */
42 	{IF_TYPE_MTD, 2, 2}, /* BLK_MTD_SPI_NOR FSPI1 M0 */
43 };
44 #else
45 static const struct bootdev_list dev_list[] = {
46 	{IF_TYPE_MMC, 0, 0},
47 	{IF_TYPE_MTD, 0, 0}, /* BLK_MTD_NAND */
48 	{IF_TYPE_MTD, 1, 0}, /* BLK_MTD_SPI_NAND */
49 	{IF_TYPE_MTD, 2, 0}, /* BLK_MTD_SPI_NOR */
50 	{IF_TYPE_RKNAND, 0, 0},
51 };
52 #endif
53 
54 static struct blk_desc *boot_blk_desc;
55 struct blk_desc *rockchip_get_bootdev(void)
56 {
57 	return boot_blk_desc;
58 }
59 
60 __weak void board_set_iomux(enum if_type if_type, int devnum, int routing)
61 {
62 }
63 
64 __weak void board_unset_iomux(enum if_type if_type, int devnum, int routing)
65 {
66 }
67 
68 struct blk_desc *usbplug_blk_get_devnum_by_type(enum if_type if_type, int devnum)
69 {
70 	struct blk_desc *blk_desc = NULL;
71 	u8 iomux_routing;
72 	int i = 0;
73 
74 	for (i = 0; i < ARRAY_SIZE(dev_list); i++) {
75 		if (if_type != dev_list[i].if_type || devnum != dev_list[i].devnum)
76 			continue;
77 		iomux_routing = dev_list[i].iomux_routing;
78 		switch (if_type) {
79 #ifdef CONFIG_MMC
80 		case IF_TYPE_MMC:
81 			board_set_iomux(if_type, devnum, iomux_routing);
82 			mmc_initialize(gd->bd);
83 			break;
84 #endif
85 		case IF_TYPE_MTD:
86 			board_set_iomux(if_type, devnum, iomux_routing);
87 			break;
88 #if defined(CONFIG_SCSI) && defined(CONFIG_CMD_SCSI) && (defined(CONFIG_AHCI) || defined(CONFIG_UFS))
89 		case IF_TYPE_SCSI:
90 			scsi_scan(true);
91 			break;
92 #endif
93 		default:
94 			printf("Bootdev 0x%x is not support\n", if_type);
95 			return NULL;
96 		}
97 
98 		printf("scandev: %s %d m%d\n", blk_get_if_type_name(if_type), devnum, iomux_routing);
99 		blk_desc = blk_get_devnum_by_type(if_type, devnum);
100 		if (blk_desc)
101 			break;
102 
103 		board_unset_iomux(if_type, devnum, iomux_routing);
104 	}
105 
106 	boot_blk_desc = blk_desc;
107 
108 	return blk_desc;
109 }
110 
111 static char *bootdev_rockusb_cmd(void)
112 {
113 	struct blk_desc *blk_desc = NULL;
114 	u32 if_type = IF_TYPE_UNKNOWN;
115 	u8 devnum, iomux_routing;
116 	char *cmd;
117 	int i = 0;
118 
119 	for (i = 0; i < ARRAY_SIZE(dev_list); i++) {
120 		if_type = dev_list[i].if_type;
121 		devnum = dev_list[i].devnum;
122 		iomux_routing = dev_list[i].iomux_routing;
123 		switch (if_type) {
124 #ifdef CONFIG_MMC
125 		case IF_TYPE_MMC:
126 			board_set_iomux(if_type, devnum, iomux_routing);
127 			mmc_initialize(gd->bd);
128 			break;
129 #endif
130 		case IF_TYPE_MTD:
131 			board_set_iomux(if_type, devnum, iomux_routing);
132 			break;
133 #if defined(CONFIG_SCSI) && defined(CONFIG_CMD_SCSI) && (defined(CONFIG_AHCI) || defined(CONFIG_UFS))
134 		case IF_TYPE_SCSI:
135 			scsi_scan(true);
136 			break;
137 #endif
138 		default:
139 			printf("Bootdev 0x%x is not support\n", if_type);
140 			return NULL;
141 		}
142 
143 		printf("Scandev: %s %d m%d\n", blk_get_if_type_name(if_type), devnum, iomux_routing);
144 		blk_desc = blk_get_devnum_by_type(if_type, devnum);
145 		if (blk_desc)
146 			break;
147 
148 		board_unset_iomux(if_type, devnum, iomux_routing);
149 	}
150 
151 	boot_blk_desc = blk_desc;
152 
153 	if (!if_type) {
154 		printf("No boot device\n");
155 		return NULL;
156 	}
157 
158 	printf("Bootdev: %s %d\n", blk_get_if_type_name(if_type), devnum);
159 
160 	cmd = malloc(32);
161 	if (!cmd)
162 		return NULL;
163 
164 	snprintf(cmd, 32, "rockusb 0 %s %d", blk_get_if_type_name(if_type), devnum);
165 
166 	return cmd;
167 }
168 
169 int board_init(void)
170 {
171 	return run_command(bootdev_rockusb_cmd(), 0);
172 }
173 
174