Skip to content

Commit 153fef4

Browse files
author
Thomas Zimmermann
committed
drm/mgag200: Split DPMS function into helpers
Of the DPMS code, only ON and OFF states are used. Simplify mode setting by moving both into separate functions and removing the rest. The original code busy waited in the middle of updating the screen state in SEQ1. To simplify the procedure, the new code busy waits first and then updates SEQ1 in one chunk. The DPMS code also set the LUT before enabling the screen. The patch moves this code into the simple-display pipe's enable function. v2: * comment on SEQ1 updates in commit message Signed-off-by: Thomas Zimmermann <[email protected]> Reviewed-by: Lyude Paul <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent 379ba80 commit 153fef4

File tree

2 files changed

+45
-31
lines changed

2 files changed

+45
-31
lines changed

drivers/gpu/drm/mgag200/mgag200_mode.c

Lines changed: 42 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1282,41 +1282,50 @@ static void mgag200_g200ev_set_hiprilvl(struct mga_device *mdev)
12821282
WREG_ECRT(0x06, 0x00);
12831283
}
12841284

1285-
static void mga_crtc_dpms(struct drm_crtc *crtc, int mode)
1285+
static void mgag200_enable_display(struct mga_device *mdev)
12861286
{
1287-
struct drm_device *dev = crtc->dev;
1288-
struct mga_device *mdev = to_mga_device(dev);
1289-
u8 seq1 = 0, crtcext1 = 0;
1287+
u8 seq1, crtcext1;
12901288

1291-
switch (mode) {
1292-
case DRM_MODE_DPMS_ON:
1293-
seq1 = 0;
1294-
crtcext1 = 0;
1295-
mga_crtc_load_lut(crtc);
1296-
break;
1297-
case DRM_MODE_DPMS_STANDBY:
1298-
seq1 = 0x20;
1299-
crtcext1 = 0x10;
1300-
break;
1301-
case DRM_MODE_DPMS_SUSPEND:
1302-
seq1 = 0x20;
1303-
crtcext1 = 0x20;
1304-
break;
1305-
case DRM_MODE_DPMS_OFF:
1306-
seq1 = 0x20;
1307-
crtcext1 = 0x30;
1308-
break;
1309-
}
1289+
/*
1290+
* TODO: replace busy waiting with vblank IRQ; put
1291+
* msleep(50) before changing SCROFF
1292+
*/
1293+
mga_wait_vsync(mdev);
1294+
mga_wait_busy(mdev);
1295+
1296+
RREG_SEQ(0x01, seq1);
1297+
seq1 &= ~MGAREG_SEQ1_SCROFF;
1298+
WREG_SEQ(0x01, seq1);
1299+
1300+
msleep(20);
1301+
1302+
RREG_ECRT(0x01, crtcext1);
1303+
crtcext1 &= ~MGAREG_CRTCEXT1_VSYNCOFF;
1304+
crtcext1 &= ~MGAREG_CRTCEXT1_HSYNCOFF;
1305+
WREG_ECRT(0x01, crtcext1);
1306+
}
13101307

1311-
WREG8(MGAREG_SEQ_INDEX, 0x01);
1312-
seq1 |= RREG8(MGAREG_SEQ_DATA) & ~0x20;
1308+
static void mgag200_disable_display(struct mga_device *mdev)
1309+
{
1310+
u8 seq1, crtcext1;
1311+
1312+
/*
1313+
* TODO: replace busy waiting with vblank IRQ; put
1314+
* msleep(50) before changing SCROFF
1315+
*/
13131316
mga_wait_vsync(mdev);
13141317
mga_wait_busy(mdev);
1315-
WREG8(MGAREG_SEQ_DATA, seq1);
1318+
1319+
RREG_SEQ(0x01, seq1);
1320+
seq1 |= MGAREG_SEQ1_SCROFF;
1321+
WREG_SEQ(0x01, seq1);
1322+
13161323
msleep(20);
1317-
WREG8(MGAREG_CRTCEXT_INDEX, 0x01);
1318-
crtcext1 |= RREG8(MGAREG_CRTCEXT_DATA) & ~0x30;
1319-
WREG8(MGAREG_CRTCEXT_DATA, crtcext1);
1324+
1325+
RREG_ECRT(0x01, crtcext1);
1326+
crtcext1 |= MGAREG_CRTCEXT1_VSYNCOFF |
1327+
MGAREG_CRTCEXT1_HSYNCOFF;
1328+
WREG_ECRT(0x01, crtcext1);
13201329
}
13211330

13221331
/*
@@ -1349,7 +1358,8 @@ static void mga_crtc_commit(struct drm_crtc *crtc)
13491358
mga_g200wb_commit(crtc);
13501359

13511360
WREG_SEQ(0, 0x3);
1352-
mga_crtc_dpms(crtc, DRM_MODE_DPMS_ON);
1361+
mga_crtc_load_lut(crtc);
1362+
mgag200_enable_display(mdev);
13531363
}
13541364

13551365
/*
@@ -1595,8 +1605,9 @@ static void
15951605
mgag200_simple_display_pipe_disable(struct drm_simple_display_pipe *pipe)
15961606
{
15971607
struct drm_crtc *crtc = &pipe->crtc;
1608+
struct mga_device *mdev = to_mga_device(crtc->dev);
15981609

1599-
mga_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
1610+
mgag200_disable_display(mdev);
16001611
}
16011612

16021613
static int

drivers/gpu/drm/mgag200/mgag200_reg.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,9 @@
250250

251251
#define MGAREG_CRTCEXT0_OFFSET_MASK GENMASK(5, 4)
252252

253+
#define MGAREG_CRTCEXT1_VSYNCOFF BIT(5)
254+
#define MGAREG_CRTCEXT1_HSYNCOFF BIT(4)
255+
253256
/* Cursor X and Y position */
254257
#define MGA_CURPOSXL 0x3c0c
255258
#define MGA_CURPOSXH 0x3c0d

0 commit comments

Comments
 (0)