diff options
Diffstat (limited to 'drivers/regulator/max8998.c')
| -rw-r--r-- | drivers/regulator/max8998.c | 122 | 
1 files changed, 69 insertions, 53 deletions
diff --git a/drivers/regulator/max8998.c b/drivers/regulator/max8998.c index 5890265eeac..18bb58b9b96 100644 --- a/drivers/regulator/max8998.c +++ b/drivers/regulator/max8998.c @@ -28,7 +28,6 @@  #include <linux/slab.h>  #include <linux/interrupt.h>  #include <linux/mutex.h> -#include <linux/delay.h>  #include <linux/platform_device.h>  #include <linux/regulator/driver.h>  #include <linux/mfd/max8998.h> @@ -277,7 +276,7 @@ static int max8998_get_voltage_register(struct regulator_dev *rdev,  	return 0;  } -static int max8998_get_voltage(struct regulator_dev *rdev) +static int max8998_get_voltage_sel(struct regulator_dev *rdev)  {  	struct max8998_data *max8998 = rdev_get_drvdata(rdev);  	struct i2c_client *i2c = max8998->iodev->i2c; @@ -295,7 +294,7 @@ static int max8998_get_voltage(struct regulator_dev *rdev)  	val >>= shift;  	val &= mask; -	return max8998_list_voltage(rdev, val); +	return val;  }  static int max8998_set_voltage_ldo(struct regulator_dev *rdev, @@ -306,8 +305,7 @@ static int max8998_set_voltage_ldo(struct regulator_dev *rdev,  	int min_vol = min_uV / 1000, max_vol = max_uV / 1000;  	const struct voltage_map_desc *desc;  	int ldo = rdev_get_id(rdev); -	int reg, shift = 0, mask, ret; -	int i = 0; +	int reg, shift = 0, mask, ret, i;  	if (ldo >= ARRAY_SIZE(ldo_voltage_map))  		return -EINVAL; @@ -319,9 +317,10 @@ static int max8998_set_voltage_ldo(struct regulator_dev *rdev,  	if (max_vol < desc->min || min_vol > desc->max)  		return -EINVAL; -	while (desc->min + desc->step*i < min_vol && -	       desc->min + desc->step*i < desc->max) -		i++; +	if (min_vol < desc->min) +		min_vol = desc->min; + +	i = DIV_ROUND_UP(min_vol - desc->min, desc->step);  	if (desc->min + desc->step*i > max_vol)  		return -EINVAL; @@ -359,8 +358,7 @@ static int max8998_set_voltage_buck(struct regulator_dev *rdev,  	const struct voltage_map_desc *desc;  	int buck = rdev_get_id(rdev);  	int reg, shift = 0, mask, ret; -	int difference = 0, i = 0, j = 0, previous_vol = 0; -	u8 val = 0; +	int i, j, previous_sel;  	static u8 buck1_last_val;  	if (buck >= ARRAY_SIZE(ldo_voltage_map)) @@ -374,9 +372,10 @@ static int max8998_set_voltage_buck(struct regulator_dev *rdev,  	if (max_vol < desc->min || min_vol > desc->max)  		return -EINVAL; -	while (desc->min + desc->step*i < min_vol && -	       desc->min + desc->step*i < desc->max) -		i++; +	if (min_vol < desc->min) +		min_vol = desc->min; + +	i = DIV_ROUND_UP(min_vol - desc->min, desc->step);  	if (desc->min + desc->step*i > max_vol)  		return -EINVAL; @@ -387,13 +386,14 @@ static int max8998_set_voltage_buck(struct regulator_dev *rdev,  	if (ret)  		return ret; -	previous_vol = max8998_get_voltage(rdev); +	previous_sel = max8998_get_voltage_sel(rdev);  	/* Check if voltage needs to be changed */  	/* if previous_voltage equal new voltage, return */ -	if (previous_vol == max8998_list_voltage(rdev, i)) { +	if (previous_sel == i) {  		dev_dbg(max8998->dev, "No voltage change, old:%d, new:%d\n", -			previous_vol, max8998_list_voltage(rdev, i)); +			max8998_list_voltage(rdev, previous_sel), +			max8998_list_voltage(rdev, i));  		return ret;  	} @@ -482,19 +482,40 @@ buck2_exit:  		break;  	} +	return ret; +} + +static int max8998_set_voltage_buck_time_sel(struct regulator_dev *rdev, +					     unsigned int old_selector, +					     unsigned int new_selector) +{ +	struct max8998_data *max8998 = rdev_get_drvdata(rdev); +	struct i2c_client *i2c = max8998->iodev->i2c; +	const struct voltage_map_desc *desc; +	int buck = rdev_get_id(rdev); +	u8 val = 0; +	int difference, ret; + +	if (buck < MAX8998_BUCK1 || buck > MAX8998_BUCK4) +		return -EINVAL; + +	desc = ldo_voltage_map[buck]; +  	/* Voltage stabilization */ -	max8998_read_reg(i2c, MAX8998_REG_ONOFF4, &val); +	ret = max8998_read_reg(i2c, MAX8998_REG_ONOFF4, &val); +	if (ret) +		return ret;  	/* lp3974 hasn't got ENRAMP bit - ramp is assumed as true */  	/* MAX8998 has ENRAMP bit implemented, so test it*/  	if (max8998->iodev->type == TYPE_MAX8998 && !(val & MAX8998_ENRAMP)) -		return ret; +		return 0; -	difference = desc->min + desc->step*i - previous_vol/1000; +	difference = (new_selector - old_selector) * desc->step;  	if (difference > 0) -		udelay(difference / ((val & 0x0f) + 1)); +		return difference / ((val & 0x0f) + 1); -	return ret; +	return 0;  }  static struct regulator_ops max8998_ldo_ops = { @@ -502,7 +523,7 @@ static struct regulator_ops max8998_ldo_ops = {  	.is_enabled		= max8998_ldo_is_enabled,  	.enable			= max8998_ldo_enable,  	.disable		= max8998_ldo_disable, -	.get_voltage		= max8998_get_voltage, +	.get_voltage_sel	= max8998_get_voltage_sel,  	.set_voltage		= max8998_set_voltage_ldo,  	.set_suspend_enable	= max8998_ldo_enable,  	.set_suspend_disable	= max8998_ldo_disable, @@ -513,8 +534,9 @@ static struct regulator_ops max8998_buck_ops = {  	.is_enabled		= max8998_ldo_is_enabled,  	.enable			= max8998_ldo_enable,  	.disable		= max8998_ldo_disable, -	.get_voltage		= max8998_get_voltage, +	.get_voltage_sel	= max8998_get_voltage_sel,  	.set_voltage		= max8998_set_voltage_buck, +	.set_voltage_time_sel	= max8998_set_voltage_buck_time_sel,  	.set_suspend_enable	= max8998_ldo_enable,  	.set_suspend_disable	= max8998_ldo_disable,  }; @@ -685,6 +707,7 @@ static __devinit int max8998_pmic_probe(struct platform_device *pdev)  {  	struct max8998_dev *iodev = dev_get_drvdata(pdev->dev.parent);  	struct max8998_platform_data *pdata = dev_get_platdata(iodev->dev); +	struct regulator_config config = { };  	struct regulator_dev **rdev;  	struct max8998_data *max8998;  	struct i2c_client *i2c; @@ -695,16 +718,15 @@ static __devinit int max8998_pmic_probe(struct platform_device *pdev)  		return -ENODEV;  	} -	max8998 = kzalloc(sizeof(struct max8998_data), GFP_KERNEL); +	max8998 = devm_kzalloc(&pdev->dev, sizeof(struct max8998_data), +			       GFP_KERNEL);  	if (!max8998)  		return -ENOMEM;  	size = sizeof(struct regulator_dev *) * pdata->num_regulators; -	max8998->rdev = kzalloc(size, GFP_KERNEL); -	if (!max8998->rdev) { -		kfree(max8998); +	max8998->rdev = devm_kzalloc(&pdev->dev, size, GFP_KERNEL); +	if (!max8998->rdev)  		return -ENOMEM; -	}  	rdev = max8998->rdev;  	max8998->dev = &pdev->dev; @@ -728,14 +750,14 @@ static __devinit int max8998_pmic_probe(struct platform_device *pdev)  			printk(KERN_ERR "MAX8998 SET1 GPIO defined as 0 !\n");  			WARN_ON(!pdata->buck1_set1);  			ret = -EIO; -			goto err_free_mem; +			goto err_out;  		}  		/* Check if SET2 is not equal to 0 */  		if (!pdata->buck1_set2) {  			printk(KERN_ERR "MAX8998 SET2 GPIO defined as 0 !\n");  			WARN_ON(!pdata->buck1_set2);  			ret = -EIO; -			goto err_free_mem; +			goto err_out;  		}  		gpio_request(pdata->buck1_set1, "MAX8998 BUCK1_SET1"); @@ -755,7 +777,7 @@ static __devinit int max8998_pmic_probe(struct platform_device *pdev)  		max8998->buck1_vol[0] = i;  		ret = max8998_write_reg(i2c, MAX8998_REG_BUCK1_VOLTAGE1, i);  		if (ret) -			goto err_free_mem; +			goto err_out;  		/* Set predefined value for BUCK1 register 2 */  		i = 0; @@ -767,7 +789,7 @@ static __devinit int max8998_pmic_probe(struct platform_device *pdev)  		max8998->buck1_vol[1] = i;  		ret = max8998_write_reg(i2c, MAX8998_REG_BUCK1_VOLTAGE2, i);  		if (ret) -			goto err_free_mem; +			goto err_out;  		/* Set predefined value for BUCK1 register 3 */  		i = 0; @@ -779,7 +801,7 @@ static __devinit int max8998_pmic_probe(struct platform_device *pdev)  		max8998->buck1_vol[2] = i;  		ret = max8998_write_reg(i2c, MAX8998_REG_BUCK1_VOLTAGE3, i);  		if (ret) -			goto err_free_mem; +			goto err_out;  		/* Set predefined value for BUCK1 register 4 */  		i = 0; @@ -791,7 +813,7 @@ static __devinit int max8998_pmic_probe(struct platform_device *pdev)  		max8998->buck1_vol[3] = i;  		ret = max8998_write_reg(i2c, MAX8998_REG_BUCK1_VOLTAGE4, i);  		if (ret) -			goto err_free_mem; +			goto err_out;  	} @@ -801,7 +823,7 @@ static __devinit int max8998_pmic_probe(struct platform_device *pdev)  			printk(KERN_ERR "MAX8998 SET3 GPIO defined as 0 !\n");  			WARN_ON(!pdata->buck2_set3);  			ret = -EIO; -			goto err_free_mem; +			goto err_out;  		}  		gpio_request(pdata->buck2_set3, "MAX8998 BUCK2_SET3");  		gpio_direction_output(pdata->buck2_set3, @@ -816,7 +838,7 @@ static __devinit int max8998_pmic_probe(struct platform_device *pdev)  		max8998->buck2_vol[0] = i;  		ret = max8998_write_reg(i2c, MAX8998_REG_BUCK2_VOLTAGE1, i);  		if (ret) -			goto err_free_mem; +			goto err_out;  		/* BUCK2 register 2 */  		i = 0; @@ -827,7 +849,7 @@ static __devinit int max8998_pmic_probe(struct platform_device *pdev)  		max8998->buck2_vol[1] = i;  		ret = max8998_write_reg(i2c, MAX8998_REG_BUCK2_VOLTAGE2, i);  		if (ret) -			goto err_free_mem; +			goto err_out;  	}  	for (i = 0; i < pdata->num_regulators; i++) { @@ -840,8 +862,12 @@ static __devinit int max8998_pmic_probe(struct platform_device *pdev)  			int count = (desc->max - desc->min) / desc->step + 1;  			regulators[index].n_voltages = count;  		} -		rdev[i] = regulator_register(®ulators[index], max8998->dev, -				pdata->regulators[i].initdata, max8998, NULL); + +		config.dev = max8998->dev; +		config.init_data = pdata->regulators[i].initdata; +		config.driver_data = max8998; + +		rdev[i] = regulator_register(®ulators[index], &config);  		if (IS_ERR(rdev[i])) {  			ret = PTR_ERR(rdev[i]);  			dev_err(max8998->dev, "regulator init failed\n"); @@ -853,14 +879,9 @@ static __devinit int max8998_pmic_probe(struct platform_device *pdev)  	return 0;  err: -	for (i = 0; i < max8998->num_regulators; i++) -		if (rdev[i]) -			regulator_unregister(rdev[i]); - -err_free_mem: -	kfree(max8998->rdev); -	kfree(max8998); - +	while (--i >= 0) +		regulator_unregister(rdev[i]); +err_out:  	return ret;  } @@ -871,12 +892,7 @@ static int __devexit max8998_pmic_remove(struct platform_device *pdev)  	int i;  	for (i = 0; i < max8998->num_regulators; i++) -		if (rdev[i]) -			regulator_unregister(rdev[i]); - -	kfree(max8998->rdev); -	kfree(max8998); - +		regulator_unregister(rdev[i]);  	return 0;  }  |