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