1 /* $OpenBSD: omusbtll.c,v 1.2 2013/11/06 19:03:07 syl Exp $ */
3 * Copyright (c) 2010 Dale Rahn <drahn@openbsd.org>
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.
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.
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>
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)
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)
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)))
87 struct omusbtll_softc
{
89 bus_space_tag_t sc_iot
;
90 bus_space_handle_t sc_ioh
;
93 void omusbtll_attach(struct device
*parent
, struct device
*self
, void *args
);
94 void omusbtll_init(uint32_t channel_mask
);
96 struct cfattach omusbtll_ca
= {
97 sizeof (struct omusbtll_softc
), NULL
, omusbtll_attach
100 struct cfdriver omusbtll_cd
= {
101 NULL
, "omusbtll", DV_DULL
104 struct omusbtll_softc
*omusbtll_sc
;
106 omusbtll_attach(struct device
*parent
, struct device
*self
, void *args
)
108 struct omusbtll_softc
*sc
= (struct omusbtll_softc
*) self
;
109 struct armv7_attach_args
*aa
= args
;
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__
);
120 prcm_enablemodule(PRCM_USBHOST1
);
121 prcm_enablemodule(PRCM_USBHOST2
);
123 prcm_enablemodule(PRCM_USBTLL
);
129 rev
= bus_space_read_1(sc
->sc_iot
, sc
->sc_ioh
, USBTLL_SYSCONFIG
);
131 printf(" rev %d.%d\n", rev
>> 4 & 0xf, rev
& 0xf);
140 void omusbtll_init(uint32_t channel_mask
)
144 /* global reacharound */
145 struct omusbtll_softc
*sc
= omusbtll_sc
;
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
);
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
);
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
));
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
);