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