diff options
Diffstat (limited to 'drivers/hwmon/w83627hf.c')
-rw-r--r-- | drivers/hwmon/w83627hf.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/drivers/hwmon/w83627hf.c b/drivers/hwmon/w83627hf.c index 7f6f7280878d..494274d27f01 100644 --- a/drivers/hwmon/w83627hf.c +++ b/drivers/hwmon/w83627hf.c | |||
@@ -142,10 +142,14 @@ superio_exit(void) | |||
142 | #define WINB_BASE_REG 0x60 | 142 | #define WINB_BASE_REG 0x60 |
143 | /* Constants specified below */ | 143 | /* Constants specified below */ |
144 | 144 | ||
145 | /* Length of ISA address segment */ | 145 | /* Alignment of the base address */ |
146 | #define WINB_EXTENT 8 | 146 | #define WINB_ALIGNMENT ~7 |
147 | 147 | ||
148 | /* Where are the ISA address/data registers relative to the base address */ | 148 | /* Offset & size of I/O region we are interested in */ |
149 | #define WINB_REGION_OFFSET 5 | ||
150 | #define WINB_REGION_SIZE 2 | ||
151 | |||
152 | /* Where are the sensors address/data registers relative to the base address */ | ||
149 | #define W83781D_ADDR_REG_OFFSET 5 | 153 | #define W83781D_ADDR_REG_OFFSET 5 |
150 | #define W83781D_DATA_REG_OFFSET 6 | 154 | #define W83781D_DATA_REG_OFFSET 6 |
151 | 155 | ||
@@ -981,7 +985,7 @@ static int __init w83627hf_find(int sioaddr, unsigned short *addr) | |||
981 | superio_select(W83627HF_LD_HWM); | 985 | superio_select(W83627HF_LD_HWM); |
982 | val = (superio_inb(WINB_BASE_REG) << 8) | | 986 | val = (superio_inb(WINB_BASE_REG) << 8) | |
983 | superio_inb(WINB_BASE_REG + 1); | 987 | superio_inb(WINB_BASE_REG + 1); |
984 | *addr = val & ~(WINB_EXTENT - 1); | 988 | *addr = val & WINB_ALIGNMENT; |
985 | if (*addr == 0 && force_addr == 0) { | 989 | if (*addr == 0 && force_addr == 0) { |
986 | superio_exit(); | 990 | superio_exit(); |
987 | return -ENODEV; | 991 | return -ENODEV; |
@@ -1000,9 +1004,10 @@ static int w83627hf_detect(struct i2c_adapter *adapter) | |||
1000 | const char *client_name = ""; | 1004 | const char *client_name = ""; |
1001 | 1005 | ||
1002 | if(force_addr) | 1006 | if(force_addr) |
1003 | address = force_addr & ~(WINB_EXTENT - 1); | 1007 | address = force_addr & WINB_ALIGNMENT; |
1004 | 1008 | ||
1005 | if (!request_region(address, WINB_EXTENT, w83627hf_driver.name)) { | 1009 | if (!request_region(address + WINB_REGION_OFFSET, WINB_REGION_SIZE, |
1010 | w83627hf_driver.name)) { | ||
1006 | err = -EBUSY; | 1011 | err = -EBUSY; |
1007 | goto ERROR0; | 1012 | goto ERROR0; |
1008 | } | 1013 | } |
@@ -1148,7 +1153,7 @@ static int w83627hf_detect(struct i2c_adapter *adapter) | |||
1148 | ERROR2: | 1153 | ERROR2: |
1149 | kfree(data); | 1154 | kfree(data); |
1150 | ERROR1: | 1155 | ERROR1: |
1151 | release_region(address, WINB_EXTENT); | 1156 | release_region(address + WINB_REGION_OFFSET, WINB_REGION_SIZE); |
1152 | ERROR0: | 1157 | ERROR0: |
1153 | return err; | 1158 | return err; |
1154 | } | 1159 | } |
@@ -1163,7 +1168,7 @@ static int w83627hf_detach_client(struct i2c_client *client) | |||
1163 | if ((err = i2c_detach_client(client))) | 1168 | if ((err = i2c_detach_client(client))) |
1164 | return err; | 1169 | return err; |
1165 | 1170 | ||
1166 | release_region(client->addr, WINB_EXTENT); | 1171 | release_region(client->addr + WINB_REGION_OFFSET, WINB_REGION_SIZE); |
1167 | kfree(data); | 1172 | kfree(data); |
1168 | 1173 | ||
1169 | return 0; | 1174 | return 0; |