mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
synced 2025-08-28 00:19:36 +00:00
drm/mgag200: Add dedicated variables for blanking fields
Represent fields for horizontal and vertical blanking with <hblkstr>, <hblkend>, <vblkstr> and <vblkend>. Aligns the code with the Matrox programming manuals. Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com> Link: https://patchwork.freedesktop.org/patch/msgid/20240718104551.575912-5-tzimmermann@suse.de
This commit is contained in:
parent
e8f834b559
commit
d6460bd52c
@ -204,23 +204,26 @@ void mgag200_init_registers(struct mga_device *mdev)
|
||||
void mgag200_set_mode_regs(struct mga_device *mdev, const struct drm_display_mode *mode,
|
||||
bool set_vidrst)
|
||||
{
|
||||
unsigned int hdispend, hsyncstr, hsyncend, htotal;
|
||||
unsigned int vdispend, vsyncstr, vsyncend, vtotal;
|
||||
unsigned int hdispend, hsyncstr, hsyncend, htotal, hblkstr, hblkend;
|
||||
unsigned int vdispend, vsyncstr, vsyncend, vtotal, vblkstr, vblkend;
|
||||
u8 misc, crtcext1, crtcext2, crtcext5;
|
||||
|
||||
hdispend = mode->crtc_hdisplay / 8 - 1;
|
||||
hsyncstr = mode->crtc_hsync_start / 8 - 1;
|
||||
hsyncend = mode->crtc_hsync_end / 8 - 1;
|
||||
htotal = mode->crtc_htotal / 8 - 1;
|
||||
|
||||
/* Work around hardware quirk */
|
||||
if ((htotal & 0x07) == 0x06 || (htotal & 0x07) == 0x04)
|
||||
htotal++;
|
||||
hblkstr = mode->crtc_hblank_start / 8 - 1;
|
||||
hblkend = htotal;
|
||||
|
||||
vdispend = mode->crtc_vdisplay - 1;
|
||||
vsyncstr = mode->crtc_vsync_start - 1;
|
||||
vsyncend = mode->crtc_vsync_end - 1;
|
||||
vtotal = mode->crtc_vtotal - 2;
|
||||
vblkstr = mode->crtc_vblank_start;
|
||||
vblkend = vtotal + 1;
|
||||
|
||||
misc = RREG8(MGA_MISC_IN);
|
||||
|
||||
@ -235,43 +238,43 @@ void mgag200_set_mode_regs(struct mga_device *mdev, const struct drm_display_mod
|
||||
misc &= ~MGAREG_MISC_VSYNCPOL;
|
||||
|
||||
crtcext1 = (((htotal - 4) & 0x100) >> 8) |
|
||||
((hdispend & 0x100) >> 7) |
|
||||
((hblkstr & 0x100) >> 7) |
|
||||
((hsyncstr & 0x100) >> 6) |
|
||||
(htotal & 0x40);
|
||||
(hblkend & 0x40);
|
||||
if (set_vidrst)
|
||||
crtcext1 |= MGAREG_CRTCEXT1_VRSTEN |
|
||||
MGAREG_CRTCEXT1_HRSTEN;
|
||||
|
||||
crtcext2 = ((vtotal & 0xc00) >> 10) |
|
||||
((vdispend & 0x400) >> 8) |
|
||||
((vdispend & 0xc00) >> 7) |
|
||||
((vblkstr & 0xc00) >> 7) |
|
||||
((vsyncstr & 0xc00) >> 5) |
|
||||
((vdispend & 0x400) >> 3);
|
||||
crtcext5 = 0x00;
|
||||
|
||||
WREG_CRT(0x00, htotal - 4);
|
||||
WREG_CRT(0x01, hdispend);
|
||||
WREG_CRT(0x02, hdispend);
|
||||
WREG_CRT(0x03, (htotal & 0x1f) | 0x80);
|
||||
WREG_CRT(0x02, hblkstr);
|
||||
WREG_CRT(0x03, (hblkend & 0x1f) | 0x80);
|
||||
WREG_CRT(0x04, hsyncstr);
|
||||
WREG_CRT(0x05, ((htotal & 0x20) << 2) | (hsyncend & 0x1f));
|
||||
WREG_CRT(0x05, ((hblkend & 0x20) << 2) | (hsyncend & 0x1f));
|
||||
WREG_CRT(0x06, vtotal & 0xff);
|
||||
WREG_CRT(0x07, ((vtotal & 0x100) >> 8) |
|
||||
((vdispend & 0x100) >> 7) |
|
||||
((vsyncstr & 0x100) >> 6) |
|
||||
((vdispend & 0x100) >> 5) |
|
||||
((vblkstr & 0x100) >> 5) |
|
||||
((vdispend & 0x100) >> 4) | /* linecomp */
|
||||
((vtotal & 0x200) >> 4) |
|
||||
((vdispend & 0x200) >> 3) |
|
||||
((vsyncstr & 0x200) >> 2));
|
||||
WREG_CRT(0x09, ((vdispend & 0x200) >> 4) |
|
||||
WREG_CRT(0x09, ((vblkstr & 0x200) >> 4) |
|
||||
((vdispend & 0x200) >> 3));
|
||||
WREG_CRT(0x10, vsyncstr & 0xff);
|
||||
WREG_CRT(0x11, (vsyncend & 0x0f) | 0x20);
|
||||
WREG_CRT(0x12, vdispend & 0xff);
|
||||
WREG_CRT(0x14, 0);
|
||||
WREG_CRT(0x15, vdispend & 0xff);
|
||||
WREG_CRT(0x16, (vtotal + 1) & 0xff);
|
||||
WREG_CRT(0x15, vblkstr & 0xff);
|
||||
WREG_CRT(0x16, vblkend & 0xff);
|
||||
WREG_CRT(0x17, 0xc3);
|
||||
WREG_CRT(0x18, vdispend & 0xff);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user