Loading drivers/hwmon/nct7802.c +23 −39 Original line number Diff line number Diff line Loading @@ -229,41 +229,34 @@ static int nct7802_read_temp(struct nct7802_data *data, static int nct7802_read_fan(struct nct7802_data *data, u8 reg_fan) { unsigned int f1, f2; unsigned int regs[2] = {reg_fan, REG_FANCOUNT_LOW}; u8 f[2]; int ret; mutex_lock(&data->access_lock); ret = regmap_read(data->regmap, reg_fan, &f1); if (ret < 0) goto abort; ret = regmap_read(data->regmap, REG_FANCOUNT_LOW, &f2); if (ret < 0) goto abort; ret = (f1 << 5) | (f2 >> 3); ret = regmap_multi_reg_read(data->regmap, regs, f, 2); if (ret) return ret; ret = (f[0] << 5) | (f[1] >> 3); /* convert fan count to rpm */ if (ret == 0x1fff) /* maximum value, assume fan is stopped */ ret = 0; else if (ret) ret = DIV_ROUND_CLOSEST(1350000U, ret); abort: mutex_unlock(&data->access_lock); return ret; } static int nct7802_read_fan_min(struct nct7802_data *data, u8 reg_fan_low, u8 reg_fan_high) { unsigned int f1, f2; unsigned int regs[2] = {reg_fan_low, reg_fan_high}; u8 f[2]; int ret; mutex_lock(&data->access_lock); ret = regmap_read(data->regmap, reg_fan_low, &f1); if (ret < 0) goto abort; ret = regmap_read(data->regmap, reg_fan_high, &f2); ret = regmap_multi_reg_read(data->regmap, regs, f, 2); if (ret < 0) goto abort; ret = f1 | ((f2 & 0xf8) << 5); return ret; ret = f[0] | ((f[1] & 0xf8) << 5); /* convert fan count to rpm */ if (ret == 0x1fff) /* maximum value, assume no limit */ ret = 0; Loading @@ -271,8 +264,6 @@ static int nct7802_read_fan_min(struct nct7802_data *data, u8 reg_fan_low, ret = DIV_ROUND_CLOSEST(1350000U, ret); else ret = 1350000U; abort: mutex_unlock(&data->access_lock); return ret; } Loading Loading @@ -302,33 +293,26 @@ static u8 nct7802_vmul[] = { 4, 2, 2, 2, 2 }; static int nct7802_read_voltage(struct nct7802_data *data, int nr, int index) { unsigned int v1, v2; u8 v[2]; int ret; mutex_lock(&data->access_lock); if (index == 0) { /* voltage */ ret = regmap_read(data->regmap, REG_VOLTAGE[nr], &v1); if (ret < 0) goto abort; ret = regmap_read(data->regmap, REG_VOLTAGE_LOW, &v2); unsigned int regs[2] = {REG_VOLTAGE[nr], REG_VOLTAGE_LOW}; ret = regmap_multi_reg_read(data->regmap, regs, v, 2); if (ret < 0) goto abort; ret = ((v1 << 2) | (v2 >> 6)) * nct7802_vmul[nr]; return ret; ret = ((v[0] << 2) | (v[1] >> 6)) * nct7802_vmul[nr]; } else { /* limit */ int shift = 8 - REG_VOLTAGE_LIMIT_MSB_SHIFT[index - 1][nr]; unsigned int regs[2] = {REG_VOLTAGE_LIMIT_LSB[index - 1][nr], REG_VOLTAGE_LIMIT_MSB[nr]}; ret = regmap_read(data->regmap, REG_VOLTAGE_LIMIT_LSB[index - 1][nr], &v1); if (ret < 0) goto abort; ret = regmap_read(data->regmap, REG_VOLTAGE_LIMIT_MSB[nr], &v2); ret = regmap_multi_reg_read(data->regmap, regs, v, 2); if (ret < 0) goto abort; ret = (v1 | ((v2 << shift) & 0x300)) * nct7802_vmul[nr]; return ret; ret = (v[0] | ((v[1] << shift) & 0x300)) * nct7802_vmul[nr]; } abort: mutex_unlock(&data->access_lock); return ret; } Loading Loading
drivers/hwmon/nct7802.c +23 −39 Original line number Diff line number Diff line Loading @@ -229,41 +229,34 @@ static int nct7802_read_temp(struct nct7802_data *data, static int nct7802_read_fan(struct nct7802_data *data, u8 reg_fan) { unsigned int f1, f2; unsigned int regs[2] = {reg_fan, REG_FANCOUNT_LOW}; u8 f[2]; int ret; mutex_lock(&data->access_lock); ret = regmap_read(data->regmap, reg_fan, &f1); if (ret < 0) goto abort; ret = regmap_read(data->regmap, REG_FANCOUNT_LOW, &f2); if (ret < 0) goto abort; ret = (f1 << 5) | (f2 >> 3); ret = regmap_multi_reg_read(data->regmap, regs, f, 2); if (ret) return ret; ret = (f[0] << 5) | (f[1] >> 3); /* convert fan count to rpm */ if (ret == 0x1fff) /* maximum value, assume fan is stopped */ ret = 0; else if (ret) ret = DIV_ROUND_CLOSEST(1350000U, ret); abort: mutex_unlock(&data->access_lock); return ret; } static int nct7802_read_fan_min(struct nct7802_data *data, u8 reg_fan_low, u8 reg_fan_high) { unsigned int f1, f2; unsigned int regs[2] = {reg_fan_low, reg_fan_high}; u8 f[2]; int ret; mutex_lock(&data->access_lock); ret = regmap_read(data->regmap, reg_fan_low, &f1); if (ret < 0) goto abort; ret = regmap_read(data->regmap, reg_fan_high, &f2); ret = regmap_multi_reg_read(data->regmap, regs, f, 2); if (ret < 0) goto abort; ret = f1 | ((f2 & 0xf8) << 5); return ret; ret = f[0] | ((f[1] & 0xf8) << 5); /* convert fan count to rpm */ if (ret == 0x1fff) /* maximum value, assume no limit */ ret = 0; Loading @@ -271,8 +264,6 @@ static int nct7802_read_fan_min(struct nct7802_data *data, u8 reg_fan_low, ret = DIV_ROUND_CLOSEST(1350000U, ret); else ret = 1350000U; abort: mutex_unlock(&data->access_lock); return ret; } Loading Loading @@ -302,33 +293,26 @@ static u8 nct7802_vmul[] = { 4, 2, 2, 2, 2 }; static int nct7802_read_voltage(struct nct7802_data *data, int nr, int index) { unsigned int v1, v2; u8 v[2]; int ret; mutex_lock(&data->access_lock); if (index == 0) { /* voltage */ ret = regmap_read(data->regmap, REG_VOLTAGE[nr], &v1); if (ret < 0) goto abort; ret = regmap_read(data->regmap, REG_VOLTAGE_LOW, &v2); unsigned int regs[2] = {REG_VOLTAGE[nr], REG_VOLTAGE_LOW}; ret = regmap_multi_reg_read(data->regmap, regs, v, 2); if (ret < 0) goto abort; ret = ((v1 << 2) | (v2 >> 6)) * nct7802_vmul[nr]; return ret; ret = ((v[0] << 2) | (v[1] >> 6)) * nct7802_vmul[nr]; } else { /* limit */ int shift = 8 - REG_VOLTAGE_LIMIT_MSB_SHIFT[index - 1][nr]; unsigned int regs[2] = {REG_VOLTAGE_LIMIT_LSB[index - 1][nr], REG_VOLTAGE_LIMIT_MSB[nr]}; ret = regmap_read(data->regmap, REG_VOLTAGE_LIMIT_LSB[index - 1][nr], &v1); if (ret < 0) goto abort; ret = regmap_read(data->regmap, REG_VOLTAGE_LIMIT_MSB[nr], &v2); ret = regmap_multi_reg_read(data->regmap, regs, v, 2); if (ret < 0) goto abort; ret = (v1 | ((v2 << shift) & 0x300)) * nct7802_vmul[nr]; return ret; ret = (v[0] | ((v[1] << shift) & 0x300)) * nct7802_vmul[nr]; } abort: mutex_unlock(&data->access_lock); return ret; } Loading