Commit bea36728 authored by Mark Brown's avatar Mark Brown

Merge remote-tracking branches 'regulator/topic/mode',...

Merge remote-tracking branches 'regulator/topic/mode', 'regulator/topic/notifier', 'regulator/topic/palmas', 'regulator/topic/qcom' and 'regulator/topic/stw481x' into regulator-next
...@@ -137,7 +137,7 @@ Indirect operating mode control. ...@@ -137,7 +137,7 @@ Indirect operating mode control.
Consumer drivers can request a change in their supply regulator operating mode Consumer drivers can request a change in their supply regulator operating mode
by calling :- by calling :-
int regulator_set_optimum_mode(struct regulator *regulator, int load_uA); int regulator_set_load(struct regulator *regulator, int load_uA);
This will cause the core to recalculate the total load on the regulator (based This will cause the core to recalculate the total load on the regulator (based
on all its consumers) and change operating mode (if necessary and permitted) on all its consumers) and change operating mode (if necessary and permitted)
......
...@@ -332,7 +332,7 @@ static int edp_regulator_enable(struct edp_ctrl *ctrl) ...@@ -332,7 +332,7 @@ static int edp_regulator_enable(struct edp_ctrl *ctrl)
goto vdda_set_fail; goto vdda_set_fail;
} }
ret = regulator_set_optimum_mode(ctrl->vdda_vreg, VDDA_UA_ON_LOAD); ret = regulator_set_load(ctrl->vdda_vreg, VDDA_UA_ON_LOAD);
if (ret < 0) { if (ret < 0) {
pr_err("%s: vdda_vreg set regulator mode failed.\n", __func__); pr_err("%s: vdda_vreg set regulator mode failed.\n", __func__);
goto vdda_set_fail; goto vdda_set_fail;
...@@ -356,7 +356,7 @@ static int edp_regulator_enable(struct edp_ctrl *ctrl) ...@@ -356,7 +356,7 @@ static int edp_regulator_enable(struct edp_ctrl *ctrl)
lvl_enable_fail: lvl_enable_fail:
regulator_disable(ctrl->vdda_vreg); regulator_disable(ctrl->vdda_vreg);
vdda_enable_fail: vdda_enable_fail:
regulator_set_optimum_mode(ctrl->vdda_vreg, VDDA_UA_OFF_LOAD); regulator_set_load(ctrl->vdda_vreg, VDDA_UA_OFF_LOAD);
vdda_set_fail: vdda_set_fail:
return ret; return ret;
} }
...@@ -365,7 +365,7 @@ static void edp_regulator_disable(struct edp_ctrl *ctrl) ...@@ -365,7 +365,7 @@ static void edp_regulator_disable(struct edp_ctrl *ctrl)
{ {
regulator_disable(ctrl->lvl_vreg); regulator_disable(ctrl->lvl_vreg);
regulator_disable(ctrl->vdda_vreg); regulator_disable(ctrl->vdda_vreg);
regulator_set_optimum_mode(ctrl->vdda_vreg, VDDA_UA_OFF_LOAD); regulator_set_load(ctrl->vdda_vreg, VDDA_UA_OFF_LOAD);
} }
static int edp_gpio_config(struct edp_ctrl *ctrl) static int edp_gpio_config(struct edp_ctrl *ctrl)
......
...@@ -346,10 +346,10 @@ int ufs_qcom_phy_cfg_vreg(struct phy *phy, ...@@ -346,10 +346,10 @@ int ufs_qcom_phy_cfg_vreg(struct phy *phy,
goto out; goto out;
} }
uA_load = on ? vreg->max_uA : 0; uA_load = on ? vreg->max_uA : 0;
ret = regulator_set_optimum_mode(reg, uA_load); ret = regulator_set_load(reg, uA_load);
if (ret >= 0) { if (ret >= 0) {
/* /*
* regulator_set_optimum_mode() returns new regulator * regulator_set_load() returns new regulator
* mode upon success. * mode upon success.
*/ */
ret = 0; ret = 0;
......
...@@ -3061,7 +3061,7 @@ unsigned int regulator_get_mode(struct regulator *regulator) ...@@ -3061,7 +3061,7 @@ unsigned int regulator_get_mode(struct regulator *regulator)
EXPORT_SYMBOL_GPL(regulator_get_mode); EXPORT_SYMBOL_GPL(regulator_get_mode);
/** /**
* regulator_set_optimum_mode - set regulator optimum operating mode * regulator_set_load - set regulator load
* @regulator: regulator source * @regulator: regulator source
* @uA_load: load current * @uA_load: load current
* *
...@@ -3084,9 +3084,9 @@ EXPORT_SYMBOL_GPL(regulator_get_mode); ...@@ -3084,9 +3084,9 @@ EXPORT_SYMBOL_GPL(regulator_get_mode);
* DRMS will sum the total requested load on the regulator and change * DRMS will sum the total requested load on the regulator and change
* to the most efficient operating mode if platform constraints allow. * to the most efficient operating mode if platform constraints allow.
* *
* Returns the new regulator mode or error. * On error a negative errno is returned.
*/ */
int regulator_set_optimum_mode(struct regulator *regulator, int uA_load) int regulator_set_load(struct regulator *regulator, int uA_load)
{ {
struct regulator_dev *rdev = regulator->rdev; struct regulator_dev *rdev = regulator->rdev;
int ret; int ret;
...@@ -3098,7 +3098,7 @@ int regulator_set_optimum_mode(struct regulator *regulator, int uA_load) ...@@ -3098,7 +3098,7 @@ int regulator_set_optimum_mode(struct regulator *regulator, int uA_load)
return ret; return ret;
} }
EXPORT_SYMBOL_GPL(regulator_set_optimum_mode); EXPORT_SYMBOL_GPL(regulator_set_load);
/** /**
* regulator_allow_bypass - allow the regulator to go into bypass mode * regulator_allow_bypass - allow the regulator to go into bypass mode
......
...@@ -413,3 +413,88 @@ void devm_regulator_bulk_unregister_supply_alias(struct device *dev, ...@@ -413,3 +413,88 @@ void devm_regulator_bulk_unregister_supply_alias(struct device *dev,
devm_regulator_unregister_supply_alias(dev, id[i]); devm_regulator_unregister_supply_alias(dev, id[i]);
} }
EXPORT_SYMBOL_GPL(devm_regulator_bulk_unregister_supply_alias); EXPORT_SYMBOL_GPL(devm_regulator_bulk_unregister_supply_alias);
struct regulator_notifier_match {
struct regulator *regulator;
struct notifier_block *nb;
};
static int devm_regulator_match_notifier(struct device *dev, void *res,
void *data)
{
struct regulator_notifier_match *match = res;
struct regulator_notifier_match *target = data;
return match->regulator == target->regulator && match->nb == target->nb;
}
static void devm_regulator_destroy_notifier(struct device *dev, void *res)
{
struct regulator_notifier_match *match = res;
regulator_unregister_notifier(match->regulator, match->nb);
}
/**
* devm_regulator_register_notifier - Resource managed
* regulator_register_notifier
*
* @regulator: regulator source
* @nb: notifier block
*
* The notifier will be registers under the consumer device and be
* automatically be unregistered when the source device is unbound.
*/
int devm_regulator_register_notifier(struct regulator *regulator,
struct notifier_block *nb)
{
struct regulator_notifier_match *match;
int ret;
match = devres_alloc(devm_regulator_destroy_notifier,
sizeof(struct regulator_notifier_match),
GFP_KERNEL);
if (!match)
return -ENOMEM;
match->regulator = regulator;
match->nb = nb;
ret = regulator_register_notifier(regulator, nb);
if (ret < 0) {
devres_free(match);
return ret;
}
devres_add(regulator->dev, match);
return 0;
}
EXPORT_SYMBOL_GPL(devm_regulator_register_notifier);
/**
* devm_regulator_unregister_notifier - Resource managed
* regulator_unregister_notifier()
*
* @regulator: regulator source
* @nb: notifier block
*
* Unregister a notifier registered with devm_regulator_register_notifier().
* Normally this function will not need to be called and the resource
* management code will ensure that the resource is freed.
*/
void devm_regulator_unregister_notifier(struct regulator *regulator,
struct notifier_block *nb)
{
struct regulator_notifier_match match;
int rc;
match.regulator = regulator;
match.nb = nb;
rc = devres_release(regulator->dev, devm_regulator_destroy_notifier,
devm_regulator_match_notifier, &match);
if (rc != 0)
WARN_ON(rc);
}
EXPORT_SYMBOL_GPL(devm_regulator_unregister_notifier);
...@@ -916,6 +916,9 @@ static int palmas_ldo_registration(struct palmas_pmic *pmic, ...@@ -916,6 +916,9 @@ static int palmas_ldo_registration(struct palmas_pmic *pmic,
(id == PALMAS_REG_LDO6)) (id == PALMAS_REG_LDO6))
desc->enable_time = 2000; desc->enable_time = 2000;
} else { } else {
if (!ddata->has_regen3 && id == PALMAS_REG_REGEN3)
continue;
desc->n_voltages = 1; desc->n_voltages = 1;
if (reg_init && reg_init->roof_floor) if (reg_init && reg_init->roof_floor)
desc->ops = &palmas_ops_ext_control_extreg; desc->ops = &palmas_ops_ext_control_extreg;
...@@ -1398,6 +1401,7 @@ static struct palmas_pmic_driver_data palmas_ddata = { ...@@ -1398,6 +1401,7 @@ static struct palmas_pmic_driver_data palmas_ddata = {
.ldo_begin = PALMAS_REG_LDO1, .ldo_begin = PALMAS_REG_LDO1,
.ldo_end = PALMAS_REG_LDOUSB, .ldo_end = PALMAS_REG_LDOUSB,
.max_reg = PALMAS_NUM_REGS, .max_reg = PALMAS_NUM_REGS,
.has_regen3 = true,
.palmas_regs_info = palmas_generic_regs_info, .palmas_regs_info = palmas_generic_regs_info,
.palmas_matches = palmas_matches, .palmas_matches = palmas_matches,
.sleep_req_info = palma_sleep_req_info, .sleep_req_info = palma_sleep_req_info,
...@@ -1411,6 +1415,7 @@ static struct palmas_pmic_driver_data tps65917_ddata = { ...@@ -1411,6 +1415,7 @@ static struct palmas_pmic_driver_data tps65917_ddata = {
.ldo_begin = TPS65917_REG_LDO1, .ldo_begin = TPS65917_REG_LDO1,
.ldo_end = TPS65917_REG_LDO5, .ldo_end = TPS65917_REG_LDO5,
.max_reg = TPS65917_NUM_REGS, .max_reg = TPS65917_NUM_REGS,
.has_regen3 = true,
.palmas_regs_info = tps65917_regs_info, .palmas_regs_info = tps65917_regs_info,
.palmas_matches = tps65917_matches, .palmas_matches = tps65917_matches,
.sleep_req_info = tps65917_sleep_req_info, .sleep_req_info = tps65917_sleep_req_info,
...@@ -1505,7 +1510,7 @@ static void palmas_dt_to_pdata(struct device *dev, ...@@ -1505,7 +1510,7 @@ static void palmas_dt_to_pdata(struct device *dev,
pdata->ldo6_vibrator = of_property_read_bool(node, "ti,ldo6-vibrator"); pdata->ldo6_vibrator = of_property_read_bool(node, "ti,ldo6-vibrator");
} }
static struct of_device_id of_palmas_match_tbl[] = { static const struct of_device_id of_palmas_match_tbl[] = {
{ {
.compatible = "ti,palmas-pmic", .compatible = "ti,palmas-pmic",
.data = &palmas_ddata, .data = &palmas_ddata,
...@@ -1572,9 +1577,11 @@ static int palmas_regulators_probe(struct platform_device *pdev) ...@@ -1572,9 +1577,11 @@ static int palmas_regulators_probe(struct platform_device *pdev)
if (!pmic) if (!pmic)
return -ENOMEM; return -ENOMEM;
if (of_device_is_compatible(node, "ti,tps659038-pmic")) if (of_device_is_compatible(node, "ti,tps659038-pmic")) {
palmas_generic_regs_info[PALMAS_REG_REGEN2].ctrl_addr = palmas_generic_regs_info[PALMAS_REG_REGEN2].ctrl_addr =
TPS659038_REGEN2_CTRL; TPS659038_REGEN2_CTRL;
palmas_ddata.has_regen3 = false;
}
pmic->dev = &pdev->dev; pmic->dev = &pdev->dev;
pmic->palmas = palmas; pmic->palmas = palmas;
......
This diff is collapsed.
...@@ -56,6 +56,7 @@ static int stw481x_vmmc_regulator_probe(struct platform_device *pdev) ...@@ -56,6 +56,7 @@ static int stw481x_vmmc_regulator_probe(struct platform_device *pdev)
{ {
struct stw481x *stw481x = dev_get_platdata(&pdev->dev); struct stw481x *stw481x = dev_get_platdata(&pdev->dev);
struct regulator_config config = { }; struct regulator_config config = { };
struct regulator_dev *rdev;
int ret; int ret;
/* First disable the external VMMC if it's active */ /* First disable the external VMMC if it's active */
...@@ -75,12 +76,11 @@ static int stw481x_vmmc_regulator_probe(struct platform_device *pdev) ...@@ -75,12 +76,11 @@ static int stw481x_vmmc_regulator_probe(struct platform_device *pdev)
pdev->dev.of_node, pdev->dev.of_node,
&vmmc_regulator); &vmmc_regulator);
stw481x->vmmc_regulator = devm_regulator_register(&pdev->dev, rdev = devm_regulator_register(&pdev->dev, &vmmc_regulator, &config);
&vmmc_regulator, &config); if (IS_ERR(rdev)) {
if (IS_ERR(stw481x->vmmc_regulator)) {
dev_err(&pdev->dev, dev_err(&pdev->dev,
"error initializing STw481x VMMC regulator\n"); "error initializing STw481x VMMC regulator\n");
return PTR_ERR(stw481x->vmmc_regulator); return PTR_ERR(rdev);
} }
dev_info(&pdev->dev, "initialized STw481x VMMC regulator\n"); dev_info(&pdev->dev, "initialized STw481x VMMC regulator\n");
......
...@@ -4225,22 +4225,15 @@ static struct scsi_host_template ufshcd_driver_template = { ...@@ -4225,22 +4225,15 @@ static struct scsi_host_template ufshcd_driver_template = {
static int ufshcd_config_vreg_load(struct device *dev, struct ufs_vreg *vreg, static int ufshcd_config_vreg_load(struct device *dev, struct ufs_vreg *vreg,
int ua) int ua)
{ {
int ret = 0; int ret;
struct regulator *reg = vreg->reg;
const char *name = vreg->name;
BUG_ON(!vreg); if (!vreg)
return 0;
ret = regulator_set_optimum_mode(reg, ua); ret = regulator_set_load(vreg->reg, ua);
if (ret >= 0) { if (ret < 0) {
/* dev_err(dev, "%s: %s set load (ua=%d) failed, err=%d\n",
* regulator_set_optimum_mode() returns new regulator __func__, vreg->name, ua, ret);
* mode upon success.
*/
ret = 0;
} else {
dev_err(dev, "%s: %s set optimum mode(ua=%d) failed, err=%d\n",
__func__, name, ua, ret);
} }
return ret; return ret;
...@@ -4249,18 +4242,12 @@ static int ufshcd_config_vreg_load(struct device *dev, struct ufs_vreg *vreg, ...@@ -4249,18 +4242,12 @@ static int ufshcd_config_vreg_load(struct device *dev, struct ufs_vreg *vreg,
static inline int ufshcd_config_vreg_lpm(struct ufs_hba *hba, static inline int ufshcd_config_vreg_lpm(struct ufs_hba *hba,
struct ufs_vreg *vreg) struct ufs_vreg *vreg)
{ {
if (!vreg)
return 0;
return ufshcd_config_vreg_load(hba->dev, vreg, UFS_VREG_LPM_LOAD_UA); return ufshcd_config_vreg_load(hba->dev, vreg, UFS_VREG_LPM_LOAD_UA);
} }
static inline int ufshcd_config_vreg_hpm(struct ufs_hba *hba, static inline int ufshcd_config_vreg_hpm(struct ufs_hba *hba,
struct ufs_vreg *vreg) struct ufs_vreg *vreg)
{ {
if (!vreg)
return 0;
return ufshcd_config_vreg_load(hba->dev, vreg, vreg->max_uA); return ufshcd_config_vreg_load(hba->dev, vreg, vreg->max_uA);
} }
......
...@@ -277,7 +277,7 @@ static void ab8500_usb_regulator_enable(struct ab8500_usb *ab) ...@@ -277,7 +277,7 @@ static void ab8500_usb_regulator_enable(struct ab8500_usb *ab)
dev_err(ab->dev, "Failed to set the Vintcore to 1.3V, ret=%d\n", dev_err(ab->dev, "Failed to set the Vintcore to 1.3V, ret=%d\n",
ret); ret);
ret = regulator_set_optimum_mode(ab->v_ulpi, 28000); ret = regulator_set_load(ab->v_ulpi, 28000);
if (ret < 0) if (ret < 0)
dev_err(ab->dev, "Failed to set optimum mode (ret=%d)\n", dev_err(ab->dev, "Failed to set optimum mode (ret=%d)\n",
ret); ret);
...@@ -317,7 +317,7 @@ static void ab8500_usb_regulator_disable(struct ab8500_usb *ab) ...@@ -317,7 +317,7 @@ static void ab8500_usb_regulator_disable(struct ab8500_usb *ab)
ab->saved_v_ulpi, ret); ab->saved_v_ulpi, ret);
} }
ret = regulator_set_optimum_mode(ab->v_ulpi, 0); ret = regulator_set_load(ab->v_ulpi, 0);
if (ret < 0) if (ret < 0)
dev_err(ab->dev, "Failed to set optimum mode (ret=%d)\n", dev_err(ab->dev, "Failed to set optimum mode (ret=%d)\n",
ret); ret);
......
...@@ -142,27 +142,22 @@ static int msm_hsusb_ldo_set_mode(struct msm_otg *motg, int on) ...@@ -142,27 +142,22 @@ static int msm_hsusb_ldo_set_mode(struct msm_otg *motg, int on)
int ret = 0; int ret = 0;
if (on) { if (on) {
ret = regulator_set_optimum_mode(motg->v1p8, ret = regulator_set_load(motg->v1p8, USB_PHY_1P8_HPM_LOAD);
USB_PHY_1P8_HPM_LOAD);
if (ret < 0) { if (ret < 0) {
pr_err("Could not set HPM for v1p8\n"); pr_err("Could not set HPM for v1p8\n");
return ret; return ret;
} }
ret = regulator_set_optimum_mode(motg->v3p3, ret = regulator_set_load(motg->v3p3, USB_PHY_3P3_HPM_LOAD);
USB_PHY_3P3_HPM_LOAD);
if (ret < 0) { if (ret < 0) {
pr_err("Could not set HPM for v3p3\n"); pr_err("Could not set HPM for v3p3\n");
regulator_set_optimum_mode(motg->v1p8, regulator_set_load(motg->v1p8, USB_PHY_1P8_LPM_LOAD);
USB_PHY_1P8_LPM_LOAD);
return ret; return ret;
} }
} else { } else {
ret = regulator_set_optimum_mode(motg->v1p8, ret = regulator_set_load(motg->v1p8, USB_PHY_1P8_LPM_LOAD);
USB_PHY_1P8_LPM_LOAD);
if (ret < 0) if (ret < 0)
pr_err("Could not set LPM for v1p8\n"); pr_err("Could not set LPM for v1p8\n");
ret = regulator_set_optimum_mode(motg->v3p3, ret = regulator_set_load(motg->v3p3, USB_PHY_3P3_LPM_LOAD);
USB_PHY_3P3_LPM_LOAD);
if (ret < 0) if (ret < 0)
pr_err("Could not set LPM for v3p3\n"); pr_err("Could not set LPM for v3p3\n");
} }
......
...@@ -117,6 +117,7 @@ struct palmas_pmic_driver_data { ...@@ -117,6 +117,7 @@ struct palmas_pmic_driver_data {
int ldo_begin; int ldo_begin;
int ldo_end; int ldo_end;
int max_reg; int max_reg;
bool has_regen3;
struct palmas_regs_info *palmas_regs_info; struct palmas_regs_info *palmas_regs_info;
struct of_regulator_match *palmas_matches; struct of_regulator_match *palmas_matches;
struct palmas_sleep_requestor_info *sleep_req_info; struct palmas_sleep_requestor_info *sleep_req_info;
......
...@@ -41,15 +41,11 @@ ...@@ -41,15 +41,11 @@
/** /**
* struct stw481x - state holder for the Stw481x drivers * struct stw481x - state holder for the Stw481x drivers
* @mutex: mutex to serialize I2C accesses
* @i2c_client: corresponding I2C client * @i2c_client: corresponding I2C client
* @regulator: regulator device for regulator children
* @map: regmap handle to access device registers * @map: regmap handle to access device registers
*/ */
struct stw481x { struct stw481x {
struct mutex lock;
struct i2c_client *client; struct i2c_client *client;
struct regulator_dev *vmmc_regulator;
struct regmap *map; struct regmap *map;
}; };
......
...@@ -238,7 +238,7 @@ int regulator_get_current_limit(struct regulator *regulator); ...@@ -238,7 +238,7 @@ int regulator_get_current_limit(struct regulator *regulator);
int regulator_set_mode(struct regulator *regulator, unsigned int mode); int regulator_set_mode(struct regulator *regulator, unsigned int mode);
unsigned int regulator_get_mode(struct regulator *regulator); unsigned int regulator_get_mode(struct regulator *regulator);
int regulator_set_optimum_mode(struct regulator *regulator, int load_uA); int regulator_set_load(struct regulator *regulator, int load_uA);
int regulator_allow_bypass(struct regulator *regulator, bool allow); int regulator_allow_bypass(struct regulator *regulator, bool allow);
...@@ -252,8 +252,12 @@ int regulator_list_hardware_vsel(struct regulator *regulator, ...@@ -252,8 +252,12 @@ int regulator_list_hardware_vsel(struct regulator *regulator,
/* regulator notifier block */ /* regulator notifier block */
int regulator_register_notifier(struct regulator *regulator, int regulator_register_notifier(struct regulator *regulator,
struct notifier_block *nb); struct notifier_block *nb);
int devm_regulator_register_notifier(struct regulator *regulator,
struct notifier_block *nb);
int regulator_unregister_notifier(struct regulator *regulator, int regulator_unregister_notifier(struct regulator *regulator,
struct notifier_block *nb); struct notifier_block *nb);
void devm_regulator_unregister_notifier(struct regulator *regulator,
struct notifier_block *nb);
/* driver data - core doesn't touch */ /* driver data - core doesn't touch */
void *regulator_get_drvdata(struct regulator *regulator); void *regulator_get_drvdata(struct regulator *regulator);
...@@ -479,8 +483,7 @@ static inline unsigned int regulator_get_mode(struct regulator *regulator) ...@@ -479,8 +483,7 @@ static inline unsigned int regulator_get_mode(struct regulator *regulator)
return REGULATOR_MODE_NORMAL; return REGULATOR_MODE_NORMAL;
} }
static inline int regulator_set_optimum_mode(struct regulator *regulator, static inline int regulator_set_load(struct regulator *regulator, int load_uA)
int load_uA)
{ {
return REGULATOR_MODE_NORMAL; return REGULATOR_MODE_NORMAL;
} }
...@@ -515,12 +518,24 @@ static inline int regulator_register_notifier(struct regulator *regulator, ...@@ -515,12 +518,24 @@ static inline int regulator_register_notifier(struct regulator *regulator,
return 0; return 0;
} }
static inline int devm_regulator_register_notifier(struct regulator *regulator,
struct notifier_block *nb)
{
return 0;
}
static inline int regulator_unregister_notifier(struct regulator *regulator, static inline int regulator_unregister_notifier(struct regulator *regulator,
struct notifier_block *nb) struct notifier_block *nb)
{ {
return 0; return 0;
} }
static inline int devm_regulator_unregister_notifier(struct regulator *regulator,
struct notifier_block *nb)
{
return 0;
}
static inline void *regulator_get_drvdata(struct regulator *regulator) static inline void *regulator_get_drvdata(struct regulator *regulator)
{ {
return NULL; return NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment