static int bmr46x_read_byte_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; 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; break; } bmr46x_wait(data); ret = pmbus_read_byte_data(client, page, reg); 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 adm1275_remove(struct i2c_client *client) { const struct pmbus_driver_info *info = pmbus_get_driver_info(client); int ret; ret = pmbus_do_remove(client); kfree(info); return ret; }
static int ucd9200_remove(struct i2c_client *client) { int ret; const struct pmbus_driver_info *info; info = pmbus_get_driver_info(client); ret = pmbus_do_remove(client); kfree(info); return ret; }
static int lm25066_remove(struct i2c_client *client) { const struct pmbus_driver_info *info = pmbus_get_driver_info(client); const struct lm25066_data *data = to_lm25066_data(info); int ret; ret = pmbus_do_remove(client); kfree(data); return ret; }
static int zl6100_write_byte(struct i2c_client *client, int page, u8 value) { const struct pmbus_driver_info *info = pmbus_get_driver_info(client); struct zl6100_data *data = to_zl6100_data(info); int ret; if (page > 0) return -ENXIO; zl6100_wait(data); ret = pmbus_write_byte(client, page, value); data->access = ktime_get(); return ret; }
static int max34440_write_word_data(struct i2c_client *client, int page, int reg, u16 word) { const struct pmbus_driver_info *info = pmbus_get_driver_info(client); const struct max34440_data *data = to_max34440_data(info); int ret; switch (reg) { case PMBUS_VIRT_RESET_POUT_HISTORY: ret = pmbus_write_word_data(client, page, MAX34446_MFR_POUT_PEAK, 0); if (ret) break; ret = pmbus_write_word_data(client, page, MAX34446_MFR_POUT_AVG, 0); break; case PMBUS_VIRT_RESET_VOUT_HISTORY: ret = pmbus_write_word_data(client, page, MAX34440_MFR_VOUT_MIN, 0x7fff); if (ret) break; ret = pmbus_write_word_data(client, page, MAX34440_MFR_VOUT_PEAK, 0); break; case PMBUS_VIRT_RESET_IOUT_HISTORY: ret = pmbus_write_word_data(client, page, MAX34440_MFR_IOUT_PEAK, 0); if (!ret && data->id == max34446) ret = pmbus_write_word_data(client, page, MAX34446_MFR_IOUT_AVG, 0); break; case PMBUS_VIRT_RESET_TEMP_HISTORY: ret = pmbus_write_word_data(client, page, MAX34440_MFR_TEMPERATURE_PEAK, 0x8000); if (!ret && data->id == max34446) ret = pmbus_write_word_data(client, page, MAX34446_MFR_TEMPERATURE_AVG, 0); break; default: ret = -ENODATA; break; } return ret; }
static int adm1275_read_byte_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 mfr_status, ret; if (page > 0) return -ENXIO; switch (reg) { case PMBUS_STATUS_IOUT: ret = pmbus_read_byte_data(client, page, PMBUS_STATUS_IOUT); if (ret < 0) break; mfr_status = pmbus_read_byte_data(client, page, PMBUS_STATUS_MFR_SPECIFIC); if (mfr_status < 0) { ret = mfr_status; break; } if (mfr_status & ADM1275_MFR_STATUS_IOUT_WARN2) { ret |= data->have_oc_fault ? PB_IOUT_OC_FAULT : PB_IOUT_UC_FAULT; } break; case PMBUS_STATUS_VOUT: if (data->id != adm1075) { ret = -ENODATA; break; } ret = 0; mfr_status = pmbus_read_byte_data(client, 0, ADM1075_VAUX_STATUS); if (mfr_status & ADM1075_VAUX_OV_WARN) ret |= PB_VOLTAGE_OV_WARNING; if (mfr_status & ADM1075_VAUX_UV_WARN) ret |= PB_VOLTAGE_UV_WARNING; break; default: ret = -ENODATA; break; } return ret; }
static int zl6100_write_word_data(struct i2c_client *client, int page, int reg, u16 word) { 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; switch (reg) { case PMBUS_VIRT_VMON_OV_WARN_LIMIT: word = zl6100_d2l(DIV_ROUND_CLOSEST(zl6100_l2d(word) * 10, 9)); vreg = MFR_VMON_OV_FAULT_LIMIT; pmbus_clear_cache(client); break; case PMBUS_VIRT_VMON_OV_FAULT_LIMIT: vreg = MFR_VMON_OV_FAULT_LIMIT; pmbus_clear_cache(client); break; case PMBUS_VIRT_VMON_UV_WARN_LIMIT: word = zl6100_d2l(DIV_ROUND_CLOSEST(zl6100_l2d(word) * 10, 11)); vreg = MFR_VMON_UV_FAULT_LIMIT; pmbus_clear_cache(client); break; case PMBUS_VIRT_VMON_UV_FAULT_LIMIT: vreg = MFR_VMON_UV_FAULT_LIMIT; pmbus_clear_cache(client); break; default: if (reg >= PMBUS_VIRT_BASE) return -ENXIO; vreg = reg; } zl6100_wait(data); ret = pmbus_write_word_data(client, page, vreg, word); data->access = ktime_get(); return ret; }
static int zl6100_read_byte_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, status; if (page > 0) return -ENXIO; zl6100_wait(data); switch (reg) { case PMBUS_VIRT_STATUS_VMON: ret = pmbus_read_byte_data(client, 0, PMBUS_STATUS_MFR_SPECIFIC); if (ret < 0) break; status = 0; if (ret & VMON_UV_WARNING) status |= PB_VOLTAGE_UV_WARNING; if (ret & VMON_OV_WARNING) status |= PB_VOLTAGE_OV_WARNING; if (ret & VMON_UV_FAULT) status |= PB_VOLTAGE_UV_FAULT; if (ret & VMON_OV_FAULT) status |= PB_VOLTAGE_OV_FAULT; ret = status; break; default: ret = pmbus_read_byte_data(client, page, reg); break; } data->access = ktime_get(); 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; }