^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * adm1031.c - Part of lm_sensors, Linux kernel modules for hardware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * monitoring
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Based on lm75.c and lm85.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Supports adm1030 / adm1031
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Copyright (C) 2004 Alexandre d'Alton <alex@alexdalton.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Reworked by Jean Delvare <jdelvare@suse.de>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/jiffies.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/i2c.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/hwmon.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/hwmon-sysfs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/err.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/mutex.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) /* Following macros takes channel parameter starting from 0 to 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define ADM1031_REG_FAN_SPEED(nr) (0x08 + (nr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define ADM1031_REG_FAN_DIV(nr) (0x20 + (nr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define ADM1031_REG_PWM (0x22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define ADM1031_REG_FAN_MIN(nr) (0x10 + (nr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #define ADM1031_REG_FAN_FILTER (0x23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define ADM1031_REG_TEMP_OFFSET(nr) (0x0d + (nr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define ADM1031_REG_TEMP_MAX(nr) (0x14 + 4 * (nr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define ADM1031_REG_TEMP_MIN(nr) (0x15 + 4 * (nr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define ADM1031_REG_TEMP_CRIT(nr) (0x16 + 4 * (nr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define ADM1031_REG_TEMP(nr) (0x0a + (nr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define ADM1031_REG_AUTO_TEMP(nr) (0x24 + (nr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define ADM1031_REG_STATUS(nr) (0x2 + (nr))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define ADM1031_REG_CONF1 0x00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define ADM1031_REG_CONF2 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define ADM1031_REG_EXT_TEMP 0x06
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define ADM1031_CONF1_MONITOR_ENABLE 0x01 /* Monitoring enable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #define ADM1031_CONF1_PWM_INVERT 0x08 /* PWM Invert */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #define ADM1031_CONF1_AUTO_MODE 0x80 /* Auto FAN */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define ADM1031_CONF2_PWM1_ENABLE 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define ADM1031_CONF2_PWM2_ENABLE 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #define ADM1031_CONF2_TACH1_ENABLE 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define ADM1031_CONF2_TACH2_ENABLE 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define ADM1031_CONF2_TEMP_ENABLE(chan) (0x10 << (chan))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define ADM1031_UPDATE_RATE_MASK 0x1c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #define ADM1031_UPDATE_RATE_SHIFT 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) /* Addresses to scan */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) static const unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, I2C_CLIENT_END };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) enum chips { adm1030, adm1031 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) typedef u8 auto_chan_table_t[8][2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) /* Each client has this additional data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) struct adm1031_data {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) struct i2c_client *client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) const struct attribute_group *groups[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) struct mutex update_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) int chip_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) char valid; /* !=0 if following fields are valid */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) unsigned long last_updated; /* In jiffies */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) unsigned int update_interval; /* In milliseconds */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) * The chan_select_table contains the possible configurations for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) * auto fan control.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) const auto_chan_table_t *chan_select_table;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) u16 alarm;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) u8 conf1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) u8 conf2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) u8 fan[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) u8 fan_div[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) u8 fan_min[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) u8 pwm[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) u8 old_pwm[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) s8 temp[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) u8 ext_temp[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) u8 auto_temp[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) u8 auto_temp_min[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) u8 auto_temp_off[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) u8 auto_temp_max[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) s8 temp_offset[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) s8 temp_min[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) s8 temp_max[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) s8 temp_crit[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) static inline u8 adm1031_read_value(struct i2c_client *client, u8 reg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) return i2c_smbus_read_byte_data(client, reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) static inline int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) adm1031_write_value(struct i2c_client *client, u8 reg, unsigned int value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) return i2c_smbus_write_byte_data(client, reg, value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) static struct adm1031_data *adm1031_update_device(struct device *dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) struct adm1031_data *data = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) struct i2c_client *client = data->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) unsigned long next_update;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) int chan;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) mutex_lock(&data->update_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) next_update = data->last_updated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) + msecs_to_jiffies(data->update_interval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) if (time_after(jiffies, next_update) || !data->valid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) dev_dbg(&client->dev, "Starting adm1031 update\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) for (chan = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) chan < ((data->chip_type == adm1031) ? 3 : 2); chan++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) u8 oldh, newh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) oldh =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) adm1031_read_value(client, ADM1031_REG_TEMP(chan));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) data->ext_temp[chan] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) adm1031_read_value(client, ADM1031_REG_EXT_TEMP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) newh =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) adm1031_read_value(client, ADM1031_REG_TEMP(chan));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) if (newh != oldh) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) data->ext_temp[chan] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) adm1031_read_value(client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) ADM1031_REG_EXT_TEMP);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) #ifdef DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) oldh =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) adm1031_read_value(client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) ADM1031_REG_TEMP(chan));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) /* oldh is actually newer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) if (newh != oldh)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) dev_warn(&client->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) "Remote temperature may be wrong.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) data->temp[chan] = newh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) data->temp_offset[chan] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) adm1031_read_value(client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) ADM1031_REG_TEMP_OFFSET(chan));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) data->temp_min[chan] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) adm1031_read_value(client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) ADM1031_REG_TEMP_MIN(chan));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) data->temp_max[chan] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) adm1031_read_value(client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) ADM1031_REG_TEMP_MAX(chan));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) data->temp_crit[chan] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) adm1031_read_value(client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) ADM1031_REG_TEMP_CRIT(chan));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) data->auto_temp[chan] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) adm1031_read_value(client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) ADM1031_REG_AUTO_TEMP(chan));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) data->conf1 = adm1031_read_value(client, ADM1031_REG_CONF1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) data->conf2 = adm1031_read_value(client, ADM1031_REG_CONF2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) data->alarm = adm1031_read_value(client, ADM1031_REG_STATUS(0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) | (adm1031_read_value(client, ADM1031_REG_STATUS(1)) << 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) if (data->chip_type == adm1030)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) data->alarm &= 0xc0ff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) for (chan = 0; chan < (data->chip_type == adm1030 ? 1 : 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) chan++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) data->fan_div[chan] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) adm1031_read_value(client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) ADM1031_REG_FAN_DIV(chan));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) data->fan_min[chan] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) adm1031_read_value(client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) ADM1031_REG_FAN_MIN(chan));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) data->fan[chan] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) adm1031_read_value(client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) ADM1031_REG_FAN_SPEED(chan));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) data->pwm[chan] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) (adm1031_read_value(client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) ADM1031_REG_PWM) >> (4 * chan)) & 0x0f;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) data->last_updated = jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) data->valid = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) mutex_unlock(&data->update_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) return data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) #define TEMP_TO_REG(val) (((val) < 0 ? ((val - 500) / 1000) : \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) ((val + 500) / 1000)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) #define TEMP_FROM_REG(val) ((val) * 1000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) #define TEMP_FROM_REG_EXT(val, ext) (TEMP_FROM_REG(val) + (ext) * 125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) #define TEMP_OFFSET_TO_REG(val) (TEMP_TO_REG(val) & 0x8f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) #define TEMP_OFFSET_FROM_REG(val) TEMP_FROM_REG((val) < 0 ? \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) (val) | 0x70 : (val))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) #define FAN_FROM_REG(reg, div) ((reg) ? \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) (11250 * 60) / ((reg) * (div)) : 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) static int FAN_TO_REG(int reg, int div)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) int tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) tmp = FAN_FROM_REG(clamp_val(reg, 0, 65535), div);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) return tmp > 255 ? 255 : tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) #define FAN_DIV_FROM_REG(reg) (1<<(((reg)&0xc0)>>6))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) #define PWM_TO_REG(val) (clamp_val((val), 0, 255) >> 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) #define PWM_FROM_REG(val) ((val) << 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) #define FAN_CHAN_FROM_REG(reg) (((reg) >> 5) & 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) #define FAN_CHAN_TO_REG(val, reg) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) (((reg) & 0x1F) | (((val) << 5) & 0xe0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) #define AUTO_TEMP_MIN_TO_REG(val, reg) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) ((((val) / 500) & 0xf8) | ((reg) & 0x7))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) #define AUTO_TEMP_RANGE_FROM_REG(reg) (5000 * (1 << ((reg) & 0x7)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) #define AUTO_TEMP_MIN_FROM_REG(reg) (1000 * ((((reg) >> 3) & 0x1f) << 2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) #define AUTO_TEMP_MIN_FROM_REG_DEG(reg) ((((reg) >> 3) & 0x1f) << 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) #define AUTO_TEMP_OFF_FROM_REG(reg) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) (AUTO_TEMP_MIN_FROM_REG(reg) - 5000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) #define AUTO_TEMP_MAX_FROM_REG(reg) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) (AUTO_TEMP_RANGE_FROM_REG(reg) + \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) AUTO_TEMP_MIN_FROM_REG(reg))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) static int AUTO_TEMP_MAX_TO_REG(int val, int reg, int pwm)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) int range = val - AUTO_TEMP_MIN_FROM_REG(reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) range = ((val - AUTO_TEMP_MIN_FROM_REG(reg))*10)/(16 - pwm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) ret = ((reg & 0xf8) |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) (range < 10000 ? 0 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) range < 20000 ? 1 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) range < 40000 ? 2 : range < 80000 ? 3 : 4));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) /* FAN auto control */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) #define GET_FAN_AUTO_BITFIELD(data, idx) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) (*(data)->chan_select_table)[FAN_CHAN_FROM_REG((data)->conf1)][idx % 2]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) * The tables below contains the possible values for the auto fan
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) * control bitfields. the index in the table is the register value.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) * MSb is the auto fan control enable bit, so the four first entries
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) * in the table disables auto fan control when both bitfields are zero.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) static const auto_chan_table_t auto_channel_select_table_adm1031 = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) { 2 /* 0b010 */ , 4 /* 0b100 */ },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) { 2 /* 0b010 */ , 2 /* 0b010 */ },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) { 4 /* 0b100 */ , 4 /* 0b100 */ },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) { 7 /* 0b111 */ , 7 /* 0b111 */ },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) static const auto_chan_table_t auto_channel_select_table_adm1030 = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) { 2 /* 0b10 */ , 0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) { 0xff /* invalid */ , 0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) { 0xff /* invalid */ , 0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) { 3 /* 0b11 */ , 0 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) * That function checks if a bitfield is valid and returns the other bitfield
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) * nearest match if no exact match where found.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) get_fan_auto_nearest(struct adm1031_data *data, int chan, u8 val, u8 reg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) int first_match = -1, exact_match = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) u8 other_reg_val =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) (*data->chan_select_table)[FAN_CHAN_FROM_REG(reg)][chan ? 0 : 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) if (val == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) for (i = 0; i < 8; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) if ((val == (*data->chan_select_table)[i][chan]) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) ((*data->chan_select_table)[i][chan ? 0 : 1] ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) other_reg_val)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) /* We found an exact match */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) exact_match = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) } else if (val == (*data->chan_select_table)[i][chan] &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) first_match == -1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) * Save the first match in case of an exact match has
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) * not been found
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) first_match = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) if (exact_match >= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) return exact_match;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) else if (first_match >= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) return first_match;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) static ssize_t fan_auto_channel_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) struct device_attribute *attr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) int nr = to_sensor_dev_attr(attr)->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) struct adm1031_data *data = adm1031_update_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) return sprintf(buf, "%d\n", GET_FAN_AUTO_BITFIELD(data, nr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) fan_auto_channel_store(struct device *dev, struct device_attribute *attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) const char *buf, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) struct adm1031_data *data = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) struct i2c_client *client = data->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) int nr = to_sensor_dev_attr(attr)->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) long val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) u8 reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) u8 old_fan_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) ret = kstrtol(buf, 10, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) old_fan_mode = data->conf1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) mutex_lock(&data->update_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) ret = get_fan_auto_nearest(data, nr, val, data->conf1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) mutex_unlock(&data->update_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) reg = ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) data->conf1 = FAN_CHAN_TO_REG(reg, data->conf1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) if ((data->conf1 & ADM1031_CONF1_AUTO_MODE) ^
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) (old_fan_mode & ADM1031_CONF1_AUTO_MODE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) if (data->conf1 & ADM1031_CONF1_AUTO_MODE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) * Switch to Auto Fan Mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) * Save PWM registers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) * Set PWM registers to 33% Both
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) data->old_pwm[0] = data->pwm[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) data->old_pwm[1] = data->pwm[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) adm1031_write_value(client, ADM1031_REG_PWM, 0x55);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) /* Switch to Manual Mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) data->pwm[0] = data->old_pwm[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) data->pwm[1] = data->old_pwm[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) /* Restore PWM registers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) adm1031_write_value(client, ADM1031_REG_PWM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) data->pwm[0] | (data->pwm[1] << 4));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) data->conf1 = FAN_CHAN_TO_REG(reg, data->conf1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) adm1031_write_value(client, ADM1031_REG_CONF1, data->conf1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) mutex_unlock(&data->update_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) static SENSOR_DEVICE_ATTR_RW(auto_fan1_channel, fan_auto_channel, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) static SENSOR_DEVICE_ATTR_RW(auto_fan2_channel, fan_auto_channel, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) /* Auto Temps */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) static ssize_t auto_temp_off_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) struct device_attribute *attr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) int nr = to_sensor_dev_attr(attr)->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) struct adm1031_data *data = adm1031_update_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) return sprintf(buf, "%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) AUTO_TEMP_OFF_FROM_REG(data->auto_temp[nr]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) static ssize_t auto_temp_min_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) struct device_attribute *attr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) int nr = to_sensor_dev_attr(attr)->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) struct adm1031_data *data = adm1031_update_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) return sprintf(buf, "%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) AUTO_TEMP_MIN_FROM_REG(data->auto_temp[nr]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) auto_temp_min_store(struct device *dev, struct device_attribute *attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) const char *buf, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) struct adm1031_data *data = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) struct i2c_client *client = data->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) int nr = to_sensor_dev_attr(attr)->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) long val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) ret = kstrtol(buf, 10, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) val = clamp_val(val, 0, 127000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) mutex_lock(&data->update_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) data->auto_temp[nr] = AUTO_TEMP_MIN_TO_REG(val, data->auto_temp[nr]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) adm1031_write_value(client, ADM1031_REG_AUTO_TEMP(nr),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) data->auto_temp[nr]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) mutex_unlock(&data->update_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) static ssize_t auto_temp_max_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) struct device_attribute *attr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) int nr = to_sensor_dev_attr(attr)->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) struct adm1031_data *data = adm1031_update_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) return sprintf(buf, "%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) AUTO_TEMP_MAX_FROM_REG(data->auto_temp[nr]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) static ssize_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) auto_temp_max_store(struct device *dev, struct device_attribute *attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) const char *buf, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) struct adm1031_data *data = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) struct i2c_client *client = data->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) int nr = to_sensor_dev_attr(attr)->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) long val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) ret = kstrtol(buf, 10, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) val = clamp_val(val, 0, 127000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) mutex_lock(&data->update_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) data->temp_max[nr] = AUTO_TEMP_MAX_TO_REG(val, data->auto_temp[nr],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) data->pwm[nr]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) adm1031_write_value(client, ADM1031_REG_AUTO_TEMP(nr),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) data->temp_max[nr]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) mutex_unlock(&data->update_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) static SENSOR_DEVICE_ATTR_RO(auto_temp1_off, auto_temp_off, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) static SENSOR_DEVICE_ATTR_RW(auto_temp1_min, auto_temp_min, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) static SENSOR_DEVICE_ATTR_RW(auto_temp1_max, auto_temp_max, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) static SENSOR_DEVICE_ATTR_RO(auto_temp2_off, auto_temp_off, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) static SENSOR_DEVICE_ATTR_RW(auto_temp2_min, auto_temp_min, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) static SENSOR_DEVICE_ATTR_RW(auto_temp2_max, auto_temp_max, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) static SENSOR_DEVICE_ATTR_RO(auto_temp3_off, auto_temp_off, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) static SENSOR_DEVICE_ATTR_RW(auto_temp3_min, auto_temp_min, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) static SENSOR_DEVICE_ATTR_RW(auto_temp3_max, auto_temp_max, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) /* pwm */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) static ssize_t pwm_show(struct device *dev, struct device_attribute *attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) int nr = to_sensor_dev_attr(attr)->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) struct adm1031_data *data = adm1031_update_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) return sprintf(buf, "%d\n", PWM_FROM_REG(data->pwm[nr]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) static ssize_t pwm_store(struct device *dev, struct device_attribute *attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) const char *buf, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) struct adm1031_data *data = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) struct i2c_client *client = data->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) int nr = to_sensor_dev_attr(attr)->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) long val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) int ret, reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) ret = kstrtol(buf, 10, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) mutex_lock(&data->update_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) if ((data->conf1 & ADM1031_CONF1_AUTO_MODE) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) (((val>>4) & 0xf) != 5)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) /* In automatic mode, the only PWM accepted is 33% */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) mutex_unlock(&data->update_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) data->pwm[nr] = PWM_TO_REG(val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) reg = adm1031_read_value(client, ADM1031_REG_PWM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) adm1031_write_value(client, ADM1031_REG_PWM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) nr ? ((data->pwm[nr] << 4) & 0xf0) | (reg & 0xf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) : (data->pwm[nr] & 0xf) | (reg & 0xf0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) mutex_unlock(&data->update_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) static SENSOR_DEVICE_ATTR_RW(pwm1, pwm, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) static SENSOR_DEVICE_ATTR_RW(pwm2, pwm, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) static SENSOR_DEVICE_ATTR_RW(auto_fan1_min_pwm, pwm, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) static SENSOR_DEVICE_ATTR_RW(auto_fan2_min_pwm, pwm, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) /* Fans */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) * That function checks the cases where the fan reading is not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) * relevant. It is used to provide 0 as fan reading when the fan is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) * not supposed to run
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) static int trust_fan_readings(struct adm1031_data *data, int chan)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) int res = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) if (data->conf1 & ADM1031_CONF1_AUTO_MODE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) switch (data->conf1 & 0x60) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) case 0x00:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) * remote temp1 controls fan1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) * remote temp2 controls fan2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) res = data->temp[chan+1] >=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) AUTO_TEMP_MIN_FROM_REG_DEG(data->auto_temp[chan+1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) case 0x20: /* remote temp1 controls both fans */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) res =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) data->temp[1] >=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) AUTO_TEMP_MIN_FROM_REG_DEG(data->auto_temp[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) case 0x40: /* remote temp2 controls both fans */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) res =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) data->temp[2] >=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) AUTO_TEMP_MIN_FROM_REG_DEG(data->auto_temp[2]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) case 0x60: /* max controls both fans */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) res =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) data->temp[0] >=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) AUTO_TEMP_MIN_FROM_REG_DEG(data->auto_temp[0])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) || data->temp[1] >=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) AUTO_TEMP_MIN_FROM_REG_DEG(data->auto_temp[1])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) || (data->chip_type == adm1031
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) && data->temp[2] >=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) AUTO_TEMP_MIN_FROM_REG_DEG(data->auto_temp[2]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) res = data->pwm[chan] > 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) return res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) static ssize_t fan_show(struct device *dev, struct device_attribute *attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) int nr = to_sensor_dev_attr(attr)->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) struct adm1031_data *data = adm1031_update_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) int value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) value = trust_fan_readings(data, nr) ? FAN_FROM_REG(data->fan[nr],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) FAN_DIV_FROM_REG(data->fan_div[nr])) : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) return sprintf(buf, "%d\n", value);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) static ssize_t fan_div_show(struct device *dev, struct device_attribute *attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) int nr = to_sensor_dev_attr(attr)->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) struct adm1031_data *data = adm1031_update_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) return sprintf(buf, "%d\n", FAN_DIV_FROM_REG(data->fan_div[nr]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) static ssize_t fan_min_show(struct device *dev, struct device_attribute *attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) int nr = to_sensor_dev_attr(attr)->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) struct adm1031_data *data = adm1031_update_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) return sprintf(buf, "%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) FAN_FROM_REG(data->fan_min[nr],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) FAN_DIV_FROM_REG(data->fan_div[nr])));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) static ssize_t fan_min_store(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) struct device_attribute *attr, const char *buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) struct adm1031_data *data = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) struct i2c_client *client = data->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) int nr = to_sensor_dev_attr(attr)->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) long val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) ret = kstrtol(buf, 10, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) mutex_lock(&data->update_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) if (val) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) data->fan_min[nr] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) FAN_TO_REG(val, FAN_DIV_FROM_REG(data->fan_div[nr]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) data->fan_min[nr] = 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) adm1031_write_value(client, ADM1031_REG_FAN_MIN(nr), data->fan_min[nr]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) mutex_unlock(&data->update_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) static ssize_t fan_div_store(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) struct device_attribute *attr, const char *buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) struct adm1031_data *data = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) struct i2c_client *client = data->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) int nr = to_sensor_dev_attr(attr)->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) long val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) u8 tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) int old_div;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) int new_min;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) ret = kstrtol(buf, 10, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) tmp = val == 8 ? 0xc0 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) val == 4 ? 0x80 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) val == 2 ? 0x40 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) val == 1 ? 0x00 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) if (tmp == 0xff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) mutex_lock(&data->update_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) /* Get fresh readings */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) data->fan_div[nr] = adm1031_read_value(client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) ADM1031_REG_FAN_DIV(nr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) data->fan_min[nr] = adm1031_read_value(client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) ADM1031_REG_FAN_MIN(nr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) /* Write the new clock divider and fan min */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) old_div = FAN_DIV_FROM_REG(data->fan_div[nr]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) data->fan_div[nr] = tmp | (0x3f & data->fan_div[nr]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) new_min = data->fan_min[nr] * old_div / val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) data->fan_min[nr] = new_min > 0xff ? 0xff : new_min;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) adm1031_write_value(client, ADM1031_REG_FAN_DIV(nr),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) data->fan_div[nr]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) adm1031_write_value(client, ADM1031_REG_FAN_MIN(nr),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) data->fan_min[nr]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) /* Invalidate the cache: fan speed is no longer valid */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) data->valid = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) mutex_unlock(&data->update_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) static SENSOR_DEVICE_ATTR_RO(fan1_input, fan, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) static SENSOR_DEVICE_ATTR_RW(fan1_min, fan_min, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) static SENSOR_DEVICE_ATTR_RW(fan1_div, fan_div, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) static SENSOR_DEVICE_ATTR_RO(fan2_input, fan, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) static SENSOR_DEVICE_ATTR_RW(fan2_min, fan_min, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) static SENSOR_DEVICE_ATTR_RW(fan2_div, fan_div, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) /* Temps */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) static ssize_t temp_show(struct device *dev, struct device_attribute *attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) int nr = to_sensor_dev_attr(attr)->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) struct adm1031_data *data = adm1031_update_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) int ext;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) ext = nr == 0 ?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) ((data->ext_temp[nr] >> 6) & 0x3) * 2 :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) (((data->ext_temp[nr] >> ((nr - 1) * 3)) & 7));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) return sprintf(buf, "%d\n", TEMP_FROM_REG_EXT(data->temp[nr], ext));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) static ssize_t temp_offset_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) struct device_attribute *attr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) int nr = to_sensor_dev_attr(attr)->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) struct adm1031_data *data = adm1031_update_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) return sprintf(buf, "%d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) TEMP_OFFSET_FROM_REG(data->temp_offset[nr]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) static ssize_t temp_min_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) struct device_attribute *attr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) int nr = to_sensor_dev_attr(attr)->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) struct adm1031_data *data = adm1031_update_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_min[nr]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) static ssize_t temp_max_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) struct device_attribute *attr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) int nr = to_sensor_dev_attr(attr)->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) struct adm1031_data *data = adm1031_update_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_max[nr]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) static ssize_t temp_crit_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) struct device_attribute *attr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) int nr = to_sensor_dev_attr(attr)->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) struct adm1031_data *data = adm1031_update_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) return sprintf(buf, "%d\n", TEMP_FROM_REG(data->temp_crit[nr]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) static ssize_t temp_offset_store(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) struct device_attribute *attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) const char *buf, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) struct adm1031_data *data = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) struct i2c_client *client = data->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) int nr = to_sensor_dev_attr(attr)->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) long val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) ret = kstrtol(buf, 10, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) val = clamp_val(val, -15000, 15000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) mutex_lock(&data->update_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) data->temp_offset[nr] = TEMP_OFFSET_TO_REG(val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) adm1031_write_value(client, ADM1031_REG_TEMP_OFFSET(nr),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) data->temp_offset[nr]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) mutex_unlock(&data->update_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) static ssize_t temp_min_store(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) struct device_attribute *attr, const char *buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) struct adm1031_data *data = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) struct i2c_client *client = data->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) int nr = to_sensor_dev_attr(attr)->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) long val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) ret = kstrtol(buf, 10, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) val = clamp_val(val, -55000, 127000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) mutex_lock(&data->update_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) data->temp_min[nr] = TEMP_TO_REG(val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) adm1031_write_value(client, ADM1031_REG_TEMP_MIN(nr),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) data->temp_min[nr]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) mutex_unlock(&data->update_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) static ssize_t temp_max_store(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) struct device_attribute *attr, const char *buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) struct adm1031_data *data = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) struct i2c_client *client = data->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) int nr = to_sensor_dev_attr(attr)->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) long val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) ret = kstrtol(buf, 10, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) val = clamp_val(val, -55000, 127000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) mutex_lock(&data->update_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) data->temp_max[nr] = TEMP_TO_REG(val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) adm1031_write_value(client, ADM1031_REG_TEMP_MAX(nr),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) data->temp_max[nr]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) mutex_unlock(&data->update_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) static ssize_t temp_crit_store(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) struct device_attribute *attr, const char *buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) struct adm1031_data *data = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) struct i2c_client *client = data->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) int nr = to_sensor_dev_attr(attr)->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) long val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) ret = kstrtol(buf, 10, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) val = clamp_val(val, -55000, 127000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) mutex_lock(&data->update_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) data->temp_crit[nr] = TEMP_TO_REG(val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) adm1031_write_value(client, ADM1031_REG_TEMP_CRIT(nr),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) data->temp_crit[nr]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) mutex_unlock(&data->update_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) static SENSOR_DEVICE_ATTR_RO(temp1_input, temp, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) static SENSOR_DEVICE_ATTR_RW(temp1_offset, temp_offset, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) static SENSOR_DEVICE_ATTR_RW(temp1_min, temp_min, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) static SENSOR_DEVICE_ATTR_RW(temp1_max, temp_max, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) static SENSOR_DEVICE_ATTR_RW(temp1_crit, temp_crit, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) static SENSOR_DEVICE_ATTR_RO(temp2_input, temp, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) static SENSOR_DEVICE_ATTR_RW(temp2_offset, temp_offset, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) static SENSOR_DEVICE_ATTR_RW(temp2_min, temp_min, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) static SENSOR_DEVICE_ATTR_RW(temp2_max, temp_max, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) static SENSOR_DEVICE_ATTR_RW(temp2_crit, temp_crit, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) static SENSOR_DEVICE_ATTR_RO(temp3_input, temp, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) static SENSOR_DEVICE_ATTR_RW(temp3_offset, temp_offset, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) static SENSOR_DEVICE_ATTR_RW(temp3_min, temp_min, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) static SENSOR_DEVICE_ATTR_RW(temp3_max, temp_max, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) static SENSOR_DEVICE_ATTR_RW(temp3_crit, temp_crit, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) /* Alarms */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) static ssize_t alarms_show(struct device *dev, struct device_attribute *attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) struct adm1031_data *data = adm1031_update_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) return sprintf(buf, "%d\n", data->alarm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) static DEVICE_ATTR_RO(alarms);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) static ssize_t alarm_show(struct device *dev, struct device_attribute *attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) int bitnr = to_sensor_dev_attr(attr)->index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) struct adm1031_data *data = adm1031_update_device(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) return sprintf(buf, "%d\n", (data->alarm >> bitnr) & 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) static SENSOR_DEVICE_ATTR_RO(fan1_alarm, alarm, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) static SENSOR_DEVICE_ATTR_RO(fan1_fault, alarm, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) static SENSOR_DEVICE_ATTR_RO(temp2_max_alarm, alarm, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) static SENSOR_DEVICE_ATTR_RO(temp2_min_alarm, alarm, 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) static SENSOR_DEVICE_ATTR_RO(temp2_crit_alarm, alarm, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) static SENSOR_DEVICE_ATTR_RO(temp2_fault, alarm, 5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) static SENSOR_DEVICE_ATTR_RO(temp1_max_alarm, alarm, 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) static SENSOR_DEVICE_ATTR_RO(temp1_min_alarm, alarm, 7);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) static SENSOR_DEVICE_ATTR_RO(fan2_alarm, alarm, 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) static SENSOR_DEVICE_ATTR_RO(fan2_fault, alarm, 9);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) static SENSOR_DEVICE_ATTR_RO(temp3_max_alarm, alarm, 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) static SENSOR_DEVICE_ATTR_RO(temp3_min_alarm, alarm, 11);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) static SENSOR_DEVICE_ATTR_RO(temp3_crit_alarm, alarm, 12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) static SENSOR_DEVICE_ATTR_RO(temp3_fault, alarm, 13);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) static SENSOR_DEVICE_ATTR_RO(temp1_crit_alarm, alarm, 14);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) /* Update Interval */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) static const unsigned int update_intervals[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) 16000, 8000, 4000, 2000, 1000, 500, 250, 125,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) static ssize_t update_interval_show(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) struct device_attribute *attr, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) struct adm1031_data *data = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) return sprintf(buf, "%u\n", data->update_interval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) static ssize_t update_interval_store(struct device *dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) struct device_attribute *attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) const char *buf, size_t count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) struct adm1031_data *data = dev_get_drvdata(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) struct i2c_client *client = data->client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) unsigned long val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) int i, err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) u8 reg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) err = kstrtoul(buf, 10, &val);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) * Find the nearest update interval from the table.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) * Use it to determine the matching update rate.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) for (i = 0; i < ARRAY_SIZE(update_intervals) - 1; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) if (val >= update_intervals[i])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) /* if not found, we point to the last entry (lowest update interval) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) /* set the new update rate while preserving other settings */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) reg = adm1031_read_value(client, ADM1031_REG_FAN_FILTER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) reg &= ~ADM1031_UPDATE_RATE_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) reg |= i << ADM1031_UPDATE_RATE_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) adm1031_write_value(client, ADM1031_REG_FAN_FILTER, reg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) mutex_lock(&data->update_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) data->update_interval = update_intervals[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) mutex_unlock(&data->update_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) return count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) static DEVICE_ATTR_RW(update_interval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) static struct attribute *adm1031_attributes[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) &sensor_dev_attr_fan1_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) &sensor_dev_attr_fan1_div.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) &sensor_dev_attr_fan1_min.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) &sensor_dev_attr_fan1_alarm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) &sensor_dev_attr_fan1_fault.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) &sensor_dev_attr_pwm1.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) &sensor_dev_attr_auto_fan1_channel.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) &sensor_dev_attr_temp1_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) &sensor_dev_attr_temp1_offset.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) &sensor_dev_attr_temp1_min.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) &sensor_dev_attr_temp1_min_alarm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) &sensor_dev_attr_temp1_max.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) &sensor_dev_attr_temp1_max_alarm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911) &sensor_dev_attr_temp1_crit.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) &sensor_dev_attr_temp1_crit_alarm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) &sensor_dev_attr_temp2_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) &sensor_dev_attr_temp2_offset.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) &sensor_dev_attr_temp2_min.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) &sensor_dev_attr_temp2_min_alarm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) &sensor_dev_attr_temp2_max.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) &sensor_dev_attr_temp2_max_alarm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) &sensor_dev_attr_temp2_crit.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) &sensor_dev_attr_temp2_crit_alarm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) &sensor_dev_attr_temp2_fault.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) &sensor_dev_attr_auto_temp1_off.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) &sensor_dev_attr_auto_temp1_min.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) &sensor_dev_attr_auto_temp1_max.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) &sensor_dev_attr_auto_temp2_off.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) &sensor_dev_attr_auto_temp2_min.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) &sensor_dev_attr_auto_temp2_max.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) &sensor_dev_attr_auto_fan1_min_pwm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) &dev_attr_update_interval.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) &dev_attr_alarms.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) static const struct attribute_group adm1031_group = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) .attrs = adm1031_attributes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) static struct attribute *adm1031_attributes_opt[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) &sensor_dev_attr_fan2_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) &sensor_dev_attr_fan2_div.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) &sensor_dev_attr_fan2_min.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) &sensor_dev_attr_fan2_alarm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) &sensor_dev_attr_fan2_fault.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) &sensor_dev_attr_pwm2.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) &sensor_dev_attr_auto_fan2_channel.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) &sensor_dev_attr_temp3_input.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) &sensor_dev_attr_temp3_offset.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) &sensor_dev_attr_temp3_min.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) &sensor_dev_attr_temp3_min_alarm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) &sensor_dev_attr_temp3_max.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) &sensor_dev_attr_temp3_max_alarm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) &sensor_dev_attr_temp3_crit.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) &sensor_dev_attr_temp3_crit_alarm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) &sensor_dev_attr_temp3_fault.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) &sensor_dev_attr_auto_temp3_off.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) &sensor_dev_attr_auto_temp3_min.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) &sensor_dev_attr_auto_temp3_max.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) &sensor_dev_attr_auto_fan2_min_pwm.dev_attr.attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) static const struct attribute_group adm1031_group_opt = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) .attrs = adm1031_attributes_opt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) /* Return 0 if detection is successful, -ENODEV otherwise */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) static int adm1031_detect(struct i2c_client *client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) struct i2c_board_info *info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) struct i2c_adapter *adapter = client->adapter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) const char *name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) int id, co;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) id = i2c_smbus_read_byte_data(client, 0x3d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) co = i2c_smbus_read_byte_data(client, 0x3e);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) if (!((id == 0x31 || id == 0x30) && co == 0x41))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) name = (id == 0x30) ? "adm1030" : "adm1031";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) strlcpy(info->type, name, I2C_NAME_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) static void adm1031_init_client(struct i2c_client *client)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) unsigned int read_val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) unsigned int mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) struct adm1031_data *data = i2c_get_clientdata(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) mask = (ADM1031_CONF2_PWM1_ENABLE | ADM1031_CONF2_TACH1_ENABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) if (data->chip_type == adm1031) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) mask |= (ADM1031_CONF2_PWM2_ENABLE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) ADM1031_CONF2_TACH2_ENABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) /* Initialize the ADM1031 chip (enables fan speed reading ) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) read_val = adm1031_read_value(client, ADM1031_REG_CONF2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) if ((read_val | mask) != read_val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) adm1031_write_value(client, ADM1031_REG_CONF2, read_val | mask);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) read_val = adm1031_read_value(client, ADM1031_REG_CONF1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) if ((read_val | ADM1031_CONF1_MONITOR_ENABLE) != read_val) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013) adm1031_write_value(client, ADM1031_REG_CONF1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) read_val | ADM1031_CONF1_MONITOR_ENABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) /* Read the chip's update rate */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) mask = ADM1031_UPDATE_RATE_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) read_val = adm1031_read_value(client, ADM1031_REG_FAN_FILTER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) i = (read_val & mask) >> ADM1031_UPDATE_RATE_SHIFT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) /* Save it as update interval */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) data->update_interval = update_intervals[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) static const struct i2c_device_id adm1031_id[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) static int adm1031_probe(struct i2c_client *client)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) struct device *dev = &client->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) struct device *hwmon_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) struct adm1031_data *data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) data = devm_kzalloc(dev, sizeof(struct adm1031_data), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) if (!data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) i2c_set_clientdata(client, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) data->client = client;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) data->chip_type = i2c_match_id(adm1031_id, client)->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) mutex_init(&data->update_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) if (data->chip_type == adm1030)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) data->chan_select_table = &auto_channel_select_table_adm1030;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) data->chan_select_table = &auto_channel_select_table_adm1031;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) /* Initialize the ADM1031 chip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) adm1031_init_client(client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) /* sysfs hooks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) data->groups[0] = &adm1031_group;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) if (data->chip_type == adm1031)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) data->groups[1] = &adm1031_group_opt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) data, data->groups);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) return PTR_ERR_OR_ZERO(hwmon_dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) static const struct i2c_device_id adm1031_id[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) { "adm1030", adm1030 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) { "adm1031", adm1031 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) MODULE_DEVICE_TABLE(i2c, adm1031_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) static struct i2c_driver adm1031_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) .class = I2C_CLASS_HWMON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) .driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) .name = "adm1031",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) .probe_new = adm1031_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) .id_table = adm1031_id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) .detect = adm1031_detect,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) .address_list = normal_i2c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) module_i2c_driver(adm1031_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) MODULE_AUTHOR("Alexandre d'Alton <alex@alexdalton.org>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) MODULE_DESCRIPTION("ADM1031/ADM1030 driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) MODULE_LICENSE("GPL");