* [PATCH 0/3] i.MX fsl-ldb cleanups
@ 2025-05-14 22:24 Marco Felsch
2025-05-14 22:24 ` [PATCH 1/3] drm/bridge: fsl-ldb: make use of driver_private Marco Felsch
` (2 more replies)
0 siblings, 3 replies; 11+ messages in thread
From: Marco Felsch @ 2025-05-14 22:24 UTC (permalink / raw)
To: andrzej.hajda, neil.armstrong, rfoss, Laurent.pinchart, jonas,
jernej.skrabec, maarten.lankhorst, mripard, tzimmermann, airlied,
simona
Cc: dri-devel, linux-kernel, kernel
Hi,
just a small series to cleanup the fsl-ldb lvds bridge driver a bit.
Regards,
Marco
Marco Felsch (3):
drm/bridge: fsl-ldb: make use of driver_private
drm/bridge: fsl-ldb: make use of dev_err_probe
drm/bridge: fsl-ldb: simplify device_node error handling
drivers/gpu/drm/bridge/fsl-ldb.c | 57 ++++++++++++++------------------
1 file changed, 24 insertions(+), 33 deletions(-)
--
2.39.5
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 1/3] drm/bridge: fsl-ldb: make use of driver_private
2025-05-14 22:24 [PATCH 0/3] i.MX fsl-ldb cleanups Marco Felsch
@ 2025-05-14 22:24 ` Marco Felsch
2025-05-14 22:45 ` Laurent Pinchart
2025-05-14 22:24 ` [PATCH 2/3] drm/bridge: fsl-ldb: make use of dev_err_probe Marco Felsch
2025-05-14 22:24 ` [PATCH 3/3] drm/bridge: fsl-ldb: simplify device_node error handling Marco Felsch
2 siblings, 1 reply; 11+ messages in thread
From: Marco Felsch @ 2025-05-14 22:24 UTC (permalink / raw)
To: andrzej.hajda, neil.armstrong, rfoss, Laurent.pinchart, jonas,
jernej.skrabec, maarten.lankhorst, mripard, tzimmermann, airlied,
simona
Cc: dri-devel, linux-kernel, kernel
Make use of the drm_bridge::driver_private data instead of
container_of() wrapper.
No functional changes.
Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
---
drivers/gpu/drm/bridge/fsl-ldb.c | 14 +++++---------
1 file changed, 5 insertions(+), 9 deletions(-)
diff --git a/drivers/gpu/drm/bridge/fsl-ldb.c b/drivers/gpu/drm/bridge/fsl-ldb.c
index 0fc8a14fd800..fa29f2bf4031 100644
--- a/drivers/gpu/drm/bridge/fsl-ldb.c
+++ b/drivers/gpu/drm/bridge/fsl-ldb.c
@@ -99,11 +99,6 @@ static bool fsl_ldb_is_dual(const struct fsl_ldb *fsl_ldb)
return (fsl_ldb->ch0_enabled && fsl_ldb->ch1_enabled);
}
-static inline struct fsl_ldb *to_fsl_ldb(struct drm_bridge *bridge)
-{
- return container_of(bridge, struct fsl_ldb, bridge);
-}
-
static unsigned long fsl_ldb_link_frequency(struct fsl_ldb *fsl_ldb, int clock)
{
if (fsl_ldb_is_dual(fsl_ldb))
@@ -115,7 +110,7 @@ static unsigned long fsl_ldb_link_frequency(struct fsl_ldb *fsl_ldb, int clock)
static int fsl_ldb_attach(struct drm_bridge *bridge,
enum drm_bridge_attach_flags flags)
{
- struct fsl_ldb *fsl_ldb = to_fsl_ldb(bridge);
+ struct fsl_ldb *fsl_ldb = bridge->driver_private;
return drm_bridge_attach(bridge->encoder, fsl_ldb->panel_bridge,
bridge, flags);
@@ -124,7 +119,7 @@ static int fsl_ldb_attach(struct drm_bridge *bridge,
static void fsl_ldb_atomic_enable(struct drm_bridge *bridge,
struct drm_bridge_state *old_bridge_state)
{
- struct fsl_ldb *fsl_ldb = to_fsl_ldb(bridge);
+ struct fsl_ldb *fsl_ldb = bridge->driver_private;
struct drm_atomic_state *state = old_bridge_state->base.state;
const struct drm_bridge_state *bridge_state;
const struct drm_crtc_state *crtc_state;
@@ -226,7 +221,7 @@ static void fsl_ldb_atomic_enable(struct drm_bridge *bridge,
static void fsl_ldb_atomic_disable(struct drm_bridge *bridge,
struct drm_bridge_state *old_bridge_state)
{
- struct fsl_ldb *fsl_ldb = to_fsl_ldb(bridge);
+ struct fsl_ldb *fsl_ldb = bridge->driver_private;
/* Stop channel(s). */
if (fsl_ldb->devdata->lvds_en_bit)
@@ -270,7 +265,7 @@ fsl_ldb_mode_valid(struct drm_bridge *bridge,
const struct drm_display_info *info,
const struct drm_display_mode *mode)
{
- struct fsl_ldb *fsl_ldb = to_fsl_ldb(bridge);
+ struct fsl_ldb *fsl_ldb = bridge->driver_private;
if (mode->clock > (fsl_ldb_is_dual(fsl_ldb) ? 160000 : 80000))
return MODE_CLOCK_HIGH;
@@ -309,6 +304,7 @@ static int fsl_ldb_probe(struct platform_device *pdev)
fsl_ldb->dev = &pdev->dev;
fsl_ldb->bridge.funcs = &funcs;
fsl_ldb->bridge.of_node = dev->of_node;
+ fsl_ldb->bridge.driver_private = fsl_ldb;
fsl_ldb->clk = devm_clk_get(dev, "ldb");
if (IS_ERR(fsl_ldb->clk))
--
2.39.5
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 2/3] drm/bridge: fsl-ldb: make use of dev_err_probe
2025-05-14 22:24 [PATCH 0/3] i.MX fsl-ldb cleanups Marco Felsch
2025-05-14 22:24 ` [PATCH 1/3] drm/bridge: fsl-ldb: make use of driver_private Marco Felsch
@ 2025-05-14 22:24 ` Marco Felsch
2025-05-14 22:36 ` Laurent Pinchart
2025-05-15 6:21 ` Alexander Stein
2025-05-14 22:24 ` [PATCH 3/3] drm/bridge: fsl-ldb: simplify device_node error handling Marco Felsch
2 siblings, 2 replies; 11+ messages in thread
From: Marco Felsch @ 2025-05-14 22:24 UTC (permalink / raw)
To: andrzej.hajda, neil.armstrong, rfoss, Laurent.pinchart, jonas,
jernej.skrabec, maarten.lankhorst, mripard, tzimmermann, airlied,
simona
Cc: dri-devel, linux-kernel, kernel
Make use of dev_err_probe() to easily spot issues via the debugfs or
kernel log. No functional changes.
Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
---
drivers/gpu/drm/bridge/fsl-ldb.c | 19 ++++++++++---------
1 file changed, 10 insertions(+), 9 deletions(-)
diff --git a/drivers/gpu/drm/bridge/fsl-ldb.c b/drivers/gpu/drm/bridge/fsl-ldb.c
index fa29f2bf4031..e0a229c91953 100644
--- a/drivers/gpu/drm/bridge/fsl-ldb.c
+++ b/drivers/gpu/drm/bridge/fsl-ldb.c
@@ -308,11 +308,13 @@ static int fsl_ldb_probe(struct platform_device *pdev)
fsl_ldb->clk = devm_clk_get(dev, "ldb");
if (IS_ERR(fsl_ldb->clk))
- return PTR_ERR(fsl_ldb->clk);
+ return dev_err_probe(dev, PTR_ERR(fsl_ldb->clk),
+ "Failed to get ldb clk\n");
fsl_ldb->regmap = syscon_node_to_regmap(dev->of_node->parent);
if (IS_ERR(fsl_ldb->regmap))
- return PTR_ERR(fsl_ldb->regmap);
+ return dev_err_probe(dev, PTR_ERR(fsl_ldb->regmap),
+ "Failed to get regmap\n");
/* Locate the remote ports and the panel node */
remote1 = of_graph_get_remote_node(dev->of_node, 1, 0);
@@ -335,12 +337,12 @@ static int fsl_ldb_probe(struct platform_device *pdev)
panel = of_drm_find_panel(panel_node);
of_node_put(panel_node);
if (IS_ERR(panel))
- return PTR_ERR(panel);
+ return dev_err_probe(dev, PTR_ERR(panel), "drm panel not found\n");
fsl_ldb->panel_bridge = devm_drm_panel_bridge_add(dev, panel);
if (IS_ERR(fsl_ldb->panel_bridge))
- return PTR_ERR(fsl_ldb->panel_bridge);
-
+ return dev_err_probe(dev, PTR_ERR(fsl_ldb->panel_bridge),
+ "drm panel-bridge add failed\n");
if (fsl_ldb_is_dual(fsl_ldb)) {
struct device_node *port1, *port2;
@@ -356,10 +358,9 @@ static int fsl_ldb_probe(struct platform_device *pdev)
"Error getting dual link configuration\n");
/* Only DRM_LVDS_DUAL_LINK_ODD_EVEN_PIXELS is supported */
- if (dual_link == DRM_LVDS_DUAL_LINK_EVEN_ODD_PIXELS) {
- dev_err(dev, "LVDS channel pixel swap not supported.\n");
- return -EINVAL;
- }
+ if (dual_link == DRM_LVDS_DUAL_LINK_EVEN_ODD_PIXELS)
+ return dev_err_probe(dev, -EINVAL,
+ "LVDS channel pixel swap not supported.\n");
}
platform_set_drvdata(pdev, fsl_ldb);
--
2.39.5
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 3/3] drm/bridge: fsl-ldb: simplify device_node error handling
2025-05-14 22:24 [PATCH 0/3] i.MX fsl-ldb cleanups Marco Felsch
2025-05-14 22:24 ` [PATCH 1/3] drm/bridge: fsl-ldb: make use of driver_private Marco Felsch
2025-05-14 22:24 ` [PATCH 2/3] drm/bridge: fsl-ldb: make use of dev_err_probe Marco Felsch
@ 2025-05-14 22:24 ` Marco Felsch
2025-05-14 22:44 ` Laurent Pinchart
2 siblings, 1 reply; 11+ messages in thread
From: Marco Felsch @ 2025-05-14 22:24 UTC (permalink / raw)
To: andrzej.hajda, neil.armstrong, rfoss, Laurent.pinchart, jonas,
jernej.skrabec, maarten.lankhorst, mripard, tzimmermann, airlied,
simona
Cc: dri-devel, linux-kernel, kernel
Make use of __free(device_node) to simplify the of_node_put() error
handling paths. No functional changes.
Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
---
drivers/gpu/drm/bridge/fsl-ldb.c | 24 +++++++++---------------
1 file changed, 9 insertions(+), 15 deletions(-)
diff --git a/drivers/gpu/drm/bridge/fsl-ldb.c b/drivers/gpu/drm/bridge/fsl-ldb.c
index e0a229c91953..cea9ddaa5e01 100644
--- a/drivers/gpu/drm/bridge/fsl-ldb.c
+++ b/drivers/gpu/drm/bridge/fsl-ldb.c
@@ -287,8 +287,9 @@ static const struct drm_bridge_funcs funcs = {
static int fsl_ldb_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
- struct device_node *panel_node;
- struct device_node *remote1, *remote2;
+ struct device_node *panel_node __free(device_node) = NULL;
+ struct device_node *remote1 __free(device_node) = NULL;
+ struct device_node *remote2 __free(device_node) = NULL;
struct drm_panel *panel;
struct fsl_ldb *fsl_ldb;
int dual_link;
@@ -321,21 +322,16 @@ static int fsl_ldb_probe(struct platform_device *pdev)
remote2 = of_graph_get_remote_node(dev->of_node, 2, 0);
fsl_ldb->ch0_enabled = (remote1 != NULL);
fsl_ldb->ch1_enabled = (remote2 != NULL);
- panel_node = of_node_get(remote1 ? remote1 : remote2);
- of_node_put(remote1);
- of_node_put(remote2);
+ panel_node = remote1 ? remote1 : remote2;
- if (!fsl_ldb->ch0_enabled && !fsl_ldb->ch1_enabled) {
- of_node_put(panel_node);
+ if (!fsl_ldb->ch0_enabled && !fsl_ldb->ch1_enabled)
return dev_err_probe(dev, -ENXIO, "No panel node found");
- }
dev_dbg(dev, "Using %s\n",
fsl_ldb_is_dual(fsl_ldb) ? "dual-link mode" :
fsl_ldb->ch0_enabled ? "channel 0" : "channel 1");
panel = of_drm_find_panel(panel_node);
- of_node_put(panel_node);
if (IS_ERR(panel))
return dev_err_probe(dev, PTR_ERR(panel), "drm panel not found\n");
@@ -345,14 +341,12 @@ static int fsl_ldb_probe(struct platform_device *pdev)
"drm panel-bridge add failed\n");
if (fsl_ldb_is_dual(fsl_ldb)) {
- struct device_node *port1, *port2;
+ struct device_node *port1 __free(device_node) =
+ of_graph_get_port_by_id(dev->of_node, 1);
+ struct device_node *port2 __free(device_node) =
+ of_graph_get_port_by_id(dev->of_node, 2);
- port1 = of_graph_get_port_by_id(dev->of_node, 1);
- port2 = of_graph_get_port_by_id(dev->of_node, 2);
dual_link = drm_of_lvds_get_dual_link_pixel_order(port1, port2);
- of_node_put(port1);
- of_node_put(port2);
-
if (dual_link < 0)
return dev_err_probe(dev, dual_link,
"Error getting dual link configuration\n");
--
2.39.5
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH 2/3] drm/bridge: fsl-ldb: make use of dev_err_probe
2025-05-14 22:24 ` [PATCH 2/3] drm/bridge: fsl-ldb: make use of dev_err_probe Marco Felsch
@ 2025-05-14 22:36 ` Laurent Pinchart
2025-05-15 6:21 ` Alexander Stein
1 sibling, 0 replies; 11+ messages in thread
From: Laurent Pinchart @ 2025-05-14 22:36 UTC (permalink / raw)
To: Marco Felsch
Cc: andrzej.hajda, neil.armstrong, rfoss, jonas, jernej.skrabec,
maarten.lankhorst, mripard, tzimmermann, airlied, simona,
dri-devel, linux-kernel, kernel
Hi Marco,
Thank you for the patch.
On Thu, May 15, 2025 at 12:24:52AM +0200, Marco Felsch wrote:
> Make use of dev_err_probe() to easily spot issues via the debugfs or
> kernel log. No functional changes.
>
> Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> ---
> drivers/gpu/drm/bridge/fsl-ldb.c | 19 ++++++++++---------
> 1 file changed, 10 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/gpu/drm/bridge/fsl-ldb.c b/drivers/gpu/drm/bridge/fsl-ldb.c
> index fa29f2bf4031..e0a229c91953 100644
> --- a/drivers/gpu/drm/bridge/fsl-ldb.c
> +++ b/drivers/gpu/drm/bridge/fsl-ldb.c
> @@ -308,11 +308,13 @@ static int fsl_ldb_probe(struct platform_device *pdev)
>
> fsl_ldb->clk = devm_clk_get(dev, "ldb");
> if (IS_ERR(fsl_ldb->clk))
> - return PTR_ERR(fsl_ldb->clk);
> + return dev_err_probe(dev, PTR_ERR(fsl_ldb->clk),
> + "Failed to get ldb clk\n");
>
> fsl_ldb->regmap = syscon_node_to_regmap(dev->of_node->parent);
> if (IS_ERR(fsl_ldb->regmap))
> - return PTR_ERR(fsl_ldb->regmap);
> + return dev_err_probe(dev, PTR_ERR(fsl_ldb->regmap),
> + "Failed to get regmap\n");
>
> /* Locate the remote ports and the panel node */
> remote1 = of_graph_get_remote_node(dev->of_node, 1, 0);
> @@ -335,12 +337,12 @@ static int fsl_ldb_probe(struct platform_device *pdev)
> panel = of_drm_find_panel(panel_node);
> of_node_put(panel_node);
> if (IS_ERR(panel))
> - return PTR_ERR(panel);
> + return dev_err_probe(dev, PTR_ERR(panel), "drm panel not found\n");
>
> fsl_ldb->panel_bridge = devm_drm_panel_bridge_add(dev, panel);
> if (IS_ERR(fsl_ldb->panel_bridge))
> - return PTR_ERR(fsl_ldb->panel_bridge);
> -
> + return dev_err_probe(dev, PTR_ERR(fsl_ldb->panel_bridge),
> + "drm panel-bridge add failed\n");
>
> if (fsl_ldb_is_dual(fsl_ldb)) {
> struct device_node *port1, *port2;
> @@ -356,10 +358,9 @@ static int fsl_ldb_probe(struct platform_device *pdev)
> "Error getting dual link configuration\n");
>
> /* Only DRM_LVDS_DUAL_LINK_ODD_EVEN_PIXELS is supported */
> - if (dual_link == DRM_LVDS_DUAL_LINK_EVEN_ODD_PIXELS) {
> - dev_err(dev, "LVDS channel pixel swap not supported.\n");
> - return -EINVAL;
> - }
> + if (dual_link == DRM_LVDS_DUAL_LINK_EVEN_ODD_PIXELS)
> + return dev_err_probe(dev, -EINVAL,
> + "LVDS channel pixel swap not supported.\n");
> }
>
> platform_set_drvdata(pdev, fsl_ldb);
--
Regards,
Laurent Pinchart
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 3/3] drm/bridge: fsl-ldb: simplify device_node error handling
2025-05-14 22:24 ` [PATCH 3/3] drm/bridge: fsl-ldb: simplify device_node error handling Marco Felsch
@ 2025-05-14 22:44 ` Laurent Pinchart
2025-05-14 23:07 ` Marco Felsch
0 siblings, 1 reply; 11+ messages in thread
From: Laurent Pinchart @ 2025-05-14 22:44 UTC (permalink / raw)
To: Marco Felsch
Cc: andrzej.hajda, neil.armstrong, rfoss, jonas, jernej.skrabec,
maarten.lankhorst, mripard, tzimmermann, airlied, simona,
dri-devel, linux-kernel, kernel
Hi Marco,
On Thu, May 15, 2025 at 12:24:53AM +0200, Marco Felsch wrote:
> Make use of __free(device_node) to simplify the of_node_put() error
> handling paths. No functional changes.
>
> Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
> ---
> drivers/gpu/drm/bridge/fsl-ldb.c | 24 +++++++++---------------
> 1 file changed, 9 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/gpu/drm/bridge/fsl-ldb.c b/drivers/gpu/drm/bridge/fsl-ldb.c
> index e0a229c91953..cea9ddaa5e01 100644
> --- a/drivers/gpu/drm/bridge/fsl-ldb.c
> +++ b/drivers/gpu/drm/bridge/fsl-ldb.c
> @@ -287,8 +287,9 @@ static const struct drm_bridge_funcs funcs = {
> static int fsl_ldb_probe(struct platform_device *pdev)
> {
> struct device *dev = &pdev->dev;
> - struct device_node *panel_node;
> - struct device_node *remote1, *remote2;
> + struct device_node *panel_node __free(device_node) = NULL;
> + struct device_node *remote1 __free(device_node) = NULL;
> + struct device_node *remote2 __free(device_node) = NULL;
> struct drm_panel *panel;
> struct fsl_ldb *fsl_ldb;
> int dual_link;
> @@ -321,21 +322,16 @@ static int fsl_ldb_probe(struct platform_device *pdev)
> remote2 = of_graph_get_remote_node(dev->of_node, 2, 0);
> fsl_ldb->ch0_enabled = (remote1 != NULL);
> fsl_ldb->ch1_enabled = (remote2 != NULL);
> - panel_node = of_node_get(remote1 ? remote1 : remote2);
> - of_node_put(remote1);
> - of_node_put(remote2);
> + panel_node = remote1 ? remote1 : remote2;
This will cause a double put of panel_node, once due to __free() on
remote1 or remote2, and the second time due to __free() on panel_node.
>
> - if (!fsl_ldb->ch0_enabled && !fsl_ldb->ch1_enabled) {
> - of_node_put(panel_node);
> + if (!fsl_ldb->ch0_enabled && !fsl_ldb->ch1_enabled)
> return dev_err_probe(dev, -ENXIO, "No panel node found");
> - }
>
> dev_dbg(dev, "Using %s\n",
> fsl_ldb_is_dual(fsl_ldb) ? "dual-link mode" :
> fsl_ldb->ch0_enabled ? "channel 0" : "channel 1");
>
> panel = of_drm_find_panel(panel_node);
> - of_node_put(panel_node);
> if (IS_ERR(panel))
> return dev_err_probe(dev, PTR_ERR(panel), "drm panel not found\n");
>
> @@ -345,14 +341,12 @@ static int fsl_ldb_probe(struct platform_device *pdev)
> "drm panel-bridge add failed\n");
>
> if (fsl_ldb_is_dual(fsl_ldb)) {
> - struct device_node *port1, *port2;
> + struct device_node *port1 __free(device_node) =
> + of_graph_get_port_by_id(dev->of_node, 1);
> + struct device_node *port2 __free(device_node) =
> + of_graph_get_port_by_id(dev->of_node, 2);
>
> - port1 = of_graph_get_port_by_id(dev->of_node, 1);
> - port2 = of_graph_get_port_by_id(dev->of_node, 2);
> dual_link = drm_of_lvds_get_dual_link_pixel_order(port1, port2);
> - of_node_put(port1);
> - of_node_put(port2);
> -
> if (dual_link < 0)
> return dev_err_probe(dev, dual_link,
> "Error getting dual link configuration\n");
--
Regards,
Laurent Pinchart
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 1/3] drm/bridge: fsl-ldb: make use of driver_private
2025-05-14 22:24 ` [PATCH 1/3] drm/bridge: fsl-ldb: make use of driver_private Marco Felsch
@ 2025-05-14 22:45 ` Laurent Pinchart
2025-05-14 23:04 ` Marco Felsch
0 siblings, 1 reply; 11+ messages in thread
From: Laurent Pinchart @ 2025-05-14 22:45 UTC (permalink / raw)
To: Marco Felsch
Cc: andrzej.hajda, neil.armstrong, rfoss, jonas, jernej.skrabec,
maarten.lankhorst, mripard, tzimmermann, airlied, simona,
dri-devel, linux-kernel, kernel
Hi Marco,
Thank you for the patch.
On Thu, May 15, 2025 at 12:24:51AM +0200, Marco Felsch wrote:
> Make use of the drm_bridge::driver_private data instead of
> container_of() wrapper.
I suppose this is a personal preference, but I like usage of
container_of() better. In my opinion it conveys better that struct
fsl_ldb "unherits" from struct drm_bridge.
> No functional changes.
>
> Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
> ---
> drivers/gpu/drm/bridge/fsl-ldb.c | 14 +++++---------
> 1 file changed, 5 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/gpu/drm/bridge/fsl-ldb.c b/drivers/gpu/drm/bridge/fsl-ldb.c
> index 0fc8a14fd800..fa29f2bf4031 100644
> --- a/drivers/gpu/drm/bridge/fsl-ldb.c
> +++ b/drivers/gpu/drm/bridge/fsl-ldb.c
> @@ -99,11 +99,6 @@ static bool fsl_ldb_is_dual(const struct fsl_ldb *fsl_ldb)
> return (fsl_ldb->ch0_enabled && fsl_ldb->ch1_enabled);
> }
>
> -static inline struct fsl_ldb *to_fsl_ldb(struct drm_bridge *bridge)
> -{
> - return container_of(bridge, struct fsl_ldb, bridge);
> -}
> -
> static unsigned long fsl_ldb_link_frequency(struct fsl_ldb *fsl_ldb, int clock)
> {
> if (fsl_ldb_is_dual(fsl_ldb))
> @@ -115,7 +110,7 @@ static unsigned long fsl_ldb_link_frequency(struct fsl_ldb *fsl_ldb, int clock)
> static int fsl_ldb_attach(struct drm_bridge *bridge,
> enum drm_bridge_attach_flags flags)
> {
> - struct fsl_ldb *fsl_ldb = to_fsl_ldb(bridge);
> + struct fsl_ldb *fsl_ldb = bridge->driver_private;
>
> return drm_bridge_attach(bridge->encoder, fsl_ldb->panel_bridge,
> bridge, flags);
> @@ -124,7 +119,7 @@ static int fsl_ldb_attach(struct drm_bridge *bridge,
> static void fsl_ldb_atomic_enable(struct drm_bridge *bridge,
> struct drm_bridge_state *old_bridge_state)
> {
> - struct fsl_ldb *fsl_ldb = to_fsl_ldb(bridge);
> + struct fsl_ldb *fsl_ldb = bridge->driver_private;
> struct drm_atomic_state *state = old_bridge_state->base.state;
> const struct drm_bridge_state *bridge_state;
> const struct drm_crtc_state *crtc_state;
> @@ -226,7 +221,7 @@ static void fsl_ldb_atomic_enable(struct drm_bridge *bridge,
> static void fsl_ldb_atomic_disable(struct drm_bridge *bridge,
> struct drm_bridge_state *old_bridge_state)
> {
> - struct fsl_ldb *fsl_ldb = to_fsl_ldb(bridge);
> + struct fsl_ldb *fsl_ldb = bridge->driver_private;
>
> /* Stop channel(s). */
> if (fsl_ldb->devdata->lvds_en_bit)
> @@ -270,7 +265,7 @@ fsl_ldb_mode_valid(struct drm_bridge *bridge,
> const struct drm_display_info *info,
> const struct drm_display_mode *mode)
> {
> - struct fsl_ldb *fsl_ldb = to_fsl_ldb(bridge);
> + struct fsl_ldb *fsl_ldb = bridge->driver_private;
>
> if (mode->clock > (fsl_ldb_is_dual(fsl_ldb) ? 160000 : 80000))
> return MODE_CLOCK_HIGH;
> @@ -309,6 +304,7 @@ static int fsl_ldb_probe(struct platform_device *pdev)
> fsl_ldb->dev = &pdev->dev;
> fsl_ldb->bridge.funcs = &funcs;
> fsl_ldb->bridge.of_node = dev->of_node;
> + fsl_ldb->bridge.driver_private = fsl_ldb;
>
> fsl_ldb->clk = devm_clk_get(dev, "ldb");
> if (IS_ERR(fsl_ldb->clk))
--
Regards,
Laurent Pinchart
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 1/3] drm/bridge: fsl-ldb: make use of driver_private
2025-05-14 22:45 ` Laurent Pinchart
@ 2025-05-14 23:04 ` Marco Felsch
2025-05-24 0:38 ` Dmitry Baryshkov
0 siblings, 1 reply; 11+ messages in thread
From: Marco Felsch @ 2025-05-14 23:04 UTC (permalink / raw)
To: Laurent Pinchart
Cc: andrzej.hajda, neil.armstrong, rfoss, jonas, jernej.skrabec,
maarten.lankhorst, mripard, tzimmermann, airlied, simona,
dri-devel, linux-kernel, kernel
Hi Laurent,
On 25-05-15, Laurent Pinchart wrote:
> Hi Marco,
>
> Thank you for the patch.
>
> On Thu, May 15, 2025 at 12:24:51AM +0200, Marco Felsch wrote:
> > Make use of the drm_bridge::driver_private data instead of
> > container_of() wrapper.
>
> I suppose this is a personal preference, but I like usage of
> container_of() better. In my opinion it conveys better that struct
> fsl_ldb "unherits" from struct drm_bridge.
Yes, we can drop this patch if container_of() or to_fsl_ldb() is
preferred. I just saw the driver_private field and why not making use of
it since we do that a lot, same is true for container_of :)
Regards,
Marco
> > No functional changes.
> >
> > Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
> > ---
> > drivers/gpu/drm/bridge/fsl-ldb.c | 14 +++++---------
> > 1 file changed, 5 insertions(+), 9 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/bridge/fsl-ldb.c b/drivers/gpu/drm/bridge/fsl-ldb.c
> > index 0fc8a14fd800..fa29f2bf4031 100644
> > --- a/drivers/gpu/drm/bridge/fsl-ldb.c
> > +++ b/drivers/gpu/drm/bridge/fsl-ldb.c
> > @@ -99,11 +99,6 @@ static bool fsl_ldb_is_dual(const struct fsl_ldb *fsl_ldb)
> > return (fsl_ldb->ch0_enabled && fsl_ldb->ch1_enabled);
> > }
> >
> > -static inline struct fsl_ldb *to_fsl_ldb(struct drm_bridge *bridge)
> > -{
> > - return container_of(bridge, struct fsl_ldb, bridge);
> > -}
> > -
> > static unsigned long fsl_ldb_link_frequency(struct fsl_ldb *fsl_ldb, int clock)
> > {
> > if (fsl_ldb_is_dual(fsl_ldb))
> > @@ -115,7 +110,7 @@ static unsigned long fsl_ldb_link_frequency(struct fsl_ldb *fsl_ldb, int clock)
> > static int fsl_ldb_attach(struct drm_bridge *bridge,
> > enum drm_bridge_attach_flags flags)
> > {
> > - struct fsl_ldb *fsl_ldb = to_fsl_ldb(bridge);
> > + struct fsl_ldb *fsl_ldb = bridge->driver_private;
> >
> > return drm_bridge_attach(bridge->encoder, fsl_ldb->panel_bridge,
> > bridge, flags);
> > @@ -124,7 +119,7 @@ static int fsl_ldb_attach(struct drm_bridge *bridge,
> > static void fsl_ldb_atomic_enable(struct drm_bridge *bridge,
> > struct drm_bridge_state *old_bridge_state)
> > {
> > - struct fsl_ldb *fsl_ldb = to_fsl_ldb(bridge);
> > + struct fsl_ldb *fsl_ldb = bridge->driver_private;
> > struct drm_atomic_state *state = old_bridge_state->base.state;
> > const struct drm_bridge_state *bridge_state;
> > const struct drm_crtc_state *crtc_state;
> > @@ -226,7 +221,7 @@ static void fsl_ldb_atomic_enable(struct drm_bridge *bridge,
> > static void fsl_ldb_atomic_disable(struct drm_bridge *bridge,
> > struct drm_bridge_state *old_bridge_state)
> > {
> > - struct fsl_ldb *fsl_ldb = to_fsl_ldb(bridge);
> > + struct fsl_ldb *fsl_ldb = bridge->driver_private;
> >
> > /* Stop channel(s). */
> > if (fsl_ldb->devdata->lvds_en_bit)
> > @@ -270,7 +265,7 @@ fsl_ldb_mode_valid(struct drm_bridge *bridge,
> > const struct drm_display_info *info,
> > const struct drm_display_mode *mode)
> > {
> > - struct fsl_ldb *fsl_ldb = to_fsl_ldb(bridge);
> > + struct fsl_ldb *fsl_ldb = bridge->driver_private;
> >
> > if (mode->clock > (fsl_ldb_is_dual(fsl_ldb) ? 160000 : 80000))
> > return MODE_CLOCK_HIGH;
> > @@ -309,6 +304,7 @@ static int fsl_ldb_probe(struct platform_device *pdev)
> > fsl_ldb->dev = &pdev->dev;
> > fsl_ldb->bridge.funcs = &funcs;
> > fsl_ldb->bridge.of_node = dev->of_node;
> > + fsl_ldb->bridge.driver_private = fsl_ldb;
> >
> > fsl_ldb->clk = devm_clk_get(dev, "ldb");
> > if (IS_ERR(fsl_ldb->clk))
>
> --
> Regards,
>
> Laurent Pinchart
>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 3/3] drm/bridge: fsl-ldb: simplify device_node error handling
2025-05-14 22:44 ` Laurent Pinchart
@ 2025-05-14 23:07 ` Marco Felsch
0 siblings, 0 replies; 11+ messages in thread
From: Marco Felsch @ 2025-05-14 23:07 UTC (permalink / raw)
To: Laurent Pinchart
Cc: andrzej.hajda, neil.armstrong, rfoss, jonas, jernej.skrabec,
maarten.lankhorst, mripard, tzimmermann, airlied, simona,
dri-devel, linux-kernel, kernel
Hi Laurent,
On 25-05-15, Laurent Pinchart wrote:
> Hi Marco,
>
> On Thu, May 15, 2025 at 12:24:53AM +0200, Marco Felsch wrote:
> > Make use of __free(device_node) to simplify the of_node_put() error
> > handling paths. No functional changes.
> >
> > Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
> > ---
> > drivers/gpu/drm/bridge/fsl-ldb.c | 24 +++++++++---------------
> > 1 file changed, 9 insertions(+), 15 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/bridge/fsl-ldb.c b/drivers/gpu/drm/bridge/fsl-ldb.c
> > index e0a229c91953..cea9ddaa5e01 100644
> > --- a/drivers/gpu/drm/bridge/fsl-ldb.c
> > +++ b/drivers/gpu/drm/bridge/fsl-ldb.c
> > @@ -287,8 +287,9 @@ static const struct drm_bridge_funcs funcs = {
> > static int fsl_ldb_probe(struct platform_device *pdev)
> > {
> > struct device *dev = &pdev->dev;
> > - struct device_node *panel_node;
> > - struct device_node *remote1, *remote2;
> > + struct device_node *panel_node __free(device_node) = NULL;
> > + struct device_node *remote1 __free(device_node) = NULL;
> > + struct device_node *remote2 __free(device_node) = NULL;
> > struct drm_panel *panel;
> > struct fsl_ldb *fsl_ldb;
> > int dual_link;
> > @@ -321,21 +322,16 @@ static int fsl_ldb_probe(struct platform_device *pdev)
> > remote2 = of_graph_get_remote_node(dev->of_node, 2, 0);
> > fsl_ldb->ch0_enabled = (remote1 != NULL);
> > fsl_ldb->ch1_enabled = (remote2 != NULL);
> > - panel_node = of_node_get(remote1 ? remote1 : remote2);
> > - of_node_put(remote1);
> > - of_node_put(remote2);
> > + panel_node = remote1 ? remote1 : remote2;
>
> This will cause a double put of panel_node, once due to __free() on
> remote1 or remote2, and the second time due to __free() on panel_node.
Argh.. you're right. I drop the __free() from the panel_node.
Thanks,
Marco
>
> >
> > - if (!fsl_ldb->ch0_enabled && !fsl_ldb->ch1_enabled) {
> > - of_node_put(panel_node);
> > + if (!fsl_ldb->ch0_enabled && !fsl_ldb->ch1_enabled)
> > return dev_err_probe(dev, -ENXIO, "No panel node found");
> > - }
> >
> > dev_dbg(dev, "Using %s\n",
> > fsl_ldb_is_dual(fsl_ldb) ? "dual-link mode" :
> > fsl_ldb->ch0_enabled ? "channel 0" : "channel 1");
> >
> > panel = of_drm_find_panel(panel_node);
> > - of_node_put(panel_node);
> > if (IS_ERR(panel))
> > return dev_err_probe(dev, PTR_ERR(panel), "drm panel not found\n");
> >
> > @@ -345,14 +341,12 @@ static int fsl_ldb_probe(struct platform_device *pdev)
> > "drm panel-bridge add failed\n");
> >
> > if (fsl_ldb_is_dual(fsl_ldb)) {
> > - struct device_node *port1, *port2;
> > + struct device_node *port1 __free(device_node) =
> > + of_graph_get_port_by_id(dev->of_node, 1);
> > + struct device_node *port2 __free(device_node) =
> > + of_graph_get_port_by_id(dev->of_node, 2);
> >
> > - port1 = of_graph_get_port_by_id(dev->of_node, 1);
> > - port2 = of_graph_get_port_by_id(dev->of_node, 2);
> > dual_link = drm_of_lvds_get_dual_link_pixel_order(port1, port2);
> > - of_node_put(port1);
> > - of_node_put(port2);
> > -
> > if (dual_link < 0)
> > return dev_err_probe(dev, dual_link,
> > "Error getting dual link configuration\n");
>
> --
> Regards,
>
> Laurent Pinchart
>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 2/3] drm/bridge: fsl-ldb: make use of dev_err_probe
2025-05-14 22:24 ` [PATCH 2/3] drm/bridge: fsl-ldb: make use of dev_err_probe Marco Felsch
2025-05-14 22:36 ` Laurent Pinchart
@ 2025-05-15 6:21 ` Alexander Stein
1 sibling, 0 replies; 11+ messages in thread
From: Alexander Stein @ 2025-05-15 6:21 UTC (permalink / raw)
To: andrzej.hajda, neil.armstrong, rfoss, Laurent.pinchart, jonas,
jernej.skrabec, maarten.lankhorst, mripard, tzimmermann, airlied,
simona, dri-devel
Cc: dri-devel, linux-kernel, kernel, Marco Felsch
Am Donnerstag, 15. Mai 2025, 00:24:52 CEST schrieb Marco Felsch:
> Make use of dev_err_probe() to easily spot issues via the debugfs or
> kernel log. No functional changes.
>
> Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
Reviewed-by: Alexander Stein <alexander.stein@ew.tq-group.com>
> ---
> drivers/gpu/drm/bridge/fsl-ldb.c | 19 ++++++++++---------
> 1 file changed, 10 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/gpu/drm/bridge/fsl-ldb.c b/drivers/gpu/drm/bridge/fsl-ldb.c
> index fa29f2bf4031..e0a229c91953 100644
> --- a/drivers/gpu/drm/bridge/fsl-ldb.c
> +++ b/drivers/gpu/drm/bridge/fsl-ldb.c
> @@ -308,11 +308,13 @@ static int fsl_ldb_probe(struct platform_device *pdev)
>
> fsl_ldb->clk = devm_clk_get(dev, "ldb");
> if (IS_ERR(fsl_ldb->clk))
> - return PTR_ERR(fsl_ldb->clk);
> + return dev_err_probe(dev, PTR_ERR(fsl_ldb->clk),
> + "Failed to get ldb clk\n");
>
> fsl_ldb->regmap = syscon_node_to_regmap(dev->of_node->parent);
> if (IS_ERR(fsl_ldb->regmap))
> - return PTR_ERR(fsl_ldb->regmap);
> + return dev_err_probe(dev, PTR_ERR(fsl_ldb->regmap),
> + "Failed to get regmap\n");
>
> /* Locate the remote ports and the panel node */
> remote1 = of_graph_get_remote_node(dev->of_node, 1, 0);
> @@ -335,12 +337,12 @@ static int fsl_ldb_probe(struct platform_device *pdev)
> panel = of_drm_find_panel(panel_node);
> of_node_put(panel_node);
> if (IS_ERR(panel))
> - return PTR_ERR(panel);
> + return dev_err_probe(dev, PTR_ERR(panel), "drm panel not found\n");
>
> fsl_ldb->panel_bridge = devm_drm_panel_bridge_add(dev, panel);
> if (IS_ERR(fsl_ldb->panel_bridge))
> - return PTR_ERR(fsl_ldb->panel_bridge);
> -
> + return dev_err_probe(dev, PTR_ERR(fsl_ldb->panel_bridge),
> + "drm panel-bridge add failed\n");
>
> if (fsl_ldb_is_dual(fsl_ldb)) {
> struct device_node *port1, *port2;
> @@ -356,10 +358,9 @@ static int fsl_ldb_probe(struct platform_device *pdev)
> "Error getting dual link configuration\n");
>
> /* Only DRM_LVDS_DUAL_LINK_ODD_EVEN_PIXELS is supported */
> - if (dual_link == DRM_LVDS_DUAL_LINK_EVEN_ODD_PIXELS) {
> - dev_err(dev, "LVDS channel pixel swap not supported.\n");
> - return -EINVAL;
> - }
> + if (dual_link == DRM_LVDS_DUAL_LINK_EVEN_ODD_PIXELS)
> + return dev_err_probe(dev, -EINVAL,
> + "LVDS channel pixel swap not supported.\n");
> }
>
> platform_set_drvdata(pdev, fsl_ldb);
>
--
TQ-Systems GmbH | Mühlstraße 2, Gut Delling | 82229 Seefeld, Germany
Amtsgericht München, HRB 105018
Geschäftsführer: Detlef Schneider, Rüdiger Stahl, Stefan Schneider
http://www.tq-group.com/
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 1/3] drm/bridge: fsl-ldb: make use of driver_private
2025-05-14 23:04 ` Marco Felsch
@ 2025-05-24 0:38 ` Dmitry Baryshkov
0 siblings, 0 replies; 11+ messages in thread
From: Dmitry Baryshkov @ 2025-05-24 0:38 UTC (permalink / raw)
To: Marco Felsch
Cc: Laurent Pinchart, andrzej.hajda, neil.armstrong, rfoss, jonas,
jernej.skrabec, maarten.lankhorst, mripard, tzimmermann, airlied,
simona, dri-devel, linux-kernel, kernel
On Thu, May 15, 2025 at 01:04:52AM +0200, Marco Felsch wrote:
> Hi Laurent,
>
> On 25-05-15, Laurent Pinchart wrote:
> > Hi Marco,
> >
> > Thank you for the patch.
> >
> > On Thu, May 15, 2025 at 12:24:51AM +0200, Marco Felsch wrote:
> > > Make use of the drm_bridge::driver_private data instead of
> > > container_of() wrapper.
> >
> > I suppose this is a personal preference, but I like usage of
> > container_of() better. In my opinion it conveys better that struct
> > fsl_ldb "unherits" from struct drm_bridge.
>
> Yes, we can drop this patch if container_of() or to_fsl_ldb() is
> preferred. I just saw the driver_private field and why not making use of
> it since we do that a lot, same is true for container_of :)
container_of() generally is a more preferred form, because it provides
type safety. It doesn't perform blind casts. Using driver_data involves
using void pointer, which can be cast to any structure pointer. It is
easy to make hard-to-notice mistakes.
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2025-05-24 0:39 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-05-14 22:24 [PATCH 0/3] i.MX fsl-ldb cleanups Marco Felsch
2025-05-14 22:24 ` [PATCH 1/3] drm/bridge: fsl-ldb: make use of driver_private Marco Felsch
2025-05-14 22:45 ` Laurent Pinchart
2025-05-14 23:04 ` Marco Felsch
2025-05-24 0:38 ` Dmitry Baryshkov
2025-05-14 22:24 ` [PATCH 2/3] drm/bridge: fsl-ldb: make use of dev_err_probe Marco Felsch
2025-05-14 22:36 ` Laurent Pinchart
2025-05-15 6:21 ` Alexander Stein
2025-05-14 22:24 ` [PATCH 3/3] drm/bridge: fsl-ldb: simplify device_node error handling Marco Felsch
2025-05-14 22:44 ` Laurent Pinchart
2025-05-14 23:07 ` Marco Felsch
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.