Hi, On Sat, May 26, 2018 at 08:25:05PM +0300, Laurent Pinchart wrote: > Regulators for the DPI, DSI, HDMI, SDI and VENC outputs are all looked > up when connecting the output omap_dss_device. There's no need to delay > regulator handling to that time, get the regulators at probe time. > > Signed-off-by: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx> > --- Reviewed-by: Sebastian Reichel <sebastian.reichel@xxxxxxxxxxxxxxx> -- Sebastian > drivers/gpu/drm/omapdrm/dss/dpi.c | 69 ++++++++++++++++++------------------- > drivers/gpu/drm/omapdrm/dss/dsi.c | 36 ++++--------------- > drivers/gpu/drm/omapdrm/dss/hdmi4.c | 33 +++++------------- > drivers/gpu/drm/omapdrm/dss/hdmi5.c | 31 +++++------------ > drivers/gpu/drm/omapdrm/dss/sdi.c | 32 +++++------------ > drivers/gpu/drm/omapdrm/dss/venc.c | 32 +++++------------ > 6 files changed, 72 insertions(+), 161 deletions(-) > > diff --git a/drivers/gpu/drm/omapdrm/dss/dpi.c b/drivers/gpu/drm/omapdrm/dss/dpi.c > index 68c8424a460d..4557357e4130 100644 > --- a/drivers/gpu/drm/omapdrm/dss/dpi.c > +++ b/drivers/gpu/drm/omapdrm/dss/dpi.c > @@ -551,38 +551,6 @@ static int dpi_verify_pll(struct dss_pll *pll) > return 0; > } > > -static const struct soc_device_attribute dpi_soc_devices[] = { > - { .machine = "OMAP3[456]*" }, > - { .machine = "[AD]M37*" }, > - { /* sentinel */ } > -}; > - > -static int dpi_init_regulator(struct dpi_data *dpi) > -{ > - struct regulator *vdds_dsi; > - > - /* > - * The DPI uses the DSI VDDS on OMAP34xx, OMAP35xx, OMAP36xx, AM37xx and > - * DM37xx only. > - */ > - if (!soc_device_match(dpi_soc_devices)) > - return 0; > - > - if (dpi->vdds_dsi_reg) > - return 0; > - > - vdds_dsi = devm_regulator_get(&dpi->pdev->dev, "vdds_dsi"); > - if (IS_ERR(vdds_dsi)) { > - if (PTR_ERR(vdds_dsi) != -EPROBE_DEFER) > - DSSERR("can't get VDDS_DSI regulator\n"); > - return PTR_ERR(vdds_dsi); > - } > - > - dpi->vdds_dsi_reg = vdds_dsi; > - > - return 0; > -} > - > static void dpi_init_pll(struct dpi_data *dpi) > { > struct dss_pll *pll; > @@ -646,10 +614,6 @@ static int dpi_connect(struct omap_dss_device *dssdev, > struct dpi_data *dpi = dpi_get_data_from_dssdev(dssdev); > int r; > > - r = dpi_init_regulator(dpi); > - if (r) > - return r; > - > dpi_init_pll(dpi); > > r = dss_mgr_connect(dssdev); > @@ -737,6 +701,35 @@ static void dpi_uninit_output_port(struct device_node *port) > omapdss_device_unregister(out); > } > > +static const struct soc_device_attribute dpi_soc_devices[] = { > + { .machine = "OMAP3[456]*" }, > + { .machine = "[AD]M37*" }, > + { /* sentinel */ } > +}; > + > +static int dpi_init_regulator(struct dpi_data *dpi) > +{ > + struct regulator *vdds_dsi; > + > + /* > + * The DPI uses the DSI VDDS on OMAP34xx, OMAP35xx, OMAP36xx, AM37xx and > + * DM37xx only. > + */ > + if (!soc_device_match(dpi_soc_devices)) > + return 0; > + > + vdds_dsi = devm_regulator_get(&dpi->pdev->dev, "vdds_dsi"); > + if (IS_ERR(vdds_dsi)) { > + if (PTR_ERR(vdds_dsi) != -EPROBE_DEFER) > + DSSERR("can't get VDDS_DSI regulator\n"); > + return PTR_ERR(vdds_dsi); > + } > + > + dpi->vdds_dsi_reg = vdds_dsi; > + > + return 0; > +} > + > int dpi_init_port(struct dss_device *dss, struct platform_device *pdev, > struct device_node *port, enum dss_model dss_model) > { > @@ -769,6 +762,10 @@ int dpi_init_port(struct dss_device *dss, struct platform_device *pdev, > > mutex_init(&dpi->lock); > > + r = dpi_init_regulator(dpi); > + if (r) > + return r; > + > return dpi_init_output_port(dpi, port); > } > > diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c > index 2c2570e1ef2f..6718c7f04423 100644 > --- a/drivers/gpu/drm/omapdrm/dss/dsi.c > +++ b/drivers/gpu/drm/omapdrm/dss/dsi.c > @@ -1137,26 +1137,6 @@ static void dsi_runtime_put(struct dsi_data *dsi) > WARN_ON(r < 0 && r != -ENOSYS); > } > > -static int dsi_regulator_init(struct dsi_data *dsi) > -{ > - struct regulator *vdds_dsi; > - > - if (dsi->vdds_dsi_reg != NULL) > - return 0; > - > - vdds_dsi = devm_regulator_get(dsi->dev, "vdd"); > - > - if (IS_ERR(vdds_dsi)) { > - if (PTR_ERR(vdds_dsi) != -EPROBE_DEFER) > - DSSERR("can't get DSI VDD regulator\n"); > - return PTR_ERR(vdds_dsi); > - } > - > - dsi->vdds_dsi_reg = vdds_dsi; > - > - return 0; > -} > - > static void _dsi_print_reset_status(struct dsi_data *dsi) > { > u32 l; > @@ -1353,10 +1333,6 @@ static int dsi_pll_enable(struct dss_pll *pll) > > DSSDBG("PLL init\n"); > > - r = dsi_regulator_init(dsi); > - if (r) > - return r; > - > r = dsi_runtime_get(dsi); > if (r) > return r; > @@ -4908,13 +4884,8 @@ static int dsi_get_clocks(struct dsi_data *dsi) > static int dsi_connect(struct omap_dss_device *dssdev, > struct omap_dss_device *dst) > { > - struct dsi_data *dsi = to_dsi_data(dssdev); > int r; > > - r = dsi_regulator_init(dsi); > - if (r) > - return r; > - > r = dss_mgr_connect(dssdev); > if (r) > return r; > @@ -5384,6 +5355,13 @@ static int dsi_probe(struct platform_device *pdev) > return r; > } > > + dsi->vdds_dsi_reg = devm_regulator_get(dev, "vdd"); > + if (IS_ERR(dsi->vdds_dsi_reg)) { > + if (PTR_ERR(dsi->vdds_dsi_reg) != -EPROBE_DEFER) > + DSSERR("can't get DSI VDD regulator\n"); > + return PTR_ERR(dsi->vdds_dsi_reg); > + } > + > soc = soc_device_match(dsi_soc_devices); > if (soc) > dsi->data = soc->data; > diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi4.c b/drivers/gpu/drm/omapdrm/dss/hdmi4.c > index 5216c5554741..6edb85898a7d 100644 > --- a/drivers/gpu/drm/omapdrm/dss/hdmi4.c > +++ b/drivers/gpu/drm/omapdrm/dss/hdmi4.c > @@ -108,26 +108,6 @@ static irqreturn_t hdmi_irq_handler(int irq, void *data) > return IRQ_HANDLED; > } > > -static int hdmi_init_regulator(struct omap_hdmi *hdmi) > -{ > - struct regulator *reg; > - > - if (hdmi->vdda_reg != NULL) > - return 0; > - > - reg = devm_regulator_get(&hdmi->pdev->dev, "vdda"); > - > - if (IS_ERR(reg)) { > - if (PTR_ERR(reg) != -EPROBE_DEFER) > - DSSERR("can't get VDDA regulator\n"); > - return PTR_ERR(reg); > - } > - > - hdmi->vdda_reg = reg; > - > - return 0; > -} > - > static int hdmi_power_on_core(struct omap_hdmi *hdmi) > { > int r; > @@ -451,13 +431,8 @@ void hdmi4_core_disable(struct hdmi_core_data *core) > static int hdmi_connect(struct omap_dss_device *dssdev, > struct omap_dss_device *dst) > { > - struct omap_hdmi *hdmi = dssdev_to_hdmi(dssdev); > int r; > > - r = hdmi_init_regulator(hdmi); > - if (r) > - return r; > - > r = dss_mgr_connect(dssdev); > if (r) > return r; > @@ -827,6 +802,14 @@ static int hdmi4_probe(struct platform_device *pdev) > goto err_free; > } > > + hdmi->vdda_reg = devm_regulator_get(&pdev->dev, "vdda"); > + if (IS_ERR(hdmi->vdda_reg)) { > + r = PTR_ERR(hdmi->vdda_reg); > + if (r != -EPROBE_DEFER) > + DSSERR("can't get VDDA regulator\n"); > + goto err_free; > + } > + > pm_runtime_enable(&pdev->dev); > > r = hdmi4_init_output(hdmi); > diff --git a/drivers/gpu/drm/omapdrm/dss/hdmi5.c b/drivers/gpu/drm/omapdrm/dss/hdmi5.c > index 363bc5843e0f..db20a578091b 100644 > --- a/drivers/gpu/drm/omapdrm/dss/hdmi5.c > +++ b/drivers/gpu/drm/omapdrm/dss/hdmi5.c > @@ -117,24 +117,6 @@ static irqreturn_t hdmi_irq_handler(int irq, void *data) > return IRQ_HANDLED; > } > > -static int hdmi_init_regulator(struct omap_hdmi *hdmi) > -{ > - struct regulator *reg; > - > - if (hdmi->vdda_reg != NULL) > - return 0; > - > - reg = devm_regulator_get(&hdmi->pdev->dev, "vdda"); > - if (IS_ERR(reg)) { > - DSSERR("can't get VDDA regulator\n"); > - return PTR_ERR(reg); > - } > - > - hdmi->vdda_reg = reg; > - > - return 0; > -} > - > static int hdmi_power_on_core(struct omap_hdmi *hdmi) > { > int r; > @@ -454,13 +436,8 @@ static void hdmi_core_disable(struct omap_hdmi *hdmi) > static int hdmi_connect(struct omap_dss_device *dssdev, > struct omap_dss_device *dst) > { > - struct omap_hdmi *hdmi = dssdev_to_hdmi(dssdev); > int r; > > - r = hdmi_init_regulator(hdmi); > - if (r) > - return r; > - > r = dss_mgr_connect(dssdev); > if (r) > return r; > @@ -817,6 +794,14 @@ static int hdmi5_probe(struct platform_device *pdev) > goto err_free; > } > > + hdmi->vdda_reg = devm_regulator_get(&pdev->dev, "vdda"); > + if (IS_ERR(hdmi->vdda_reg)) { > + r = PTR_ERR(hdmi->vdda_reg); > + if (r != -EPROBE_DEFER) > + DSSERR("can't get VDDA regulator\n"); > + goto err_free; > + } > + > pm_runtime_enable(&pdev->dev); > > r = hdmi5_init_output(hdmi); > diff --git a/drivers/gpu/drm/omapdrm/dss/sdi.c b/drivers/gpu/drm/omapdrm/dss/sdi.c > index bbfd4ba3255c..1766c95236da 100644 > --- a/drivers/gpu/drm/omapdrm/dss/sdi.c > +++ b/drivers/gpu/drm/omapdrm/dss/sdi.c > @@ -249,35 +249,11 @@ static int sdi_check_timings(struct omap_dss_device *dssdev, > return 0; > } > > -static int sdi_init_regulator(struct sdi_device *sdi) > -{ > - struct regulator *vdds_sdi; > - > - if (sdi->vdds_sdi_reg) > - return 0; > - > - vdds_sdi = devm_regulator_get(&sdi->pdev->dev, "vdds_sdi"); > - if (IS_ERR(vdds_sdi)) { > - if (PTR_ERR(vdds_sdi) != -EPROBE_DEFER) > - DSSERR("can't get VDDS_SDI regulator\n"); > - return PTR_ERR(vdds_sdi); > - } > - > - sdi->vdds_sdi_reg = vdds_sdi; > - > - return 0; > -} > - > static int sdi_connect(struct omap_dss_device *dssdev, > struct omap_dss_device *dst) > { > - struct sdi_device *sdi = dssdev_to_sdi(dssdev); > int r; > > - r = sdi_init_regulator(sdi); > - if (r) > - return r; > - > r = dss_mgr_connect(dssdev); > if (r) > return r; > @@ -376,6 +352,14 @@ int sdi_init_port(struct dss_device *dss, struct platform_device *pdev, > sdi->pdev = pdev; > port->data = sdi; > > + sdi->vdds_sdi_reg = devm_regulator_get(&pdev->dev, "vdds_sdi"); > + if (IS_ERR(sdi->vdds_sdi_reg)) { > + r = PTR_ERR(sdi->vdds_sdi_reg); > + if (r != -EPROBE_DEFER) > + DSSERR("can't get VDDS_SDI regulator\n"); > + goto err_free; > + } > + > r = sdi_init_output(sdi); > if (r) > goto err_free; > diff --git a/drivers/gpu/drm/omapdrm/dss/venc.c b/drivers/gpu/drm/omapdrm/dss/venc.c > index db055260f50e..9c1fe6aef074 100644 > --- a/drivers/gpu/drm/omapdrm/dss/venc.c > +++ b/drivers/gpu/drm/omapdrm/dss/venc.c > @@ -614,25 +614,6 @@ static int venc_check_timings(struct omap_dss_device *dssdev, > } > } > > -static int venc_init_regulator(struct venc_device *venc) > -{ > - struct regulator *vdda_dac; > - > - if (venc->vdda_dac_reg != NULL) > - return 0; > - > - vdda_dac = devm_regulator_get(&venc->pdev->dev, "vdda"); > - if (IS_ERR(vdda_dac)) { > - if (PTR_ERR(vdda_dac) != -EPROBE_DEFER) > - DSSERR("can't get VDDA_DAC regulator\n"); > - return PTR_ERR(vdda_dac); > - } > - > - venc->vdda_dac_reg = vdda_dac; > - > - return 0; > -} > - > static int venc_dump_regs(struct seq_file *s, void *p) > { > struct venc_device *venc = s->private; > @@ -713,13 +694,8 @@ static int venc_get_clocks(struct venc_device *venc) > static int venc_connect(struct omap_dss_device *dssdev, > struct omap_dss_device *dst) > { > - struct venc_device *venc = dssdev_to_venc(dssdev); > int r; > > - r = venc_init_regulator(venc); > - if (r) > - return r; > - > r = dss_mgr_connect(dssdev); > if (r) > return r; > @@ -908,6 +884,14 @@ static int venc_probe(struct platform_device *pdev) > goto err_free; > } > > + venc->vdda_dac_reg = devm_regulator_get(&pdev->dev, "vdda"); > + if (IS_ERR(venc->vdda_dac_reg)) { > + r = PTR_ERR(venc->vdda_dac_reg); > + if (r != -EPROBE_DEFER) > + DSSERR("can't get VDDA_DAC regulator\n"); > + goto err_free; > + } > + > r = venc_get_clocks(venc); > if (r) > goto err_free; > -- > Regards, > > Laurent Pinchart > > _______________________________________________ > dri-devel mailing list > dri-devel@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/dri-devel
Attachment:
signature.asc
Description: PGP signature
_______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel