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@ideasonboard.com
Reviewed-by: Sebastian Reichel sebastian.reichel@collabora.co.uk
-- 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@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel