diff options
| -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; |
