xref: /openbsd/sys/arch/armv7/omap/omusbtll.c (revision 8d957e1a)
1 /* $OpenBSD: omusbtll.c,v 1.2 2013/11/06 19:03:07 syl Exp $ */
2 /*
3  * Copyright (c) 2010 Dale Rahn <drahn@openbsd.org>
4  *
5  * Permission to use, copy, modify, and distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17 
18 #include <sys/param.h>
19 #include <sys/systm.h>
20 #include <sys/queue.h>
21 #include <sys/device.h>
22 #include <sys/malloc.h>
23 #include <sys/evcount.h>
24 #include <machine/bus.h>
25 #include <machine/intr.h>
26 #include <armv7/armv7/armv7var.h>
27 #include <armv7/omap/prcmvar.h>
28 
29 /* registers */
30 #define USBTLL_REVISION			0x0000
31 #define USBTLL_SYSCONFIG		0x0010
32 #define USBTLL_SYSSTATUS		0x0014
33 #define USBTLL_IRQSTATUS		0x0018
34 #define USBTLL_IRQENABLE		0x001C
35 #define USBTLL_SHARED_CONF			0x0030
36 #define  USBTLL_SHARED_CONF_USB_90D_DDR_EN	(1<<6)
37 #define  USBTLL_SHARED_CONF_USB_180D_SDR_EN	(1<<5)
38 #define  USBTLL_SHARED_CONF_USB_DIVRATIO_SH	2
39 #define  USBTLL_SHARED_CONF_FCLK_REQ		(1<<1)
40 #define  USBTLL_SHARED_CONF_FCLK_IS_ON		(1<<0)
41 
42 #define USBTLL_CHANNEL_CONF_(i)		(0x0040 + (0x04 * (i)))
43 #define  USBTLL_CHANNEL_CONF_FSLSLINESTATE_SH       	28
44 #define  USBTLL_CHANNEL_CONF_FSLSMODE_SH   		24
45 #define  USBTLL_CHANNEL_CONF_TESTTXSE0   		(1<<20)
46 #define  USBTLL_CHANNEL_CONF_TESTTXDAT   		(1<<19)
47 #define  USBTLL_CHANNEL_CONF_TESTTXEN   		(1<<18)
48 #define  USBTLL_CHANNEL_CONF_TESTEN   			(1<<17)
49 #define  USBTLL_CHANNEL_CONF_DRVVBUS   			(1<<16)
50 #define  USBTLL_CHANNEL_CONF_CHRGVBUS   		(1<<15)
51 #define  USBTLL_CHANNEL_CONF_ULPINOBITSTUFF   		(1<<11)
52 #define  USBTLL_CHANNEL_CONF_ULPIAUTOIDLE   		(1<<10)
53 #define  USBTLL_CHANNEL_CONF_UTMIAUTOIDLE   		(1<<9)
54 #define  USBTLL_CHANNEL_CONF_ULPIDDRMODE     		(1<<8)
55 #define  USBTLL_CHANNEL_CONF_LPIOUTCLKMODE   		(1<<7)
56 #define  USBTLL_CHANNEL_CONF_TLLFULLSPEED   		(1<<6)
57 #define  USBTLL_CHANNEL_CONF_TLLCONNECT   		(1<<5)
58 #define  USBTLL_CHANNEL_CONF_TLLATTACH   		(1<<4)
59 #define  USBTLL_CHANNEL_CONF_UTMIISADEV       		(1<<3)
60 #define  USBTLL_CHANNEL_CONF_CHANMODE_SH    		1
61 #define  USBTLL_CHANNEL_CONF_CHANEN			(1<<0)
62 
63 /*
64 ULPI_VENDOR_ID_LO_(i)		(0x0800 + (0x100 * (i)))
65 ULPI_VENDOR_ID_HI_(i)		(0x0801 + (0x100 * (i)))
66 ULPI_PRODUCT_ID_LO_(i)		(0x0802 + (0x100 * (i)))
67 ULPI_PRODUCT_ID_HI_(i)		(0x0803 + (0x100 * (i)))
68 ULPI_FUNCTION_CTRL_(i)		(0x0804 + (0x100 * (i)))
69 ULPI_FUNCTION_CTRL_SET_(i)	(0x0805 + (0x100 * (i)))
70 ULPI_FUNCTION_CTRL_CLR_(i)	(0x0806 + (0x100 * (i)))
71 ULPI_INTERFACE_CTRL_(i)		(0x0807 + (0x100 * (i)))
72 ULPI_INTERFACE_CTRL_SET_(i)	(0x0808 + (0x100 * (i)))
73 ULPI_INTERFACE_CTRL_CLR_(i)	(0x0809 + (0x100 * (i)))
74 ULPI_OTG_CTRL_(i)		(0x080A + (0x100 * (i)))
75 ULPI_OTG_CTRL_SET_(i)		(0x080B + (0x100 * (i)))
76 ULPI_OTG_CTRL_CLR_(i)		(0x080C + (0x100 * (i)))
77 ULPI_USB_INT_EN_RISE_(i)	(0x080D + (0x100 * (i)))
78 ULPI_USB_INT_EN_RISE_SET_(i)	(0x080E + (0x100 * (i)))
79 ULPI_USB_INT_EN_RISE_CLR_(i)	(0x080F + (0x100 * (i)))
80 ULPI_USB_INT_EN_FALL_(i)	(0x0810 + (0x100 * (i)))
81 ULPI_USB_INT_EN_FALL_SET_(i)	(0x0811 + (0x100 * (i)))
82 ULPI_USB_INT_EN_FALL_CLR_(i)	(0x0812 + (0x100 * (i)))
83 ULPI_USB_INT_STATUS_(i)		(0x0813 + (0x100 * (i)))
84 ULPI_USB_INT_LATCH_(i)		(0x0814 + (0x100 * (i)))
85 */
86 
87 struct omusbtll_softc {
88 	struct device		sc_dev;
89 	bus_space_tag_t		sc_iot;
90 	bus_space_handle_t	sc_ioh;
91 };
92 
93 void omusbtll_attach(struct device *parent, struct device *self, void *args);
94 void omusbtll_init(uint32_t channel_mask);
95 
96 struct cfattach	omusbtll_ca = {
97 	sizeof (struct omusbtll_softc), NULL, omusbtll_attach
98 };
99 
100 struct cfdriver omusbtll_cd = {
101 	NULL, "omusbtll", DV_DULL
102 };
103 
104 struct omusbtll_softc *omusbtll_sc;
105 void
106 omusbtll_attach(struct device *parent, struct device *self, void *args)
107 {
108 	struct omusbtll_softc *sc = (struct omusbtll_softc *) self;
109 	struct armv7_attach_args *aa = args;
110 	u_int32_t rev;
111 
112 	sc->sc_iot = aa->aa_iot;
113 	if (bus_space_map(sc->sc_iot, aa->aa_dev->mem[0].addr,
114 	    aa->aa_dev->mem[0].size, 0, &sc->sc_ioh)) {
115 		printf("%s: bus_space_map failed!\n", __func__);
116 		return;
117 	}
118 
119 #if 0
120 	prcm_enablemodule(PRCM_USBHOST1);
121 	prcm_enablemodule(PRCM_USBHOST2);
122 #endif
123 	prcm_enablemodule(PRCM_USBTLL);
124 
125 	delay(10000);
126 
127 	//return;
128 #if 1
129 	rev = bus_space_read_1(sc->sc_iot, sc->sc_ioh, USBTLL_SYSCONFIG);
130 
131 	printf(" rev %d.%d\n", rev >> 4 & 0xf, rev & 0xf);
132 #endif
133 
134 	omusbtll_sc = sc;
135 
136 	omusbtll_init(0x3);
137 }
138 
139 
140 void omusbtll_init(uint32_t channel_mask)
141 {
142 	int i;
143 	uint32_t val;
144 	/* global reacharound */
145 	struct omusbtll_softc *sc = omusbtll_sc;
146 
147 	for(i = 0; i < 3; i++) {
148 		val = bus_space_read_4(sc->sc_iot, sc->sc_ioh,
149 		    USBTLL_CHANNEL_CONF_(i));
150 		val &= ~(USBTLL_CHANNEL_CONF_ULPINOBITSTUFF |
151 		    USBTLL_CHANNEL_CONF_ULPIAUTOIDLE |
152 		    USBTLL_CHANNEL_CONF_ULPIDDRMODE);
153 		bus_space_write_4(sc->sc_iot, sc->sc_ioh,
154 		    USBTLL_CHANNEL_CONF_(i), val);
155 	}
156 
157 	val = bus_space_read_4(sc->sc_iot, sc->sc_ioh, USBTLL_SHARED_CONF);
158 	val |= (USBTLL_SHARED_CONF_USB_180D_SDR_EN |
159 	    (1 << USBTLL_SHARED_CONF_USB_DIVRATIO_SH) |
160 	    USBTLL_SHARED_CONF_FCLK_IS_ON);
161 	val &= ~(USBTLL_SHARED_CONF_USB_90D_DDR_EN);
162 	bus_space_write_4(sc->sc_iot, sc->sc_ioh, USBTLL_SHARED_CONF, val);
163 
164 	for (i = 0; i < 3; i++) {
165 		if (channel_mask & (1<<i)) {
166 			val = bus_space_read_4(sc->sc_iot, sc->sc_ioh,
167 			    USBTLL_CHANNEL_CONF_(i));
168 
169 			val |= USBTLL_CHANNEL_CONF_CHANEN;
170 			bus_space_write_4(sc->sc_iot, sc->sc_ioh,
171 			    USBTLL_CHANNEL_CONF_(i), val);
172 		printf("usbtll enabling %d\n", i);
173 		}
174 	}
175 }
176