/* * V6 voltage * On I2C bus, sending a "x" byte to the max1586 means : * set V6 to either 0V, 1.8V, 2.5V, 3V depending on (x & 0x3) * As regulator framework doesn't accept voltages to be 0V, we use 1uV.
*/ staticconstunsignedint v6_voltages_uv[] = { 1, 1800000, 2500000, 3000000 };
/* * V3 voltage * On I2C bus, sending a "x" byte to the max1586 means : * set V3 to 0.700V + (x & 0x1f) * 0.025V * This voltage can be increased by external resistors * R24 and R25=100kOhm as described in the data sheet. * The gain is approximately: 1 + R24/R25 + R24/185.5kOhm
*/ staticint max1586_v3_get_voltage_sel(struct regulator_dev *rdev)
{ struct max1586_data *max1586 = rdev_get_drvdata(rdev);
dev_dbg(&client->dev, "changing voltage v6 to %dmv\n",
rdev->desc->volt_table[selector] / 1000);
v6_prog = I2C_V6_SELECT | (u8) selector;
ret = i2c_smbus_write_byte(client, v6_prog); if (ret) return ret;
max1586->v6_curr_sel = selector;
return 0;
}
/* * The Maxim 1586 controls V3 and V6 voltages, but offers no way of reading back * the set up value.
*/ staticconststruct regulator_ops max1586_v3_ops = {
.get_voltage_sel = max1586_v3_get_voltage_sel,
.set_voltage_sel = max1586_v3_set_voltage_sel,
.list_voltage = regulator_list_voltage_linear,
.map_voltage = regulator_map_voltage_linear,
};
if (of_property_read_u32(np, "v3-gain",
&pdata->v3_gain) < 0) {
dev_err(dev, "%pOF has no 'v3-gain' property\n", np); return -EINVAL;
}
np = of_get_child_by_name(np, "regulators"); if (!np) {
dev_err(dev, "missing 'regulators' subnode in DT\n"); return -EINVAL;
}
for (i = 0; i < ARRAY_SIZE(rmatch); i++)
rmatch[i].name = max1586_reg[i].name;
matched = of_regulator_match(dev, np, rmatch, ARRAY_SIZE(rmatch));
of_node_put(np); /* * If matched is 0, ie. neither Output_V3 nor Output_V6 have been found, * return 0, which signals the normal situation where no subregulator is * available. This is normal because the max1586 doesn't provide any * readback support, so the subregulators can't report any status * anyway. If matched < 0, return the error.
*/ if (matched <= 0) return matched;
/* Set curr_sel to default voltage on power-up */
max1586->v3_curr_sel = 24; /* 1.3V */
max1586->v6_curr_sel = 0;
for (i = 0; i < pdata->num_subdevs && i <= MAX1586_V6; i++) { struct regulator_dev *rdev;
id = pdata->subdevs[i].id; if (!pdata->subdevs[i].platform_data) continue; if (id < MAX1586_V3 || id > MAX1586_V6) {
dev_err(&client->dev, "invalid regulator id %d\n", id); return -EINVAL;
}
if (id == MAX1586_V3) {
max1586_reg[id].min_uV = max1586->min_uV;
max1586_reg[id].uV_step =
(max1586->max_uV - max1586->min_uV) /
MAX1586_V3_MAX_VSEL;
}
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.