xref: /openbmc/linux/arch/mips/alchemy/common/usb.c (revision 47aab533)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * USB block power/access management abstraction.
4  *
5  * Au1000+: The OHCI block control register is at the far end of the OHCI memory
6  *	    area. Au1550 has OHCI on different base address. No need to handle
7  *	    UDC here.
8  * Au1200:  one register to control access and clocks to O/EHCI, UDC and OTG
9  *	    as well as the PHY for EHCI and UDC.
10  *
11  */
12 
13 #include <linux/clk.h>
14 #include <linux/export.h>
15 #include <linux/init.h>
16 #include <linux/io.h>
17 #include <linux/spinlock.h>
18 #include <linux/syscore_ops.h>
19 #include <asm/cpu.h>
20 #include <asm/mach-au1x00/au1000.h>
21 
22 /* control register offsets */
23 #define AU1000_OHCICFG	0x7fffc
24 #define AU1550_OHCICFG	0x07ffc
25 #define AU1200_USBCFG	0x04
26 
27 /* Au1000 USB block config bits */
28 #define USBHEN_RD	(1 << 4)		/* OHCI reset-done indicator */
29 #define USBHEN_CE	(1 << 3)		/* OHCI block clock enable */
30 #define USBHEN_E	(1 << 2)		/* OHCI block enable */
31 #define USBHEN_C	(1 << 1)		/* OHCI block coherency bit */
32 #define USBHEN_BE	(1 << 0)		/* OHCI Big-Endian */
33 
34 /* Au1200 USB config bits */
35 #define USBCFG_PFEN	(1 << 31)		/* prefetch enable (undoc) */
36 #define USBCFG_RDCOMB	(1 << 30)		/* read combining (undoc) */
37 #define USBCFG_UNKNOWN	(5 << 20)		/* unknown, leave this way */
38 #define USBCFG_SSD	(1 << 23)		/* serial short detect en */
39 #define USBCFG_PPE	(1 << 19)		/* HS PHY PLL */
40 #define USBCFG_UCE	(1 << 18)		/* UDC clock enable */
41 #define USBCFG_ECE	(1 << 17)		/* EHCI clock enable */
42 #define USBCFG_OCE	(1 << 16)		/* OHCI clock enable */
43 #define USBCFG_FLA(x)	(((x) & 0x3f) << 8)
44 #define USBCFG_UCAM	(1 << 7)		/* coherent access (undoc) */
45 #define USBCFG_GME	(1 << 6)		/* OTG mem access */
46 #define USBCFG_DBE	(1 << 5)		/* UDC busmaster enable */
47 #define USBCFG_DME	(1 << 4)		/* UDC mem enable */
48 #define USBCFG_EBE	(1 << 3)		/* EHCI busmaster enable */
49 #define USBCFG_EME	(1 << 2)		/* EHCI mem enable */
50 #define USBCFG_OBE	(1 << 1)		/* OHCI busmaster enable */
51 #define USBCFG_OME	(1 << 0)		/* OHCI mem enable */
52 #define USBCFG_INIT_AU1200	(USBCFG_PFEN | USBCFG_RDCOMB | USBCFG_UNKNOWN |\
53 				 USBCFG_SSD | USBCFG_FLA(0x20) | USBCFG_UCAM | \
54 				 USBCFG_GME | USBCFG_DBE | USBCFG_DME |	       \
55 				 USBCFG_EBE | USBCFG_EME | USBCFG_OBE |	       \
56 				 USBCFG_OME)
57 
58 /* Au1300 USB config registers */
59 #define USB_DWC_CTRL1		0x00
60 #define USB_DWC_CTRL2		0x04
61 #define USB_VBUS_TIMER		0x10
62 #define USB_SBUS_CTRL		0x14
63 #define USB_MSR_ERR		0x18
64 #define USB_DWC_CTRL3		0x1C
65 #define USB_DWC_CTRL4		0x20
66 #define USB_OTG_STATUS		0x28
67 #define USB_DWC_CTRL5		0x2C
68 #define USB_DWC_CTRL6		0x30
69 #define USB_DWC_CTRL7		0x34
70 #define USB_PHY_STATUS		0xC0
71 #define USB_INT_STATUS		0xC4
72 #define USB_INT_ENABLE		0xC8
73 
74 #define USB_DWC_CTRL1_OTGD	0x04 /* set to DISable OTG */
75 #define USB_DWC_CTRL1_HSTRS	0x02 /* set to ENable EHCI */
76 #define USB_DWC_CTRL1_DCRS	0x01 /* set to ENable UDC */
77 
78 #define USB_DWC_CTRL2_PHY1RS	0x04 /* set to enable PHY1 */
79 #define USB_DWC_CTRL2_PHY0RS	0x02 /* set to enable PHY0 */
80 #define USB_DWC_CTRL2_PHYRS	0x01 /* set to enable PHY */
81 
82 #define USB_DWC_CTRL3_OHCI1_CKEN	(1 << 19)
83 #define USB_DWC_CTRL3_OHCI0_CKEN	(1 << 18)
84 #define USB_DWC_CTRL3_EHCI0_CKEN	(1 << 17)
85 #define USB_DWC_CTRL3_OTG0_CKEN		(1 << 16)
86 
87 #define USB_SBUS_CTRL_SBCA		0x04 /* coherent access */
88 
89 #define USB_INTEN_FORCE			0x20
90 #define USB_INTEN_PHY			0x10
91 #define USB_INTEN_UDC			0x08
92 #define USB_INTEN_EHCI			0x04
93 #define USB_INTEN_OHCI1			0x02
94 #define USB_INTEN_OHCI0			0x01
95 
96 static DEFINE_SPINLOCK(alchemy_usb_lock);
97 
98 static inline void __au1300_usb_phyctl(void __iomem *base, int enable)
99 {
100 	unsigned long r, s;
101 
102 	r = __raw_readl(base + USB_DWC_CTRL2);
103 	s = __raw_readl(base + USB_DWC_CTRL3);
104 
105 	s &= USB_DWC_CTRL3_OHCI1_CKEN | USB_DWC_CTRL3_OHCI0_CKEN |
106 		USB_DWC_CTRL3_EHCI0_CKEN | USB_DWC_CTRL3_OTG0_CKEN;
107 
108 	if (enable) {
109 		/* simply enable all PHYs */
110 		r |= USB_DWC_CTRL2_PHY1RS | USB_DWC_CTRL2_PHY0RS |
111 		     USB_DWC_CTRL2_PHYRS;
112 		__raw_writel(r, base + USB_DWC_CTRL2);
113 		wmb();
114 	} else if (!s) {
115 		/* no USB block active, do disable all PHYs */
116 		r &= ~(USB_DWC_CTRL2_PHY1RS | USB_DWC_CTRL2_PHY0RS |
117 		       USB_DWC_CTRL2_PHYRS);
118 		__raw_writel(r, base + USB_DWC_CTRL2);
119 		wmb();
120 	}
121 }
122 
123 static inline void __au1300_ohci_control(void __iomem *base, int enable, int id)
124 {
125 	unsigned long r;
126 
127 	if (enable) {
128 		__raw_writel(1, base + USB_DWC_CTRL7);	/* start OHCI clock */
129 		wmb();
130 
131 		r = __raw_readl(base + USB_DWC_CTRL3);	/* enable OHCI block */
132 		r |= (id == 0) ? USB_DWC_CTRL3_OHCI0_CKEN
133 			       : USB_DWC_CTRL3_OHCI1_CKEN;
134 		__raw_writel(r, base + USB_DWC_CTRL3);
135 		wmb();
136 
137 		__au1300_usb_phyctl(base, enable);	/* power up the PHYs */
138 
139 		r = __raw_readl(base + USB_INT_ENABLE);
140 		r |= (id == 0) ? USB_INTEN_OHCI0 : USB_INTEN_OHCI1;
141 		__raw_writel(r, base + USB_INT_ENABLE);
142 		wmb();
143 
144 		/* reset the OHCI start clock bit */
145 		__raw_writel(0, base + USB_DWC_CTRL7);
146 		wmb();
147 	} else {
148 		r = __raw_readl(base + USB_INT_ENABLE);
149 		r &= ~((id == 0) ? USB_INTEN_OHCI0 : USB_INTEN_OHCI1);
150 		__raw_writel(r, base + USB_INT_ENABLE);
151 		wmb();
152 
153 		r = __raw_readl(base + USB_DWC_CTRL3);
154 		r &= ~((id == 0) ? USB_DWC_CTRL3_OHCI0_CKEN
155 				 : USB_DWC_CTRL3_OHCI1_CKEN);
156 		__raw_writel(r, base + USB_DWC_CTRL3);
157 		wmb();
158 
159 		__au1300_usb_phyctl(base, enable);
160 	}
161 }
162 
163 static inline void __au1300_ehci_control(void __iomem *base, int enable)
164 {
165 	unsigned long r;
166 
167 	if (enable) {
168 		r = __raw_readl(base + USB_DWC_CTRL3);
169 		r |= USB_DWC_CTRL3_EHCI0_CKEN;
170 		__raw_writel(r, base + USB_DWC_CTRL3);
171 		wmb();
172 
173 		r = __raw_readl(base + USB_DWC_CTRL1);
174 		r |= USB_DWC_CTRL1_HSTRS;
175 		__raw_writel(r, base + USB_DWC_CTRL1);
176 		wmb();
177 
178 		__au1300_usb_phyctl(base, enable);
179 
180 		r = __raw_readl(base + USB_INT_ENABLE);
181 		r |= USB_INTEN_EHCI;
182 		__raw_writel(r, base + USB_INT_ENABLE);
183 		wmb();
184 	} else {
185 		r = __raw_readl(base + USB_INT_ENABLE);
186 		r &= ~USB_INTEN_EHCI;
187 		__raw_writel(r, base + USB_INT_ENABLE);
188 		wmb();
189 
190 		r = __raw_readl(base + USB_DWC_CTRL1);
191 		r &= ~USB_DWC_CTRL1_HSTRS;
192 		__raw_writel(r, base + USB_DWC_CTRL1);
193 		wmb();
194 
195 		r = __raw_readl(base + USB_DWC_CTRL3);
196 		r &= ~USB_DWC_CTRL3_EHCI0_CKEN;
197 		__raw_writel(r, base + USB_DWC_CTRL3);
198 		wmb();
199 
200 		__au1300_usb_phyctl(base, enable);
201 	}
202 }
203 
204 static inline void __au1300_udc_control(void __iomem *base, int enable)
205 {
206 	unsigned long r;
207 
208 	if (enable) {
209 		r = __raw_readl(base + USB_DWC_CTRL1);
210 		r |= USB_DWC_CTRL1_DCRS;
211 		__raw_writel(r, base + USB_DWC_CTRL1);
212 		wmb();
213 
214 		__au1300_usb_phyctl(base, enable);
215 
216 		r = __raw_readl(base + USB_INT_ENABLE);
217 		r |= USB_INTEN_UDC;
218 		__raw_writel(r, base + USB_INT_ENABLE);
219 		wmb();
220 	} else {
221 		r = __raw_readl(base + USB_INT_ENABLE);
222 		r &= ~USB_INTEN_UDC;
223 		__raw_writel(r, base + USB_INT_ENABLE);
224 		wmb();
225 
226 		r = __raw_readl(base + USB_DWC_CTRL1);
227 		r &= ~USB_DWC_CTRL1_DCRS;
228 		__raw_writel(r, base + USB_DWC_CTRL1);
229 		wmb();
230 
231 		__au1300_usb_phyctl(base, enable);
232 	}
233 }
234 
235 static inline void __au1300_otg_control(void __iomem *base, int enable)
236 {
237 	unsigned long r;
238 	if (enable) {
239 		r = __raw_readl(base + USB_DWC_CTRL3);
240 		r |= USB_DWC_CTRL3_OTG0_CKEN;
241 		__raw_writel(r, base + USB_DWC_CTRL3);
242 		wmb();
243 
244 		r = __raw_readl(base + USB_DWC_CTRL1);
245 		r &= ~USB_DWC_CTRL1_OTGD;
246 		__raw_writel(r, base + USB_DWC_CTRL1);
247 		wmb();
248 
249 		__au1300_usb_phyctl(base, enable);
250 	} else {
251 		r = __raw_readl(base + USB_DWC_CTRL1);
252 		r |= USB_DWC_CTRL1_OTGD;
253 		__raw_writel(r, base + USB_DWC_CTRL1);
254 		wmb();
255 
256 		r = __raw_readl(base + USB_DWC_CTRL3);
257 		r &= ~USB_DWC_CTRL3_OTG0_CKEN;
258 		__raw_writel(r, base + USB_DWC_CTRL3);
259 		wmb();
260 
261 		__au1300_usb_phyctl(base, enable);
262 	}
263 }
264 
265 static inline int au1300_usb_control(int block, int enable)
266 {
267 	void __iomem *base =
268 		(void __iomem *)KSEG1ADDR(AU1300_USB_CTL_PHYS_ADDR);
269 	int ret = 0;
270 
271 	switch (block) {
272 	case ALCHEMY_USB_OHCI0:
273 		__au1300_ohci_control(base, enable, 0);
274 		break;
275 	case ALCHEMY_USB_OHCI1:
276 		__au1300_ohci_control(base, enable, 1);
277 		break;
278 	case ALCHEMY_USB_EHCI0:
279 		__au1300_ehci_control(base, enable);
280 		break;
281 	case ALCHEMY_USB_UDC0:
282 		__au1300_udc_control(base, enable);
283 		break;
284 	case ALCHEMY_USB_OTG0:
285 		__au1300_otg_control(base, enable);
286 		break;
287 	default:
288 		ret = -ENODEV;
289 	}
290 	return ret;
291 }
292 
293 static inline void au1300_usb_init(void)
294 {
295 	void __iomem *base =
296 		(void __iomem *)KSEG1ADDR(AU1300_USB_CTL_PHYS_ADDR);
297 
298 	/* set some sane defaults.  Note: we don't fiddle with DWC_CTRL4
299 	 * here at all: Port 2 routing (EHCI or UDC) must be set either
300 	 * by boot firmware or platform init code; I can't autodetect
301 	 * a sane setting.
302 	 */
303 	__raw_writel(0, base + USB_INT_ENABLE); /* disable all USB irqs */
304 	wmb();
305 	__raw_writel(0, base + USB_DWC_CTRL3); /* disable all clocks */
306 	wmb();
307 	__raw_writel(~0, base + USB_MSR_ERR); /* clear all errors */
308 	wmb();
309 	__raw_writel(~0, base + USB_INT_STATUS); /* clear int status */
310 	wmb();
311 	/* set coherent access bit */
312 	__raw_writel(USB_SBUS_CTRL_SBCA, base + USB_SBUS_CTRL);
313 	wmb();
314 }
315 
316 static inline void __au1200_ohci_control(void __iomem *base, int enable)
317 {
318 	unsigned long r = __raw_readl(base + AU1200_USBCFG);
319 	if (enable) {
320 		__raw_writel(r | USBCFG_OCE, base + AU1200_USBCFG);
321 		wmb();
322 		udelay(2000);
323 	} else {
324 		__raw_writel(r & ~USBCFG_OCE, base + AU1200_USBCFG);
325 		wmb();
326 		udelay(1000);
327 	}
328 }
329 
330 static inline void __au1200_ehci_control(void __iomem *base, int enable)
331 {
332 	unsigned long r = __raw_readl(base + AU1200_USBCFG);
333 	if (enable) {
334 		__raw_writel(r | USBCFG_ECE | USBCFG_PPE, base + AU1200_USBCFG);
335 		wmb();
336 		udelay(1000);
337 	} else {
338 		if (!(r & USBCFG_UCE))		/* UDC also off? */
339 			r &= ~USBCFG_PPE;	/* yes: disable HS PHY PLL */
340 		__raw_writel(r & ~USBCFG_ECE, base + AU1200_USBCFG);
341 		wmb();
342 		udelay(1000);
343 	}
344 }
345 
346 static inline void __au1200_udc_control(void __iomem *base, int enable)
347 {
348 	unsigned long r = __raw_readl(base + AU1200_USBCFG);
349 	if (enable) {
350 		__raw_writel(r | USBCFG_UCE | USBCFG_PPE, base + AU1200_USBCFG);
351 		wmb();
352 	} else {
353 		if (!(r & USBCFG_ECE))		/* EHCI also off? */
354 			r &= ~USBCFG_PPE;	/* yes: disable HS PHY PLL */
355 		__raw_writel(r & ~USBCFG_UCE, base + AU1200_USBCFG);
356 		wmb();
357 	}
358 }
359 
360 static inline int au1200_usb_control(int block, int enable)
361 {
362 	void __iomem *base =
363 			(void __iomem *)KSEG1ADDR(AU1200_USB_CTL_PHYS_ADDR);
364 
365 	switch (block) {
366 	case ALCHEMY_USB_OHCI0:
367 		__au1200_ohci_control(base, enable);
368 		break;
369 	case ALCHEMY_USB_UDC0:
370 		__au1200_udc_control(base, enable);
371 		break;
372 	case ALCHEMY_USB_EHCI0:
373 		__au1200_ehci_control(base, enable);
374 		break;
375 	default:
376 		return -ENODEV;
377 	}
378 	return 0;
379 }
380 
381 
382 /* initialize USB block(s) to a known working state */
383 static inline void au1200_usb_init(void)
384 {
385 	void __iomem *base =
386 			(void __iomem *)KSEG1ADDR(AU1200_USB_CTL_PHYS_ADDR);
387 	__raw_writel(USBCFG_INIT_AU1200, base + AU1200_USBCFG);
388 	wmb();
389 	udelay(1000);
390 }
391 
392 static inline int au1000_usb_init(unsigned long rb, int reg)
393 {
394 	void __iomem *base = (void __iomem *)KSEG1ADDR(rb + reg);
395 	unsigned long r = __raw_readl(base);
396 	struct clk *c;
397 
398 	/* 48MHz check. Don't init if no one can provide it */
399 	c = clk_get(NULL, "usbh_clk");
400 	if (IS_ERR(c))
401 		return -ENODEV;
402 	if (clk_round_rate(c, 48000000) != 48000000) {
403 		clk_put(c);
404 		return -ENODEV;
405 	}
406 	if (clk_set_rate(c, 48000000)) {
407 		clk_put(c);
408 		return -ENODEV;
409 	}
410 	clk_put(c);
411 
412 #if defined(__BIG_ENDIAN)
413 	r |= USBHEN_BE;
414 #endif
415 	r |= USBHEN_C;
416 
417 	__raw_writel(r, base);
418 	wmb();
419 	udelay(1000);
420 
421 	return 0;
422 }
423 
424 
425 static inline void __au1xx0_ohci_control(int enable, unsigned long rb, int creg)
426 {
427 	void __iomem *base = (void __iomem *)KSEG1ADDR(rb);
428 	unsigned long r = __raw_readl(base + creg);
429 	struct clk *c = clk_get(NULL, "usbh_clk");
430 
431 	if (IS_ERR(c))
432 		return;
433 
434 	if (enable) {
435 		if (clk_prepare_enable(c))
436 			goto out;
437 
438 		__raw_writel(r | USBHEN_CE, base + creg);
439 		wmb();
440 		udelay(1000);
441 		__raw_writel(r | USBHEN_CE | USBHEN_E, base + creg);
442 		wmb();
443 		udelay(1000);
444 
445 		/* wait for reset complete (read reg twice: au1500 erratum) */
446 		while (__raw_readl(base + creg),
447 			!(__raw_readl(base + creg) & USBHEN_RD))
448 			udelay(1000);
449 	} else {
450 		__raw_writel(r & ~(USBHEN_CE | USBHEN_E), base + creg);
451 		wmb();
452 		clk_disable_unprepare(c);
453 	}
454 out:
455 	clk_put(c);
456 }
457 
458 static inline int au1000_usb_control(int block, int enable, unsigned long rb,
459 				     int creg)
460 {
461 	int ret = 0;
462 
463 	switch (block) {
464 	case ALCHEMY_USB_OHCI0:
465 		__au1xx0_ohci_control(enable, rb, creg);
466 		break;
467 	default:
468 		ret = -ENODEV;
469 	}
470 	return ret;
471 }
472 
473 /*
474  * alchemy_usb_control - control Alchemy on-chip USB blocks
475  * @block:	USB block to target
476  * @enable:	set 1 to enable a block, 0 to disable
477  */
478 int alchemy_usb_control(int block, int enable)
479 {
480 	unsigned long flags;
481 	int ret;
482 
483 	spin_lock_irqsave(&alchemy_usb_lock, flags);
484 	switch (alchemy_get_cputype()) {
485 	case ALCHEMY_CPU_AU1000:
486 	case ALCHEMY_CPU_AU1500:
487 	case ALCHEMY_CPU_AU1100:
488 		ret = au1000_usb_control(block, enable,
489 			AU1000_USB_OHCI_PHYS_ADDR, AU1000_OHCICFG);
490 		break;
491 	case ALCHEMY_CPU_AU1550:
492 		ret = au1000_usb_control(block, enable,
493 			AU1550_USB_OHCI_PHYS_ADDR, AU1550_OHCICFG);
494 		break;
495 	case ALCHEMY_CPU_AU1200:
496 		ret = au1200_usb_control(block, enable);
497 		break;
498 	case ALCHEMY_CPU_AU1300:
499 		ret = au1300_usb_control(block, enable);
500 		break;
501 	default:
502 		ret = -ENODEV;
503 	}
504 	spin_unlock_irqrestore(&alchemy_usb_lock, flags);
505 	return ret;
506 }
507 EXPORT_SYMBOL_GPL(alchemy_usb_control);
508 
509 
510 static unsigned long alchemy_usb_pmdata[2];
511 
512 static void au1000_usb_pm(unsigned long br, int creg, int susp)
513 {
514 	void __iomem *base = (void __iomem *)KSEG1ADDR(br);
515 
516 	if (susp) {
517 		alchemy_usb_pmdata[0] = __raw_readl(base + creg);
518 		/* There appears to be some undocumented reset register.... */
519 		__raw_writel(0, base + 0x04);
520 		wmb();
521 		__raw_writel(0, base + creg);
522 		wmb();
523 	} else {
524 		__raw_writel(alchemy_usb_pmdata[0], base + creg);
525 		wmb();
526 	}
527 }
528 
529 static void au1200_usb_pm(int susp)
530 {
531 	void __iomem *base =
532 			(void __iomem *)KSEG1ADDR(AU1200_USB_OTG_PHYS_ADDR);
533 	if (susp) {
534 		/* save OTG_CAP/MUX registers which indicate port routing */
535 		/* FIXME: write an OTG driver to do that */
536 		alchemy_usb_pmdata[0] = __raw_readl(base + 0x00);
537 		alchemy_usb_pmdata[1] = __raw_readl(base + 0x04);
538 	} else {
539 		/* restore access to all MMIO areas */
540 		au1200_usb_init();
541 
542 		/* restore OTG_CAP/MUX registers */
543 		__raw_writel(alchemy_usb_pmdata[0], base + 0x00);
544 		__raw_writel(alchemy_usb_pmdata[1], base + 0x04);
545 		wmb();
546 	}
547 }
548 
549 static void au1300_usb_pm(int susp)
550 {
551 	void __iomem *base =
552 			(void __iomem *)KSEG1ADDR(AU1300_USB_CTL_PHYS_ADDR);
553 	/* remember Port2 routing */
554 	if (susp) {
555 		alchemy_usb_pmdata[0] = __raw_readl(base + USB_DWC_CTRL4);
556 	} else {
557 		au1300_usb_init();
558 		__raw_writel(alchemy_usb_pmdata[0], base + USB_DWC_CTRL4);
559 		wmb();
560 	}
561 }
562 
563 static void alchemy_usb_pm(int susp)
564 {
565 	switch (alchemy_get_cputype()) {
566 	case ALCHEMY_CPU_AU1000:
567 	case ALCHEMY_CPU_AU1500:
568 	case ALCHEMY_CPU_AU1100:
569 		au1000_usb_pm(AU1000_USB_OHCI_PHYS_ADDR, AU1000_OHCICFG, susp);
570 		break;
571 	case ALCHEMY_CPU_AU1550:
572 		au1000_usb_pm(AU1550_USB_OHCI_PHYS_ADDR, AU1550_OHCICFG, susp);
573 		break;
574 	case ALCHEMY_CPU_AU1200:
575 		au1200_usb_pm(susp);
576 		break;
577 	case ALCHEMY_CPU_AU1300:
578 		au1300_usb_pm(susp);
579 		break;
580 	}
581 }
582 
583 static int alchemy_usb_suspend(void)
584 {
585 	alchemy_usb_pm(1);
586 	return 0;
587 }
588 
589 static void alchemy_usb_resume(void)
590 {
591 	alchemy_usb_pm(0);
592 }
593 
594 static struct syscore_ops alchemy_usb_pm_ops = {
595 	.suspend	= alchemy_usb_suspend,
596 	.resume		= alchemy_usb_resume,
597 };
598 
599 static int __init alchemy_usb_init(void)
600 {
601 	int ret = 0;
602 
603 	switch (alchemy_get_cputype()) {
604 	case ALCHEMY_CPU_AU1000:
605 	case ALCHEMY_CPU_AU1500:
606 	case ALCHEMY_CPU_AU1100:
607 		ret = au1000_usb_init(AU1000_USB_OHCI_PHYS_ADDR,
608 				      AU1000_OHCICFG);
609 		break;
610 	case ALCHEMY_CPU_AU1550:
611 		ret = au1000_usb_init(AU1550_USB_OHCI_PHYS_ADDR,
612 				      AU1550_OHCICFG);
613 		break;
614 	case ALCHEMY_CPU_AU1200:
615 		au1200_usb_init();
616 		break;
617 	case ALCHEMY_CPU_AU1300:
618 		au1300_usb_init();
619 		break;
620 	}
621 
622 	if (!ret)
623 		register_syscore_ops(&alchemy_usb_pm_ops);
624 
625 	return ret;
626 }
627 arch_initcall(alchemy_usb_init);
628