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