@@ -369,12 +369,9 @@ static void vc4_hdmi_csc_setup(struct vc4_hdmi *vc4_hdmi, bool enable)
369
369
HDMI_WRITE (HDMI_CSC_CTL , csc_ctl );
370
370
}
371
371
372
- static void vc4_hdmi_encoder_enable (struct drm_encoder * encoder )
372
+ static void vc4_hdmi_set_timings (struct vc4_hdmi * vc4_hdmi ,
373
+ struct drm_display_mode * mode )
373
374
{
374
- struct drm_display_mode * mode = & encoder -> crtc -> state -> adjusted_mode ;
375
- struct vc4_hdmi * vc4_hdmi = encoder_to_vc4_hdmi (encoder );
376
- struct vc4_hdmi_encoder * vc4_encoder = & vc4_hdmi -> encoder ;
377
- bool debug_dump_regs = false;
378
375
bool hsync_pos = mode -> flags & DRM_MODE_FLAG_PHSYNC ;
379
376
bool vsync_pos = mode -> flags & DRM_MODE_FLAG_PVSYNC ;
380
377
bool interlaced = mode -> flags & DRM_MODE_FLAG_INTERLACE ;
@@ -392,6 +389,41 @@ static void vc4_hdmi_encoder_enable(struct drm_encoder *encoder)
392
389
mode -> crtc_vsync_end -
393
390
interlaced ,
394
391
VC4_HDMI_VERTB_VBP ));
392
+
393
+ HDMI_WRITE (HDMI_HORZA ,
394
+ (vsync_pos ? VC4_HDMI_HORZA_VPOS : 0 ) |
395
+ (hsync_pos ? VC4_HDMI_HORZA_HPOS : 0 ) |
396
+ VC4_SET_FIELD (mode -> hdisplay * pixel_rep ,
397
+ VC4_HDMI_HORZA_HAP ));
398
+
399
+ HDMI_WRITE (HDMI_HORZB ,
400
+ VC4_SET_FIELD ((mode -> htotal -
401
+ mode -> hsync_end ) * pixel_rep ,
402
+ VC4_HDMI_HORZB_HBP ) |
403
+ VC4_SET_FIELD ((mode -> hsync_end -
404
+ mode -> hsync_start ) * pixel_rep ,
405
+ VC4_HDMI_HORZB_HSP ) |
406
+ VC4_SET_FIELD ((mode -> hsync_start -
407
+ mode -> hdisplay ) * pixel_rep ,
408
+ VC4_HDMI_HORZB_HFP ));
409
+
410
+ HDMI_WRITE (HDMI_VERTA0 , verta );
411
+ HDMI_WRITE (HDMI_VERTA1 , verta );
412
+
413
+ HDMI_WRITE (HDMI_VERTB0 , vertb_even );
414
+ HDMI_WRITE (HDMI_VERTB1 , vertb );
415
+
416
+ HDMI_WRITE (HDMI_VID_CTL ,
417
+ (vsync_pos ? 0 : VC4_HD_VID_CTL_VSYNC_LOW ) |
418
+ (hsync_pos ? 0 : VC4_HD_VID_CTL_HSYNC_LOW ));
419
+ }
420
+
421
+ static void vc4_hdmi_encoder_enable (struct drm_encoder * encoder )
422
+ {
423
+ struct drm_display_mode * mode = & encoder -> crtc -> state -> adjusted_mode ;
424
+ struct vc4_hdmi * vc4_hdmi = encoder_to_vc4_hdmi (encoder );
425
+ struct vc4_hdmi_encoder * vc4_encoder = to_vc4_hdmi_encoder (encoder );
426
+ bool debug_dump_regs = false;
395
427
int ret ;
396
428
397
429
ret = pm_runtime_get_sync (& vc4_hdmi -> pdev -> dev );
@@ -435,33 +467,8 @@ static void vc4_hdmi_encoder_enable(struct drm_encoder *encoder)
435
467
VC4_HDMI_SCHEDULER_CONTROL_MANUAL_FORMAT |
436
468
VC4_HDMI_SCHEDULER_CONTROL_IGNORE_VSYNC_PREDICTS );
437
469
438
- HDMI_WRITE (HDMI_HORZA ,
439
- (vsync_pos ? VC4_HDMI_HORZA_VPOS : 0 ) |
440
- (hsync_pos ? VC4_HDMI_HORZA_HPOS : 0 ) |
441
- VC4_SET_FIELD (mode -> hdisplay * pixel_rep ,
442
- VC4_HDMI_HORZA_HAP ));
443
-
444
- HDMI_WRITE (HDMI_HORZB ,
445
- VC4_SET_FIELD ((mode -> htotal -
446
- mode -> hsync_end ) * pixel_rep ,
447
- VC4_HDMI_HORZB_HBP ) |
448
- VC4_SET_FIELD ((mode -> hsync_end -
449
- mode -> hsync_start ) * pixel_rep ,
450
- VC4_HDMI_HORZB_HSP ) |
451
- VC4_SET_FIELD ((mode -> hsync_start -
452
- mode -> hdisplay ) * pixel_rep ,
453
- VC4_HDMI_HORZB_HFP ));
454
-
455
- HDMI_WRITE (HDMI_VERTA0 , verta );
456
- HDMI_WRITE (HDMI_VERTA1 , verta );
457
-
458
- HDMI_WRITE (HDMI_VERTB0 , vertb_even );
459
- HDMI_WRITE (HDMI_VERTB1 , vertb );
460
-
461
- HDMI_WRITE (HDMI_VID_CTL ,
462
- (vsync_pos ? 0 : VC4_HD_VID_CTL_VSYNC_LOW ) |
463
- (hsync_pos ? 0 : VC4_HD_VID_CTL_HSYNC_LOW ));
464
-
470
+ if (vc4_hdmi -> variant -> set_timings )
471
+ vc4_hdmi -> variant -> set_timings (vc4_hdmi , mode );
465
472
466
473
if (vc4_encoder -> hdmi_monitor &&
467
474
drm_default_rgb_quant_range (mode ) == HDMI_QUANTIZATION_RANGE_LIMITED ) {
@@ -1445,6 +1452,7 @@ static const struct vc4_hdmi_variant bcm2835_variant = {
1445
1452
.init_resources = vc4_hdmi_init_resources ,
1446
1453
.csc_setup = vc4_hdmi_csc_setup ,
1447
1454
.reset = vc4_hdmi_reset ,
1455
+ .set_timings = vc4_hdmi_set_timings ,
1448
1456
.phy_init = vc4_hdmi_phy_init ,
1449
1457
.phy_disable = vc4_hdmi_phy_disable ,
1450
1458
.phy_rng_enable = vc4_hdmi_phy_rng_enable ,
0 commit comments