diff options
author | Heiko Stuebner <heiko@sntech.de> | 2014-09-16 11:54:01 -0400 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2014-09-16 12:56:11 -0400 |
commit | dd7e71fbeefe9179b94eed81f8b33da06b9bf062 (patch) | |
tree | be6854477bedd2e0388ac12647b93b50aacb0b6c /drivers/regulator/fan53555.c | |
parent | 3415d60113f64176114f1bddc09f76c222d85fae (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.c | 53 |
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 | ||
138 | static int slew_rates[] = { | ||
139 | 64000, | ||
140 | 32000, | ||
141 | 16000, | ||
142 | 8000, | ||
143 | 4000, | ||
144 | 2000, | ||
145 | 1000, | ||
146 | 500, | ||
147 | }; | ||
148 | |||
149 | static 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 | |||
138 | static struct regulator_ops fan53555_regulator_ops = { | 170 | static 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 = { | |||
156 | static int fan53555_device_setup(struct fan53555_device_info *di, | 189 | static 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 | ||
204 | static int fan53555_regulator_register(struct fan53555_device_info *di, | 228 | static 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"); |