On 1/23/23 16:12, Jagan Teki wrote:

[...]

+static bool exynos_dsi_pixel_output_fmt_supported(u32 fmt)
+{
+       int i;

if (fmt == MEDIA_BUS_FMT_FIXED)
 return false;

+       for (i = 0; i < ARRAY_SIZE(exynos_dsi_pixel_output_fmts); i++) {
+               if (exynos_dsi_pixel_output_fmts[i] == fmt)
+                       return true;
+       }
+
+       return false;
+}
+
+static u32 *
+exynos_dsi_atomic_get_input_bus_fmts(struct drm_bridge *bridge,
+                                    struct drm_bridge_state *bridge_state,
+                                    struct drm_crtc_state *crtc_state,
+                                    struct drm_connector_state *conn_state,
+                                    u32 output_fmt,
+                                    unsigned int *num_input_fmts)
+{
+       u32 *input_fmts;
+
+       if (!exynos_dsi_pixel_output_fmt_supported(output_fmt))
+               /*
+                * Some bridge/display drivers are still not able to pass the
+                * correct format, so handle those pipelines by falling back
+                * to the default format till the supported formats finalized.
+                */
+               output_fmt = MEDIA_BUS_FMT_RGB888_1X24;

You can move this ^ past the kmalloc() call, so in unlikely case the kmalloc() fails, it would fail first.

+       input_fmts = kmalloc(sizeof(*input_fmts), GFP_KERNEL);
+       if (!input_fmts)
+               return NULL;

Delete from here ...

+       switch (output_fmt) {
+       case MEDIA_BUS_FMT_FIXED:
+               input_fmts[0] = MEDIA_BUS_FMT_RGB888_1X24;
+               break;
+       default:
+               input_fmts[0] = output_fmt;
+               break;
+       }

... until here, and do simple:

input_fmts[0] = output_fmt;

The effect should be the same, the code should be simpler and faster.

+       *num_input_fmts = 1;

[...]

Reply via email to