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