aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2018-06-05 17:55:48 -0400
committerTomi Valkeinen <tomi.valkeinen@ti.com>2018-09-03 09:13:30 -0400
commit28120302c2fdf29b515c8cbd4e3a3867cb0cde7d (patch)
tree0c22f0b50a593be07b929271e073c1d5003fd0a1
parentb4935e3a3cfa456b356e9714e75513be672c227e (diff)
drm/omap: Don't call .check_timings() operation recursively
The .check_timings() operation is called recursively from the display device back to the output device. Most components just forward the operation to the previous component in the chain, resulting in lots of duplicated pass-through functions. To avoid that, iterate over the components manually. 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>
-rw-r--r--drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c9
-rw-r--r--drivers/gpu/drm/omapdrm/displays/connector-dvi.c9
-rw-r--r--drivers/gpu/drm/omapdrm/displays/connector-hdmi.c9
-rw-r--r--drivers/gpu/drm/omapdrm/displays/encoder-opa362.c11
-rw-r--r--drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c9
-rw-r--r--drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c9
-rw-r--r--drivers/gpu/drm/omapdrm/displays/panel-dpi.c9
-rw-r--r--drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c9
-rw-r--r--drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c9
-rw-r--r--drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c9
-rw-r--r--drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c9
-rw-r--r--drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c9
-rw-r--r--drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c9
-rw-r--r--drivers/gpu/drm/omapdrm/omap_connector.c32
-rw-r--r--drivers/gpu/drm/omapdrm/omap_encoder.c20
15 files changed, 32 insertions, 139 deletions
diff --git a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
index fb6d4fce1853..a9e2a366a851 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-analog-tv.c
@@ -109,14 +109,6 @@ static void tvc_get_timings(struct omap_dss_device *dssdev,
109 *vm = ddata->vm; 109 *vm = ddata->vm;
110} 110}
111 111
112static int tvc_check_timings(struct omap_dss_device *dssdev,
113 struct videomode *vm)
114{
115 struct omap_dss_device *src = dssdev->src;
116
117 return src->ops->check_timings(src, vm);
118}
119
120static const struct omap_dss_device_ops tvc_ops = { 112static const struct omap_dss_device_ops tvc_ops = {
121 .connect = tvc_connect, 113 .connect = tvc_connect,
122 .disconnect = tvc_disconnect, 114 .disconnect = tvc_disconnect,
@@ -126,7 +118,6 @@ static const struct omap_dss_device_ops tvc_ops = {
126 118
127 .set_timings = tvc_set_timings, 119 .set_timings = tvc_set_timings,
128 .get_timings = tvc_get_timings, 120 .get_timings = tvc_get_timings,
129 .check_timings = tvc_check_timings,
130}; 121};
131 122
132static int tvc_probe(struct platform_device *pdev) 123static int tvc_probe(struct platform_device *pdev)
diff --git a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
index 5871872ae19b..a9e2f1181987 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-dvi.c
@@ -116,14 +116,6 @@ static void dvic_get_timings(struct omap_dss_device *dssdev,
116 *vm = ddata->vm; 116 *vm = ddata->vm;
117} 117}
118 118
119static int dvic_check_timings(struct omap_dss_device *dssdev,
120 struct videomode *vm)
121{
122 struct omap_dss_device *src = dssdev->src;
123
124 return src->ops->check_timings(src, vm);
125}
126
127static int dvic_ddc_read(struct i2c_adapter *adapter, 119static int dvic_ddc_read(struct i2c_adapter *adapter,
128 unsigned char *buf, u16 count, u8 offset) 120 unsigned char *buf, u16 count, u8 offset)
129{ 121{
@@ -232,7 +224,6 @@ static const struct omap_dss_device_ops dvic_ops = {
232 224
233 .set_timings = dvic_set_timings, 225 .set_timings = dvic_set_timings,
234 .get_timings = dvic_get_timings, 226 .get_timings = dvic_get_timings,
235 .check_timings = dvic_check_timings,
236 227
237 .read_edid = dvic_read_edid, 228 .read_edid = dvic_read_edid,
238 .detect = dvic_detect, 229 .detect = dvic_detect,
diff --git a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
index 898eb583688f..7e449f8a9b5d 100644
--- a/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
+++ b/drivers/gpu/drm/omapdrm/displays/connector-hdmi.c
@@ -114,14 +114,6 @@ static void hdmic_get_timings(struct omap_dss_device *dssdev,
114 *vm = ddata->vm; 114 *vm = ddata->vm;
115} 115}
116 116
117static int hdmic_check_timings(struct omap_dss_device *dssdev,
118 struct videomode *vm)
119{
120 struct omap_dss_device *src = dssdev->src;
121
122 return src->ops->check_timings(src, vm);
123}
124
125static bool hdmic_detect(struct omap_dss_device *dssdev) 117static bool hdmic_detect(struct omap_dss_device *dssdev)
126{ 118{
127 struct panel_drv_data *ddata = to_panel_data(dssdev); 119 struct panel_drv_data *ddata = to_panel_data(dssdev);
@@ -161,7 +153,6 @@ static const struct omap_dss_device_ops hdmic_ops = {
161 153
162 .set_timings = hdmic_set_timings, 154 .set_timings = hdmic_set_timings,
163 .get_timings = hdmic_get_timings, 155 .get_timings = hdmic_get_timings,
164 .check_timings = hdmic_check_timings,
165 156
166 .detect = hdmic_detect, 157 .detect = hdmic_detect,
167 .register_hpd_cb = hdmic_register_hpd_cb, 158 .register_hpd_cb = hdmic_register_hpd_cb,
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
index 05d128600712..bdf796123133 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-opa362.c
@@ -95,22 +95,11 @@ static void opa362_set_timings(struct omap_dss_device *dssdev,
95 src->ops->set_timings(src, vm); 95 src->ops->set_timings(src, vm);
96} 96}
97 97
98static int opa362_check_timings(struct omap_dss_device *dssdev,
99 struct videomode *vm)
100{
101 struct omap_dss_device *src = dssdev->src;
102
103 dev_dbg(dssdev->dev, "check_timings\n");
104
105 return src->ops->check_timings(src, vm);
106}
107
108static const struct omap_dss_device_ops opa362_ops = { 98static const struct omap_dss_device_ops opa362_ops = {
109 .connect = opa362_connect, 99 .connect = opa362_connect,
110 .disconnect = opa362_disconnect, 100 .disconnect = opa362_disconnect,
111 .enable = opa362_enable, 101 .enable = opa362_enable,
112 .disable = opa362_disable, 102 .disable = opa362_disable,
113 .check_timings = opa362_check_timings,
114 .set_timings = opa362_set_timings, 103 .set_timings = opa362_set_timings,
115}; 104};
116 105
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
index 56b78cd38701..c3ceee2d19d0 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-tfp410.c
@@ -84,20 +84,11 @@ static void tfp410_set_timings(struct omap_dss_device *dssdev,
84 src->ops->set_timings(src, vm); 84 src->ops->set_timings(src, vm);
85} 85}
86 86
87static int tfp410_check_timings(struct omap_dss_device *dssdev,
88 struct videomode *vm)
89{
90 struct omap_dss_device *src = dssdev->src;
91
92 return src->ops->check_timings(src, vm);
93}
94
95static const struct omap_dss_device_ops tfp410_ops = { 87static const struct omap_dss_device_ops tfp410_ops = {
96 .connect = tfp410_connect, 88 .connect = tfp410_connect,
97 .disconnect = tfp410_disconnect, 89 .disconnect = tfp410_disconnect,
98 .enable = tfp410_enable, 90 .enable = tfp410_enable,
99 .disable = tfp410_disable, 91 .disable = tfp410_disable,
100 .check_timings = tfp410_check_timings,
101 .set_timings = tfp410_set_timings, 92 .set_timings = tfp410_set_timings,
102}; 93};
103 94
diff --git a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
index 1e24559e0aa1..4598e5ca4238 100644
--- a/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
+++ b/drivers/gpu/drm/omapdrm/displays/encoder-tpd12s015.c
@@ -99,14 +99,6 @@ static void tpd_set_timings(struct omap_dss_device *dssdev,
99 src->ops->set_timings(src, vm); 99 src->ops->set_timings(src, vm);
100} 100}
101 101
102static int tpd_check_timings(struct omap_dss_device *dssdev,
103 struct videomode *vm)
104{
105 struct omap_dss_device *src = dssdev->src;
106
107 return src->ops->check_timings(src, vm);
108}
109
110static bool tpd_detect(struct omap_dss_device *dssdev) 102static bool tpd_detect(struct omap_dss_device *dssdev)
111{ 103{
112 struct panel_drv_data *ddata = to_panel_data(dssdev); 104 struct panel_drv_data *ddata = to_panel_data(dssdev);
@@ -142,7 +134,6 @@ static const struct omap_dss_device_ops tpd_ops = {
142 .disconnect = tpd_disconnect, 134 .disconnect = tpd_disconnect,
143 .enable = tpd_enable, 135 .enable = tpd_enable,
144 .disable = tpd_disable, 136 .disable = tpd_disable,
145 .check_timings = tpd_check_timings,
146 .set_timings = tpd_set_timings, 137 .set_timings = tpd_set_timings,
147 .detect = tpd_detect, 138 .detect = tpd_detect,
148 .register_hpd_cb = tpd_register_hpd_cb, 139 .register_hpd_cb = tpd_register_hpd_cb,
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
index 32efed45a63c..e75600a33c37 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dpi.c
@@ -112,14 +112,6 @@ static void panel_dpi_get_timings(struct omap_dss_device *dssdev,
112 *vm = ddata->vm; 112 *vm = ddata->vm;
113} 113}
114 114
115static int panel_dpi_check_timings(struct omap_dss_device *dssdev,
116 struct videomode *vm)
117{
118 struct omap_dss_device *src = dssdev->src;
119
120 return src->ops->check_timings(src, vm);
121}
122
123static const struct omap_dss_device_ops panel_dpi_ops = { 115static const struct omap_dss_device_ops panel_dpi_ops = {
124 .connect = panel_dpi_connect, 116 .connect = panel_dpi_connect,
125 .disconnect = panel_dpi_disconnect, 117 .disconnect = panel_dpi_disconnect,
@@ -129,7 +121,6 @@ static const struct omap_dss_device_ops panel_dpi_ops = {
129 121
130 .set_timings = panel_dpi_set_timings, 122 .set_timings = panel_dpi_set_timings,
131 .get_timings = panel_dpi_get_timings, 123 .get_timings = panel_dpi_get_timings,
132 .check_timings = panel_dpi_check_timings,
133}; 124};
134 125
135static int panel_dpi_probe_of(struct platform_device *pdev) 126static int panel_dpi_probe_of(struct platform_device *pdev)
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
index a211506506c0..3c221f7f0598 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-lgphilips-lb035q02.c
@@ -182,14 +182,6 @@ static void lb035q02_get_timings(struct omap_dss_device *dssdev,
182 *vm = ddata->vm; 182 *vm = ddata->vm;
183} 183}
184 184
185static int lb035q02_check_timings(struct omap_dss_device *dssdev,
186 struct videomode *vm)
187{
188 struct omap_dss_device *src = dssdev->src;
189
190 return src->ops->check_timings(src, vm);
191}
192
193static const struct omap_dss_device_ops lb035q02_ops = { 185static const struct omap_dss_device_ops lb035q02_ops = {
194 .connect = lb035q02_connect, 186 .connect = lb035q02_connect,
195 .disconnect = lb035q02_disconnect, 187 .disconnect = lb035q02_disconnect,
@@ -199,7 +191,6 @@ static const struct omap_dss_device_ops lb035q02_ops = {
199 191
200 .set_timings = lb035q02_set_timings, 192 .set_timings = lb035q02_set_timings,
201 .get_timings = lb035q02_get_timings, 193 .get_timings = lb035q02_get_timings,
202 .check_timings = lb035q02_check_timings,
203}; 194};
204 195
205static int lb035q02_probe_of(struct spi_device *spi) 196static int lb035q02_probe_of(struct spi_device *spi)
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
index 1b2f33d43bd9..78ff18c4eb46 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-nec-nl8048hl11.c
@@ -175,14 +175,6 @@ static void nec_8048_get_timings(struct omap_dss_device *dssdev,
175 *vm = ddata->vm; 175 *vm = ddata->vm;
176} 176}
177 177
178static int nec_8048_check_timings(struct omap_dss_device *dssdev,
179 struct videomode *vm)
180{
181 struct omap_dss_device *src = dssdev->src;
182
183 return src->ops->check_timings(src, vm);
184}
185
186static const struct omap_dss_device_ops nec_8048_ops = { 178static const struct omap_dss_device_ops nec_8048_ops = {
187 .connect = nec_8048_connect, 179 .connect = nec_8048_connect,
188 .disconnect = nec_8048_disconnect, 180 .disconnect = nec_8048_disconnect,
@@ -192,7 +184,6 @@ static const struct omap_dss_device_ops nec_8048_ops = {
192 184
193 .set_timings = nec_8048_set_timings, 185 .set_timings = nec_8048_set_timings,
194 .get_timings = nec_8048_get_timings, 186 .get_timings = nec_8048_get_timings,
195 .check_timings = nec_8048_check_timings,
196}; 187};
197 188
198static int nec_8048_probe(struct spi_device *spi) 189static int nec_8048_probe(struct spi_device *spi)
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
index fbf88aaaaf56..47e97dbffc07 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sharp-ls037v7dw01.c
@@ -145,14 +145,6 @@ static void sharp_ls_get_timings(struct omap_dss_device *dssdev,
145 *vm = ddata->vm; 145 *vm = ddata->vm;
146} 146}
147 147
148static int sharp_ls_check_timings(struct omap_dss_device *dssdev,
149 struct videomode *vm)
150{
151 struct omap_dss_device *src = dssdev->src;
152
153 return src->ops->check_timings(src, vm);
154}
155
156static const struct omap_dss_device_ops sharp_ls_ops = { 148static const struct omap_dss_device_ops sharp_ls_ops = {
157 .connect = sharp_ls_connect, 149 .connect = sharp_ls_connect,
158 .disconnect = sharp_ls_disconnect, 150 .disconnect = sharp_ls_disconnect,
@@ -162,7 +154,6 @@ static const struct omap_dss_device_ops sharp_ls_ops = {
162 154
163 .set_timings = sharp_ls_set_timings, 155 .set_timings = sharp_ls_set_timings,
164 .get_timings = sharp_ls_get_timings, 156 .get_timings = sharp_ls_get_timings,
165 .check_timings = sharp_ls_check_timings,
166}; 157};
167 158
168static int sharp_ls_get_gpio_of(struct device *dev, int index, int val, 159static int sharp_ls_get_gpio_of(struct device *dev, int index, int val,
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
index 7e99d546132f..1ec3b1e2107c 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-sony-acx565akm.c
@@ -648,14 +648,6 @@ static void acx565akm_get_timings(struct omap_dss_device *dssdev,
648 *vm = ddata->vm; 648 *vm = ddata->vm;
649} 649}
650 650
651static int acx565akm_check_timings(struct omap_dss_device *dssdev,
652 struct videomode *vm)
653{
654 struct omap_dss_device *src = dssdev->src;
655
656 return src->ops->check_timings(src, vm);
657}
658
659static const struct omap_dss_device_ops acx565akm_ops = { 651static const struct omap_dss_device_ops acx565akm_ops = {
660 .connect = acx565akm_connect, 652 .connect = acx565akm_connect,
661 .disconnect = acx565akm_disconnect, 653 .disconnect = acx565akm_disconnect,
@@ -665,7 +657,6 @@ static const struct omap_dss_device_ops acx565akm_ops = {
665 657
666 .set_timings = acx565akm_set_timings, 658 .set_timings = acx565akm_set_timings,
667 .get_timings = acx565akm_get_timings, 659 .get_timings = acx565akm_get_timings,
668 .check_timings = acx565akm_check_timings,
669}; 660};
670 661
671static int acx565akm_probe(struct spi_device *spi) 662static int acx565akm_probe(struct spi_device *spi)
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
index e8c73ad48e0c..cff1a1a68827 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td028ttec1.c
@@ -314,14 +314,6 @@ static void td028ttec1_panel_get_timings(struct omap_dss_device *dssdev,
314 *vm = ddata->vm; 314 *vm = ddata->vm;
315} 315}
316 316
317static int td028ttec1_panel_check_timings(struct omap_dss_device *dssdev,
318 struct videomode *vm)
319{
320 struct omap_dss_device *src = dssdev->src;
321
322 return src->ops->check_timings(src, vm);
323}
324
325static const struct omap_dss_device_ops td028ttec1_ops = { 317static const struct omap_dss_device_ops td028ttec1_ops = {
326 .connect = td028ttec1_panel_connect, 318 .connect = td028ttec1_panel_connect,
327 .disconnect = td028ttec1_panel_disconnect, 319 .disconnect = td028ttec1_panel_disconnect,
@@ -331,7 +323,6 @@ static const struct omap_dss_device_ops td028ttec1_ops = {
331 323
332 .set_timings = td028ttec1_panel_set_timings, 324 .set_timings = td028ttec1_panel_set_timings,
333 .get_timings = td028ttec1_panel_get_timings, 325 .get_timings = td028ttec1_panel_get_timings,
334 .check_timings = td028ttec1_panel_check_timings,
335}; 326};
336 327
337static int td028ttec1_panel_probe(struct spi_device *spi) 328static int td028ttec1_panel_probe(struct spi_device *spi)
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
index ae7a40a1759a..513e846d52c4 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-tpo-td043mtea1.c
@@ -388,14 +388,6 @@ static void tpo_td043_get_timings(struct omap_dss_device *dssdev,
388 *vm = ddata->vm; 388 *vm = ddata->vm;
389} 389}
390 390
391static int tpo_td043_check_timings(struct omap_dss_device *dssdev,
392 struct videomode *vm)
393{
394 struct omap_dss_device *src = dssdev->src;
395
396 return src->ops->check_timings(src, vm);
397}
398
399static const struct omap_dss_device_ops tpo_td043_ops = { 391static const struct omap_dss_device_ops tpo_td043_ops = {
400 .connect = tpo_td043_connect, 392 .connect = tpo_td043_connect,
401 .disconnect = tpo_td043_disconnect, 393 .disconnect = tpo_td043_disconnect,
@@ -405,7 +397,6 @@ static const struct omap_dss_device_ops tpo_td043_ops = {
405 397
406 .set_timings = tpo_td043_set_timings, 398 .set_timings = tpo_td043_set_timings,
407 .get_timings = tpo_td043_get_timings, 399 .get_timings = tpo_td043_get_timings,
408 .check_timings = tpo_td043_check_timings,
409}; 400};
410 401
411static int tpo_td043_probe(struct spi_device *spi) 402static int tpo_td043_probe(struct spi_device *spi)
diff --git a/drivers/gpu/drm/omapdrm/omap_connector.c b/drivers/gpu/drm/omapdrm/omap_connector.c
index b58d9a0bb53d..302f2ed245d0 100644
--- a/drivers/gpu/drm/omapdrm/omap_connector.c
+++ b/drivers/gpu/drm/omapdrm/omap_connector.c
@@ -252,7 +252,7 @@ static int omap_connector_mode_valid(struct drm_connector *connector,
252 struct drm_display_mode *mode) 252 struct drm_display_mode *mode)
253{ 253{
254 struct omap_connector *omap_connector = to_omap_connector(connector); 254 struct omap_connector *omap_connector = to_omap_connector(connector);
255 struct omap_dss_device *dssdev = omap_connector->display; 255 struct omap_dss_device *dssdev;
256 struct videomode vm = {0}; 256 struct videomode vm = {0};
257 struct drm_device *dev = connector->dev; 257 struct drm_device *dev = connector->dev;
258 struct drm_display_mode *new_mode; 258 struct drm_display_mode *new_mode;
@@ -261,21 +261,27 @@ static int omap_connector_mode_valid(struct drm_connector *connector,
261 drm_display_mode_to_videomode(mode, &vm); 261 drm_display_mode_to_videomode(mode, &vm);
262 mode->vrefresh = drm_mode_vrefresh(mode); 262 mode->vrefresh = drm_mode_vrefresh(mode);
263 263
264 r = dssdev->ops->check_timings(dssdev, &vm); 264 for (dssdev = omap_connector->output; dssdev; dssdev = dssdev->next) {
265 if (!r) { 265 if (!dssdev->ops->check_timings)
266 /* check if vrefresh is still valid */ 266 continue;
267 new_mode = drm_mode_duplicate(dev, mode);
268
269 if (!new_mode)
270 return MODE_BAD;
271 267
272 new_mode->clock = vm.pixelclock / 1000; 268 r = dssdev->ops->check_timings(dssdev, &vm);
273 new_mode->vrefresh = 0; 269 if (r)
274 if (mode->vrefresh == drm_mode_vrefresh(new_mode)) 270 goto done;
275 ret = MODE_OK;
276 drm_mode_destroy(dev, new_mode);
277 } 271 }
278 272
273 /* check if vrefresh is still valid */
274 new_mode = drm_mode_duplicate(dev, mode);
275 if (!new_mode)
276 return MODE_BAD;
277
278 new_mode->clock = vm.pixelclock / 1000;
279 new_mode->vrefresh = 0;
280 if (mode->vrefresh == drm_mode_vrefresh(new_mode))
281 ret = MODE_OK;
282 drm_mode_destroy(dev, new_mode);
283
284done:
279 DBG("connector: mode %s: " 285 DBG("connector: mode %s: "
280 "%d:\"%s\" %d %d %d %d %d %d %d %d %d %d 0x%x 0x%x", 286 "%d:\"%s\" %d %d %d %d %d %d %d %d %d %d 0x%x 0x%x",
281 (ret == MODE_OK) ? "valid" : "invalid", 287 (ret == MODE_OK) ? "valid" : "invalid",
diff --git a/drivers/gpu/drm/omapdrm/omap_encoder.c b/drivers/gpu/drm/omapdrm/omap_encoder.c
index a6dce480b2cf..bb010c20d8b8 100644
--- a/drivers/gpu/drm/omapdrm/omap_encoder.c
+++ b/drivers/gpu/drm/omapdrm/omap_encoder.c
@@ -98,17 +98,23 @@ static int omap_encoder_update(struct drm_encoder *encoder,
98{ 98{
99 struct drm_device *dev = encoder->dev; 99 struct drm_device *dev = encoder->dev;
100 struct omap_encoder *omap_encoder = to_omap_encoder(encoder); 100 struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
101 struct omap_dss_device *dssdev = omap_encoder->display; 101 struct omap_dss_device *display = omap_encoder->display;
102 struct omap_dss_device *dssdev;
102 int ret; 103 int ret;
103 104
104 ret = dssdev->ops->check_timings(dssdev, vm); 105 for (dssdev = omap_encoder->output; dssdev; dssdev = dssdev->next) {
105 if (ret) { 106 if (!dssdev->ops->check_timings)
106 dev_err(dev->dev, "invalid timings: %d\n", ret); 107 continue;
107 return ret; 108
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 }
108 } 114 }
109 115
110 if (dssdev->ops->set_timings) 116 if (display->ops->set_timings)
111 dssdev->ops->set_timings(dssdev, vm); 117 display->ops->set_timings(display, vm);
112 118
113 return 0; 119 return 0;
114} 120}