diff options
| -rw-r--r-- | drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c b/drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c index d67e1230b70c..5263b2b8f1ca 100644 --- a/drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c +++ b/drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c @@ -18,6 +18,7 @@ #include <linux/of_graph.h> #include <linux/platform_device.h> #include <linux/pm_runtime.h> +#include <linux/pwrseq/consumer.h> #include <linux/reset.h> #include <linux/slab.h> #include <linux/units.h> @@ -38,6 +39,7 @@ MODULE_IMPORT_NS("RZV2H_CPG"); #define RZG2L_DCS_BUF_SIZE 128 /* Maximum DCS buffer size in external memory. */ #define RZ_MIPI_DSI_FEATURE_16BPP BIT(0) +#define RZ_MIPI_DSI_FEATURE_PWRRDY BIT(1) struct rzg2l_mipi_dsi; @@ -87,6 +89,8 @@ struct rzg2l_mipi_dsi { struct clk *vclk; struct clk *lpclk; + struct pwrseq_desc *pwrseq; + enum mipi_dsi_pixel_format format; unsigned int num_data_lanes; unsigned int lanes; @@ -1396,6 +1400,25 @@ static const struct dev_pm_ops rzg2l_mipi_pm_ops = { * Probe & Remove */ +static int rzg2l_mipi_dsi_pwrrdy_init(struct rzg2l_mipi_dsi *dsi) +{ + if (!(dsi->info->features & RZ_MIPI_DSI_FEATURE_PWRRDY)) + return 0; + + dsi->pwrseq = devm_pwrseq_get(dsi->dev, "dsi-pwrrdy"); + if (IS_ERR(dsi->pwrseq)) { + /* + * This platform requires a sequencer. If we can't get it, we + * must return the error (including -EPROBE_DEFER to wait for + * the provider to appear) + */ + return dev_err_probe(dsi->dev, PTR_ERR(dsi->pwrseq), + "Failed to get required power sequencer\n"); + } + + return pwrseq_enable(dsi->pwrseq); +} + static int rzg2l_mipi_dsi_probe(struct platform_device *pdev) { unsigned int num_data_lanes; @@ -1454,6 +1477,10 @@ static int rzg2l_mipi_dsi_probe(struct platform_device *pdev) platform_set_drvdata(pdev, dsi); + ret = rzg2l_mipi_dsi_pwrrdy_init(dsi); + if (ret) + return ret; + pm_runtime_enable(dsi->dev); ret = pm_runtime_resume_and_get(dsi->dev); |
