/* SPDX-License-Identifier: GPL-2.0-only */ #include #include #include "nct7802y.h" #include "chip.h" void nct7802y_init_peci(struct device *const dev) { const struct drivers_i2c_nct7802y_config *const config = dev->chip_info; unsigned int i, all_off = 1; /* Bank 1 can only be written to if PECI reading is enabled */ if (nct7802y_select_bank(dev, 0) != CB_SUCCESS) return; nct7802y_update(dev, PECI_ENABLE, 0, PECI_ENABLE_AGENTx(0)); if (nct7802y_select_bank(dev, 1) != CB_SUCCESS) return; for (i = 0; i < NCT7802Y_PECI_CNT; ++i) { if (config->peci[i].mode != PECI_DISABLED) { u8 ctrl3 = 0, style = 0; switch (config->peci[i].mode) { case PECI_DOMAIN_0: ctrl3 = PECI_CTRL_3_EN_AGENTx(i); style = PECI_TEMP_STYLE_DOM0_AGENTx(i) | PECI_TEMP_STYLE_SINGLE; break; case PECI_DOMAIN_1: ctrl3 = PECI_CTRL_3_EN_AGENTx(i) | PECI_CTRL_3_HAS_DOM1_AGENTx(i); style = PECI_TEMP_STYLE_DOM1_AGENTx(i) | PECI_TEMP_STYLE_SINGLE; break; case PECI_HIGHEST: ctrl3 = PECI_CTRL_3_EN_AGENTx(i) | PECI_CTRL_3_HAS_DOM1_AGENTx(i); style = PECI_TEMP_STYLE_HIGHEST; break; default: break; } nct7802y_update(dev, PECI_CTRL_1, PECI_CTRL_1_MANUAL_EN, PECI_CTRL_1_EN | PECI_CTRL_1_ROUTINE_EN); nct7802y_update(dev, PECI_CTRL_3, PECI_CTRL_3_HAS_DOM1_AGENTx(i), ctrl3); nct7802y_update(dev, PECI_REPORT_TEMP_STYLE, PECI_TEMP_STYLE_DOM1_AGENTx(i) | PECI_TEMP_STYLE_HIGHEST, style); nct7802y_write(dev, PECI_BASE_TEMP_AGENT(i), config->peci[i].base_temp); all_off = 0; } else { nct7802y_update(dev, PECI_CTRL_3, PECI_CTRL_3_EN_AGENTx(i), 0); } } if (all_off) nct7802y_update(dev, PECI_CTRL_1, PECI_CTRL_1_EN, 0); /* Disable PECI #0 reading if we only enabled it to access bank 1 */ if (config->peci[0].mode == PECI_DISABLED) { if (nct7802y_select_bank(dev, 0) != CB_SUCCESS) return; nct7802y_update(dev, PECI_ENABLE, PECI_ENABLE_AGENTx(0), 0); } }