1
2
3
4
5
6
7
8
9
10
11
12
13#include <linux/kernel.h>
14#include <linux/module.h>
15#include <linux/types.h>
16#include <linux/delay.h>
17#include <linux/pm.h>
18#include <linux/err.h>
19#include <linux/usb.h>
20#include <linux/usb/ehci_def.h>
21#include <linux/usb/hcd.h>
22#include <linux/usb/otg.h>
23#include <linux/platform_device.h>
24#include <linux/fsl_devices.h>
25#include <linux/of_platform.h>
26#include <linux/io.h>
27
28#include "ehci.h"
29#include "ehci-fsl.h"
30
31#define DRIVER_DESC "Freescale EHCI Host controller driver"
32#define DRV_NAME "ehci-fsl"
33
34static struct hc_driver __read_mostly fsl_ehci_hc_driver;
35
36
37
38
39
40
41
42
43
44
45
46
47static int fsl_ehci_drv_probe(struct platform_device *pdev)
48{
49 struct fsl_usb2_platform_data *pdata;
50 struct usb_hcd *hcd;
51 struct resource *res;
52 int irq;
53 int retval;
54 u32 tmp;
55
56 pr_debug("initializing FSL-SOC USB Controller\n");
57
58
59 pdata = dev_get_platdata(&pdev->dev);
60 if (!pdata) {
61 dev_err(&pdev->dev,
62 "No platform data for %s.\n", dev_name(&pdev->dev));
63 return -ENODEV;
64 }
65
66
67
68
69
70 if (!((pdata->operating_mode == FSL_USB2_DR_HOST) ||
71 (pdata->operating_mode == FSL_USB2_MPH_HOST) ||
72 (pdata->operating_mode == FSL_USB2_DR_OTG))) {
73 dev_err(&pdev->dev,
74 "Non Host Mode configured for %s. Wrong driver linked.\n",
75 dev_name(&pdev->dev));
76 return -ENODEV;
77 }
78
79 res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
80 if (!res) {
81 dev_err(&pdev->dev,
82 "Found HC with no IRQ. Check %s setup!\n",
83 dev_name(&pdev->dev));
84 return -ENODEV;
85 }
86 irq = res->start;
87
88 hcd = __usb_create_hcd(&fsl_ehci_hc_driver, pdev->dev.parent,
89 &pdev->dev, dev_name(&pdev->dev), NULL);
90 if (!hcd) {
91 retval = -ENOMEM;
92 goto err1;
93 }
94
95 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
96 hcd->regs = devm_ioremap_resource(&pdev->dev, res);
97 if (IS_ERR(hcd->regs)) {
98 retval = PTR_ERR(hcd->regs);
99 goto err2;
100 }
101
102 hcd->rsrc_start = res->start;
103 hcd->rsrc_len = resource_size(res);
104
105 pdata->regs = hcd->regs;
106
107 if (pdata->power_budget)
108 hcd->power_budget = pdata->power_budget;
109
110
111
112
113 if (pdata->init && pdata->init(pdev)) {
114 retval = -ENODEV;
115 goto err2;
116 }
117
118
119 if (pdata->have_sysif_regs && pdata->controller_ver < FSL_USB_VER_1_6) {
120 tmp = ioread32be(hcd->regs + FSL_SOC_USB_CTRL);
121 tmp &= ~CONTROL_REGISTER_W1C_MASK;
122 tmp |= 0x4;
123 iowrite32be(tmp, hcd->regs + FSL_SOC_USB_CTRL);
124 }
125
126
127 if (pdata->controller_ver == FSL_USB_VER_2_5 &&
128 pdata->phy_mode == FSL_USB2_PHY_ULPI)
129 iowrite32be(USB_CTRL_USB_EN, hcd->regs + FSL_SOC_USB_CTRL);
130
131
132
133
134
135 if (pdata->has_fsl_erratum_a007792) {
136 tmp = ioread32be(hcd->regs + FSL_SOC_USB_CTRL);
137 tmp &= ~CONTROL_REGISTER_W1C_MASK;
138 tmp |= CTRL_UTMI_PHY_EN;
139 iowrite32be(tmp, hcd->regs + FSL_SOC_USB_CTRL);
140
141 writel(PORT_PTS_UTMI, hcd->regs + FSL_SOC_USB_PORTSC1);
142 }
143
144
145
146 retval = usb_add_hcd(hcd, irq, IRQF_SHARED);
147 if (retval != 0)
148 goto err2;
149 device_wakeup_enable(hcd->self.controller);
150
151#ifdef CONFIG_USB_OTG
152 if (pdata->operating_mode == FSL_USB2_DR_OTG) {
153 struct ehci_hcd *ehci = hcd_to_ehci(hcd);
154
155 hcd->usb_phy = usb_get_phy(USB_PHY_TYPE_USB2);
156 dev_dbg(&pdev->dev, "hcd=0x%p ehci=0x%p, phy=0x%p\n",
157 hcd, ehci, hcd->usb_phy);
158
159 if (!IS_ERR_OR_NULL(hcd->usb_phy)) {
160 retval = otg_set_host(hcd->usb_phy->otg,
161 &ehci_to_hcd(ehci)->self);
162 if (retval) {
163 usb_put_phy(hcd->usb_phy);
164 goto err2;
165 }
166 } else {
167 dev_err(&pdev->dev, "can't find phy\n");
168 retval = -ENODEV;
169 goto err2;
170 }
171
172 hcd->skip_phy_initialization = 1;
173 }
174#endif
175 return retval;
176
177 err2:
178 usb_put_hcd(hcd);
179 err1:
180 dev_err(&pdev->dev, "init %s fail, %d\n", dev_name(&pdev->dev), retval);
181 if (pdata->exit)
182 pdata->exit(pdev);
183 return retval;
184}
185
186static bool usb_phy_clk_valid(struct usb_hcd *hcd)
187{
188 void __iomem *non_ehci = hcd->regs;
189 bool ret = true;
190
191 if (!(ioread32be(non_ehci + FSL_SOC_USB_CTRL) & PHY_CLK_VALID))
192 ret = false;
193
194 return ret;
195}
196
197static int ehci_fsl_setup_phy(struct usb_hcd *hcd,
198 enum fsl_usb2_phy_modes phy_mode,
199 unsigned int port_offset)
200{
201 u32 portsc, tmp;
202 struct ehci_hcd *ehci = hcd_to_ehci(hcd);
203 void __iomem *non_ehci = hcd->regs;
204 struct device *dev = hcd->self.controller;
205 struct fsl_usb2_platform_data *pdata = dev_get_platdata(dev);
206
207 if (pdata->controller_ver < 0) {
208 dev_warn(hcd->self.controller, "Could not get controller version\n");
209 return -ENODEV;
210 }
211
212 portsc = ehci_readl(ehci, &ehci->regs->port_status[port_offset]);
213 portsc &= ~(PORT_PTS_MSK | PORT_PTS_PTW);
214
215 switch (phy_mode) {
216 case FSL_USB2_PHY_ULPI:
217 if (pdata->have_sysif_regs && pdata->controller_ver) {
218
219
220 tmp = ioread32be(non_ehci + FSL_SOC_USB_CTRL);
221 tmp &= ~(CONTROL_REGISTER_W1C_MASK | UTMI_PHY_EN);
222 iowrite32be(tmp, non_ehci + FSL_SOC_USB_CTRL);
223
224
225 tmp = ioread32be(non_ehci + FSL_SOC_USB_CTRL);
226 tmp &= ~CONTROL_REGISTER_W1C_MASK;
227 tmp |= ULPI_PHY_CLK_SEL | USB_CTRL_USB_EN;
228 iowrite32be(tmp, non_ehci + FSL_SOC_USB_CTRL);
229 }
230 portsc |= PORT_PTS_ULPI;
231 break;
232 case FSL_USB2_PHY_SERIAL:
233 portsc |= PORT_PTS_SERIAL;
234 break;
235 case FSL_USB2_PHY_UTMI_WIDE:
236 portsc |= PORT_PTS_PTW;
237
238 case FSL_USB2_PHY_UTMI:
239
240
241
242
243 if (pdata->has_fsl_erratum_a006918) {
244 dev_warn(dev, "USB PHY clock invalid\n");
245 return -EINVAL;
246 }
247
248 case FSL_USB2_PHY_UTMI_DUAL:
249
250
251
252
253 if (pdata->controller_ver > FSL_USB_VER_2_4 &&
254 pdata->have_sysif_regs && !usb_phy_clk_valid(hcd)) {
255 dev_err(dev, "USB PHY clock invalid\n");
256 return -EINVAL;
257 }
258
259 if (pdata->have_sysif_regs && pdata->controller_ver) {
260
261 tmp = ioread32be(non_ehci + FSL_SOC_USB_CTRL);
262 tmp &= ~CONTROL_REGISTER_W1C_MASK;
263 tmp |= UTMI_PHY_EN;
264 iowrite32be(tmp, non_ehci + FSL_SOC_USB_CTRL);
265
266 mdelay(FSL_UTMI_PHY_DLY);
267
268 }
269
270 if (pdata->have_sysif_regs) {
271 tmp = ioread32be(non_ehci + FSL_SOC_USB_CTRL);
272 tmp &= ~CONTROL_REGISTER_W1C_MASK;
273 tmp |= CTRL_UTMI_PHY_EN;
274 iowrite32be(tmp, non_ehci + FSL_SOC_USB_CTRL);
275 }
276 portsc |= PORT_PTS_UTMI;
277 break;
278 case FSL_USB2_PHY_NONE:
279 break;
280 }
281
282 if (pdata->have_sysif_regs &&
283 pdata->controller_ver > FSL_USB_VER_1_6 &&
284 !usb_phy_clk_valid(hcd)) {
285 dev_warn(hcd->self.controller, "USB PHY clock invalid\n");
286 return -EINVAL;
287 }
288
289 ehci_writel(ehci, portsc, &ehci->regs->port_status[port_offset]);
290
291 if (phy_mode != FSL_USB2_PHY_ULPI && pdata->have_sysif_regs) {
292 tmp = ioread32be(non_ehci + FSL_SOC_USB_CTRL);
293 tmp &= ~CONTROL_REGISTER_W1C_MASK;
294 tmp |= USB_CTRL_USB_EN;
295 iowrite32be(tmp, non_ehci + FSL_SOC_USB_CTRL);
296 }
297
298 return 0;
299}
300
301static int ehci_fsl_usb_setup(struct ehci_hcd *ehci)
302{
303 struct usb_hcd *hcd = ehci_to_hcd(ehci);
304 struct fsl_usb2_platform_data *pdata;
305 void __iomem *non_ehci = hcd->regs;
306
307 pdata = dev_get_platdata(hcd->self.controller);
308
309 if (pdata->have_sysif_regs) {
310
311
312
313
314
315
316
317 iowrite32be(0x0 | SNOOP_SIZE_2GB,
318 non_ehci + FSL_SOC_USB_SNOOP1);
319
320 iowrite32be(0x80000000 | SNOOP_SIZE_2GB,
321 non_ehci + FSL_SOC_USB_SNOOP2);
322 }
323
324
325 if (pdata->has_fsl_erratum_a005275 == 1)
326 ehci->has_fsl_hs_errata = 1;
327
328 if (pdata->has_fsl_erratum_a005697 == 1)
329 ehci->has_fsl_susp_errata = 1;
330
331 if ((pdata->operating_mode == FSL_USB2_DR_HOST) ||
332 (pdata->operating_mode == FSL_USB2_DR_OTG))
333 if (ehci_fsl_setup_phy(hcd, pdata->phy_mode, 0))
334 return -EINVAL;
335
336 if (pdata->operating_mode == FSL_USB2_MPH_HOST) {
337
338
339 if (pdata->has_fsl_erratum_14 == 1)
340 ehci->has_fsl_port_bug = 1;
341
342 if (pdata->port_enables & FSL_USB2_PORT0_ENABLED)
343 if (ehci_fsl_setup_phy(hcd, pdata->phy_mode, 0))
344 return -EINVAL;
345
346 if (pdata->port_enables & FSL_USB2_PORT1_ENABLED)
347 if (ehci_fsl_setup_phy(hcd, pdata->phy_mode, 1))
348 return -EINVAL;
349 }
350
351 if (pdata->have_sysif_regs) {
352#ifdef CONFIG_FSL_SOC_BOOKE
353 iowrite32be(0x00000008, non_ehci + FSL_SOC_USB_PRICTRL);
354 iowrite32be(0x00000080, non_ehci + FSL_SOC_USB_AGECNTTHRSH);
355#else
356 iowrite32be(0x0000000c, non_ehci + FSL_SOC_USB_PRICTRL);
357 iowrite32be(0x00000040, non_ehci + FSL_SOC_USB_AGECNTTHRSH);
358#endif
359 iowrite32be(0x00000001, non_ehci + FSL_SOC_USB_SICTRL);
360 }
361
362 return 0;
363}
364
365
366static int ehci_fsl_reinit(struct ehci_hcd *ehci)
367{
368 if (ehci_fsl_usb_setup(ehci))
369 return -EINVAL;
370
371 return 0;
372}
373
374
375static int ehci_fsl_setup(struct usb_hcd *hcd)
376{
377 struct ehci_hcd *ehci = hcd_to_ehci(hcd);
378 int retval;
379 struct fsl_usb2_platform_data *pdata;
380 struct device *dev;
381
382 dev = hcd->self.controller;
383 pdata = dev_get_platdata(hcd->self.controller);
384 ehci->big_endian_desc = pdata->big_endian_desc;
385 ehci->big_endian_mmio = pdata->big_endian_mmio;
386
387
388 ehci->caps = hcd->regs + 0x100;
389
390#ifdef CONFIG_PPC_83xx
391
392
393
394
395
396 ehci->need_oc_pp_cycle = 1;
397#endif
398
399 hcd->has_tt = 1;
400
401 retval = ehci_setup(hcd);
402 if (retval)
403 return retval;
404
405 if (of_device_is_compatible(dev->parent->of_node,
406 "fsl,mpc5121-usb2-dr")) {
407
408
409
410
411 ehci_writel(ehci, SBUSCFG_INCR8,
412 hcd->regs + FSL_SOC_USB_SBUSCFG);
413 }
414
415 retval = ehci_fsl_reinit(ehci);
416 return retval;
417}
418
419struct ehci_fsl {
420 struct ehci_hcd ehci;
421
422#ifdef CONFIG_PM
423
424 u32 usb_ctrl;
425#endif
426};
427
428#ifdef CONFIG_PM
429
430#ifdef CONFIG_PPC_MPC512x
431static int ehci_fsl_mpc512x_drv_suspend(struct device *dev)
432{
433 struct usb_hcd *hcd = dev_get_drvdata(dev);
434 struct ehci_hcd *ehci = hcd_to_ehci(hcd);
435 struct fsl_usb2_platform_data *pdata = dev_get_platdata(dev);
436 u32 tmp;
437
438#ifdef CONFIG_DYNAMIC_DEBUG
439 u32 mode = ehci_readl(ehci, hcd->regs + FSL_SOC_USB_USBMODE);
440 mode &= USBMODE_CM_MASK;
441 tmp = ehci_readl(ehci, hcd->regs + 0x140);
442
443 dev_dbg(dev, "suspend=%d already_suspended=%d "
444 "mode=%d usbcmd %08x\n", pdata->suspended,
445 pdata->already_suspended, mode, tmp);
446#endif
447
448
449
450
451
452
453 if (pdata->suspended) {
454 dev_dbg(dev, "already suspended, leaving early\n");
455 pdata->already_suspended = 1;
456 return 0;
457 }
458
459 dev_dbg(dev, "suspending...\n");
460
461 ehci->rh_state = EHCI_RH_SUSPENDED;
462 dev->power.power_state = PMSG_SUSPEND;
463
464
465 clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
466
467
468 tmp = ehci_readl(ehci, &ehci->regs->command);
469 tmp &= ~CMD_RUN;
470 ehci_writel(ehci, tmp, &ehci->regs->command);
471
472
473 pdata->pm_command = ehci_readl(ehci, &ehci->regs->command);
474 pdata->pm_command &= ~CMD_RUN;
475 pdata->pm_status = ehci_readl(ehci, &ehci->regs->status);
476 pdata->pm_intr_enable = ehci_readl(ehci, &ehci->regs->intr_enable);
477 pdata->pm_frame_index = ehci_readl(ehci, &ehci->regs->frame_index);
478 pdata->pm_segment = ehci_readl(ehci, &ehci->regs->segment);
479 pdata->pm_frame_list = ehci_readl(ehci, &ehci->regs->frame_list);
480 pdata->pm_async_next = ehci_readl(ehci, &ehci->regs->async_next);
481 pdata->pm_configured_flag =
482 ehci_readl(ehci, &ehci->regs->configured_flag);
483 pdata->pm_portsc = ehci_readl(ehci, &ehci->regs->port_status[0]);
484 pdata->pm_usbgenctrl = ehci_readl(ehci,
485 hcd->regs + FSL_SOC_USB_USBGENCTRL);
486
487
488 pdata->pm_portsc &= cpu_to_hc32(ehci, ~PORT_RWC_BITS);
489
490 pdata->suspended = 1;
491
492
493 tmp = ehci_readl(ehci, &ehci->regs->port_status[0]);
494 tmp &= ~PORT_POWER;
495 ehci_writel(ehci, tmp, &ehci->regs->port_status[0]);
496
497 return 0;
498}
499
500static int ehci_fsl_mpc512x_drv_resume(struct device *dev)
501{
502 struct usb_hcd *hcd = dev_get_drvdata(dev);
503 struct ehci_hcd *ehci = hcd_to_ehci(hcd);
504 struct fsl_usb2_platform_data *pdata = dev_get_platdata(dev);
505 u32 tmp;
506
507 dev_dbg(dev, "suspend=%d already_suspended=%d\n",
508 pdata->suspended, pdata->already_suspended);
509
510
511
512
513
514 if (pdata->already_suspended) {
515 dev_dbg(dev, "already suspended, leaving early\n");
516 pdata->already_suspended = 0;
517 return 0;
518 }
519
520 if (!pdata->suspended) {
521 dev_dbg(dev, "not suspended, leaving early\n");
522 return 0;
523 }
524
525 pdata->suspended = 0;
526
527 dev_dbg(dev, "resuming...\n");
528
529
530 tmp = USBMODE_CM_HOST | (pdata->es ? USBMODE_ES : 0);
531 ehci_writel(ehci, tmp, hcd->regs + FSL_SOC_USB_USBMODE);
532
533 ehci_writel(ehci, pdata->pm_usbgenctrl,
534 hcd->regs + FSL_SOC_USB_USBGENCTRL);
535 ehci_writel(ehci, ISIPHYCTRL_PXE | ISIPHYCTRL_PHYE,
536 hcd->regs + FSL_SOC_USB_ISIPHYCTRL);
537
538 ehci_writel(ehci, SBUSCFG_INCR8, hcd->regs + FSL_SOC_USB_SBUSCFG);
539
540
541 ehci_writel(ehci, pdata->pm_command, &ehci->regs->command);
542 ehci_writel(ehci, pdata->pm_intr_enable, &ehci->regs->intr_enable);
543 ehci_writel(ehci, pdata->pm_frame_index, &ehci->regs->frame_index);
544 ehci_writel(ehci, pdata->pm_segment, &ehci->regs->segment);
545 ehci_writel(ehci, pdata->pm_frame_list, &ehci->regs->frame_list);
546 ehci_writel(ehci, pdata->pm_async_next, &ehci->regs->async_next);
547 ehci_writel(ehci, pdata->pm_configured_flag,
548 &ehci->regs->configured_flag);
549 ehci_writel(ehci, pdata->pm_portsc, &ehci->regs->port_status[0]);
550
551 set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
552 ehci->rh_state = EHCI_RH_RUNNING;
553 dev->power.power_state = PMSG_ON;
554
555 tmp = ehci_readl(ehci, &ehci->regs->command);
556 tmp |= CMD_RUN;
557 ehci_writel(ehci, tmp, &ehci->regs->command);
558
559 usb_hcd_resume_root_hub(hcd);
560
561 return 0;
562}
563#else
564static inline int ehci_fsl_mpc512x_drv_suspend(struct device *dev)
565{
566 return 0;
567}
568
569static inline int ehci_fsl_mpc512x_drv_resume(struct device *dev)
570{
571 return 0;
572}
573#endif
574
575static struct ehci_fsl *hcd_to_ehci_fsl(struct usb_hcd *hcd)
576{
577 struct ehci_hcd *ehci = hcd_to_ehci(hcd);
578
579 return container_of(ehci, struct ehci_fsl, ehci);
580}
581
582static int ehci_fsl_drv_suspend(struct device *dev)
583{
584 struct usb_hcd *hcd = dev_get_drvdata(dev);
585 struct ehci_fsl *ehci_fsl = hcd_to_ehci_fsl(hcd);
586 void __iomem *non_ehci = hcd->regs;
587
588 if (of_device_is_compatible(dev->parent->of_node,
589 "fsl,mpc5121-usb2-dr")) {
590 return ehci_fsl_mpc512x_drv_suspend(dev);
591 }
592
593 ehci_prepare_ports_for_controller_suspend(hcd_to_ehci(hcd),
594 device_may_wakeup(dev));
595 if (!fsl_deep_sleep())
596 return 0;
597
598 ehci_fsl->usb_ctrl = ioread32be(non_ehci + FSL_SOC_USB_CTRL);
599 return 0;
600}
601
602static int ehci_fsl_drv_resume(struct device *dev)
603{
604 struct usb_hcd *hcd = dev_get_drvdata(dev);
605 struct ehci_fsl *ehci_fsl = hcd_to_ehci_fsl(hcd);
606 struct ehci_hcd *ehci = hcd_to_ehci(hcd);
607 void __iomem *non_ehci = hcd->regs;
608
609 if (of_device_is_compatible(dev->parent->of_node,
610 "fsl,mpc5121-usb2-dr")) {
611 return ehci_fsl_mpc512x_drv_resume(dev);
612 }
613
614 ehci_prepare_ports_for_controller_resume(ehci);
615 if (!fsl_deep_sleep())
616 return 0;
617
618 usb_root_hub_lost_power(hcd->self.root_hub);
619
620
621 iowrite32be(ehci_fsl->usb_ctrl, non_ehci + FSL_SOC_USB_CTRL);
622
623 ehci_reset(ehci);
624 ehci_fsl_reinit(ehci);
625
626 return 0;
627}
628
629static int ehci_fsl_drv_restore(struct device *dev)
630{
631 struct usb_hcd *hcd = dev_get_drvdata(dev);
632
633 usb_root_hub_lost_power(hcd->self.root_hub);
634 return 0;
635}
636
637static const struct dev_pm_ops ehci_fsl_pm_ops = {
638 .suspend = ehci_fsl_drv_suspend,
639 .resume = ehci_fsl_drv_resume,
640 .restore = ehci_fsl_drv_restore,
641};
642
643#define EHCI_FSL_PM_OPS (&ehci_fsl_pm_ops)
644#else
645#define EHCI_FSL_PM_OPS NULL
646#endif
647
648#ifdef CONFIG_USB_OTG
649static int ehci_start_port_reset(struct usb_hcd *hcd, unsigned port)
650{
651 struct ehci_hcd *ehci = hcd_to_ehci(hcd);
652 u32 status;
653
654 if (!port)
655 return -EINVAL;
656
657 port--;
658
659
660 status = readl(&ehci->regs->port_status[port]);
661 if (!(status & PORT_CONNECT))
662 return -ENODEV;
663
664
665 if (ehci_is_TDI(ehci)) {
666 writel(PORT_RESET |
667 (status & ~(PORT_CSC | PORT_PEC | PORT_OCC)),
668 &ehci->regs->port_status[port]);
669 } else {
670 writel(PORT_RESET, &ehci->regs->port_status[port]);
671 }
672
673 return 0;
674}
675#else
676#define ehci_start_port_reset NULL
677#endif
678
679static const struct ehci_driver_overrides ehci_fsl_overrides __initconst = {
680 .extra_priv_size = sizeof(struct ehci_fsl),
681 .reset = ehci_fsl_setup,
682};
683
684
685
686
687
688
689
690
691
692
693static int fsl_ehci_drv_remove(struct platform_device *pdev)
694{
695 struct fsl_usb2_platform_data *pdata = dev_get_platdata(&pdev->dev);
696 struct usb_hcd *hcd = platform_get_drvdata(pdev);
697
698 if (!IS_ERR_OR_NULL(hcd->usb_phy)) {
699 otg_set_host(hcd->usb_phy->otg, NULL);
700 usb_put_phy(hcd->usb_phy);
701 }
702
703 usb_remove_hcd(hcd);
704
705
706
707
708
709 if (pdata->exit)
710 pdata->exit(pdev);
711 usb_put_hcd(hcd);
712
713 return 0;
714}
715
716static struct platform_driver ehci_fsl_driver = {
717 .probe = fsl_ehci_drv_probe,
718 .remove = fsl_ehci_drv_remove,
719 .shutdown = usb_hcd_platform_shutdown,
720 .driver = {
721 .name = "fsl-ehci",
722 .pm = EHCI_FSL_PM_OPS,
723 },
724};
725
726static int __init ehci_fsl_init(void)
727{
728 if (usb_disabled())
729 return -ENODEV;
730
731 pr_info(DRV_NAME ": " DRIVER_DESC "\n");
732
733 ehci_init_driver(&fsl_ehci_hc_driver, &ehci_fsl_overrides);
734
735 fsl_ehci_hc_driver.product_desc =
736 "Freescale On-Chip EHCI Host Controller";
737 fsl_ehci_hc_driver.start_port_reset = ehci_start_port_reset;
738
739
740 return platform_driver_register(&ehci_fsl_driver);
741}
742module_init(ehci_fsl_init);
743
744static void __exit ehci_fsl_cleanup(void)
745{
746 platform_driver_unregister(&ehci_fsl_driver);
747}
748module_exit(ehci_fsl_cleanup);
749
750MODULE_DESCRIPTION(DRIVER_DESC);
751MODULE_LICENSE("GPL");
752MODULE_ALIAS("platform:" DRV_NAME);
753