diff options
Diffstat (limited to 'drivers/gpu/drm/meson/meson_vclk.c')
-rw-r--r-- | drivers/gpu/drm/meson/meson_vclk.c | 219 |
1 files changed, 215 insertions, 4 deletions
diff --git a/drivers/gpu/drm/meson/meson_vclk.c b/drivers/gpu/drm/meson/meson_vclk.c index 47677047e42d..f0511220317f 100644 --- a/drivers/gpu/drm/meson/meson_vclk.c +++ b/drivers/gpu/drm/meson/meson_vclk.c | |||
@@ -328,14 +328,24 @@ static void meson_venci_cvbs_clock_config(struct meson_drm *priv) | |||
328 | #define MESON_VCLK_HDMI_DDR_54000 2 | 328 | #define MESON_VCLK_HDMI_DDR_54000 2 |
329 | /* 2970 /4 /1 /1 /5 /1 => /1 /2 */ | 329 | /* 2970 /4 /1 /1 /5 /1 => /1 /2 */ |
330 | #define MESON_VCLK_HDMI_DDR_148500 3 | 330 | #define MESON_VCLK_HDMI_DDR_148500 3 |
331 | /* 4028 /4 /4 /1 /5 /2 => /1 /1 */ | ||
332 | #define MESON_VCLK_HDMI_25175 4 | ||
333 | /* 3200 /4 /2 /1 /5 /2 => /1 /1 */ | ||
334 | #define MESON_VCLK_HDMI_40000 5 | ||
335 | /* 5200 /4 /2 /1 /5 /2 => /1 /1 */ | ||
336 | #define MESON_VCLK_HDMI_65000 6 | ||
331 | /* 2970 /2 /2 /2 /5 /1 => /1 /1 */ | 337 | /* 2970 /2 /2 /2 /5 /1 => /1 /1 */ |
332 | #define MESON_VCLK_HDMI_74250 4 | 338 | #define MESON_VCLK_HDMI_74250 7 |
339 | /* 4320 /4 /1 /1 /5 /2 => /1 /1 */ | ||
340 | #define MESON_VCLK_HDMI_108000 8 | ||
333 | /* 2970 /1 /2 /2 /5 /1 => /1 /1 */ | 341 | /* 2970 /1 /2 /2 /5 /1 => /1 /1 */ |
334 | #define MESON_VCLK_HDMI_148500 5 | 342 | #define MESON_VCLK_HDMI_148500 9 |
343 | /* 3240 /2 /1 /1 /5 /2 => /1 /1 */ | ||
344 | #define MESON_VCLK_HDMI_162000 10 | ||
335 | /* 2970 /1 /1 /1 /5 /2 => /1 /1 */ | 345 | /* 2970 /1 /1 /1 /5 /2 => /1 /1 */ |
336 | #define MESON_VCLK_HDMI_297000 6 | 346 | #define MESON_VCLK_HDMI_297000 11 |
337 | /* 5940 /1 /1 /2 /5 /1 => /1 /1 */ | 347 | /* 5940 /1 /1 /2 /5 /1 => /1 /1 */ |
338 | #define MESON_VCLK_HDMI_594000 7 | 348 | #define MESON_VCLK_HDMI_594000 12 |
339 | 349 | ||
340 | struct meson_vclk_params { | 350 | struct meson_vclk_params { |
341 | unsigned int pll_base_freq; | 351 | unsigned int pll_base_freq; |
@@ -401,6 +411,46 @@ struct meson_vclk_params { | |||
401 | .vid_pll_div = VID_PLL_DIV_5, | 411 | .vid_pll_div = VID_PLL_DIV_5, |
402 | .vclk_div = 1, | 412 | .vclk_div = 1, |
403 | }, | 413 | }, |
414 | [MESON_VCLK_HDMI_25175] = { | ||
415 | .pll_base_freq = 4028000, | ||
416 | .pll_od1 = 4, | ||
417 | .pll_od2 = 4, | ||
418 | .pll_od3 = 1, | ||
419 | .vid_pll_div = VID_PLL_DIV_5, | ||
420 | .vclk_div = 2, | ||
421 | }, | ||
422 | [MESON_VCLK_HDMI_40000] = { | ||
423 | .pll_base_freq = 3200000, | ||
424 | .pll_od1 = 4, | ||
425 | .pll_od2 = 2, | ||
426 | .pll_od3 = 1, | ||
427 | .vid_pll_div = VID_PLL_DIV_5, | ||
428 | .vclk_div = 2, | ||
429 | }, | ||
430 | [MESON_VCLK_HDMI_65000] = { | ||
431 | .pll_base_freq = 5200000, | ||
432 | .pll_od1 = 4, | ||
433 | .pll_od2 = 2, | ||
434 | .pll_od3 = 1, | ||
435 | .vid_pll_div = VID_PLL_DIV_5, | ||
436 | .vclk_div = 2, | ||
437 | }, | ||
438 | [MESON_VCLK_HDMI_108000] = { | ||
439 | .pll_base_freq = 4320000, | ||
440 | .pll_od1 = 4, | ||
441 | .pll_od2 = 1, | ||
442 | .pll_od3 = 1, | ||
443 | .vid_pll_div = VID_PLL_DIV_5, | ||
444 | .vclk_div = 2, | ||
445 | }, | ||
446 | [MESON_VCLK_HDMI_162000] = { | ||
447 | .pll_base_freq = 3240000, | ||
448 | .pll_od1 = 2, | ||
449 | .pll_od2 = 1, | ||
450 | .pll_od3 = 1, | ||
451 | .vid_pll_div = VID_PLL_DIV_5, | ||
452 | .vclk_div = 2, | ||
453 | }, | ||
404 | }; | 454 | }; |
405 | 455 | ||
406 | static inline unsigned int pll_od_to_reg(unsigned int od) | 456 | static inline unsigned int pll_od_to_reg(unsigned int od) |
@@ -451,6 +501,90 @@ void meson_hdmi_pll_set(struct meson_drm *priv, | |||
451 | 0xFFFF, 0x4e00); | 501 | 0xFFFF, 0x4e00); |
452 | break; | 502 | break; |
453 | 503 | ||
504 | case 3200000: | ||
505 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL, 0x58000242); | ||
506 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL2, 0x00000000); | ||
507 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL3, 0x0d5c5091); | ||
508 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL4, 0x801da72c); | ||
509 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL5, 0x71486980); | ||
510 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL6, 0x00000e55); | ||
511 | |||
512 | /* unreset */ | ||
513 | regmap_update_bits(priv->hhi, HHI_HDMI_PLL_CNTL, | ||
514 | BIT(28), 0); | ||
515 | |||
516 | /* Poll for lock bit */ | ||
517 | regmap_read_poll_timeout(priv->hhi, HHI_HDMI_PLL_CNTL, | ||
518 | val, (val & HDMI_PLL_LOCK), 10, 0); | ||
519 | |||
520 | /* div_frac */ | ||
521 | regmap_update_bits(priv->hhi, HHI_HDMI_PLL_CNTL2, | ||
522 | 0xFFFF, 0x4aab); | ||
523 | break; | ||
524 | |||
525 | case 3240000: | ||
526 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL, 0x58000243); | ||
527 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL2, 0x00000000); | ||
528 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL3, 0x0d5c5091); | ||
529 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL4, 0x801da72c); | ||
530 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL5, 0x71486980); | ||
531 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL6, 0x00000e55); | ||
532 | |||
533 | /* unreset */ | ||
534 | regmap_update_bits(priv->hhi, HHI_HDMI_PLL_CNTL, | ||
535 | BIT(28), 0); | ||
536 | |||
537 | /* Poll for lock bit */ | ||
538 | regmap_read_poll_timeout(priv->hhi, HHI_HDMI_PLL_CNTL, | ||
539 | val, (val & HDMI_PLL_LOCK), 10, 0); | ||
540 | |||
541 | /* div_frac */ | ||
542 | regmap_update_bits(priv->hhi, HHI_HDMI_PLL_CNTL2, | ||
543 | 0xFFFF, 0x4800); | ||
544 | break; | ||
545 | |||
546 | case 3865000: | ||
547 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL, 0x58000250); | ||
548 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL2, 0x00000000); | ||
549 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL3, 0x0d5c5091); | ||
550 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL4, 0x801da72c); | ||
551 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL5, 0x71486980); | ||
552 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL6, 0x00000e55); | ||
553 | |||
554 | /* unreset */ | ||
555 | regmap_update_bits(priv->hhi, HHI_HDMI_PLL_CNTL, | ||
556 | BIT(28), 0); | ||
557 | |||
558 | /* Poll for lock bit */ | ||
559 | regmap_read_poll_timeout(priv->hhi, HHI_HDMI_PLL_CNTL, | ||
560 | val, (val & HDMI_PLL_LOCK), 10, 0); | ||
561 | |||
562 | /* div_frac */ | ||
563 | regmap_update_bits(priv->hhi, HHI_HDMI_PLL_CNTL2, | ||
564 | 0xFFFF, 0x4855); | ||
565 | break; | ||
566 | |||
567 | case 4028000: | ||
568 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL, 0x58000253); | ||
569 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL2, 0x00000000); | ||
570 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL3, 0x0d5c5091); | ||
571 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL4, 0x801da72c); | ||
572 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL5, 0x71486980); | ||
573 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL6, 0x00000e55); | ||
574 | |||
575 | /* unreset */ | ||
576 | regmap_update_bits(priv->hhi, HHI_HDMI_PLL_CNTL, | ||
577 | BIT(28), 0); | ||
578 | |||
579 | /* Poll for lock bit */ | ||
580 | regmap_read_poll_timeout(priv->hhi, HHI_HDMI_PLL_CNTL, | ||
581 | val, (val & HDMI_PLL_LOCK), 10, 0); | ||
582 | |||
583 | /* div_frac */ | ||
584 | regmap_update_bits(priv->hhi, HHI_HDMI_PLL_CNTL2, | ||
585 | 0xFFFF, 0x4eab); | ||
586 | break; | ||
587 | |||
454 | case 4320000: | 588 | case 4320000: |
455 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL, 0x5800025a); | 589 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL, 0x5800025a); |
456 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL2, 0x00000000); | 590 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL2, 0x00000000); |
@@ -485,6 +619,23 @@ void meson_hdmi_pll_set(struct meson_drm *priv, | |||
485 | regmap_read_poll_timeout(priv->hhi, HHI_HDMI_PLL_CNTL, | 619 | regmap_read_poll_timeout(priv->hhi, HHI_HDMI_PLL_CNTL, |
486 | val, (val & HDMI_PLL_LOCK), 10, 0); | 620 | val, (val & HDMI_PLL_LOCK), 10, 0); |
487 | break; | 621 | break; |
622 | |||
623 | case 5200000: | ||
624 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL, 0x5800026c); | ||
625 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL2, 0x00000000); | ||
626 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL3, 0x135c5091); | ||
627 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL4, 0x801da72c); | ||
628 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL5, 0x71486980); | ||
629 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL6, 0x00000e55); | ||
630 | |||
631 | /* unreset */ | ||
632 | regmap_update_bits(priv->hhi, HHI_HDMI_PLL_CNTL, | ||
633 | BIT(28), 0); | ||
634 | |||
635 | /* Poll for lock bit */ | ||
636 | regmap_read_poll_timeout(priv->hhi, HHI_HDMI_PLL_CNTL, | ||
637 | val, (val & HDMI_PLL_LOCK), 10, 0); | ||
638 | break; | ||
488 | }; | 639 | }; |
489 | } else if (meson_vpu_is_compatible(priv, "amlogic,meson-gxm-vpu") || | 640 | } else if (meson_vpu_is_compatible(priv, "amlogic,meson-gxm-vpu") || |
490 | meson_vpu_is_compatible(priv, "amlogic,meson-gxl-vpu")) { | 641 | meson_vpu_is_compatible(priv, "amlogic,meson-gxl-vpu")) { |
@@ -498,6 +649,42 @@ void meson_hdmi_pll_set(struct meson_drm *priv, | |||
498 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL6, 0x01a31500); | 649 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL6, 0x01a31500); |
499 | break; | 650 | break; |
500 | 651 | ||
652 | case 3200000: | ||
653 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL, 0x40000285); | ||
654 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL2, 0x800cb155); | ||
655 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL3, 0x860f30c4); | ||
656 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL4, 0x0c8e0000); | ||
657 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL5, 0x001fa729); | ||
658 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL6, 0x01a31500); | ||
659 | break; | ||
660 | |||
661 | case 3240000: | ||
662 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL, 0x40000287); | ||
663 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL2, 0x800cb000); | ||
664 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL3, 0x860f30c4); | ||
665 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL4, 0x0c8e0000); | ||
666 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL5, 0x001fa729); | ||
667 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL6, 0x01a31500); | ||
668 | break; | ||
669 | |||
670 | case 3865000: | ||
671 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL, 0x400002a1); | ||
672 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL2, 0x800cb02b); | ||
673 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL3, 0x860f30c4); | ||
674 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL4, 0x0c8e0000); | ||
675 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL5, 0x001fa729); | ||
676 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL6, 0x01a31500); | ||
677 | break; | ||
678 | |||
679 | case 4028000: | ||
680 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL, 0x400002a7); | ||
681 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL2, 0x800cb355); | ||
682 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL3, 0x860f30c4); | ||
683 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL4, 0x0c8e0000); | ||
684 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL5, 0x001fa729); | ||
685 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL6, 0x01a31500); | ||
686 | break; | ||
687 | |||
501 | case 4320000: | 688 | case 4320000: |
502 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL, 0x400002b4); | 689 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL, 0x400002b4); |
503 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL2, 0x800cb000); | 690 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL2, 0x800cb000); |
@@ -516,6 +703,15 @@ void meson_hdmi_pll_set(struct meson_drm *priv, | |||
516 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL6, 0x01a31500); | 703 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL6, 0x01a31500); |
517 | break; | 704 | break; |
518 | 705 | ||
706 | case 5200000: | ||
707 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL, 0x400002d8); | ||
708 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL2, 0x800cb2ab); | ||
709 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL3, 0x860f30c4); | ||
710 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL4, 0x0c8e0000); | ||
711 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL5, 0x001fa729); | ||
712 | regmap_write(priv->hhi, HHI_HDMI_PLL_CNTL6, 0x01a31500); | ||
713 | break; | ||
714 | |||
519 | }; | 715 | }; |
520 | 716 | ||
521 | /* Reset PLL */ | 717 | /* Reset PLL */ |
@@ -590,15 +786,30 @@ void meson_vclk_setup(struct meson_drm *priv, unsigned int target, | |||
590 | else | 786 | else |
591 | freq = MESON_VCLK_HDMI_DDR_54000; | 787 | freq = MESON_VCLK_HDMI_DDR_54000; |
592 | break; | 788 | break; |
789 | case 25175: | ||
790 | freq = MESON_VCLK_HDMI_25175; | ||
791 | break; | ||
792 | case 40000: | ||
793 | freq = MESON_VCLK_HDMI_40000; | ||
794 | break; | ||
795 | case 65000: | ||
796 | freq = MESON_VCLK_HDMI_65000; | ||
797 | break; | ||
593 | case 74250: | 798 | case 74250: |
594 | freq = MESON_VCLK_HDMI_74250; | 799 | freq = MESON_VCLK_HDMI_74250; |
595 | break; | 800 | break; |
801 | case 108000: | ||
802 | freq = MESON_VCLK_HDMI_108000; | ||
803 | break; | ||
596 | case 148500: | 804 | case 148500: |
597 | if (dac_freq != 148500) | 805 | if (dac_freq != 148500) |
598 | freq = MESON_VCLK_HDMI_DDR_148500; | 806 | freq = MESON_VCLK_HDMI_DDR_148500; |
599 | else | 807 | else |
600 | freq = MESON_VCLK_HDMI_148500; | 808 | freq = MESON_VCLK_HDMI_148500; |
601 | break; | 809 | break; |
810 | case 162000: | ||
811 | freq = MESON_VCLK_HDMI_162000; | ||
812 | break; | ||
602 | case 297000: | 813 | case 297000: |
603 | freq = MESON_VCLK_HDMI_297000; | 814 | freq = MESON_VCLK_HDMI_297000; |
604 | break; | 815 | break; |