Introduce atmel_xlcdc_connector_output_lvds() to map LVDS bus
formats to the appropriate output mode, and wire it into
atmel_hlcdc_connector_output_mode() for LVDS encoder types.

Signed-off-by: Manikandan Muralidharan <[email protected]>
---
 .../gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c    | 44 +++++++++++++++++--
 1 file changed, 41 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c 
b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c
index 73a8650bc9b7..9f46c368835e 100644
--- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c
+++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c
@@ -407,6 +407,42 @@ static int atmel_xlcdc_connector_output_dsi(struct 
drm_encoder *encoder,
        return supported_fmts;
 }
 
+static int atmel_xlcdc_connector_output_lvds(struct drm_encoder *encoder,
+                                            struct drm_display_info *info)
+{
+       int j;
+       unsigned int supported_fmts = 0;
+
+       switch (atmel_hlcdc_encoder_get_bus_fmt(encoder)) {
+       case 0:
+               break;
+       case MEDIA_BUS_FMT_RGB666_1X7X3_SPWG:
+       case MEDIA_BUS_FMT_RGB666_1X18:
+               return ATMEL_HLCDC_RGB666_OUTPUT;
+       case MEDIA_BUS_FMT_RGB888_1X7X4_SPWG:
+       case MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA:
+               return ATMEL_HLCDC_RGB888_OUTPUT;
+       default:
+               return -EINVAL;
+       }
+
+       for (j = 0; j < info->num_bus_formats; j++) {
+               switch (info->bus_formats[j]) {
+               case MEDIA_BUS_FMT_RGB666_1X7X3_SPWG:
+               case MEDIA_BUS_FMT_RGB666_1X18:
+                       supported_fmts |= ATMEL_HLCDC_RGB666_OUTPUT;
+                       break;
+               case MEDIA_BUS_FMT_RGB888_1X7X4_SPWG:
+               case MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA:
+                       supported_fmts |= ATMEL_HLCDC_RGB888_OUTPUT;
+                       break;
+               default:
+                       break;
+               }
+       }
+       return supported_fmts;
+}
+
 static int atmel_hlcdc_connector_output_mode(struct drm_connector_state *state)
 {
        struct drm_connector *connector = state->connector;
@@ -419,12 +455,14 @@ static int atmel_hlcdc_connector_output_mode(struct 
drm_connector_state *state)
        if (!encoder)
                encoder = connector->encoder;
        /*
-        * atmel-hlcdc to support DSI formats with DSI video pipeline
-        * when DRM_MODE_ENCODER_DSI type is set by
-        * connector driver component.
+        * Select the output format based on the encoder type.
+        * DSI and LVDS encoders have dedicated format handlers,
+        * while other encoder types fall through to the generic path
         */
        if (encoder->encoder_type == DRM_MODE_ENCODER_DSI)
                return atmel_xlcdc_connector_output_dsi(encoder, info);
+       if (encoder->encoder_type == DRM_MODE_ENCODER_LVDS)
+               return atmel_xlcdc_connector_output_lvds(encoder, info);
 
        switch (atmel_hlcdc_encoder_get_bus_fmt(encoder)) {
        case 0:
-- 
2.25.1

Reply via email to