[PATCH] hwmon: w83792d fix unused fan pins
1. This patch add check for fan4,5,6,7 and do not create device file if their pins are not configured as fan. 2. Fix the issue that can not set fan divisor to 128. 3. Fix the index out of bounds bug in w83792d_detect function. Signed-off-by: Yuan Mu <ymu@winbond.com.tw> Signed-off-by: Jean Delvare <khali@linux-fr.org> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
d2ef5ebb4c
commit
9632051963
1 changed files with 18 additions and 7 deletions
|
@ -193,6 +193,7 @@ static const u8 W83792D_REG_LEVELS[3][4] = {
|
||||||
0xE2 } /* (bit3-0) SmartFanII: Fan3 Level 3 */
|
0xE2 } /* (bit3-0) SmartFanII: Fan3 Level 3 */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define W83792D_REG_GPIO_EN 0x1A
|
||||||
#define W83792D_REG_CONFIG 0x40
|
#define W83792D_REG_CONFIG 0x40
|
||||||
#define W83792D_REG_VID_FANDIV 0x47
|
#define W83792D_REG_VID_FANDIV 0x47
|
||||||
#define W83792D_REG_CHIPID 0x49
|
#define W83792D_REG_CHIPID 0x49
|
||||||
|
@ -257,7 +258,7 @@ DIV_TO_REG(long val)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
val = SENSORS_LIMIT(val, 1, 128) >> 1;
|
val = SENSORS_LIMIT(val, 1, 128) >> 1;
|
||||||
for (i = 0; i < 6; i++) {
|
for (i = 0; i < 7; i++) {
|
||||||
if (val == 0)
|
if (val == 0)
|
||||||
break;
|
break;
|
||||||
val >>= 1;
|
val >>= 1;
|
||||||
|
@ -1282,8 +1283,8 @@ w83792d_detect(struct i2c_adapter *adapter, int address, int kind)
|
||||||
w83792d_init_client(new_client);
|
w83792d_init_client(new_client);
|
||||||
|
|
||||||
/* A few vars need to be filled upon startup */
|
/* A few vars need to be filled upon startup */
|
||||||
for (i = 1; i <= 7; i++) {
|
for (i = 0; i < 7; i++) {
|
||||||
data->fan_min[i - 1] = w83792d_read_value(new_client,
|
data->fan_min[i] = w83792d_read_value(new_client,
|
||||||
W83792D_REG_FAN_MIN[i]);
|
W83792D_REG_FAN_MIN[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1306,10 +1307,20 @@ w83792d_detect(struct i2c_adapter *adapter, int address, int kind)
|
||||||
device_create_file_fan(new_client, 1);
|
device_create_file_fan(new_client, 1);
|
||||||
device_create_file_fan(new_client, 2);
|
device_create_file_fan(new_client, 2);
|
||||||
device_create_file_fan(new_client, 3);
|
device_create_file_fan(new_client, 3);
|
||||||
device_create_file_fan(new_client, 4);
|
|
||||||
device_create_file_fan(new_client, 5);
|
/* Read GPIO enable register to check if pins for fan 4,5 are used as
|
||||||
device_create_file_fan(new_client, 6);
|
GPIO */
|
||||||
device_create_file_fan(new_client, 7);
|
val1 = w83792d_read_value(new_client, W83792D_REG_GPIO_EN);
|
||||||
|
if (!(val1 & 0x40))
|
||||||
|
device_create_file_fan(new_client, 4);
|
||||||
|
if (!(val1 & 0x20))
|
||||||
|
device_create_file_fan(new_client, 5);
|
||||||
|
|
||||||
|
val1 = w83792d_read_value(new_client, W83792D_REG_PIN);
|
||||||
|
if (val1 & 0x40)
|
||||||
|
device_create_file_fan(new_client, 6);
|
||||||
|
if (val1 & 0x04)
|
||||||
|
device_create_file_fan(new_client, 7);
|
||||||
|
|
||||||
device_create_file_temp1(new_client); /* Temp1 */
|
device_create_file_temp1(new_client); /* Temp1 */
|
||||||
device_create_file_temp_add(new_client, 2); /* Temp2 */
|
device_create_file_temp_add(new_client, 2); /* Temp2 */
|
||||||
|
|
Loading…
Reference in a new issue