[PATCH v2 47/60] drm/omap: dss: Get regulators at probe time

Sebastian Reichel sre at kernel.org
Sun Jun 10 23:58:01 UTC 2018


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 at ideasonboard.com>
> ---

Reviewed-by: Sebastian Reichel <sebastian.reichel at 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 at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20180611/3f1ef55f/attachment.sig>


More information about the dri-devel mailing list