drm/mgag200: Don't write-protect CRTC 0-7 while in mga_crtc_prepare()
authorThomas Zimmermann <tzimmermann@suse.de>
Tue, 7 Jul 2020 08:24:05 +0000 (10:24 +0200)
committerThomas Zimmermann <tzimmermann@suse.de>
Tue, 14 Jul 2020 07:06:14 +0000 (09:06 +0200)
The prepare function write-protects several registers that it doesn't
even touch. Removed the related code.

The code for unprotecting registers also clears VINT interrupts. Both
is now done once during initialization.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Lyude Paul <lyude@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200707082411.6583-2-tzimmermann@suse.de
drivers/gpu/drm/mgag200/mgag200_drv.h
drivers/gpu/drm/mgag200/mgag200_mode.c
drivers/gpu/drm/mgag200/mgag200_reg.h

index 270c2f9a676662950053acf35264d72181839644..3817520bfefc73f5614781d37d2989f881622b59 100644 (file)
                WREG8(MGAREG_SEQ_DATA, v);                      \
        } while (0)                                             \
 
+#define RREG_CRT(reg, v)                                       \
+       do {                                                    \
+               WREG8(MGAREG_CRTC_INDEX, reg);                  \
+               v = RREG8(MGAREG_CRTC_DATA);                    \
+       } while (0)                                             \
+
 #define WREG_CRT(reg, v)                                       \
        do {                                                    \
                WREG8(MGAREG_CRTC_INDEX, reg);                  \
index f16bd278ab7e494d4cfd21558307acf92783f4c4..9037057d3b3a14a0349c8f76b028545fdb0d337b 100644 (file)
@@ -988,7 +988,7 @@ static void mgag200_set_dac_regs(struct mga_device *mdev)
 
 static void mgag200_init_regs(struct mga_device *mdev)
 {
-       u8 crtcext3, crtcext4, misc;
+       u8 crtc11, crtcext3, crtcext4, misc;
 
        mgag200_set_pci_regs(mdev);
        mgag200_set_dac_regs(mdev);
@@ -1012,6 +1012,12 @@ static void mgag200_init_regs(struct mga_device *mdev)
        WREG_ECRT(0x03, crtcext3);
        WREG_ECRT(0x04, crtcext4);
 
+       RREG_CRT(0x11, crtc11);
+       crtc11 &= ~(MGAREG_CRTC11_CRTCPROTECT |
+                   MGAREG_CRTC11_VINTEN |
+                   MGAREG_CRTC11_VINTCLR);
+       WREG_CRT(0x11, crtc11);
+
        if (mdev->type == G200_ER)
                WREG_ECRT(0x24, 0x5);
 
@@ -1337,12 +1343,6 @@ static void mga_crtc_prepare(struct drm_crtc *crtc)
        struct mga_device *mdev = to_mga_device(dev);
        u8 tmp;
 
-       /*      mga_resume(crtc);*/
-
-       WREG8(MGAREG_CRTC_INDEX, 0x11);
-       tmp = RREG8(MGAREG_CRTC_DATA);
-       WREG_CRT(0x11, tmp | 0x80);
-
        if (mdev->type == G200_SE_A || mdev->type == G200_SE_B) {
                WREG_SEQ(0, 1);
                msleep(50);
@@ -1359,8 +1359,6 @@ static void mga_crtc_prepare(struct drm_crtc *crtc)
 
        if (mdev->type == G200_WB || mdev->type == G200_EW3)
                mga_g200wb_prepare(crtc);
-
-       WREG_CRT(17, 0);
 }
 
 /*
index 29f7194faadc02d9798501f3cc6780c5c5b03518..fb5da410804c12a15dd5939d052ece0d0f3df344 100644 (file)
 
 #define MGAREG_CRTC_INDEX      0x1fd4
 #define MGAREG_CRTC_DATA       0x1fd5
+
+#define MGAREG_CRTC11_VINTCLR          BIT(4)
+#define MGAREG_CRTC11_VINTEN           BIT(5)
+#define MGAREG_CRTC11_CRTCPROTECT      BIT(7)
+
 #define MGAREG_CRTCEXT_INDEX   0x1fde
 #define MGAREG_CRTCEXT_DATA    0x1fdf