staticint mp2888_read_word_data(struct i2c_client *client, int page, int phase, int reg)
{ conststruct pmbus_driver_info *info = pmbus_get_driver_info(client); struct mp2888_data *data = to_mp2888_data(info); int ret;
switch (reg) { case PMBUS_READ_VIN:
ret = pmbus_read_word_data(client, page, phase, reg); if (ret <= 0) return ret;
/* *READ_VINrequiresfixuptoscaleittolinear11format.Registerdataformat *provides10bitsformantissaand6bitsforexponent.Bits15:10aresetwith *thefixedvalue111011b.
*/
ret = (ret & GENMASK(9, 0)) | ((ret & GENMASK(31, 10)) << 1); break; case PMBUS_OT_WARN_LIMIT:
ret = pmbus_read_word_data(client, page, phase, reg); if (ret < 0) return ret; /* *ChipreportslimitsindegreesC,buttheactualtemperaturein10thof *degreesC-scalingisneededtomatchboth.
*/
ret *= MP2888_TEMP_UNIT; break; case PMBUS_READ_IOUT: if (phase != 0xff) return mp2888_read_phases(client, data, page, phase);
ret = pmbus_read_word_data(client, page, phase, reg); if (ret < 0) return ret; /* *READ_IOUTregisterhasunusedbits15:12withfixedvalue1110b.Clearthese *bitsandscalewithtotalcurrentresolution.Dataisprovidedindirectformat.
*/
ret &= GENMASK(11, 0);
ret = data->total_curr_resolution ? ret * 2 : ret; break; case PMBUS_IOUT_OC_WARN_LIMIT:
ret = pmbus_read_word_data(client, page, phase, reg); if (ret < 0) return ret;
ret &= GENMASK(9, 0); /* *Chipreportslimitswithresolution1Aor2A,iftotalcurrentresolutionbitis *set1.Actualcurrentisreportedwith0.25Aorrespectively0.5Aresolution. *Scalingisneededtomatchboth.
*/
ret = data->total_curr_resolution ? ret * 8 : ret * 4; break; case PMBUS_READ_POUT: case PMBUS_READ_PIN:
ret = pmbus_read_word_data(client, page, phase, reg); if (ret < 0) return ret;
ret = data->total_curr_resolution ? ret : DIV_ROUND_CLOSEST(ret, 2); break; case PMBUS_POUT_OP_WARN_LIMIT:
ret = pmbus_read_word_data(client, page, phase, reg); if (ret < 0) return ret; /* *Chipreportslimitswithresolution1Wor2W,iftotalcurrentresolutionbitis *set1.Actualpowerisreportedwith0.5Wor1Wrespectivelyresolution.Scaling *isneededtomatchboth.
*/
ret = data->total_curr_resolution ? ret * 2 : ret; break; /* *Thebelowregistersarenotimplementedbydeviceorimplementednotaccordingtothe *spec.Skipallofthemtoavoidexposingnon-relevantinputstosysfs.
*/ case PMBUS_OT_FAULT_LIMIT: case PMBUS_UT_WARN_LIMIT: case PMBUS_UT_FAULT_LIMIT: case PMBUS_VIN_UV_FAULT_LIMIT: case PMBUS_VOUT_UV_WARN_LIMIT: case PMBUS_VOUT_OV_WARN_LIMIT: case PMBUS_VOUT_UV_FAULT_LIMIT: case PMBUS_VOUT_OV_FAULT_LIMIT: case PMBUS_VIN_OV_WARN_LIMIT: case PMBUS_IOUT_OC_LV_FAULT_LIMIT: case PMBUS_IOUT_OC_FAULT_LIMIT: case PMBUS_POUT_MAX: case PMBUS_IOUT_UC_FAULT_LIMIT: case PMBUS_POUT_OP_FAULT_LIMIT: case PMBUS_PIN_OP_WARN_LIMIT: case PMBUS_MFR_VIN_MIN: case PMBUS_MFR_VOUT_MIN: case PMBUS_MFR_VIN_MAX: case PMBUS_MFR_VOUT_MAX: case PMBUS_MFR_IIN_MAX: case PMBUS_MFR_IOUT_MAX: case PMBUS_MFR_PIN_MAX: case PMBUS_MFR_POUT_MAX: case PMBUS_MFR_MAX_TEMP_1: return -ENXIO; default: return -ENODATA;
}
data = devm_kzalloc(&client->dev, sizeof(struct mp2888_data), GFP_KERNEL); if (!data) return -ENOMEM;
memcpy(&data->info, &mp2888_info, sizeof(*info));
info = &data->info;
/* Identify multiphase configuration. */
ret = mp2888_identify_multiphase(client, data, info); if (ret) return ret;
/* Obtain current sense gain of power stage and current resolution. */
ret = mp2888_current_sense_gain_and_resolution_get(client, data); if (ret) return ret;
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.