1 /*
2 * Copyright 2017 Rockchip Electronics Co., Ltd
3 * Frank Wang <frank.wang@rock-chips.com>
4 *
5 * SPDX-License-Identifier: GPL-2.0+
6 */
7
8 #ifndef __ROCKUSB_H__
9 #define __ROCKUSB_H__
10
11 #include <common.h>
12 #include <part.h>
13 #include <linux/usb/composite.h>
14
15 enum rkusb_cmd {
16 RKUSB_TEST_UNIT_READY = 0x00,
17 RKUSB_READ_FLASH_ID = 0x01,
18 RKUSB_SET_DEVICE_ID = 0x02,
19 RKUSB_TEST_BAD_BLOCK = 0x03,
20 RKUSB_READ_10 = 0x04,
21 RKUSB_WRITE_10 = 0x05,
22 RKUSB_ERASE_10 = 0x06,
23 RKUSB_WRITE_SPARE = 0x07,
24 RKUSB_READ_SPARE = 0x08,
25 RKUSB_ERASE_10_FORCE = 0x0B,
26 RKUSB_GET_VERSION = 0x0C,
27 RKUSB_LBA_READ_10 = 0x14,
28 RKUSB_LBA_WRITE_10 = 0x15,
29 RKUSB_ERASE_SYS_DISK = 0x16,
30 RKUSB_SDRAM_READ_10 = 0x17,
31 RKUSB_SDRAM_WRITE_10 = 0x18,
32 RKUSB_SDRAM_EXECUTE = 0x19,
33 RKUSB_READ_FLASH_INFO = 0x1A,
34 RKUSB_GET_CHIP_VER = 0x1B,
35 RKUSB_LOW_FORMAT = 0x1C,
36 RKUSB_SET_RESET_FLAG = 0x1E,
37 RKUSB_SPI_READ_10 = 0x21,
38 RKUSB_SPI_WRITE_10 = 0x22,
39 RKUSB_LBA_ERASE = 0x25,
40 RKUSB_VS_WRITE = 0x26,
41 RKUSB_VS_READ = 0x27,
42 RKUSB_UART_READ = 0x28,
43 RKUSB_SWITCH_STORAGE = 0x2A,
44 RKUSB_GET_STORAGE_MEDIA = 0x2B,
45 RKUSB_READ_OTP_DATA = 0x2C,
46 RKUSB_READ_CAPACITY = 0xAA,
47 RKUSB_SWITCH_USB3 = 0xBB,
48 RKUSB_RESET = 0xFF,
49 };
50
51 enum rkusb_rc {
52 RKUSB_RC_ERROR = -1,
53 RKUSB_RC_CONTINUE = 0,
54 RKUSB_RC_FINISHED = 1,
55 RKUSB_RC_UNKNOWN_CMND = 2,
56 };
57
58 struct fsg_common;
59
60 #ifdef CONFIG_CMD_ROCKUSB
61 #define IS_RKUSB_UMS_DNL(name) (!strncmp((name), "rkusb_ums_dnl", 13))
62
63 int rkusb_do_check_parity(struct fsg_common *common);
64 void rkusb_force_to_usb2(bool enable);
65 bool rkusb_force_usb2_enabled(void);
66 void rkusb_switch_to_usb3_enable(bool enable);
67 bool rkusb_switch_usb3_enabled(void);
68 bool rkusb_usb3_capable(void);
69
70 #else
71 #define IS_RKUSB_UMS_DNL(name) 0
72
73 struct fsg_buffhd;
74 struct fsg_dev;
75 struct fsg_common;
76 struct fsg_config;
77
78 static struct usb_descriptor_header *rkusb_fs_function[];
79 static struct usb_descriptor_header *rkusb_hs_function[];
80
rkusb_cmd_process(struct fsg_common * common,struct fsg_buffhd * bh,int * reply)81 static inline int rkusb_cmd_process(struct fsg_common *common,
82 struct fsg_buffhd *bh, int *reply)
83 {
84 return -EPERM;
85 }
86
rkusb_do_check_parity(struct fsg_common * common)87 static inline int rkusb_do_check_parity(struct fsg_common *common)
88 {
89 return -EOPNOTSUPP;
90 }
91
rkusb_force_to_usb2(bool enable)92 static inline void rkusb_force_to_usb2(bool enable)
93 {
94 }
95
rkusb_force_usb2_enabled(void)96 static inline bool rkusb_force_usb2_enabled(void)
97 {
98 return false;
99 }
100
rkusb_switch_to_usb3_enable(bool enable)101 static inline void rkusb_switch_to_usb3_enable(bool enable)
102 {
103 }
104
rkusb_switch_usb3_enabled(void)105 static inline bool rkusb_switch_usb3_enabled(void)
106 {
107 return false;
108 }
109
rkusb_usb3_capable(void)110 static inline bool rkusb_usb3_capable(void)
111 {
112 return false;
113 }
114 #endif
115
116 #ifdef CONFIG_USB_DWC3_GADGET
117 bool dwc3_gadget_is_connected(void);
118 #endif
119
120 /* Wait at maximum 60 seconds for cable connection */
121 #define RKUSB_CABLE_READY_TIMEOUT 60
122 #define SECTOR_SIZE 0x200
123
124 #define RKUSB_READ_LIMIT_ADDR (32 * 2048) /* 32MB */
125
126 struct rockusb {
127 struct ums *ums;
128 int ums_cnt;
129 bool force_usb2;
130 bool switch_usb3;
131 };
132
133 #endif /* __ROCKUSB_H__ */
134