static int max34440_read_word_data(struct i2c_client *client, int page, int reg) { int ret; switch (reg) { case PMBUS_VIRT_READ_VOUT_MAX: ret = pmbus_read_word_data(client, page, MAX34440_MFR_VOUT_PEAK); break; case PMBUS_VIRT_READ_IOUT_MAX: ret = pmbus_read_word_data(client, page, MAX34440_MFR_IOUT_PEAK); break; case PMBUS_VIRT_READ_TEMP_MAX: ret = pmbus_read_word_data(client, page, MAX34440_MFR_TEMPERATURE_PEAK); break; case PMBUS_VIRT_RESET_VOUT_HISTORY: case PMBUS_VIRT_RESET_IOUT_HISTORY: case PMBUS_VIRT_RESET_TEMP_HISTORY: ret = 0; break; default: ret = -ENODATA; break; } return ret; }
static int adm1275_read_word_data(struct i2c_client *client, int page, int reg) { int ret; if (page) return -EINVAL; switch (reg) { case PMBUS_VIRT_READ_IOUT_MAX: ret = pmbus_read_word_data(client, 0, ADM1275_PEAK_IOUT); break; case PMBUS_VIRT_READ_VOUT_MAX: ret = pmbus_read_word_data(client, 0, ADM1275_PEAK_VOUT); break; case PMBUS_VIRT_READ_VIN_MAX: ret = pmbus_read_word_data(client, 0, ADM1275_PEAK_VIN); break; case PMBUS_VIRT_RESET_IOUT_HISTORY: case PMBUS_VIRT_RESET_VOUT_HISTORY: case PMBUS_VIRT_RESET_VIN_HISTORY: ret = 0; break; default: ret = -ENODATA; break; } return ret; }
static int max8688_read_byte_data(struct i2c_client *client, int page, int reg) { int ret = 0; int mfg_status; if (page > 0) return -ENXIO; switch (reg) { case PMBUS_STATUS_VOUT: mfg_status = pmbus_read_word_data(client, 0, MAX8688_MFG_STATUS); if (mfg_status < 0) return mfg_status; if (mfg_status & MAX8688_STATUS_UV_WARNING) ret |= PB_VOLTAGE_UV_WARNING; if (mfg_status & MAX8688_STATUS_UV_FAULT) ret |= PB_VOLTAGE_UV_FAULT; if (mfg_status & MAX8688_STATUS_OV_WARNING) ret |= PB_VOLTAGE_OV_WARNING; if (mfg_status & MAX8688_STATUS_OV_FAULT) ret |= PB_VOLTAGE_OV_FAULT; break; case PMBUS_STATUS_IOUT: mfg_status = pmbus_read_word_data(client, 0, MAX8688_MFG_STATUS); if (mfg_status < 0) return mfg_status; if (mfg_status & MAX8688_STATUS_UC_FAULT) ret |= PB_IOUT_UC_FAULT; if (mfg_status & MAX8688_STATUS_OC_WARNING) ret |= PB_IOUT_OC_WARNING; if (mfg_status & MAX8688_STATUS_OC_FAULT) ret |= PB_IOUT_OC_FAULT; break; case PMBUS_STATUS_TEMPERATURE: mfg_status = pmbus_read_word_data(client, 0, MAX8688_MFG_STATUS); if (mfg_status < 0) return mfg_status; if (mfg_status & MAX8688_STATUS_OT_WARNING) ret |= PB_TEMP_OT_WARNING; if (mfg_status & MAX8688_STATUS_OT_FAULT) ret |= PB_TEMP_OT_FAULT; break; default: ret = -ENODATA; break; } return ret; }
static int bmr46x_read_word_data(struct i2c_client *client, int page, int reg) { const struct pmbus_driver_info *info = pmbus_get_driver_info(client); struct bmr46x_data *data = to_bmr46x_data(info); int ret, vreg; if (page > 0) return -ENXIO; /* * Limit register detection. */ switch (reg) { case PMBUS_VOUT_OV_WARN_LIMIT: case PMBUS_VOUT_UV_WARN_LIMIT: case PMBUS_IOUT_OC_WARN_LIMIT: case PMBUS_IOUT_OC_LV_FAULT_LIMIT: /* NotImpl on BMR461 */ return -ENXIO; default: if (reg >= PMBUS_VIRT_BASE) return -ENXIO; vreg = reg; break; } bmr46x_wait(data); ret = pmbus_read_word_data(client, page, vreg); data->access = ktime_get(); return ret; }
static int zl6100_read_word_data(struct i2c_client *client, int page, int reg) { const struct pmbus_driver_info *info = pmbus_get_driver_info(client); struct zl6100_data *data = to_zl6100_data(info); int ret, vreg; if (page > 0) return -ENXIO; if (data->id == zl2005) { /* * Limit register detection is not reliable on ZL2005. * Make sure registers are not erroneously detected. */ switch (reg) { case PMBUS_VOUT_OV_WARN_LIMIT: case PMBUS_VOUT_UV_WARN_LIMIT: case PMBUS_IOUT_OC_WARN_LIMIT: return -ENXIO; } } switch (reg) { case PMBUS_VIRT_READ_VMON: vreg = MFR_READ_VMON; break; case PMBUS_VIRT_VMON_OV_WARN_LIMIT: case PMBUS_VIRT_VMON_OV_FAULT_LIMIT: vreg = MFR_VMON_OV_FAULT_LIMIT; break; case PMBUS_VIRT_VMON_UV_WARN_LIMIT: case PMBUS_VIRT_VMON_UV_FAULT_LIMIT: vreg = MFR_VMON_UV_FAULT_LIMIT; break; default: if (reg >= PMBUS_VIRT_BASE) return -ENXIO; vreg = reg; break; } zl6100_wait(data); ret = pmbus_read_word_data(client, page, vreg); data->access = ktime_get(); if (ret < 0) return ret; switch (reg) { case PMBUS_VIRT_VMON_OV_WARN_LIMIT: ret = zl6100_d2l(DIV_ROUND_CLOSEST(zl6100_l2d(ret) * 9, 10)); break; case PMBUS_VIRT_VMON_UV_WARN_LIMIT: ret = zl6100_d2l(DIV_ROUND_CLOSEST(zl6100_l2d(ret) * 11, 10)); break; } return ret; }
static int max34440_read_byte_data(struct i2c_client *client, int page, int reg) { int ret = 0; int mfg_status; if (page >= 0) { ret = pmbus_set_page(client, page); if (ret < 0) return ret; } switch (reg) { case PMBUS_STATUS_IOUT: mfg_status = pmbus_read_word_data(client, 0, PMBUS_STATUS_MFR_SPECIFIC); if (mfg_status < 0) return mfg_status; if (mfg_status & MAX34440_STATUS_OC_WARN) ret |= PB_IOUT_OC_WARNING; if (mfg_status & MAX34440_STATUS_OC_FAULT) ret |= PB_IOUT_OC_FAULT; break; case PMBUS_STATUS_TEMPERATURE: mfg_status = pmbus_read_word_data(client, 0, PMBUS_STATUS_MFR_SPECIFIC); if (mfg_status < 0) return mfg_status; if (mfg_status & MAX34440_STATUS_OT_WARN) ret |= PB_TEMP_OT_WARNING; if (mfg_status & MAX34440_STATUS_OT_FAULT) ret |= PB_TEMP_OT_FAULT; break; default: ret = -ENODATA; break; } return ret; }
static int ir35221_read_word_data(struct i2c_client *client, int page, int reg) { int ret; switch (reg) { case PMBUS_VIRT_READ_VIN_MAX: ret = pmbus_read_word_data(client, page, IR35221_MFR_VIN_PEAK); break; case PMBUS_VIRT_READ_VOUT_MAX: ret = pmbus_read_word_data(client, page, IR35221_MFR_VOUT_PEAK); break; case PMBUS_VIRT_READ_IOUT_MAX: ret = pmbus_read_word_data(client, page, IR35221_MFR_IOUT_PEAK); break; case PMBUS_VIRT_READ_TEMP_MAX: ret = pmbus_read_word_data(client, page, IR35221_MFR_TEMP_PEAK); break; case PMBUS_VIRT_READ_VIN_MIN: ret = pmbus_read_word_data(client, page, IR35221_MFR_VIN_VALLEY); break; case PMBUS_VIRT_READ_VOUT_MIN: ret = pmbus_read_word_data(client, page, IR35221_MFR_VOUT_VALLEY); break; case PMBUS_VIRT_READ_IOUT_MIN: ret = pmbus_read_word_data(client, page, IR35221_MFR_IOUT_VALLEY); break; case PMBUS_VIRT_READ_TEMP_MIN: ret = pmbus_read_word_data(client, page, IR35221_MFR_TEMP_VALLEY); break; default: ret = -ENODATA; break; } return ret; }
static int ltc3815_write_byte(struct i2c_client *client, int page, u8 reg) { int ret; switch (reg) { case PMBUS_CLEAR_FAULTS: /* * LTC3815 does not support the CLEAR_FAULTS command. * Emulate it by clearing the status register. */ ret = pmbus_read_word_data(client, 0, PMBUS_STATUS_WORD); if (ret > 0) { pmbus_write_word_data(client, 0, PMBUS_STATUS_WORD, ret); ret = 0; } break; default: ret = -ENODATA; break; } return ret; }
static int adm1275_read_word_data(struct i2c_client *client, int page, int reg) { const struct pmbus_driver_info *info = pmbus_get_driver_info(client); const struct adm1275_data *data = to_adm1275_data(info); int ret = 0; if (page) return -ENXIO; switch (reg) { case PMBUS_IOUT_UC_FAULT_LIMIT: if (data->have_oc_fault) { ret = -ENXIO; break; } ret = pmbus_read_word_data(client, 0, ADM1275_IOUT_WARN2_LIMIT); break; case PMBUS_IOUT_OC_FAULT_LIMIT: if (!data->have_oc_fault) { ret = -ENXIO; break; } ret = pmbus_read_word_data(client, 0, ADM1275_IOUT_WARN2_LIMIT); break; case PMBUS_VOUT_OV_WARN_LIMIT: if (data->id != adm1075) { ret = -ENODATA; break; } ret = pmbus_read_word_data(client, 0, ADM1075_VAUX_OV_WARN_LIMIT); break; case PMBUS_VOUT_UV_WARN_LIMIT: if (data->id != adm1075) { ret = -ENODATA; break; } ret = pmbus_read_word_data(client, 0, ADM1075_VAUX_UV_WARN_LIMIT); break; case PMBUS_READ_VOUT: if (data->id != adm1075) { ret = -ENODATA; break; } ret = pmbus_read_word_data(client, 0, ADM1075_READ_VAUX); break; case PMBUS_VIRT_READ_IOUT_MAX: ret = pmbus_read_word_data(client, 0, ADM1275_PEAK_IOUT); break; case PMBUS_VIRT_READ_VOUT_MAX: ret = pmbus_read_word_data(client, 0, ADM1275_PEAK_VOUT); break; case PMBUS_VIRT_READ_VIN_MAX: ret = pmbus_read_word_data(client, 0, ADM1275_PEAK_VIN); break; case PMBUS_VIRT_READ_PIN_MAX: if (data->id == adm1275) { ret = -ENXIO; break; } ret = pmbus_read_word_data(client, 0, ADM1276_PEAK_PIN); break; case PMBUS_VIRT_RESET_IOUT_HISTORY: case PMBUS_VIRT_RESET_VOUT_HISTORY: case PMBUS_VIRT_RESET_VIN_HISTORY: break; case PMBUS_VIRT_RESET_PIN_HISTORY: if (data->id == adm1275) ret = -ENXIO; break; default: ret = -ENODATA; break; } return ret; }
static int lm25066_read_word_data(struct i2c_client *client, int page, int reg) { const struct pmbus_driver_info *info = pmbus_get_driver_info(client); const struct lm25066_data *data = to_lm25066_data(info); int ret; if (page > 1) return -ENXIO; /* Map READ_VAUX into READ_VOUT register on page 1 */ if (page == 1) { switch (reg) { case PMBUS_READ_VOUT: ret = pmbus_read_word_data(client, 0, LM25066_READ_VAUX); if (ret < 0) break; /* Adjust returned value to match VOUT coefficients */ switch (data->id) { case lm25066: /* VOUT: 4.54 mV VAUX: 283.2 uV LSB */ ret = DIV_ROUND_CLOSEST(ret * 2832, 45400); break; case lm5064: /* VOUT: 4.53 mV VAUX: 700 uV LSB */ ret = DIV_ROUND_CLOSEST(ret * 70, 453); break; case lm5066: /* VOUT: 2.18 mV VAUX: 725 uV LSB */ ret = DIV_ROUND_CLOSEST(ret * 725, 2180); break; } break; default: /* No other valid registers on page 1 */ ret = -ENXIO; break; } goto done; } switch (reg) { case PMBUS_READ_IIN: ret = pmbus_read_word_data(client, 0, LM25066_MFR_READ_IIN); break; case PMBUS_READ_PIN: ret = pmbus_read_word_data(client, 0, LM25066_MFR_READ_PIN); break; case PMBUS_IIN_OC_WARN_LIMIT: ret = pmbus_read_word_data(client, 0, LM25066_MFR_IIN_OC_WARN_LIMIT); break; case PMBUS_PIN_OP_WARN_LIMIT: ret = pmbus_read_word_data(client, 0, LM25066_MFR_PIN_OP_WARN_LIMIT); break; case PMBUS_VIRT_READ_VIN_AVG: ret = pmbus_read_word_data(client, 0, LM25066_READ_AVG_VIN); break; case PMBUS_VIRT_READ_VOUT_AVG: ret = pmbus_read_word_data(client, 0, LM25066_READ_AVG_VOUT); break; case PMBUS_VIRT_READ_IIN_AVG: ret = pmbus_read_word_data(client, 0, LM25066_READ_AVG_IIN); break; case PMBUS_VIRT_READ_PIN_AVG: ret = pmbus_read_word_data(client, 0, LM25066_READ_AVG_PIN); break; case PMBUS_VIRT_READ_PIN_MAX: ret = pmbus_read_word_data(client, 0, LM25066_READ_PIN_PEAK); break; case PMBUS_VIRT_RESET_PIN_HISTORY: ret = 0; break; default: ret = -ENODATA; break; } done: return ret; }
static int max34440_read_word_data(struct i2c_client *client, int page, int reg) { int ret; const struct pmbus_driver_info *info = pmbus_get_driver_info(client); const struct max34440_data *data = to_max34440_data(info); switch (reg) { case PMBUS_VIRT_READ_VOUT_MIN: ret = pmbus_read_word_data(client, page, MAX34440_MFR_VOUT_MIN); break; case PMBUS_VIRT_READ_VOUT_MAX: ret = pmbus_read_word_data(client, page, MAX34440_MFR_VOUT_PEAK); break; case PMBUS_VIRT_READ_IOUT_AVG: if (data->id != max34446) return -ENXIO; ret = pmbus_read_word_data(client, page, MAX34446_MFR_IOUT_AVG); break; case PMBUS_VIRT_READ_IOUT_MAX: ret = pmbus_read_word_data(client, page, MAX34440_MFR_IOUT_PEAK); break; case PMBUS_VIRT_READ_POUT_AVG: if (data->id != max34446) return -ENXIO; ret = pmbus_read_word_data(client, page, MAX34446_MFR_POUT_AVG); break; case PMBUS_VIRT_READ_POUT_MAX: if (data->id != max34446) return -ENXIO; ret = pmbus_read_word_data(client, page, MAX34446_MFR_POUT_PEAK); break; case PMBUS_VIRT_READ_TEMP_AVG: if (data->id != max34446 && data->id != max34460 && data->id != max34461) return -ENXIO; ret = pmbus_read_word_data(client, page, MAX34446_MFR_TEMPERATURE_AVG); break; case PMBUS_VIRT_READ_TEMP_MAX: ret = pmbus_read_word_data(client, page, MAX34440_MFR_TEMPERATURE_PEAK); break; case PMBUS_VIRT_RESET_POUT_HISTORY: if (data->id != max34446) return -ENXIO; ret = 0; break; case PMBUS_VIRT_RESET_VOUT_HISTORY: case PMBUS_VIRT_RESET_IOUT_HISTORY: case PMBUS_VIRT_RESET_TEMP_HISTORY: ret = 0; break; default: ret = -ENODATA; break; } return ret; }