[PATCH 36/39] drm/bridge: fsl-ldb: Add i.MX95 support

Frank Li Frank.li at nxp.com
Mon Oct 13 12:24:59 PDT 2025


On Sat, Oct 11, 2025 at 06:51:51PM +0200, Marek Vasut wrote:
> Add support for i.MX95 SoC variant of the LDB. This variant supports
> single channel and all configuration is done via single register,
> but there are two instances of this IP preceded by another bridge,
> which handles the dual-lane configuration instead. This is also the
> reason for special-case handling of input format, where the preceding
> bridge needs the format details as well.
>
> Signed-off-by: Marek Vasut <marek.vasut at mailbox.org>
> ---
> Cc: Abel Vesa <abelvesa at kernel.org>
> Cc: Conor Dooley <conor+dt at kernel.org>
> Cc: Fabio Estevam <festevam at gmail.com>
> Cc: Krzysztof Kozlowski <krzk+dt at kernel.org>
> Cc: Laurent Pinchart <Laurent.pinchart at ideasonboard.com>
> Cc: Liu Ying <victor.liu at nxp.com>
> Cc: Lucas Stach <l.stach at pengutronix.de>
> Cc: Peng Fan <peng.fan at nxp.com>
> Cc: Pengutronix Kernel Team <kernel at pengutronix.de>
> Cc: Rob Herring <robh at kernel.org>
> Cc: Shawn Guo <shawnguo at kernel.org>
> Cc: Thomas Zimmermann <tzimmermann at suse.de>
> Cc: devicetree at vger.kernel.org
> Cc: dri-devel at lists.freedesktop.org
> Cc: imx at lists.linux.dev
> Cc: linux-arm-kernel at lists.infradead.org
> Cc: linux-clk at vger.kernel.org
> ---
>  drivers/gpu/drm/bridge/fsl-ldb.c | 23 +++++++++++++++++++----
>  1 file changed, 19 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpu/drm/bridge/fsl-ldb.c b/drivers/gpu/drm/bridge/fsl-ldb.c
> index c54caea0b63fc..1560438e4cb10 100644
> --- a/drivers/gpu/drm/bridge/fsl-ldb.c
> +++ b/drivers/gpu/drm/bridge/fsl-ldb.c
> @@ -58,6 +58,7 @@ enum fsl_ldb_devtype {
>  	IMX6SX_LDB,
>  	IMX8MP_LDB,
>  	IMX93_LDB,
> +	IMX95_LDB,
>  };
>
>  struct fsl_ldb_devdata {
> @@ -73,6 +74,9 @@ static const struct fsl_ldb_devdata fsl_ldb_devdata[] = {
>  	[IMX93_LDB] = {
>  		.lvds_en_bit = true,
>  	},
> +	[IMX95_LDB] = {
> +		.lvds_en_bit = true,
> +	},
>  };
>
>  struct fsl_ldb {
> @@ -235,7 +239,7 @@ static void fsl_ldb_atomic_disable(struct drm_bridge *bridge,
>  	clk_disable_unprepare(fsl_ldb->clk);
>  }
>
> -#define MAX_INPUT_SEL_FORMATS 1
> +#define MAX_INPUT_SEL_FORMATS 4
>  static u32 *
>  fsl_ldb_atomic_get_input_bus_fmts(struct drm_bridge *bridge,
>  				  struct drm_bridge_state *bridge_state,
> @@ -244,17 +248,26 @@ fsl_ldb_atomic_get_input_bus_fmts(struct drm_bridge *bridge,
>  				  u32 output_fmt,
>  				  unsigned int *num_input_fmts)
>  {
> +	struct fsl_ldb *fsl_ldb = to_fsl_ldb(bridge);
>  	u32 *input_fmts;
>
>  	*num_input_fmts = 0;
>
> -	input_fmts = kcalloc(MAX_INPUT_SEL_FORMATS, sizeof(*input_fmts),
> +	input_fmts = kcalloc(MAX_INPUT_SEL_FORMATS, MAX_INPUT_SEL_FORMATS * sizeof(*input_fmts),
>  			     GFP_KERNEL);
>  	if (!input_fmts)
>  		return NULL;
>
> -	input_fmts[0] = MEDIA_BUS_FMT_RGB888_1X24;
> -	*num_input_fmts = MAX_INPUT_SEL_FORMATS;
> +	if (of_device_is_compatible(fsl_ldb->dev->of_node, "fsl,imx95-ldb")) {

You already use drv data, why need check fsl,imx95-ldb here. put below
data into drv data.

Frank
> +		input_fmts[0] = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG;
> +		input_fmts[1] = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG;
> +		input_fmts[2] = MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA;
> +		input_fmts[3] = MEDIA_BUS_FMT_FIXED;
> +		*num_input_fmts = 4;
> +	} else {
> +		input_fmts[0] = MEDIA_BUS_FMT_RGB888_1X24;
> +		*num_input_fmts = 1;
> +	}
>
>  	return input_fmts;
>  }
> @@ -396,6 +409,8 @@ static const struct of_device_id fsl_ldb_match[] = {
>  	  .data = &fsl_ldb_devdata[IMX8MP_LDB], },
>  	{ .compatible = "fsl,imx93-ldb",
>  	  .data = &fsl_ldb_devdata[IMX93_LDB], },
> +	{ .compatible = "fsl,imx95-ldb",
> +	  .data = &fsl_ldb_devdata[IMX95_LDB], },
>  	{ /* sentinel */ },
>  };
>  MODULE_DEVICE_TABLE(of, fsl_ldb_match);
> --
> 2.51.0
>



More information about the linux-arm-kernel mailing list