Patchwork [1/2] mx27: add a clock gate to activate SPLL clock

login
register
mail settings
Submitter Gwenhael Goavec-Merou
Date Dec. 19, 2012, 6:29 p.m.
Message ID <1355941777-99352-1-git-send-email-gwenhael.goavec-merou@armadeus.com>
Download mbox | patch
Permalink /patch/207506/
State New
Headers show

Comments

Gwenhael Goavec-Merou - Dec. 19, 2012, 6:29 p.m.
A clock gate is mandatory to activate SPLL clock needed, at least, for usb.

Signed-off-by: Gwenhael Goavec-Merou <gwenhael.goavec-merou@armadeus.com>
---
 arch/arm/mach-imx/clk-imx27.c |    7 ++++---
 1 files changed, 4 insertions(+), 3 deletions(-)
Fabio Estevam - Dec. 19, 2012, 7:04 p.m.
On Wed, Dec 19, 2012 at 4:29 PM, Gwenhael Goavec-Merou
<gwenhael.goavec-merou@armadeus.com> wrote:
> EHCI PER clock (aka usb_div) must be enabled to have EHCI driver working.
>
> Signed-off-by: Gwenhael Goavec-Merou <gwenhael.goavec-merou@armadeus.com>

Have you considered to use the chipidea usb driver in mx27 instead?
mx28/mx6 are already converted to the chipidea usb driver.

Regards,

Fabio Estevm
Marek Vasut - Dec. 19, 2012, 7:45 p.m.
Dear Fabio Estevam,

> On Wed, Dec 19, 2012 at 4:29 PM, Gwenhael Goavec-Merou
> 
> <gwenhael.goavec-merou@armadeus.com> wrote:
> > EHCI PER clock (aka usb_div) must be enabled to have EHCI driver working.
> > 
> > Signed-off-by: Gwenhael Goavec-Merou <gwenhael.goavec-merou@armadeus.com>
> 
> Have you considered to use the chipidea usb driver in mx27 instead?
> mx28/mx6 are already converted to the chipidea usb driver.

True, we should kill ehci-mxc ASAP. On the other hand, I'm not opposed to 
applying these, just bear in mind the driver might just disappear.

Best regards,
Marek Vasut
Sascha Hauer - Dec. 19, 2012, 8:29 p.m.
On Wed, Dec 19, 2012 at 07:29:37PM +0100, Gwenhael Goavec-Merou wrote:
> EHCI PER clock (aka usb_div) must be enabled to have EHCI driver working.
> 
> Signed-off-by: Gwenhael Goavec-Merou <gwenhael.goavec-merou@armadeus.com>
> ---
>  drivers/usb/host/ehci-mxc.c |   12 +++++++++++-
>  1 files changed, 11 insertions(+), 1 deletions(-)
> 
> diff --git a/drivers/usb/host/ehci-mxc.c b/drivers/usb/host/ehci-mxc.c
> index ec7f5d2..8050631 100644
> --- a/drivers/usb/host/ehci-mxc.c
> +++ b/drivers/usb/host/ehci-mxc.c
> @@ -31,7 +31,7 @@
>  #define ULPI_VIEWPORT_OFFSET	0x170
>  
>  struct ehci_mxc_priv {
> -	struct clk *usbclk, *ahbclk, *phyclk;
> +	struct clk *usbclk, *ahbclk, *perclk, *phyclk;
>  	struct usb_hcd *hcd;
>  };
>  
> @@ -150,6 +150,13 @@ static int ehci_mxc_drv_probe(struct platform_device *pdev)
>  	}
>  	clk_prepare_enable(priv->ahbclk);
>  
> +	priv->perclk = devm_clk_get(&pdev->dev, "per");
> +	if (IS_ERR(priv->perclk)) {
> +		ret = PTR_ERR(priv->perclk);
> +		goto err_clk_per;
> +	}
> +	clk_prepare_enable(priv->perclk);

Have you checked this clock is present on all SoCs using this driver?

Other than that, +1 on using the chipidea driver as Fabio and Marek
already noted.

Sascha
Gwenhael Goavec-Merou - Jan. 8, 2013, 12:52 p.m.
On Wed, 19 Dec 2012 21:29:26 +0100
Sascha Hauer <s.hauer@pengutronix.de> wrote:

> On Wed, Dec 19, 2012 at 07:29:37PM +0100, Gwenhael Goavec-Merou wrote:
> > EHCI PER clock (aka usb_div) must be enabled to have EHCI driver working.
> > 
> > Signed-off-by: Gwenhael Goavec-Merou <gwenhael.goavec-merou@armadeus.com>
> > ---
> >  drivers/usb/host/ehci-mxc.c |   12 +++++++++++-
> >  1 files changed, 11 insertions(+), 1 deletions(-)
> > 
> > diff --git a/drivers/usb/host/ehci-mxc.c b/drivers/usb/host/ehci-mxc.c
> > index ec7f5d2..8050631 100644
> > --- a/drivers/usb/host/ehci-mxc.c
> > +++ b/drivers/usb/host/ehci-mxc.c
> > @@ -31,7 +31,7 @@
> >  #define ULPI_VIEWPORT_OFFSET	0x170
> >  
> >  struct ehci_mxc_priv {
> > -	struct clk *usbclk, *ahbclk, *phyclk;
> > +	struct clk *usbclk, *ahbclk, *perclk, *phyclk;
> >  	struct usb_hcd *hcd;
> >  };
> >  
> > @@ -150,6 +150,13 @@ static int ehci_mxc_drv_probe(struct platform_device *pdev)
> >  	}
> >  	clk_prepare_enable(priv->ahbclk);
> >  
> > +	priv->perclk = devm_clk_get(&pdev->dev, "per");
> > +	if (IS_ERR(priv->perclk)) {
> > +		ret = PTR_ERR(priv->perclk);
> > +		goto err_clk_per;
> > +	}
> > +	clk_prepare_enable(priv->perclk);
> 
> Have you checked this clock is present on all SoCs using this driver?
> 
Yes
>
> Other than that, +1 on using the chipidea driver as Fabio and Marek
> already noted.
>
True. But I need to use a non-dt board based on imx27. Chipidea is
not working yet for this chip and I have currently not enough time to do that.

Gwenhaƫl
Marek Vasut - Jan. 8, 2013, 1:01 p.m.
Dear gwenhael.goavec,

> On Wed, 19 Dec 2012 21:29:26 +0100
> 
> Sascha Hauer <s.hauer@pengutronix.de> wrote:
> > On Wed, Dec 19, 2012 at 07:29:37PM +0100, Gwenhael Goavec-Merou wrote:
> > > EHCI PER clock (aka usb_div) must be enabled to have EHCI driver
> > > working.
> > > 
> > > Signed-off-by: Gwenhael Goavec-Merou
> > > <gwenhael.goavec-merou@armadeus.com> ---
> > > 
> > >  drivers/usb/host/ehci-mxc.c |   12 +++++++++++-
> > >  1 files changed, 11 insertions(+), 1 deletions(-)
> > > 
> > > diff --git a/drivers/usb/host/ehci-mxc.c b/drivers/usb/host/ehci-mxc.c
> > > index ec7f5d2..8050631 100644
> > > --- a/drivers/usb/host/ehci-mxc.c
> > > +++ b/drivers/usb/host/ehci-mxc.c
> > > @@ -31,7 +31,7 @@
> > > 
> > >  #define ULPI_VIEWPORT_OFFSET	0x170
> > >  
> > >  struct ehci_mxc_priv {
> > > 
> > > -	struct clk *usbclk, *ahbclk, *phyclk;
> > > +	struct clk *usbclk, *ahbclk, *perclk, *phyclk;
> > > 
> > >  	struct usb_hcd *hcd;
> > >  
> > >  };
> > > 
> > > @@ -150,6 +150,13 @@ static int ehci_mxc_drv_probe(struct
> > > platform_device *pdev)
> > > 
> > >  	}
> > >  	clk_prepare_enable(priv->ahbclk);
> > > 
> > > +	priv->perclk = devm_clk_get(&pdev->dev, "per");
> > > +	if (IS_ERR(priv->perclk)) {
> > > +		ret = PTR_ERR(priv->perclk);
> > > +		goto err_clk_per;
> > > +	}
> > > +	clk_prepare_enable(priv->perclk);
> > 
> > Have you checked this clock is present on all SoCs using this driver?
> 
> Yes
> 
> > Other than that, +1 on using the chipidea driver as Fabio and Marek
> > already noted.
> 
> True. But I need to use a non-dt board based on imx27. Chipidea is
> not working yet for this chip and I have currently not enough time to do
> that.

You're on your own then, sorry :-(

Best regards,
Marek Vasut
Gwenhael Goavec-Merou - Jan. 8, 2013, 1:41 p.m.
On Tue, 8 Jan 2013 14:01:36 +0100
Marek Vasut <marex@denx.de> wrote:

> Dear gwenhael.goavec,
> 
> > On Wed, 19 Dec 2012 21:29:26 +0100
> > 
> > Sascha Hauer <s.hauer@pengutronix.de> wrote:
> > > On Wed, Dec 19, 2012 at 07:29:37PM +0100, Gwenhael Goavec-Merou wrote:
> > > > EHCI PER clock (aka usb_div) must be enabled to have EHCI driver
> > > > working.
> > > > 
> > > > Signed-off-by: Gwenhael Goavec-Merou
> > > > <gwenhael.goavec-merou@armadeus.com> ---
> > > > 
> > > >  drivers/usb/host/ehci-mxc.c |   12 +++++++++++-
> > > >  1 files changed, 11 insertions(+), 1 deletions(-)
> > > > 
> > > > diff --git a/drivers/usb/host/ehci-mxc.c b/drivers/usb/host/ehci-mxc.c
> > > > index ec7f5d2..8050631 100644
> > > > --- a/drivers/usb/host/ehci-mxc.c
> > > > +++ b/drivers/usb/host/ehci-mxc.c
> > > > @@ -31,7 +31,7 @@
> > > > 
> > > >  #define ULPI_VIEWPORT_OFFSET	0x170
> > > >  
> > > >  struct ehci_mxc_priv {
> > > > 
> > > > -	struct clk *usbclk, *ahbclk, *phyclk;
> > > > +	struct clk *usbclk, *ahbclk, *perclk, *phyclk;
> > > > 
> > > >  	struct usb_hcd *hcd;
> > > >  
> > > >  };
> > > > 
> > > > @@ -150,6 +150,13 @@ static int ehci_mxc_drv_probe(struct
> > > > platform_device *pdev)
> > > > 
> > > >  	}
> > > >  	clk_prepare_enable(priv->ahbclk);
> > > > 
> > > > +	priv->perclk = devm_clk_get(&pdev->dev, "per");
> > > > +	if (IS_ERR(priv->perclk)) {
> > > > +		ret = PTR_ERR(priv->perclk);
> > > > +		goto err_clk_per;
> > > > +	}
> > > > +	clk_prepare_enable(priv->perclk);
> > > 
> > > Have you checked this clock is present on all SoCs using this driver?
> > 
> > Yes
> > 
> > > Other than that, +1 on using the chipidea driver as Fabio and Marek
> > > already noted.
> > 
> > True. But I need to use a non-dt board based on imx27. Chipidea is
> > not working yet for this chip and I have currently not enough time to do
> > that.
> 
> You're on your own then, sorry :-(
> 
Yes i Know. But currently all i.MX27 based board without DT support have USB
not working.
Gwenhael

Patch

diff --git a/arch/arm/mach-imx/clk-imx27.c b/arch/arm/mach-imx/clk-imx27.c
index 4c1d1e4..4f066d13 100644
--- a/arch/arm/mach-imx/clk-imx27.c
+++ b/arch/arm/mach-imx/clk-imx27.c
@@ -62,7 +62,7 @@  static const char *clko_sel_clks[] = {
 	"32k", "usb_div", "dptc",
 };
 
-static const char *ssi_sel_clks[] = { "spll", "mpll", };
+static const char *ssi_sel_clks[] = { "spll_gate", "mpll", };
 
 enum mx27_clks {
 	dummy, ckih, ckil, mpll, spll, mpll_main2, ahb, ipg, nfc_div, per1_div,
@@ -82,7 +82,7 @@  enum mx27_clks {
 	csi_ahb_gate, brom_ahb_gate, ata_ahb_gate, wdog_ipg_gate, usb_ipg_gate,
 	uart6_ipg_gate, uart5_ipg_gate, uart4_ipg_gate, uart3_ipg_gate,
 	uart2_ipg_gate, uart1_ipg_gate, ckih_div1p5, fpm, mpll_osc_sel,
-	mpll_sel, clk_max
+	mpll_sel, spll_gate, clk_max
 };
 
 static struct clk *clk[clk_max];
@@ -104,6 +104,7 @@  int __init mx27_clocks_init(unsigned long fref)
 			ARRAY_SIZE(mpll_sel_clks));
 	clk[mpll] = imx_clk_pllv1("mpll", "mpll_sel", CCM_MPCTL0);
 	clk[spll] = imx_clk_pllv1("spll", "ckih", CCM_SPCTL0);
+	clk[spll_gate] = imx_clk_gate("spll_gate", "spll", CCM_CSCR, 1);
 	clk[mpll_main2] = imx_clk_fixed_factor("mpll_main2", "mpll", 2, 3);
 
 	if (mx27_revision() >= IMX_CHIP_REVISION_2_0) {
@@ -121,7 +122,7 @@  int __init mx27_clocks_init(unsigned long fref)
 	clk[per4_div] = imx_clk_divider("per4_div", "mpll_main2", CCM_PCDR1, 24, 6);
 	clk[vpu_sel] = imx_clk_mux("vpu_sel", CCM_CSCR, 21, 1, vpu_sel_clks, ARRAY_SIZE(vpu_sel_clks));
 	clk[vpu_div] = imx_clk_divider("vpu_div", "vpu_sel", CCM_PCDR0, 10, 6);
-	clk[usb_div] = imx_clk_divider("usb_div", "spll", CCM_CSCR, 28, 3);
+	clk[usb_div] = imx_clk_divider("usb_div", "spll_gate", CCM_CSCR, 28, 3);
 	clk[cpu_sel] = imx_clk_mux("cpu_sel", CCM_CSCR, 15, 1, cpu_sel_clks, ARRAY_SIZE(cpu_sel_clks));
 	clk[clko_sel] = imx_clk_mux("clko_sel", CCM_CCSR, 0, 5, clko_sel_clks, ARRAY_SIZE(clko_sel_clks));
 	if (mx27_revision() >= IMX_CHIP_REVISION_2_0)