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 <[email protected]>
> ---
> Cc: Abel Vesa <[email protected]>
> Cc: Conor Dooley <[email protected]>
> Cc: Fabio Estevam <[email protected]>
> Cc: Krzysztof Kozlowski <[email protected]>
> Cc: Laurent Pinchart <[email protected]>
> Cc: Liu Ying <[email protected]>
> Cc: Lucas Stach <[email protected]>
> Cc: Peng Fan <[email protected]>
> Cc: Pengutronix Kernel Team <[email protected]>
> Cc: Rob Herring <[email protected]>
> Cc: Shawn Guo <[email protected]>
> Cc: Thomas Zimmermann <[email protected]>
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
> Cc: [email protected]
> ---
>  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
>

Reply via email to