aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/regulator/fan53555.c
diff options
context:
space:
mode:
authorHeiko Stuebner <heiko@sntech.de>2014-09-16 11:54:01 -0400
committerMark Brown <broonie@kernel.org>2014-09-16 12:56:11 -0400
commitdd7e71fbeefe9179b94eed81f8b33da06b9bf062 (patch)
treebe6854477bedd2e0388ac12647b93b50aacb0b6c /drivers/regulator/fan53555.c
parent3415d60113f64176114f1bddc09f76c222d85fae (diff)
regulator: fan53555: use set_ramp_delay to set the ramp up slew rate
The regulator constraints already provide a field for the ramp_delay, so there is no need to set this manually. Therefore implement the set_ramp_delay callback and convert the pdata value to the constraint value if necessary. Signed-off-by: Heiko Stuebner <heiko@sntech.de> Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'drivers/regulator/fan53555.c')
-rw-r--r--drivers/regulator/fan53555.c53
1 files changed, 42 insertions, 11 deletions
diff --git a/drivers/regulator/fan53555.c b/drivers/regulator/fan53555.c
index c912ba7bed33..5808435cfae0 100644
--- a/drivers/regulator/fan53555.c
+++ b/drivers/regulator/fan53555.c
@@ -135,6 +135,38 @@ static unsigned int fan53555_get_mode(struct regulator_dev *rdev)
135 return REGULATOR_MODE_NORMAL; 135 return REGULATOR_MODE_NORMAL;
136} 136}
137 137
138static int slew_rates[] = {
139 64000,
140 32000,
141 16000,
142 8000,
143 4000,
144 2000,
145 1000,
146 500,
147};
148
149static int fan53555_set_ramp(struct regulator_dev *rdev, int ramp)
150{
151 struct fan53555_device_info *di = rdev_get_drvdata(rdev);
152 int regval = -1, i;
153
154 for (i = 0; i < ARRAY_SIZE(slew_rates); i++) {
155 if (ramp <= slew_rates[i])
156 regval = i;
157 else
158 break;
159 }
160
161 if (regval < 0) {
162 dev_err(di->dev, "unsupported ramp value %d\n", ramp);
163 return -EINVAL;
164 }
165
166 return regmap_update_bits(di->regmap, FAN53555_CONTROL,
167 CTL_SLEW_MASK, regval << CTL_SLEW_SHIFT);
168}
169
138static struct regulator_ops fan53555_regulator_ops = { 170static struct regulator_ops fan53555_regulator_ops = {
139 .set_voltage_sel = regulator_set_voltage_sel_regmap, 171 .set_voltage_sel = regulator_set_voltage_sel_regmap,
140 .get_voltage_sel = regulator_get_voltage_sel_regmap, 172 .get_voltage_sel = regulator_get_voltage_sel_regmap,
@@ -146,6 +178,7 @@ static struct regulator_ops fan53555_regulator_ops = {
146 .is_enabled = regulator_is_enabled_regmap, 178 .is_enabled = regulator_is_enabled_regmap,
147 .set_mode = fan53555_set_mode, 179 .set_mode = fan53555_set_mode,
148 .get_mode = fan53555_get_mode, 180 .get_mode = fan53555_get_mode,
181 .set_ramp_delay = fan53555_set_ramp,
149}; 182};
150 183
151/* For 00,01,03,05 options: 184/* For 00,01,03,05 options:
@@ -156,8 +189,6 @@ static struct regulator_ops fan53555_regulator_ops = {
156static int fan53555_device_setup(struct fan53555_device_info *di, 189static int fan53555_device_setup(struct fan53555_device_info *di,
157 struct fan53555_platform_data *pdata) 190 struct fan53555_platform_data *pdata)
158{ 191{
159 unsigned int reg, data, mask;
160
161 /* Setup voltage control register */ 192 /* Setup voltage control register */
162 switch (pdata->sleep_vsel_id) { 193 switch (pdata->sleep_vsel_id) {
163 case FAN53555_VSEL_ID_0: 194 case FAN53555_VSEL_ID_0:
@@ -190,15 +221,8 @@ static int fan53555_device_setup(struct fan53555_device_info *di,
190 "Chip ID[%d]\n not supported!\n", di->chip_id); 221 "Chip ID[%d]\n not supported!\n", di->chip_id);
191 return -EINVAL; 222 return -EINVAL;
192 } 223 }
193 /* Init slew rate */ 224
194 if (pdata->slew_rate & 0x7) 225 return 0;
195 di->slew_rate = pdata->slew_rate;
196 else
197 di->slew_rate = FAN53555_SLEW_RATE_64MV;
198 reg = FAN53555_CONTROL;
199 data = di->slew_rate << CTL_SLEW_SHIFT;
200 mask = CTL_SLEW_MASK;
201 return regmap_update_bits(di->regmap, reg, mask, data);
202} 226}
203 227
204static int fan53555_regulator_register(struct fan53555_device_info *di, 228static int fan53555_regulator_register(struct fan53555_device_info *di,
@@ -248,6 +272,13 @@ static int fan53555_regulator_probe(struct i2c_client *client,
248 if (!di) 272 if (!di)
249 return -ENOMEM; 273 return -ENOMEM;
250 274
275 /* if no ramp constraint set, get the pdata ramp_delay */
276 if (!di->regulator->constraints.ramp_delay) {
277 int slew_idx = (pdata->slew_rate & 0x7) ? pdata->slew_rate : 0;
278
279 di->regulator->constraints.ramp_delay = slew_rates[slew_idx];
280 }
281
251 di->regmap = devm_regmap_init_i2c(client, &fan53555_regmap_config); 282 di->regmap = devm_regmap_init_i2c(client, &fan53555_regmap_config);
252 if (IS_ERR(di->regmap)) { 283 if (IS_ERR(di->regmap)) {
253 dev_err(&client->dev, "Failed to allocate regmap!\n"); 284 dev_err(&client->dev, "Failed to allocate regmap!\n");