linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: peter.chen@freescale.com (Peter Chen)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v3 5/7] usb: chipidea: usbmisc: add support for ahb, ipg and per clock
Date: Fri, 23 Nov 2012 14:51:16 +0800	[thread overview]
Message-ID: <20121123065115.GC22420@nchen-desktop> (raw)
In-Reply-To: <1353506793-8354-6-git-send-email-m.grzeschik@pengutronix.de>

On Wed, Nov 21, 2012 at 03:06:31PM +0100, Michael Grzeschik wrote:
> From: Marc Kleine-Budde <mkl@pengutronix.de>
> 
> This patch adds support for a second and third clock to the usbmisc driver. On
> modern freescale ARM cores like the imx51, imx53 and imx6q three clocks ("ahb",
> "ipg" and "per") must be enabled in order to access the USB core.

The imx6q usb's clock structure is different with old mxc serials (mx3x, mx5x)
due to different PHY. This patch will cause mx6q's probe fail, the message
like below:

imx_usb 2184000.usb: Failed to get clock, err=-2
imx_usb: probe of 2184000.usb failed with error -2

The mx5x (50, 51, 53) and mx6q's clock structure like below:

mx5x:
- usboh3_ipg_ahb: CCGR2(index13), used to access register
(like your ahb)
- usboh3_60M: CCGR2(index14), used to access register at serial phy mode
as the phy is at serial mode, we need to use it at the first before the phy
goes to other modes.
(like your ipg)
usbphy: used to transfer data
(like your per)

mx6q:
- usboh3(Index 162 at DT), used to access register
- usbphy(Index 182 for otg port at DT), at phy controller

So, we may consider a way to consolidate both mx6q (mx28) and mxc (mx5x, mx3x)
platforms.
> 
> ahb - AMBA High-Performance Bus clock domain
> ipg - IP-Bus Gate clock domain
> per - Peripheral clock domain
> 
> Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
> Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
> ---
> Changes since v1:
> * changed patch description
> 
>  drivers/usb/chipidea/usbmisc_imx.c |   60 +++++++++++++++++++++++++++---------
>  1 file changed, 45 insertions(+), 15 deletions(-)
> 
> diff --git a/drivers/usb/chipidea/usbmisc_imx.c b/drivers/usb/chipidea/usbmisc_imx.c
> index d0c7a03..e090e0f 100644
> --- a/drivers/usb/chipidea/usbmisc_imx.c
> +++ b/drivers/usb/chipidea/usbmisc_imx.c
> @@ -24,7 +24,9 @@
>  struct imx_usbmisc {
>  	void __iomem *base;
>  	spinlock_t lock;
> -	struct clk *clk;
> +	struct clk *clk_ahb;
> +	struct clk *clk_ipg;
> +	struct clk *clk_per;
>  	struct usbmisc_usb_device usbdev[USB_DEV_MAX];
>  	const struct usbmisc_ops *ops;
>  };
> @@ -104,38 +106,66 @@ static int __devinit usbmisc_imx_probe(struct platform_device *pdev)
>  	if (!data->base)
>  		return -EADDRNOTAVAIL;
>  
> -	data->clk = devm_clk_get(&pdev->dev, NULL);
> -	if (IS_ERR(data->clk)) {
> +	data->clk_ahb = devm_clk_get(&pdev->dev, "ahb");
> +	if (IS_ERR(data->clk_ahb)) {
>  		dev_err(&pdev->dev,
> -			"failed to get clock, err=%ld\n", PTR_ERR(data->clk));
> -		return PTR_ERR(data->clk);
> +			"failed to get ahb clock, err=%ld\n", PTR_ERR(data->clk_ahb));
> +		return PTR_ERR(data->clk_ahb);
>  	}
>  
> -	ret = clk_prepare_enable(data->clk);
> -	if (ret) {
> +	data->clk_ipg = devm_clk_get(&pdev->dev, "ipg");
> +	if (IS_ERR(data->clk_ipg)) {
>  		dev_err(&pdev->dev,
> -			"clk_prepare_enable failed, err=%d\n", ret);
> -		return ret;
> +			"failed to get ipg clock, err=%ld\n", PTR_ERR(data->clk_ipg));
> +		return PTR_ERR(data->clk_ipg);
>  	}
>  
> +	data->clk_per = devm_clk_get(&pdev->dev, "per");
> +	if (IS_ERR(data->clk_per)) {
> +		dev_err(&pdev->dev,
> +			"failed to get per clock, err=%ld\n", PTR_ERR(data->clk_per));
> +		return PTR_ERR(data->clk_per);
> +	}
> +
> +	ret = clk_prepare_enable(data->clk_ahb);
> +	if (ret)
> +		return ret;
> +
> +	ret = clk_prepare_enable(data->clk_ipg);
> +	if (ret)
> +		goto err_ipg_failed;
> +
> +	ret = clk_prepare_enable(data->clk_per);
> +	if (ret)
> +		goto err_per_failed;
> +
>  	tmp_dev = (struct of_device_id *)
>  		of_match_device(usbmisc_imx_dt_ids, &pdev->dev);
>  	data->ops = (const struct usbmisc_ops *)tmp_dev->data;
>  	usbmisc = data;
>  	ret = usbmisc_set_ops(data->ops);
> -	if (ret) {
> -		usbmisc = NULL;
> -		clk_disable_unprepare(data->clk);
> -		return ret;
> -	}
> +	if (ret)
> +		goto err_set_ops_failed;
>  
>  	return 0;
> +
> + err_set_ops_failed:
> +	usbmisc = NULL;
> +	clk_disable_unprepare(data->clk_per);
> + err_per_failed:
> +	clk_disable_unprepare(data->clk_ipg);
> + err_ipg_failed:
> +	clk_disable_unprepare(data->clk_ahb);
> +
> +	return ret;
>  }
>  
>  static int __devexit usbmisc_imx_remove(struct platform_device *pdev)
>  {
>  	usbmisc_unset_ops(usbmisc->ops);
> -	clk_disable_unprepare(usbmisc->clk);
> +	clk_disable_unprepare(usbmisc->clk_per);
> +	clk_disable_unprepare(usbmisc->clk_ipg);
> +	clk_disable_unprepare(usbmisc->clk_ahb);
>  	usbmisc = NULL;
>  	return 0;
>  }
> -- 
> 1.7.10.4
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-usb" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 

-- 

Best Regards,
Peter Chen

  reply	other threads:[~2012-11-23  6:51 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-11-21 14:06 [PATCH v3 0/7] support other fsl SoCs with usbmisc + small fixes Michael Grzeschik
2012-11-21 14:06 ` [PATCH v3 1/7] usb: chipidea: usbmisc: rename file, struct and functions to usbmisc_imx Michael Grzeschik
2012-11-21 14:06 ` [PATCH v3 2/7] usb: chipidea: usbmisc: unset global varibale usbmisc on driver remove Michael Grzeschik
2012-11-21 14:06 ` [PATCH v3 3/7] usb: chipidea: usbmisc: fix a potential race condition Michael Grzeschik
2012-11-23  5:36   ` Peter Chen
2012-11-23  7:37     ` Sascha Hauer
2012-11-23  9:01       ` Alexander Shishkin
2012-11-23 10:00     ` Marc Kleine-Budde
2012-11-21 14:06 ` [PATCH v3 4/7] usb: chipidea: usbmisc: prepare driver to handle more than one soc Michael Grzeschik
2012-11-21 14:06 ` [PATCH v3 5/7] usb: chipidea: usbmisc: add support for ahb, ipg and per clock Michael Grzeschik
2012-11-23  6:51   ` Peter Chen [this message]
2012-11-23 16:20     ` Michael Grzeschik
2012-11-25  9:18       ` Peter Chen
2012-11-26 15:44         ` Michael Grzeschik
2012-11-21 14:06 ` [PATCH v3 6/7] usb: chipidea: usbmisc: add mx53 support Michael Grzeschik
2012-11-21 20:28   ` Sergei Shtylyov
2012-11-21 19:58     ` Michael Grzeschik
2012-11-23  6:53   ` Peter Chen
2012-11-23  7:39     ` Sascha Hauer
2012-11-25  8:05       ` Peter Chen
2012-11-23 10:02     ` Marc Kleine-Budde
2012-11-25  8:09       ` Peter Chen
2012-11-26 15:40         ` Grant Likely
2012-11-21 14:06 ` [PATCH v3 7/7] usb: chipidea: usbmisc: add post handling and errata fix for mx25 Michael Grzeschik
2012-11-23  6:59   ` Peter Chen
2012-11-22  9:24 ` [PATCH v3 0/7] support other fsl SoCs with usbmisc + small fixes Alexander Shishkin
2012-11-22  9:31   ` Peter Chen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20121123065115.GC22420@nchen-desktop \
    --to=peter.chen@freescale.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).