drm/omap: dss: Get regulators at probe time
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> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
This commit is contained in:
parent
a48bc6ac2c
commit
8a36357ae3
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -252,35 +252,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;
|
||||
|
@ -379,6 +355,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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue