diff options
Diffstat (limited to 'drivers/hwmon')
-rw-r--r-- | drivers/hwmon/w83627ehf.c | 13 | ||||
-rw-r--r-- | drivers/hwmon/w83627hf.c | 21 |
2 files changed, 21 insertions, 13 deletions
diff --git a/drivers/hwmon/w83627ehf.c b/drivers/hwmon/w83627ehf.c index b60efe8f8b26..685eeb766809 100644 --- a/drivers/hwmon/w83627ehf.c +++ b/drivers/hwmon/w83627ehf.c | |||
@@ -105,7 +105,9 @@ superio_exit(void) | |||
105 | * ISA constants | 105 | * ISA constants |
106 | */ | 106 | */ |
107 | 107 | ||
108 | #define REGION_LENGTH 8 | 108 | #define REGION_ALIGNMENT ~7 |
109 | #define REGION_OFFSET 5 | ||
110 | #define REGION_LENGTH 2 | ||
109 | #define ADDR_REG_OFFSET 5 | 111 | #define ADDR_REG_OFFSET 5 |
110 | #define DATA_REG_OFFSET 6 | 112 | #define DATA_REG_OFFSET 6 |
111 | 113 | ||
@@ -673,7 +675,8 @@ static int w83627ehf_detect(struct i2c_adapter *adapter) | |||
673 | struct w83627ehf_data *data; | 675 | struct w83627ehf_data *data; |
674 | int i, err = 0; | 676 | int i, err = 0; |
675 | 677 | ||
676 | if (!request_region(address, REGION_LENGTH, w83627ehf_driver.name)) { | 678 | if (!request_region(address + REGION_OFFSET, REGION_LENGTH, |
679 | w83627ehf_driver.name)) { | ||
677 | err = -EBUSY; | 680 | err = -EBUSY; |
678 | goto exit; | 681 | goto exit; |
679 | } | 682 | } |
@@ -762,7 +765,7 @@ exit_detach: | |||
762 | exit_free: | 765 | exit_free: |
763 | kfree(data); | 766 | kfree(data); |
764 | exit_release: | 767 | exit_release: |
765 | release_region(address, REGION_LENGTH); | 768 | release_region(address + REGION_OFFSET, REGION_LENGTH); |
766 | exit: | 769 | exit: |
767 | return err; | 770 | return err; |
768 | } | 771 | } |
@@ -776,7 +779,7 @@ static int w83627ehf_detach_client(struct i2c_client *client) | |||
776 | 779 | ||
777 | if ((err = i2c_detach_client(client))) | 780 | if ((err = i2c_detach_client(client))) |
778 | return err; | 781 | return err; |
779 | release_region(client->addr, REGION_LENGTH); | 782 | release_region(client->addr + REGION_OFFSET, REGION_LENGTH); |
780 | kfree(data); | 783 | kfree(data); |
781 | 784 | ||
782 | return 0; | 785 | return 0; |
@@ -807,7 +810,7 @@ static int __init w83627ehf_find(int sioaddr, unsigned short *addr) | |||
807 | superio_select(W83627EHF_LD_HWM); | 810 | superio_select(W83627EHF_LD_HWM); |
808 | val = (superio_inb(SIO_REG_ADDR) << 8) | 811 | val = (superio_inb(SIO_REG_ADDR) << 8) |
809 | | superio_inb(SIO_REG_ADDR + 1); | 812 | | superio_inb(SIO_REG_ADDR + 1); |
810 | *addr = val & ~(REGION_LENGTH - 1); | 813 | *addr = val & REGION_ALIGNMENT; |
811 | if (*addr == 0) { | 814 | if (*addr == 0) { |
812 | superio_exit(); | 815 | superio_exit(); |
813 | return -ENODEV; | 816 | return -ENODEV; |
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; |