linux/drivers/usb/dwc3/host.c
<<
>>
Prefs
   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 *
   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.
  11 *
  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.
  16 */
  17
  18#include <linux/platform_device.h>
  19#include <linux/usb/xhci_pdriver.h>
  20
  21#include "core.h"
  22
  23int dwc3_host_init(struct dwc3 *dwc)
  24{
  25        struct platform_device  *xhci;
  26        struct usb_xhci_pdata   pdata;
  27        int                     ret;
  28
  29        xhci = platform_device_alloc("xhci-hcd", PLATFORM_DEVID_AUTO);
  30        if (!xhci) {
  31                dev_err(dwc->dev, "couldn't allocate xHCI device\n");
  32                return -ENOMEM;
  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
  43        ret = platform_device_add_resources(xhci, dwc->xhci_resources,
  44                                                DWC3_XHCI_RESOURCES_NUM);
  45        if (ret) {
  46                dev_err(dwc->dev, "couldn't add resources to xHCI device\n");
  47                goto err1;
  48        }
  49
  50        memset(&pdata, 0, sizeof(pdata));
  51
  52        pdata.usb3_lpm_capable = dwc->usb3_lpm_capable;
  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
  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
  65        ret = platform_device_add(xhci);
  66        if (ret) {
  67                dev_err(dwc->dev, "failed to register xHCI device\n");
  68                goto err2;
  69        }
  70
  71        return 0;
  72err2:
  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));
  77err1:
  78        platform_device_put(xhci);
  79        return ret;
  80}
  81
  82void dwc3_host_exit(struct dwc3 *dwc)
  83{
  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));
  88        platform_device_unregister(dwc->xhci);
  89}
  90