initial commit, pull in sys/arch/armv7/omap
[bbb-pru.git] / omusbtll.c
CommitLineData
cf3c20ae 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/*
64ULPI_VENDOR_ID_LO_(i) (0x0800 + (0x100 * (i)))
65ULPI_VENDOR_ID_HI_(i) (0x0801 + (0x100 * (i)))
66ULPI_PRODUCT_ID_LO_(i) (0x0802 + (0x100 * (i)))
67ULPI_PRODUCT_ID_HI_(i) (0x0803 + (0x100 * (i)))
68ULPI_FUNCTION_CTRL_(i) (0x0804 + (0x100 * (i)))
69ULPI_FUNCTION_CTRL_SET_(i) (0x0805 + (0x100 * (i)))
70ULPI_FUNCTION_CTRL_CLR_(i) (0x0806 + (0x100 * (i)))
71ULPI_INTERFACE_CTRL_(i) (0x0807 + (0x100 * (i)))
72ULPI_INTERFACE_CTRL_SET_(i) (0x0808 + (0x100 * (i)))
73ULPI_INTERFACE_CTRL_CLR_(i) (0x0809 + (0x100 * (i)))
74ULPI_OTG_CTRL_(i) (0x080A + (0x100 * (i)))
75ULPI_OTG_CTRL_SET_(i) (0x080B + (0x100 * (i)))
76ULPI_OTG_CTRL_CLR_(i) (0x080C + (0x100 * (i)))
77ULPI_USB_INT_EN_RISE_(i) (0x080D + (0x100 * (i)))
78ULPI_USB_INT_EN_RISE_SET_(i) (0x080E + (0x100 * (i)))
79ULPI_USB_INT_EN_RISE_CLR_(i) (0x080F + (0x100 * (i)))
80ULPI_USB_INT_EN_FALL_(i) (0x0810 + (0x100 * (i)))
81ULPI_USB_INT_EN_FALL_SET_(i) (0x0811 + (0x100 * (i)))
82ULPI_USB_INT_EN_FALL_CLR_(i) (0x0812 + (0x100 * (i)))
83ULPI_USB_INT_STATUS_(i) (0x0813 + (0x100 * (i)))
84ULPI_USB_INT_LATCH_(i) (0x0814 + (0x100 * (i)))
85*/
86
87struct omusbtll_softc {
88 struct device sc_dev;
89 bus_space_tag_t sc_iot;
90 bus_space_handle_t sc_ioh;
91};
92
93void omusbtll_attach(struct device *parent, struct device *self, void *args);
94void omusbtll_init(uint32_t channel_mask);
95
96struct cfattach omusbtll_ca = {
97 sizeof (struct omusbtll_softc), NULL, omusbtll_attach
98};
99
100struct cfdriver omusbtll_cd = {
101 NULL, "omusbtll", DV_DULL
102};
103
104struct omusbtll_softc *omusbtll_sc;
105void
106omusbtll_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
140void 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}