xref: /linux/include/linux/usb/musb.h (revision cdd5b5a9761fd66d17586e4f4ba6588c70e640ea)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * This is used to for host and peripheral modes of the driver for
4  * Inventra (Multidrop) Highspeed Dual-Role Controllers:  (M)HDRC.
5  *
6  * Board initialization should put one of these into dev->platform_data,
7  * probably on some platform_device named "musb-hdrc".  It encapsulates
8  * key configuration differences between boards.
9  */
10 
11 #ifndef __LINUX_USB_MUSB_H
12 #define __LINUX_USB_MUSB_H
13 
14 /* The USB role is defined by the connector used on the board, so long as
15  * standards are being followed.  (Developer boards sometimes won't.)
16  */
17 enum musb_mode {
18 	MUSB_UNDEFINED = 0,
19 	MUSB_HOST,		/* A or Mini-A connector */
20 	MUSB_PERIPHERAL,	/* B or Mini-B connector */
21 	MUSB_OTG		/* Mini-AB connector */
22 };
23 
24 struct clk;
25 
26 enum musb_fifo_style {
27 	FIFO_RXTX,
28 	FIFO_TX,
29 	FIFO_RX
30 } __attribute__ ((packed));
31 
32 enum musb_buf_mode {
33 	BUF_SINGLE,
34 	BUF_DOUBLE
35 } __attribute__ ((packed));
36 
37 struct musb_fifo_cfg {
38 	u8			hw_ep_num;
39 	enum musb_fifo_style	style;
40 	enum musb_buf_mode	mode;
41 	u16			maxpacket;
42 };
43 
44 #define MUSB_EP_FIFO(ep, st, m, pkt)		\
45 {						\
46 	.hw_ep_num	= ep,			\
47 	.style		= st,			\
48 	.mode		= m,			\
49 	.maxpacket	= pkt,			\
50 }
51 
52 #define MUSB_EP_FIFO_SINGLE(ep, st, pkt)	\
53 	MUSB_EP_FIFO(ep, st, BUF_SINGLE, pkt)
54 
55 #define MUSB_EP_FIFO_DOUBLE(ep, st, pkt)	\
56 	MUSB_EP_FIFO(ep, st, BUF_DOUBLE, pkt)
57 
58 struct musb_hdrc_eps_bits {
59 	const char	name[16];
60 	u8		bits;
61 };
62 
63 struct musb_hdrc_config {
64 	struct musb_fifo_cfg	*fifo_cfg;	/* board fifo configuration */
65 	unsigned		fifo_cfg_size;	/* size of the fifo configuration */
66 
67 	/* MUSB configuration-specific details */
68 	unsigned	multipoint:1;	/* multipoint device */
69 	unsigned	dyn_fifo:1 __deprecated; /* supports dynamic fifo sizing */
70 
71 	/* need to explicitly de-assert the port reset after resume? */
72 	unsigned	host_port_deassert_reset_at_resume:1;
73 
74 	u8		num_eps;	/* number of endpoints _with_ ep0 */
75 	u8		ram_bits;	/* ram address size */
76 
77 	u32		maximum_speed;
78 };
79 
80 struct musb_hdrc_platform_data {
81 	/* MUSB_HOST, MUSB_PERIPHERAL, or MUSB_OTG */
82 	u8		mode;
83 
84 	/* for clk_get() */
85 	const char	*clock;
86 
87 	/* (HOST or OTG) switch VBUS on/off */
88 	int		(*set_vbus)(struct device *dev, int is_on);
89 
90 	/* (HOST or OTG) mA/2 power supplied on (default = 8mA) */
91 	u8		power;
92 
93 	/* (PERIPHERAL) mA/2 max power consumed (default = 100mA) */
94 	u8		min_power;
95 
96 	/* (HOST or OTG) msec/2 after VBUS on till power good */
97 	u8		potpgt;
98 
99 	/* (HOST or OTG) program PHY for external Vbus */
100 	unsigned	extvbus:1;
101 
102 	/* MUSB configuration-specific details */
103 	const struct musb_hdrc_config *config;
104 
105 	/* Architecture specific board data	*/
106 	void		*board_data;
107 
108 	/* Platform specific struct musb_ops pointer */
109 	const void	*platform_ops;
110 };
111 
112 enum musb_vbus_id_status {
113 	MUSB_UNKNOWN = 0,
114 	MUSB_ID_GROUND,
115 	MUSB_ID_FLOAT,
116 	MUSB_VBUS_VALID,
117 	MUSB_VBUS_OFF,
118 };
119 
120 #if IS_ENABLED(CONFIG_USB_MUSB_HDRC)
121 int musb_mailbox(enum musb_vbus_id_status status);
122 #else
musb_mailbox(enum musb_vbus_id_status status)123 static inline int musb_mailbox(enum musb_vbus_id_status status)
124 {
125 	return 0;
126 }
127 #endif
128 
129 /* TUSB 6010 support */
130 
131 #define	TUSB6010_OSCCLK_60	16667	/* psec/clk @ 60.0 MHz */
132 #define	TUSB6010_REFCLK_24	41667	/* psec/clk @ 24.0 MHz XI */
133 #define	TUSB6010_REFCLK_19	52083	/* psec/clk @ 19.2 MHz CLKIN */
134 
135 #endif /* __LINUX_USB_MUSB_H */
136