Commit | Line | Data |
---|---|---|
d07e8819 FB |
1 | /** |
2 | * host.c - DesignWare USB3 DRD Controller Host Glue | |
3 | * | |
4 | * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com | |
5 | * | |
6 | * Authors: Felipe Balbi <balbi@ti.com>, | |
7 | * | |
5945f789 FB |
8 | * This program is free software: you can redistribute it and/or modify |
9 | * it under the terms of the GNU General Public License version 2 of | |
10 | * the License as published by the Free Software Foundation. | |
d07e8819 | 11 | * |
5945f789 FB |
12 | * This program is distributed in the hope that it will be useful, |
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 | * GNU General Public License for more details. | |
d07e8819 FB |
16 | */ |
17 | ||
d07e8819 | 18 | #include <linux/platform_device.h> |
b2f463e1 | 19 | #include <linux/usb/xhci_pdriver.h> |
d07e8819 FB |
20 | |
21 | #include "core.h" | |
d07e8819 | 22 | |
d07e8819 FB |
23 | int dwc3_host_init(struct dwc3 *dwc) |
24 | { | |
25 | struct platform_device *xhci; | |
b2f463e1 | 26 | struct usb_xhci_pdata pdata; |
d07e8819 FB |
27 | int ret; |
28 | ||
52758bcb | 29 | xhci = platform_device_alloc("xhci-hcd", PLATFORM_DEVID_AUTO); |
d07e8819 FB |
30 | if (!xhci) { |
31 | dev_err(dwc->dev, "couldn't allocate xHCI device\n"); | |
08f871a3 | 32 | return -ENOMEM; |
d07e8819 FB |
33 | } |
34 | ||
35 | dma_set_coherent_mask(&xhci->dev, dwc->dev->coherent_dma_mask); | |
36 | ||
37 | xhci->dev.parent = dwc->dev; | |
38 | xhci->dev.dma_mask = dwc->dev->dma_mask; | |
39 | xhci->dev.dma_parms = dwc->dev->dma_parms; | |
40 | ||
41 | dwc->xhci = xhci; | |
42 | ||
51249dca IS |
43 | ret = platform_device_add_resources(xhci, dwc->xhci_resources, |
44 | DWC3_XHCI_RESOURCES_NUM); | |
d07e8819 FB |
45 | if (ret) { |
46 | dev_err(dwc->dev, "couldn't add resources to xHCI device\n"); | |
47 | goto err1; | |
48 | } | |
49 | ||
b2f463e1 PA |
50 | memset(&pdata, 0, sizeof(pdata)); |
51 | ||
eac68e8f | 52 | pdata.usb3_lpm_capable = dwc->usb3_lpm_capable; |
b2f463e1 PA |
53 | |
54 | ret = platform_device_add_data(xhci, &pdata, sizeof(pdata)); | |
55 | if (ret) { | |
56 | dev_err(dwc->dev, "couldn't add platform data to xHCI device\n"); | |
57 | goto err1; | |
58 | } | |
59 | ||
08f871a3 HK |
60 | phy_create_lookup(dwc->usb2_generic_phy, "usb2-phy", |
61 | dev_name(&xhci->dev)); | |
62 | phy_create_lookup(dwc->usb3_generic_phy, "usb3-phy", | |
63 | dev_name(&xhci->dev)); | |
64 | ||
d07e8819 FB |
65 | ret = platform_device_add(xhci); |
66 | if (ret) { | |
67 | dev_err(dwc->dev, "failed to register xHCI device\n"); | |
08f871a3 | 68 | goto err2; |
d07e8819 FB |
69 | } |
70 | ||
71 | return 0; | |
08f871a3 HK |
72 | err2: |
73 | phy_remove_lookup(dwc->usb2_generic_phy, "usb2-phy", | |
74 | dev_name(&xhci->dev)); | |
75 | phy_remove_lookup(dwc->usb3_generic_phy, "usb3-phy", | |
76 | dev_name(&xhci->dev)); | |
d07e8819 FB |
77 | err1: |
78 | platform_device_put(xhci); | |
d07e8819 FB |
79 | return ret; |
80 | } | |
81 | ||
82 | void dwc3_host_exit(struct dwc3 *dwc) | |
83 | { | |
08f871a3 HK |
84 | phy_remove_lookup(dwc->usb2_generic_phy, "usb2-phy", |
85 | dev_name(&dwc->xhci->dev)); | |
86 | phy_remove_lookup(dwc->usb3_generic_phy, "usb3-phy", | |
87 | dev_name(&dwc->xhci->dev)); | |
d07e8819 FB |
88 | platform_device_unregister(dwc->xhci); |
89 | } |