Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/mgag200: Added support for the new device G200eH3

- Added the new device ID
- Added new pll algorithm

Signed-off-by: Mathieu Larouche <mathieu.larouche@matrox.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>

authored by

Mathieu Larouche and committed by
Dave Airlie
f0493e65 618a6109

+61 -19
+1
drivers/gpu/drm/mgag200/mgag200_drv.c
··· 36 36 { PCI_VENDOR_ID_MATROX, 0x533, PCI_ANY_ID, PCI_ANY_ID, 0, 0, G200_EH }, 37 37 { PCI_VENDOR_ID_MATROX, 0x534, PCI_ANY_ID, PCI_ANY_ID, 0, 0, G200_ER }, 38 38 { PCI_VENDOR_ID_MATROX, 0x536, PCI_ANY_ID, PCI_ANY_ID, 0, 0, G200_EW3 }, 39 + { PCI_VENDOR_ID_MATROX, 0x538, PCI_ANY_ID, PCI_ANY_ID, 0, 0, G200_EH3 }, 39 40 {0,} 40 41 }; 41 42
+1
drivers/gpu/drm/mgag200/mgag200_drv.h
··· 180 180 G200_WB, 181 181 G200_EV, 182 182 G200_EH, 183 + G200_EH3, 183 184 G200_ER, 184 185 G200_EW3, 185 186 };
+1
drivers/gpu/drm/mgag200/mgag200_i2c.c
··· 106 106 clock = 2; 107 107 break; 108 108 case G200_EH: 109 + case G200_EH3: 109 110 case G200_ER: 110 111 data = 2; 111 112 clock = 1;
+58 -19
drivers/gpu/drm/mgag200/mgag200_mode.c
··· 497 497 bool pll_locked = false; 498 498 499 499 m = n = p = 0; 500 - vcomax = 800000; 501 - vcomin = 400000; 502 - pllreffreq = 33333; 503 500 504 - delta = 0xffffffff; 501 + if (mdev->type == G200_EH3) { 502 + vcomax = 3000000; 503 + vcomin = 1500000; 504 + pllreffreq = 25000; 505 505 506 - for (testp = 16; testp > 0; testp >>= 1) { 507 - if (clock * testp > vcomax) 508 - continue; 509 - if (clock * testp < vcomin) 510 - continue; 506 + delta = 0xffffffff; 511 507 512 - for (testm = 1; testm < 33; testm++) { 513 - for (testn = 17; testn < 257; testn++) { 514 - computed = (pllreffreq * testn) / 515 - (testm * testp); 508 + testp = 0; 509 + 510 + for (testm = 150; testm >= 6; testm--) { 511 + if (clock * testm > vcomax) 512 + continue; 513 + if (clock * testm < vcomin) 514 + continue; 515 + for (testn = 120; testn >= 60; testn--) { 516 + computed = (pllreffreq * testn) / testm; 516 517 if (computed > clock) 517 518 tmpdelta = computed - clock; 518 519 else 519 520 tmpdelta = clock - computed; 520 521 if (tmpdelta < delta) { 521 522 delta = tmpdelta; 522 - n = testn - 1; 523 - m = (testm - 1); 524 - p = testp - 1; 523 + n = testn; 524 + m = testm; 525 + p = testp; 525 526 } 526 - if ((clock * testp) >= 600000) 527 - p |= 0x80; 527 + if (delta == 0) 528 + break; 529 + } 530 + if (delta == 0) 531 + break; 532 + } 533 + } else { 534 + 535 + vcomax = 800000; 536 + vcomin = 400000; 537 + pllreffreq = 33333; 538 + 539 + delta = 0xffffffff; 540 + 541 + for (testp = 16; testp > 0; testp >>= 1) { 542 + if (clock * testp > vcomax) 543 + continue; 544 + if (clock * testp < vcomin) 545 + continue; 546 + 547 + for (testm = 1; testm < 33; testm++) { 548 + for (testn = 17; testn < 257; testn++) { 549 + computed = (pllreffreq * testn) / 550 + (testm * testp); 551 + if (computed > clock) 552 + tmpdelta = computed - clock; 553 + else 554 + tmpdelta = clock - computed; 555 + if (tmpdelta < delta) { 556 + delta = tmpdelta; 557 + n = testn - 1; 558 + m = (testm - 1); 559 + p = testp - 1; 560 + } 561 + if ((clock * testp) >= 600000) 562 + p |= 0x80; 563 + } 528 564 } 529 565 } 530 566 } ··· 710 674 return mga_g200ev_set_plls(mdev, clock); 711 675 break; 712 676 case G200_EH: 677 + case G200_EH3: 713 678 return mga_g200eh_set_plls(mdev, clock); 714 679 break; 715 680 case G200_ER: ··· 970 933 option2 = 0x0000b000; 971 934 break; 972 935 case G200_EH: 936 + case G200_EH3: 973 937 dacvalue[MGA1064_MISC_CTL] = MGA1064_MISC_CTL_VGA8 | 974 938 MGA1064_MISC_CTL_DAC_RAM_CS; 975 939 option = 0x00000120; ··· 1017 979 if ((mdev->type == G200_EV || 1018 980 mdev->type == G200_WB || 1019 981 mdev->type == G200_EH || 1020 - mdev->type == G200_EW3) && 982 + mdev->type == G200_EW3 || 983 + mdev->type == G200_EH3) && 1021 984 (i >= 0x44) && (i <= 0x4e)) 1022 985 continue; 1023 986