@@ -31,6 +31,8 @@ struct panel_lvds {
unsigned int height;
struct videomode video_mode;
unsigned int bus_format;
+ bool clk_active_low;
+ bool data_active_low;
bool data_mirror;
struct regulator *supply;
@@ -83,6 +85,7 @@ static int panel_lvds_get_modes(struct drm_panel *panel,
{
struct panel_lvds *lvds = to_panel_lvds(panel);
struct drm_display_mode *mode;
+ unsigned int flags = 0;
mode = drm_mode_create(connector->dev);
if (!mode)
@@ -96,9 +99,23 @@ static int panel_lvds_get_modes(struct drm_panel *panel,
connector->display_info.height_mm = lvds->height;
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;
+
+ if (lvds->data_mirror)
+ flags |= DRM_BUS_FLAG_DATA_LSB_TO_MSB;
+ else
+ flags |= DRM_BUS_FLAG_DATA_MSB_TO_LSB;
+
+ if (lvds->clk_active_low)
+ flags |= DRM_BUS_FLAG_PIXDATA_NEGEDGE;
+ else
+ flags |= DRM_BUS_FLAG_PIXDATA_POSEDGE;
+
+ if (lvds->data_active_low)
+ flags |= DRM_BUS_FLAG_DATA_LOW;
+ else
+ flags |= DRM_BUS_FLAG_DATA_HIGH;
+
+ connector->display_info.bus_flags = flags;
return 1;
}
@@ -159,6 +176,8 @@ static int panel_lvds_parse_dt(struct panel_lvds *lvds)
return -EINVAL;
}
+ lvds->clk_active_low = of_property_read_bool(np, "clock-active-low");
+ lvds->data_active_low = of_property_read_bool(np, "data-active-low");
lvds->data_mirror = of_property_read_bool(np, "data-mirror");
return 0;
Add device tree properties to the panel-lvds driver to set the bus flags properly. Signed-off-by: Maxime Ripard <maxime@cerno.tech> --- drivers/gpu/drm/panel/panel-lvds.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-)