This driver currently rewrites bus_flags based solely on the value of
DT property 'data-mirror' and ignores bus_flags which might have been
set in DT panel-timing node. Specificaly, the 'de-active' DT property
sets DRM_BUS_FLAG_DE_ bus_flags.

Since of_get_drm_panel_display_mode() conveniently parses the bus_flags
out of DT panel-timing property, just ORR them with bus_flags inferred
from 'data-mirror' DT property and use the result as panel bus_flags.

This fixes handling of panels with 'panel-timing { de-active = <1>; };'.

Signed-off-by: Marek Vasut <[email protected]>
Cc: Christoph Niedermaier <[email protected]>
Cc: Daniel Vetter <[email protected]>
Cc: Dmitry Osipenko <[email protected]>
Cc: Laurent Pinchart <[email protected]>
Cc: Robert Foss <[email protected]>
Cc: Sam Ravnborg <[email protected]>
Cc: Thomas Zimmermann <[email protected]>
To: [email protected]
---
 drivers/gpu/drm/panel/panel-lvds.c | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/panel/panel-lvds.c 
b/drivers/gpu/drm/panel/panel-lvds.c
index 65c6a6e9e223..f11252fb00fe 100644
--- a/drivers/gpu/drm/panel/panel-lvds.c
+++ b/drivers/gpu/drm/panel/panel-lvds.c
@@ -33,7 +33,6 @@ struct panel_lvds {
        struct drm_display_mode dmode;
        u32 bus_flags;
        unsigned int bus_format;
-       bool data_mirror;
 
        struct regulator *supply;
 
@@ -99,9 +98,7 @@ static int panel_lvds_get_modes(struct drm_panel *panel,
        connector->display_info.height_mm = lvds->dmode.height_mm;
        drm_display_info_set_bus_formats(&connector->display_info,
                                         &lvds->bus_format, 1);
-       connector->display_info.bus_flags = lvds->data_mirror
-                                         ? DRM_BUS_FLAG_DATA_LSB_TO_MSB
-                                         : DRM_BUS_FLAG_DATA_MSB_TO_LSB;
+       connector->display_info.bus_flags = lvds->bus_flags;
        drm_connector_set_panel_orientation(connector, lvds->orientation);
 
        return 1;
@@ -142,7 +139,9 @@ static int panel_lvds_parse_dt(struct panel_lvds *lvds)
 
        lvds->bus_format = ret;
 
-       lvds->data_mirror = of_property_read_bool(np, "data-mirror");
+       lvds->bus_flags |= of_property_read_bool(np, "data-mirror") ?
+                          DRM_BUS_FLAG_DATA_LSB_TO_MSB :
+                          DRM_BUS_FLAG_DATA_MSB_TO_LSB;
 
        return 0;
 }
-- 
2.35.1

Reply via email to