Re: [PATCH] OMAP: DSS2: Delay regulator_get() calls

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

 



Tomi,

Thanks for this real fix instead of the patch came from us for the
regulator issue.
I think this is the right way to fix the root cause.

Mathieu and Richardo, I believe this patch can replace our local patches.

-Bryan

On Wed, Feb 23, 2011 at 9:08 PM, Tomi Valkeinen <tomi.valkeinen@xxxxxx> wrote:
> DSS submodules DPI/SDI/DSI/VENC require a regulator to function.
> However, if the board doesn't use, say, SDI, the board shouldn't need to
> configure vdds_sdi regulator required by the SDI module.
>
> Currently the regulators are acquired when the DSS driver is loaded.
> This means that if the kernel is configured with SDI, vdds_sdi regulator
> is needed for all boards.
>
> This patch changes the DSS driver to acquire the regulators only when a
> display of particular type is initialized. For example, vdds_sdi is
> acquired when sdi_init_display() is called.
>
> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@xxxxxx>
> ---
>  drivers/video/omap2/dss/dpi.c  |   21 +++++++++++++--------
>  drivers/video/omap2/dss/dsi.c  |   36 +++++++++++++-----------------------
>  drivers/video/omap2/dss/sdi.c  |   18 +++++++++++++-----
>  drivers/video/omap2/dss/venc.c |   31 +++++++++++++------------------
>  4 files changed, 52 insertions(+), 54 deletions(-)
>
> diff --git a/drivers/video/omap2/dss/dpi.c b/drivers/video/omap2/dss/dpi.c
> index 746f1b6..026702b 100644
> --- a/drivers/video/omap2/dss/dpi.c
> +++ b/drivers/video/omap2/dss/dpi.c
> @@ -303,22 +303,27 @@ int dpi_init_display(struct omap_dss_device *dssdev)
>  {
>        DSSDBG("init_display\n");
>
> -       return 0;
> -}
> +       if (cpu_is_omap34xx() && dpi.vdds_dsi_reg == NULL) {
> +               struct regulator *vdds_dsi;
>
> -int dpi_init(struct platform_device *pdev)
> -{
> -       if (cpu_is_omap34xx()) {
> -               dpi.vdds_dsi_reg = dss_get_vdds_dsi();
> -               if (IS_ERR(dpi.vdds_dsi_reg)) {
> +               vdds_dsi = dss_get_vdds_dsi();
> +
> +               if (IS_ERR(vdds_dsi)) {
>                        DSSERR("can't get VDDS_DSI regulator\n");
> -                       return PTR_ERR(dpi.vdds_dsi_reg);
> +                       return PTR_ERR(vdds_dsi);
>                }
> +
> +               dpi.vdds_dsi_reg = vdds_dsi;
>        }
>
>        return 0;
>  }
>
> +int dpi_init(struct platform_device *pdev)
> +{
> +       return 0;
> +}
> +
>  void dpi_exit(void)
>  {
>  }
> diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
> index e189e45..0207065 100644
> --- a/drivers/video/omap2/dss/dsi.c
> +++ b/drivers/video/omap2/dss/dsi.c
> @@ -291,20 +291,6 @@ static inline u32 dsi_read_reg(const struct dsi_reg idx)
>        return __raw_readl(dsi.base + idx.idx);
>  }
>
> -static struct regulator *dsi_get_vdds_dsi(void)
> -{
> -       struct regulator *reg;
> -
> -       if (dsi.vdds_dsi_reg != NULL)
> -               return dsi.vdds_dsi_reg;
> -
> -       reg = regulator_get(&dsi.pdev->dev, "vdds_dsi");
> -       if (!IS_ERR(reg))
> -               dsi.vdds_dsi_reg = reg;
> -
> -       return reg;
> -}
> -
>
>  void dsi_save_context(void)
>  {
> @@ -3236,6 +3222,19 @@ int dsi_init_display(struct omap_dss_device *dssdev)
>        dsi.vc[0].dssdev = dssdev;
>        dsi.vc[1].dssdev = dssdev;
>
> +       if (dsi.vdds_dsi_reg == NULL) {
> +               struct regulator *vdds_dsi;
> +
> +               vdds_dsi = regulator_get(&dsi.pdev->dev, "vdds_dsi");
> +
> +               if (IS_ERR(vdds_dsi)) {
> +                       DSSERR("can't get VDDS_DSI regulator\n");
> +                       return PTR_ERR(vdds_dsi);
> +               }
> +
> +               dsi.vdds_dsi_reg = vdds_dsi;
> +       }
> +
>        return 0;
>  }
>
> @@ -3295,13 +3294,6 @@ static int dsi_init(struct platform_device *pdev)
>                goto err1;
>        }
>
> -       dsi.vdds_dsi_reg = dsi_get_vdds_dsi();
> -       if (IS_ERR(dsi.vdds_dsi_reg)) {
> -               DSSERR("can't get VDDS_DSI regulator\n");
> -               r = PTR_ERR(dsi.vdds_dsi_reg);
> -               goto err2;
> -       }
> -
>        enable_clocks(1);
>
>        rev = dsi_read_reg(DSI_REVISION);
> @@ -3311,8 +3303,6 @@ static int dsi_init(struct platform_device *pdev)
>        enable_clocks(0);
>
>        return 0;
> -err2:
> -       iounmap(dsi.base);
>  err1:
>        destroy_workqueue(dsi.workqueue);
>        return r;
> diff --git a/drivers/video/omap2/dss/sdi.c b/drivers/video/omap2/dss/sdi.c
> index 8272fc1..9f10a0d 100644
> --- a/drivers/video/omap2/dss/sdi.c
> +++ b/drivers/video/omap2/dss/sdi.c
> @@ -157,6 +157,19 @@ int sdi_init_display(struct omap_dss_device *dssdev)
>  {
>        DSSDBG("SDI init\n");
>
> +       if (sdi.vdds_sdi_reg == NULL) {
> +               struct regulator *vdds_sdi;
> +
> +               vdds_sdi = dss_get_vdds_sdi();
> +
> +               if (IS_ERR(vdds_sdi)) {
> +                       DSSERR("can't get VDDS_SDI regulator\n");
> +                       return PTR_ERR(vdds_sdi);
> +               }
> +
> +               sdi.vdds_sdi_reg = vdds_sdi;
> +       }
> +
>        return 0;
>  }
>
> @@ -165,11 +178,6 @@ int sdi_init(bool skip_init)
>        /* we store this for first display enable, then clear it */
>        sdi.skip_init = skip_init;
>
> -       sdi.vdds_sdi_reg = dss_get_vdds_sdi();
> -       if (IS_ERR(sdi.vdds_sdi_reg)) {
> -               DSSERR("can't get VDDS_SDI regulator\n");
> -               return PTR_ERR(sdi.vdds_sdi_reg);
> -       }
>        /*
>         * Enable clocks already here, otherwise there would be a toggle
>         * of them until sdi_display_enable is called.
> diff --git a/drivers/video/omap2/dss/venc.c b/drivers/video/omap2/dss/venc.c
> index 2adae12..9cfcc36 100644
> --- a/drivers/video/omap2/dss/venc.c
> +++ b/drivers/video/omap2/dss/venc.c
> @@ -305,17 +305,6 @@ static inline u32 venc_read_reg(int idx)
>        return l;
>  }
>
> -static struct regulator *venc_get_vdda_dac(void)
> -{
> -       struct regulator *reg;
> -
> -       reg = regulator_get(&venc.pdev->dev, "vdda_dac");
> -       if (!IS_ERR(reg))
> -               venc.vdda_dac_reg = reg;
> -
> -       return reg;
> -}
> -
>  static void venc_write_config(const struct venc_config *config)
>  {
>        DSSDBG("write venc conf\n");
> @@ -655,6 +644,19 @@ int venc_init_display(struct omap_dss_device *dssdev)
>  {
>        DSSDBG("init_display\n");
>
> +       if (venc.vdda_dac_reg == NULL) {
> +               struct regulator *vdda_dac;
> +
> +               vdda_dac = regulator_get(&venc.pdev->dev, "vdda_dac");
> +
> +               if (IS_ERR(vdda_dac)) {
> +                       DSSERR("can't get VDDA_DAC regulator\n");
> +                       return PTR_ERR(vdda_dac);
> +               }
> +
> +               venc.vdda_dac_reg = vdda_dac;
> +       }
> +
>        return 0;
>  }
>
> @@ -734,13 +736,6 @@ static int omap_venchw_probe(struct platform_device *pdev)
>                return -ENOMEM;
>        }
>
> -       venc.vdda_dac_reg = venc_get_vdda_dac();
> -       if (IS_ERR(venc.vdda_dac_reg)) {
> -               iounmap(venc.base);
> -               DSSERR("can't get VDDA_DAC regulator\n");
> -               return PTR_ERR(venc.vdda_dac_reg);
> -       }
> -
>        venc_enable_clocks(1);
>
>        rev_id = (u8)(venc_read_reg(VENC_REV_ID) & 0xff);
> --
> 1.7.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>



-- 
Bryan Wu <bryan.wu@xxxxxxxxxxxxx>
Kernel Developer    +86.138-1617-6545 Mobile
Ubuntu Kernel Team
Canonical Ltd.      www.canonical.com
Ubuntu - Linux for human beings | www.ubuntu.com
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[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