]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
drm/bridge: tc358767: Add format negotiation hooks for DPI/DSI to (e)DP
authorAradhya Bhatia <a-bhatia1@ti.com>
Wed, 8 Nov 2023 11:27:22 +0000 (13:27 +0200)
committerDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Sat, 22 Jun 2024 12:20:19 +0000 (15:20 +0300)
With new connector model, tc358767 will not create the connector, when
DRM_BRIDGE_ATTACH_NO_CONNECTOR is set and display-controller driver will
rely on format negotiation to setup the encoder format.

Add the missing bus format negotiation hooks in the
drm_bridge_funcs to complete DRM_BRIDGE_ATTACH_NO_CONNECTOR support.

Output format, for DPI/DSI to DP, is selected to
MEDIA_BUS_FMT_RGB888_1X24 as default, keeping in mind what the older
model used to support.

Reported-by: Jan Kiszka <jan.kiszka@siemens.com>
Closes: https://lore.kernel.org/all/24282420-b4dd-45b3-bb1c-fc37fe4a8205@siemens.com/
Signed-off-by: Aradhya Bhatia <a-bhatia1@ti.com>
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20231108-tc358767-v2-1-25c5f70a2159@ideasonboard.com
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
drivers/gpu/drm/bridge/tc358767.c

index 87c7346d037e7ccc316a63d686d5fad8dee43eaa..6bda26ca6b917e27b6ce81179d5b8a0c9c14a321 100644 (file)
@@ -1820,6 +1820,7 @@ static void tc_edp_bridge_detach(struct drm_bridge *bridge)
 }
 
 #define MAX_INPUT_SEL_FORMATS  1
+#define MAX_OUTPUT_SEL_FORMATS 1
 
 static u32 *
 tc_dpi_atomic_get_input_bus_fmts(struct drm_bridge *bridge,
@@ -1845,6 +1846,28 @@ tc_dpi_atomic_get_input_bus_fmts(struct drm_bridge *bridge,
        return input_fmts;
 }
 
+static u32 *
+tc_edp_atomic_get_output_bus_fmts(struct drm_bridge *bridge,
+                                 struct drm_bridge_state *bridge_state,
+                                 struct drm_crtc_state *crtc_state,
+                                 struct drm_connector_state *conn_state,
+                                 unsigned int *num_output_fmts)
+{
+       u32 *output_fmts;
+
+       *num_output_fmts = 0;
+
+       output_fmts = kcalloc(MAX_OUTPUT_SEL_FORMATS, sizeof(*output_fmts),
+                             GFP_KERNEL);
+       if (!output_fmts)
+               return NULL;
+
+       output_fmts[0] = MEDIA_BUS_FMT_RGB888_1X24;
+       *num_output_fmts = 1;
+
+       return output_fmts;
+}
+
 static const struct drm_bridge_funcs tc_dpi_bridge_funcs = {
        .attach = tc_dpi_bridge_attach,
        .mode_valid = tc_dpi_mode_valid,
@@ -1871,6 +1894,8 @@ static const struct drm_bridge_funcs tc_edp_bridge_funcs = {
        .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,
        .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,
        .atomic_reset = drm_atomic_helper_bridge_reset,
+       .atomic_get_input_bus_fmts = drm_atomic_helper_bridge_propagate_bus_fmt,
+       .atomic_get_output_bus_fmts = tc_edp_atomic_get_output_bus_fmts,
 };
 
 static bool tc_readable_reg(struct device *dev, unsigned int reg)