diff options
Diffstat (limited to 'drivers/usb/dwc3/core.c')
| -rw-r--r-- | drivers/usb/dwc3/core.c | 96 | 
1 files changed, 25 insertions, 71 deletions
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index c14ebc975ba..3a4004a620a 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c @@ -66,45 +66,6 @@ MODULE_PARM_DESC(maximum_speed, "Maximum supported speed.");  /* -------------------------------------------------------------------------- */ -#define DWC3_DEVS_POSSIBLE	32 - -static DECLARE_BITMAP(dwc3_devs, DWC3_DEVS_POSSIBLE); - -int dwc3_get_device_id(void) -{ -	int		id; - -again: -	id = find_first_zero_bit(dwc3_devs, DWC3_DEVS_POSSIBLE); -	if (id < DWC3_DEVS_POSSIBLE) { -		int old; - -		old = test_and_set_bit(id, dwc3_devs); -		if (old) -			goto again; -	} else { -		pr_err("dwc3: no space for new device\n"); -		id = -ENOMEM; -	} - -	return id; -} -EXPORT_SYMBOL_GPL(dwc3_get_device_id); - -void dwc3_put_device_id(int id) -{ -	int			ret; - -	if (id < 0) -		return; - -	ret = test_bit(id, dwc3_devs); -	WARN(!ret, "dwc3: ID %d not in use\n", id); -	smp_mb__before_clear_bit(); -	clear_bit(id, dwc3_devs); -} -EXPORT_SYMBOL_GPL(dwc3_put_device_id); -  void dwc3_set_mode(struct dwc3 *dwc, u32 mode)  {  	u32 reg; @@ -169,7 +130,6 @@ static void dwc3_free_one_event_buffer(struct dwc3 *dwc,  		struct dwc3_event_buffer *evt)  {  	dma_free_coherent(dwc->dev, evt->length, evt->buf, evt->dma); -	kfree(evt);  }  /** @@ -180,12 +140,11 @@ static void dwc3_free_one_event_buffer(struct dwc3 *dwc,   * Returns a pointer to the allocated event buffer structure on success   * otherwise ERR_PTR(errno).   */ -static struct dwc3_event_buffer *__devinit -dwc3_alloc_one_event_buffer(struct dwc3 *dwc, unsigned length) +static struct dwc3_event_buffer *dwc3_alloc_one_event_buffer(struct dwc3 *dwc, unsigned length)  {  	struct dwc3_event_buffer	*evt; -	evt = kzalloc(sizeof(*evt), GFP_KERNEL); +	evt = devm_kzalloc(dwc->dev, sizeof(*evt), GFP_KERNEL);  	if (!evt)  		return ERR_PTR(-ENOMEM); @@ -193,10 +152,8 @@ dwc3_alloc_one_event_buffer(struct dwc3 *dwc, unsigned length)  	evt->length	= length;  	evt->buf	= dma_alloc_coherent(dwc->dev, length,  			&evt->dma, GFP_KERNEL); -	if (!evt->buf) { -		kfree(evt); +	if (!evt->buf)  		return ERR_PTR(-ENOMEM); -	}  	return evt;  } @@ -215,8 +172,6 @@ static void dwc3_free_event_buffers(struct dwc3 *dwc)  		if (evt)  			dwc3_free_one_event_buffer(dwc, evt);  	} - -	kfree(dwc->ev_buffs);  }  /** @@ -227,7 +182,7 @@ static void dwc3_free_event_buffers(struct dwc3 *dwc)   * Returns 0 on success otherwise negative errno. In the error case, dwc   * may contain some buffers allocated but not all which were requested.   */ -static int __devinit dwc3_alloc_event_buffers(struct dwc3 *dwc, unsigned length) +static int dwc3_alloc_event_buffers(struct dwc3 *dwc, unsigned length)  {  	int			num;  	int			i; @@ -235,7 +190,8 @@ static int __devinit dwc3_alloc_event_buffers(struct dwc3 *dwc, unsigned length)  	num = DWC3_NUM_INT(dwc->hwparams.hwparams1);  	dwc->num_event_buffers = num; -	dwc->ev_buffs = kzalloc(sizeof(*dwc->ev_buffs) * num, GFP_KERNEL); +	dwc->ev_buffs = devm_kzalloc(dwc->dev, sizeof(*dwc->ev_buffs) * num, +			GFP_KERNEL);  	if (!dwc->ev_buffs) {  		dev_err(dwc->dev, "can't allocate event buffers array\n");  		return -ENOMEM; @@ -303,7 +259,7 @@ static void dwc3_event_buffers_cleanup(struct dwc3 *dwc)  	}  } -static void __devinit dwc3_cache_hwparams(struct dwc3 *dwc) +static void dwc3_cache_hwparams(struct dwc3 *dwc)  {  	struct dwc3_hwparams	*parms = &dwc->hwparams; @@ -324,7 +280,7 @@ static void __devinit dwc3_cache_hwparams(struct dwc3 *dwc)   *   * Returns 0 on success otherwise negative errno.   */ -static int __devinit dwc3_core_init(struct dwc3 *dwc) +static int dwc3_core_init(struct dwc3 *dwc)  {  	unsigned long		timeout;  	u32			reg; @@ -358,8 +314,6 @@ static int __devinit dwc3_core_init(struct dwc3 *dwc)  	dwc3_core_soft_reset(dwc); -	dwc3_cache_hwparams(dwc); -  	reg = dwc3_readl(dwc->regs, DWC3_GCTL);  	reg &= ~DWC3_GCTL_SCALEDOWN_MASK;  	reg &= ~DWC3_GCTL_DISSCRAMBLE; @@ -383,24 +337,14 @@ static int __devinit dwc3_core_init(struct dwc3 *dwc)  	dwc3_writel(dwc->regs, DWC3_GCTL, reg); -	ret = dwc3_alloc_event_buffers(dwc, DWC3_EVENT_BUFFERS_SIZE); -	if (ret) { -		dev_err(dwc->dev, "failed to allocate event buffers\n"); -		ret = -ENOMEM; -		goto err1; -	} -  	ret = dwc3_event_buffers_setup(dwc);  	if (ret) {  		dev_err(dwc->dev, "failed to setup event buffers\n"); -		goto err1; +		goto err0;  	}  	return 0; -err1: -	dwc3_free_event_buffers(dwc); -  err0:  	return ret;  } @@ -408,16 +352,14 @@ err0:  static void dwc3_core_exit(struct dwc3 *dwc)  {  	dwc3_event_buffers_cleanup(dwc); -	dwc3_free_event_buffers(dwc);  	usb_phy_shutdown(dwc->usb2_phy);  	usb_phy_shutdown(dwc->usb3_phy); -  }  #define DWC3_ALIGN_MASK		(16 - 1) -static int __devinit dwc3_probe(struct platform_device *pdev) +static int dwc3_probe(struct platform_device *pdev)  {  	struct device_node	*node = pdev->dev.of_node;  	struct resource		*res; @@ -515,10 +457,19 @@ static int __devinit dwc3_probe(struct platform_device *pdev)  	pm_runtime_get_sync(dev);  	pm_runtime_forbid(dev); +	dwc3_cache_hwparams(dwc); + +	ret = dwc3_alloc_event_buffers(dwc, DWC3_EVENT_BUFFERS_SIZE); +	if (ret) { +		dev_err(dwc->dev, "failed to allocate event buffers\n"); +		ret = -ENOMEM; +		goto err0; +	} +  	ret = dwc3_core_init(dwc);  	if (ret) {  		dev_err(dev, "failed to initialize core\n"); -		return ret; +		goto err0;  	}  	mode = DWC3_MODE(dwc->hwparams.hwparams0); @@ -590,10 +541,13 @@ err2:  err1:  	dwc3_core_exit(dwc); +err0: +	dwc3_free_event_buffers(dwc); +  	return ret;  } -static int __devexit dwc3_remove(struct platform_device *pdev) +static int dwc3_remove(struct platform_device *pdev)  {  	struct dwc3	*dwc = platform_get_drvdata(pdev);  	struct resource	*res; @@ -628,7 +582,7 @@ static int __devexit dwc3_remove(struct platform_device *pdev)  static struct platform_driver dwc3_driver = {  	.probe		= dwc3_probe, -	.remove		= __devexit_p(dwc3_remove), +	.remove		= dwc3_remove,  	.driver		= {  		.name	= "dwc3",  	},  |