Am Sonntag, den 18.07.2010, 06:15 +0200 schrieb Mattias Mattsson:
Hi,
I'm not a skilled programmer so this patch may look rather ugly. (Suggestions to improve it are very welcome.)
I think using a table-based approach instead of a switch-based approach is sensible. Something like
static const unsigned int forbidden_gpios = 0x00000100; /* never available */ static const unsigned int nonmuxed_gpios = 0x58000001; /* always available */ static const struct { unsigned int reg, bitmask, bitvalue } piix4_gpio = {0,0}, {0xB0, 0x0001, 0x0000}, /* GPO1... */ {0xB0, 0x0001, 0x0000}, {0xB0, 0x0001, 0x0000}, {0xB0, 0x0001, 0x0000}, {0xB0, 0x0001, 0x0000}, {0xB0, 0x0001, 0x0000}, {0xB0, 0x0001, 0x0000}, /* ...GPO7: GENCFG bit 0 (IOCHK#+LA17-23) ... {0xB2, 0x0004, 0x0004}, /* GPO18: GENCFG bit 18 */ ...
Use word reads for GENCFG lower/upper part, just as you use for
This will avoid that you have to put the info about the GPO configuration bits both to the safety-checking procedure and the setting procedure.
Also, your code uses "== 1" where it should use "!= 0".
Regards, Michael Karcher