Commit b72656db authored by Jean Delvare's avatar Jean Delvare

hwmon: (w83627hf) Stop using globals for I/O port numbers

Stop using global variables REG and VAL for I/O port numbers. This is
ugly and unsafe.
Signed-off-by: default avatarJean Delvare <khali@linux-fr.org>
Cc: Rodolfo Giometti <giometti@linux.it>
parent 8918023d
...@@ -59,6 +59,11 @@ static struct platform_device *pdev; ...@@ -59,6 +59,11 @@ static struct platform_device *pdev;
#define DRVNAME "w83627hf" #define DRVNAME "w83627hf"
enum chips { w83627hf, w83627thf, w83697hf, w83637hf, w83687thf }; enum chips { w83627hf, w83627thf, w83697hf, w83637hf, w83687thf };
struct w83627hf_sio_data {
enum chips type;
int sioaddr;
};
static u8 force_i2c = 0x1f; static u8 force_i2c = 0x1f;
module_param(force_i2c, byte, 0); module_param(force_i2c, byte, 0);
MODULE_PARM_DESC(force_i2c, MODULE_PARM_DESC(force_i2c,
...@@ -73,9 +78,7 @@ module_param(force_id, ushort, 0); ...@@ -73,9 +78,7 @@ module_param(force_id, ushort, 0);
MODULE_PARM_DESC(force_id, "Override the detected device ID"); MODULE_PARM_DESC(force_id, "Override the detected device ID");
/* modified from kernel/include/traps.c */ /* modified from kernel/include/traps.c */
static int REG; /* The register to read/write */
#define DEV 0x07 /* Register: Logical device select */ #define DEV 0x07 /* Register: Logical device select */
static int VAL; /* The value to read/write */
/* logical device numbers for superio_select (below) */ /* logical device numbers for superio_select (below) */
#define W83627HF_LD_FDC 0x00 #define W83627HF_LD_FDC 0x00
...@@ -105,37 +108,37 @@ static int VAL; /* The value to read/write */ ...@@ -105,37 +108,37 @@ static int VAL; /* The value to read/write */
#define W83687THF_VID_DATA 0xF1 /* w83687thf only */ #define W83687THF_VID_DATA 0xF1 /* w83687thf only */
static inline void static inline void
superio_outb(int reg, int val) superio_outb(struct w83627hf_sio_data *sio, int reg, int val)
{ {
outb(reg, REG); outb(reg, sio->sioaddr);
outb(val, VAL); outb(val, sio->sioaddr + 1);
} }
static inline int static inline int
superio_inb(int reg) superio_inb(struct w83627hf_sio_data *sio, int reg)
{ {
outb(reg, REG); outb(reg, sio->sioaddr);
return inb(VAL); return inb(sio->sioaddr + 1);
} }
static inline void static inline void
superio_select(int ld) superio_select(struct w83627hf_sio_data *sio, int ld)
{ {
outb(DEV, REG); outb(DEV, sio->sioaddr);
outb(ld, VAL); outb(ld, sio->sioaddr + 1);
} }
static inline void static inline void
superio_enter(void) superio_enter(struct w83627hf_sio_data *sio)
{ {
outb(0x87, REG); outb(0x87, sio->sioaddr);
outb(0x87, REG); outb(0x87, sio->sioaddr);
} }
static inline void static inline void
superio_exit(void) superio_exit(struct w83627hf_sio_data *sio)
{ {
outb(0xAA, REG); outb(0xAA, sio->sioaddr);
} }
#define W627_DEVID 0x52 #define W627_DEVID 0x52
...@@ -376,10 +379,6 @@ struct w83627hf_data { ...@@ -376,10 +379,6 @@ struct w83627hf_data {
u8 vrm_ovt; /* Register value, 627THF/637HF/687THF only */ u8 vrm_ovt; /* Register value, 627THF/637HF/687THF only */
}; };
struct w83627hf_sio_data {
enum chips type;
};
static int w83627hf_probe(struct platform_device *pdev); static int w83627hf_probe(struct platform_device *pdev);
static int __devexit w83627hf_remove(struct platform_device *pdev); static int __devexit w83627hf_remove(struct platform_device *pdev);
...@@ -1136,11 +1135,8 @@ static int __init w83627hf_find(int sioaddr, unsigned short *addr, ...@@ -1136,11 +1135,8 @@ static int __init w83627hf_find(int sioaddr, unsigned short *addr,
"W83687THF", "W83687THF",
}; };
REG = sioaddr; superio_enter(sio_data);
VAL = sioaddr + 1; val = force_id ? force_id : superio_inb(sio_data, DEVID);
superio_enter();
val = force_id ? force_id : superio_inb(DEVID);
switch (val) { switch (val) {
case W627_DEVID: case W627_DEVID:
sio_data->type = w83627hf; sio_data->type = w83627hf;
...@@ -1164,9 +1160,9 @@ static int __init w83627hf_find(int sioaddr, unsigned short *addr, ...@@ -1164,9 +1160,9 @@ static int __init w83627hf_find(int sioaddr, unsigned short *addr,
goto exit; goto exit;
} }
superio_select(W83627HF_LD_HWM); superio_select(sio_data, W83627HF_LD_HWM);
val = (superio_inb(WINB_BASE_REG) << 8) | val = (superio_inb(sio_data, WINB_BASE_REG) << 8) |
superio_inb(WINB_BASE_REG + 1); superio_inb(sio_data, WINB_BASE_REG + 1);
*addr = val & WINB_ALIGNMENT; *addr = val & WINB_ALIGNMENT;
if (*addr == 0) { if (*addr == 0) {
printk(KERN_WARNING DRVNAME ": Base address not set, " printk(KERN_WARNING DRVNAME ": Base address not set, "
...@@ -1174,18 +1170,19 @@ static int __init w83627hf_find(int sioaddr, unsigned short *addr, ...@@ -1174,18 +1170,19 @@ static int __init w83627hf_find(int sioaddr, unsigned short *addr,
goto exit; goto exit;
} }
val = superio_inb(WINB_ACT_REG); val = superio_inb(sio_data, WINB_ACT_REG);
if (!(val & 0x01)) { if (!(val & 0x01)) {
printk(KERN_WARNING DRVNAME ": Enabling HWM logical device\n"); printk(KERN_WARNING DRVNAME ": Enabling HWM logical device\n");
superio_outb(WINB_ACT_REG, val | 0x01); superio_outb(sio_data, WINB_ACT_REG, val | 0x01);
} }
err = 0; err = 0;
sio_data->sioaddr = sioaddr;
pr_info(DRVNAME ": Found %s chip at %#x\n", pr_info(DRVNAME ": Found %s chip at %#x\n",
names[sio_data->type], *addr); names[sio_data->type], *addr);
exit: exit:
superio_exit(); superio_exit(sio_data);
return err; return err;
} }
...@@ -1500,20 +1497,21 @@ static int w83627hf_read_value(struct w83627hf_data *data, u16 reg) ...@@ -1500,20 +1497,21 @@ static int w83627hf_read_value(struct w83627hf_data *data, u16 reg)
static int __devinit w83627thf_read_gpio5(struct platform_device *pdev) static int __devinit w83627thf_read_gpio5(struct platform_device *pdev)
{ {
struct w83627hf_sio_data *sio_data = pdev->dev.platform_data;
int res = 0xff, sel; int res = 0xff, sel;
superio_enter(); superio_enter(sio_data);
superio_select(W83627HF_LD_GPIO5); superio_select(sio_data, W83627HF_LD_GPIO5);
/* Make sure these GPIO pins are enabled */ /* Make sure these GPIO pins are enabled */
if (!(superio_inb(W83627THF_GPIO5_EN) & (1<<3))) { if (!(superio_inb(sio_data, W83627THF_GPIO5_EN) & (1<<3))) {
dev_dbg(&pdev->dev, "GPIO5 disabled, no VID function\n"); dev_dbg(&pdev->dev, "GPIO5 disabled, no VID function\n");
goto exit; goto exit;
} }
/* Make sure the pins are configured for input /* Make sure the pins are configured for input
There must be at least five (VRM 9), and possibly 6 (VRM 10) */ There must be at least five (VRM 9), and possibly 6 (VRM 10) */
sel = superio_inb(W83627THF_GPIO5_IOSR) & 0x3f; sel = superio_inb(sio_data, W83627THF_GPIO5_IOSR) & 0x3f;
if ((sel & 0x1f) != 0x1f) { if ((sel & 0x1f) != 0x1f) {
dev_dbg(&pdev->dev, "GPIO5 not configured for VID " dev_dbg(&pdev->dev, "GPIO5 not configured for VID "
"function\n"); "function\n");
...@@ -1521,37 +1519,38 @@ static int __devinit w83627thf_read_gpio5(struct platform_device *pdev) ...@@ -1521,37 +1519,38 @@ static int __devinit w83627thf_read_gpio5(struct platform_device *pdev)
} }
dev_info(&pdev->dev, "Reading VID from GPIO5\n"); dev_info(&pdev->dev, "Reading VID from GPIO5\n");
res = superio_inb(W83627THF_GPIO5_DR) & sel; res = superio_inb(sio_data, W83627THF_GPIO5_DR) & sel;
exit: exit:
superio_exit(); superio_exit(sio_data);
return res; return res;
} }
static int __devinit w83687thf_read_vid(struct platform_device *pdev) static int __devinit w83687thf_read_vid(struct platform_device *pdev)
{ {
struct w83627hf_sio_data *sio_data = pdev->dev.platform_data;
int res = 0xff; int res = 0xff;
superio_enter(); superio_enter(sio_data);
superio_select(W83627HF_LD_HWM); superio_select(sio_data, W83627HF_LD_HWM);
/* Make sure these GPIO pins are enabled */ /* Make sure these GPIO pins are enabled */
if (!(superio_inb(W83687THF_VID_EN) & (1 << 2))) { if (!(superio_inb(sio_data, W83687THF_VID_EN) & (1 << 2))) {
dev_dbg(&pdev->dev, "VID disabled, no VID function\n"); dev_dbg(&pdev->dev, "VID disabled, no VID function\n");
goto exit; goto exit;
} }
/* Make sure the pins are configured for input */ /* Make sure the pins are configured for input */
if (!(superio_inb(W83687THF_VID_CFG) & (1 << 4))) { if (!(superio_inb(sio_data, W83687THF_VID_CFG) & (1 << 4))) {
dev_dbg(&pdev->dev, "VID configured as output, " dev_dbg(&pdev->dev, "VID configured as output, "
"no VID function\n"); "no VID function\n");
goto exit; goto exit;
} }
res = superio_inb(W83687THF_VID_DATA) & 0x3f; res = superio_inb(sio_data, W83687THF_VID_DATA) & 0x3f;
exit: exit:
superio_exit(); superio_exit(sio_data);
return res; return res;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment