static int lp872x_buck_set_mode(struct regulator_dev *rdev, unsigned int mode) { struct lp872x *lp = rdev_get_drvdata(rdev); enum lp872x_regulator_id buck = rdev_get_id(rdev); u8 addr, mask, shift, val; switch (buck) { case LP8720_ID_BUCK: addr = LP8720_BUCK_VOUT2; mask = LP8720_BUCK_FPWM_M; shift = LP8720_BUCK_FPWM_S; break; case LP8725_ID_BUCK1: addr = LP8725_BUCK_CTRL; mask = LP8725_BUCK1_FPWM_M; shift = LP8725_BUCK1_FPWM_S; break; case LP8725_ID_BUCK2: addr = LP8725_BUCK_CTRL; mask = LP8725_BUCK2_FPWM_M; shift = LP8725_BUCK2_FPWM_S; break; default: return -EINVAL; } if (mode == REGULATOR_MODE_FAST) val = LP872X_FORCE_PWM << shift; else if (mode == REGULATOR_MODE_NORMAL) val = LP872X_AUTO_PWM << shift; else return -EINVAL; return lp872x_update_bits(lp, addr, mask, val); }
static int lp8725_buck_set_current_limit(struct regulator_dev *rdev, int min_uA, int max_uA) { struct lp872x *lp = rdev_get_drvdata(rdev); enum lp872x_regulator_id buck = rdev_get_id(rdev); int i, max = ARRAY_SIZE(lp8725_buck_uA); u8 addr, val; switch (buck) { case LP8725_ID_BUCK1: addr = LP8725_BUCK1_VOUT2; break; case LP8725_ID_BUCK2: addr = LP8725_BUCK2_VOUT2; break; default: return -EINVAL; } for (i = 0 ; i < max ; i++) if (lp8725_buck_uA[i] >= min_uA && lp8725_buck_uA[i] <= max_uA) break; if (i == max) return -EINVAL; val = i << LP8725_BUCK_CL_S; return lp872x_update_bits(lp, addr, LP8725_BUCK_CL_M, val); }
static int lp872x_init_dvs(struct lp872x *lp) { int ret, gpio; struct lp872x_dvs *dvs = lp->pdata ? lp->pdata->dvs : NULL; enum lp872x_dvs_state pinstate; u8 mask[] = { LP8720_EXT_DVS_M, LP8725_DVS1_M | LP8725_DVS2_M }; u8 default_dvs_mode[] = { LP8720_DEFAULT_DVS, LP8725_DEFAULT_DVS }; if (!dvs) goto set_default_dvs_mode; gpio = dvs->gpio; if (!gpio_is_valid(gpio)) { dev_warn(lp->dev, "invalid gpio: %d\n", gpio); goto set_default_dvs_mode; } pinstate = dvs->init_state; ret = devm_gpio_request_one(lp->dev, gpio, pinstate, "LP872X DVS"); if (ret) { dev_err(lp->dev, "gpio request err: %d\n", ret); return ret; } lp->dvs_pin = pinstate; lp->dvs_gpio = gpio; return 0; set_default_dvs_mode: return lp872x_update_bits(lp, LP872X_GENERAL_CFG, mask[lp->chipid], default_dvs_mode[lp->chipid]); }
static int lp872x_buck_set_voltage_sel(struct regulator_dev *rdev, unsigned selector) { struct lp872x *lp = rdev_get_drvdata(rdev); enum lp872x_regulator_id buck = rdev_get_id(rdev); u8 addr, mask = LP872X_VOUT_M; struct lp872x_dvs *dvs = lp->pdata->dvs; if (dvs && gpio_is_valid(dvs->gpio)) lp872x_set_dvs(lp, dvs->gpio); addr = lp872x_select_buck_vout_addr(lp, buck); if (!lp872x_is_valid_buck_addr(addr)) return -EINVAL; return lp872x_update_bits(lp, addr, mask, selector); }