summaryrefslogtreecommitdiff
path: root/src/drivers/i2c/nct7802y
diff options
context:
space:
mode:
Diffstat (limited to 'src/drivers/i2c/nct7802y')
-rw-r--r--src/drivers/i2c/nct7802y/chip.h15
-rw-r--r--src/drivers/i2c/nct7802y/nct7802y.h3
-rw-r--r--src/drivers/i2c/nct7802y/nct7802y_fan.c20
3 files changed, 31 insertions, 7 deletions
diff --git a/src/drivers/i2c/nct7802y/chip.h b/src/drivers/i2c/nct7802y/chip.h
index 925dca1eae..03c464af82 100644
--- a/src/drivers/i2c/nct7802y/chip.h
+++ b/src/drivers/i2c/nct7802y/chip.h
@@ -7,6 +7,15 @@
#define NCT7802Y_PECI_CNT 2
#define NCT7802Y_FAN_CNT 3
+#define NCT7802Y_RTD_CNT 3
+
+/* Remote temperature diode sensors mode */
+enum nct7802y_rtd_mode {
+ RTD_CLOSED = 0,
+ RTD_CURRENT_MODE,
+ RTD_THERMISTOR_MODE,
+ RTD_VOLTAGE_MODE,
+};
enum nct7802y_peci_mode {
PECI_DISABLED = 0,
@@ -53,6 +62,11 @@ enum nct7802y_temp_source {
TEMP_SOURCE_PROGRAMMABLE_1,
};
+struct nct7802y_sensors_config {
+ bool local_enable;
+ enum nct7802y_rtd_mode rtd[NCT7802Y_RTD_CNT];
+};
+
struct nct7802y_fan_smartconfig {
enum nct7802y_fan_smartmode mode;
enum nct7802y_fan_speed speed;
@@ -76,6 +90,7 @@ struct nct7802y_fan_config {
struct drivers_i2c_nct7802y_config {
struct nct7802y_peci_config peci[NCT7802Y_PECI_CNT];
struct nct7802y_fan_config fan[NCT7802Y_FAN_CNT];
+ struct nct7802y_sensors_config sensors;
enum nct7802y_fan_pecierror on_pecierror;
u8 pecierror_minduty;
};
diff --git a/src/drivers/i2c/nct7802y/nct7802y.h b/src/drivers/i2c/nct7802y/nct7802y.h
index aa07e7082e..d9b5878c67 100644
--- a/src/drivers/i2c/nct7802y/nct7802y.h
+++ b/src/drivers/i2c/nct7802y/nct7802y.h
@@ -11,6 +11,9 @@
#define BANK_SELECT 0x00
/* Bank 0 */
+#define MODE_SELECTION 0x22
+#define MODE_SELECTION_LTD_EN (1 << 6)
+#define MODE_SELECTION_RTDx(x, val) ((val) << (x) * 2)
#define PECI_ENABLE 0x23
#define PECI_ENABLE_AGENTx(x) (1 << (x))
diff --git a/src/drivers/i2c/nct7802y/nct7802y_fan.c b/src/drivers/i2c/nct7802y/nct7802y_fan.c
index 7771b78808..a608802c7b 100644
--- a/src/drivers/i2c/nct7802y/nct7802y_fan.c
+++ b/src/drivers/i2c/nct7802y/nct7802y_fan.c
@@ -68,7 +68,7 @@ void nct7802y_init_fan(struct device *const dev)
{
const struct drivers_i2c_nct7802y_config *const config = dev->chip_info;
unsigned int i;
- u8 set;
+ u8 value;
if (nct7802y_select_bank(dev, 0) != CB_SUCCESS)
return;
@@ -78,21 +78,27 @@ void nct7802y_init_fan(struct device *const dev)
init_fan(dev, &config->fan[i], i);
}
+ value = 0;
+ for (i = 0; i < NCT7802Y_RTD_CNT; ++i)
+ value |= MODE_SELECTION_RTDx(i, config->sensors.rtd[i]);
+ if (config->sensors.local_enable)
+ value |= MODE_SELECTION_LTD_EN;
+ nct7802y_write(dev, MODE_SELECTION, value);
+
switch (config->on_pecierror) {
case PECI_ERROR_KEEP:
- set = CLOSE_LOOP_FAN_PECI_ERR_CURR;
+ value = CLOSE_LOOP_FAN_PECI_ERR_CURR;
break;
case PECI_ERROR_VALUE:
- set = CLOSE_LOOP_FAN_PECI_ERR_VALUE;
+ value = CLOSE_LOOP_FAN_PECI_ERR_VALUE;
break;
case PECI_ERROR_FULLSPEED:
- set = CLOSE_LOOP_FAN_PECI_ERR_MAX;
+ value = CLOSE_LOOP_FAN_PECI_ERR_MAX;
break;
default:
- set = 0;
+ value = 0;
break;
}
- nct7802y_update(dev, CLOSE_LOOP_FAN_RPM_CTRL,
- CLOSE_LOOP_FAN_PECI_ERR_MASK, set);
+ nct7802y_update(dev, CLOSE_LOOP_FAN_RPM_CTRL, CLOSE_LOOP_FAN_PECI_ERR_MASK, value);
nct7802y_write(dev, FAN_DUTY_ON_PECI_ERROR, config->pecierror_minduty);
}