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