| 
									
										
										
										
											2011-10-12 14:08:26 +03:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * host.c - DesignWare USB3 DRD Controller Host Glue | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Authors: Felipe Balbi <balbi@ti.com>, | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2013-06-30 14:15:11 +03:00
										 |  |  |  * This program is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  |  * it under the terms of the GNU General Public License version 2  of | 
					
						
							|  |  |  |  * the License as published by the Free Software Foundation. | 
					
						
							| 
									
										
										
										
											2011-10-12 14:08:26 +03:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2013-06-30 14:15:11 +03:00
										 |  |  |  * This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |  * GNU General Public License for more details. | 
					
						
							| 
									
										
										
										
											2011-10-12 14:08:26 +03:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <linux/platform_device.h>
 | 
					
						
							| 
									
										
										
										
											2014-07-04 17:01:26 +03:00
										 |  |  | #include <linux/usb/xhci_pdriver.h>
 | 
					
						
							| 
									
										
										
										
											2011-10-12 14:08:26 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "core.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int dwc3_host_init(struct dwc3 *dwc) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	struct platform_device	*xhci; | 
					
						
							| 
									
										
										
										
											2014-07-04 17:01:26 +03:00
										 |  |  | 	struct usb_xhci_pdata	pdata; | 
					
						
							| 
									
										
										
										
											2011-10-12 14:08:26 +03:00
										 |  |  | 	int			ret; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-25 16:52:02 +05:30
										 |  |  | 	xhci = platform_device_alloc("xhci-hcd", PLATFORM_DEVID_AUTO); | 
					
						
							| 
									
										
										
										
											2011-10-12 14:08:26 +03:00
										 |  |  | 	if (!xhci) { | 
					
						
							|  |  |  | 		dev_err(dwc->dev, "couldn't allocate xHCI device\n"); | 
					
						
							|  |  |  | 		ret = -ENOMEM; | 
					
						
							|  |  |  | 		goto err0; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	dma_set_coherent_mask(&xhci->dev, dwc->dev->coherent_dma_mask); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	xhci->dev.parent	= dwc->dev; | 
					
						
							|  |  |  | 	xhci->dev.dma_mask	= dwc->dev->dma_mask; | 
					
						
							|  |  |  | 	xhci->dev.dma_parms	= dwc->dev->dma_parms; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	dwc->xhci = xhci; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-24 14:18:39 +03:00
										 |  |  | 	ret = platform_device_add_resources(xhci, dwc->xhci_resources, | 
					
						
							|  |  |  | 						DWC3_XHCI_RESOURCES_NUM); | 
					
						
							| 
									
										
										
										
											2011-10-12 14:08:26 +03:00
										 |  |  | 	if (ret) { | 
					
						
							|  |  |  | 		dev_err(dwc->dev, "couldn't add resources to xHCI device\n"); | 
					
						
							|  |  |  | 		goto err1; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-04 17:01:26 +03:00
										 |  |  | 	memset(&pdata, 0, sizeof(pdata)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef CONFIG_DWC3_HOST_USB3_LPM_ENABLE
 | 
					
						
							|  |  |  | 	pdata.usb3_lpm_capable = 1; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ret = platform_device_add_data(xhci, &pdata, sizeof(pdata)); | 
					
						
							|  |  |  | 	if (ret) { | 
					
						
							|  |  |  | 		dev_err(dwc->dev, "couldn't add platform data to xHCI device\n"); | 
					
						
							|  |  |  | 		goto err1; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-12 14:08:26 +03:00
										 |  |  | 	ret = platform_device_add(xhci); | 
					
						
							|  |  |  | 	if (ret) { | 
					
						
							|  |  |  | 		dev_err(dwc->dev, "failed to register xHCI device\n"); | 
					
						
							|  |  |  | 		goto err1; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | err1: | 
					
						
							|  |  |  | 	platform_device_put(xhci); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | err0: | 
					
						
							|  |  |  | 	return ret; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void dwc3_host_exit(struct dwc3 *dwc) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	platform_device_unregister(dwc->xhci); | 
					
						
							|  |  |  | } |