static umode_t
max6621_is_visible(constvoid *data, enum hwmon_sensor_types type, u32 attr, int channel)
{ /* Skip channels which are not physically conncted. */ if (((struct max6621_data *)data)->input_chan2reg[channel] < 0) return0;
switch (type) { case hwmon_temp: switch (attr) { case hwmon_temp_input: case hwmon_temp_label: case hwmon_temp_crit_alarm: return0444; case hwmon_temp_offset: case hwmon_temp_crit: return0644; default: break;
} break; default: break;
}
break; case hwmon_temp_crit:
channel -= MAX6621_TEMP_ALERT_CHAN_SHIFT;
reg = max6621_temp_alert_chan2reg[channel];
ret = regmap_read(data->regmap, reg, ®val); if (ret) return ret;
ret = max6621_verify_reg_data(dev, regval); if (ret) return ret;
*val = regval * 1000L;
break; case hwmon_temp_crit_alarm: /* *Setvaltozerotorecoverthecase,whenreading *MAX6621_TEMP_ALERT_CAUSE_REGresultsinforexample *MAX6621_ALERT_DIS.Readingwillreturnwitherror, *butinsuchcasealarmshouldbereturnedas0.
*/
*val = 0;
ret = regmap_read(data->regmap,
MAX6621_TEMP_ALERT_CAUSE_REG,
®val); if (ret) return ret;
ret = max6621_verify_reg_data(dev, regval); if (ret) { /* Do not report error if alert is disabled. */ if (regval == MAX6621_ALERT_DIS) return0; else return ret;
}
/* *Clearthealertautomatically,usingsend-byte *smbusprotocolforclearingalert.
*/ if (regval) {
ret = i2c_smbus_write_byte(data->client,
MAX6621_CLEAR_ALERT_REG); if (ret) return ret;
}
switch (type) { case hwmon_temp: switch (attr) { case hwmon_temp_offset: /* Clamp to allowed range to prevent overflow. */
val = clamp_val(val, MAX6621_TEMP_INPUT_MIN,
MAX6621_TEMP_INPUT_MAX);
val = max6621_temp_mc2reg(val);
return regmap_write(data->regmap,
MAX6621_CONFIG2_REG, val); case hwmon_temp_crit:
channel -= MAX6621_TEMP_ALERT_CHAN_SHIFT;
reg = max6621_temp_alert_chan2reg[channel]; /* Clamp to allowed range to prevent overflow. */
val = clamp_val(val, MAX6621_TEMP_INPUT_MIN,
MAX6621_TEMP_INPUT_MAX);
val = val / 1000L;
staticbool max6621_writeable_reg(struct device *dev, unsignedint reg)
{ switch (reg) { case MAX6621_CONFIG0_REG: case MAX6621_CONFIG1_REG: case MAX6621_CONFIG2_REG: case MAX6621_CONFIG3_REG: case MAX6621_TEMP_S0_ALERT_REG: case MAX6621_TEMP_S1_ALERT_REG: case MAX6621_TEMP_S2_ALERT_REG: case MAX6621_TEMP_S3_ALERT_REG: case MAX6621_TEMP_ALERT_CAUSE_REG: returntrue;
} returnfalse;
}
staticbool max6621_readable_reg(struct device *dev, unsignedint reg)
{ switch (reg) { case MAX6621_TEMP_S0D0_REG: case MAX6621_TEMP_S0D1_REG: case MAX6621_TEMP_S1D0_REG: case MAX6621_TEMP_S1D1_REG: case MAX6621_TEMP_S2D0_REG: case MAX6621_TEMP_S2D1_REG: case MAX6621_TEMP_S3D0_REG: case MAX6621_TEMP_S3D1_REG: case MAX6621_TEMP_MAX_REG: case MAX6621_TEMP_MAX_ADDR_REG: case MAX6621_CONFIG0_REG: case MAX6621_CONFIG1_REG: case MAX6621_CONFIG2_REG: case MAX6621_CONFIG3_REG: case MAX6621_TEMP_S0_ALERT_REG: case MAX6621_TEMP_S1_ALERT_REG: case MAX6621_TEMP_S2_ALERT_REG: case MAX6621_TEMP_S3_ALERT_REG: returntrue;
} returnfalse;
}
staticbool max6621_volatile_reg(struct device *dev, unsignedint reg)
{ switch (reg) { case MAX6621_TEMP_S0D0_REG: case MAX6621_TEMP_S0D1_REG: case MAX6621_TEMP_S1D0_REG: case MAX6621_TEMP_S1D1_REG: case MAX6621_TEMP_S2D0_REG: case MAX6621_TEMP_S2D1_REG: case MAX6621_TEMP_S3D0_REG: case MAX6621_TEMP_S3D1_REG: case MAX6621_TEMP_MAX_REG: case MAX6621_TEMP_S0_ALERT_REG: case MAX6621_TEMP_S1_ALERT_REG: case MAX6621_TEMP_S2_ALERT_REG: case MAX6621_TEMP_S3_ALERT_REG: case MAX6621_TEMP_ALERT_CAUSE_REG: returntrue;
} returnfalse;
}
/* Set CONFIG0 register masking temperature alerts and PEC. */
ret = regmap_write(data->regmap, MAX6621_CONFIG0_REG,
MAX6621_CONFIG0_INIT); if (ret) return ret;
/* Set CONFIG1 register for PEC access retry number. */
ret = regmap_write(data->regmap, MAX6621_CONFIG1_REG,
MAX6621_CONFIG1_INIT); if (ret) return ret;
/* Sync registers with hardware. */
regcache_mark_dirty(data->regmap);
ret = regcache_sync(data->regmap); if (ret) return ret;
/* Verify which temperature input registers are enabled. */ for (i = 0; i < MAX6621_TEMP_INPUT_REG_NUM; i++) {
ret = i2c_smbus_read_word_data(client, max6621_temp_regs[i]); if (ret < 0) return ret;
ret = max6621_verify_reg_data(dev, ret); if (ret) {
data->input_chan2reg[i] = -1; continue;
}
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.