OSDN Git Service

hwmon: (nct6775) Use nct6775_*() function pointers in nct6775_data.
authorDenis Pauk <pauk.denis@gmail.com>
Fri, 17 Sep 2021 22:02:39 +0000 (01:02 +0300)
committerGuenter Roeck <linux@roeck-us.net>
Tue, 12 Oct 2021 14:22:37 +0000 (07:22 -0700)
Prepare for platform specific callbacks usage:
* Use nct6775 function pointers in struct nct6775_data instead direct
  calls.

BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=204807
Signed-off-by: Denis Pauk <pauk.denis@gmail.com>
Co-developed-by: Bernhard Seibold <mail@bernhard-seibold.de>
Signed-off-by: Bernhard Seibold <mail@bernhard-seibold.de>
Cc: Andy Shevchenko <andriy.shevchenko@intel.com>
Cc: Guenter Roeck <linux@roeck-us.net>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Link: https://lore.kernel.org/r/20210917220240.56553-3-pauk.denis@gmail.com
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
drivers/hwmon/nct6775.c

index 9b503c8..4253eed 100644 (file)
@@ -1232,6 +1232,10 @@ struct nct6775_data {
        u8 fandiv1;
        u8 fandiv2;
        u8 sio_reg_enable;
+
+       /* nct6775_*() callbacks  */
+       u16 (*read_value)(struct nct6775_data *data, u16 reg);
+       int (*write_value)(struct nct6775_data *data, u16 reg, u16 value);
 };
 
 struct sensor_device_template {
@@ -1471,7 +1475,7 @@ static u16 nct6775_read_temp(struct nct6775_data *data, u16 reg)
 {
        u16 res;
 
-       res = nct6775_read_value(data, reg);
+       res = data->read_value(data, reg);
        if (!is_word_sized(data, reg))
                res <<= 8;
 
@@ -1482,7 +1486,7 @@ static int nct6775_write_temp(struct nct6775_data *data, u16 reg, u16 value)
 {
        if (!is_word_sized(data, reg))
                value >>= 8;
-       return nct6775_write_value(data, reg, value);
+       return data->write_value(data, reg, value);
 }
 
 /* This function assumes that the caller holds data->update_lock */
@@ -1492,24 +1496,24 @@ static void nct6775_write_fan_div(struct nct6775_data *data, int nr)
 
        switch (nr) {
        case 0:
-               reg = (nct6775_read_value(data, NCT6775_REG_FANDIV1) & 0x70)
+               reg = (data->read_value(data, NCT6775_REG_FANDIV1) & 0x70)
                    | (data->fan_div[0] & 0x7);
-               nct6775_write_value(data, NCT6775_REG_FANDIV1, reg);
+               data->write_value(data, NCT6775_REG_FANDIV1, reg);
                break;
        case 1:
-               reg = (nct6775_read_value(data, NCT6775_REG_FANDIV1) & 0x7)
+               reg = (data->read_value(data, NCT6775_REG_FANDIV1) & 0x7)
                    | ((data->fan_div[1] << 4) & 0x70);
-               nct6775_write_value(data, NCT6775_REG_FANDIV1, reg);
+               data->write_value(data, NCT6775_REG_FANDIV1, reg);
                break;
        case 2:
-               reg = (nct6775_read_value(data, NCT6775_REG_FANDIV2) & 0x70)
+               reg = (data->read_value(data, NCT6775_REG_FANDIV2) & 0x70)
                    | (data->fan_div[2] & 0x7);
-               nct6775_write_value(data, NCT6775_REG_FANDIV2, reg);
+               data->write_value(data, NCT6775_REG_FANDIV2, reg);
                break;
        case 3:
-               reg = (nct6775_read_value(data, NCT6775_REG_FANDIV2) & 0x7)
+               reg = (data->read_value(data, NCT6775_REG_FANDIV2) & 0x7)
                    | ((data->fan_div[3] << 4) & 0x70);
-               nct6775_write_value(data, NCT6775_REG_FANDIV2, reg);
+               data->write_value(data, NCT6775_REG_FANDIV2, reg);
                break;
        }
 }
@@ -1524,10 +1528,10 @@ static void nct6775_update_fan_div(struct nct6775_data *data)
 {
        u8 i;
 
-       i = nct6775_read_value(data, NCT6775_REG_FANDIV1);
+       i = data->read_value(data, NCT6775_REG_FANDIV1);
        data->fan_div[0] = i & 0x7;
        data->fan_div[1] = (i & 0x70) >> 4;
-       i = nct6775_read_value(data, NCT6775_REG_FANDIV2);
+       i = data->read_value(data, NCT6775_REG_FANDIV2);
        data->fan_div[2] = i & 0x7;
        if (data->has_fan & BIT(3))
                data->fan_div[3] = (i & 0x70) >> 4;
@@ -1575,11 +1579,11 @@ static void nct6775_init_fan_common(struct device *dev,
         */
        for (i = 0; i < ARRAY_SIZE(data->fan_min); i++) {
                if (data->has_fan_min & BIT(i)) {
-                       reg = nct6775_read_value(data, data->REG_FAN_MIN[i]);
+                       reg = data->read_value(data, data->REG_FAN_MIN[i]);
                        if (!reg)
-                               nct6775_write_value(data, data->REG_FAN_MIN[i],
-                                                   data->has_fan_div ? 0xff
-                                                                     : 0xff1f);
+                               data->write_value(data, data->REG_FAN_MIN[i],
+                                                 data->has_fan_div ? 0xff
+                                                                   : 0xff1f);
                }
        }
 }
@@ -1623,8 +1627,8 @@ static void nct6775_select_fan_div(struct device *dev,
                        }
                        if (fan_min != data->fan_min[nr]) {
                                data->fan_min[nr] = fan_min;
-                               nct6775_write_value(data, data->REG_FAN_MIN[nr],
-                                                   fan_min);
+                               data->write_value(data, data->REG_FAN_MIN[nr],
+                                                 fan_min);
                        }
                }
                data->fan_div[nr] = fan_div;
@@ -1644,16 +1648,15 @@ static void nct6775_update_pwm(struct device *dev)
                        continue;
 
                duty_is_dc = data->REG_PWM_MODE[i] &&
-                 (nct6775_read_value(data, data->REG_PWM_MODE[i])
+                 (data->read_value(data, data->REG_PWM_MODE[i])
                   & data->PWM_MODE_MASK[i]);
                data->pwm_mode[i] = !duty_is_dc;
 
-               fanmodecfg = nct6775_read_value(data, data->REG_FAN_MODE[i]);
+               fanmodecfg = data->read_value(data, data->REG_FAN_MODE[i]);
                for (j = 0; j < ARRAY_SIZE(data->REG_PWM); j++) {
                        if (data->REG_PWM[j] && data->REG_PWM[j][i]) {
-                               data->pwm[j][i]
-                                 = nct6775_read_value(data,
-                                                      data->REG_PWM[j][i]);
+                               data->pwm[j][i] = data->read_value(data,
+                                                                  data->REG_PWM[j][i]);
                        }
                }
 
@@ -1668,17 +1671,17 @@ static void nct6775_update_pwm(struct device *dev)
                        u8 t = fanmodecfg & 0x0f;
 
                        if (data->REG_TOLERANCE_H) {
-                               t |= (nct6775_read_value(data,
+                               t |= (data->read_value(data,
                                      data->REG_TOLERANCE_H[i]) & 0x70) >> 1;
                        }
                        data->target_speed_tolerance[i] = t;
                }
 
                data->temp_tolerance[1][i] =
-                       nct6775_read_value(data,
-                                       data->REG_CRITICAL_TEMP_TOLERANCE[i]);
+                       data->read_value(data,
+                                        data->REG_CRITICAL_TEMP_TOLERANCE[i]);
 
-               reg = nct6775_read_value(data, data->REG_TEMP_SEL[i]);
+               reg = data->read_value(data, data->REG_TEMP_SEL[i]);
                data->pwm_temp_sel[i] = reg & 0x1f;
                /* If fan can stop, report floor as 0 */
                if (reg & 0x80)
@@ -1687,7 +1690,7 @@ static void nct6775_update_pwm(struct device *dev)
                if (!data->REG_WEIGHT_TEMP_SEL[i])
                        continue;
 
-               reg = nct6775_read_value(data, data->REG_WEIGHT_TEMP_SEL[i]);
+               reg = data->read_value(data, data->REG_WEIGHT_TEMP_SEL[i]);
                data->pwm_weight_temp_sel[i] = reg & 0x1f;
                /* If weight is disabled, report weight source as 0 */
                if (!(reg & 0x80))
@@ -1695,9 +1698,8 @@ static void nct6775_update_pwm(struct device *dev)
 
                /* Weight temp data */
                for (j = 0; j < ARRAY_SIZE(data->weight_temp); j++) {
-                       data->weight_temp[j][i]
-                         = nct6775_read_value(data,
-                                              data->REG_WEIGHT_TEMP[j][i]);
+                       data->weight_temp[j][i] = data->read_value(data,
+                                                                  data->REG_WEIGHT_TEMP[j][i]);
                }
        }
 }
@@ -1715,10 +1717,10 @@ static void nct6775_update_pwm_limits(struct device *dev)
 
                for (j = 0; j < ARRAY_SIZE(data->fan_time); j++) {
                        data->fan_time[j][i] =
-                         nct6775_read_value(data, data->REG_FAN_TIME[j][i]);
+                         data->read_value(data, data->REG_FAN_TIME[j][i]);
                }
 
-               reg_t = nct6775_read_value(data, data->REG_TARGET[i]);
+               reg_t = data->read_value(data, data->REG_TARGET[i]);
                /* Update only in matching mode or if never updated */
                if (!data->target_temp[i] ||
                    data->pwm_enable[i] == thermal_cruise)
@@ -1726,7 +1728,7 @@ static void nct6775_update_pwm_limits(struct device *dev)
                if (!data->target_speed[i] ||
                    data->pwm_enable[i] == speed_cruise) {
                        if (data->REG_TOLERANCE_H) {
-                               reg_t |= (nct6775_read_value(data,
+                               reg_t |= (data->read_value(data,
                                        data->REG_TOLERANCE_H[i]) & 0x0f) << 8;
                        }
                        data->target_speed[i] = reg_t;
@@ -1734,21 +1736,21 @@ static void nct6775_update_pwm_limits(struct device *dev)
 
                for (j = 0; j < data->auto_pwm_num; j++) {
                        data->auto_pwm[i][j] =
-                         nct6775_read_value(data,
-                                            NCT6775_AUTO_PWM(data, i, j));
+                         data->read_value(data,
+                                          NCT6775_AUTO_PWM(data, i, j));
                        data->auto_temp[i][j] =
-                         nct6775_read_value(data,
-                                            NCT6775_AUTO_TEMP(data, i, j));
+                         data->read_value(data,
+                                          NCT6775_AUTO_TEMP(data, i, j));
                }
 
                /* critical auto_pwm temperature data */
                data->auto_temp[i][data->auto_pwm_num] =
-                       nct6775_read_value(data, data->REG_CRITICAL_TEMP[i]);
+                       data->read_value(data, data->REG_CRITICAL_TEMP[i]);
 
                switch (data->kind) {
                case nct6775:
-                       reg = nct6775_read_value(data,
-                                                NCT6775_REG_CRITICAL_ENAB[i]);
+                       reg = data->read_value(data,
+                                              NCT6775_REG_CRITICAL_ENAB[i]);
                        data->auto_pwm[i][data->auto_pwm_num] =
                                                (reg & 0x02) ? 0xff : 0x00;
                        break;
@@ -1765,10 +1767,10 @@ static void nct6775_update_pwm_limits(struct device *dev)
                case nct6796:
                case nct6797:
                case nct6798:
-                       reg = nct6775_read_value(data,
+                       reg = data->read_value(data,
                                        data->REG_CRITICAL_PWM_ENABLE[i]);
                        if (reg & data->CRITICAL_PWM_ENABLE_MASK)
-                               reg = nct6775_read_value(data,
+                               reg = data->read_value(data,
                                        data->REG_CRITICAL_PWM[i]);
                        else
                                reg = 0xff;
@@ -1795,11 +1797,11 @@ static struct nct6775_data *nct6775_update_device(struct device *dev)
                        if (!(data->have_in & BIT(i)))
                                continue;
 
-                       data->in[i][0] = nct6775_read_value(data,
-                                                           data->REG_VIN[i]);
-                       data->in[i][1] = nct6775_read_value(data,
+                       data->in[i][0] = data->read_value(data,
+                                                         data->REG_VIN[i]);
+                       data->in[i][1] = data->read_value(data,
                                          data->REG_IN_MINMAX[0][i]);
-                       data->in[i][2] = nct6775_read_value(data,
+                       data->in[i][2] = data->read_value(data,
                                          data->REG_IN_MINMAX[1][i]);
                }
 
@@ -1810,18 +1812,18 @@ static struct nct6775_data *nct6775_update_device(struct device *dev)
                        if (!(data->has_fan & BIT(i)))
                                continue;
 
-                       reg = nct6775_read_value(data, data->REG_FAN[i]);
+                       reg = data->read_value(data, data->REG_FAN[i]);
                        data->rpm[i] = data->fan_from_reg(reg,
                                                          data->fan_div[i]);
 
                        if (data->has_fan_min & BIT(i))
-                               data->fan_min[i] = nct6775_read_value(data,
+                               data->fan_min[i] = data->read_value(data,
                                           data->REG_FAN_MIN[i]);
 
                        if (data->REG_FAN_PULSES[i]) {
                                data->fan_pulses[i] =
-                                 (nct6775_read_value(data,
-                                                     data->REG_FAN_PULSES[i])
+                                 (data->read_value(data,
+                                                   data->REG_FAN_PULSES[i])
                                   >> data->FAN_PULSE_SHIFT[i]) & 0x03;
                        }
 
@@ -1837,15 +1839,14 @@ static struct nct6775_data *nct6775_update_device(struct device *dev)
                                continue;
                        for (j = 0; j < ARRAY_SIZE(data->reg_temp); j++) {
                                if (data->reg_temp[j][i])
-                                       data->temp[j][i]
-                                         = nct6775_read_temp(data,
-                                               data->reg_temp[j][i]);
+                                       data->temp[j][i] = nct6775_read_temp(data,
+                                                                            data->reg_temp[j][i]);
                        }
                        if (i >= NUM_TEMP_FIXED ||
                            !(data->have_temp_fixed & BIT(i)))
                                continue;
-                       data->temp_offset[i]
-                         = nct6775_read_value(data, data->REG_TEMP_OFFSET[i]);
+                       data->temp_offset[i] = data->read_value(data,
+                                                                  data->REG_TEMP_OFFSET[i]);
                }
 
                data->alarms = 0;
@@ -1854,7 +1855,7 @@ static struct nct6775_data *nct6775_update_device(struct device *dev)
 
                        if (!data->REG_ALARM[i])
                                continue;
-                       alarm = nct6775_read_value(data, data->REG_ALARM[i]);
+                       alarm = data->read_value(data, data->REG_ALARM[i]);
                        data->alarms |= ((u64)alarm) << (i << 3);
                }
 
@@ -1864,7 +1865,7 @@ static struct nct6775_data *nct6775_update_device(struct device *dev)
 
                        if (!data->REG_BEEP[i])
                                continue;
-                       beep = nct6775_read_value(data, data->REG_BEEP[i]);
+                       beep = data->read_value(data, data->REG_BEEP[i]);
                        data->beeps |= ((u64)beep) << (i << 3);
                }
 
@@ -1906,8 +1907,8 @@ store_in_reg(struct device *dev, struct device_attribute *attr, const char *buf,
                return err;
        mutex_lock(&data->update_lock);
        data->in[nr][index] = in_to_reg(val, nr);
-       nct6775_write_value(data, data->REG_IN_MINMAX[index - 1][nr],
-                           data->in[nr][index]);
+       data->write_value(data, data->REG_IN_MINMAX[index - 1][nr],
+                         data->in[nr][index]);
        mutex_unlock(&data->update_lock);
        return count;
 }
@@ -1931,8 +1932,8 @@ static int find_temp_source(struct nct6775_data *data, int index, int count)
        for (nr = 0; nr < count; nr++) {
                int src;
 
-               src = nct6775_read_value(data,
-                                        data->REG_TEMP_SOURCE[nr]) & 0x1f;
+               src = data->read_value(data,
+                                      data->REG_TEMP_SOURCE[nr]) & 0x1f;
                if (src == source)
                        return nr;
        }
@@ -1993,8 +1994,8 @@ store_beep(struct device *dev, struct device_attribute *attr, const char *buf,
                data->beeps |= (1ULL << nr);
        else
                data->beeps &= ~(1ULL << nr);
-       nct6775_write_value(data, data->REG_BEEP[regindex],
-                           (data->beeps >> (regindex << 3)) & 0xff);
+       data->write_value(data, data->REG_BEEP[regindex],
+                         (data->beeps >> (regindex << 3)) & 0xff);
        mutex_unlock(&data->update_lock);
        return count;
 }
@@ -2049,8 +2050,8 @@ store_temp_beep(struct device *dev, struct device_attribute *attr,
                data->beeps |= (1ULL << bit);
        else
                data->beeps &= ~(1ULL << bit);
-       nct6775_write_value(data, data->REG_BEEP[regindex],
-                           (data->beeps >> (regindex << 3)) & 0xff);
+       data->write_value(data, data->REG_BEEP[regindex],
+                         (data->beeps >> (regindex << 3)) & 0xff);
        mutex_unlock(&data->update_lock);
 
        return count;
@@ -2217,7 +2218,7 @@ write_div:
        }
 
 write_min:
-       nct6775_write_value(data, data->REG_FAN_MIN[nr], data->fan_min[nr]);
+       data->write_value(data, data->REG_FAN_MIN[nr], data->fan_min[nr]);
        mutex_unlock(&data->update_lock);
 
        return count;
@@ -2253,10 +2254,10 @@ store_fan_pulses(struct device *dev, struct device_attribute *attr,
 
        mutex_lock(&data->update_lock);
        data->fan_pulses[nr] = val & 3;
-       reg = nct6775_read_value(data, data->REG_FAN_PULSES[nr]);
+       reg = data->read_value(data, data->REG_FAN_PULSES[nr]);
        reg &= ~(0x03 << data->FAN_PULSE_SHIFT[nr]);
        reg |= (val & 3) << data->FAN_PULSE_SHIFT[nr];
-       nct6775_write_value(data, data->REG_FAN_PULSES[nr], reg);
+       data->write_value(data, data->REG_FAN_PULSES[nr], reg);
        mutex_unlock(&data->update_lock);
 
        return count;
@@ -2390,7 +2391,7 @@ store_temp_offset(struct device *dev, struct device_attribute *attr,
 
        mutex_lock(&data->update_lock);
        data->temp_offset[nr] = val;
-       nct6775_write_value(data, data->REG_TEMP_OFFSET[nr], val);
+       data->write_value(data, data->REG_TEMP_OFFSET[nr], val);
        mutex_unlock(&data->update_lock);
 
        return count;
@@ -2429,8 +2430,8 @@ store_temp_type(struct device *dev, struct device_attribute *attr,
        data->temp_type[nr] = val;
        vbit = 0x02 << nr;
        dbit = data->DIODE_MASK << nr;
-       vbat = nct6775_read_value(data, data->REG_VBAT) & ~vbit;
-       diode = nct6775_read_value(data, data->REG_DIODE) & ~dbit;
+       vbat = data->read_value(data, data->REG_VBAT) & ~vbit;
+       diode = data->read_value(data, data->REG_DIODE) & ~dbit;
        switch (val) {
        case 1: /* CPU diode (diode, current mode) */
                vbat |= vbit;
@@ -2442,8 +2443,8 @@ store_temp_type(struct device *dev, struct device_attribute *attr,
        case 4: /* thermistor */
                break;
        }
-       nct6775_write_value(data, data->REG_VBAT, vbat);
-       nct6775_write_value(data, data->REG_DIODE, diode);
+       data->write_value(data, data->REG_VBAT, vbat);
+       data->write_value(data, data->REG_DIODE, diode);
 
        mutex_unlock(&data->update_lock);
        return count;
@@ -2567,11 +2568,11 @@ store_pwm_mode(struct device *dev, struct device_attribute *attr,
 
        mutex_lock(&data->update_lock);
        data->pwm_mode[nr] = val;
-       reg = nct6775_read_value(data, data->REG_PWM_MODE[nr]);
+       reg = data->read_value(data, data->REG_PWM_MODE[nr]);
        reg &= ~data->PWM_MODE_MASK[nr];
        if (!val)
                reg |= data->PWM_MODE_MASK[nr];
-       nct6775_write_value(data, data->REG_PWM_MODE[nr], reg);
+       data->write_value(data, data->REG_PWM_MODE[nr], reg);
        mutex_unlock(&data->update_lock);
        return count;
 }
@@ -2590,7 +2591,7 @@ show_pwm(struct device *dev, struct device_attribute *attr, char *buf)
         * Otherwise, show the configured value.
         */
        if (index == 0 && data->pwm_enable[nr] > manual)
-               pwm = nct6775_read_value(data, data->REG_PWM_READ[nr]);
+               pwm = data->read_value(data, data->REG_PWM_READ[nr]);
        else
                pwm = data->pwm[index][nr];
 
@@ -2619,13 +2620,13 @@ store_pwm(struct device *dev, struct device_attribute *attr, const char *buf,
 
        mutex_lock(&data->update_lock);
        data->pwm[index][nr] = val;
-       nct6775_write_value(data, data->REG_PWM[index][nr], val);
+       data->write_value(data, data->REG_PWM[index][nr], val);
        if (index == 2) { /* floor: disable if val == 0 */
-               reg = nct6775_read_value(data, data->REG_TEMP_SEL[nr]);
+               reg = data->read_value(data, data->REG_TEMP_SEL[nr]);
                reg &= 0x7f;
                if (val)
                        reg |= 0x80;
-               nct6775_write_value(data, data->REG_TEMP_SEL[nr], reg);
+               data->write_value(data, data->REG_TEMP_SEL[nr], reg);
        }
        mutex_unlock(&data->update_lock);
        return count;
@@ -2664,29 +2665,29 @@ static void pwm_update_registers(struct nct6775_data *data, int nr)
        case manual:
                break;
        case speed_cruise:
-               reg = nct6775_read_value(data, data->REG_FAN_MODE[nr]);
+               reg = data->read_value(data, data->REG_FAN_MODE[nr]);
                reg = (reg & ~data->tolerance_mask) |
                  (data->target_speed_tolerance[nr] & data->tolerance_mask);
-               nct6775_write_value(data, data->REG_FAN_MODE[nr], reg);
-               nct6775_write_value(data, data->REG_TARGET[nr],
+               data->write_value(data, data->REG_FAN_MODE[nr], reg);
+               data->write_value(data, data->REG_TARGET[nr],
                                    data->target_speed[nr] & 0xff);
                if (data->REG_TOLERANCE_H) {
                        reg = (data->target_speed[nr] >> 8) & 0x0f;
                        reg |= (data->target_speed_tolerance[nr] & 0x38) << 1;
-                       nct6775_write_value(data,
-                                           data->REG_TOLERANCE_H[nr],
-                                           reg);
+                       data->write_value(data,
+                                         data->REG_TOLERANCE_H[nr],
+                                         reg);
                }
                break;
        case thermal_cruise:
-               nct6775_write_value(data, data->REG_TARGET[nr],
-                                   data->target_temp[nr]);
+               data->write_value(data, data->REG_TARGET[nr],
+                                 data->target_temp[nr]);
                fallthrough;
        default:
-               reg = nct6775_read_value(data, data->REG_FAN_MODE[nr]);
+               reg = data->read_value(data, data->REG_FAN_MODE[nr]);
                reg = (reg & ~data->tolerance_mask) |
                  data->temp_tolerance[0][nr];
-               nct6775_write_value(data, data->REG_FAN_MODE[nr], reg);
+               data->write_value(data, data->REG_FAN_MODE[nr], reg);
                break;
        }
 }
@@ -2734,13 +2735,13 @@ store_pwm_enable(struct device *dev, struct device_attribute *attr,
                 * turn off pwm control: select manual mode, set pwm to maximum
                 */
                data->pwm[0][nr] = 255;
-               nct6775_write_value(data, data->REG_PWM[0][nr], 255);
+               data->write_value(data, data->REG_PWM[0][nr], 255);
        }
        pwm_update_registers(data, nr);
-       reg = nct6775_read_value(data, data->REG_FAN_MODE[nr]);
+       reg = data->read_value(data, data->REG_FAN_MODE[nr]);
        reg &= 0x0f;
        reg |= pwm_enable_to_reg(val) << 4;
-       nct6775_write_value(data, data->REG_FAN_MODE[nr], reg);
+       data->write_value(data, data->REG_FAN_MODE[nr], reg);
        mutex_unlock(&data->update_lock);
        return count;
 }
@@ -2793,10 +2794,10 @@ store_pwm_temp_sel(struct device *dev, struct device_attribute *attr,
        mutex_lock(&data->update_lock);
        src = data->temp_src[val - 1];
        data->pwm_temp_sel[nr] = src;
-       reg = nct6775_read_value(data, data->REG_TEMP_SEL[nr]);
+       reg = data->read_value(data, data->REG_TEMP_SEL[nr]);
        reg &= 0xe0;
        reg |= src;
-       nct6775_write_value(data, data->REG_TEMP_SEL[nr], reg);
+       data->write_value(data, data->REG_TEMP_SEL[nr], reg);
        mutex_unlock(&data->update_lock);
 
        return count;
@@ -2838,15 +2839,15 @@ store_pwm_weight_temp_sel(struct device *dev, struct device_attribute *attr,
        if (val) {
                src = data->temp_src[val - 1];
                data->pwm_weight_temp_sel[nr] = src;
-               reg = nct6775_read_value(data, data->REG_WEIGHT_TEMP_SEL[nr]);
+               reg = data->read_value(data, data->REG_WEIGHT_TEMP_SEL[nr]);
                reg &= 0xe0;
                reg |= (src | 0x80);
-               nct6775_write_value(data, data->REG_WEIGHT_TEMP_SEL[nr], reg);
+               data->write_value(data, data->REG_WEIGHT_TEMP_SEL[nr], reg);
        } else {
                data->pwm_weight_temp_sel[nr] = 0;
-               reg = nct6775_read_value(data, data->REG_WEIGHT_TEMP_SEL[nr]);
+               reg = data->read_value(data, data->REG_WEIGHT_TEMP_SEL[nr]);
                reg &= 0x7f;
-               nct6775_write_value(data, data->REG_WEIGHT_TEMP_SEL[nr], reg);
+               data->write_value(data, data->REG_WEIGHT_TEMP_SEL[nr], reg);
        }
        mutex_unlock(&data->update_lock);
 
@@ -2958,9 +2959,9 @@ store_temp_tolerance(struct device *dev, struct device_attribute *attr,
        if (index)
                pwm_update_registers(data, nr);
        else
-               nct6775_write_value(data,
-                                   data->REG_CRITICAL_TEMP_TOLERANCE[nr],
-                                   val);
+               data->write_value(data,
+                                 data->REG_CRITICAL_TEMP_TOLERANCE[nr],
+                                 val);
        mutex_unlock(&data->update_lock);
        return count;
 }
@@ -3083,7 +3084,7 @@ store_weight_temp(struct device *dev, struct device_attribute *attr,
 
        mutex_lock(&data->update_lock);
        data->weight_temp[index][nr] = val;
-       nct6775_write_value(data, data->REG_WEIGHT_TEMP[index][nr], val);
+       data->write_value(data, data->REG_WEIGHT_TEMP[index][nr], val);
        mutex_unlock(&data->update_lock);
        return count;
 }
@@ -3132,7 +3133,7 @@ store_fan_time(struct device *dev, struct device_attribute *attr,
        val = step_time_to_reg(val, data->pwm_mode[nr]);
        mutex_lock(&data->update_lock);
        data->fan_time[index][nr] = val;
-       nct6775_write_value(data, data->REG_FAN_TIME[index][nr], val);
+       data->write_value(data, data->REG_FAN_TIME[index][nr], val);
        mutex_unlock(&data->update_lock);
        return count;
 }
@@ -3174,21 +3175,21 @@ store_auto_pwm(struct device *dev, struct device_attribute *attr,
        mutex_lock(&data->update_lock);
        data->auto_pwm[nr][point] = val;
        if (point < data->auto_pwm_num) {
-               nct6775_write_value(data,
+               data->write_value(data,
                                    NCT6775_AUTO_PWM(data, nr, point),
                                    data->auto_pwm[nr][point]);
        } else {
                switch (data->kind) {
                case nct6775:
                        /* disable if needed (pwm == 0) */
-                       reg = nct6775_read_value(data,
-                                                NCT6775_REG_CRITICAL_ENAB[nr]);
+                       reg = data->read_value(data,
+                                              NCT6775_REG_CRITICAL_ENAB[nr]);
                        if (val)
                                reg |= 0x02;
                        else
                                reg &= ~0x02;
-                       nct6775_write_value(data, NCT6775_REG_CRITICAL_ENAB[nr],
-                                           reg);
+                       data->write_value(data, NCT6775_REG_CRITICAL_ENAB[nr],
+                                         reg);
                        break;
                case nct6776:
                        break; /* always enabled, nothing to do */
@@ -3202,17 +3203,17 @@ store_auto_pwm(struct device *dev, struct device_attribute *attr,
                case nct6796:
                case nct6797:
                case nct6798:
-                       nct6775_write_value(data, data->REG_CRITICAL_PWM[nr],
+                       data->write_value(data, data->REG_CRITICAL_PWM[nr],
                                            val);
-                       reg = nct6775_read_value(data,
+                       reg = data->read_value(data,
                                        data->REG_CRITICAL_PWM_ENABLE[nr]);
                        if (val == 255)
                                reg &= ~data->CRITICAL_PWM_ENABLE_MASK;
                        else
                                reg |= data->CRITICAL_PWM_ENABLE_MASK;
-                       nct6775_write_value(data,
-                                           data->REG_CRITICAL_PWM_ENABLE[nr],
-                                           reg);
+                       data->write_value(data,
+                                         data->REG_CRITICAL_PWM_ENABLE[nr],
+                                         reg);
                        break;
                }
        }
@@ -3255,11 +3256,11 @@ store_auto_temp(struct device *dev, struct device_attribute *attr,
        mutex_lock(&data->update_lock);
        data->auto_temp[nr][point] = DIV_ROUND_CLOSEST(val, 1000);
        if (point < data->auto_pwm_num) {
-               nct6775_write_value(data,
+               data->write_value(data,
                                    NCT6775_AUTO_TEMP(data, nr, point),
                                    data->auto_temp[nr][point]);
        } else {
-               nct6775_write_value(data, data->REG_CRITICAL_TEMP[nr],
+               data->write_value(data, data->REG_CRITICAL_TEMP[nr],
                                    data->auto_temp[nr][point]);
        }
        mutex_unlock(&data->update_lock);
@@ -3519,9 +3520,9 @@ static inline void nct6775_init_device(struct nct6775_data *data)
 
        /* Start monitoring if needed */
        if (data->REG_CONFIG) {
-               tmp = nct6775_read_value(data, data->REG_CONFIG);
+               tmp = data->read_value(data, data->REG_CONFIG);
                if (!(tmp & 0x01))
-                       nct6775_write_value(data, data->REG_CONFIG, tmp | 0x01);
+                       data->write_value(data, data->REG_CONFIG, tmp | 0x01);
        }
 
        /* Enable temperature sensors if needed */
@@ -3530,18 +3531,18 @@ static inline void nct6775_init_device(struct nct6775_data *data)
                        continue;
                if (!data->reg_temp_config[i])
                        continue;
-               tmp = nct6775_read_value(data, data->reg_temp_config[i]);
+               tmp = data->read_value(data, data->reg_temp_config[i]);
                if (tmp & 0x01)
-                       nct6775_write_value(data, data->reg_temp_config[i],
+                       data->write_value(data, data->reg_temp_config[i],
                                            tmp & 0xfe);
        }
 
        /* Enable VBAT monitoring if needed */
-       tmp = nct6775_read_value(data, data->REG_VBAT);
+       tmp = data->read_value(data, data->REG_VBAT);
        if (!(tmp & 0x01))
-               nct6775_write_value(data, data->REG_VBAT, tmp | 0x01);
+               data->write_value(data, data->REG_VBAT, tmp | 0x01);
 
-       diode = nct6775_read_value(data, data->REG_DIODE);
+       diode = data->read_value(data, data->REG_DIODE);
 
        for (i = 0; i < data->temp_fixed_num; i++) {
                if (!(data->have_temp_fixed & BIT(i)))
@@ -3786,7 +3787,7 @@ static void add_temp_sensors(struct nct6775_data *data, const u16 *regp,
 
                if (!regp[i])
                        continue;
-               src = nct6775_read_value(data, regp[i]);
+               src = data->read_value(data, regp[i]);
                src &= 0x1f;
                if (!src || (*mask & BIT(src)))
                        continue;
@@ -3794,7 +3795,7 @@ static void add_temp_sensors(struct nct6775_data *data, const u16 *regp,
                        continue;
 
                index = __ffs(*available);
-               nct6775_write_value(data, data->REG_TEMP_SOURCE[index], src);
+               data->write_value(data, data->REG_TEMP_SOURCE[index], src);
                *available &= ~BIT(index);
                *mask |= BIT(src);
        }
@@ -3830,6 +3831,8 @@ static int nct6775_probe(struct platform_device *pdev)
        data->kind = sio_data->kind;
        data->sioreg = sio_data->sioreg;
        data->addr = res->start;
+       data->read_value = nct6775_read_value;
+       data->write_value = nct6775_write_value;
        mutex_init(&data->update_lock);
        data->name = nct6775_device_names[data->kind];
        data->bank = 0xff;              /* Force initial bank selection */
@@ -4349,7 +4352,7 @@ static int nct6775_probe(struct platform_device *pdev)
                if (reg_temp[i] == 0)
                        continue;
 
-               src = nct6775_read_value(data, data->REG_TEMP_SOURCE[i]) & 0x1f;
+               src = data->read_value(data, data->REG_TEMP_SOURCE[i]) & 0x1f;
                if (!src || (mask & BIT(src)))
                        available |= BIT(i);
 
@@ -4369,7 +4372,7 @@ static int nct6775_probe(struct platform_device *pdev)
                if (reg_temp[i] == 0)
                        continue;
 
-               src = nct6775_read_value(data, data->REG_TEMP_SOURCE[i]) & 0x1f;
+               src = data->read_value(data, data->REG_TEMP_SOURCE[i]) & 0x1f;
                if (!src || (mask & BIT(src)))
                        continue;
 
@@ -4429,7 +4432,7 @@ static int nct6775_probe(struct platform_device *pdev)
                if (reg_temp_mon[i] == 0)
                        continue;
 
-               src = nct6775_read_value(data, data->REG_TEMP_SEL[i]) & 0x1f;
+               src = data->read_value(data, data->REG_TEMP_SEL[i]) & 0x1f;
                if (!src)
                        continue;
 
@@ -4642,10 +4645,10 @@ static int __maybe_unused nct6775_suspend(struct device *dev)
        struct nct6775_data *data = nct6775_update_device(dev);
 
        mutex_lock(&data->update_lock);
-       data->vbat = nct6775_read_value(data, data->REG_VBAT);
+       data->vbat = data->read_value(data, data->REG_VBAT);
        if (data->kind == nct6775) {
-               data->fandiv1 = nct6775_read_value(data, NCT6775_REG_FANDIV1);
-               data->fandiv2 = nct6775_read_value(data, NCT6775_REG_FANDIV2);
+               data->fandiv1 = data->read_value(data, NCT6775_REG_FANDIV1);
+               data->fandiv2 = data->read_value(data, NCT6775_REG_FANDIV2);
        }
        mutex_unlock(&data->update_lock);
 
@@ -4684,18 +4687,18 @@ static int __maybe_unused nct6775_resume(struct device *dev)
                if (!(data->have_in & BIT(i)))
                        continue;
 
-               nct6775_write_value(data, data->REG_IN_MINMAX[0][i],
-                                   data->in[i][1]);
-               nct6775_write_value(data, data->REG_IN_MINMAX[1][i],
-                                   data->in[i][2]);
+               data->write_value(data, data->REG_IN_MINMAX[0][i],
+                                 data->in[i][1]);
+               data->write_value(data, data->REG_IN_MINMAX[1][i],
+                                 data->in[i][2]);
        }
 
        for (i = 0; i < ARRAY_SIZE(data->fan_min); i++) {
                if (!(data->has_fan_min & BIT(i)))
                        continue;
 
-               nct6775_write_value(data, data->REG_FAN_MIN[i],
-                                   data->fan_min[i]);
+               data->write_value(data, data->REG_FAN_MIN[i],
+                                 data->fan_min[i]);
        }
 
        for (i = 0; i < NUM_TEMP; i++) {
@@ -4709,10 +4712,10 @@ static int __maybe_unused nct6775_resume(struct device *dev)
        }
 
        /* Restore other settings */
-       nct6775_write_value(data, data->REG_VBAT, data->vbat);
+       data->write_value(data, data->REG_VBAT, data->vbat);
        if (data->kind == nct6775) {
-               nct6775_write_value(data, NCT6775_REG_FANDIV1, data->fandiv1);
-               nct6775_write_value(data, NCT6775_REG_FANDIV2, data->fandiv2);
+               data->write_value(data, NCT6775_REG_FANDIV1, data->fandiv1);
+               data->write_value(data, NCT6775_REG_FANDIV2, data->fandiv2);
        }
 
 abort: