* [PATCH v3 1/7] dt-bindings: display: msm: mdp4: add LCDC clock and PLL source
2025-02-27 2:25 [PATCH v3 0/7] drm/msm/mdp4: rework LVDS/LCDC panel support Dmitry Baryshkov
@ 2025-02-27 2:25 ` Dmitry Baryshkov
2025-02-27 2:25 ` [PATCH v3 2/7] drm/msm/mdp4: drop mpd4_lvds_pll_init stub Dmitry Baryshkov
` (5 subsequent siblings)
6 siblings, 0 replies; 21+ messages in thread
From: Dmitry Baryshkov @ 2025-02-27 2:25 UTC (permalink / raw)
To: Rob Clark, Abhinav Kumar, Sean Paul, Marijn Suijten,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Bjorn Andersson, Konrad Dybcio
Cc: linux-arm-msm, dri-devel, freedreno, devicetree, linux-kernel
Add the LCDC / LVDS clock input and the XO used to drive internal LVDS
PLL to MDP4 controller bindings. The controller also provides LVDS PHY
PLL, so add optional #clock-cells to the device.
Acked-by: Rob Herring (Arm) <robh@kernel.org>
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
Documentation/devicetree/bindings/display/msm/mdp4.yaml | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/Documentation/devicetree/bindings/display/msm/mdp4.yaml b/Documentation/devicetree/bindings/display/msm/mdp4.yaml
index 35204a2875795e2c1f7582c8fab227f8a9107ed9..03ee09faa335f332259b64a42eefa3ec199b8e03 100644
--- a/Documentation/devicetree/bindings/display/msm/mdp4.yaml
+++ b/Documentation/devicetree/bindings/display/msm/mdp4.yaml
@@ -18,9 +18,10 @@ properties:
clocks:
minItems: 6
- maxItems: 6
+ maxItems: 8
clock-names:
+ minItems: 6
items:
- const: core_clk
- const: iface_clk
@@ -28,6 +29,12 @@ properties:
- const: lut_clk
- const: hdmi_clk
- const: tv_clk
+ - const: lcdc_clk
+ - const: pxo
+ description: XO used to drive the internal LVDS PLL
+
+ '#clock-cells':
+ const: 0
reg:
maxItems: 1
--
2.39.5
^ permalink raw reply related [flat|nested] 21+ messages in thread* [PATCH v3 2/7] drm/msm/mdp4: drop mpd4_lvds_pll_init stub
2025-02-27 2:25 [PATCH v3 0/7] drm/msm/mdp4: rework LVDS/LCDC panel support Dmitry Baryshkov
2025-02-27 2:25 ` [PATCH v3 1/7] dt-bindings: display: msm: mdp4: add LCDC clock and PLL source Dmitry Baryshkov
@ 2025-02-27 2:25 ` Dmitry Baryshkov
2025-04-23 22:18 ` Abhinav Kumar
2025-02-27 2:25 ` [PATCH v3 3/7] drm/msm/mdp4: register the LVDS PLL as a clock provider Dmitry Baryshkov
` (4 subsequent siblings)
6 siblings, 1 reply; 21+ messages in thread
From: Dmitry Baryshkov @ 2025-02-27 2:25 UTC (permalink / raw)
To: Rob Clark, Abhinav Kumar, Sean Paul, Marijn Suijten,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Bjorn Andersson, Konrad Dybcio
Cc: linux-arm-msm, dri-devel, freedreno, devicetree, linux-kernel,
Konrad Dybcio
Drop the !COMMON_CLK stub for mpd4_lvds_pll_init(), the DRM_MSM driver
depends on COMMON_CLK.
Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h | 7 -------
1 file changed, 7 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h
index 94b1ba92785fe55f8ead3bb8a7f998dc24a76f6a..142ccb68b435263f91ba1ab27676e426d43e5d84 100644
--- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h
+++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h
@@ -207,13 +207,6 @@ static inline struct drm_encoder *mdp4_dsi_encoder_init(struct drm_device *dev)
}
#endif
-#ifdef CONFIG_COMMON_CLK
struct clk *mpd4_lvds_pll_init(struct drm_device *dev);
-#else
-static inline struct clk *mpd4_lvds_pll_init(struct drm_device *dev)
-{
- return ERR_PTR(-ENODEV);
-}
-#endif
#endif /* __MDP4_KMS_H__ */
--
2.39.5
^ permalink raw reply related [flat|nested] 21+ messages in thread* Re: [PATCH v3 2/7] drm/msm/mdp4: drop mpd4_lvds_pll_init stub
2025-02-27 2:25 ` [PATCH v3 2/7] drm/msm/mdp4: drop mpd4_lvds_pll_init stub Dmitry Baryshkov
@ 2025-04-23 22:18 ` Abhinav Kumar
0 siblings, 0 replies; 21+ messages in thread
From: Abhinav Kumar @ 2025-04-23 22:18 UTC (permalink / raw)
To: Dmitry Baryshkov, Rob Clark, Sean Paul, Marijn Suijten,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Bjorn Andersson, Konrad Dybcio
Cc: linux-arm-msm, dri-devel, freedreno, devicetree, linux-kernel,
Konrad Dybcio
On 2/26/2025 6:25 PM, Dmitry Baryshkov wrote:
> Drop the !COMMON_CLK stub for mpd4_lvds_pll_init(), the DRM_MSM driver
> depends on COMMON_CLK.
>
> Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> ---
> drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h | 7 -------
> 1 file changed, 7 deletions(-)
>
Reviewed-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH v3 3/7] drm/msm/mdp4: register the LVDS PLL as a clock provider
2025-02-27 2:25 [PATCH v3 0/7] drm/msm/mdp4: rework LVDS/LCDC panel support Dmitry Baryshkov
2025-02-27 2:25 ` [PATCH v3 1/7] dt-bindings: display: msm: mdp4: add LCDC clock and PLL source Dmitry Baryshkov
2025-02-27 2:25 ` [PATCH v3 2/7] drm/msm/mdp4: drop mpd4_lvds_pll_init stub Dmitry Baryshkov
@ 2025-02-27 2:25 ` Dmitry Baryshkov
2025-04-23 22:54 ` Abhinav Kumar
2025-02-27 2:25 ` [PATCH v3 4/7] drm/msm/mdp4: use parent_data for LVDS PLL Dmitry Baryshkov
` (3 subsequent siblings)
6 siblings, 1 reply; 21+ messages in thread
From: Dmitry Baryshkov @ 2025-02-27 2:25 UTC (permalink / raw)
To: Rob Clark, Abhinav Kumar, Sean Paul, Marijn Suijten,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Bjorn Andersson, Konrad Dybcio
Cc: linux-arm-msm, dri-devel, freedreno, devicetree, linux-kernel,
Konrad Dybcio
The LVDS/LCDC controller uses pixel clock coming from the multimedia
controller (mmcc) rather than using the PLL directly. Stop using LVDS
PLL directly and register it as a clock provider. Use lcdc_clk as a
pixel clock for the LCDC.
Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h | 2 +-
drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c | 8 +++++++-
drivers/gpu/drm/msm/disp/mdp4/mdp4_lvds_pll.c | 22 +++++++---------------
3 files changed, 15 insertions(+), 17 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h
index 142ccb68b435263f91ba1ab27676e426d43e5d84..b8bdc3712c73b14f3547dce3439a895e3d10f193 100644
--- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h
+++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h
@@ -207,6 +207,6 @@ static inline struct drm_encoder *mdp4_dsi_encoder_init(struct drm_device *dev)
}
#endif
-struct clk *mpd4_lvds_pll_init(struct drm_device *dev);
+int mpd4_lvds_pll_init(struct drm_device *dev);
#endif /* __MDP4_KMS_H__ */
diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c
index 8bbc7fb881d599e7d309cc61bda83697fecd253a..db93795916cdaa87ac8e61d3b44c2dadac10fd9e 100644
--- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c
+++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c
@@ -381,7 +381,13 @@ struct drm_encoder *mdp4_lcdc_encoder_init(struct drm_device *dev,
drm_encoder_helper_add(encoder, &mdp4_lcdc_encoder_helper_funcs);
/* TODO: do we need different pll in other cases? */
- mdp4_lcdc_encoder->lcdc_clk = mpd4_lvds_pll_init(dev);
+ ret = mpd4_lvds_pll_init(dev);
+ if (ret) {
+ DRM_DEV_ERROR(dev->dev, "failed to register LVDS PLL\n");
+ return ERR_PTR(ret);
+ }
+
+ mdp4_lcdc_encoder->lcdc_clk = devm_clk_get(dev->dev, "lcdc_clk");
if (IS_ERR(mdp4_lcdc_encoder->lcdc_clk)) {
DRM_DEV_ERROR(dev->dev, "failed to get lvds_clk\n");
return ERR_CAST(mdp4_lcdc_encoder->lcdc_clk);
diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_lvds_pll.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_lvds_pll.c
index ab8c0c187fb2cd05e26f5019244af15f1b2470c8..cbd154c72e44c848fa65fe01d848879b9f6735fb 100644
--- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_lvds_pll.c
+++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_lvds_pll.c
@@ -133,29 +133,21 @@ static struct clk_init_data pll_init = {
.num_parents = ARRAY_SIZE(mpd4_lvds_pll_parents),
};
-struct clk *mpd4_lvds_pll_init(struct drm_device *dev)
+int mpd4_lvds_pll_init(struct drm_device *dev)
{
struct mdp4_lvds_pll *lvds_pll;
- struct clk *clk;
int ret;
lvds_pll = devm_kzalloc(dev->dev, sizeof(*lvds_pll), GFP_KERNEL);
- if (!lvds_pll) {
- ret = -ENOMEM;
- goto fail;
- }
+ if (!lvds_pll)
+ return -ENOMEM;
lvds_pll->dev = dev;
lvds_pll->pll_hw.init = &pll_init;
- clk = devm_clk_register(dev->dev, &lvds_pll->pll_hw);
- if (IS_ERR(clk)) {
- ret = PTR_ERR(clk);
- goto fail;
- }
+ ret = devm_clk_hw_register(dev->dev, &lvds_pll->pll_hw);
+ if (ret)
+ return ret;
- return clk;
-
-fail:
- return ERR_PTR(ret);
+ return devm_of_clk_add_hw_provider(dev->dev, of_clk_hw_simple_get, &lvds_pll->pll_hw);
}
--
2.39.5
^ permalink raw reply related [flat|nested] 21+ messages in thread* Re: [PATCH v3 3/7] drm/msm/mdp4: register the LVDS PLL as a clock provider
2025-02-27 2:25 ` [PATCH v3 3/7] drm/msm/mdp4: register the LVDS PLL as a clock provider Dmitry Baryshkov
@ 2025-04-23 22:54 ` Abhinav Kumar
2025-04-24 10:22 ` Dmitry Baryshkov
0 siblings, 1 reply; 21+ messages in thread
From: Abhinav Kumar @ 2025-04-23 22:54 UTC (permalink / raw)
To: Dmitry Baryshkov, Rob Clark, Sean Paul, Marijn Suijten,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Bjorn Andersson, Konrad Dybcio
Cc: linux-arm-msm, dri-devel, freedreno, devicetree, linux-kernel,
Konrad Dybcio
On 2/26/2025 6:25 PM, Dmitry Baryshkov wrote:
> The LVDS/LCDC controller uses pixel clock coming from the multimedia
> controller (mmcc) rather than using the PLL directly. Stop using LVDS
> PLL directly and register it as a clock provider. Use lcdc_clk as a
> pixel clock for the LCDC.
>
> Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> ---
> drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h | 2 +-
> drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c | 8 +++++++-
> drivers/gpu/drm/msm/disp/mdp4/mdp4_lvds_pll.c | 22 +++++++---------------
> 3 files changed, 15 insertions(+), 17 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h
> index 142ccb68b435263f91ba1ab27676e426d43e5d84..b8bdc3712c73b14f3547dce3439a895e3d10f193 100644
> --- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h
> +++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h
> @@ -207,6 +207,6 @@ static inline struct drm_encoder *mdp4_dsi_encoder_init(struct drm_device *dev)
> }
> #endif
>
> -struct clk *mpd4_lvds_pll_init(struct drm_device *dev);
> +int mpd4_lvds_pll_init(struct drm_device *dev);
>
> #endif /* __MDP4_KMS_H__ */
> diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c
> index 8bbc7fb881d599e7d309cc61bda83697fecd253a..db93795916cdaa87ac8e61d3b44c2dadac10fd9e 100644
> --- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c
> +++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c
> @@ -381,7 +381,13 @@ struct drm_encoder *mdp4_lcdc_encoder_init(struct drm_device *dev,
> drm_encoder_helper_add(encoder, &mdp4_lcdc_encoder_helper_funcs);
>
> /* TODO: do we need different pll in other cases? */
> - mdp4_lcdc_encoder->lcdc_clk = mpd4_lvds_pll_init(dev);
> + ret = mpd4_lvds_pll_init(dev);
> + if (ret) {
> + DRM_DEV_ERROR(dev->dev, "failed to register LVDS PLL\n");
> + return ERR_PTR(ret);
> + }
> +
> + mdp4_lcdc_encoder->lcdc_clk = devm_clk_get(dev->dev, "lcdc_clk");
> if (IS_ERR(mdp4_lcdc_encoder->lcdc_clk)) {
> DRM_DEV_ERROR(dev->dev, "failed to get lvds_clk\n");
> return ERR_CAST(mdp4_lcdc_encoder->lcdc_clk);
Change seems fine to me, one question on the order of changes, DT change
has to be merged first otherwise it will fail here?
Will that be managed by co-ordinating with the DT maintainer?
> diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_lvds_pll.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_lvds_pll.c
> index ab8c0c187fb2cd05e26f5019244af15f1b2470c8..cbd154c72e44c848fa65fe01d848879b9f6735fb 100644
> --- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_lvds_pll.c
> +++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_lvds_pll.c
> @@ -133,29 +133,21 @@ static struct clk_init_data pll_init = {
> .num_parents = ARRAY_SIZE(mpd4_lvds_pll_parents),
> };
>
> -struct clk *mpd4_lvds_pll_init(struct drm_device *dev)
> +int mpd4_lvds_pll_init(struct drm_device *dev)
> {
> struct mdp4_lvds_pll *lvds_pll;
> - struct clk *clk;
> int ret;
>
> lvds_pll = devm_kzalloc(dev->dev, sizeof(*lvds_pll), GFP_KERNEL);
> - if (!lvds_pll) {
> - ret = -ENOMEM;
> - goto fail;
> - }
> + if (!lvds_pll)
> + return -ENOMEM;
>
> lvds_pll->dev = dev;
>
> lvds_pll->pll_hw.init = &pll_init;
> - clk = devm_clk_register(dev->dev, &lvds_pll->pll_hw);
> - if (IS_ERR(clk)) {
> - ret = PTR_ERR(clk);
> - goto fail;
> - }
> + ret = devm_clk_hw_register(dev->dev, &lvds_pll->pll_hw);
> + if (ret)
> + return ret;
>
> - return clk;
> -
> -fail:
> - return ERR_PTR(ret);
> + return devm_of_clk_add_hw_provider(dev->dev, of_clk_hw_simple_get, &lvds_pll->pll_hw);
> }
>
^ permalink raw reply [flat|nested] 21+ messages in thread* Re: [PATCH v3 3/7] drm/msm/mdp4: register the LVDS PLL as a clock provider
2025-04-23 22:54 ` Abhinav Kumar
@ 2025-04-24 10:22 ` Dmitry Baryshkov
2025-04-24 19:41 ` Abhinav Kumar
0 siblings, 1 reply; 21+ messages in thread
From: Dmitry Baryshkov @ 2025-04-24 10:22 UTC (permalink / raw)
To: Abhinav Kumar
Cc: Dmitry Baryshkov, Rob Clark, Sean Paul, Marijn Suijten,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Bjorn Andersson, Konrad Dybcio, linux-arm-msm, dri-devel,
freedreno, devicetree, linux-kernel, Konrad Dybcio
On Wed, Apr 23, 2025 at 03:54:13PM -0700, Abhinav Kumar wrote:
>
>
> On 2/26/2025 6:25 PM, Dmitry Baryshkov wrote:
> > The LVDS/LCDC controller uses pixel clock coming from the multimedia
> > controller (mmcc) rather than using the PLL directly. Stop using LVDS
> > PLL directly and register it as a clock provider. Use lcdc_clk as a
> > pixel clock for the LCDC.
> >
> > Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
> > Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> > ---
> > drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h | 2 +-
> > drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c | 8 +++++++-
> > drivers/gpu/drm/msm/disp/mdp4/mdp4_lvds_pll.c | 22 +++++++---------------
> > 3 files changed, 15 insertions(+), 17 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h
> > index 142ccb68b435263f91ba1ab27676e426d43e5d84..b8bdc3712c73b14f3547dce3439a895e3d10f193 100644
> > --- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h
> > +++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h
> > @@ -207,6 +207,6 @@ static inline struct drm_encoder *mdp4_dsi_encoder_init(struct drm_device *dev)
> > }
> > #endif
> > -struct clk *mpd4_lvds_pll_init(struct drm_device *dev);
> > +int mpd4_lvds_pll_init(struct drm_device *dev);
> > #endif /* __MDP4_KMS_H__ */
> > diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c
> > index 8bbc7fb881d599e7d309cc61bda83697fecd253a..db93795916cdaa87ac8e61d3b44c2dadac10fd9e 100644
> > --- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c
> > +++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c
> > @@ -381,7 +381,13 @@ struct drm_encoder *mdp4_lcdc_encoder_init(struct drm_device *dev,
> > drm_encoder_helper_add(encoder, &mdp4_lcdc_encoder_helper_funcs);
> > /* TODO: do we need different pll in other cases? */
> > - mdp4_lcdc_encoder->lcdc_clk = mpd4_lvds_pll_init(dev);
> > + ret = mpd4_lvds_pll_init(dev);
> > + if (ret) {
> > + DRM_DEV_ERROR(dev->dev, "failed to register LVDS PLL\n");
> > + return ERR_PTR(ret);
> > + }
> > +
> > + mdp4_lcdc_encoder->lcdc_clk = devm_clk_get(dev->dev, "lcdc_clk");
> > if (IS_ERR(mdp4_lcdc_encoder->lcdc_clk)) {
> > DRM_DEV_ERROR(dev->dev, "failed to get lvds_clk\n");
> > return ERR_CAST(mdp4_lcdc_encoder->lcdc_clk);
>
> Change seems fine to me, one question on the order of changes, DT change has
> to be merged first otherwise it will fail here?
It is already semi-broken, as just enabling the PLL is not enough. The
branch clocks in MMSS are to be toggled / manipulated. As such, it's
questionable if we need to coordinate or not.
>
> Will that be managed by co-ordinating with the DT maintainer?
>
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 21+ messages in thread* Re: [PATCH v3 3/7] drm/msm/mdp4: register the LVDS PLL as a clock provider
2025-04-24 10:22 ` Dmitry Baryshkov
@ 2025-04-24 19:41 ` Abhinav Kumar
0 siblings, 0 replies; 21+ messages in thread
From: Abhinav Kumar @ 2025-04-24 19:41 UTC (permalink / raw)
To: Dmitry Baryshkov
Cc: Dmitry Baryshkov, Rob Clark, Sean Paul, Marijn Suijten,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Bjorn Andersson, Konrad Dybcio, linux-arm-msm, dri-devel,
freedreno, devicetree, linux-kernel, Konrad Dybcio
On 4/24/2025 3:22 AM, Dmitry Baryshkov wrote:
> On Wed, Apr 23, 2025 at 03:54:13PM -0700, Abhinav Kumar wrote:
>>
>>
>> On 2/26/2025 6:25 PM, Dmitry Baryshkov wrote:
>>> The LVDS/LCDC controller uses pixel clock coming from the multimedia
>>> controller (mmcc) rather than using the PLL directly. Stop using LVDS
>>> PLL directly and register it as a clock provider. Use lcdc_clk as a
>>> pixel clock for the LCDC.
>>>
>>> Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
>>> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
>>> ---
>>> drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h | 2 +-
>>> drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c | 8 +++++++-
>>> drivers/gpu/drm/msm/disp/mdp4/mdp4_lvds_pll.c | 22 +++++++---------------
>>> 3 files changed, 15 insertions(+), 17 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h
>>> index 142ccb68b435263f91ba1ab27676e426d43e5d84..b8bdc3712c73b14f3547dce3439a895e3d10f193 100644
>>> --- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h
>>> +++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h
>>> @@ -207,6 +207,6 @@ static inline struct drm_encoder *mdp4_dsi_encoder_init(struct drm_device *dev)
>>> }
>>> #endif
>>> -struct clk *mpd4_lvds_pll_init(struct drm_device *dev);
>>> +int mpd4_lvds_pll_init(struct drm_device *dev);
>>> #endif /* __MDP4_KMS_H__ */
>>> diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c
>>> index 8bbc7fb881d599e7d309cc61bda83697fecd253a..db93795916cdaa87ac8e61d3b44c2dadac10fd9e 100644
>>> --- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c
>>> +++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c
>>> @@ -381,7 +381,13 @@ struct drm_encoder *mdp4_lcdc_encoder_init(struct drm_device *dev,
>>> drm_encoder_helper_add(encoder, &mdp4_lcdc_encoder_helper_funcs);
>>> /* TODO: do we need different pll in other cases? */
>>> - mdp4_lcdc_encoder->lcdc_clk = mpd4_lvds_pll_init(dev);
>>> + ret = mpd4_lvds_pll_init(dev);
>>> + if (ret) {
>>> + DRM_DEV_ERROR(dev->dev, "failed to register LVDS PLL\n");
>>> + return ERR_PTR(ret);
>>> + }
>>> +
>>> + mdp4_lcdc_encoder->lcdc_clk = devm_clk_get(dev->dev, "lcdc_clk");
>>> if (IS_ERR(mdp4_lcdc_encoder->lcdc_clk)) {
>>> DRM_DEV_ERROR(dev->dev, "failed to get lvds_clk\n");
>>> return ERR_CAST(mdp4_lcdc_encoder->lcdc_clk);
>>
>> Change seems fine to me, one question on the order of changes, DT change has
>> to be merged first otherwise it will fail here?
>
> It is already semi-broken, as just enabling the PLL is not enough. The
> branch clocks in MMSS are to be toggled / manipulated. As such, it's
> questionable if we need to coordinate or not.
>
Yes but wouldnt this cause mdp4_lcdc_encoder_init() failure which in
turn will cause mdp4_kms_init() failure?
So I thought that by merging the DTSI piece first this can be avoided.
>>
>> Will that be managed by co-ordinating with the DT maintainer?
>>
>
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH v3 4/7] drm/msm/mdp4: use parent_data for LVDS PLL
2025-02-27 2:25 [PATCH v3 0/7] drm/msm/mdp4: rework LVDS/LCDC panel support Dmitry Baryshkov
` (2 preceding siblings ...)
2025-02-27 2:25 ` [PATCH v3 3/7] drm/msm/mdp4: register the LVDS PLL as a clock provider Dmitry Baryshkov
@ 2025-02-27 2:25 ` Dmitry Baryshkov
2025-03-08 17:50 ` Konrad Dybcio
2025-04-23 22:54 ` Abhinav Kumar
2025-02-27 2:25 ` [PATCH v3 5/7] drm/msm/mdp4: move move_valid callback to lcdc_encoder Dmitry Baryshkov
` (2 subsequent siblings)
6 siblings, 2 replies; 21+ messages in thread
From: Dmitry Baryshkov @ 2025-02-27 2:25 UTC (permalink / raw)
To: Rob Clark, Abhinav Kumar, Sean Paul, Marijn Suijten,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Bjorn Andersson, Konrad Dybcio
Cc: linux-arm-msm, dri-devel, freedreno, devicetree, linux-kernel
Instead of using .parent_names, use .parent_data, which binds parent
clocks by using relative names specified in DT in addition to using global
system clock names.
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/gpu/drm/msm/disp/mdp4/mdp4_lvds_pll.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_lvds_pll.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_lvds_pll.c
index cbd154c72e44c848fa65fe01d848879b9f6735fb..a99bf482ba2c02e27a76341ae454930a13c8dd92 100644
--- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_lvds_pll.c
+++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_lvds_pll.c
@@ -122,14 +122,14 @@ static const struct clk_ops mpd4_lvds_pll_ops = {
.set_rate = mpd4_lvds_pll_set_rate,
};
-static const char *mpd4_lvds_pll_parents[] = {
- "pxo",
+static const struct clk_parent_data mpd4_lvds_pll_parents[] = {
+ { .fw_name = "pxo", .name = "pxo", },
};
static struct clk_init_data pll_init = {
.name = "mpd4_lvds_pll",
.ops = &mpd4_lvds_pll_ops,
- .parent_names = mpd4_lvds_pll_parents,
+ .parent_data = mpd4_lvds_pll_parents,
.num_parents = ARRAY_SIZE(mpd4_lvds_pll_parents),
};
--
2.39.5
^ permalink raw reply related [flat|nested] 21+ messages in thread* Re: [PATCH v3 4/7] drm/msm/mdp4: use parent_data for LVDS PLL
2025-02-27 2:25 ` [PATCH v3 4/7] drm/msm/mdp4: use parent_data for LVDS PLL Dmitry Baryshkov
@ 2025-03-08 17:50 ` Konrad Dybcio
2025-04-23 22:54 ` Abhinav Kumar
1 sibling, 0 replies; 21+ messages in thread
From: Konrad Dybcio @ 2025-03-08 17:50 UTC (permalink / raw)
To: Dmitry Baryshkov, Rob Clark, Abhinav Kumar, Sean Paul,
Marijn Suijten, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, David Airlie, Simona Vetter, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Bjorn Andersson, Konrad Dybcio
Cc: linux-arm-msm, dri-devel, freedreno, devicetree, linux-kernel
On 27.02.2025 3:25 AM, Dmitry Baryshkov wrote:
> Instead of using .parent_names, use .parent_data, which binds parent
> clocks by using relative names specified in DT in addition to using global
> system clock names.
>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> ---
Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Konrad
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v3 4/7] drm/msm/mdp4: use parent_data for LVDS PLL
2025-02-27 2:25 ` [PATCH v3 4/7] drm/msm/mdp4: use parent_data for LVDS PLL Dmitry Baryshkov
2025-03-08 17:50 ` Konrad Dybcio
@ 2025-04-23 22:54 ` Abhinav Kumar
1 sibling, 0 replies; 21+ messages in thread
From: Abhinav Kumar @ 2025-04-23 22:54 UTC (permalink / raw)
To: Dmitry Baryshkov, Rob Clark, Sean Paul, Marijn Suijten,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Bjorn Andersson, Konrad Dybcio
Cc: linux-arm-msm, dri-devel, freedreno, devicetree, linux-kernel
On 2/26/2025 6:25 PM, Dmitry Baryshkov wrote:
> Instead of using .parent_names, use .parent_data, which binds parent
> clocks by using relative names specified in DT in addition to using global
> system clock names.
>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> ---
> drivers/gpu/drm/msm/disp/mdp4/mdp4_lvds_pll.c | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>
Reviewed-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH v3 5/7] drm/msm/mdp4: move move_valid callback to lcdc_encoder
2025-02-27 2:25 [PATCH v3 0/7] drm/msm/mdp4: rework LVDS/LCDC panel support Dmitry Baryshkov
` (3 preceding siblings ...)
2025-02-27 2:25 ` [PATCH v3 4/7] drm/msm/mdp4: use parent_data for LVDS PLL Dmitry Baryshkov
@ 2025-02-27 2:25 ` Dmitry Baryshkov
2025-04-23 23:28 ` Abhinav Kumar
2025-02-27 2:25 ` [PATCH v3 6/7] drm/msm/mdp4: switch LVDS to use drm_bridge/_connector Dmitry Baryshkov
2025-02-27 2:25 ` [PATCH v3 7/7] arm: dts: qcom: apq8064: link LVDS clocks Dmitry Baryshkov
6 siblings, 1 reply; 21+ messages in thread
From: Dmitry Baryshkov @ 2025-02-27 2:25 UTC (permalink / raw)
To: Rob Clark, Abhinav Kumar, Sean Paul, Marijn Suijten,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Bjorn Andersson, Konrad Dybcio
Cc: linux-arm-msm, dri-devel, freedreno, devicetree, linux-kernel,
Konrad Dybcio
We can check the LCDC clock directly from the LCDC encoder driver, so
remove it from the LVDS connector.
Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h | 1 -
drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c | 27 ++++++++++++++++------
.../gpu/drm/msm/disp/mdp4/mdp4_lvds_connector.c | 21 -----------------
3 files changed, 20 insertions(+), 29 deletions(-)
diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h
index b8bdc3712c73b14f3547dce3439a895e3d10f193..e0380d3b7e0cee99c4c376bf6369887106f44ede 100644
--- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h
+++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h
@@ -191,7 +191,6 @@ struct drm_crtc *mdp4_crtc_init(struct drm_device *dev,
long mdp4_dtv_round_pixclk(struct drm_encoder *encoder, unsigned long rate);
struct drm_encoder *mdp4_dtv_encoder_init(struct drm_device *dev);
-long mdp4_lcdc_round_pixclk(struct drm_encoder *encoder, unsigned long rate);
struct drm_encoder *mdp4_lcdc_encoder_init(struct drm_device *dev,
struct device_node *panel_node);
diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c
index db93795916cdaa87ac8e61d3b44c2dadac10fd9e..cfcedd8a635cf0297365e845ef415a8f0d553183 100644
--- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c
+++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c
@@ -348,19 +348,32 @@ static void mdp4_lcdc_encoder_enable(struct drm_encoder *encoder)
mdp4_lcdc_encoder->enabled = true;
}
+static enum drm_mode_status
+mdp4_lcdc_encoder_mode_valid(struct drm_encoder *encoder,
+ const struct drm_display_mode *mode)
+{
+ struct mdp4_lcdc_encoder *mdp4_lcdc_encoder =
+ to_mdp4_lcdc_encoder(encoder);
+ long actual, requested;
+
+ requested = 1000 * mode->clock;
+ actual = clk_round_rate(mdp4_lcdc_encoder->lcdc_clk, requested);
+
+ DBG("requested=%ld, actual=%ld", requested, actual);
+
+ if (actual != requested)
+ return MODE_CLOCK_RANGE;
+
+ return MODE_OK;
+}
+
static const struct drm_encoder_helper_funcs mdp4_lcdc_encoder_helper_funcs = {
.mode_set = mdp4_lcdc_encoder_mode_set,
.disable = mdp4_lcdc_encoder_disable,
.enable = mdp4_lcdc_encoder_enable,
+ .mode_valid = mdp4_lcdc_encoder_mode_valid,
};
-long mdp4_lcdc_round_pixclk(struct drm_encoder *encoder, unsigned long rate)
-{
- struct mdp4_lcdc_encoder *mdp4_lcdc_encoder =
- to_mdp4_lcdc_encoder(encoder);
- return clk_round_rate(mdp4_lcdc_encoder->lcdc_clk, rate);
-}
-
/* initialize encoder */
struct drm_encoder *mdp4_lcdc_encoder_init(struct drm_device *dev,
struct device_node *panel_node)
diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_lvds_connector.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_lvds_connector.c
index 52e728181b523cc3380d7718b5956e7e2dbd4cad..4755eb13ef79f313d2be088145c8cd2e615226fe 100644
--- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_lvds_connector.c
+++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_lvds_connector.c
@@ -56,26 +56,6 @@ static int mdp4_lvds_connector_get_modes(struct drm_connector *connector)
return ret;
}
-static enum drm_mode_status
-mdp4_lvds_connector_mode_valid(struct drm_connector *connector,
- const struct drm_display_mode *mode)
-{
- struct mdp4_lvds_connector *mdp4_lvds_connector =
- to_mdp4_lvds_connector(connector);
- struct drm_encoder *encoder = mdp4_lvds_connector->encoder;
- long actual, requested;
-
- requested = 1000 * mode->clock;
- actual = mdp4_lcdc_round_pixclk(encoder, requested);
-
- DBG("requested=%ld, actual=%ld", requested, actual);
-
- if (actual != requested)
- return MODE_CLOCK_RANGE;
-
- return MODE_OK;
-}
-
static const struct drm_connector_funcs mdp4_lvds_connector_funcs = {
.detect = mdp4_lvds_connector_detect,
.fill_modes = drm_helper_probe_single_connector_modes,
@@ -87,7 +67,6 @@ static const struct drm_connector_funcs mdp4_lvds_connector_funcs = {
static const struct drm_connector_helper_funcs mdp4_lvds_connector_helper_funcs = {
.get_modes = mdp4_lvds_connector_get_modes,
- .mode_valid = mdp4_lvds_connector_mode_valid,
};
/* initialize connector */
--
2.39.5
^ permalink raw reply related [flat|nested] 21+ messages in thread* Re: [PATCH v3 5/7] drm/msm/mdp4: move move_valid callback to lcdc_encoder
2025-02-27 2:25 ` [PATCH v3 5/7] drm/msm/mdp4: move move_valid callback to lcdc_encoder Dmitry Baryshkov
@ 2025-04-23 23:28 ` Abhinav Kumar
0 siblings, 0 replies; 21+ messages in thread
From: Abhinav Kumar @ 2025-04-23 23:28 UTC (permalink / raw)
To: Dmitry Baryshkov, Rob Clark, Sean Paul, Marijn Suijten,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Bjorn Andersson, Konrad Dybcio
Cc: linux-arm-msm, dri-devel, freedreno, devicetree, linux-kernel,
Konrad Dybcio
On 2/26/2025 6:25 PM, Dmitry Baryshkov wrote:
> We can check the LCDC clock directly from the LCDC encoder driver, so
> remove it from the LVDS connector.
>
> Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> ---
> drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h | 1 -
> drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c | 27 ++++++++++++++++------
> .../gpu/drm/msm/disp/mdp4/mdp4_lvds_connector.c | 21 -----------------
> 3 files changed, 20 insertions(+), 29 deletions(-)
>
Reviewed-by: Abhinav Kumar <quic_abhinavk@quicinc.com>
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH v3 6/7] drm/msm/mdp4: switch LVDS to use drm_bridge/_connector
2025-02-27 2:25 [PATCH v3 0/7] drm/msm/mdp4: rework LVDS/LCDC panel support Dmitry Baryshkov
` (4 preceding siblings ...)
2025-02-27 2:25 ` [PATCH v3 5/7] drm/msm/mdp4: move move_valid callback to lcdc_encoder Dmitry Baryshkov
@ 2025-02-27 2:25 ` Dmitry Baryshkov
2025-04-24 2:04 ` Abhinav Kumar
2025-02-27 2:25 ` [PATCH v3 7/7] arm: dts: qcom: apq8064: link LVDS clocks Dmitry Baryshkov
6 siblings, 1 reply; 21+ messages in thread
From: Dmitry Baryshkov @ 2025-02-27 2:25 UTC (permalink / raw)
To: Rob Clark, Abhinav Kumar, Sean Paul, Marijn Suijten,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Bjorn Andersson, Konrad Dybcio
Cc: linux-arm-msm, dri-devel, freedreno, devicetree, linux-kernel
LVDS support in MDP4 driver makes use of drm_connector directly. However
LCDC encoder and LVDS connector are wrappers around drm_panel. Switch
them to use drm_panel_bridge/drm_bridge_connector. This allows using
standard interface for the drm_panel and also inserting additional
bridges between encoder and panel.
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
drivers/gpu/drm/msm/Makefile | 1 -
drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c | 34 +++++--
drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h | 6 +-
drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c | 20 +----
.../gpu/drm/msm/disp/mdp4/mdp4_lvds_connector.c | 100 ---------------------
5 files changed, 28 insertions(+), 133 deletions(-)
diff --git a/drivers/gpu/drm/msm/Makefile b/drivers/gpu/drm/msm/Makefile
index 5df20cbeafb8bf07c825a1fd72719d5a56c38613..7a2ada6e2d74a902879e4f12a78ed475e5209ec2 100644
--- a/drivers/gpu/drm/msm/Makefile
+++ b/drivers/gpu/drm/msm/Makefile
@@ -48,7 +48,6 @@ msm-display-$(CONFIG_DRM_MSM_MDP4) += \
disp/mdp4/mdp4_dsi_encoder.o \
disp/mdp4/mdp4_dtv_encoder.o \
disp/mdp4/mdp4_lcdc_encoder.o \
- disp/mdp4/mdp4_lvds_connector.o \
disp/mdp4/mdp4_lvds_pll.o \
disp/mdp4/mdp4_irq.o \
disp/mdp4/mdp4_kms.o \
diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
index 689e210660a5218ed1e2d116073723215af5a187..93c9411eb422bc67b7fedb5ffce4c330310b520f 100644
--- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
+++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
@@ -6,6 +6,8 @@
#include <linux/delay.h>
+#include <drm/drm_bridge.h>
+#include <drm/drm_bridge_connector.h>
#include <drm/drm_vblank.h>
#include "msm_drv.h"
@@ -189,7 +191,7 @@ static int mdp4_modeset_init_intf(struct mdp4_kms *mdp4_kms,
struct msm_drm_private *priv = dev->dev_private;
struct drm_encoder *encoder;
struct drm_connector *connector;
- struct device_node *panel_node;
+ struct drm_bridge *next_bridge;
int dsi_id;
int ret;
@@ -199,27 +201,43 @@ static int mdp4_modeset_init_intf(struct mdp4_kms *mdp4_kms,
* bail out early if there is no panel node (no need to
* initialize LCDC encoder and LVDS connector)
*/
- panel_node = of_graph_get_remote_node(dev->dev->of_node, 0, 0);
- if (!panel_node)
- return 0;
+ next_bridge = devm_drm_of_get_bridge(dev->dev, dev->dev->of_node, 0, 0);
+ if (IS_ERR(next_bridge)) {
+ ret = PTR_ERR(next_bridge);
+ if (ret == -ENODEV)
+ return 0;
+ return ret;
+ }
- encoder = mdp4_lcdc_encoder_init(dev, panel_node);
+ encoder = mdp4_lcdc_encoder_init(dev);
if (IS_ERR(encoder)) {
DRM_DEV_ERROR(dev->dev, "failed to construct LCDC encoder\n");
- of_node_put(panel_node);
return PTR_ERR(encoder);
}
/* LCDC can be hooked to DMA_P (TODO: Add DMA_S later?) */
encoder->possible_crtcs = 1 << DMA_P;
- connector = mdp4_lvds_connector_init(dev, panel_node, encoder);
+ ret = drm_bridge_attach(encoder, next_bridge, NULL, DRM_BRIDGE_ATTACH_NO_CONNECTOR);
+ if (ret) {
+ DRM_DEV_ERROR(dev->dev, "failed to attach LVDS panel/bridge: %d\n", ret);
+
+ return ret;
+ }
+
+ connector = drm_bridge_connector_init(dev, encoder);
if (IS_ERR(connector)) {
DRM_DEV_ERROR(dev->dev, "failed to initialize LVDS connector\n");
- of_node_put(panel_node);
return PTR_ERR(connector);
}
+ ret = drm_connector_attach_encoder(connector, encoder);
+ if (ret) {
+ DRM_DEV_ERROR(dev->dev, "failed to attach LVDS connector: %d\n", ret);
+
+ return ret;
+ }
+
break;
case DRM_MODE_ENCODER_TMDS:
encoder = mdp4_dtv_encoder_init(dev);
diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h
index e0380d3b7e0cee99c4c376bf6369887106f44ede..306f5ca8f810aaeecea56e74065933bbffcb67ec 100644
--- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h
+++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h
@@ -191,11 +191,7 @@ struct drm_crtc *mdp4_crtc_init(struct drm_device *dev,
long mdp4_dtv_round_pixclk(struct drm_encoder *encoder, unsigned long rate);
struct drm_encoder *mdp4_dtv_encoder_init(struct drm_device *dev);
-struct drm_encoder *mdp4_lcdc_encoder_init(struct drm_device *dev,
- struct device_node *panel_node);
-
-struct drm_connector *mdp4_lvds_connector_init(struct drm_device *dev,
- struct device_node *panel_node, struct drm_encoder *encoder);
+struct drm_encoder *mdp4_lcdc_encoder_init(struct drm_device *dev);
#ifdef CONFIG_DRM_MSM_DSI
struct drm_encoder *mdp4_dsi_encoder_init(struct drm_device *dev);
diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c
index cfcedd8a635cf0297365e845ef415a8f0d553183..a4f3edabefbd06286bfb8fbcd7f8c0a4281e5ef1 100644
--- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c
+++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c
@@ -14,7 +14,6 @@
struct mdp4_lcdc_encoder {
struct drm_encoder base;
- struct device_node *panel_node;
struct drm_panel *panel;
struct clk *lcdc_clk;
unsigned long int pixclock;
@@ -262,19 +261,12 @@ static void mdp4_lcdc_encoder_disable(struct drm_encoder *encoder)
struct mdp4_lcdc_encoder *mdp4_lcdc_encoder =
to_mdp4_lcdc_encoder(encoder);
struct mdp4_kms *mdp4_kms = get_kms(encoder);
- struct drm_panel *panel;
if (WARN_ON(!mdp4_lcdc_encoder->enabled))
return;
mdp4_write(mdp4_kms, REG_MDP4_LCDC_ENABLE, 0);
- panel = of_drm_find_panel(mdp4_lcdc_encoder->panel_node);
- if (!IS_ERR(panel)) {
- drm_panel_disable(panel);
- drm_panel_unprepare(panel);
- }
-
/*
* Wait for a vsync so we know the ENABLE=0 latched before
* the (connector) source of the vsync's gets disabled,
@@ -300,7 +292,6 @@ static void mdp4_lcdc_encoder_enable(struct drm_encoder *encoder)
to_mdp4_lcdc_encoder(encoder);
unsigned long pc = mdp4_lcdc_encoder->pixclock;
struct mdp4_kms *mdp4_kms = get_kms(encoder);
- struct drm_panel *panel;
uint32_t config;
int ret;
@@ -335,12 +326,6 @@ static void mdp4_lcdc_encoder_enable(struct drm_encoder *encoder)
if (ret)
DRM_DEV_ERROR(dev->dev, "failed to enable lcdc_clk: %d\n", ret);
- panel = of_drm_find_panel(mdp4_lcdc_encoder->panel_node);
- if (!IS_ERR(panel)) {
- drm_panel_prepare(panel);
- drm_panel_enable(panel);
- }
-
setup_phy(encoder);
mdp4_write(mdp4_kms, REG_MDP4_LCDC_ENABLE, 1);
@@ -375,8 +360,7 @@ static const struct drm_encoder_helper_funcs mdp4_lcdc_encoder_helper_funcs = {
};
/* initialize encoder */
-struct drm_encoder *mdp4_lcdc_encoder_init(struct drm_device *dev,
- struct device_node *panel_node)
+struct drm_encoder *mdp4_lcdc_encoder_init(struct drm_device *dev)
{
struct drm_encoder *encoder;
struct mdp4_lcdc_encoder *mdp4_lcdc_encoder;
@@ -387,8 +371,6 @@ struct drm_encoder *mdp4_lcdc_encoder_init(struct drm_device *dev,
if (IS_ERR(mdp4_lcdc_encoder))
return ERR_CAST(mdp4_lcdc_encoder);
- mdp4_lcdc_encoder->panel_node = panel_node;
-
encoder = &mdp4_lcdc_encoder->base;
drm_encoder_helper_add(encoder, &mdp4_lcdc_encoder_helper_funcs);
diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_lvds_connector.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_lvds_connector.c
deleted file mode 100644
index 4755eb13ef79f313d2be088145c8cd2e615226fe..0000000000000000000000000000000000000000
--- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_lvds_connector.c
+++ /dev/null
@@ -1,100 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * Copyright (C) 2014 Red Hat
- * Author: Rob Clark <robdclark@gmail.com>
- * Author: Vinay Simha <vinaysimha@inforcecomputing.com>
- */
-
-#include "mdp4_kms.h"
-
-struct mdp4_lvds_connector {
- struct drm_connector base;
- struct drm_encoder *encoder;
- struct device_node *panel_node;
- struct drm_panel *panel;
-};
-#define to_mdp4_lvds_connector(x) container_of(x, struct mdp4_lvds_connector, base)
-
-static enum drm_connector_status mdp4_lvds_connector_detect(
- struct drm_connector *connector, bool force)
-{
- struct mdp4_lvds_connector *mdp4_lvds_connector =
- to_mdp4_lvds_connector(connector);
-
- if (!mdp4_lvds_connector->panel) {
- mdp4_lvds_connector->panel =
- of_drm_find_panel(mdp4_lvds_connector->panel_node);
- if (IS_ERR(mdp4_lvds_connector->panel))
- mdp4_lvds_connector->panel = NULL;
- }
-
- return mdp4_lvds_connector->panel ?
- connector_status_connected :
- connector_status_disconnected;
-}
-
-static void mdp4_lvds_connector_destroy(struct drm_connector *connector)
-{
- struct mdp4_lvds_connector *mdp4_lvds_connector =
- to_mdp4_lvds_connector(connector);
-
- drm_connector_cleanup(connector);
-
- kfree(mdp4_lvds_connector);
-}
-
-static int mdp4_lvds_connector_get_modes(struct drm_connector *connector)
-{
- struct mdp4_lvds_connector *mdp4_lvds_connector =
- to_mdp4_lvds_connector(connector);
- struct drm_panel *panel = mdp4_lvds_connector->panel;
- int ret = 0;
-
- if (panel)
- ret = drm_panel_get_modes(panel, connector);
-
- return ret;
-}
-
-static const struct drm_connector_funcs mdp4_lvds_connector_funcs = {
- .detect = mdp4_lvds_connector_detect,
- .fill_modes = drm_helper_probe_single_connector_modes,
- .destroy = mdp4_lvds_connector_destroy,
- .reset = drm_atomic_helper_connector_reset,
- .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
- .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
-};
-
-static const struct drm_connector_helper_funcs mdp4_lvds_connector_helper_funcs = {
- .get_modes = mdp4_lvds_connector_get_modes,
-};
-
-/* initialize connector */
-struct drm_connector *mdp4_lvds_connector_init(struct drm_device *dev,
- struct device_node *panel_node, struct drm_encoder *encoder)
-{
- struct drm_connector *connector = NULL;
- struct mdp4_lvds_connector *mdp4_lvds_connector;
-
- mdp4_lvds_connector = kzalloc(sizeof(*mdp4_lvds_connector), GFP_KERNEL);
- if (!mdp4_lvds_connector)
- return ERR_PTR(-ENOMEM);
-
- mdp4_lvds_connector->encoder = encoder;
- mdp4_lvds_connector->panel_node = panel_node;
-
- connector = &mdp4_lvds_connector->base;
-
- drm_connector_init(dev, connector, &mdp4_lvds_connector_funcs,
- DRM_MODE_CONNECTOR_LVDS);
- drm_connector_helper_add(connector, &mdp4_lvds_connector_helper_funcs);
-
- connector->polled = 0;
-
- connector->interlace_allowed = 0;
- connector->doublescan_allowed = 0;
-
- drm_connector_attach_encoder(connector, encoder);
-
- return connector;
-}
--
2.39.5
^ permalink raw reply related [flat|nested] 21+ messages in thread* Re: [PATCH v3 6/7] drm/msm/mdp4: switch LVDS to use drm_bridge/_connector
2025-02-27 2:25 ` [PATCH v3 6/7] drm/msm/mdp4: switch LVDS to use drm_bridge/_connector Dmitry Baryshkov
@ 2025-04-24 2:04 ` Abhinav Kumar
2025-04-24 10:23 ` Dmitry Baryshkov
0 siblings, 1 reply; 21+ messages in thread
From: Abhinav Kumar @ 2025-04-24 2:04 UTC (permalink / raw)
To: Dmitry Baryshkov, Rob Clark, Sean Paul, Marijn Suijten,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Bjorn Andersson, Konrad Dybcio
Cc: linux-arm-msm, dri-devel, freedreno, devicetree, linux-kernel
On 2/26/2025 6:25 PM, Dmitry Baryshkov wrote:
> LVDS support in MDP4 driver makes use of drm_connector directly. However
> LCDC encoder and LVDS connector are wrappers around drm_panel. Switch
> them to use drm_panel_bridge/drm_bridge_connector. This allows using
> standard interface for the drm_panel and also inserting additional
> bridges between encoder and panel.
>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> ---
> drivers/gpu/drm/msm/Makefile | 1 -
> drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c | 34 +++++--
> drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h | 6 +-
> drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c | 20 +----
> .../gpu/drm/msm/disp/mdp4/mdp4_lvds_connector.c | 100 ---------------------
> 5 files changed, 28 insertions(+), 133 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/Makefile b/drivers/gpu/drm/msm/Makefile
> index 5df20cbeafb8bf07c825a1fd72719d5a56c38613..7a2ada6e2d74a902879e4f12a78ed475e5209ec2 100644
> --- a/drivers/gpu/drm/msm/Makefile
> +++ b/drivers/gpu/drm/msm/Makefile
> @@ -48,7 +48,6 @@ msm-display-$(CONFIG_DRM_MSM_MDP4) += \
> disp/mdp4/mdp4_dsi_encoder.o \
> disp/mdp4/mdp4_dtv_encoder.o \
> disp/mdp4/mdp4_lcdc_encoder.o \
> - disp/mdp4/mdp4_lvds_connector.o \
> disp/mdp4/mdp4_lvds_pll.o \
> disp/mdp4/mdp4_irq.o \
> disp/mdp4/mdp4_kms.o \
> diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
> index 689e210660a5218ed1e2d116073723215af5a187..93c9411eb422bc67b7fedb5ffce4c330310b520f 100644
> --- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
> +++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c
> @@ -6,6 +6,8 @@
>
> #include <linux/delay.h>
>
> +#include <drm/drm_bridge.h>
> +#include <drm/drm_bridge_connector.h>
> #include <drm/drm_vblank.h>
>
> #include "msm_drv.h"
> @@ -189,7 +191,7 @@ static int mdp4_modeset_init_intf(struct mdp4_kms *mdp4_kms,
> struct msm_drm_private *priv = dev->dev_private;
> struct drm_encoder *encoder;
> struct drm_connector *connector;
> - struct device_node *panel_node;
> + struct drm_bridge *next_bridge;
> int dsi_id;
> int ret;
>
> @@ -199,27 +201,43 @@ static int mdp4_modeset_init_intf(struct mdp4_kms *mdp4_kms,
> * bail out early if there is no panel node (no need to
> * initialize LCDC encoder and LVDS connector)
> */
> - panel_node = of_graph_get_remote_node(dev->dev->of_node, 0, 0);
> - if (!panel_node)
> - return 0;
> + next_bridge = devm_drm_of_get_bridge(dev->dev, dev->dev->of_node, 0, 0);
> + if (IS_ERR(next_bridge)) {
> + ret = PTR_ERR(next_bridge);
> + if (ret == -ENODEV)
> + return 0;
> + return ret;
> + }
>
> - encoder = mdp4_lcdc_encoder_init(dev, panel_node);
> + encoder = mdp4_lcdc_encoder_init(dev);
> if (IS_ERR(encoder)) {
> DRM_DEV_ERROR(dev->dev, "failed to construct LCDC encoder\n");
> - of_node_put(panel_node);
> return PTR_ERR(encoder);
> }
>
> /* LCDC can be hooked to DMA_P (TODO: Add DMA_S later?) */
> encoder->possible_crtcs = 1 << DMA_P;
>
> - connector = mdp4_lvds_connector_init(dev, panel_node, encoder);
> + ret = drm_bridge_attach(encoder, next_bridge, NULL, DRM_BRIDGE_ATTACH_NO_CONNECTOR);
> + if (ret) {
> + DRM_DEV_ERROR(dev->dev, "failed to attach LVDS panel/bridge: %d\n", ret);
> +
> + return ret;
> + }
Can you pls point me to the lvds bridge used with this apq8064 board? I
was unable to find it. Just wanted to compare that against this while
reviewing.
> +
> + connector = drm_bridge_connector_init(dev, encoder);
> if (IS_ERR(connector)) {
> DRM_DEV_ERROR(dev->dev, "failed to initialize LVDS connector\n");
> - of_node_put(panel_node);
> return PTR_ERR(connector);
> }
>
> + ret = drm_connector_attach_encoder(connector, encoder);
> + if (ret) {
> + DRM_DEV_ERROR(dev->dev, "failed to attach LVDS connector: %d\n", ret);
> +
> + return ret;
> + }
> +
> break;
> case DRM_MODE_ENCODER_TMDS:
> encoder = mdp4_dtv_encoder_init(dev);
> diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h
> index e0380d3b7e0cee99c4c376bf6369887106f44ede..306f5ca8f810aaeecea56e74065933bbffcb67ec 100644
> --- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h
> +++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h
> @@ -191,11 +191,7 @@ struct drm_crtc *mdp4_crtc_init(struct drm_device *dev,
> long mdp4_dtv_round_pixclk(struct drm_encoder *encoder, unsigned long rate);
> struct drm_encoder *mdp4_dtv_encoder_init(struct drm_device *dev);
>
> -struct drm_encoder *mdp4_lcdc_encoder_init(struct drm_device *dev,
> - struct device_node *panel_node);
> -
> -struct drm_connector *mdp4_lvds_connector_init(struct drm_device *dev,
> - struct device_node *panel_node, struct drm_encoder *encoder);
> +struct drm_encoder *mdp4_lcdc_encoder_init(struct drm_device *dev);
>
> #ifdef CONFIG_DRM_MSM_DSI
> struct drm_encoder *mdp4_dsi_encoder_init(struct drm_device *dev);
> diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c
> index cfcedd8a635cf0297365e845ef415a8f0d553183..a4f3edabefbd06286bfb8fbcd7f8c0a4281e5ef1 100644
> --- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c
> +++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c
> @@ -14,7 +14,6 @@
>
> struct mdp4_lcdc_encoder {
> struct drm_encoder base;
> - struct device_node *panel_node;
> struct drm_panel *panel;
> struct clk *lcdc_clk;
> unsigned long int pixclock;
> @@ -262,19 +261,12 @@ static void mdp4_lcdc_encoder_disable(struct drm_encoder *encoder)
> struct mdp4_lcdc_encoder *mdp4_lcdc_encoder =
> to_mdp4_lcdc_encoder(encoder);
> struct mdp4_kms *mdp4_kms = get_kms(encoder);
> - struct drm_panel *panel;
>
> if (WARN_ON(!mdp4_lcdc_encoder->enabled))
> return;
>
> mdp4_write(mdp4_kms, REG_MDP4_LCDC_ENABLE, 0);
>
> - panel = of_drm_find_panel(mdp4_lcdc_encoder->panel_node);
> - if (!IS_ERR(panel)) {
> - drm_panel_disable(panel);
> - drm_panel_unprepare(panel);
> - }
> -
> /*
> * Wait for a vsync so we know the ENABLE=0 latched before
> * the (connector) source of the vsync's gets disabled,
> @@ -300,7 +292,6 @@ static void mdp4_lcdc_encoder_enable(struct drm_encoder *encoder)
> to_mdp4_lcdc_encoder(encoder);
> unsigned long pc = mdp4_lcdc_encoder->pixclock;
> struct mdp4_kms *mdp4_kms = get_kms(encoder);
> - struct drm_panel *panel;
> uint32_t config;
> int ret;
>
> @@ -335,12 +326,6 @@ static void mdp4_lcdc_encoder_enable(struct drm_encoder *encoder)
> if (ret)
> DRM_DEV_ERROR(dev->dev, "failed to enable lcdc_clk: %d\n", ret);
>
> - panel = of_drm_find_panel(mdp4_lcdc_encoder->panel_node);
> - if (!IS_ERR(panel)) {
> - drm_panel_prepare(panel);
> - drm_panel_enable(panel);
> - }
> -
> setup_phy(encoder);
>
> mdp4_write(mdp4_kms, REG_MDP4_LCDC_ENABLE, 1);
> @@ -375,8 +360,7 @@ static const struct drm_encoder_helper_funcs mdp4_lcdc_encoder_helper_funcs = {
> };
>
> /* initialize encoder */
> -struct drm_encoder *mdp4_lcdc_encoder_init(struct drm_device *dev,
> - struct device_node *panel_node)
> +struct drm_encoder *mdp4_lcdc_encoder_init(struct drm_device *dev)
> {
> struct drm_encoder *encoder;
> struct mdp4_lcdc_encoder *mdp4_lcdc_encoder;
> @@ -387,8 +371,6 @@ struct drm_encoder *mdp4_lcdc_encoder_init(struct drm_device *dev,
> if (IS_ERR(mdp4_lcdc_encoder))
> return ERR_CAST(mdp4_lcdc_encoder);
>
> - mdp4_lcdc_encoder->panel_node = panel_node;
> -
> encoder = &mdp4_lcdc_encoder->base;
>
> drm_encoder_helper_add(encoder, &mdp4_lcdc_encoder_helper_funcs);
> diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_lvds_connector.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_lvds_connector.c
> deleted file mode 100644
> index 4755eb13ef79f313d2be088145c8cd2e615226fe..0000000000000000000000000000000000000000
> --- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_lvds_connector.c
> +++ /dev/null
> @@ -1,100 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0-only
> -/*
> - * Copyright (C) 2014 Red Hat
> - * Author: Rob Clark <robdclark@gmail.com>
> - * Author: Vinay Simha <vinaysimha@inforcecomputing.com>
> - */
> -
> -#include "mdp4_kms.h"
> -
> -struct mdp4_lvds_connector {
> - struct drm_connector base;
> - struct drm_encoder *encoder;
> - struct device_node *panel_node;
> - struct drm_panel *panel;
> -};
> -#define to_mdp4_lvds_connector(x) container_of(x, struct mdp4_lvds_connector, base)
> -
> -static enum drm_connector_status mdp4_lvds_connector_detect(
> - struct drm_connector *connector, bool force)
> -{
> - struct mdp4_lvds_connector *mdp4_lvds_connector =
> - to_mdp4_lvds_connector(connector);
> -
> - if (!mdp4_lvds_connector->panel) {
> - mdp4_lvds_connector->panel =
> - of_drm_find_panel(mdp4_lvds_connector->panel_node);
> - if (IS_ERR(mdp4_lvds_connector->panel))
> - mdp4_lvds_connector->panel = NULL;
> - }
> -
> - return mdp4_lvds_connector->panel ?
> - connector_status_connected :
> - connector_status_disconnected;
> -}
> -
> -static void mdp4_lvds_connector_destroy(struct drm_connector *connector)
> -{
> - struct mdp4_lvds_connector *mdp4_lvds_connector =
> - to_mdp4_lvds_connector(connector);
> -
> - drm_connector_cleanup(connector);
> -
> - kfree(mdp4_lvds_connector);
> -}
> -
> -static int mdp4_lvds_connector_get_modes(struct drm_connector *connector)
> -{
> - struct mdp4_lvds_connector *mdp4_lvds_connector =
> - to_mdp4_lvds_connector(connector);
> - struct drm_panel *panel = mdp4_lvds_connector->panel;
> - int ret = 0;
> -
> - if (panel)
> - ret = drm_panel_get_modes(panel, connector);
> -
> - return ret;
> -}
> -
> -static const struct drm_connector_funcs mdp4_lvds_connector_funcs = {
> - .detect = mdp4_lvds_connector_detect,
> - .fill_modes = drm_helper_probe_single_connector_modes,
> - .destroy = mdp4_lvds_connector_destroy,
> - .reset = drm_atomic_helper_connector_reset,
> - .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
> - .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
> -};
> -
> -static const struct drm_connector_helper_funcs mdp4_lvds_connector_helper_funcs = {
> - .get_modes = mdp4_lvds_connector_get_modes,
> -};
> -
> -/* initialize connector */
> -struct drm_connector *mdp4_lvds_connector_init(struct drm_device *dev,
> - struct device_node *panel_node, struct drm_encoder *encoder)
> -{
> - struct drm_connector *connector = NULL;
> - struct mdp4_lvds_connector *mdp4_lvds_connector;
> -
> - mdp4_lvds_connector = kzalloc(sizeof(*mdp4_lvds_connector), GFP_KERNEL);
> - if (!mdp4_lvds_connector)
> - return ERR_PTR(-ENOMEM);
> -
> - mdp4_lvds_connector->encoder = encoder;
> - mdp4_lvds_connector->panel_node = panel_node;
> -
> - connector = &mdp4_lvds_connector->base;
> -
> - drm_connector_init(dev, connector, &mdp4_lvds_connector_funcs,
> - DRM_MODE_CONNECTOR_LVDS);
> - drm_connector_helper_add(connector, &mdp4_lvds_connector_helper_funcs);
> -
> - connector->polled = 0;
> -
> - connector->interlace_allowed = 0;
> - connector->doublescan_allowed = 0;
> -
> - drm_connector_attach_encoder(connector, encoder);
> -
> - return connector;
> -}
>
^ permalink raw reply [flat|nested] 21+ messages in thread* Re: [PATCH v3 6/7] drm/msm/mdp4: switch LVDS to use drm_bridge/_connector
2025-04-24 2:04 ` Abhinav Kumar
@ 2025-04-24 10:23 ` Dmitry Baryshkov
2025-04-24 21:00 ` Abhinav Kumar
0 siblings, 1 reply; 21+ messages in thread
From: Dmitry Baryshkov @ 2025-04-24 10:23 UTC (permalink / raw)
To: Abhinav Kumar
Cc: Dmitry Baryshkov, Rob Clark, Sean Paul, Marijn Suijten,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Bjorn Andersson, Konrad Dybcio, linux-arm-msm, dri-devel,
freedreno, devicetree, linux-kernel
On Wed, Apr 23, 2025 at 07:04:16PM -0700, Abhinav Kumar wrote:
>
>
> On 2/26/2025 6:25 PM, Dmitry Baryshkov wrote:
> > LVDS support in MDP4 driver makes use of drm_connector directly. However
> > LCDC encoder and LVDS connector are wrappers around drm_panel. Switch
> > them to use drm_panel_bridge/drm_bridge_connector. This allows using
> > standard interface for the drm_panel and also inserting additional
> > bridges between encoder and panel.
> >
> > Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> > ---
> > drivers/gpu/drm/msm/Makefile | 1 -
> > drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c | 34 +++++--
> > drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h | 6 +-
> > drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c | 20 +----
> > .../gpu/drm/msm/disp/mdp4/mdp4_lvds_connector.c | 100 ---------------------
> > 5 files changed, 28 insertions(+), 133 deletions(-)
> >
> > @@ -199,27 +201,43 @@ static int mdp4_modeset_init_intf(struct mdp4_kms *mdp4_kms,
> > * bail out early if there is no panel node (no need to
> > * initialize LCDC encoder and LVDS connector)
> > */
> > - panel_node = of_graph_get_remote_node(dev->dev->of_node, 0, 0);
> > - if (!panel_node)
> > - return 0;
> > + next_bridge = devm_drm_of_get_bridge(dev->dev, dev->dev->of_node, 0, 0);
> > + if (IS_ERR(next_bridge)) {
> > + ret = PTR_ERR(next_bridge);
> > + if (ret == -ENODEV)
> > + return 0;
> > + return ret;
> > + }
> > - encoder = mdp4_lcdc_encoder_init(dev, panel_node);
> > + encoder = mdp4_lcdc_encoder_init(dev);
> > if (IS_ERR(encoder)) {
> > DRM_DEV_ERROR(dev->dev, "failed to construct LCDC encoder\n");
> > - of_node_put(panel_node);
> > return PTR_ERR(encoder);
> > }
> > /* LCDC can be hooked to DMA_P (TODO: Add DMA_S later?) */
> > encoder->possible_crtcs = 1 << DMA_P;
> > - connector = mdp4_lvds_connector_init(dev, panel_node, encoder);
> > + ret = drm_bridge_attach(encoder, next_bridge, NULL, DRM_BRIDGE_ATTACH_NO_CONNECTOR);
> > + if (ret) {
> > + DRM_DEV_ERROR(dev->dev, "failed to attach LVDS panel/bridge: %d\n", ret);
> > +
> > + return ret;
> > + }
>
> Can you pls point me to the lvds bridge used with this apq8064 board? I was
> unable to find it. Just wanted to compare that against this while reviewing.
It's the panel bridge, wrapping one of the LVDS panels.
> > +
> > + connector = drm_bridge_connector_init(dev, encoder);
> > if (IS_ERR(connector)) {
> > DRM_DEV_ERROR(dev->dev, "failed to initialize LVDS connector\n");
> > - of_node_put(panel_node);
> > return PTR_ERR(connector);
> > }
> > + ret = drm_connector_attach_encoder(connector, encoder);
> > + if (ret) {
> > + DRM_DEV_ERROR(dev->dev, "failed to attach LVDS connector: %d\n", ret);
> > +
> > + return ret;
> > + }
> > +
> > break;
> > case DRM_MODE_ENCODER_TMDS:
> > encoder = mdp4_dtv_encoder_init(dev);
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 21+ messages in thread* Re: [PATCH v3 6/7] drm/msm/mdp4: switch LVDS to use drm_bridge/_connector
2025-04-24 10:23 ` Dmitry Baryshkov
@ 2025-04-24 21:00 ` Abhinav Kumar
2025-04-25 9:27 ` Dmitry Baryshkov
0 siblings, 1 reply; 21+ messages in thread
From: Abhinav Kumar @ 2025-04-24 21:00 UTC (permalink / raw)
To: Dmitry Baryshkov
Cc: Dmitry Baryshkov, Rob Clark, Sean Paul, Marijn Suijten,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Bjorn Andersson, Konrad Dybcio, linux-arm-msm, dri-devel,
freedreno, devicetree, linux-kernel
On 4/24/2025 3:23 AM, Dmitry Baryshkov wrote:
> On Wed, Apr 23, 2025 at 07:04:16PM -0700, Abhinav Kumar wrote:
>>
>>
>> On 2/26/2025 6:25 PM, Dmitry Baryshkov wrote:
>>> LVDS support in MDP4 driver makes use of drm_connector directly. However
>>> LCDC encoder and LVDS connector are wrappers around drm_panel. Switch
>>> them to use drm_panel_bridge/drm_bridge_connector. This allows using
>>> standard interface for the drm_panel and also inserting additional
>>> bridges between encoder and panel.
>>>
>>> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
>>> ---
>>> drivers/gpu/drm/msm/Makefile | 1 -
>>> drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c | 34 +++++--
>>> drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h | 6 +-
>>> drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c | 20 +----
>>> .../gpu/drm/msm/disp/mdp4/mdp4_lvds_connector.c | 100 ---------------------
>>> 5 files changed, 28 insertions(+), 133 deletions(-)
>>>
>>> @@ -199,27 +201,43 @@ static int mdp4_modeset_init_intf(struct mdp4_kms *mdp4_kms,
>>> * bail out early if there is no panel node (no need to
>>> * initialize LCDC encoder and LVDS connector)
>>> */
>>> - panel_node = of_graph_get_remote_node(dev->dev->of_node, 0, 0);
>>> - if (!panel_node)
>>> - return 0;
>>> + next_bridge = devm_drm_of_get_bridge(dev->dev, dev->dev->of_node, 0, 0);
>>> + if (IS_ERR(next_bridge)) {
>>> + ret = PTR_ERR(next_bridge);
>>> + if (ret == -ENODEV)
>>> + return 0;
>>> + return ret;
>>> + }
>>> - encoder = mdp4_lcdc_encoder_init(dev, panel_node);
>>> + encoder = mdp4_lcdc_encoder_init(dev);
>>> if (IS_ERR(encoder)) {
>>> DRM_DEV_ERROR(dev->dev, "failed to construct LCDC encoder\n");
>>> - of_node_put(panel_node);
>>> return PTR_ERR(encoder);
>>> }
>>> /* LCDC can be hooked to DMA_P (TODO: Add DMA_S later?) */
>>> encoder->possible_crtcs = 1 << DMA_P;
>>> - connector = mdp4_lvds_connector_init(dev, panel_node, encoder);
>>> + ret = drm_bridge_attach(encoder, next_bridge, NULL, DRM_BRIDGE_ATTACH_NO_CONNECTOR);
>>> + if (ret) {
>>> + DRM_DEV_ERROR(dev->dev, "failed to attach LVDS panel/bridge: %d\n", ret);
>>> +
>>> + return ret;
>>> + }
>>
>> Can you pls point me to the lvds bridge used with this apq8064 board? I was
>> unable to find it. Just wanted to compare that against this while reviewing.
>
> It's the panel bridge, wrapping one of the LVDS panels.
>
Yes but what I wanted to check was which LVDS panel was being used so
far. Looks like for arm32 the dts is missing? As I couldnt find the lvds
out endpoint. So can you pls point me to the lvds panel you verified
this with?
>>> +
>>> + connector = drm_bridge_connector_init(dev, encoder);
>>> if (IS_ERR(connector)) {
>>> DRM_DEV_ERROR(dev->dev, "failed to initialize LVDS connector\n");
>>> - of_node_put(panel_node);
>>> return PTR_ERR(connector);
>>> }
>>> + ret = drm_connector_attach_encoder(connector, encoder);
>>> + if (ret) {
>>> + DRM_DEV_ERROR(dev->dev, "failed to attach LVDS connector: %d\n", ret);
>>> +
>>> + return ret;
>>> + }
>>> +
>>> break;
>>> case DRM_MODE_ENCODER_TMDS:
>>> encoder = mdp4_dtv_encoder_init(dev);
>
^ permalink raw reply [flat|nested] 21+ messages in thread* Re: [PATCH v3 6/7] drm/msm/mdp4: switch LVDS to use drm_bridge/_connector
2025-04-24 21:00 ` Abhinav Kumar
@ 2025-04-25 9:27 ` Dmitry Baryshkov
2025-04-25 20:01 ` Abhinav Kumar
0 siblings, 1 reply; 21+ messages in thread
From: Dmitry Baryshkov @ 2025-04-25 9:27 UTC (permalink / raw)
To: Abhinav Kumar
Cc: Dmitry Baryshkov, Rob Clark, Sean Paul, Marijn Suijten,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Bjorn Andersson, Konrad Dybcio, linux-arm-msm, dri-devel,
freedreno, devicetree, linux-kernel
On Fri, 25 Apr 2025 at 00:00, Abhinav Kumar <quic_abhinavk@quicinc.com> wrote:
>
>
>
> On 4/24/2025 3:23 AM, Dmitry Baryshkov wrote:
> > On Wed, Apr 23, 2025 at 07:04:16PM -0700, Abhinav Kumar wrote:
> >>
> >>
> >> On 2/26/2025 6:25 PM, Dmitry Baryshkov wrote:
> >>> LVDS support in MDP4 driver makes use of drm_connector directly. However
> >>> LCDC encoder and LVDS connector are wrappers around drm_panel. Switch
> >>> them to use drm_panel_bridge/drm_bridge_connector. This allows using
> >>> standard interface for the drm_panel and also inserting additional
> >>> bridges between encoder and panel.
> >>>
> >>> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> >>> ---
> >>> drivers/gpu/drm/msm/Makefile | 1 -
> >>> drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c | 34 +++++--
> >>> drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h | 6 +-
> >>> drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c | 20 +----
> >>> .../gpu/drm/msm/disp/mdp4/mdp4_lvds_connector.c | 100 ---------------------
> >>> 5 files changed, 28 insertions(+), 133 deletions(-)
> >>>
> >>> @@ -199,27 +201,43 @@ static int mdp4_modeset_init_intf(struct mdp4_kms *mdp4_kms,
> >>> * bail out early if there is no panel node (no need to
> >>> * initialize LCDC encoder and LVDS connector)
> >>> */
> >>> - panel_node = of_graph_get_remote_node(dev->dev->of_node, 0, 0);
> >>> - if (!panel_node)
> >>> - return 0;
> >>> + next_bridge = devm_drm_of_get_bridge(dev->dev, dev->dev->of_node, 0, 0);
> >>> + if (IS_ERR(next_bridge)) {
> >>> + ret = PTR_ERR(next_bridge);
> >>> + if (ret == -ENODEV)
> >>> + return 0;
> >>> + return ret;
> >>> + }
> >>> - encoder = mdp4_lcdc_encoder_init(dev, panel_node);
> >>> + encoder = mdp4_lcdc_encoder_init(dev);
> >>> if (IS_ERR(encoder)) {
> >>> DRM_DEV_ERROR(dev->dev, "failed to construct LCDC encoder\n");
> >>> - of_node_put(panel_node);
> >>> return PTR_ERR(encoder);
> >>> }
> >>> /* LCDC can be hooked to DMA_P (TODO: Add DMA_S later?) */
> >>> encoder->possible_crtcs = 1 << DMA_P;
> >>> - connector = mdp4_lvds_connector_init(dev, panel_node, encoder);
> >>> + ret = drm_bridge_attach(encoder, next_bridge, NULL, DRM_BRIDGE_ATTACH_NO_CONNECTOR);
> >>> + if (ret) {
> >>> + DRM_DEV_ERROR(dev->dev, "failed to attach LVDS panel/bridge: %d\n", ret);
> >>> +
> >>> + return ret;
> >>> + }
> >>
> >> Can you pls point me to the lvds bridge used with this apq8064 board? I was
> >> unable to find it. Just wanted to compare that against this while reviewing.
> >
> > It's the panel bridge, wrapping one of the LVDS panels.
> >
>
> Yes but what I wanted to check was which LVDS panel was being used so
> far. Looks like for arm32 the dts is missing? As I couldnt find the lvds
> out endpoint. So can you pls point me to the lvds panel you verified
> this with?
I used the AUO b101xtn01 panel connected to the LVDS connector on the
IFC6410. I'm not posting DT bits since the panel is not a part of the
kit.
>
>
> >>> +
> >>> + connector = drm_bridge_connector_init(dev, encoder);
> >>> if (IS_ERR(connector)) {
> >>> DRM_DEV_ERROR(dev->dev, "failed to initialize LVDS connector\n");
> >>> - of_node_put(panel_node);
> >>> return PTR_ERR(connector);
> >>> }
> >>> + ret = drm_connector_attach_encoder(connector, encoder);
> >>> + if (ret) {
> >>> + DRM_DEV_ERROR(dev->dev, "failed to attach LVDS connector: %d\n", ret);
> >>> +
> >>> + return ret;
> >>> + }
> >>> +
> >>> break;
> >>> case DRM_MODE_ENCODER_TMDS:
> >>> encoder = mdp4_dtv_encoder_init(dev);
> >
>
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 21+ messages in thread* Re: [PATCH v3 6/7] drm/msm/mdp4: switch LVDS to use drm_bridge/_connector
2025-04-25 9:27 ` Dmitry Baryshkov
@ 2025-04-25 20:01 ` Abhinav Kumar
2025-04-25 22:05 ` Dmitry Baryshkov
0 siblings, 1 reply; 21+ messages in thread
From: Abhinav Kumar @ 2025-04-25 20:01 UTC (permalink / raw)
To: Dmitry Baryshkov
Cc: Dmitry Baryshkov, Rob Clark, Sean Paul, Marijn Suijten,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Bjorn Andersson, Konrad Dybcio, linux-arm-msm, dri-devel,
freedreno, devicetree, linux-kernel
On 4/25/2025 2:27 AM, Dmitry Baryshkov wrote:
> On Fri, 25 Apr 2025 at 00:00, Abhinav Kumar <quic_abhinavk@quicinc.com> wrote:
>>
>>
>>
>> On 4/24/2025 3:23 AM, Dmitry Baryshkov wrote:
>>> On Wed, Apr 23, 2025 at 07:04:16PM -0700, Abhinav Kumar wrote:
>>>>
>>>>
>>>> On 2/26/2025 6:25 PM, Dmitry Baryshkov wrote:
>>>>> LVDS support in MDP4 driver makes use of drm_connector directly. However
>>>>> LCDC encoder and LVDS connector are wrappers around drm_panel. Switch
>>>>> them to use drm_panel_bridge/drm_bridge_connector. This allows using
>>>>> standard interface for the drm_panel and also inserting additional
>>>>> bridges between encoder and panel.
>>>>>
>>>>> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
>>>>> ---
>>>>> drivers/gpu/drm/msm/Makefile | 1 -
>>>>> drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c | 34 +++++--
>>>>> drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h | 6 +-
>>>>> drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c | 20 +----
>>>>> .../gpu/drm/msm/disp/mdp4/mdp4_lvds_connector.c | 100 ---------------------
>>>>> 5 files changed, 28 insertions(+), 133 deletions(-)
>>>>>
>>>>> @@ -199,27 +201,43 @@ static int mdp4_modeset_init_intf(struct mdp4_kms *mdp4_kms,
>>>>> * bail out early if there is no panel node (no need to
>>>>> * initialize LCDC encoder and LVDS connector)
>>>>> */
>>>>> - panel_node = of_graph_get_remote_node(dev->dev->of_node, 0, 0);
>>>>> - if (!panel_node)
>>>>> - return 0;
>>>>> + next_bridge = devm_drm_of_get_bridge(dev->dev, dev->dev->of_node, 0, 0);
>>>>> + if (IS_ERR(next_bridge)) {
>>>>> + ret = PTR_ERR(next_bridge);
>>>>> + if (ret == -ENODEV)
>>>>> + return 0;
>>>>> + return ret;
>>>>> + }
>>>>> - encoder = mdp4_lcdc_encoder_init(dev, panel_node);
>>>>> + encoder = mdp4_lcdc_encoder_init(dev);
>>>>> if (IS_ERR(encoder)) {
>>>>> DRM_DEV_ERROR(dev->dev, "failed to construct LCDC encoder\n");
>>>>> - of_node_put(panel_node);
>>>>> return PTR_ERR(encoder);
>>>>> }
>>>>> /* LCDC can be hooked to DMA_P (TODO: Add DMA_S later?) */
>>>>> encoder->possible_crtcs = 1 << DMA_P;
>>>>> - connector = mdp4_lvds_connector_init(dev, panel_node, encoder);
>>>>> + ret = drm_bridge_attach(encoder, next_bridge, NULL, DRM_BRIDGE_ATTACH_NO_CONNECTOR);
>>>>> + if (ret) {
>>>>> + DRM_DEV_ERROR(dev->dev, "failed to attach LVDS panel/bridge: %d\n", ret);
>>>>> +
>>>>> + return ret;
>>>>> + }
>>>>
>>>> Can you pls point me to the lvds bridge used with this apq8064 board? I was
>>>> unable to find it. Just wanted to compare that against this while reviewing.
>>>
>>> It's the panel bridge, wrapping one of the LVDS panels.
>>>
>>
>> Yes but what I wanted to check was which LVDS panel was being used so
>> far. Looks like for arm32 the dts is missing? As I couldnt find the lvds
>> out endpoint. So can you pls point me to the lvds panel you verified
>> this with?
>
> I used the AUO b101xtn01 panel connected to the LVDS connector on the
> IFC6410. I'm not posting DT bits since the panel is not a part of the
> kit.
>
Ok, so at this point of time, this is just the driver piece which does
not have a real HW in the tree to be verified with.
>>
>>
>>>>> +
>>>>> + connector = drm_bridge_connector_init(dev, encoder);
>>>>> if (IS_ERR(connector)) {
>>>>> DRM_DEV_ERROR(dev->dev, "failed to initialize LVDS connector\n");
>>>>> - of_node_put(panel_node);
>>>>> return PTR_ERR(connector);
>>>>> }
>>>>> + ret = drm_connector_attach_encoder(connector, encoder);
>>>>> + if (ret) {
>>>>> + DRM_DEV_ERROR(dev->dev, "failed to attach LVDS connector: %d\n", ret);
>>>>> +
>>>>> + return ret;
>>>>> + }
>>>>> +
>>>>> break;
>>>>> case DRM_MODE_ENCODER_TMDS:
>>>>> encoder = mdp4_dtv_encoder_init(dev);
>>>
>>
>
>
^ permalink raw reply [flat|nested] 21+ messages in thread* Re: [PATCH v3 6/7] drm/msm/mdp4: switch LVDS to use drm_bridge/_connector
2025-04-25 20:01 ` Abhinav Kumar
@ 2025-04-25 22:05 ` Dmitry Baryshkov
0 siblings, 0 replies; 21+ messages in thread
From: Dmitry Baryshkov @ 2025-04-25 22:05 UTC (permalink / raw)
To: Abhinav Kumar
Cc: Dmitry Baryshkov, Rob Clark, Sean Paul, Marijn Suijten,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Bjorn Andersson, Konrad Dybcio, linux-arm-msm, dri-devel,
freedreno, devicetree, linux-kernel
On Fri, Apr 25, 2025 at 01:01:10PM -0700, Abhinav Kumar wrote:
>
>
> On 4/25/2025 2:27 AM, Dmitry Baryshkov wrote:
> > On Fri, 25 Apr 2025 at 00:00, Abhinav Kumar <quic_abhinavk@quicinc.com> wrote:
> > >
> > >
> > >
> > > On 4/24/2025 3:23 AM, Dmitry Baryshkov wrote:
> > > > On Wed, Apr 23, 2025 at 07:04:16PM -0700, Abhinav Kumar wrote:
> > > > >
> > > > >
> > > > > On 2/26/2025 6:25 PM, Dmitry Baryshkov wrote:
> > > > > > LVDS support in MDP4 driver makes use of drm_connector directly. However
> > > > > > LCDC encoder and LVDS connector are wrappers around drm_panel. Switch
> > > > > > them to use drm_panel_bridge/drm_bridge_connector. This allows using
> > > > > > standard interface for the drm_panel and also inserting additional
> > > > > > bridges between encoder and panel.
> > > > > >
> > > > > > Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> > > > > > ---
> > > > > > drivers/gpu/drm/msm/Makefile | 1 -
> > > > > > drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c | 34 +++++--
> > > > > > drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.h | 6 +-
> > > > > > drivers/gpu/drm/msm/disp/mdp4/mdp4_lcdc_encoder.c | 20 +----
> > > > > > .../gpu/drm/msm/disp/mdp4/mdp4_lvds_connector.c | 100 ---------------------
> > > > > > 5 files changed, 28 insertions(+), 133 deletions(-)
> > > > > >
> > > > > > @@ -199,27 +201,43 @@ static int mdp4_modeset_init_intf(struct mdp4_kms *mdp4_kms,
> > > > > > * bail out early if there is no panel node (no need to
> > > > > > * initialize LCDC encoder and LVDS connector)
> > > > > > */
> > > > > > - panel_node = of_graph_get_remote_node(dev->dev->of_node, 0, 0);
> > > > > > - if (!panel_node)
> > > > > > - return 0;
> > > > > > + next_bridge = devm_drm_of_get_bridge(dev->dev, dev->dev->of_node, 0, 0);
> > > > > > + if (IS_ERR(next_bridge)) {
> > > > > > + ret = PTR_ERR(next_bridge);
> > > > > > + if (ret == -ENODEV)
> > > > > > + return 0;
> > > > > > + return ret;
> > > > > > + }
> > > > > > - encoder = mdp4_lcdc_encoder_init(dev, panel_node);
> > > > > > + encoder = mdp4_lcdc_encoder_init(dev);
> > > > > > if (IS_ERR(encoder)) {
> > > > > > DRM_DEV_ERROR(dev->dev, "failed to construct LCDC encoder\n");
> > > > > > - of_node_put(panel_node);
> > > > > > return PTR_ERR(encoder);
> > > > > > }
> > > > > > /* LCDC can be hooked to DMA_P (TODO: Add DMA_S later?) */
> > > > > > encoder->possible_crtcs = 1 << DMA_P;
> > > > > > - connector = mdp4_lvds_connector_init(dev, panel_node, encoder);
> > > > > > + ret = drm_bridge_attach(encoder, next_bridge, NULL, DRM_BRIDGE_ATTACH_NO_CONNECTOR);
> > > > > > + if (ret) {
> > > > > > + DRM_DEV_ERROR(dev->dev, "failed to attach LVDS panel/bridge: %d\n", ret);
> > > > > > +
> > > > > > + return ret;
> > > > > > + }
> > > > >
> > > > > Can you pls point me to the lvds bridge used with this apq8064 board? I was
> > > > > unable to find it. Just wanted to compare that against this while reviewing.
> > > >
> > > > It's the panel bridge, wrapping one of the LVDS panels.
> > > >
> > >
> > > Yes but what I wanted to check was which LVDS panel was being used so
> > > far. Looks like for arm32 the dts is missing? As I couldnt find the lvds
> > > out endpoint. So can you pls point me to the lvds panel you verified
> > > this with?
> >
> > I used the AUO b101xtn01 panel connected to the LVDS connector on the
> > IFC6410. I'm not posting DT bits since the panel is not a part of the
> > kit.
> >
>
> Ok, so at this point of time, this is just the driver piece which does not
> have a real HW in the tree to be verified with.
More or less so. Srini tried to push the panel in 2015 ([1]). PR was
rejected and then nobody ever implemented EDID-based selection for LVDS
panels. I simply soldered the LVDS cable and used more or less the same
patch (I can post it separately if necessary). To verify the pipeline
you can use any LVDS panel defined in the DT, it should be enough to
verify it.
[1] https://lore.kernel.org/linux-arm-msm/1438088076-17606-1-git-send-email-srinivas.kandagatla@linaro.org/
>
>
> > >
> > >
> > > > > > +
> > > > > > + connector = drm_bridge_connector_init(dev, encoder);
> > > > > > if (IS_ERR(connector)) {
> > > > > > DRM_DEV_ERROR(dev->dev, "failed to initialize LVDS connector\n");
> > > > > > - of_node_put(panel_node);
> > > > > > return PTR_ERR(connector);
> > > > > > }
> > > > > > + ret = drm_connector_attach_encoder(connector, encoder);
> > > > > > + if (ret) {
> > > > > > + DRM_DEV_ERROR(dev->dev, "failed to attach LVDS connector: %d\n", ret);
> > > > > > +
> > > > > > + return ret;
> > > > > > + }
> > > > > > +
> > > > > > break;
> > > > > > case DRM_MODE_ENCODER_TMDS:
> > > > > > encoder = mdp4_dtv_encoder_init(dev);
> > > >
> > >
> >
> >
>
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH v3 7/7] arm: dts: qcom: apq8064: link LVDS clocks
2025-02-27 2:25 [PATCH v3 0/7] drm/msm/mdp4: rework LVDS/LCDC panel support Dmitry Baryshkov
` (5 preceding siblings ...)
2025-02-27 2:25 ` [PATCH v3 6/7] drm/msm/mdp4: switch LVDS to use drm_bridge/_connector Dmitry Baryshkov
@ 2025-02-27 2:25 ` Dmitry Baryshkov
6 siblings, 0 replies; 21+ messages in thread
From: Dmitry Baryshkov @ 2025-02-27 2:25 UTC (permalink / raw)
To: Rob Clark, Abhinav Kumar, Sean Paul, Marijn Suijten,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Bjorn Andersson, Konrad Dybcio
Cc: linux-arm-msm, dri-devel, freedreno, devicetree, linux-kernel,
Konrad Dybcio
Link LVDS clocks to the from MDP4 to the MMCC and back from the MMCC
to the MDP4 display controller.
Reviewed-by: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
arch/arm/boot/dts/qcom/qcom-apq8064.dtsi | 16 ++++++++++++----
1 file changed, 12 insertions(+), 4 deletions(-)
diff --git a/arch/arm/boot/dts/qcom/qcom-apq8064.dtsi b/arch/arm/boot/dts/qcom/qcom-apq8064.dtsi
index 5f1a6b4b764492486df1a2610979f56c0a37b64a..b884900716464b6291869ff50825762a55099982 100644
--- a/arch/arm/boot/dts/qcom/qcom-apq8064.dtsi
+++ b/arch/arm/boot/dts/qcom/qcom-apq8064.dtsi
@@ -737,7 +737,8 @@ mmcc: clock-controller@4000000 {
<&dsi0_phy 0>,
<&dsi1_phy 1>,
<&dsi1_phy 0>,
- <&hdmi_phy>;
+ <&hdmi_phy>,
+ <&mdp>;
clock-names = "pxo",
"pll3",
"pll8_vote",
@@ -745,7 +746,8 @@ mmcc: clock-controller@4000000 {
"dsi1pllbyte",
"dsi2pll",
"dsi2pllbyte",
- "hdmipll";
+ "hdmipll",
+ "lvdspll";
};
l2cc: clock-controller@2011000 {
@@ -1404,13 +1406,19 @@ mdp: display-controller@5100000 {
<&mmcc MDP_AXI_CLK>,
<&mmcc MDP_LUT_CLK>,
<&mmcc HDMI_TV_CLK>,
- <&mmcc MDP_TV_CLK>;
+ <&mmcc MDP_TV_CLK>,
+ <&mmcc LVDS_CLK>,
+ <&rpmcc RPM_PXO_CLK>;
clock-names = "core_clk",
"iface_clk",
"bus_clk",
"lut_clk",
"hdmi_clk",
- "tv_clk";
+ "tv_clk",
+ "lcdc_clk",
+ "pxo";
+
+ #clock-cells = <0>;
iommus = <&mdp_port0 0
&mdp_port0 2
--
2.39.5
^ permalink raw reply related [flat|nested] 21+ messages in thread