drm/msm/dsi: parse vsync source from device tree
authorDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Thu, 13 Jun 2024 17:05:09 +0000 (20:05 +0300)
committerDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Mon, 24 Jun 2024 16:41:05 +0000 (19:41 +0300)
Allow board's device tree to specify the vsync source (aka TE source).
If the property is omitted, the display controller driver will use the
default setting.

Reviewed-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
[DB: fixed clearing of return value if there is no TE property]
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
Reviewed-by: Marijn Suijten <marijn.suijten@somainline.org>
Patchwork: https://patchwork.freedesktop.org/patch/598740/
Link: https://lore.kernel.org/r/20240613-dpu-handle-te-signal-v2-6-67a0116b5366@linaro.org
drivers/gpu/drm/msm/dsi/dsi.h
drivers/gpu/drm/msm/dsi/dsi_host.c
drivers/gpu/drm/msm/dsi/dsi_manager.c
drivers/gpu/drm/msm/msm_drv.h

index afc290408ba44398a900d785ed3b5db62af95acd..87496db203d6c7582eadcb74e94eb56a219df292 100644 (file)
@@ -37,6 +37,7 @@ struct msm_dsi {
 
        struct mipi_dsi_host *host;
        struct msm_dsi_phy *phy;
+       const char *te_source;
 
        struct drm_bridge *next_bridge;
 
index 80fa91289381f0b1f1931d074635c9cd2337a9c2..185d7de0bf376622bc6c33192e84e5254ba81337 100644 (file)
@@ -1794,9 +1794,11 @@ static int dsi_populate_dsc_params(struct msm_dsi_host *msm_host, struct drm_dsc
 
 static int dsi_host_parse_dt(struct msm_dsi_host *msm_host)
 {
+       struct msm_dsi *msm_dsi = platform_get_drvdata(msm_host->pdev);
        struct device *dev = &msm_host->pdev->dev;
        struct device_node *np = dev->of_node;
        struct device_node *endpoint;
+       const char *te_source;
        int ret = 0;
 
        /*
@@ -1819,6 +1821,16 @@ static int dsi_host_parse_dt(struct msm_dsi_host *msm_host)
                goto err;
        }
 
+       ret = of_property_read_string(endpoint, "qcom,te-source", &te_source);
+       if (ret && ret != -EINVAL) {
+               DRM_DEV_ERROR(dev, "%s: invalid TE source configuration %d\n",
+                       __func__, ret);
+               goto err;
+       }
+       if (!ret)
+               msm_dsi->te_source = devm_kstrdup(dev, te_source, GFP_KERNEL);
+       ret = 0;
+
        if (of_property_read_bool(np, "syscon-sfpb")) {
                msm_host->sfpb = syscon_regmap_lookup_by_phandle(np,
                                        "syscon-sfpb");
index 5b3f3068fd92f7b46c16811b99b2159d869ca92d..a210b7c9e5ca281a46fbdb226e25832719a684ea 100644 (file)
@@ -603,3 +603,8 @@ bool msm_dsi_is_master_dsi(struct msm_dsi *msm_dsi)
 {
        return IS_MASTER_DSI_LINK(msm_dsi->id);
 }
+
+const char *msm_dsi_get_te_source(struct msm_dsi *msm_dsi)
+{
+       return msm_dsi->te_source;
+}
index e256d72adddd553a410c4181859601c2ad0a7f0b..be016d7b4ef11a8a0ef135ce630171b6446eb07d 100644 (file)
@@ -335,6 +335,7 @@ bool msm_dsi_is_bonded_dsi(struct msm_dsi *msm_dsi);
 bool msm_dsi_is_master_dsi(struct msm_dsi *msm_dsi);
 bool msm_dsi_wide_bus_enabled(struct msm_dsi *msm_dsi);
 struct drm_dsc_config *msm_dsi_get_dsc_config(struct msm_dsi *msm_dsi);
+const char *msm_dsi_get_te_source(struct msm_dsi *msm_dsi);
 #else
 static inline void __init msm_dsi_register(void)
 {
@@ -372,6 +373,11 @@ static inline struct drm_dsc_config *msm_dsi_get_dsc_config(struct msm_dsi *msm_
 {
        return NULL;
 }
+
+static inline const char *msm_dsi_get_te_source(struct msm_dsi *msm_dsi)
+{
+       return NULL;
+}
 #endif
 
 #ifdef CONFIG_DRM_MSM_DP