Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

regulator: max8973: add support to configure ETR based on rail load

Add support to configure Enhanced Transient Response Enable (ETR)
and Sensitivity Selection based on maximum current i.e. expected
load on that rail.

Maxim recommended as:
- Enable ETR with high sensitivity (75mV/us) for 0 to 9A expected loads,
- Enable ETR with low sensitivity (150mV/us) for 9A to 12A expected loads.
- Disable ETR for expected load > 12A.

These recommendation will be configured for MAX77621 when maximum load
is provided through regulator constraint for maximum current from platform.

Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Laxman Dewangan and committed by
Mark Brown
ffaab991 3692db3a

+52
+52
drivers/regulator/max8973-regulator.c
··· 75 75 #define MAX8973_DISCH_ENBABLE BIT(5) 76 76 #define MAX8973_FT_ENABLE BIT(4) 77 77 78 + #define MAX8973_CKKADV_TRIP_MASK 0xC 78 79 #define MAX8973_CKKADV_TRIP_DISABLE 0xC 79 80 #define MAX8973_CKKADV_TRIP_75mV_PER_US 0x0 80 81 #define MAX8973_CKKADV_TRIP_150mV_PER_US 0x4 ··· 281 280 dev_err(max->dev, "register %d update failed, %d", 282 281 MAX8973_CONTROL1, ret); 283 282 return ret; 283 + } 284 + 285 + static int max8973_set_current_limit(struct regulator_dev *rdev, 286 + int min_ua, int max_ua) 287 + { 288 + struct max8973_chip *max = rdev_get_drvdata(rdev); 289 + unsigned int val; 290 + int ret; 291 + 292 + if (max_ua <= 9000000) 293 + val = MAX8973_CKKADV_TRIP_75mV_PER_US; 294 + else if (max_ua <= 12000000) 295 + val = MAX8973_CKKADV_TRIP_150mV_PER_US; 296 + else 297 + val = MAX8973_CKKADV_TRIP_DISABLE; 298 + 299 + ret = regmap_update_bits(max->regmap, MAX8973_CONTROL2, 300 + MAX8973_CKKADV_TRIP_MASK, val); 301 + if (ret < 0) { 302 + dev_err(max->dev, "register %d update failed: %d\n", 303 + MAX8973_CONTROL2, ret); 304 + return ret; 305 + } 306 + return 0; 307 + } 308 + 309 + static int max8973_get_current_limit(struct regulator_dev *rdev) 310 + { 311 + struct max8973_chip *max = rdev_get_drvdata(rdev); 312 + unsigned int control2; 313 + int ret; 314 + 315 + ret = regmap_read(max->regmap, MAX8973_CONTROL2, &control2); 316 + if (ret < 0) { 317 + dev_err(max->dev, "register %d read failed: %d\n", 318 + MAX8973_CONTROL2, ret); 319 + return ret; 320 + } 321 + switch (control2 & MAX8973_CKKADV_TRIP_MASK) { 322 + case MAX8973_CKKADV_TRIP_DISABLE: 323 + return 15000000; 324 + case MAX8973_CKKADV_TRIP_150mV_PER_US: 325 + return 12000000; 326 + case MAX8973_CKKADV_TRIP_75mV_PER_US: 327 + return 9000000; 328 + default: 329 + break; 330 + } 331 + return 9000000; 284 332 } 285 333 286 334 static const struct regulator_ops max8973_dcdc_ops = { ··· 682 632 max->ops.enable = regulator_enable_regmap; 683 633 max->ops.disable = regulator_disable_regmap; 684 634 max->ops.is_enabled = regulator_is_enabled_regmap; 635 + max->ops.set_current_limit = max8973_set_current_limit; 636 + max->ops.get_current_limit = max8973_get_current_limit; 685 637 break; 686 638 default: 687 639 break;