aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteve Longerbeam <slongerbeam@gmail.com>2014-12-18 21:00:25 -0500
committerPhilipp Zabel <p.zabel@pengutronix.de>2015-01-07 13:15:03 -0500
commitb6835a719aaa5ee6f493c94cb8b1ff9ad13f5a18 (patch)
treea97e12f8d51dc4d333524e0f0612b75f99987cf7
parenteb10d6355532def3a74aaabd115e2373cca70b9d (diff)
gpu: ipu-v3: Use videomode in struct ipu_di_signal_cfg
This patch changes struct ipu_di_signal_cfg to use struct videomode to define video timings and flags. Signed-off-by: Steve Longerbeam <steve_longerbeam@mentor.com> Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
-rw-r--r--drivers/gpu/drm/imx/ipuv3-crtc.c26
-rw-r--r--drivers/gpu/ipu-v3/ipu-di.c89
-rw-r--r--include/video/imx-ipu-v3.h19
3 files changed, 56 insertions, 78 deletions
diff --git a/drivers/gpu/drm/imx/ipuv3-crtc.c b/drivers/gpu/drm/imx/ipuv3-crtc.c
index 23d69ecb62dd..c1fc3735913d 100644
--- a/drivers/gpu/drm/imx/ipuv3-crtc.c
+++ b/drivers/gpu/drm/imx/ipuv3-crtc.c
@@ -153,35 +153,19 @@ static int ipu_crtc_mode_set(struct drm_crtc *crtc,
153 153
154 out_pixel_fmt = ipu_crtc->interface_pix_fmt; 154 out_pixel_fmt = ipu_crtc->interface_pix_fmt;
155 155
156 if (mode->flags & DRM_MODE_FLAG_INTERLACE)
157 sig_cfg.interlaced = 1;
158 if (mode->flags & DRM_MODE_FLAG_PHSYNC)
159 sig_cfg.Hsync_pol = 1;
160 if (mode->flags & DRM_MODE_FLAG_PVSYNC)
161 sig_cfg.Vsync_pol = 1;
162
163 sig_cfg.enable_pol = 1; 156 sig_cfg.enable_pol = 1;
164 sig_cfg.clk_pol = 0; 157 sig_cfg.clk_pol = 0;
165 sig_cfg.width = mode->hdisplay;
166 sig_cfg.height = mode->vdisplay;
167 sig_cfg.pixel_fmt = out_pixel_fmt; 158 sig_cfg.pixel_fmt = out_pixel_fmt;
168 sig_cfg.h_start_width = mode->htotal - mode->hsync_end;
169 sig_cfg.h_sync_width = mode->hsync_end - mode->hsync_start;
170 sig_cfg.h_end_width = mode->hsync_start - mode->hdisplay;
171
172 sig_cfg.v_start_width = mode->vtotal - mode->vsync_end;
173 sig_cfg.v_sync_width = mode->vsync_end - mode->vsync_start;
174 sig_cfg.v_end_width = mode->vsync_start - mode->vdisplay;
175 sig_cfg.pixelclock = mode->clock * 1000;
176 sig_cfg.clkflags = ipu_crtc->di_clkflags; 159 sig_cfg.clkflags = ipu_crtc->di_clkflags;
177
178 sig_cfg.v_to_h_sync = 0; 160 sig_cfg.v_to_h_sync = 0;
179
180 sig_cfg.hsync_pin = ipu_crtc->di_hsync_pin; 161 sig_cfg.hsync_pin = ipu_crtc->di_hsync_pin;
181 sig_cfg.vsync_pin = ipu_crtc->di_vsync_pin; 162 sig_cfg.vsync_pin = ipu_crtc->di_vsync_pin;
182 163
183 ret = ipu_dc_init_sync(ipu_crtc->dc, ipu_crtc->di, sig_cfg.interlaced, 164 drm_display_mode_to_videomode(mode, &sig_cfg.mode);
184 out_pixel_fmt, mode->hdisplay); 165
166 ret = ipu_dc_init_sync(ipu_crtc->dc, ipu_crtc->di,
167 mode->flags & DRM_MODE_FLAG_INTERLACE,
168 out_pixel_fmt, mode->hdisplay);
185 if (ret) { 169 if (ret) {
186 dev_err(ipu_crtc->dev, 170 dev_err(ipu_crtc->dev,
187 "initializing display controller failed with %d\n", 171 "initializing display controller failed with %d\n",
diff --git a/drivers/gpu/ipu-v3/ipu-di.c b/drivers/gpu/ipu-v3/ipu-di.c
index 41df8d75d8bd..d95fbd0f6952 100644
--- a/drivers/gpu/ipu-v3/ipu-di.c
+++ b/drivers/gpu/ipu-v3/ipu-di.c
@@ -207,10 +207,10 @@ static void ipu_di_sync_config(struct ipu_di *di, struct di_sync_config *config,
207static void ipu_di_sync_config_interlaced(struct ipu_di *di, 207static void ipu_di_sync_config_interlaced(struct ipu_di *di,
208 struct ipu_di_signal_cfg *sig) 208 struct ipu_di_signal_cfg *sig)
209{ 209{
210 u32 h_total = sig->width + sig->h_sync_width + 210 u32 h_total = sig->mode.hactive + sig->mode.hsync_len +
211 sig->h_start_width + sig->h_end_width; 211 sig->mode.hback_porch + sig->mode.hfront_porch;
212 u32 v_total = sig->height + sig->v_sync_width + 212 u32 v_total = sig->mode.vactive + sig->mode.vsync_len +
213 sig->v_start_width + sig->v_end_width; 213 sig->mode.vback_porch + sig->mode.vfront_porch;
214 u32 reg; 214 u32 reg;
215 struct di_sync_config cfg[] = { 215 struct di_sync_config cfg[] = {
216 { 216 {
@@ -229,13 +229,13 @@ static void ipu_di_sync_config_interlaced(struct ipu_di *di,
229 }, { 229 }, {
230 .run_count = v_total / 2 - 1, 230 .run_count = v_total / 2 - 1,
231 .run_src = DI_SYNC_HSYNC, 231 .run_src = DI_SYNC_HSYNC,
232 .offset_count = sig->v_start_width, 232 .offset_count = sig->mode.vback_porch,
233 .offset_src = DI_SYNC_HSYNC, 233 .offset_src = DI_SYNC_HSYNC,
234 .repeat_count = 2, 234 .repeat_count = 2,
235 .cnt_clr_src = DI_SYNC_VSYNC, 235 .cnt_clr_src = DI_SYNC_VSYNC,
236 }, { 236 }, {
237 .run_src = DI_SYNC_HSYNC, 237 .run_src = DI_SYNC_HSYNC,
238 .repeat_count = sig->height / 2, 238 .repeat_count = sig->mode.vactive / 2,
239 .cnt_clr_src = 4, 239 .cnt_clr_src = 4,
240 }, { 240 }, {
241 .run_count = v_total - 1, 241 .run_count = v_total - 1,
@@ -249,9 +249,9 @@ static void ipu_di_sync_config_interlaced(struct ipu_di *di,
249 .cnt_clr_src = DI_SYNC_VSYNC, 249 .cnt_clr_src = DI_SYNC_VSYNC,
250 }, { 250 }, {
251 .run_src = DI_SYNC_CLK, 251 .run_src = DI_SYNC_CLK,
252 .offset_count = sig->h_start_width, 252 .offset_count = sig->mode.hback_porch,
253 .offset_src = DI_SYNC_CLK, 253 .offset_src = DI_SYNC_CLK,
254 .repeat_count = sig->width, 254 .repeat_count = sig->mode.hactive,
255 .cnt_clr_src = 5, 255 .cnt_clr_src = 5,
256 }, { 256 }, {
257 .run_count = v_total - 1, 257 .run_count = v_total - 1,
@@ -277,10 +277,10 @@ static void ipu_di_sync_config_interlaced(struct ipu_di *di,
277static void ipu_di_sync_config_noninterlaced(struct ipu_di *di, 277static void ipu_di_sync_config_noninterlaced(struct ipu_di *di,
278 struct ipu_di_signal_cfg *sig, int div) 278 struct ipu_di_signal_cfg *sig, int div)
279{ 279{
280 u32 h_total = sig->width + sig->h_sync_width + sig->h_start_width + 280 u32 h_total = sig->mode.hactive + sig->mode.hsync_len +
281 sig->h_end_width; 281 sig->mode.hback_porch + sig->mode.hfront_porch;
282 u32 v_total = sig->height + sig->v_sync_width + sig->v_start_width + 282 u32 v_total = sig->mode.vactive + sig->mode.vsync_len +
283 sig->v_end_width; 283 sig->mode.vback_porch + sig->mode.vfront_porch;
284 struct di_sync_config cfg[] = { 284 struct di_sync_config cfg[] = {
285 { 285 {
286 /* 1: INT_HSYNC */ 286 /* 1: INT_HSYNC */
@@ -294,27 +294,29 @@ static void ipu_di_sync_config_noninterlaced(struct ipu_di *di,
294 .offset_src = DI_SYNC_CLK, 294 .offset_src = DI_SYNC_CLK,
295 .cnt_polarity_gen_en = 1, 295 .cnt_polarity_gen_en = 1,
296 .cnt_polarity_trigger_src = DI_SYNC_CLK, 296 .cnt_polarity_trigger_src = DI_SYNC_CLK,
297 .cnt_down = sig->h_sync_width * 2, 297 .cnt_down = sig->mode.hsync_len * 2,
298 } , { 298 } , {
299 /* PIN3: VSYNC */ 299 /* PIN3: VSYNC */
300 .run_count = v_total - 1, 300 .run_count = v_total - 1,
301 .run_src = DI_SYNC_INT_HSYNC, 301 .run_src = DI_SYNC_INT_HSYNC,
302 .cnt_polarity_gen_en = 1, 302 .cnt_polarity_gen_en = 1,
303 .cnt_polarity_trigger_src = DI_SYNC_INT_HSYNC, 303 .cnt_polarity_trigger_src = DI_SYNC_INT_HSYNC,
304 .cnt_down = sig->v_sync_width * 2, 304 .cnt_down = sig->mode.vsync_len * 2,
305 } , { 305 } , {
306 /* 4: Line Active */ 306 /* 4: Line Active */
307 .run_src = DI_SYNC_HSYNC, 307 .run_src = DI_SYNC_HSYNC,
308 .offset_count = sig->v_sync_width + sig->v_start_width, 308 .offset_count = sig->mode.vsync_len +
309 sig->mode.vback_porch,
309 .offset_src = DI_SYNC_HSYNC, 310 .offset_src = DI_SYNC_HSYNC,
310 .repeat_count = sig->height, 311 .repeat_count = sig->mode.vactive,
311 .cnt_clr_src = DI_SYNC_VSYNC, 312 .cnt_clr_src = DI_SYNC_VSYNC,
312 } , { 313 } , {
313 /* 5: Pixel Active, referenced by DC */ 314 /* 5: Pixel Active, referenced by DC */
314 .run_src = DI_SYNC_CLK, 315 .run_src = DI_SYNC_CLK,
315 .offset_count = sig->h_sync_width + sig->h_start_width, 316 .offset_count = sig->mode.hsync_len +
317 sig->mode.hback_porch,
316 .offset_src = DI_SYNC_CLK, 318 .offset_src = DI_SYNC_CLK,
317 .repeat_count = sig->width, 319 .repeat_count = sig->mode.hactive,
318 .cnt_clr_src = 5, /* Line Active */ 320 .cnt_clr_src = 5, /* Line Active */
319 } , { 321 } , {
320 /* unused */ 322 /* unused */
@@ -339,9 +341,10 @@ static void ipu_di_sync_config_noninterlaced(struct ipu_di *di,
339 } , { 341 } , {
340 /* 3: Line Active */ 342 /* 3: Line Active */
341 .run_src = DI_SYNC_INT_HSYNC, 343 .run_src = DI_SYNC_INT_HSYNC,
342 .offset_count = sig->v_sync_width + sig->v_start_width, 344 .offset_count = sig->mode.vsync_len +
345 sig->mode.vback_porch,
343 .offset_src = DI_SYNC_INT_HSYNC, 346 .offset_src = DI_SYNC_INT_HSYNC,
344 .repeat_count = sig->height, 347 .repeat_count = sig->mode.vactive,
345 .cnt_clr_src = 3 /* VSYNC */, 348 .cnt_clr_src = 3 /* VSYNC */,
346 } , { 349 } , {
347 /* PIN4: HSYNC for VGA via TVEv2 on TQ MBa53 */ 350 /* PIN4: HSYNC for VGA via TVEv2 on TQ MBa53 */
@@ -351,13 +354,14 @@ static void ipu_di_sync_config_noninterlaced(struct ipu_di *di,
351 .offset_src = DI_SYNC_CLK, 354 .offset_src = DI_SYNC_CLK,
352 .cnt_polarity_gen_en = 1, 355 .cnt_polarity_gen_en = 1,
353 .cnt_polarity_trigger_src = DI_SYNC_CLK, 356 .cnt_polarity_trigger_src = DI_SYNC_CLK,
354 .cnt_down = sig->h_sync_width * 2, 357 .cnt_down = sig->mode.hsync_len * 2,
355 } , { 358 } , {
356 /* 5: Pixel Active signal to DC */ 359 /* 5: Pixel Active signal to DC */
357 .run_src = DI_SYNC_CLK, 360 .run_src = DI_SYNC_CLK,
358 .offset_count = sig->h_sync_width + sig->h_start_width, 361 .offset_count = sig->mode.hsync_len +
362 sig->mode.hback_porch,
359 .offset_src = DI_SYNC_CLK, 363 .offset_src = DI_SYNC_CLK,
360 .repeat_count = sig->width, 364 .repeat_count = sig->mode.hactive,
361 .cnt_clr_src = 4, /* Line Active */ 365 .cnt_clr_src = 4, /* Line Active */
362 } , { 366 } , {
363 /* PIN6: VSYNC for VGA via TVEv2 on TQ MBa53 */ 367 /* PIN6: VSYNC for VGA via TVEv2 on TQ MBa53 */
@@ -367,7 +371,7 @@ static void ipu_di_sync_config_noninterlaced(struct ipu_di *di,
367 .offset_src = DI_SYNC_INT_HSYNC, 371 .offset_src = DI_SYNC_INT_HSYNC,
368 .cnt_polarity_gen_en = 1, 372 .cnt_polarity_gen_en = 1,
369 .cnt_polarity_trigger_src = DI_SYNC_INT_HSYNC, 373 .cnt_polarity_trigger_src = DI_SYNC_INT_HSYNC,
370 .cnt_down = sig->v_sync_width * 2, 374 .cnt_down = sig->mode.vsync_len * 2,
371 } , { 375 } , {
372 /* PIN4: HSYNC for VGA via TVEv2 on i.MX53-QSB */ 376 /* PIN4: HSYNC for VGA via TVEv2 on i.MX53-QSB */
373 .run_count = h_total - 1, 377 .run_count = h_total - 1,
@@ -376,7 +380,7 @@ static void ipu_di_sync_config_noninterlaced(struct ipu_di *di,
376 .offset_src = DI_SYNC_CLK, 380 .offset_src = DI_SYNC_CLK,
377 .cnt_polarity_gen_en = 1, 381 .cnt_polarity_gen_en = 1,
378 .cnt_polarity_trigger_src = DI_SYNC_CLK, 382 .cnt_polarity_trigger_src = DI_SYNC_CLK,
379 .cnt_down = sig->h_sync_width * 2, 383 .cnt_down = sig->mode.hsync_len * 2,
380 } , { 384 } , {
381 /* PIN6: VSYNC for VGA via TVEv2 on i.MX53-QSB */ 385 /* PIN6: VSYNC for VGA via TVEv2 on i.MX53-QSB */
382 .run_count = v_total - 1, 386 .run_count = v_total - 1,
@@ -385,7 +389,7 @@ static void ipu_di_sync_config_noninterlaced(struct ipu_di *di,
385 .offset_src = DI_SYNC_INT_HSYNC, 389 .offset_src = DI_SYNC_INT_HSYNC,
386 .cnt_polarity_gen_en = 1, 390 .cnt_polarity_gen_en = 1,
387 .cnt_polarity_trigger_src = DI_SYNC_INT_HSYNC, 391 .cnt_polarity_trigger_src = DI_SYNC_INT_HSYNC,
388 .cnt_down = sig->v_sync_width * 2, 392 .cnt_down = sig->mode.vsync_len * 2,
389 } , { 393 } , {
390 /* unused */ 394 /* unused */
391 }, 395 },
@@ -433,10 +437,11 @@ static void ipu_di_config_clock(struct ipu_di *di,
433 unsigned long in_rate; 437 unsigned long in_rate;
434 unsigned div; 438 unsigned div;
435 439
436 clk_set_rate(clk, sig->pixelclock); 440 clk_set_rate(clk, sig->mode.pixelclock);
437 441
438 in_rate = clk_get_rate(clk); 442 in_rate = clk_get_rate(clk);
439 div = (in_rate + sig->pixelclock / 2) / sig->pixelclock; 443 div = (in_rate + sig->mode.pixelclock / 2) /
444 sig->mode.pixelclock;
440 if (div == 0) 445 if (div == 0)
441 div = 1; 446 div = 1;
442 447
@@ -454,10 +459,11 @@ static void ipu_di_config_clock(struct ipu_di *di,
454 unsigned div, error; 459 unsigned div, error;
455 460
456 clkrate = clk_get_rate(di->clk_ipu); 461 clkrate = clk_get_rate(di->clk_ipu);
457 div = (clkrate + sig->pixelclock / 2) / sig->pixelclock; 462 div = (clkrate + sig->mode.pixelclock / 2) /
463 sig->mode.pixelclock;
458 rate = clkrate / div; 464 rate = clkrate / div;
459 465
460 error = rate / (sig->pixelclock / 1000); 466 error = rate / (sig->mode.pixelclock / 1000);
461 467
462 dev_dbg(di->ipu->dev, " IPU clock can give %lu with divider %u, error %d.%u%%\n", 468 dev_dbg(di->ipu->dev, " IPU clock can give %lu with divider %u, error %d.%u%%\n",
463 rate, div, (signed)(error - 1000) / 10, error % 10); 469 rate, div, (signed)(error - 1000) / 10, error % 10);
@@ -473,10 +479,11 @@ static void ipu_di_config_clock(struct ipu_di *di,
473 479
474 clk = di->clk_di; 480 clk = di->clk_di;
475 481
476 clk_set_rate(clk, sig->pixelclock); 482 clk_set_rate(clk, sig->mode.pixelclock);
477 483
478 in_rate = clk_get_rate(clk); 484 in_rate = clk_get_rate(clk);
479 div = (in_rate + sig->pixelclock / 2) / sig->pixelclock; 485 div = (in_rate + sig->mode.pixelclock / 2) /
486 sig->mode.pixelclock;
480 if (div == 0) 487 if (div == 0)
481 div = 1; 488 div = 1;
482 489
@@ -504,7 +511,7 @@ static void ipu_di_config_clock(struct ipu_di *di,
504 ipu_di_write(di, val, DI_GENERAL); 511 ipu_di_write(di, val, DI_GENERAL);
505 512
506 dev_dbg(di->ipu->dev, "Want %luHz IPU %luHz DI %luHz using %s, %luHz\n", 513 dev_dbg(di->ipu->dev, "Want %luHz IPU %luHz DI %luHz using %s, %luHz\n",
507 sig->pixelclock, 514 sig->mode.pixelclock,
508 clk_get_rate(di->clk_ipu), 515 clk_get_rate(di->clk_ipu),
509 clk_get_rate(di->clk_di), 516 clk_get_rate(di->clk_di),
510 clk == di->clk_di ? "DI" : "IPU", 517 clk == di->clk_di ? "DI" : "IPU",
@@ -547,15 +554,15 @@ int ipu_di_init_sync_panel(struct ipu_di *di, struct ipu_di_signal_cfg *sig)
547 u32 div; 554 u32 div;
548 555
549 dev_dbg(di->ipu->dev, "disp %d: panel size = %d x %d\n", 556 dev_dbg(di->ipu->dev, "disp %d: panel size = %d x %d\n",
550 di->id, sig->width, sig->height); 557 di->id, sig->mode.hactive, sig->mode.vactive);
551 558
552 if ((sig->v_sync_width == 0) || (sig->h_sync_width == 0)) 559 if ((sig->mode.vsync_len == 0) || (sig->mode.hsync_len == 0))
553 return -EINVAL; 560 return -EINVAL;
554 561
555 dev_dbg(di->ipu->dev, "Clocks: IPU %luHz DI %luHz Needed %luHz\n", 562 dev_dbg(di->ipu->dev, "Clocks: IPU %luHz DI %luHz Needed %luHz\n",
556 clk_get_rate(di->clk_ipu), 563 clk_get_rate(di->clk_ipu),
557 clk_get_rate(di->clk_di), 564 clk_get_rate(di->clk_di),
558 sig->pixelclock); 565 sig->mode.pixelclock);
559 566
560 mutex_lock(&di_mutex); 567 mutex_lock(&di_mutex);
561 568
@@ -574,7 +581,7 @@ int ipu_di_init_sync_panel(struct ipu_di *di, struct ipu_di_signal_cfg *sig)
574 di_gen = ipu_di_read(di, DI_GENERAL) & DI_GEN_DI_CLK_EXT; 581 di_gen = ipu_di_read(di, DI_GENERAL) & DI_GEN_DI_CLK_EXT;
575 di_gen |= DI_GEN_DI_VSYNC_EXT; 582 di_gen |= DI_GEN_DI_VSYNC_EXT;
576 583
577 if (sig->interlaced) { 584 if (sig->mode.flags & DISPLAY_FLAGS_INTERLACED) {
578 ipu_di_sync_config_interlaced(di, sig); 585 ipu_di_sync_config_interlaced(di, sig);
579 586
580 /* set y_sel = 1 */ 587 /* set y_sel = 1 */
@@ -584,9 +591,9 @@ int ipu_di_init_sync_panel(struct ipu_di *di, struct ipu_di_signal_cfg *sig)
584 591
585 vsync_cnt = 7; 592 vsync_cnt = 7;
586 593
587 if (sig->Hsync_pol) 594 if (sig->mode.flags & DISPLAY_FLAGS_HSYNC_HIGH)
588 di_gen |= DI_GEN_POLARITY_3; 595 di_gen |= DI_GEN_POLARITY_3;
589 if (sig->Vsync_pol) 596 if (sig->mode.flags & DISPLAY_FLAGS_VSYNC_HIGH)
590 di_gen |= DI_GEN_POLARITY_2; 597 di_gen |= DI_GEN_POLARITY_2;
591 } else { 598 } else {
592 ipu_di_sync_config_noninterlaced(di, sig, div); 599 ipu_di_sync_config_noninterlaced(di, sig, div);
@@ -600,7 +607,7 @@ int ipu_di_init_sync_panel(struct ipu_di *di, struct ipu_di_signal_cfg *sig)
600 if (!(sig->hsync_pin == 2 && sig->vsync_pin == 3)) 607 if (!(sig->hsync_pin == 2 && sig->vsync_pin == 3))
601 vsync_cnt = 6; 608 vsync_cnt = 6;
602 609
603 if (sig->Hsync_pol) { 610 if (sig->mode.flags & DISPLAY_FLAGS_HSYNC_HIGH) {
604 if (sig->hsync_pin == 2) 611 if (sig->hsync_pin == 2)
605 di_gen |= DI_GEN_POLARITY_2; 612 di_gen |= DI_GEN_POLARITY_2;
606 else if (sig->hsync_pin == 4) 613 else if (sig->hsync_pin == 4)
@@ -608,7 +615,7 @@ int ipu_di_init_sync_panel(struct ipu_di *di, struct ipu_di_signal_cfg *sig)
608 else if (sig->hsync_pin == 7) 615 else if (sig->hsync_pin == 7)
609 di_gen |= DI_GEN_POLARITY_7; 616 di_gen |= DI_GEN_POLARITY_7;
610 } 617 }
611 if (sig->Vsync_pol) { 618 if (sig->mode.flags & DISPLAY_FLAGS_VSYNC_HIGH) {
612 if (sig->vsync_pin == 3) 619 if (sig->vsync_pin == 3)
613 di_gen |= DI_GEN_POLARITY_3; 620 di_gen |= DI_GEN_POLARITY_3;
614 else if (sig->vsync_pin == 6) 621 else if (sig->vsync_pin == 6)
diff --git a/include/video/imx-ipu-v3.h b/include/video/imx-ipu-v3.h
index d333d54203a8..73390c120cad 100644
--- a/include/video/imx-ipu-v3.h
+++ b/include/video/imx-ipu-v3.h
@@ -33,28 +33,15 @@ enum ipuv3_type {
33 * Bitfield of Display Interface signal polarities. 33 * Bitfield of Display Interface signal polarities.
34 */ 34 */
35struct ipu_di_signal_cfg { 35struct ipu_di_signal_cfg {
36 unsigned datamask_en:1;
37 unsigned interlaced:1;
38 unsigned odd_field_first:1;
39 unsigned clksel_en:1;
40 unsigned clkidle_en:1;
41 unsigned data_pol:1; /* true = inverted */ 36 unsigned data_pol:1; /* true = inverted */
42 unsigned clk_pol:1; /* true = rising edge */ 37 unsigned clk_pol:1; /* true = rising edge */
43 unsigned enable_pol:1; 38 unsigned enable_pol:1;
44 unsigned Hsync_pol:1; /* true = active high */
45 unsigned Vsync_pol:1;
46 39
47 u16 width; 40 struct videomode mode;
48 u16 height; 41
49 u32 pixel_fmt; 42 u32 pixel_fmt;
50 u16 h_start_width;
51 u16 h_sync_width;
52 u16 h_end_width;
53 u16 v_start_width;
54 u16 v_sync_width;
55 u16 v_end_width;
56 u32 v_to_h_sync; 43 u32 v_to_h_sync;
57 unsigned long pixelclock; 44
58#define IPU_DI_CLKMODE_SYNC (1 << 0) 45#define IPU_DI_CLKMODE_SYNC (1 << 0)
59#define IPU_DI_CLKMODE_EXT (1 << 1) 46#define IPU_DI_CLKMODE_EXT (1 << 1)
60 unsigned long clkflags; 47 unsigned long clkflags;