switch (mode) { case REGULATOR_MODE_FAST:
val = DA9055_BUCK_MODE_SYNC << info->mode.shift; break; case REGULATOR_MODE_NORMAL:
val = DA9055_BUCK_MODE_AUTO << info->mode.shift; break; case REGULATOR_MODE_STANDBY:
val = DA9055_BUCK_MODE_SLEEP << info->mode.shift; break;
}
ret = da9055_reg_read(regulator->da9055, info->volt.reg_b); if (ret < 0) return ret;
if (ret >> info->volt.sl_shift) return REGULATOR_MODE_STANDBY; else return REGULATOR_MODE_NORMAL;
}
staticint da9055_ldo_set_mode(struct regulator_dev *rdev, unsignedint mode)
{ struct da9055_regulator *regulator = rdev_get_drvdata(rdev); conststruct da9055_regulator_info *info = regulator->info; struct da9055_volt_reg volt = info->volt; int val = 0;
switch (mode) { case REGULATOR_MODE_NORMAL: case REGULATOR_MODE_FAST:
val = DA9055_LDO_MODE_SYNC; break; case REGULATOR_MODE_STANDBY:
val = DA9055_LDO_MODE_SLEEP; break;
}
return da9055_reg_update(regulator->da9055, volt.reg_b,
1 << volt.sl_shift,
val << volt.sl_shift);
}
/* * There are two voltage register set A & B for voltage ramping but * either one of then can be active therefore we first determine * the active register set.
*/
ret = da9055_reg_read(regulator->da9055, info->conf.reg); if (ret < 0) return ret;
ret &= info->conf.sel_mask;
/* Get the voltage for the active register set A/B */ if (ret == DA9055_REGUALTOR_SET_A)
ret = da9055_reg_read(regulator->da9055, volt.reg_a); else
ret = da9055_reg_read(regulator->da9055, volt.reg_b);
/* * Regulator register set A/B is not selected through GPIO therefore * we use default register set A for voltage ramping.
*/ if (regulator->reg_rselect == NO_GPIO) { /* Select register set A */
ret = da9055_reg_update(regulator->da9055, info->conf.reg,
info->conf.sel_mask, DA9055_SEL_REG_A); if (ret < 0) return ret;
/* Set the voltage */ return da9055_reg_update(regulator->da9055, info->volt.reg_a,
info->volt.v_mask, selector);
}
/* * Here regulator register set A/B is selected through GPIO. * Therefore we first determine the selected register set A/B and * then set the desired voltage for that register set A/B.
*/
ret = da9055_reg_read(regulator->da9055, info->conf.reg); if (ret < 0) return ret;
ret &= info->conf.sel_mask;
/* Set the voltage */ if (ret == DA9055_REGUALTOR_SET_A) return da9055_reg_update(regulator->da9055, info->volt.reg_a,
info->volt.v_mask, selector); else return da9055_reg_update(regulator->da9055, info->volt.reg_b,
info->volt.v_mask, selector);
}
staticint da9055_regulator_set_suspend_voltage(struct regulator_dev *rdev, int uV)
{ struct da9055_regulator *regulator = rdev_get_drvdata(rdev); conststruct da9055_regulator_info *info = regulator->info; int ret;
/* Select register set B for suspend voltage ramping. */ if (regulator->reg_rselect == NO_GPIO) {
ret = da9055_reg_update(regulator->da9055, info->conf.reg,
info->conf.sel_mask, DA9055_SEL_REG_B); if (ret < 0) return ret;
}
ret = regulator_map_voltage_linear(rdev, uV, uV); if (ret < 0) return ret;
/* Select register set B for voltage ramping. */ if (regulator->reg_rselect == NO_GPIO) return da9055_reg_update(regulator->da9055, info->conf.reg,
info->conf.sel_mask, DA9055_SEL_REG_B); else return 0;
}
/* * Configures regulator to be controlled either through GPIO 1 or 2. * GPIO can control regulator state and/or select the regulator register * set A/B for voltage ramping.
*/ staticint da9055_gpio_init(struct device *dev, struct da9055_regulator *regulator, struct regulator_config *config, struct da9055_pdata *pdata, int id)
{ conststruct da9055_regulator_info *info = regulator->info; struct gpio_desc *ren; struct gpio_desc *ena; struct gpio_desc *rsel; int ret = 0;
/* Look for "regulator-enable-gpios" GPIOs in the regulator node */
ren = devm_gpiod_get_optional(dev, "regulator-enable", GPIOD_IN); if (IS_ERR(ren)) return PTR_ERR(ren);
if (ren) { /* This GPIO is not optional at this point */
ena = devm_gpiod_get(dev, "enable", GPIOD_OUT_HIGH); if (IS_ERR(ena)) return PTR_ERR(ena);
config->ena_gpiod = ena;
/* * GPI pin is muxed with regulator to control the * regulator state.
*/
gpiod_set_consumer_name(ren, "DA9055 ren GPI");
/* * Let the regulator know that its state is controlled * through GPI.
*/
ret = da9055_reg_update(regulator->da9055, info->conf.reg,
DA9055_E_GPI_MASK,
pdata->reg_ren[id]
<< DA9055_E_GPI_SHIFT); if (ret < 0) return ret;
}
/* Look for "regulator-select-gpios" GPIOs in the regulator node */
rsel = devm_gpiod_get_optional(dev, "regulator-select", GPIOD_IN); if (IS_ERR(rsel)) return PTR_ERR(rsel);
if (rsel) {
regulator->reg_rselect = pdata->reg_rsel[id];
/* * GPI pin is muxed with regulator to select the * regulator register set A/B for voltage ramping.
*/
gpiod_set_consumer_name(rsel, "DA9055 rsel GPI");
/* * Let the regulator know that its register set A/B * will be selected through GPI for voltage ramping.
*/
ret = da9055_reg_update(regulator->da9055, info->conf.reg,
DA9055_V_GPI_MASK,
pdata->reg_rsel[id]
<< DA9055_V_GPI_SHIFT);
}
if (pdata)
config.init_data = pdata->regulators[pdev->id];
ret = da9055_gpio_init(&pdev->dev, regulator, &config, pdata, pdev->id); if (ret < 0) return ret;
regulator->rdev = devm_regulator_register(&pdev->dev,
®ulator->info->reg_desc,
&config); if (IS_ERR(regulator->rdev)) {
dev_err(&pdev->dev, "Failed to register regulator %s\n",
regulator->info->reg_desc.name); return PTR_ERR(regulator->rdev);
}
/* Only LDO 5 and 6 has got the over current interrupt */ if (pdev->id == DA9055_ID_LDO5 || pdev->id == DA9055_ID_LDO6) {
irq = platform_get_irq_byname(pdev, "REGULATOR"); if (irq < 0) return irq;
ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
da9055_ldo5_6_oc_irq,
IRQF_TRIGGER_HIGH |
IRQF_ONESHOT |
IRQF_PROBE_SHARED,
pdev->name, regulator); if (ret != 0) { if (ret != -EBUSY) {
dev_err(&pdev->dev, "Failed to request Regulator IRQ %d: %d\n",
irq, 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.