sh: sh_mobile lcdc clock framework support
authorMagnus Damm <damm@igel.co.jp>
Fri, 31 Oct 2008 11:23:26 +0000 (20:23 +0900)
committerPaul Mundt <lethal@linux-sh.org>
Mon, 22 Dec 2008 09:42:52 +0000 (18:42 +0900)
Add clock framework support to the lcdc driver and
adjust the board specific code accordingly.

Signed-off-by: Magnus Damm <damm@igel.co.jp>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
arch/sh/boards/board-ap325rxa.c
arch/sh/boards/mach-migor/setup.c
drivers/video/sh_mobile_lcdcfb.c

index 0afaebad7b7631c0c3a466f7b732a8c99f50878d..cc3540423614c932e494cc74e0d4dbc9dd5f1fe5 100644 (file)
@@ -345,7 +345,6 @@ static int __init ap325rxa_devices_setup(void)
        gpio_export(GPIO_PTF7, 0);
 
        /* LCDC */
-       clk_always_enable("mstp200");
        gpio_request(GPIO_FN_LCDD15, NULL);
        gpio_request(GPIO_FN_LCDD14, NULL);
        gpio_request(GPIO_FN_LCDD13, NULL);
index 3684f198cfdfa7e5e489e529c4d16f85d5ad59cd..03d2dea05dabe977e131de2434569e420f6407cf 100644 (file)
@@ -502,7 +502,6 @@ static int __init migor_devices_setup(void)
        gpio_request(GPIO_FN_IRQ6, NULL);
 
        /* LCD Panel */
-       clk_always_enable("mstp200"); /* LCDC */
 #ifdef CONFIG_SH_MIGOR_QVGA /* LCDC - QVGA - Enable SYS Interface signals */
        gpio_request(GPIO_FN_LCDD17, NULL);
        gpio_request(GPIO_FN_LCDD16, NULL);
index efff672fd7b8e580657440f6bb84744ae05ef1bf..c81ee00c54d7956acd7c97848f7dddd0c2f3512e 100644 (file)
@@ -35,6 +35,7 @@ struct sh_mobile_lcdc_chan {
 struct sh_mobile_lcdc_priv {
        void __iomem *base;
 #ifdef CONFIG_HAVE_CLK
+       struct clk *dot_clk;
        struct clk *clk;
 #endif
        unsigned long lddckr;
@@ -207,6 +208,11 @@ static int sh_mobile_lcdc_start(struct sh_mobile_lcdc_priv *priv)
        int k, m;
        int ret = 0;
 
+#ifdef CONFIG_HAVE_CLK
+       clk_enable(priv->clk);
+       if (priv->dot_clk)
+               clk_enable(priv->dot_clk);
+#endif
        /* reset */
        lcdc_write(priv, _LDCNT2R, lcdc_read(priv, _LDCNT2R) | LCDC_RESET);
        lcdc_wait_bit(priv, _LDCNT2R, LCDC_RESET, 0);
@@ -371,6 +377,12 @@ static void sh_mobile_lcdc_stop(struct sh_mobile_lcdc_priv *priv)
 
        /* stop the lcdc */
        sh_mobile_lcdc_start_stop(priv, 0);
+
+#ifdef CONFIG_HAVE_CLK
+       if (priv->dot_clk)
+               clk_disable(priv->dot_clk);
+       clk_disable(priv->clk);
+#endif
 }
 
 static int sh_mobile_lcdc_check_interface(struct sh_mobile_lcdc_chan *ch)
@@ -413,9 +425,13 @@ static int sh_mobile_lcdc_check_interface(struct sh_mobile_lcdc_chan *ch)
        return -EINVAL;
 }
 
-static int sh_mobile_lcdc_setup_clocks(struct device *dev, int clock_source,
+static int sh_mobile_lcdc_setup_clocks(struct platform_device *pdev,
+                                      int clock_source,
                                       struct sh_mobile_lcdc_priv *priv)
 {
+#ifdef CONFIG_HAVE_CLK
+       char clk_name[8];
+#endif
        char *str;
        int icksel;
 
@@ -430,14 +446,20 @@ static int sh_mobile_lcdc_setup_clocks(struct device *dev, int clock_source,
        priv->lddckr = icksel << 16;
 
 #ifdef CONFIG_HAVE_CLK
+       snprintf(clk_name, sizeof(clk_name), "lcdc%d", pdev->id);
+       priv->clk = clk_get(&pdev->dev, clk_name);
+       if (IS_ERR(priv->clk)) {
+               dev_err(&pdev->dev, "cannot get clock \"%s\"\n", clk_name);
+               return PTR_ERR(priv->clk);
+       }
+       
        if (str) {
-               priv->clk = clk_get(dev, str);
-               if (IS_ERR(priv->clk)) {
-                       dev_err(dev, "cannot get clock %s\n", str);
-                       return PTR_ERR(priv->clk);
+               priv->dot_clk = clk_get(&pdev->dev, str);
+               if (IS_ERR(priv->dot_clk)) {
+                       dev_err(&pdev->dev, "cannot get dot clock %s\n", str);
+                       clk_put(priv->clk);
+                       return PTR_ERR(priv->dot_clk);
                }
-
-               clk_enable(priv->clk);
        }
 #endif
 
@@ -587,8 +609,7 @@ static int __init sh_mobile_lcdc_probe(struct platform_device *pdev)
                goto err1;
        }
 
-       error = sh_mobile_lcdc_setup_clocks(&pdev->dev,
-                                           pdata->clock_source, priv);
+       error = sh_mobile_lcdc_setup_clocks(pdev, pdata->clock_source, priv);
        if (error) {
                dev_err(&pdev->dev, "unable to setup clocks\n");
                goto err1;
@@ -697,10 +718,9 @@ static int sh_mobile_lcdc_remove(struct platform_device *pdev)
        }
 
 #ifdef CONFIG_HAVE_CLK
-       if (priv->clk) {
-               clk_disable(priv->clk);
-               clk_put(priv->clk);
-       }
+       if (priv->dot_clk)
+               clk_put(priv->dot_clk);
+       clk_put(priv->clk);
 #endif
 
        if (priv->base)