mesong12_usb2phy.c revision 1.3 1 1.3 msaitoh /* $NetBSD: mesong12_usb2phy.c,v 1.3 2024/02/07 04:20:26 msaitoh Exp $ */
2 1.1 ryo
3 1.1 ryo /*
4 1.3 msaitoh * Copyright (c) 2021 Ryo Shimizu
5 1.1 ryo * All rights reserved.
6 1.1 ryo *
7 1.1 ryo * Redistribution and use in source and binary forms, with or without
8 1.1 ryo * modification, are permitted provided that the following conditions
9 1.1 ryo * are met:
10 1.1 ryo * 1. Redistributions of source code must retain the above copyright
11 1.1 ryo * notice, this list of conditions and the following disclaimer.
12 1.1 ryo * 2. Redistributions in binary form must reproduce the above copyright
13 1.1 ryo * notice, this list of conditions and the following disclaimer in the
14 1.1 ryo * documentation and/or other materials provided with the distribution.
15 1.1 ryo *
16 1.1 ryo * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
17 1.1 ryo * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 1.1 ryo * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 1.1 ryo * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
20 1.1 ryo * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 1.1 ryo * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22 1.1 ryo * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 1.1 ryo * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
24 1.1 ryo * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
25 1.1 ryo * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 1.1 ryo * POSSIBILITY OF SUCH DAMAGE.
27 1.1 ryo */
28 1.1 ryo
29 1.1 ryo #include <sys/cdefs.h>
30 1.3 msaitoh __KERNEL_RCSID(0, "$NetBSD: mesong12_usb2phy.c,v 1.3 2024/02/07 04:20:26 msaitoh Exp $");
31 1.1 ryo
32 1.1 ryo #include <sys/param.h>
33 1.1 ryo #include <sys/types.h>
34 1.1 ryo #include <sys/bus.h>
35 1.1 ryo #include <sys/device.h>
36 1.1 ryo
37 1.1 ryo #include <dev/fdt/fdtvar.h>
38 1.1 ryo
39 1.1 ryo /*
40 1.1 ryo * USB PHY 20: 0xff636000
41 1.1 ryo * USB PHY 21: 0xff63a000
42 1.1 ryo */
43 1.1 ryo #define USB2PHY_R00_REG 0x00
44 1.1 ryo #define USB2PHY_R01_REG 0x04
45 1.1 ryo #define USB2PHY_R02_REG 0x08
46 1.1 ryo #define USB2PHY_R03_REG 0x0c
47 1.1 ryo #define USB2PHY_R03_DISC_THRESH __BITS(7,4)
48 1.1 ryo #define USB2PHY_R03_HSDIC_REF __BITS(3,2)
49 1.1 ryo #define USB2PHY_R03_SQUELCH_REF __BITS(1,0)
50 1.1 ryo #define USB2PHY_R04_REG 0x10
51 1.1 ryo #define USB2PHY_R04_I_C2L_BIAS_TRIM __BITS(31,28)
52 1.1 ryo #define USB2PHY_R04_TEST_BYPASS_MODE_EN __BIT(27)
53 1.1 ryo #define USB2PHY_R04_I_C2L_CAL_DONE __BIT(26)
54 1.1 ryo #define USB2PHY_R04_I_C2L_CAL_RESET_N __BIT(25)
55 1.1 ryo #define USB2PHY_R04_I_C2L_CAL_EN __BIT(24)
56 1.1 ryo #define USB2PHY_R04_CALIBRATION_CODE_VALUE __BITS(23,0)
57 1.1 ryo #define USB2PHY_R05_REG 0x14
58 1.1 ryo #define USB2PHY_R06_REG 0x18
59 1.1 ryo #define USB2PHY_R07_REG 0x1c
60 1.1 ryo #define USB2PHY_R08_REG 0x20
61 1.1 ryo #define USB2PHY_R09_REG 0x24
62 1.1 ryo #define USB2PHY_R10_REG 0x28
63 1.1 ryo #define USB2PHY_R11_REG 0x2c
64 1.1 ryo #define USB2PHY_R12_REG 0x30
65 1.1 ryo #define USB2PHY_R13_REG 0x34
66 1.1 ryo #define USB2PHY_R13_I_C2L_FSLS_RX_EN __BIT(30)
67 1.1 ryo #define USB2PHY_R13_I_C2L_HS_RX_EN __BIT(29)
68 1.1 ryo #define USB2PHY_R13_I_C2L_FS_OE __BIT(28)
69 1.1 ryo #define USB2PHY_R13_I_C2L_HS_OE __BIT(27)
70 1.1 ryo #define USB2PHY_R13_I_C2L_LS_EN __BIT(26)
71 1.1 ryo #define USB2PHY_R13_I_C2L_FS_EN __BIT(25)
72 1.1 ryo #define USB2PHY_R13_I_C2L_HS_EN __BIT(24)
73 1.1 ryo #define USB2PHY_R13_BYPASS_HOST_DISCONNECT_ENABLE __BIT(23)
74 1.1 ryo #define USB2PHY_R13_BYPASS_HOST_DISCONNECT_VALUE __BIT(22)
75 1.1 ryo #define USB2PHY_R13_CLEAR_HOLD_HS_DISCONNECT __BIT(21)
76 1.1 ryo #define USB2PHY_R13_MINIMUM_COUNT_FOR_SYNC_DETECTION __BITS(20,16)
77 1.1 ryo #define USB2PHY_R13_UPDATE_PMA_SIGNALS __BIT(15)
78 1.1 ryo #define USB2PHY_R13_LOAD_STAT __BIT(14)
79 1.1 ryo #define USB2PHY_R13_CUSTOM_PATTERN_19 __BITS(7,0)
80 1.1 ryo #define USB2PHY_R14_REG 0x38
81 1.1 ryo #define USB2PHY_R14_BYPASS_CTRL __BITS(23,8)
82 1.1 ryo #define USB2PHY_R14_I_C2L_ASSERT_SINGLE_ENABLE_ZERO __BIT(6)
83 1.1 ryo #define USB2PHY_R14_I_C2L_DATA_16_8 __BIT(5)
84 1.1 ryo #define USB2PHY_R14_PG_RSTN __BIT(4)
85 1.1 ryo #define USB2PHY_R14_I_RPU_SW2_EN __BITS(3,2)
86 1.1 ryo #define USB2PHY_R14_I_RPU_SW1_EN __BIT(1)
87 1.1 ryo #define USB2PHY_R14_I_RDP_EN __BIT(0)
88 1.1 ryo #define USB2PHY_R15_REG 0x3c
89 1.1 ryo #define USB2PHY_R16_REG 0x40
90 1.1 ryo #define USB2PHY_R16_USB2_MPLL_LOCK_DIG __BIT(31)
91 1.1 ryo #define USB2PHY_R16_USB2_MPLL_LOCK __BIT(30)
92 1.1 ryo #define USB2PHY_R16_USB2_MPLL_RESET __BIT(29)
93 1.1 ryo #define USB2PHY_R16_USB2_MPLL_EN __BIT(28)
94 1.1 ryo #define USB2PHY_R16_USB2_MPLL_FAST_LOCK __BIT(27)
95 1.1 ryo #define USB2PHY_R16_USB2_MPLL_LOCK_F __BIT(26)
96 1.1 ryo #define USB2PHY_R16_USB2_MPLL_LOCK_LONG __BITS(25,24)
97 1.1 ryo #define USB2PHY_R16_USB2_MPLL_DCO_SDM_EN __BIT(23)
98 1.1 ryo #define USB2PHY_R16_USB2_MPLL_LOAD __BIT(22)
99 1.1 ryo #define USB2PHY_R16_USB2_MPLL_SDM_EN __BIT(21)
100 1.1 ryo #define USB2PHY_R16_USB2_MPLL_TDC_MODE __BIT(20)
101 1.1 ryo #define USB2PHY_R16_USB2_MPLL_N __BITS(14,10)
102 1.1 ryo #define USB2PHY_R16_USB2_MPLL_M __BITS(8,0)
103 1.1 ryo #define USB2PHY_R17_REG 0x44
104 1.1 ryo #define USB2PHY_R17_USB2_MPLL_FILTER_PVT1 __BITS(31,28)
105 1.1 ryo #define USB2PHY_R17_USB2_MPLL_FILTER_PVT2 __BITS(27,24)
106 1.1 ryo #define USB2PHY_R17_USB2_MPLL_FILTER_MODE __BIT(23)
107 1.1 ryo #define USB2PHY_R17_USB2_MPLL_LAMBDA0 __BITS(22,20)
108 1.1 ryo #define USB2PHY_R17_USB2_MPLL_LAMBDA1 __BITS(19,17)
109 1.1 ryo #define USB2PHY_R17_USB2_MPLL_FIX_EN __BIT(16)
110 1.1 ryo #define USB2PHY_R17_USB2_MPLL_FRAC_IN __BITS(13,0)
111 1.1 ryo #define USB2PHY_R18_REG 0x48
112 1.1 ryo #define USB2PHY_R18_USB2_MPLL_ACG_RANGE __BIT(31)
113 1.1 ryo #define USB2PHY_R18_USB2_MPLL_ADJ_LDO __BITS(30,29)
114 1.1 ryo #define USB2PHY_R18_USB2_MPLL_ALPHA __BITS(28,26)
115 1.1 ryo #define USB2PHY_R18_USB2_MPLL_BB_MODE __BITS(25,24)
116 1.1 ryo #define USB2PHY_R18_USB2_MPLL_BIAS_ADJ __BITS(23,22)
117 1.1 ryo #define USB2PHY_R18_USB2_MPLL_DATA_SEL __BITS(21,19)
118 1.1 ryo #define USB2PHY_R18_USB2_MPLL_ROU __BITS(18,16)
119 1.1 ryo #define USB2PHY_R18_USB2_MPLL_PFD_GAIN __BITS(15,14)
120 1.1 ryo #define USB2PHY_R18_USB2_MPLL_DCO_CLK_SEL __BIT(13)
121 1.1 ryo #define USB2PHY_R18_USB2_MPLL_DCO_M_EN __BIT(12)
122 1.1 ryo #define USB2PHY_R18_USB2_MPLL_LK_S __BITS(11,6)
123 1.1 ryo #define USB2PHY_R18_USB2_MPLL_LK_W __BITS(5,2)
124 1.1 ryo #define USB2PHY_R18_USB2_MPLL_LKW_SEL __BITS(1,0)
125 1.1 ryo #define USB2PHY_R19_REG 0x4c
126 1.1 ryo #define USB2PHY_R20_REG 0x50
127 1.1 ryo #define USB2PHY_R20_BYPASS_CAL_DONE_R5 __BIT(31)
128 1.1 ryo #define USB2PHY_R20_USB2_BGR_DBG_1_0 __BITS(30,29)
129 1.1 ryo #define USB2PHY_R20_USB2_BGR_VREF_4_0 __BITS(28,24)
130 1.1 ryo #define USB2PHY_R20_USB2_BGR_START __BIT(21)
131 1.1 ryo #define USB2PHY_R20_USB2_BGR_ADJ_4_0 __BITS(20,16)
132 1.1 ryo #define USB2PHY_R20_USB2_EDGE_DRV_TRIM_1_0 __BITS(15,14)
133 1.1 ryo #define USB2PHY_R20_USB2_EDGE_DRV_EN __BIT(13)
134 1.1 ryo #define USB2PHY_R20_USB2_DMON_SEL_3_0 __BITS(12,9)
135 1.1 ryo #define USB2PHY_R20_USB2_DMON_EN __BIT(8)
136 1.1 ryo #define USB2PHY_R20_BYPASS_OTG_DET __BIT(7)
137 1.1 ryo #define USB2PHY_R20_USB2_CAL_CODE_R5 __BIT(6)
138 1.1 ryo #define USB2PHY_R20_USB2_AMON_EN __BIT(5)
139 1.1 ryo #define USB2PHY_R20_USB2_OTG_VBUSDET_EN __BIT(4)
140 1.1 ryo #define USB2PHY_R20_USB2_OTG_VBUS_TRIM_2_0 __BITS(3,1)
141 1.1 ryo #define USB2PHY_R20_USB2_IDDET_EN __BIT(0)
142 1.1 ryo #define USB2PHY_R21_REG 0x54
143 1.1 ryo #define USB2PHY_R21_BYPASS_UTMI_REG __BITS(25,20)
144 1.1 ryo #define USB2PHY_R21_BYPASS_UTMI_CNTR __BITS(15,6)
145 1.1 ryo #define USB2PHY_R21_USB2_OTG_ACA_TRIM_1_0 __BITS(5,4)
146 1.1 ryo #define USB2PHY_R21_USB2_TX_STRG_PD __BIT(3)
147 1.1 ryo #define USB2PHY_R21_USB2_OTG_ACA_EN __BIT(2)
148 1.1 ryo #define USB2PHY_R21_USB2_CAL_ACK_EN __BIT(1)
149 1.1 ryo #define USB2PHY_R21_USB2_BGR_FORCE __BIT(0)
150 1.1 ryo #define USB2PHY_R22_REG 0x58
151 1.1 ryo #define USB2PHY_R23_REG 0x5c
152 1.1 ryo
153 1.1 ryo #define USB2PHY_READ_REG(sc, reg) \
154 1.1 ryo bus_space_read_4((sc)->sc_bst, (sc)->sc_bsh, (reg))
155 1.1 ryo #define USB2PHY_WRITE_REG(sc, reg, val) \
156 1.1 ryo bus_space_write_4((sc)->sc_bst, (sc)->sc_bsh, (reg), (val))
157 1.1 ryo
158 1.1 ryo struct mesong12_usb2phy_softc {
159 1.1 ryo device_t sc_dev;
160 1.1 ryo bus_space_tag_t sc_bst;
161 1.1 ryo bus_space_handle_t sc_bsh;
162 1.1 ryo struct clk *sc_clk;
163 1.1 ryo struct fdtbus_reset *sc_reset;
164 1.1 ryo struct fdtbus_regulator *sc_supply;
165 1.1 ryo int sc_phandle;
166 1.1 ryo };
167 1.1 ryo
168 1.1 ryo static void *
169 1.1 ryo mesong12_usb2phy_acquire(device_t dev, const void *data, size_t len)
170 1.1 ryo {
171 1.1 ryo if (len != 0)
172 1.1 ryo return NULL;
173 1.1 ryo
174 1.1 ryo return (void *)(uintptr_t)1;
175 1.1 ryo }
176 1.1 ryo
177 1.1 ryo static void
178 1.1 ryo mesong12_usb2phy_release(device_t dev, void *priv)
179 1.1 ryo {
180 1.1 ryo __nothing;
181 1.1 ryo }
182 1.1 ryo
183 1.1 ryo static int
184 1.1 ryo mesong12_usb2phy_enable(device_t dev, void *priv, bool enable)
185 1.1 ryo {
186 1.1 ryo struct mesong12_usb2phy_softc * const sc = device_private(dev);
187 1.1 ryo
188 1.1 ryo if (sc->sc_reset != NULL) {
189 1.1 ryo fdtbus_reset_assert(sc->sc_reset);
190 1.1 ryo delay(10);
191 1.1 ryo fdtbus_reset_deassert(sc->sc_reset);
192 1.1 ryo delay(1000);
193 1.1 ryo }
194 1.1 ryo
195 1.1 ryo if (sc->sc_supply != NULL)
196 1.1 ryo fdtbus_regulator_enable(sc->sc_supply);
197 1.1 ryo
198 1.1 ryo if (!enable)
199 1.1 ryo return 0;
200 1.1 ryo
201 1.1 ryo USB2PHY_WRITE_REG(sc, USB2PHY_R21_REG,
202 1.1 ryo USB2PHY_READ_REG(sc, USB2PHY_R21_REG) |
203 1.1 ryo USB2PHY_R21_USB2_OTG_ACA_EN);
204 1.1 ryo
205 1.1 ryo /* set PLL to 480MHz */
206 1.1 ryo USB2PHY_WRITE_REG(sc, USB2PHY_R16_REG,
207 1.1 ryo USB2PHY_R16_USB2_MPLL_RESET |
208 1.1 ryo USB2PHY_R16_USB2_MPLL_EN |
209 1.1 ryo USB2PHY_R16_USB2_MPLL_FAST_LOCK |
210 1.1 ryo __SHIFTIN(1, USB2PHY_R16_USB2_MPLL_LOCK_LONG) |
211 1.1 ryo USB2PHY_R16_USB2_MPLL_LOAD |
212 1.1 ryo __SHIFTIN(1, USB2PHY_R16_USB2_MPLL_N) |
213 1.1 ryo __SHIFTIN(20, USB2PHY_R16_USB2_MPLL_M));
214 1.1 ryo USB2PHY_WRITE_REG(sc, USB2PHY_R17_REG,
215 1.1 ryo __SHIFTIN(0, USB2PHY_R17_USB2_MPLL_FILTER_PVT1) |
216 1.1 ryo __SHIFTIN(7, USB2PHY_R17_USB2_MPLL_FILTER_PVT2) |
217 1.1 ryo __SHIFTIN(7, USB2PHY_R17_USB2_MPLL_LAMBDA0) |
218 1.1 ryo __SHIFTIN(2, USB2PHY_R17_USB2_MPLL_LAMBDA1) |
219 1.1 ryo __SHIFTIN(9, USB2PHY_R17_USB2_MPLL_FRAC_IN));
220 1.1 ryo USB2PHY_WRITE_REG(sc, USB2PHY_R18_REG,
221 1.1 ryo USB2PHY_R18_USB2_MPLL_ACG_RANGE |
222 1.1 ryo __SHIFTIN(1, USB2PHY_R18_USB2_MPLL_ADJ_LDO) |
223 1.1 ryo __SHIFTIN(3, USB2PHY_R18_USB2_MPLL_ALPHA) |
224 1.1 ryo __SHIFTIN(0, USB2PHY_R18_USB2_MPLL_BB_MODE) |
225 1.1 ryo __SHIFTIN(1, USB2PHY_R18_USB2_MPLL_BIAS_ADJ) |
226 1.1 ryo __SHIFTIN(3, USB2PHY_R18_USB2_MPLL_DATA_SEL) |
227 1.1 ryo __SHIFTIN(7, USB2PHY_R18_USB2_MPLL_ROU) |
228 1.1 ryo __SHIFTIN(1, USB2PHY_R18_USB2_MPLL_PFD_GAIN) |
229 1.1 ryo __SHIFTIN(39, USB2PHY_R18_USB2_MPLL_LK_S) |
230 1.1 ryo __SHIFTIN(9, USB2PHY_R18_USB2_MPLL_LK_W) |
231 1.1 ryo __SHIFTIN(1, USB2PHY_R18_USB2_MPLL_LKW_SEL));
232 1.1 ryo delay(100);
233 1.1 ryo USB2PHY_WRITE_REG(sc, USB2PHY_R16_REG,
234 1.1 ryo USB2PHY_R16_USB2_MPLL_EN |
235 1.1 ryo USB2PHY_R16_USB2_MPLL_FAST_LOCK |
236 1.1 ryo __SHIFTIN(1, USB2PHY_R16_USB2_MPLL_LOCK_LONG) |
237 1.1 ryo USB2PHY_R16_USB2_MPLL_LOAD |
238 1.1 ryo __SHIFTIN(1, USB2PHY_R16_USB2_MPLL_N) |
239 1.1 ryo __SHIFTIN(20, USB2PHY_R16_USB2_MPLL_M));
240 1.1 ryo
241 1.1 ryo /* tune PHY */
242 1.1 ryo USB2PHY_WRITE_REG(sc, USB2PHY_R20_REG,
243 1.1 ryo __SHIFTIN(0, USB2PHY_R20_USB2_BGR_DBG_1_0) |
244 1.1 ryo __SHIFTIN(0, USB2PHY_R20_USB2_BGR_VREF_4_0) |
245 1.1 ryo __SHIFTIN(0, USB2PHY_R20_USB2_BGR_ADJ_4_0) |
246 1.1 ryo __SHIFTIN(3, USB2PHY_R20_USB2_EDGE_DRV_TRIM_1_0) |
247 1.1 ryo USB2PHY_R20_USB2_EDGE_DRV_EN |
248 1.1 ryo __SHIFTIN(15, USB2PHY_R20_USB2_DMON_SEL_3_0) |
249 1.1 ryo USB2PHY_R20_USB2_OTG_VBUSDET_EN |
250 1.1 ryo __SHIFTIN(4, USB2PHY_R20_USB2_OTG_VBUS_TRIM_2_0));
251 1.1 ryo
252 1.1 ryo USB2PHY_WRITE_REG(sc, USB2PHY_R04_REG,
253 1.1 ryo __SHIFTIN(0, USB2PHY_R04_I_C2L_BIAS_TRIM) |
254 1.1 ryo USB2PHY_R04_TEST_BYPASS_MODE_EN |
255 1.1 ryo __SHIFTIN(0xfff, USB2PHY_R04_CALIBRATION_CODE_VALUE));
256 1.1 ryo
257 1.1 ryo /* tune disconnect threshold */
258 1.1 ryo USB2PHY_WRITE_REG(sc, USB2PHY_R03_REG,
259 1.1 ryo __SHIFTIN(3, USB2PHY_R03_DISC_THRESH) |
260 1.1 ryo __SHIFTIN(1, USB2PHY_R03_HSDIC_REF) |
261 1.1 ryo __SHIFTIN(0, USB2PHY_R03_SQUELCH_REF));
262 1.1 ryo
263 1.1 ryo /* analog settings */
264 1.1 ryo USB2PHY_WRITE_REG(sc, USB2PHY_R14_REG,
265 1.1 ryo __SHIFTIN(0, USB2PHY_R14_BYPASS_CTRL) |
266 1.1 ryo __SHIFTIN(0, USB2PHY_R14_I_RPU_SW2_EN));
267 1.1 ryo USB2PHY_WRITE_REG(sc, USB2PHY_R13_REG,
268 1.1 ryo __SHIFTIN(7, USB2PHY_R13_MINIMUM_COUNT_FOR_SYNC_DETECTION) |
269 1.1 ryo USB2PHY_R13_UPDATE_PMA_SIGNALS);
270 1.1 ryo
271 1.1 ryo return 0;
272 1.1 ryo }
273 1.1 ryo
274 1.2 thorpej static const struct device_compatible_entry compat_data[] = {
275 1.2 thorpej { .compat = "amlogic,g12a-usb2-phy" },
276 1.2 thorpej DEVICE_COMPAT_EOL
277 1.1 ryo };
278 1.1 ryo
279 1.1 ryo static int
280 1.1 ryo mesong12_usb2phy_match(device_t parent, cfdata_t cf, void *aux)
281 1.1 ryo {
282 1.1 ryo struct fdt_attach_args * const faa = aux;
283 1.1 ryo
284 1.2 thorpej return of_compatible_match(faa->faa_phandle, compat_data);
285 1.1 ryo }
286 1.1 ryo
287 1.1 ryo static const struct fdtbus_phy_controller_func mesong12_usb2phy_funcs = {
288 1.1 ryo .acquire = mesong12_usb2phy_acquire,
289 1.1 ryo .release = mesong12_usb2phy_release,
290 1.1 ryo .enable = mesong12_usb2phy_enable
291 1.1 ryo };
292 1.1 ryo
293 1.1 ryo static void
294 1.1 ryo mesong12_usb2phy_attach(device_t parent, device_t self, void *aux)
295 1.1 ryo {
296 1.1 ryo struct mesong12_usb2phy_softc * const sc = device_private(self);
297 1.1 ryo struct fdt_attach_args * const faa = aux;
298 1.1 ryo const int phandle = faa->faa_phandle;
299 1.1 ryo bus_addr_t addr;
300 1.1 ryo bus_size_t size;
301 1.1 ryo
302 1.1 ryo sc->sc_dev = self;
303 1.1 ryo sc->sc_bst = faa->faa_bst;
304 1.1 ryo sc->sc_phandle = phandle;
305 1.1 ryo
306 1.1 ryo if (fdtbus_get_reg(phandle, 0, &addr, &size) != 0) {
307 1.1 ryo aprint_error(": couldn't get registers\n");
308 1.1 ryo return;
309 1.1 ryo }
310 1.1 ryo if (bus_space_map(sc->sc_bst, addr, size, 0, &sc->sc_bsh) != 0) {
311 1.1 ryo aprint_error(": couldn't map registers\n");
312 1.1 ryo return;
313 1.1 ryo }
314 1.1 ryo
315 1.1 ryo sc->sc_clk = fdtbus_clock_get_index(phandle, 0);
316 1.1 ryo if (sc->sc_clk == NULL) {
317 1.1 ryo aprint_error(": couldn't get clock\n");
318 1.1 ryo goto attach_failure;
319 1.1 ryo }
320 1.1 ryo if (clk_enable(sc->sc_clk) != 0) {
321 1.1 ryo aprint_error(": couldn't enable clock\n");
322 1.1 ryo goto attach_failure;
323 1.1 ryo }
324 1.1 ryo
325 1.1 ryo sc->sc_reset = fdtbus_reset_get_index(phandle, 0);
326 1.1 ryo sc->sc_supply = fdtbus_regulator_acquire(phandle, "phy-supply");
327 1.1 ryo
328 1.1 ryo aprint_naive("\n");
329 1.1 ryo aprint_normal(": USB2 PHY\n");
330 1.1 ryo
331 1.1 ryo fdtbus_register_phy_controller(self, phandle, &mesong12_usb2phy_funcs);
332 1.1 ryo return;
333 1.1 ryo
334 1.1 ryo attach_failure:
335 1.1 ryo bus_space_unmap(sc->sc_bst, sc->sc_bsh, size);
336 1.1 ryo return;
337 1.1 ryo }
338 1.1 ryo
339 1.1 ryo CFATTACH_DECL_NEW(mesong12_usb2phy, sizeof(struct mesong12_usb2phy_softc),
340 1.1 ryo mesong12_usb2phy_match, mesong12_usb2phy_attach, NULL, NULL);
341