1d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi/** 2d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi * host.c - DesignWare USB3 DRD Controller Host Glue 3d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi * 4d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com 5d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi * 6d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi * Authors: Felipe Balbi <balbi@ti.com>, 7d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi * 85945f789c864d8676b297880cc6961fea4511a7aFelipe Balbi * This program is free software: you can redistribute it and/or modify 95945f789c864d8676b297880cc6961fea4511a7aFelipe Balbi * it under the terms of the GNU General Public License version 2 of 105945f789c864d8676b297880cc6961fea4511a7aFelipe Balbi * the License as published by the Free Software Foundation. 11d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi * 125945f789c864d8676b297880cc6961fea4511a7aFelipe Balbi * This program is distributed in the hope that it will be useful, 135945f789c864d8676b297880cc6961fea4511a7aFelipe Balbi * but WITHOUT ANY WARRANTY; without even the implied warranty of 145945f789c864d8676b297880cc6961fea4511a7aFelipe Balbi * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 155945f789c864d8676b297880cc6961fea4511a7aFelipe Balbi * GNU General Public License for more details. 16d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi */ 17d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi 18d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi#include <linux/platform_device.h> 19b2f463e1300016785d63475c56f5807e2be00934Pratyush Anand#include <linux/usb/xhci_pdriver.h> 20d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi 21d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi#include "core.h" 22d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi 23d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbiint dwc3_host_init(struct dwc3 *dwc) 24d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi{ 25d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi struct platform_device *xhci; 26b2f463e1300016785d63475c56f5807e2be00934Pratyush Anand struct usb_xhci_pdata pdata; 27d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi int ret; 28d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi 2952758bcb7c12bede2a81849dee13f1edcd44e1c1Vivek Gautam xhci = platform_device_alloc("xhci-hcd", PLATFORM_DEVID_AUTO); 30d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi if (!xhci) { 31d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi dev_err(dwc->dev, "couldn't allocate xHCI device\n"); 32d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi ret = -ENOMEM; 33d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi goto err0; 34d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi } 35d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi 36d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi dma_set_coherent_mask(&xhci->dev, dwc->dev->coherent_dma_mask); 37d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi 38d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi xhci->dev.parent = dwc->dev; 39d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi xhci->dev.dma_mask = dwc->dev->dma_mask; 40d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi xhci->dev.dma_parms = dwc->dev->dma_parms; 41d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi 42d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi dwc->xhci = xhci; 43d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi 4451249dca627d9d0e6b41531e716cbc308554a62cIdo Shayevitz ret = platform_device_add_resources(xhci, dwc->xhci_resources, 4551249dca627d9d0e6b41531e716cbc308554a62cIdo Shayevitz DWC3_XHCI_RESOURCES_NUM); 46d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi if (ret) { 47d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi dev_err(dwc->dev, "couldn't add resources to xHCI device\n"); 48d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi goto err1; 49d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi } 50d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi 51b2f463e1300016785d63475c56f5807e2be00934Pratyush Anand memset(&pdata, 0, sizeof(pdata)); 52b2f463e1300016785d63475c56f5807e2be00934Pratyush Anand 53b2f463e1300016785d63475c56f5807e2be00934Pratyush Anand#ifdef CONFIG_DWC3_HOST_USB3_LPM_ENABLE 54b2f463e1300016785d63475c56f5807e2be00934Pratyush Anand pdata.usb3_lpm_capable = 1; 55b2f463e1300016785d63475c56f5807e2be00934Pratyush Anand#endif 56b2f463e1300016785d63475c56f5807e2be00934Pratyush Anand 57b2f463e1300016785d63475c56f5807e2be00934Pratyush Anand ret = platform_device_add_data(xhci, &pdata, sizeof(pdata)); 58b2f463e1300016785d63475c56f5807e2be00934Pratyush Anand if (ret) { 59b2f463e1300016785d63475c56f5807e2be00934Pratyush Anand dev_err(dwc->dev, "couldn't add platform data to xHCI device\n"); 60b2f463e1300016785d63475c56f5807e2be00934Pratyush Anand goto err1; 61b2f463e1300016785d63475c56f5807e2be00934Pratyush Anand } 62b2f463e1300016785d63475c56f5807e2be00934Pratyush Anand 63d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi ret = platform_device_add(xhci); 64d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi if (ret) { 65d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi dev_err(dwc->dev, "failed to register xHCI device\n"); 66d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi goto err1; 67d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi } 68d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi 69d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi return 0; 70d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi 71d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbierr1: 72d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi platform_device_put(xhci); 73d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi 74d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbierr0: 75d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi return ret; 76d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi} 77d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi 78d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbivoid dwc3_host_exit(struct dwc3 *dwc) 79d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi{ 80d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi platform_device_unregister(dwc->xhci); 81d07e8819a03dc2d1f03f725194ae56544e6c680bFelipe Balbi} 82