diff options
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 | ||