Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 162fc8c0 authored by Florian Tobias Schandinat's avatar Florian Tobias Schandinat Committed by Jonathan Corbet
Browse files

viafb: improve misc register handling



viafb: improve misc register handling

This patch improves the misc register handling by adding a modify
function for this to via_io.h and moving expanded definitions of the
relevant ports there. The code was changed to use those to improve
readability.

Signed-off-by: default avatarFlorian Tobias Schandinat <FlorianSchandinat@gmx.de>
parent 384c3041
Loading
Loading
Loading
Loading
+8 −19
Original line number Diff line number Diff line
@@ -1394,8 +1394,6 @@ u32 viafb_get_clk_value(int clk)
/* Set VCLK*/
void viafb_set_vclock(u32 CLK, int set_iga)
{
	unsigned char RegTemp;

	/* H.W. Reset : ON */
	viafb_write_reg_mask(CR17, VIACR, 0x00, BIT7);

@@ -1468,8 +1466,7 @@ void viafb_set_vclock(u32 CLK, int set_iga)
	}

	/* Fire! */
	RegTemp = inb(VIARMisc);
	outb(RegTemp | (BIT2 + BIT3), VIAWMisc);
	via_write_misc_reg_mask(0x0C, 0x0C); /* select external clock */
}

void viafb_load_crtc_timing(struct display_timing device_timing,
@@ -1713,6 +1710,7 @@ void viafb_fill_crtc_timing(struct crt_mode_table *crt_table,
	int index = 0;
	int h_addr, v_addr;
	u32 pll_D_N;
	u8 polarity = 0;

	for (i = 0; i < video_mode->mode_array; i++) {
		index = i;
@@ -1741,20 +1739,11 @@ void viafb_fill_crtc_timing(struct crt_mode_table *crt_table,
	v_addr = crt_reg.ver_addr;

	/* update polarity for CRT timing */
	if (crt_table[index].h_sync_polarity == NEGATIVE) {
		if (crt_table[index].v_sync_polarity == NEGATIVE)
			outb((inb(VIARMisc) & (~(BIT6 + BIT7))) |
			     (BIT6 + BIT7), VIAWMisc);
		else
			outb((inb(VIARMisc) & (~(BIT6 + BIT7))) | (BIT6),
			     VIAWMisc);
	} else {
	if (crt_table[index].h_sync_polarity == NEGATIVE)
		polarity |= BIT6;
	if (crt_table[index].v_sync_polarity == NEGATIVE)
			outb((inb(VIARMisc) & (~(BIT6 + BIT7))) | (BIT7),
			     VIAWMisc);
		else
			outb((inb(VIARMisc) & (~(BIT6 + BIT7))), VIAWMisc);
	}
		polarity |= BIT7;
	via_write_misc_reg_mask(polarity, BIT6 | BIT7);

	if (set_iga == IGA1) {
		viafb_unlock_crt();
@@ -2123,7 +2112,7 @@ int viafb_setmode(struct VideoModeTable *vmode_tbl, int video_bpp,

	/* Fill VPIT Parameters */
	/* Write Misc Register */
	outb(VPIT.Misc, VIAWMisc);
	outb(VPIT.Misc, VIA_MISC_REG_WRITE);

	/* Write Sequencer */
	for (i = 1; i <= StdSR; i++)
+0 −2
Original line number Diff line number Diff line
@@ -45,8 +45,6 @@

/* standard VGA IO port
*/
#define VIARMisc    0x3CC
#define VIAWMisc    0x3C2
#define VIAStatus   0x3DA
#define VIACR       0x3D4
#define VIASR       0x3C4
+9 −0
Original line number Diff line number Diff line
@@ -29,6 +29,9 @@
#include <linux/types.h>
#include <linux/io.h>

#define VIA_MISC_REG_READ	0x03CC
#define VIA_MISC_REG_WRITE	0x03C2

/*
 * Indexed port operations.  Note that these are all multi-op
 * functions; every invocation will be racy if you're not holding
@@ -55,4 +58,10 @@ static inline void via_write_reg_mask(u16 port, u8 index, u8 data, u8 mask)
	outb((data & mask) | (old & ~mask), port + 1);
}

static inline void via_write_misc_reg_mask(u8 data, u8 mask)
{
	u8 old = inb(VIA_MISC_REG_READ);
	outb((data & mask) | (old & ~mask), VIA_MISC_REG_WRITE);
}

#endif /* __VIA_IO_H__ */