xref: /rk3399_rockchip-uboot/include/usb/ulpi.h (revision 3e6e809f56e0278d964d45e18e6665687d9c174b)
1f93022c3SJana Rapava /*
2f93022c3SJana Rapava  * Generic ULPI interface.
3f93022c3SJana Rapava  *
4f93022c3SJana Rapava  * Copyright (C) 2011 Jana Rapava <fermata7@gmail.com>
5f93022c3SJana Rapava  * Copyright (C) 2011 CompuLab, Ltd. <www.compulab.co.il>
6f93022c3SJana Rapava  *
7f93022c3SJana Rapava  * Authors: Jana Rapava <fermata7@gmail.com>
8f93022c3SJana Rapava  *	    Igor Grinberg <grinberg@compulab.co.il>
9f93022c3SJana Rapava  *
10f93022c3SJana Rapava  * Register offsets taken from:
11f93022c3SJana Rapava  * linux/include/linux/usb/ulpi.h
12f93022c3SJana Rapava  *
13f93022c3SJana Rapava  * Original Copyrights follow:
14f93022c3SJana Rapava  * Copyright (C) 2010 Nokia Corporation
15f93022c3SJana Rapava  *
16f93022c3SJana Rapava  * This software is distributed under the terms of the GNU General
17f93022c3SJana Rapava  * Public License ("GPL") as published by the Free Software Foundation,
18f93022c3SJana Rapava  * version 2 of that License.
19f93022c3SJana Rapava  */
20f93022c3SJana Rapava 
21f93022c3SJana Rapava #ifndef __USB_ULPI_H__
22f93022c3SJana Rapava #define __USB_ULPI_H__
23f93022c3SJana Rapava 
24f93022c3SJana Rapava #define ULPI_ERROR	(1 << 8) /* overflow from any register value */
25f93022c3SJana Rapava 
26f93022c3SJana Rapava #ifndef CONFIG_USB_ULPI_TIMEOUT
27f93022c3SJana Rapava #define CONFIG_USB_ULPI_TIMEOUT 1000	/* timeout in us */
28f93022c3SJana Rapava #endif
29f93022c3SJana Rapava 
30f93022c3SJana Rapava /*
31*3e6e809fSGovindraj.R  * ulpi view port address and
32*3e6e809fSGovindraj.R  * Port_number that can be passed.
33*3e6e809fSGovindraj.R  * Any additional data to be passed can
34*3e6e809fSGovindraj.R  * be extended from this structure
35*3e6e809fSGovindraj.R  */
36*3e6e809fSGovindraj.R struct ulpi_viewport {
37*3e6e809fSGovindraj.R 	u32 viewport_addr;
38*3e6e809fSGovindraj.R 	u32 port_num;
39*3e6e809fSGovindraj.R };
40*3e6e809fSGovindraj.R 
41*3e6e809fSGovindraj.R /*
42f93022c3SJana Rapava  * Initialize the ULPI transciever and check the interface integrity.
43*3e6e809fSGovindraj.R  * @ulpi_vp -  structure containing ULPI viewport data
44f93022c3SJana Rapava  *
45f93022c3SJana Rapava  * returns 0 on success, ULPI_ERROR on failure.
46f93022c3SJana Rapava  */
47*3e6e809fSGovindraj.R int ulpi_init(struct ulpi_viewport *ulpi_vp);
48f93022c3SJana Rapava 
49f93022c3SJana Rapava /*
50f93022c3SJana Rapava  * Select transceiver speed.
51f93022c3SJana Rapava  * @speed	- ULPI_FC_HIGH_SPEED, ULPI_FC_FULL_SPEED (default),
52f93022c3SJana Rapava  *                ULPI_FC_LOW_SPEED,  ULPI_FC_FS4LS
53f93022c3SJana Rapava  * returns 0 on success, ULPI_ERROR on failure.
54f93022c3SJana Rapava  */
55*3e6e809fSGovindraj.R int ulpi_select_transceiver(struct ulpi_viewport *ulpi_vp, unsigned speed);
56f93022c3SJana Rapava 
57f93022c3SJana Rapava /*
58f93022c3SJana Rapava  * Enable/disable VBUS.
59f93022c3SJana Rapava  * @ext_power		- external VBUS supply is used (default is false)
60f93022c3SJana Rapava  * @ext_indicator	- external VBUS over-current indicator is used
61f93022c3SJana Rapava  *
62f93022c3SJana Rapava  * returns 0 on success, ULPI_ERROR on failure.
63f93022c3SJana Rapava  */
64*3e6e809fSGovindraj.R int ulpi_enable_vbus(struct ulpi_viewport *ulpi_vp,
65*3e6e809fSGovindraj.R 			int on, int ext_power, int ext_ind);
66f93022c3SJana Rapava 
67f93022c3SJana Rapava /*
68f93022c3SJana Rapava  * Enable/disable pull-down resistors on D+ and D- USB lines.
69f93022c3SJana Rapava  *
70f93022c3SJana Rapava  * returns 0 on success, ULPI_ERROR on failure.
71f93022c3SJana Rapava  */
72*3e6e809fSGovindraj.R int ulpi_set_pd(struct ulpi_viewport *ulpi_vp, int enable);
73f93022c3SJana Rapava 
74f93022c3SJana Rapava /*
75f93022c3SJana Rapava  * Select OpMode.
76f93022c3SJana Rapava  * @opmode	- ULPI_FC_OPMODE_NORMAL (default), ULPI_FC_OPMODE_NONDRIVING,
77f93022c3SJana Rapava  *		  ULPI_FC_OPMODE_DISABLE_NRZI,	   ULPI_FC_OPMODE_NOSYNC_NOEOP
78f93022c3SJana Rapava  *
79f93022c3SJana Rapava  * returns 0 on success, ULPI_ERROR on failure.
80f93022c3SJana Rapava  */
81*3e6e809fSGovindraj.R int ulpi_opmode_sel(struct ulpi_viewport *ulpi_vp, unsigned opmode);
82f93022c3SJana Rapava 
83f93022c3SJana Rapava /*
84f93022c3SJana Rapava  * Switch to Serial Mode.
85f93022c3SJana Rapava  * @smode	- ULPI_IFACE_6_PIN_SERIAL_MODE or ULPI_IFACE_3_PIN_SERIAL_MODE
86f93022c3SJana Rapava  *
87f93022c3SJana Rapava  * returns 0 on success, ULPI_ERROR on failure.
88f93022c3SJana Rapava  *
89f93022c3SJana Rapava  * Notes:
90f93022c3SJana Rapava  * Switches immediately to Serial Mode.
91f93022c3SJana Rapava  * To return from Serial Mode, STP line needs to be asserted.
92f93022c3SJana Rapava  */
93*3e6e809fSGovindraj.R int ulpi_serial_mode_enable(struct ulpi_viewport *ulpi_vp, unsigned smode);
94f93022c3SJana Rapava 
95f93022c3SJana Rapava /*
96f93022c3SJana Rapava  * Put PHY into low power mode.
97f93022c3SJana Rapava  *
98f93022c3SJana Rapava  * returns 0 on success, ULPI_ERROR on failure.
99f93022c3SJana Rapava  *
100f93022c3SJana Rapava  * Notes:
101f93022c3SJana Rapava  * STP line must be driven low to keep the PHY in suspend.
102f93022c3SJana Rapava  * To resume the PHY, STP line needs to be asserted.
103f93022c3SJana Rapava  */
104*3e6e809fSGovindraj.R int ulpi_suspend(struct ulpi_viewport *ulpi_vp);
105f93022c3SJana Rapava 
106f93022c3SJana Rapava /*
107f93022c3SJana Rapava  * Reset the transceiver. ULPI interface and registers are not affected.
108f93022c3SJana Rapava  *
109f93022c3SJana Rapava  * returns 0 on success, ULPI_ERROR on failure.
110f93022c3SJana Rapava  */
111*3e6e809fSGovindraj.R int ulpi_reset(struct ulpi_viewport *ulpi_vp);
112f93022c3SJana Rapava 
113f93022c3SJana Rapava 
114f93022c3SJana Rapava /* ULPI access methods below must be implemented for each ULPI viewport. */
115f93022c3SJana Rapava 
116f93022c3SJana Rapava /*
117f93022c3SJana Rapava  * Write to the ULPI PHY register via the viewport.
118f93022c3SJana Rapava  * @reg		- the ULPI register (one of the fields in struct ulpi_regs).
119f93022c3SJana Rapava  * @value	- the value - only 8 lower bits are used, others ignored.
120f93022c3SJana Rapava  *
121f93022c3SJana Rapava  * returns 0 on success, ULPI_ERROR on failure.
122f93022c3SJana Rapava  */
123*3e6e809fSGovindraj.R int ulpi_write(struct ulpi_viewport *ulpi_vp, u8 *reg, u32 value);
124f93022c3SJana Rapava 
125f93022c3SJana Rapava /*
126f93022c3SJana Rapava  * Read the ULPI PHY register content via the viewport.
127f93022c3SJana Rapava  * @reg		- the ULPI register (one of the fields in struct ulpi_regs).
128f93022c3SJana Rapava  *
129f93022c3SJana Rapava  * returns register content on success, ULPI_ERROR on failure.
130f93022c3SJana Rapava  */
131*3e6e809fSGovindraj.R u32 ulpi_read(struct ulpi_viewport *ulpi_vp, u8 *reg);
132f93022c3SJana Rapava 
133f93022c3SJana Rapava /*
134f93022c3SJana Rapava  * Wait for the reset to complete.
135f93022c3SJana Rapava  * The Link must not attempt to access the PHY until the reset has
136f93022c3SJana Rapava  * completed and DIR line is de-asserted.
137f93022c3SJana Rapava  */
138*3e6e809fSGovindraj.R int ulpi_reset_wait(struct ulpi_viewport *ulpi_vp);
139f93022c3SJana Rapava 
140f93022c3SJana Rapava /* Access Extended Register Set (indicator) */
141f93022c3SJana Rapava #define ACCESS_EXT_REGS_OFFSET	0x2f	/* read-write */
142f93022c3SJana Rapava /* Vendor-specific */
143f93022c3SJana Rapava #define VENDOR_SPEC_OFFSET	0x30
144f93022c3SJana Rapava 
145f93022c3SJana Rapava /*
146f93022c3SJana Rapava  * Extended Register Set
147f93022c3SJana Rapava  *
148f93022c3SJana Rapava  * Addresses 0x00-0x3F map directly to Immediate Register Set.
149f93022c3SJana Rapava  * Addresses 0x40-0x7F are reserved.
150f93022c3SJana Rapava  * Addresses 0x80-0xff are vendor-specific.
151f93022c3SJana Rapava  */
152f93022c3SJana Rapava #define EXT_VENDOR_SPEC_OFFSET	0x80
153f93022c3SJana Rapava 
154f93022c3SJana Rapava /* ULPI registers, bits and offsets definitions */
155f93022c3SJana Rapava struct ulpi_regs {
156f93022c3SJana Rapava 	/* Vendor ID and Product ID: 0x00 - 0x03 Read-only */
157f93022c3SJana Rapava 	u8	vendor_id_low;
158f93022c3SJana Rapava 	u8	vendor_id_high;
159f93022c3SJana Rapava 	u8	product_id_low;
160f93022c3SJana Rapava 	u8	product_id_high;
161f93022c3SJana Rapava 	/* Function Control: 0x04 - 0x06 Read */
162f93022c3SJana Rapava 	u8	function_ctrl;		/* 0x04 Write */
163f93022c3SJana Rapava 	u8	function_ctrl_set;	/* 0x05 Set */
164f93022c3SJana Rapava 	u8	function_ctrl_clear;	/* 0x06 Clear */
165f93022c3SJana Rapava 	/* Interface Control: 0x07 - 0x09 Read */
166f93022c3SJana Rapava 	u8	iface_ctrl;		/* 0x07 Write */
167f93022c3SJana Rapava 	u8	iface_ctrl_set;		/* 0x08 Set */
168f93022c3SJana Rapava 	u8	iface_ctrl_clear;	/* 0x09 Clear */
169f93022c3SJana Rapava 	/* OTG Control: 0x0A - 0x0C Read */
170f93022c3SJana Rapava 	u8	otg_ctrl;		/* 0x0A Write */
171f93022c3SJana Rapava 	u8	otg_ctrl_set;		/* 0x0B Set */
172f93022c3SJana Rapava 	u8	otg_ctrl_clear;		/* 0x0C Clear */
173f93022c3SJana Rapava 	/* USB Interrupt Enable Rising: 0x0D - 0x0F Read */
174f93022c3SJana Rapava 	u8	usb_ie_rising;		/* 0x0D Write */
175f93022c3SJana Rapava 	u8	usb_ie_rising_set;	/* 0x0E Set */
176f93022c3SJana Rapava 	u8	usb_ie_rising_clear;	/* 0x0F Clear */
177f93022c3SJana Rapava 	/* USB Interrupt Enable Falling: 0x10 - 0x12 Read */
178f93022c3SJana Rapava 	u8	usb_ie_falling;		/* 0x10 Write */
179f93022c3SJana Rapava 	u8	usb_ie_falling_set;	/* 0x11 Set */
180f93022c3SJana Rapava 	u8	usb_ie_falling_clear;	/* 0x12 Clear */
181f93022c3SJana Rapava 	/* USB Interrupt Status: 0x13 Read-only */
182f93022c3SJana Rapava 	u8	usb_int_status;
183f93022c3SJana Rapava 	/* USB Interrupt Latch: 0x14 Read-only with auto-clear */
184f93022c3SJana Rapava 	u8	usb_int_latch;
185f93022c3SJana Rapava 	/* Debug: 0x15 Read-only */
186f93022c3SJana Rapava 	u8	debug;
187f93022c3SJana Rapava 	/* Scratch Register: 0x16 - 0x18 Read */
188f93022c3SJana Rapava 	u8	scratch;		/* 0x16 Write */
189f93022c3SJana Rapava 	u8	scratch_set;		/* 0x17 Set */
190f93022c3SJana Rapava 	u8	scratch_clear;		/* 0x18 Clear */
191f93022c3SJana Rapava 	/*
192f93022c3SJana Rapava 	 * Optional Carkit registers:
193f93022c3SJana Rapava 	 * Carkit Control: 0x19 - 0x1B Read
194f93022c3SJana Rapava 	 */
195f93022c3SJana Rapava 	u8	carkit_ctrl;		/* 0x19 Write */
196f93022c3SJana Rapava 	u8	carkit_ctrl_set;	/* 0x1A Set */
197f93022c3SJana Rapava 	u8	carkit_ctrl_clear;	/* 0x1B Clear */
198f93022c3SJana Rapava 	/* Carkit Interrupt Delay: 0x1C Read, Write */
199f93022c3SJana Rapava 	u8	carkit_int_delay;
200f93022c3SJana Rapava 	/* Carkit Interrupt Enable: 0x1D - 0x1F Read */
201f93022c3SJana Rapava 	u8	carkit_ie;		/* 0x1D Write */
202f93022c3SJana Rapava 	u8	carkit_ie_set;		/* 0x1E Set */
203f93022c3SJana Rapava 	u8	carkit_ie_clear;	/* 0x1F Clear */
204f93022c3SJana Rapava 	/* Carkit Interrupt Status: 0x20 Read-only */
205f93022c3SJana Rapava 	u8	carkit_int_status;
206f93022c3SJana Rapava 	/* Carkit Interrupt Latch: 0x21 Read-only with auto-clear */
207f93022c3SJana Rapava 	u8	carkit_int_latch;
208f93022c3SJana Rapava 	/* Carkit Pulse Control: 0x22 - 0x24 Read */
209f93022c3SJana Rapava 	u8	carkit_pulse_ctrl;		/* 0x22 Write */
210f93022c3SJana Rapava 	u8	carkit_pulse_ctrl_set;		/* 0x23 Set */
211f93022c3SJana Rapava 	u8	carkit_pulse_ctrl_clear;	/* 0x24 Clear */
212f93022c3SJana Rapava 	/*
213f93022c3SJana Rapava 	 * Other optional registers:
214f93022c3SJana Rapava 	 * Transmit Positive Width: 0x25 Read, Write
215f93022c3SJana Rapava 	 */
216f93022c3SJana Rapava 	u8	transmit_pos_width;
217f93022c3SJana Rapava 	/* Transmit Negative Width: 0x26 Read, Write */
218f93022c3SJana Rapava 	u8	transmit_neg_width;
219f93022c3SJana Rapava 	/* Receive Polarity Recovery: 0x27 Read, Write */
220f93022c3SJana Rapava 	u8	recv_pol_recovery;
221f93022c3SJana Rapava 	/*
222f93022c3SJana Rapava 	 * Addresses 0x28 - 0x2E are reserved, so we use offsets
223f93022c3SJana Rapava 	 * for immediate registers with higher addresses
224f93022c3SJana Rapava 	 */
225f93022c3SJana Rapava };
226f93022c3SJana Rapava 
227f93022c3SJana Rapava /*
228f93022c3SJana Rapava  * Register Bits
229f93022c3SJana Rapava  */
230f93022c3SJana Rapava 
231f93022c3SJana Rapava /* Function Control */
232f93022c3SJana Rapava #define ULPI_FC_XCVRSEL_MASK		(3 << 0)
233f93022c3SJana Rapava #define ULPI_FC_HIGH_SPEED		(0 << 0)
234f93022c3SJana Rapava #define ULPI_FC_FULL_SPEED		(1 << 0)
235f93022c3SJana Rapava #define ULPI_FC_LOW_SPEED		(2 << 0)
236f93022c3SJana Rapava #define ULPI_FC_FS4LS			(3 << 0)
237f93022c3SJana Rapava #define ULPI_FC_TERMSELECT		(1 << 2)
238f93022c3SJana Rapava #define ULPI_FC_OPMODE_MASK		(3 << 3)
239f93022c3SJana Rapava #define ULPI_FC_OPMODE_NORMAL		(0 << 3)
240f93022c3SJana Rapava #define ULPI_FC_OPMODE_NONDRIVING	(1 << 3)
241f93022c3SJana Rapava #define ULPI_FC_OPMODE_DISABLE_NRZI	(2 << 3)
242f93022c3SJana Rapava #define ULPI_FC_OPMODE_NOSYNC_NOEOP	(3 << 3)
243f93022c3SJana Rapava #define ULPI_FC_RESET			(1 << 5)
244f93022c3SJana Rapava #define ULPI_FC_SUSPENDM		(1 << 6)
245f93022c3SJana Rapava 
246f93022c3SJana Rapava /* Interface Control */
247f93022c3SJana Rapava #define ULPI_IFACE_6_PIN_SERIAL_MODE	(1 << 0)
248f93022c3SJana Rapava #define ULPI_IFACE_3_PIN_SERIAL_MODE	(1 << 1)
249f93022c3SJana Rapava #define ULPI_IFACE_CARKITMODE		(1 << 2)
250f93022c3SJana Rapava #define ULPI_IFACE_CLOCKSUSPENDM	(1 << 3)
251f93022c3SJana Rapava #define ULPI_IFACE_AUTORESUME		(1 << 4)
252f93022c3SJana Rapava #define ULPI_IFACE_EXTVBUS_COMPLEMENT	(1 << 5)
253f93022c3SJana Rapava #define ULPI_IFACE_PASSTHRU		(1 << 6)
254f93022c3SJana Rapava #define ULPI_IFACE_PROTECT_IFC_DISABLE	(1 << 7)
255f93022c3SJana Rapava 
256f93022c3SJana Rapava /* OTG Control */
257f93022c3SJana Rapava #define ULPI_OTG_ID_PULLUP		(1 << 0)
258f93022c3SJana Rapava #define ULPI_OTG_DP_PULLDOWN		(1 << 1)
259f93022c3SJana Rapava #define ULPI_OTG_DM_PULLDOWN		(1 << 2)
260f93022c3SJana Rapava #define ULPI_OTG_DISCHRGVBUS		(1 << 3)
261f93022c3SJana Rapava #define ULPI_OTG_CHRGVBUS		(1 << 4)
262f93022c3SJana Rapava #define ULPI_OTG_DRVVBUS		(1 << 5)
263f93022c3SJana Rapava #define ULPI_OTG_DRVVBUS_EXT		(1 << 6)
264f93022c3SJana Rapava #define ULPI_OTG_EXTVBUSIND		(1 << 7)
265f93022c3SJana Rapava 
266f93022c3SJana Rapava /*
267f93022c3SJana Rapava  * USB Interrupt Enable Rising,
268f93022c3SJana Rapava  * USB Interrupt Enable Falling,
269f93022c3SJana Rapava  * USB Interrupt Status and
270f93022c3SJana Rapava  * USB Interrupt Latch
271f93022c3SJana Rapava  */
272f93022c3SJana Rapava #define ULPI_INT_HOST_DISCONNECT	(1 << 0)
273f93022c3SJana Rapava #define ULPI_INT_VBUS_VALID		(1 << 1)
274f93022c3SJana Rapava #define ULPI_INT_SESS_VALID		(1 << 2)
275f93022c3SJana Rapava #define ULPI_INT_SESS_END		(1 << 3)
276f93022c3SJana Rapava #define ULPI_INT_IDGRD			(1 << 4)
277f93022c3SJana Rapava 
278f93022c3SJana Rapava /* Debug */
279f93022c3SJana Rapava #define ULPI_DEBUG_LINESTATE0		(1 << 0)
280f93022c3SJana Rapava #define ULPI_DEBUG_LINESTATE1		(1 << 1)
281f93022c3SJana Rapava 
282f93022c3SJana Rapava /* Carkit Control */
283f93022c3SJana Rapava #define ULPI_CARKIT_CTRL_CARKITPWR		(1 << 0)
284f93022c3SJana Rapava #define ULPI_CARKIT_CTRL_IDGNDDRV		(1 << 1)
285f93022c3SJana Rapava #define ULPI_CARKIT_CTRL_TXDEN			(1 << 2)
286f93022c3SJana Rapava #define ULPI_CARKIT_CTRL_RXDEN			(1 << 3)
287f93022c3SJana Rapava #define ULPI_CARKIT_CTRL_SPKLEFTEN		(1 << 4)
288f93022c3SJana Rapava #define ULPI_CARKIT_CTRL_SPKRIGHTEN		(1 << 5)
289f93022c3SJana Rapava #define ULPI_CARKIT_CTRL_MICEN			(1 << 6)
290f93022c3SJana Rapava 
291f93022c3SJana Rapava /* Carkit Interrupt Enable */
292f93022c3SJana Rapava #define ULPI_CARKIT_INT_EN_IDFLOAT_RISE		(1 << 0)
293f93022c3SJana Rapava #define ULPI_CARKIT_INT_EN_IDFLOAT_FALL		(1 << 1)
294f93022c3SJana Rapava #define ULPI_CARKIT_INT_EN_CARINTDET		(1 << 2)
295f93022c3SJana Rapava #define ULPI_CARKIT_INT_EN_DP_RISE		(1 << 3)
296f93022c3SJana Rapava #define ULPI_CARKIT_INT_EN_DP_FALL		(1 << 4)
297f93022c3SJana Rapava 
298f93022c3SJana Rapava /* Carkit Interrupt Status and Latch */
299f93022c3SJana Rapava #define ULPI_CARKIT_INT_IDFLOAT			(1 << 0)
300f93022c3SJana Rapava #define ULPI_CARKIT_INT_CARINTDET		(1 << 1)
301f93022c3SJana Rapava #define ULPI_CARKIT_INT_DP			(1 << 2)
302f93022c3SJana Rapava 
303f93022c3SJana Rapava /* Carkit Pulse Control*/
304f93022c3SJana Rapava #define ULPI_CARKIT_PLS_CTRL_TXPLSEN		(1 << 0)
305f93022c3SJana Rapava #define ULPI_CARKIT_PLS_CTRL_RXPLSEN		(1 << 1)
306f93022c3SJana Rapava #define ULPI_CARKIT_PLS_CTRL_SPKRLEFT_BIASEN	(1 << 2)
307f93022c3SJana Rapava #define ULPI_CARKIT_PLS_CTRL_SPKRRIGHT_BIASEN	(1 << 3)
308f93022c3SJana Rapava 
309f93022c3SJana Rapava 
310f93022c3SJana Rapava #endif /* __USB_ULPI_H__ */
311