static int tps65218_pmic_set_suspend_disable(struct regulator_dev *dev) { struct tps65218 *tps = rdev_get_drvdata(dev); unsigned int rid = rdev_get_id(dev); if (rid < TPS65218_DCDC_1 || rid > TPS65218_LDO_1) return -EINVAL; /* * Certain revisions of TPS65218 will need to have DCDC3 regulator * enabled always, otherwise an immediate system reboot will occur * during poweroff. */ if (rid == TPS65218_DCDC_3 && tps->rev == TPS65218_REV_2_1) return 0; if (!tps->strobes[rid]) { if (rid == TPS65218_DCDC_3) tps->strobes[rid] = 3; else return -EINVAL; } return tps65218_set_bits(tps, dev->desc->bypass_reg, dev->desc->bypass_mask, tps->strobes[rid], TPS65218_PROTECT_L1); }
static int tps65218_gpio_set_single_ended(struct gpio_chip *gc, unsigned offset, enum single_ended_mode mode) { struct tps65218_gpio *tps65218_gpio = gpiochip_get_data(gc); struct tps65218 *tps65218 = tps65218_gpio->tps65218; switch (offset) { case 0: case 2: /* GPO1 is hardwired to be open drain */ if (mode == LINE_MODE_OPEN_DRAIN) return 0; return -ENOTSUPP; case 1: /* GPO2 is push-pull by default, can be set as open drain. */ if (mode == LINE_MODE_OPEN_DRAIN) return tps65218_clear_bits(tps65218, TPS65218_REG_CONFIG1, TPS65218_CONFIG1_GPO2_BUF, TPS65218_PROTECT_L1); if (mode == LINE_MODE_PUSH_PULL) return tps65218_set_bits(tps65218, TPS65218_REG_CONFIG1, TPS65218_CONFIG1_GPO2_BUF, TPS65218_CONFIG1_GPO2_BUF, TPS65218_PROTECT_L1); return -ENOTSUPP; default: break; } return -ENOTSUPP; }
static int tps65218_pmic_enable(struct regulator_dev *dev) { struct tps65218 *tps = rdev_get_drvdata(dev); int rid = rdev_get_id(dev); if (rid < TPS65218_DCDC_1 || rid > TPS65218_LDO_1) return -EINVAL; /* Enable the regulator and password protection is level 1 */ return tps65218_set_bits(tps, dev->desc->enable_reg, dev->desc->enable_mask, dev->desc->enable_mask, TPS65218_PROTECT_L1); }
static int tps65218_pmic_set_voltage_sel(struct regulator_dev *dev, unsigned selector) { int ret; struct tps65218 *tps = rdev_get_drvdata(dev); unsigned int rid = rdev_get_id(dev); /* Set the voltage based on vsel value and write protect level is 2 */ ret = tps65218_set_bits(tps, dev->desc->vsel_reg, dev->desc->vsel_mask, selector, TPS65218_PROTECT_L1); /* Set GO bit for DCDC1/2 to initiate voltage transistion */ switch (rid) { case TPS65218_DCDC_1: case TPS65218_DCDC_2: ret = tps65218_set_bits(tps, TPS65218_REG_CONTRL_SLEW_RATE, TPS65218_SLEW_RATE_GO, TPS65218_SLEW_RATE_GO, TPS65218_PROTECT_L1); break; } return ret; }
static int tps65218_pmic_set_input_current_lim(struct regulator_dev *dev, int lim_uA) { unsigned int index = 0; unsigned int num_currents = ARRAY_SIZE(ls3_currents); struct tps65218 *tps = rdev_get_drvdata(dev); while (index < num_currents && ls3_currents[index] != lim_uA) index++; if (index == num_currents) return -EINVAL; return tps65218_set_bits(tps, dev->desc->csel_reg, dev->desc->csel_mask, index << 2, TPS65218_PROTECT_L1); }
static void tps65218_gpio_set(struct gpio_chip *gc, unsigned offset, int value) { struct tps65218_gpio *tps65218_gpio = gpiochip_get_data(gc); struct tps65218 *tps65218 = tps65218_gpio->tps65218; if (value) tps65218_set_bits(tps65218, TPS65218_REG_ENABLE2, TPS65218_ENABLE2_GPIO1 << offset, TPS65218_ENABLE2_GPIO1 << offset, TPS65218_PROTECT_L1); else tps65218_clear_bits(tps65218, TPS65218_REG_ENABLE2, TPS65218_ENABLE2_GPIO1 << offset, TPS65218_PROTECT_L1); }
static int tps65218_pmic_set_current_limit(struct regulator_dev *dev, int min_uA, int max_uA) { int index = 0; unsigned int num_currents = ARRAY_SIZE(ls3_currents); struct tps65218 *tps = rdev_get_drvdata(dev); while (index < num_currents && ls3_currents[index] <= max_uA) index++; index--; if (index < 0 || ls3_currents[index] < min_uA) return -EINVAL; return tps65218_set_bits(tps, dev->desc->csel_reg, dev->desc->csel_mask, index << __builtin_ctz(dev->desc->csel_mask), TPS65218_PROTECT_L1); }