Re: [PATCH 08/16] mfd: omap-usb-host: know about number of ports from revision register

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Nov 15, 2012 at 04:34:06PM +0200, Roger Quadros wrote:
> prevents getting clocks that don't exist on the platform.
> 
> Signed-off-by: Roger Quadros <rogerq@xxxxxx>
> ---
>  drivers/mfd/omap-usb-host.c |   47 ++++++++++++++++++++++++++++++++-----------
>  1 files changed, 35 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/mfd/omap-usb-host.c b/drivers/mfd/omap-usb-host.c
> index 44772ae..ad89939 100644
> --- a/drivers/mfd/omap-usb-host.c
> +++ b/drivers/mfd/omap-usb-host.c
> @@ -94,6 +94,7 @@ struct usbhs_port {
>  };
>  
>  struct usbhs_hcd_omap {
> +	int				nports;
>  	struct usbhs_port		port[MAX_HS_USB_PORTS];
>  
>  	struct clk			*xclk60mhsp1_ck;
> @@ -291,7 +292,7 @@ static int usbhs_runtime_resume(struct device *dev)
>  	if (omap->ehci_logic_fck && !IS_ERR(omap->ehci_logic_fck))
>  		clk_enable(omap->ehci_logic_fck);
>  
> -	for (i = 0; i < MAX_HS_USB_PORTS; i++) {
> +	for (i = 0; i < omap->nports; i++) {
>  		if (is_ehci_tll_mode(pdata->port_mode[i])) {
>  			if (omap->port[i].utmi_clk) {
>  				r = clk_enable(omap->port[i].utmi_clk);
> @@ -320,7 +321,7 @@ static int usbhs_runtime_suspend(struct device *dev)
>  
>  	spin_lock_irqsave(&omap->lock, flags);
>  
> -	for (i = 0; i < MAX_HS_USB_PORTS; i++) {
> +	for (i = 0; i < omap->nports; i++) {
>  		if (is_ehci_tll_mode(pdata->port_mode[i])) {
>  			if (omap->port[i].utmi_clk)
>  				clk_disable(omap->port[i].utmi_clk);
> @@ -360,8 +361,6 @@ static void omap_usbhs_init(struct device *dev)
>  
>  	pm_runtime_get_sync(dev);
>  	spin_lock_irqsave(&omap->lock, flags);
> -	omap->usbhs_rev = usbhs_read(omap->uhh_base, OMAP_UHH_REVISION);
> -	dev_dbg(dev, "OMAP UHH_REVISION 0x%x\n", omap->usbhs_rev);
>  
>  	reg = usbhs_read(omap->uhh_base, OMAP_UHH_HOSTCONFIG);
>  	/* setup ULPI bypass and burst configurations */
> @@ -502,8 +501,32 @@ static int __devinit usbhs_omap_probe(struct platform_device *pdev)
>  	omap->pdata = pdata;
>  	platform_set_drvdata(pdev, omap);
>  
> +	pm_runtime_enable(dev);
> +	pm_runtime_get_sync(dev);
> +	omap->usbhs_rev = usbhs_read(omap->uhh_base, OMAP_UHH_REVISION);
> +
> +	/* we need to call runtime suspend before we update omap->nports
> +	 * to prevent unbalanced clk_disable()
> +	 */

wrong comment style.

> +	pm_runtime_put_sync(dev);

does it *really* need to be a synchronous put ?

> +
> +	switch (omap->usbhs_rev) {
> +	case OMAP_USBHS_REV1:
> +		omap->nports = 3;
> +		break;
> +	case OMAP_USBHS_REV2:
> +		omap->nports = 2;
> +		break;
> +	default:
> +		omap->nports = MAX_HS_USB_PORTS;
> +		dev_info(dev,
> +		  "USB HOST Rev : 0x%d not recognized, assuming %d ports\n",
> +		   omap->usbhs_rev, omap->nports);

please make this dev_dbg().

> +		break;
> +	}
> +
>  	need_logic_fck = false;
> -	for (i = 0; i < MAX_HS_USB_PORTS; i++) {
> +	for (i = 0; i < omap->nports; i++) {
>  		if (is_ehci_phy_mode(i) || is_ehci_tll_mode(i) ||
>  			is_ehci_hsic_mode(i))
>  				need_logic_fck |= true;
> @@ -538,7 +561,7 @@ static int __devinit usbhs_omap_probe(struct platform_device *pdev)
>  		goto err_init60m;
>  	}
>  
> -	for (i = 0; i < MAX_HS_USB_PORTS; i++) {
> +	for (i = 0; i < omap->nports; i++) {
>  		struct clk *pclk;
>  		char utmi_clk[] = "usb_host_hs_utmi_px_clk";
>  
> @@ -588,8 +611,6 @@ static int __devinit usbhs_omap_probe(struct platform_device *pdev)
>  	}
>  
>  
> -	pm_runtime_enable(dev);

moving this part around isn't part of $SUBJECT aparently.

> -
>  	omap_usbhs_init(dev);
>  	ret = omap_usbhs_alloc_children(pdev);
>  	if (ret) {
> @@ -597,15 +618,15 @@ static int __devinit usbhs_omap_probe(struct platform_device *pdev)
>  		goto err_alloc;
>  	}
>  
> +	pr_info("OMAP USB HOST : revision 0x%x, ports %d\n",
> +			omap->usbhs_rev, omap->nports);

please remove this pr_info() as it doesn't add anything other than noise
to bootup, IMHO.

>  	return 0;
>  
>  err_alloc:
>  	omap_usbhs_deinit(&pdev->dev);
> -
> -	pm_runtime_disable(dev);
>  	iounmap(omap->uhh_base);
>  
> -	for (i = 0; i < MAX_HS_USB_PORTS; i++)
> +	for (i = 0; i < omap->nports; i++)
>  		clk_put(omap->port[i].utmi_clk);
>  
>  	clk_put(omap->init_60m_fclk);
> @@ -619,6 +640,8 @@ err_xclk60mhsp2:
>  err_xclk60mhsp1:
>  	clk_put(omap->ehci_logic_fck);
>  
> +	pm_runtime_disable(dev);
> +
>  err_remap:
>  	kfree(omap);
>  	return ret;
> @@ -639,7 +662,7 @@ static int __devexit usbhs_omap_remove(struct platform_device *pdev)
>  	pm_runtime_disable(&pdev->dev);
>  	iounmap(omap->uhh_base);
>  
> -	for (i = 0; i < MAX_HS_USB_PORTS; i++)
> +	for (i = 0; i < omap->nports; i++)
>  		clk_put(omap->port[i].utmi_clk);
>  
>  	clk_put(omap->init_60m_fclk);
> -- 
> 1.7.4.1
> 

-- 
balbi

Attachment: signature.asc
Description: Digital signature


[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux