summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c27
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);