diff options
author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2018-06-07 11:32:16 -0400 |
---|---|---|
committer | Tomi Valkeinen <tomi.valkeinen@ti.com> | 2018-09-03 09:13:30 -0400 |
commit | 8e9c1c6676ea3d0dc60d84ee9a69984a4bcf859f (patch) | |
tree | e549035e06fbd176d9a9b39556fab7d4ec34802f /drivers/gpu/drm/omapdrm/omap_encoder.c | |
parent | 31cd7afa3086f1206ef4c7434e033669702adf08 (diff) |
drm/omap: Move bus flag hack to encoder implementation
The bus flags stored in omap_dss_device instances are used to fixup the
video mode before setting it, to honour constraints that can't be
expressed through drm_display_mode. The fixup occurs in the CRTC mode
set operation and the resulting video mode is stored internally in the
CRTC. It is then used next by omap_encoder_enable() to apply mode fixups
for the omap_dss_device instances in omap_encoder_update().
Move the hack to the omap_encoder_update() function right before
applying the omap_dss_device fixups, in order to group all fixups
together.
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Diffstat (limited to 'drivers/gpu/drm/omapdrm/omap_encoder.c')
-rw-r--r-- | drivers/gpu/drm/omapdrm/omap_encoder.c | 48 |
1 files changed, 42 insertions, 6 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_encoder.c b/drivers/gpu/drm/omapdrm/omap_encoder.c index bb010c20d8b8..82cdcba961a8 100644 --- a/drivers/gpu/drm/omapdrm/omap_encoder.c +++ b/drivers/gpu/drm/omapdrm/omap_encoder.c | |||
@@ -103,13 +103,49 @@ static int omap_encoder_update(struct drm_encoder *encoder, | |||
103 | int ret; | 103 | int ret; |
104 | 104 | ||
105 | for (dssdev = omap_encoder->output; dssdev; dssdev = dssdev->next) { | 105 | for (dssdev = omap_encoder->output; dssdev; dssdev = dssdev->next) { |
106 | if (!dssdev->ops->check_timings) | 106 | unsigned long bus_flags = dssdev->bus_flags; |
107 | continue; | 107 | |
108 | if (dssdev->ops->check_timings) { | ||
109 | ret = dssdev->ops->check_timings(dssdev, vm); | ||
110 | if (ret) { | ||
111 | dev_err(dev->dev, "invalid timings: %d\n", ret); | ||
112 | return ret; | ||
113 | } | ||
114 | } | ||
115 | |||
116 | /* | ||
117 | * HACK: This fixes the vm flags. | ||
118 | * struct drm_display_mode does not contain the VSYNC/HSYNC/DE | ||
119 | * flags and they get lost when converting back and forth | ||
120 | * between struct drm_display_mode and struct videomode. The | ||
121 | * hack below goes and fetches the missing flags. | ||
122 | * | ||
123 | * A better solution is to use DRM's bus-flags through the whole | ||
124 | * driver. | ||
125 | */ | ||
126 | |||
127 | if (!(vm->flags & (DISPLAY_FLAGS_DE_LOW | | ||
128 | DISPLAY_FLAGS_DE_HIGH))) { | ||
129 | if (bus_flags & DRM_BUS_FLAG_DE_LOW) | ||
130 | vm->flags |= DISPLAY_FLAGS_DE_LOW; | ||
131 | else if (bus_flags & DRM_BUS_FLAG_DE_HIGH) | ||
132 | vm->flags |= DISPLAY_FLAGS_DE_HIGH; | ||
133 | } | ||
134 | |||
135 | if (!(vm->flags & (DISPLAY_FLAGS_PIXDATA_POSEDGE | | ||
136 | DISPLAY_FLAGS_PIXDATA_NEGEDGE))) { | ||
137 | if (bus_flags & DRM_BUS_FLAG_PIXDATA_POSEDGE) | ||
138 | vm->flags |= DISPLAY_FLAGS_PIXDATA_POSEDGE; | ||
139 | else if (bus_flags & DRM_BUS_FLAG_PIXDATA_NEGEDGE) | ||
140 | vm->flags |= DISPLAY_FLAGS_PIXDATA_NEGEDGE; | ||
141 | } | ||
108 | 142 | ||
109 | ret = dssdev->ops->check_timings(dssdev, vm); | 143 | if (!(vm->flags & (DISPLAY_FLAGS_SYNC_POSEDGE | |
110 | if (ret) { | 144 | DISPLAY_FLAGS_SYNC_NEGEDGE))) { |
111 | dev_err(dev->dev, "invalid timings: %d\n", ret); | 145 | if (bus_flags & DRM_BUS_FLAG_SYNC_POSEDGE) |
112 | return ret; | 146 | vm->flags |= DISPLAY_FLAGS_SYNC_POSEDGE; |
147 | else if (bus_flags & DRM_BUS_FLAG_SYNC_NEGEDGE) | ||
148 | vm->flags |= DISPLAY_FLAGS_SYNC_NEGEDGE; | ||
113 | } | 149 | } |
114 | } | 150 | } |
115 | 151 | ||