diff options
Diffstat (limited to 'drivers/regulator')
| -rw-r--r-- | drivers/regulator/anatop-regulator.c | 11 | ||||
| -rw-r--r-- | drivers/regulator/core.c | 9 | ||||
| -rw-r--r-- | drivers/regulator/fixed-helper.c | 3 | ||||
| -rw-r--r-- | drivers/regulator/max8997.c | 2 | ||||
| -rw-r--r-- | drivers/regulator/mc13892-regulator.c | 10 | ||||
| -rw-r--r-- | drivers/regulator/s5m8767.c | 14 | ||||
| -rw-r--r-- | drivers/regulator/tps6586x-regulator.c | 5 | ||||
| -rw-r--r-- | drivers/regulator/wm831x-dcdc.c | 9 | ||||
| -rw-r--r-- | drivers/regulator/wm831x-isink.c | 2 | ||||
| -rw-r--r-- | drivers/regulator/wm831x-ldo.c | 7 | ||||
| -rw-r--r-- | drivers/regulator/wm8350-regulator.c | 34 | 
11 files changed, 57 insertions, 49 deletions
diff --git a/drivers/regulator/anatop-regulator.c b/drivers/regulator/anatop-regulator.c index 17499a55113..81fd606e47b 100644 --- a/drivers/regulator/anatop-regulator.c +++ b/drivers/regulator/anatop-regulator.c @@ -138,9 +138,10 @@ static int __devinit anatop_regulator_probe(struct platform_device *pdev)  	rdesc->type = REGULATOR_VOLTAGE;  	rdesc->owner = THIS_MODULE;  	sreg->mfd = anatopmfd; -	ret = of_property_read_u32(np, "reg", &sreg->control_reg); +	ret = of_property_read_u32(np, "anatop-reg-offset", +				   &sreg->control_reg);  	if (ret) { -		dev_err(dev, "no reg property set\n"); +		dev_err(dev, "no anatop-reg-offset property set\n");  		goto anatop_probe_end;  	}  	ret = of_property_read_u32(np, "anatop-vol-bit-width", @@ -213,7 +214,7 @@ static struct of_device_id __devinitdata of_anatop_regulator_match_tbl[] = {  	{ /* end */ }  }; -static struct platform_driver anatop_regulator = { +static struct platform_driver anatop_regulator_driver = {  	.driver = {  		.name	= "anatop_regulator",  		.owner  = THIS_MODULE, @@ -225,13 +226,13 @@ static struct platform_driver anatop_regulator = {  static int __init anatop_regulator_init(void)  { -	return platform_driver_register(&anatop_regulator); +	return platform_driver_register(&anatop_regulator_driver);  }  postcore_initcall(anatop_regulator_init);  static void __exit anatop_regulator_exit(void)  { -	platform_driver_unregister(&anatop_regulator); +	platform_driver_unregister(&anatop_regulator_driver);  }  module_exit(anatop_regulator_exit); diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index c056abd7562..046fb1bd861 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -1431,7 +1431,10 @@ void devm_regulator_put(struct regulator *regulator)  	rc = devres_destroy(regulator->dev, devm_regulator_release,  			    devm_regulator_match, regulator); -	WARN_ON(rc); +	if (rc == 0) +		regulator_put(regulator); +	else +		WARN_ON(rc);  }  EXPORT_SYMBOL_GPL(devm_regulator_put); @@ -2992,14 +2995,14 @@ void regulator_unregister(struct regulator_dev *rdev)  	if (rdev == NULL)  		return; +	if (rdev->supply) +		regulator_put(rdev->supply);  	mutex_lock(®ulator_list_mutex);  	debugfs_remove_recursive(rdev->debugfs);  	flush_work_sync(&rdev->disable_work.work);  	WARN_ON(rdev->open_count);  	unset_regulator_supplies(rdev);  	list_del(&rdev->list); -	if (rdev->supply) -		regulator_put(rdev->supply);  	kfree(rdev->constraints);  	device_unregister(&rdev->dev);  	mutex_unlock(®ulator_list_mutex); diff --git a/drivers/regulator/fixed-helper.c b/drivers/regulator/fixed-helper.c index 30d0a15b894..cacd33c9d04 100644 --- a/drivers/regulator/fixed-helper.c +++ b/drivers/regulator/fixed-helper.c @@ -18,7 +18,6 @@ static void regulator_fixed_release(struct device *dev)  /**   * regulator_register_fixed - register a no-op fixed regulator - * @name: supply name   * @id: platform device id   * @supplies: consumers for this regulator   * @num_supplies: number of consumers @@ -32,7 +31,7 @@ struct platform_device *regulator_register_fixed(int id,  	if (!data)  		return NULL; -	data->cfg.supply_name = "dummy"; +	data->cfg.supply_name = "fixed-dummy";  	data->cfg.microvolts = 0;  	data->cfg.gpio = -EINVAL;  	data->cfg.enabled_at_boot = 1; diff --git a/drivers/regulator/max8997.c b/drivers/regulator/max8997.c index 96579296f04..17a58c56eeb 100644 --- a/drivers/regulator/max8997.c +++ b/drivers/regulator/max8997.c @@ -684,7 +684,7 @@ static int max8997_set_voltage_buck(struct regulator_dev *rdev,  		}  		new_val++; -	} while (desc->min + desc->step + new_val <= desc->max); +	} while (desc->min + desc->step * new_val <= desc->max);  	new_idx = tmp_idx;  	new_val = tmp_val; diff --git a/drivers/regulator/mc13892-regulator.c b/drivers/regulator/mc13892-regulator.c index e8cfc99dd8f..845aa2263b8 100644 --- a/drivers/regulator/mc13892-regulator.c +++ b/drivers/regulator/mc13892-regulator.c @@ -552,7 +552,7 @@ static int __devinit mc13892_regulator_probe(struct platform_device *pdev)  	mc13xxx_lock(mc13892);  	ret = mc13xxx_reg_read(mc13892, MC13892_REVISION, &val);  	if (ret) -		goto err_free; +		goto err_unlock;  	/* enable switch auto mode */  	if ((val & 0x0000FFFF) == 0x45d0) { @@ -562,7 +562,7 @@ static int __devinit mc13892_regulator_probe(struct platform_device *pdev)  			MC13892_SWITCHERS4_SW1MODE_AUTO |  			MC13892_SWITCHERS4_SW2MODE_AUTO);  		if (ret) -			goto err_free; +			goto err_unlock;  		ret = mc13xxx_reg_rmw(mc13892, MC13892_SWITCHERS5,  			MC13892_SWITCHERS5_SW3MODE_M | @@ -570,7 +570,7 @@ static int __devinit mc13892_regulator_probe(struct platform_device *pdev)  			MC13892_SWITCHERS5_SW3MODE_AUTO |  			MC13892_SWITCHERS5_SW4MODE_AUTO);  		if (ret) -			goto err_free; +			goto err_unlock;  	}  	mc13xxx_unlock(mc13892); @@ -612,10 +612,10 @@ static int __devinit mc13892_regulator_probe(struct platform_device *pdev)  err:  	while (--i >= 0)  		regulator_unregister(priv->regulators[i]); +	return ret; -err_free: +err_unlock:  	mc13xxx_unlock(mc13892); -  	return ret;  } diff --git a/drivers/regulator/s5m8767.c b/drivers/regulator/s5m8767.c index 58447db15de..4ca2db05900 100644 --- a/drivers/regulator/s5m8767.c +++ b/drivers/regulator/s5m8767.c @@ -311,8 +311,7 @@ static int s5m8767_set_voltage(struct regulator_dev *rdev,  	struct s5m8767_info *s5m8767 = rdev_get_drvdata(rdev);  	const struct s5m_voltage_desc *desc;  	int reg_id = rdev_get_id(rdev); -	int reg, mask, ret; -	int i; +	int sel, reg, mask, ret;  	u8 val;  	switch (reg_id) { @@ -333,19 +332,20 @@ static int s5m8767_set_voltage(struct regulator_dev *rdev,  	desc = reg_voltage_map[reg_id]; -	i = s5m8767_convert_voltage_to_sel(desc, min_uV, max_uV); -	if (i < 0) -		return i; +	sel = s5m8767_convert_voltage_to_sel(desc, min_uV, max_uV); +	if (sel < 0) +		return sel;  	ret = s5m8767_get_voltage_register(rdev, ®);  	if (ret)  		return ret;  	s5m_reg_read(s5m8767->iodev, reg, &val); -	val = val & mask; +	val &= ~mask; +	val |= sel;  	ret = s5m_reg_write(s5m8767->iodev, reg, val); -	*selector = i; +	*selector = sel;  	return ret;  } diff --git a/drivers/regulator/tps6586x-regulator.c b/drivers/regulator/tps6586x-regulator.c index 29b615ce3af..cfc1f16f777 100644 --- a/drivers/regulator/tps6586x-regulator.c +++ b/drivers/regulator/tps6586x-regulator.c @@ -79,6 +79,11 @@ static int tps6586x_ldo_list_voltage(struct regulator_dev *rdev,  				     unsigned selector)  {  	struct tps6586x_regulator *info = rdev_get_drvdata(rdev); +	int rid = rdev_get_id(rdev); + +	/* LDO0 has minimal voltage 1.2V rather than 1.25V */ +	if ((rid == TPS6586X_ID_LDO_0) && (selector == 0)) +		return (info->voltages[0] - 50) * 1000;  	return info->voltages[selector] * 1000;  } diff --git a/drivers/regulator/wm831x-dcdc.c b/drivers/regulator/wm831x-dcdc.c index 4904a40b0d4..ff810e787ea 100644 --- a/drivers/regulator/wm831x-dcdc.c +++ b/drivers/regulator/wm831x-dcdc.c @@ -380,13 +380,15 @@ static int wm831x_buckv_set_current_limit(struct regulator_dev *rdev,  	int i;  	for (i = 0; i < ARRAY_SIZE(wm831x_dcdc_ilim); i++) { -		if (max_uA <= wm831x_dcdc_ilim[i]) +		if ((min_uA <= wm831x_dcdc_ilim[i]) && +		    (wm831x_dcdc_ilim[i] <= max_uA))  			break;  	}  	if (i == ARRAY_SIZE(wm831x_dcdc_ilim))  		return -EINVAL; -	return wm831x_set_bits(wm831x, reg, WM831X_DC1_HC_THR_MASK, i); +	return wm831x_set_bits(wm831x, reg, WM831X_DC1_HC_THR_MASK, +			       i << WM831X_DC1_HC_THR_SHIFT);  }  static int wm831x_buckv_get_current_limit(struct regulator_dev *rdev) @@ -400,7 +402,8 @@ static int wm831x_buckv_get_current_limit(struct regulator_dev *rdev)  	if (val < 0)  		return val; -	return wm831x_dcdc_ilim[val & WM831X_DC1_HC_THR_MASK]; +	val = (val & WM831X_DC1_HC_THR_MASK) >> WM831X_DC1_HC_THR_SHIFT; +	return wm831x_dcdc_ilim[val];  }  static struct regulator_ops wm831x_buckv_ops = { diff --git a/drivers/regulator/wm831x-isink.c b/drivers/regulator/wm831x-isink.c index 634aac3f2d5..b414e09c562 100644 --- a/drivers/regulator/wm831x-isink.c +++ b/drivers/regulator/wm831x-isink.c @@ -101,7 +101,7 @@ static int wm831x_isink_set_current(struct regulator_dev *rdev,  	for (i = 0; i < ARRAY_SIZE(wm831x_isinkv_values); i++) {  		int val = wm831x_isinkv_values[i]; -		if (min_uA >= val && val <= max_uA) { +		if (min_uA <= val && val <= max_uA) {  			ret = wm831x_set_bits(wm831x, isink->reg,  					      WM831X_CS1_ISEL_MASK, i);  			return ret; diff --git a/drivers/regulator/wm831x-ldo.c b/drivers/regulator/wm831x-ldo.c index f1e4ab0f9fd..641e9f6499d 100644 --- a/drivers/regulator/wm831x-ldo.c +++ b/drivers/regulator/wm831x-ldo.c @@ -506,22 +506,19 @@ static int wm831x_aldo_set_mode(struct regulator_dev *rdev,  {  	struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);  	struct wm831x *wm831x = ldo->wm831x; -	int ctrl_reg = ldo->base + WM831X_LDO_CONTROL;  	int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;  	int ret;  	switch (mode) {  	case REGULATOR_MODE_NORMAL: -		ret = wm831x_set_bits(wm831x, on_reg, -				      WM831X_LDO7_ON_MODE, 0); +		ret = wm831x_set_bits(wm831x, on_reg, WM831X_LDO7_ON_MODE, 0);  		if (ret < 0)  			return ret;  		break;  	case REGULATOR_MODE_IDLE: -		ret = wm831x_set_bits(wm831x, ctrl_reg, -				      WM831X_LDO7_ON_MODE, +		ret = wm831x_set_bits(wm831x, on_reg, WM831X_LDO7_ON_MODE,  				      WM831X_LDO7_ON_MODE);  		if (ret < 0)  			return ret; diff --git a/drivers/regulator/wm8350-regulator.c b/drivers/regulator/wm8350-regulator.c index ab1e183a74b..05ecfb87231 100644 --- a/drivers/regulator/wm8350-regulator.c +++ b/drivers/regulator/wm8350-regulator.c @@ -99,7 +99,7 @@ static int get_isink_val(int min_uA, int max_uA, u16 *setting)  {  	int i; -	for (i = ARRAY_SIZE(isink_cur) - 1; i >= 0; i--) { +	for (i = 0; i < ARRAY_SIZE(isink_cur); i++) {  		if (min_uA <= isink_cur[i] && max_uA >= isink_cur[i]) {  			*setting = i;  			return 0; @@ -186,7 +186,7 @@ static int wm8350_isink_get_current(struct regulator_dev *rdev)  		return 0;  	} -	return DIV_ROUND_CLOSEST(isink_cur[val], 100); +	return isink_cur[val];  }  /* turn on ISINK followed by DCDC */ @@ -495,25 +495,25 @@ static int wm8350_dcdc_set_suspend_enable(struct regulator_dev *rdev)  		val = wm8350_reg_read(wm8350, WM8350_DCDC1_LOW_POWER)  			& ~WM8350_DCDC_HIB_MODE_MASK;  		wm8350_reg_write(wm8350, WM8350_DCDC1_LOW_POWER, -			wm8350->pmic.dcdc1_hib_mode); +			val | wm8350->pmic.dcdc1_hib_mode);  		break;  	case WM8350_DCDC_3:  		val = wm8350_reg_read(wm8350, WM8350_DCDC3_LOW_POWER)  			& ~WM8350_DCDC_HIB_MODE_MASK;  		wm8350_reg_write(wm8350, WM8350_DCDC3_LOW_POWER, -			wm8350->pmic.dcdc3_hib_mode); +			val | wm8350->pmic.dcdc3_hib_mode);  		break;  	case WM8350_DCDC_4:  		val = wm8350_reg_read(wm8350, WM8350_DCDC4_LOW_POWER)  			& ~WM8350_DCDC_HIB_MODE_MASK;  		wm8350_reg_write(wm8350, WM8350_DCDC4_LOW_POWER, -			wm8350->pmic.dcdc4_hib_mode); +			val | wm8350->pmic.dcdc4_hib_mode);  		break;  	case WM8350_DCDC_6:  		val = wm8350_reg_read(wm8350, WM8350_DCDC6_LOW_POWER)  			& ~WM8350_DCDC_HIB_MODE_MASK;  		wm8350_reg_write(wm8350, WM8350_DCDC6_LOW_POWER, -			wm8350->pmic.dcdc6_hib_mode); +			val | wm8350->pmic.dcdc6_hib_mode);  		break;  	case WM8350_DCDC_2:  	case WM8350_DCDC_5: @@ -535,25 +535,25 @@ static int wm8350_dcdc_set_suspend_disable(struct regulator_dev *rdev)  		val = wm8350_reg_read(wm8350, WM8350_DCDC1_LOW_POWER);  		wm8350->pmic.dcdc1_hib_mode = val & WM8350_DCDC_HIB_MODE_MASK;  		wm8350_reg_write(wm8350, WM8350_DCDC1_LOW_POWER, -			WM8350_DCDC_HIB_MODE_DIS); +				 val | WM8350_DCDC_HIB_MODE_DIS);  		break;  	case WM8350_DCDC_3:  		val = wm8350_reg_read(wm8350, WM8350_DCDC3_LOW_POWER);  		wm8350->pmic.dcdc3_hib_mode = val & WM8350_DCDC_HIB_MODE_MASK;  		wm8350_reg_write(wm8350, WM8350_DCDC3_LOW_POWER, -			WM8350_DCDC_HIB_MODE_DIS); +				 val | WM8350_DCDC_HIB_MODE_DIS);  		break;  	case WM8350_DCDC_4:  		val = wm8350_reg_read(wm8350, WM8350_DCDC4_LOW_POWER);  		wm8350->pmic.dcdc4_hib_mode = val & WM8350_DCDC_HIB_MODE_MASK;  		wm8350_reg_write(wm8350, WM8350_DCDC4_LOW_POWER, -			WM8350_DCDC_HIB_MODE_DIS); +				 val | WM8350_DCDC_HIB_MODE_DIS);  		break;  	case WM8350_DCDC_6:  		val = wm8350_reg_read(wm8350, WM8350_DCDC6_LOW_POWER);  		wm8350->pmic.dcdc6_hib_mode = val & WM8350_DCDC_HIB_MODE_MASK;  		wm8350_reg_write(wm8350, WM8350_DCDC6_LOW_POWER, -			WM8350_DCDC_HIB_MODE_DIS); +				 val | WM8350_DCDC_HIB_MODE_DIS);  		break;  	case WM8350_DCDC_2:  	case WM8350_DCDC_5: @@ -575,13 +575,13 @@ static int wm8350_dcdc25_set_suspend_enable(struct regulator_dev *rdev)  		val = wm8350_reg_read(wm8350, WM8350_DCDC2_CONTROL)  		    & ~WM8350_DC2_HIB_MODE_MASK;  		wm8350_reg_write(wm8350, WM8350_DCDC2_CONTROL, val | -				 WM8350_DC2_HIB_MODE_ACTIVE); +		    (WM8350_DC2_HIB_MODE_ACTIVE << WM8350_DC2_HIB_MODE_SHIFT));  		break;  	case WM8350_DCDC_5:  		val = wm8350_reg_read(wm8350, WM8350_DCDC5_CONTROL) -		    & ~WM8350_DC2_HIB_MODE_MASK; +		    & ~WM8350_DC5_HIB_MODE_MASK;  		wm8350_reg_write(wm8350, WM8350_DCDC5_CONTROL, val | -				 WM8350_DC5_HIB_MODE_ACTIVE); +		    (WM8350_DC5_HIB_MODE_ACTIVE << WM8350_DC5_HIB_MODE_SHIFT));  		break;  	default:  		return -EINVAL; @@ -600,13 +600,13 @@ static int wm8350_dcdc25_set_suspend_disable(struct regulator_dev *rdev)  		val = wm8350_reg_read(wm8350, WM8350_DCDC2_CONTROL)  		    & ~WM8350_DC2_HIB_MODE_MASK;  		wm8350_reg_write(wm8350, WM8350_DCDC2_CONTROL, val | -				 WM8350_DC2_HIB_MODE_DISABLE); +		    (WM8350_DC2_HIB_MODE_DISABLE << WM8350_DC2_HIB_MODE_SHIFT));  		break;  	case WM8350_DCDC_5:  		val = wm8350_reg_read(wm8350, WM8350_DCDC5_CONTROL) -		    & ~WM8350_DC2_HIB_MODE_MASK; +		    & ~WM8350_DC5_HIB_MODE_MASK;  		wm8350_reg_write(wm8350, WM8350_DCDC5_CONTROL, val | -				 WM8350_DC2_HIB_MODE_DISABLE); +		    (WM8350_DC5_HIB_MODE_DISABLE << WM8350_DC5_HIB_MODE_SHIFT));  		break;  	default:  		return -EINVAL; @@ -749,7 +749,7 @@ static int wm8350_ldo_set_suspend_disable(struct regulator_dev *rdev)  	/* all LDOs have same mV bits */  	val = wm8350_reg_read(wm8350, volt_reg) & ~WM8350_LDO1_HIB_MODE_MASK; -	wm8350_reg_write(wm8350, volt_reg, WM8350_LDO1_HIB_MODE_DIS); +	wm8350_reg_write(wm8350, volt_reg, val | WM8350_LDO1_HIB_MODE_DIS);  	return 0;  }  |