ret = i2c_transfer(client->adapter, msgs, 2); if (ret < 0) {
dev_err(&client->dev, "i2c_transfer failed. %d", ret); return ret;
}
/* * 0x44[15] determines PMBus Operating Mode * If bit is set then it is SVID mode.
*/
svid = !!(read_buf[1] & BIT(7));
/* * Determine EN pin level for use in SVID mode. * This is done with help of STATUS_BYTE bit 6(OFF) & ON_OFF_CONFIG bit 2(EN pin polarity).
*/ if (svid) {
ret = i2c_smbus_read_byte_data(client, PMBUS_STATUS_BYTE); if (ret < 0) return ret;
off = !!(ret & PB_STATUS_OFF);
ret = i2c_smbus_read_byte_data(client, PMBUS_ON_OFF_CONFIG); if (ret < 0) return ret;
reg_en_pin_pol = !!(ret & PB_ON_OFF_CONFIG_POLARITY_HIGH);
data->en_pin_lvl = off ^ reg_en_pin_pol;
}
staticint tda38640_probe(struct i2c_client *client)
{ struct tda38640_data *data; int svid;
data = devm_kzalloc(&client->dev, sizeof(*data), GFP_KERNEL); if (!data) return -ENOMEM;
memcpy(&data->info, &tda38640_info, sizeof(tda38640_info));
if (IS_ENABLED(CONFIG_SENSORS_TDA38640_REGULATOR) &&
of_property_read_bool(client->dev.of_node, "infineon,en-pin-fixed-level")) {
svid = svid_mode(client, data); if (svid < 0) {
dev_err_probe(&client->dev, svid, "Could not determine operating mode."); return svid;
}
/* * Apply ON_OFF_CONFIG workaround as enabling the regulator using the * OPERATION register doesn't work in SVID mode. * * One should configure PMBUS_ON_OFF_CONFIG here, but * PB_ON_OFF_CONFIG_POWERUP_CONTROL and PB_ON_OFF_CONFIG_EN_PIN_REQ * are ignored by the device. * Only PB_ON_OFF_CONFIG_POLARITY_HIGH has an effect.
*/ if (svid) {
data->info.read_byte_data = tda38640_read_byte_data;
data->info.write_byte_data = tda38640_write_byte_data;
}
} return pmbus_do_probe(client, &data->info);
}
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.