1f16e43f8SFrank Wang /*
2f16e43f8SFrank Wang * Copyright 2017 Rockchip Electronics Co., Ltd
3f16e43f8SFrank Wang * Frank Wang <frank.wang@rock-chips.com>
4f16e43f8SFrank Wang *
5f16e43f8SFrank Wang * SPDX-License-Identifier: GPL-2.0+
6f16e43f8SFrank Wang */
7f16e43f8SFrank Wang
8f16e43f8SFrank Wang #ifndef __ROCKUSB_H__
9f16e43f8SFrank Wang #define __ROCKUSB_H__
10f16e43f8SFrank Wang
11f16e43f8SFrank Wang #include <common.h>
12f16e43f8SFrank Wang #include <part.h>
13f16e43f8SFrank Wang #include <linux/usb/composite.h>
14f16e43f8SFrank Wang
15f16e43f8SFrank Wang enum rkusb_cmd {
16f16e43f8SFrank Wang RKUSB_TEST_UNIT_READY = 0x00,
17f16e43f8SFrank Wang RKUSB_READ_FLASH_ID = 0x01,
18f16e43f8SFrank Wang RKUSB_SET_DEVICE_ID = 0x02,
19f16e43f8SFrank Wang RKUSB_TEST_BAD_BLOCK = 0x03,
20f16e43f8SFrank Wang RKUSB_READ_10 = 0x04,
21f16e43f8SFrank Wang RKUSB_WRITE_10 = 0x05,
22f16e43f8SFrank Wang RKUSB_ERASE_10 = 0x06,
23f16e43f8SFrank Wang RKUSB_WRITE_SPARE = 0x07,
24f16e43f8SFrank Wang RKUSB_READ_SPARE = 0x08,
25f16e43f8SFrank Wang RKUSB_ERASE_10_FORCE = 0x0B,
26f16e43f8SFrank Wang RKUSB_GET_VERSION = 0x0C,
27f16e43f8SFrank Wang RKUSB_LBA_READ_10 = 0x14,
28f16e43f8SFrank Wang RKUSB_LBA_WRITE_10 = 0x15,
29f16e43f8SFrank Wang RKUSB_ERASE_SYS_DISK = 0x16,
30f16e43f8SFrank Wang RKUSB_SDRAM_READ_10 = 0x17,
31f16e43f8SFrank Wang RKUSB_SDRAM_WRITE_10 = 0x18,
32f16e43f8SFrank Wang RKUSB_SDRAM_EXECUTE = 0x19,
33f16e43f8SFrank Wang RKUSB_READ_FLASH_INFO = 0x1A,
34f16e43f8SFrank Wang RKUSB_GET_CHIP_VER = 0x1B,
35f16e43f8SFrank Wang RKUSB_LOW_FORMAT = 0x1C,
36f16e43f8SFrank Wang RKUSB_SET_RESET_FLAG = 0x1E,
37f16e43f8SFrank Wang RKUSB_SPI_READ_10 = 0x21,
38f16e43f8SFrank Wang RKUSB_SPI_WRITE_10 = 0x22,
39f16e43f8SFrank Wang RKUSB_LBA_ERASE = 0x25,
400d0c3248SFrank Wang RKUSB_VS_WRITE = 0x26,
410d0c3248SFrank Wang RKUSB_VS_READ = 0x27,
42*4428ea84SYifeng Zhao RKUSB_UART_READ = 0x28,
434d2787f5SJon Lin RKUSB_SWITCH_STORAGE = 0x2A,
44d4cce25eSYifeng Zhao RKUSB_GET_STORAGE_MEDIA = 0x2B,
458168f857SYifeng Zhao RKUSB_READ_OTP_DATA = 0x2C,
46f16e43f8SFrank Wang RKUSB_READ_CAPACITY = 0xAA,
4736c87911Swilliam.wu RKUSB_SWITCH_USB3 = 0xBB,
48f16e43f8SFrank Wang RKUSB_RESET = 0xFF,
49f16e43f8SFrank Wang };
50f16e43f8SFrank Wang
51f16e43f8SFrank Wang enum rkusb_rc {
52f16e43f8SFrank Wang RKUSB_RC_ERROR = -1,
53f16e43f8SFrank Wang RKUSB_RC_CONTINUE = 0,
54f16e43f8SFrank Wang RKUSB_RC_FINISHED = 1,
55f16e43f8SFrank Wang RKUSB_RC_UNKNOWN_CMND = 2,
56f16e43f8SFrank Wang };
57f16e43f8SFrank Wang
582c0c66c1SYifeng Zhao struct fsg_common;
592c0c66c1SYifeng Zhao
60f16e43f8SFrank Wang #ifdef CONFIG_CMD_ROCKUSB
61f16e43f8SFrank Wang #define IS_RKUSB_UMS_DNL(name) (!strncmp((name), "rkusb_ums_dnl", 13))
622c0c66c1SYifeng Zhao
632c0c66c1SYifeng Zhao int rkusb_do_check_parity(struct fsg_common *common);
6436c87911Swilliam.wu void rkusb_force_to_usb2(bool enable);
6536c87911Swilliam.wu bool rkusb_force_usb2_enabled(void);
6636c87911Swilliam.wu void rkusb_switch_to_usb3_enable(bool enable);
6736c87911Swilliam.wu bool rkusb_switch_usb3_enabled(void);
6836c87911Swilliam.wu bool rkusb_usb3_capable(void);
6936c87911Swilliam.wu
70f16e43f8SFrank Wang #else
71f16e43f8SFrank Wang #define IS_RKUSB_UMS_DNL(name) 0
72f16e43f8SFrank Wang
73f16e43f8SFrank Wang struct fsg_buffhd;
74f16e43f8SFrank Wang struct fsg_dev;
75f16e43f8SFrank Wang struct fsg_common;
76f16e43f8SFrank Wang struct fsg_config;
77f16e43f8SFrank Wang
78f16e43f8SFrank Wang static struct usb_descriptor_header *rkusb_fs_function[];
79f16e43f8SFrank Wang static struct usb_descriptor_header *rkusb_hs_function[];
80f16e43f8SFrank Wang
rkusb_cmd_process(struct fsg_common * common,struct fsg_buffhd * bh,int * reply)81f16e43f8SFrank Wang static inline int rkusb_cmd_process(struct fsg_common *common,
82f16e43f8SFrank Wang struct fsg_buffhd *bh, int *reply)
83f16e43f8SFrank Wang {
84f16e43f8SFrank Wang return -EPERM;
85f16e43f8SFrank Wang }
862c0c66c1SYifeng Zhao
rkusb_do_check_parity(struct fsg_common * common)872c0c66c1SYifeng Zhao static inline int rkusb_do_check_parity(struct fsg_common *common)
882c0c66c1SYifeng Zhao {
892c0c66c1SYifeng Zhao return -EOPNOTSUPP;
902c0c66c1SYifeng Zhao }
9136c87911Swilliam.wu
rkusb_force_to_usb2(bool enable)9236c87911Swilliam.wu static inline void rkusb_force_to_usb2(bool enable)
9336c87911Swilliam.wu {
9436c87911Swilliam.wu }
9536c87911Swilliam.wu
rkusb_force_usb2_enabled(void)9636c87911Swilliam.wu static inline bool rkusb_force_usb2_enabled(void)
9736c87911Swilliam.wu {
9836c87911Swilliam.wu return false;
9936c87911Swilliam.wu }
10036c87911Swilliam.wu
rkusb_switch_to_usb3_enable(bool enable)10136c87911Swilliam.wu static inline void rkusb_switch_to_usb3_enable(bool enable)
10236c87911Swilliam.wu {
10336c87911Swilliam.wu }
10436c87911Swilliam.wu
rkusb_switch_usb3_enabled(void)10536c87911Swilliam.wu static inline bool rkusb_switch_usb3_enabled(void)
10636c87911Swilliam.wu {
10736c87911Swilliam.wu return false;
10836c87911Swilliam.wu }
10936c87911Swilliam.wu
rkusb_usb3_capable(void)11036c87911Swilliam.wu static inline bool rkusb_usb3_capable(void)
11136c87911Swilliam.wu {
11236c87911Swilliam.wu return false;
11336c87911Swilliam.wu }
11436c87911Swilliam.wu #endif
11536c87911Swilliam.wu
11636c87911Swilliam.wu #ifdef CONFIG_USB_DWC3_GADGET
11736c87911Swilliam.wu bool dwc3_gadget_is_connected(void);
118f16e43f8SFrank Wang #endif
119f16e43f8SFrank Wang
120aa9b1b59SFrank Wang /* Wait at maximum 60 seconds for cable connection */
121aa9b1b59SFrank Wang #define RKUSB_CABLE_READY_TIMEOUT 60
122aa9b1b59SFrank Wang #define SECTOR_SIZE 0x200
123aa9b1b59SFrank Wang
124628c8271SJason Zhu #define RKUSB_READ_LIMIT_ADDR (32 * 2048) /* 32MB */
125628c8271SJason Zhu
126aa9b1b59SFrank Wang struct rockusb {
127aa9b1b59SFrank Wang struct ums *ums;
128aa9b1b59SFrank Wang int ums_cnt;
12936c87911Swilliam.wu bool force_usb2;
13036c87911Swilliam.wu bool switch_usb3;
131aa9b1b59SFrank Wang };
132aa9b1b59SFrank Wang
133f16e43f8SFrank Wang #endif /* __ROCKUSB_H__ */
134