#define MAX6697_REG_MIN 0x30 /* * Map device tree / internal register bit map to chip bit map. * Applies to alert register and over-temperature register.
*/
switch (attr) { case hwmon_temp_input:
ret = regmap_multi_reg_read(regmap, temp_regs, regdata,
data->chip->have_ext & BIT(channel) ? 2 : 1); if (ret) return ret;
*val = (((regdata[0] - data->temp_offset) << 3) | (regdata[1] >> 5)) * 125; break; case hwmon_temp_max:
ret = regmap_read(regmap, MAX6697_REG_MAX[channel], ®val); if (ret) return ret;
*val = ((int)regval - data->temp_offset) * 1000; break; case hwmon_temp_crit:
ret = regmap_read(regmap, MAX6697_REG_CRIT[channel], ®val); if (ret) return ret;
*val = ((int)regval - data->temp_offset) * 1000; break; case hwmon_temp_min:
ret = regmap_read(regmap, MAX6697_REG_MIN, ®val); if (ret) return ret;
*val = ((int)regval - data->temp_offset) * 1000; break; case hwmon_temp_offset:
ret = regmap_multi_reg_read(regmap, offset_regs, regdata, 2); if (ret) return ret;
if (!(regdata[0] & BIT(channel - 1)))
regdata[1] = 0;
*val = sign_extend32(regdata[1], 7) * 250; break; case hwmon_temp_fault:
ret = regmap_read(regmap, MAX6697_REG_STAT_FAULT, ®val); if (ret) return ret; if (data->type == max6581)
*val = !!(regval & BIT(channel - 1)); else
*val = !!(regval & BIT(channel)); break; case hwmon_temp_crit_alarm:
ret = regmap_read(regmap, MAX6697_REG_STAT_CRIT, ®val); if (ret) return ret; /* * In the MAX6581 datasheet revision 0 to 3, the local channel * overtemperature status is reported in bit 6 of register 0x45, * and the overtemperature status for remote channel 7 is * reported in bit 7. In Revision 4 and later, the local channel * overtemperature status is reported in bit 7, and the remote * channel 7 overtemperature status is reported in bit 6. A real * chip was found to match the functionality documented in * Revision 4 and later.
*/
*val = !!(regval & BIT(channel ? channel - 1 : 7)); break; case hwmon_temp_max_alarm:
ret = regmap_read(regmap, MAX6697_REG_STAT_ALARM, ®val); if (ret) return ret;
*val = !!(regval & BIT(max6697_alarm_channel_map(channel))); break; case hwmon_temp_min_alarm:
ret = regmap_read(regmap, MAX6697_REG_STAT_MIN_ALARM, ®val); if (ret) return ret;
*val = !!(regval & BIT(max6697_alarm_channel_map(channel))); break; default: return -EOPNOTSUPP;
} return 0;
}
staticint max6697_write(struct device *dev, enum hwmon_sensor_types type,
u32 attr, int channel, long val)
{ struct max6697_data *data = dev_get_drvdata(dev); struct regmap *regmap = data->regmap; int ret;
switch (attr) { case hwmon_temp_max:
val = clamp_val(val, -1000000, 1000000); /* prevent underflow */
val = DIV_ROUND_CLOSEST(val, 1000) + data->temp_offset;
val = clamp_val(val, 0, data->type == max6581 ? 255 : 127); return regmap_write(regmap, MAX6697_REG_MAX[channel], val); case hwmon_temp_crit:
val = clamp_val(val, -1000000, 1000000); /* prevent underflow */
val = DIV_ROUND_CLOSEST(val, 1000) + data->temp_offset;
val = clamp_val(val, 0, data->type == max6581 ? 255 : 127); return regmap_write(regmap, MAX6697_REG_CRIT[channel], val); case hwmon_temp_min:
val = clamp_val(val, -1000000, 1000000); /* prevent underflow */
val = DIV_ROUND_CLOSEST(val, 1000) + data->temp_offset;
val = clamp_val(val, 0, 255); return regmap_write(regmap, MAX6697_REG_MIN, val); case hwmon_temp_offset:
mutex_lock(&data->update_lock);
val = clamp_val(val, MAX6581_OFFSET_MIN, MAX6581_OFFSET_MAX);
val = DIV_ROUND_CLOSEST(val, 250); if (!val) { /* disable this (and only this) channel */
ret = regmap_clear_bits(regmap, MAX6581_REG_OFFSET_SELECT,
BIT(channel - 1));
} else { /* enable channel and update offset */
ret = regmap_set_bits(regmap, MAX6581_REG_OFFSET_SELECT,
BIT(channel - 1)); if (ret) goto unlock;
ret = regmap_write(regmap, MAX6581_REG_OFFSET, val);
}
unlock:
mutex_unlock(&data->update_lock); return ret; default: return -EOPNOTSUPP;
}
}
/* * Don't touch configuration if there is no devicetree configuration. * If that is the case, use the current chip configuration.
*/ if (!np) { struct regmap *regmap = data->regmap;
ret = regmap_read(regmap, MAX6697_REG_CONFIG, ®); if (ret < 0) return ret; if (data->type == max6581) { if (reg & MAX6581_CONF_EXTENDED)
data->temp_offset = 64;
ret = regmap_read(regmap, MAX6581_REG_RESISTANCE, ®);
}
} else {
ret = max6697_config_of(np, data);
}
return ret;
}
staticbool max6697_volatile_reg(struct device *dev, unsignedint reg)
{ switch (reg) { case 0x00 ... 0x09: /* temperature high bytes */ case 0x44 ... 0x47: /* status */ case 0x51 ... 0x58: /* temperature low bytes */ returntrue; default: returnfalse;
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.