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;
[...]