diff options
Diffstat (limited to 'drivers/regulator/twl-regulator.c')
| -rw-r--r-- | drivers/regulator/twl-regulator.c | 92 | 
1 files changed, 31 insertions, 61 deletions
diff --git a/drivers/regulator/twl-regulator.c b/drivers/regulator/twl-regulator.c index c7390711d95..242fe90dc56 100644 --- a/drivers/regulator/twl-regulator.c +++ b/drivers/regulator/twl-regulator.c @@ -43,9 +43,6 @@ struct twlreg_info {  	u8			table_len;  	const u16		*table; -	/* regulator specific turn-on delay */ -	u16			delay; -  	/* State REMAP default configuration */  	u8			remap; @@ -223,20 +220,6 @@ static int twl6030reg_enable(struct regulator_dev *rdev)  	return ret;  } -static int twl4030reg_enable_time(struct regulator_dev *rdev) -{ -	struct twlreg_info	*info = rdev_get_drvdata(rdev); - -	return info->delay; -} - -static int twl6030reg_enable_time(struct regulator_dev *rdev) -{ -	struct twlreg_info	*info = rdev_get_drvdata(rdev); - -	return info->delay; -} -  static int twl4030reg_disable(struct regulator_dev *rdev)  {  	struct twlreg_info	*info = rdev_get_drvdata(rdev); @@ -508,7 +491,6 @@ static struct regulator_ops twl4030ldo_ops = {  	.enable		= twl4030reg_enable,  	.disable	= twl4030reg_disable,  	.is_enabled	= twl4030reg_is_enabled, -	.enable_time	= twl4030reg_enable_time,  	.set_mode	= twl4030reg_set_mode, @@ -577,59 +559,53 @@ static struct regulator_ops twl6030coresmps_ops = {  	.get_voltage	= twl6030coresmps_get_voltage,  }; -static int twl6030ldo_list_voltage(struct regulator_dev *rdev, unsigned index) +static int twl6030ldo_list_voltage(struct regulator_dev *rdev, unsigned sel)  { -	struct twlreg_info	*info = rdev_get_drvdata(rdev); +	struct twlreg_info *info = rdev_get_drvdata(rdev); -	return ((info->min_mV + (index * 100)) * 1000); +	switch (sel) { +	case 0: +		return 0; +	case 1 ... 24: +		/* Linear mapping from 00000001 to 00011000: +		 * Absolute voltage value = 1.0 V + 0.1 V × (sel – 00000001) +		 */ +		return (info->min_mV + 100 * (sel - 1)) * 1000; +	case 25 ... 30: +		return -EINVAL; +	case 31: +		return 2750000; +	default: +		return -EINVAL; +	}  }  static int -twl6030ldo_set_voltage(struct regulator_dev *rdev, int min_uV, int max_uV, -		       unsigned *selector) +twl6030ldo_set_voltage_sel(struct regulator_dev *rdev, unsigned selector)  {  	struct twlreg_info	*info = rdev_get_drvdata(rdev); -	int			vsel; - -	if ((min_uV/1000 < info->min_mV) || (max_uV/1000 > info->max_mV)) -		return -EDOM; - -	/* -	 * Use the below formula to calculate vsel -	 * mV = 1000mv + 100mv * (vsel - 1) -	 */ -	vsel = (min_uV/1000 - 1000)/100 + 1; -	*selector = vsel; -	return twlreg_write(info, TWL_MODULE_PM_RECEIVER, VREG_VOLTAGE, vsel); +	return twlreg_write(info, TWL_MODULE_PM_RECEIVER, VREG_VOLTAGE, +			    selector);  } -static int twl6030ldo_get_voltage(struct regulator_dev *rdev) +static int twl6030ldo_get_voltage_sel(struct regulator_dev *rdev)  {  	struct twlreg_info	*info = rdev_get_drvdata(rdev); -	int		vsel = twlreg_read(info, TWL_MODULE_PM_RECEIVER, -								VREG_VOLTAGE); - -	if (vsel < 0) -		return vsel; +	int vsel = twlreg_read(info, TWL_MODULE_PM_RECEIVER, VREG_VOLTAGE); -	/* -	 * Use the below formula to calculate vsel -	 * mV = 1000mv + 100mv * (vsel - 1) -	 */ -	return (1000 + (100 * (vsel - 1))) * 1000; +	return vsel;  }  static struct regulator_ops twl6030ldo_ops = {  	.list_voltage	= twl6030ldo_list_voltage, -	.set_voltage	= twl6030ldo_set_voltage, -	.get_voltage	= twl6030ldo_get_voltage, +	.set_voltage_sel = twl6030ldo_set_voltage_sel, +	.get_voltage_sel = twl6030ldo_get_voltage_sel,  	.enable		= twl6030reg_enable,  	.disable	= twl6030reg_disable,  	.is_enabled	= twl6030reg_is_enabled, -	.enable_time	= twl6030reg_enable_time,  	.set_mode	= twl6030reg_set_mode, @@ -663,7 +639,6 @@ static struct regulator_ops twl4030fixed_ops = {  	.enable		= twl4030reg_enable,  	.disable	= twl4030reg_disable,  	.is_enabled	= twl4030reg_is_enabled, -	.enable_time	= twl4030reg_enable_time,  	.set_mode	= twl4030reg_set_mode, @@ -678,7 +653,6 @@ static struct regulator_ops twl6030fixed_ops = {  	.enable		= twl6030reg_enable,  	.disable	= twl6030reg_disable,  	.is_enabled	= twl6030reg_is_enabled, -	.enable_time	= twl6030reg_enable_time,  	.set_mode	= twl6030reg_set_mode, @@ -689,7 +663,6 @@ static struct regulator_ops twl6030_fixed_resource = {  	.enable		= twl6030reg_enable,  	.disable	= twl6030reg_disable,  	.is_enabled	= twl6030reg_is_enabled, -	.enable_time	= twl6030reg_enable_time,  	.get_status	= twl6030reg_get_status,  }; @@ -886,7 +859,6 @@ static struct regulator_ops twlsmps_ops = {  	.enable			= twl6030reg_enable,  	.disable		= twl6030reg_disable,  	.is_enabled		= twl6030reg_is_enabled, -	.enable_time		= twl6030reg_enable_time,  	.set_mode		= twl6030reg_set_mode, @@ -909,7 +881,6 @@ static struct twlreg_info TWL4030_INFO_##label = { \  	.id = num, \  	.table_len = ARRAY_SIZE(label##_VSEL_table), \  	.table = label##_VSEL_table, \ -	.delay = turnon_delay, \  	.remap = remap_conf, \  	.desc = { \  		.name = #label, \ @@ -918,6 +889,7 @@ static struct twlreg_info TWL4030_INFO_##label = { \  		.ops = &twl4030ldo_ops, \  		.type = REGULATOR_VOLTAGE, \  		.owner = THIS_MODULE, \ +		.enable_time = turnon_delay, \  		}, \  	} @@ -925,7 +897,6 @@ static struct twlreg_info TWL4030_INFO_##label = { \  static struct twlreg_info TWL4030_INFO_##label = { \  	.base = offset, \  	.id = num, \ -	.delay = turnon_delay, \  	.remap = remap_conf, \  	.desc = { \  		.name = #label, \ @@ -933,6 +904,7 @@ static struct twlreg_info TWL4030_INFO_##label = { \  		.ops = &twl4030smps_ops, \  		.type = REGULATOR_VOLTAGE, \  		.owner = THIS_MODULE, \ +		.enable_time = turnon_delay, \  		}, \  	} @@ -955,7 +927,7 @@ static struct twlreg_info TWL6030_INFO_##label = { \  	.desc = { \  		.name = #label, \  		.id = TWL6030_REG_##label, \ -		.n_voltages = (max_mVolts - min_mVolts)/100 + 1, \ +		.n_voltages = 32, \  		.ops = &twl6030ldo_ops, \  		.type = REGULATOR_VOLTAGE, \  		.owner = THIS_MODULE, \ @@ -970,7 +942,7 @@ static struct twlreg_info TWL6025_INFO_##label = { \  	.desc = { \  		.name = #label, \  		.id = TWL6025_REG_##label, \ -		.n_voltages = ((max_mVolts - min_mVolts)/100) + 1, \ +		.n_voltages = 32, \  		.ops = &twl6030ldo_ops, \  		.type = REGULATOR_VOLTAGE, \  		.owner = THIS_MODULE, \ @@ -983,7 +955,6 @@ static struct twlreg_info TWLFIXED_INFO_##label = { \  	.base = offset, \  	.id = num, \  	.min_mV = mVolts, \ -	.delay = turnon_delay, \  	.remap = remap_conf, \  	.desc = { \  		.name = #label, \ @@ -992,19 +963,20 @@ static struct twlreg_info TWLFIXED_INFO_##label = { \  		.ops = &operations, \  		.type = REGULATOR_VOLTAGE, \  		.owner = THIS_MODULE, \ +		.enable_time = turnon_delay, \  		}, \  	}  #define TWL6030_FIXED_RESOURCE(label, offset, turnon_delay) \  static struct twlreg_info TWLRES_INFO_##label = { \  	.base = offset, \ -	.delay = turnon_delay, \  	.desc = { \  		.name = #label, \  		.id = TWL6030_REG_##label, \  		.ops = &twl6030_fixed_resource, \  		.type = REGULATOR_VOLTAGE, \  		.owner = THIS_MODULE, \ +		.enable_time = turnon_delay, \  		}, \  	} @@ -1109,7 +1081,6 @@ static u8 twl_get_smps_mult(void)  #define TWL6030_OF_MATCH(comp, label) TWL_OF_MATCH(comp, TWL6030, label)  #define TWL6025_OF_MATCH(comp, label) TWL_OF_MATCH(comp, TWL6025, label)  #define TWLFIXED_OF_MATCH(comp, label) TWL_OF_MATCH(comp, TWLFIXED, label) -#define TWLRES_OF_MATCH(comp, label) TWL_OF_MATCH(comp, TWLRES, label)  #define TWLSMPS_OF_MATCH(comp, label) TWL_OF_MATCH(comp, TWLSMPS, label)  static const struct of_device_id twl_of_match[] __devinitconst = { @@ -1157,7 +1128,6 @@ static const struct of_device_id twl_of_match[] __devinitconst = {  	TWLFIXED_OF_MATCH("ti,twl6030-vusb", VUSB),  	TWLFIXED_OF_MATCH("ti,twl6030-v1v8", V1V8),  	TWLFIXED_OF_MATCH("ti,twl6030-v2v1", V2V1), -	TWLRES_OF_MATCH("ti,twl6030-clk32kg", CLK32KG),  	TWLSMPS_OF_MATCH("ti,twl6025-smps3", SMPS3),  	TWLSMPS_OF_MATCH("ti,twl6025-smps4", SMPS4),  	TWLSMPS_OF_MATCH("ti,twl6025-vio", VIO),  |