[U-Boot] [u-boot 19/40] usb: dwc3: core: make dwc3 core build in uboot

Lukasz Majewski l.majewski at samsung.com
Mon Feb 16 11:57:06 CET 2015


Hi Kishon,

> *) Changed the include header files to that used in u-boot.
> *) Removed phy_* APIs
> *) Removed jiffies and used a simple while loop
> *) Used dma_alloc_coherent and dma_free_coherent APIs of u-boot
> *) Fixed other misc warnings
> 
> Signed-off-by: Kishon Vijay Abraham I <kishon at ti.com>
> ---
>  drivers/usb/dwc3/core.c         |  216
> ++++++---------------------------------
> drivers/usb/dwc3/core.h         |   10 --
> drivers/usb/dwc3/linux-compat.h |   10 ++ 3 files changed, 40
> insertions(+), 196 deletions(-)
> 
> diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
> index ebfb6ca..78322b7 100644
> --- a/drivers/usb/dwc3/core.c
> +++ b/drivers/usb/dwc3/core.c
> @@ -14,32 +14,19 @@
>   * SPDX-License-Identifier:     GPL-2.0
>   */
>  
> -#include <linux/version.h>
> -#include <linux/module.h>
> -#include <linux/kernel.h>
> -#include <linux/slab.h>
> -#include <linux/spinlock.h>
> -#include <linux/platform_device.h>
> -#include <linux/interrupt.h>
> +#include <common.h>
> +#include <malloc.h>
> +#include <asm/dma-mapping.h>
>  #include <linux/ioport.h>
> -#include <linux/io.h>
> -#include <linux/list.h>
> -#include <linux/delay.h>
> -#include <linux/dma-mapping.h>
> -#include <linux/of.h>
> -#include <linux/acpi.h>
>  
>  #include <linux/usb/ch9.h>
>  #include <linux/usb/gadget.h>
> -#include <linux/usb/of.h>
> -#include <linux/usb/otg.h>
>  
> -#include "platform_data.h"
>  #include "core.h"
>  #include "gadget.h"
>  #include "io.h"
>  
> -#include "debug.h"
> +#include "linux-compat.h"
>  
>  /*
> --------------------------------------------------------------------------
> */ @@ -60,7 +47,6 @@ void dwc3_set_mode(struct dwc3 *dwc, u32 mode)
>  static int dwc3_core_soft_reset(struct dwc3 *dwc)
>  {
>  	u32		reg;
> -	int		ret;
>  
>  	/* Before Resetting PHY, put Core in Reset */
>  	reg = dwc3_readl(dwc->regs, DWC3_GCTL);
> @@ -77,17 +63,6 @@ static int dwc3_core_soft_reset(struct dwc3 *dwc)
>  	reg |= DWC3_GUSB2PHYCFG_PHYSOFTRST;
>  	dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg);
>  
> -	usb_phy_init(dwc->usb2_phy);
> -	usb_phy_init(dwc->usb3_phy);
> -	ret = phy_init(dwc->usb2_generic_phy);
> -	if (ret < 0)
> -		return ret;
> -
> -	ret = phy_init(dwc->usb3_generic_phy);
> -	if (ret < 0) {
> -		phy_exit(dwc->usb2_generic_phy);
> -		return ret;
> -	}
>  	mdelay(100);
>  
>  	/* Clear USB3 PHY reset */
> @@ -118,7 +93,7 @@ static int dwc3_core_soft_reset(struct dwc3 *dwc)
>  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);
> +	dma_free_coherent(evt->buf);
>  }
>  
>  /**
> @@ -140,8 +115,8 @@ static struct dwc3_event_buffer
> *dwc3_alloc_one_event_buffer(struct dwc3 *dwc, 
>  	evt->dwc	= dwc;
>  	evt->length	= length;
> -	evt->buf	= dma_alloc_coherent(dwc->dev, length,
> -			&evt->dma, GFP_KERNEL);
> +	evt->buf	= dma_alloc_coherent(length,
> +					     (unsigned long
> *)&evt->dma); if (!evt->buf)
>  		return ERR_PTR(-ENOMEM);
>  
> @@ -276,13 +251,9 @@ static int dwc3_setup_scratch_buffers(struct
> dwc3 *dwc) if (!dwc->nr_scratch)
>  		return 0;
>  
> -	 /* should never fall here */
> -	if (!WARN_ON(dwc->scratchbuf))
> -		return 0;
> -
> -	scratch_addr = dma_map_single(dwc->dev, dwc->scratchbuf,
> -			dwc->nr_scratch * DWC3_SCRATCHBUF_SIZE,
> -			DMA_BIDIRECTIONAL);
> +	scratch_addr = dma_map_single(dwc->scratchbuf,
> +				      dwc->nr_scratch *
> DWC3_SCRATCHBUF_SIZE,
> +				      DMA_BIDIRECTIONAL);
>  	if (dma_mapping_error(dwc->dev, scratch_addr)) {
>  		dev_err(dwc->dev, "failed to map scratch buffer\n");
>  		ret = -EFAULT;
> @@ -308,8 +279,8 @@ static int dwc3_setup_scratch_buffers(struct dwc3
> *dwc) return 0;
>  
>  err1:
> -	dma_unmap_single(dwc->dev, dwc->scratch_addr,
> dwc->nr_scratch *
> -			DWC3_SCRATCHBUF_SIZE, DMA_BIDIRECTIONAL);
> +	dma_unmap_single((void *)dwc->scratch_addr, dwc->nr_scratch *
> +			 DWC3_SCRATCHBUF_SIZE, DMA_BIDIRECTIONAL);
>  
>  err0:
>  	return ret;
> @@ -323,12 +294,8 @@ static void dwc3_free_scratch_buffers(struct
> dwc3 *dwc) if (!dwc->nr_scratch)
>  		return;
>  
> -	 /* should never fall here */
> -	if (!WARN_ON(dwc->scratchbuf))
> -		return;
> -
> -	dma_unmap_single(dwc->dev, dwc->scratch_addr,
> dwc->nr_scratch *
> -			DWC3_SCRATCHBUF_SIZE, DMA_BIDIRECTIONAL);
> +	dma_unmap_single((void *)dwc->scratch_addr, dwc->nr_scratch *
> +			 DWC3_SCRATCHBUF_SIZE, DMA_BIDIRECTIONAL);
>  	kfree(dwc->scratchbuf);
>  }
>  
> @@ -446,12 +413,6 @@ static int dwc3_core_init(struct dwc3 *dwc)
>  	}
>  	dwc->revision = reg;
>  
> -	/*
> -	 * Write Linux Version Code to our GUID register so it's
> easy to figure
> -	 * out which kernel version a bug was found.
> -	 */
> -	dwc3_writel(dwc->regs, DWC3_GUID, LINUX_VERSION_CODE);
> -
>  	/* Handle USB2.0-only core configuration */
>  	if (DWC3_GHWPARAMS3_SSPHY_IFC(dwc->hwparams.hwparams3) ==
>  			DWC3_GHWPARAMS3_SSPHY_IFC_DIS) {
> @@ -460,21 +421,19 @@ static int dwc3_core_init(struct dwc3 *dwc)
>  	}
>  
>  	/* issue device SoftReset too */
> -	timeout = jiffies + msecs_to_jiffies(500);
> +	timeout = 5000;
>  	dwc3_writel(dwc->regs, DWC3_DCTL, DWC3_DCTL_CSFTRST);
> -	do {
> +	while (timeout--) {
>  		reg = dwc3_readl(dwc->regs, DWC3_DCTL);
>  		if (!(reg & DWC3_DCTL_CSFTRST))
>  			break;
> +	};
>  
> -		if (time_after(jiffies, timeout)) {
> -			dev_err(dwc->dev, "Reset Timed Out\n");
> -			ret = -ETIMEDOUT;
> -			goto err0;
> -		}
> -
> -		cpu_relax();
> -	} while (true);
> +	if (!timeout) {
> +		dev_err(dwc->dev, "Reset Timed Out\n");
> +		ret = -ETIMEDOUT;
> +		goto err0;
> +	}
>  
>  	ret = dwc3_core_soft_reset(dwc);
>  	if (ret)
> @@ -525,8 +484,9 @@ static int dwc3_core_init(struct dwc3 *dwc)
>  		dwc->is_fpga = true;
>  	}
>  
> -	WARN_ONCE(dwc->disable_scramble_quirk && !dwc->is_fpga,
> -			"disable_scramble cannot be used on non-FPGA
> builds\n");
> +	if(dwc->disable_scramble_quirk && !dwc->is_fpga)
> +		WARN(true,
> +		     "disable_scramble cannot be used on non-FPGA
> builds\n"); 
>  	if (dwc->disable_scramble_quirk && dwc->is_fpga)
>  		reg |= DWC3_GCTL_DISSCRAMBLE;
> @@ -553,22 +513,16 @@ static int dwc3_core_init(struct dwc3 *dwc)
>  
>  	ret = dwc3_alloc_scratch_buffers(dwc);
>  	if (ret)
> -		goto err1;
> +		goto err0;
>  
>  	ret = dwc3_setup_scratch_buffers(dwc);
>  	if (ret)
> -		goto err2;
> +		goto err1;
>  
>  	return 0;
>  
> -err2:
> -	dwc3_free_scratch_buffers(dwc);
> -
>  err1:
> -	usb_phy_shutdown(dwc->usb2_phy);
> -	usb_phy_shutdown(dwc->usb3_phy);
> -	phy_exit(dwc->usb2_generic_phy);
> -	phy_exit(dwc->usb3_generic_phy);
> +	dwc3_free_scratch_buffers(dwc);
>  
>  err0:
>  	return ret;
> @@ -577,82 +531,10 @@ err0:
>  static void dwc3_core_exit(struct dwc3 *dwc)
>  {
>  	dwc3_free_scratch_buffers(dwc);
> -	usb_phy_shutdown(dwc->usb2_phy);
> -	usb_phy_shutdown(dwc->usb3_phy);
> -	phy_exit(dwc->usb2_generic_phy);
> -	phy_exit(dwc->usb3_generic_phy);
> -}
> -
> -static int dwc3_core_get_phy(struct dwc3 *dwc)
> -{
> -	struct device		*dev = dwc->dev;
> -	struct device_node	*node = dev->of_node;
> -	int ret;
> -
> -	if (node) {
> -		dwc->usb2_phy = devm_usb_get_phy_by_phandle(dev,
> "usb-phy", 0);
> -		dwc->usb3_phy = devm_usb_get_phy_by_phandle(dev,
> "usb-phy", 1);
> -	} else {
> -		dwc->usb2_phy = devm_usb_get_phy(dev,
> USB_PHY_TYPE_USB2);
> -		dwc->usb3_phy = devm_usb_get_phy(dev,
> USB_PHY_TYPE_USB3);
> -	}
> -
> -	if (IS_ERR(dwc->usb2_phy)) {
> -		ret = PTR_ERR(dwc->usb2_phy);
> -		if (ret == -ENXIO || ret == -ENODEV) {
> -			dwc->usb2_phy = NULL;
> -		} else if (ret == -EPROBE_DEFER) {
> -			return ret;
> -		} else {
> -			dev_err(dev, "no usb2 phy configured\n");
> -			return ret;
> -		}
> -	}
> -
> -	if (IS_ERR(dwc->usb3_phy)) {
> -		ret = PTR_ERR(dwc->usb3_phy);
> -		if (ret == -ENXIO || ret == -ENODEV) {
> -			dwc->usb3_phy = NULL;
> -		} else if (ret == -EPROBE_DEFER) {
> -			return ret;
> -		} else {
> -			dev_err(dev, "no usb3 phy configured\n");
> -			return ret;
> -		}
> -	}
> -
> -	dwc->usb2_generic_phy = devm_phy_get(dev, "usb2-phy");
> -	if (IS_ERR(dwc->usb2_generic_phy)) {
> -		ret = PTR_ERR(dwc->usb2_generic_phy);
> -		if (ret == -ENOSYS || ret == -ENODEV) {
> -			dwc->usb2_generic_phy = NULL;
> -		} else if (ret == -EPROBE_DEFER) {
> -			return ret;
> -		} else {
> -			dev_err(dev, "no usb2 phy configured\n");
> -			return ret;
> -		}
> -	}
> -
> -	dwc->usb3_generic_phy = devm_phy_get(dev, "usb3-phy");
> -	if (IS_ERR(dwc->usb3_generic_phy)) {
> -		ret = PTR_ERR(dwc->usb3_generic_phy);
> -		if (ret == -ENOSYS || ret == -ENODEV) {
> -			dwc->usb3_generic_phy = NULL;
> -		} else if (ret == -EPROBE_DEFER) {
> -			return ret;
> -		} else {
> -			dev_err(dev, "no usb3 phy configured\n");
> -			return ret;
> -		}
> -	}
> -
> -	return 0;
>  }
>  
>  static int dwc3_core_init_mode(struct dwc3 *dwc)
>  {
> -	struct device *dev = dwc->dev;
>  	int ret;
>  
>  	switch (dwc->dr_mode) {
> @@ -870,10 +752,6 @@ static int dwc3_probe(struct platform_device
> *pdev) dwc->hird_threshold = hird_threshold
>  		| (dwc->is_utmi_l1_suspend << 4);
>  
> -	ret = dwc3_core_get_phy(dwc);
> -	if (ret)
> -		return ret;
> -
>  	spin_lock_init(&dwc->lock);
>  	platform_set_drvdata(pdev, dwc);
>  
> @@ -888,8 +766,7 @@ static int dwc3_probe(struct platform_device
> *pdev) 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;
> +		return -ENOMEM;
>  	}
>  
>  	if (IS_ENABLED(CONFIG_USB_DWC3_HOST))
> @@ -906,49 +783,22 @@ static int dwc3_probe(struct platform_device
> *pdev) goto err0;
>  	}
>  
> -	usb_phy_set_suspend(dwc->usb2_phy, 0);
> -	usb_phy_set_suspend(dwc->usb3_phy, 0);
> -	ret = phy_power_on(dwc->usb2_generic_phy);
> -	if (ret < 0)
> -		goto err1;
> -
> -	ret = phy_power_on(dwc->usb3_generic_phy);
> -	if (ret < 0)
> -		goto err_usb2phy_power;
> -
>  	ret = dwc3_event_buffers_setup(dwc);
>  	if (ret) {
>  		dev_err(dwc->dev, "failed to setup event buffers\n");
> -		goto err_usb3phy_power;
> +		goto err1;
>  	}
>  
>  	ret = dwc3_core_init_mode(dwc);
>  	if (ret)
>  		goto err2;
>  
> -	ret = dwc3_debugfs_init(dwc);
> -	if (ret) {
> -		dev_err(dev, "failed to initialize debugfs\n");
> -		goto err3;
> -	}
> -
>  	return 0;
>  
> -err3:
> -	dwc3_core_exit_mode(dwc);
> -
>  err2:
>  	dwc3_event_buffers_cleanup(dwc);
>  
> -err_usb3phy_power:
> -	phy_power_off(dwc->usb3_generic_phy);
> -
> -err_usb2phy_power:
> -	phy_power_off(dwc->usb2_generic_phy);
> -
>  err1:
> -	usb_phy_set_suspend(dwc->usb2_phy, 1);
> -	usb_phy_set_suspend(dwc->usb3_phy, 1);
>  	dwc3_core_exit(dwc);
>  
>  err0:
> @@ -961,16 +811,10 @@ static int dwc3_remove(struct platform_device
> *pdev) {
>  	struct dwc3	*dwc = platform_get_drvdata(pdev);
>  
> -	dwc3_debugfs_exit(dwc);
>  	dwc3_core_exit_mode(dwc);
>  	dwc3_event_buffers_cleanup(dwc);
>  	dwc3_free_event_buffers(dwc);
>  
> -	usb_phy_set_suspend(dwc->usb2_phy, 1);
> -	usb_phy_set_suspend(dwc->usb3_phy, 1);
> -	phy_power_off(dwc->usb2_generic_phy);
> -	phy_power_off(dwc->usb3_generic_phy);
> -
>  	dwc3_core_exit(dwc);
>  
>  	return 0;
> diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
> index 0ffcb7d..0d507c1 100644
> --- a/drivers/usb/dwc3/core.h
> +++ b/drivers/usb/dwc3/core.h
> @@ -641,10 +641,6 @@ struct dwc3_scratchpad_array {
>   * @maximum_speed: maximum speed requested (mainly for testing
> purposes)
>   * @revision: revision register contents
>   * @dr_mode: requested mode of operation
> - * @usb2_phy: pointer to USB2 PHY
> - * @usb3_phy: pointer to USB3 PHY
> - * @usb2_generic_phy: pointer to USB2 PHY
> - * @usb3_generic_phy: pointer to USB3 PHY
>   * @dcfg: saved contents of DCFG register
>   * @gctl: saved contents of GCTL register
>   * @isoch_delay: wValue from Set Isochronous Delay request;
> @@ -726,12 +722,6 @@ struct dwc3 {
>  	struct usb_gadget	gadget;
>  	struct usb_gadget_driver *gadget_driver;
>  
> -	struct usb_phy		*usb2_phy;
> -	struct usb_phy		*usb3_phy;
> -
> -	struct phy		*usb2_generic_phy;
> -	struct phy		*usb3_generic_phy;
> -
>  	void __iomem		*regs;
>  	size_t			regs_size;
>  
> diff --git a/drivers/usb/dwc3/linux-compat.h
> b/drivers/usb/dwc3/linux-compat.h index cbfb946..b36f68f 100644
> --- a/drivers/usb/dwc3/linux-compat.h
> +++ b/drivers/usb/dwc3/linux-compat.h
> @@ -25,4 +25,14 @@ static inline size_t strlcat(char *dest, const
> char *src, size_t n) return strlen(dest) + strlen(src);
>  }
>  
> +static inline void *devm_kzalloc(struct device *dev, unsigned int
> size,
> +				 unsigned int flags)
> +{
> +	return kzalloc(size, flags);
> +}
> +
> +static inline void *kmalloc_array(size_t n, size_t size, gfp_t flags)
> +{
> +	return kzalloc(n * size, flags);
> +}
>  #endif

Reviewed-by: Lukasz Majewski <l.majewski at samsung.com>

-- 
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group


More information about the U-Boot mailing list