mgag200_bmc.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. #include <linux/delay.h>
  3. #include "mgag200_drv.h"
  4. void mgag200_bmc_disable_vidrst(struct mga_device *mdev)
  5. {
  6. u8 tmp;
  7. int iter_max;
  8. /*
  9. * 1 - The first step is to inform the BMC of an upcoming mode
  10. * change. We are putting the misc<0> to output.
  11. */
  12. WREG8(DAC_INDEX, MGA1064_GEN_IO_CTL);
  13. tmp = RREG8(DAC_DATA);
  14. tmp |= 0x10;
  15. WREG_DAC(MGA1064_GEN_IO_CTL, tmp);
  16. /* we are putting a 1 on the misc<0> line */
  17. WREG8(DAC_INDEX, MGA1064_GEN_IO_DATA);
  18. tmp = RREG8(DAC_DATA);
  19. tmp |= 0x10;
  20. WREG_DAC(MGA1064_GEN_IO_DATA, tmp);
  21. /*
  22. * 2- Second step to mask any further scan request. This is
  23. * done by asserting the remfreqmsk bit (XSPAREREG<7>)
  24. */
  25. WREG8(DAC_INDEX, MGA1064_SPAREREG);
  26. tmp = RREG8(DAC_DATA);
  27. tmp |= 0x80;
  28. WREG_DAC(MGA1064_SPAREREG, tmp);
  29. /*
  30. * 3a- The third step is to verify if there is an active scan.
  31. * We are waiting for a 0 on remhsyncsts <XSPAREREG<0>).
  32. */
  33. iter_max = 300;
  34. while (!(tmp & 0x1) && iter_max) {
  35. WREG8(DAC_INDEX, MGA1064_SPAREREG);
  36. tmp = RREG8(DAC_DATA);
  37. udelay(1000);
  38. iter_max--;
  39. }
  40. /*
  41. * 3b- This step occurs only if the remove is actually
  42. * scanning. We are waiting for the end of the frame which is
  43. * a 1 on remvsyncsts (XSPAREREG<1>)
  44. */
  45. if (iter_max) {
  46. iter_max = 300;
  47. while ((tmp & 0x2) && iter_max) {
  48. WREG8(DAC_INDEX, MGA1064_SPAREREG);
  49. tmp = RREG8(DAC_DATA);
  50. udelay(1000);
  51. iter_max--;
  52. }
  53. }
  54. }
  55. void mgag200_bmc_enable_vidrst(struct mga_device *mdev)
  56. {
  57. u8 tmp;
  58. /* Ensure that the vrsten and hrsten are set */
  59. WREG8(MGAREG_CRTCEXT_INDEX, 1);
  60. tmp = RREG8(MGAREG_CRTCEXT_DATA);
  61. WREG8(MGAREG_CRTCEXT_DATA, tmp | 0x88);
  62. /* Assert rstlvl2 */
  63. WREG8(DAC_INDEX, MGA1064_REMHEADCTL2);
  64. tmp = RREG8(DAC_DATA);
  65. tmp |= 0x8;
  66. WREG8(DAC_DATA, tmp);
  67. udelay(10);
  68. /* Deassert rstlvl2 */
  69. tmp &= ~0x08;
  70. WREG8(DAC_INDEX, MGA1064_REMHEADCTL2);
  71. WREG8(DAC_DATA, tmp);
  72. /* Remove mask of scan request */
  73. WREG8(DAC_INDEX, MGA1064_SPAREREG);
  74. tmp = RREG8(DAC_DATA);
  75. tmp &= ~0x80;
  76. WREG8(DAC_DATA, tmp);
  77. /* Put back a 0 on the misc<0> line */
  78. WREG8(DAC_INDEX, MGA1064_GEN_IO_DATA);
  79. tmp = RREG8(DAC_DATA);
  80. tmp &= ~0x10;
  81. WREG_DAC(MGA1064_GEN_IO_DATA, tmp);
  82. }