diff options
Diffstat (limited to 'drivers/regulator')
182 files changed, 1158 insertions, 137 deletions
diff --git a/drivers/regulator/88pg86x.c b/drivers/regulator/88pg86x.c index e91d5885c5ef..74275b681f46 100644 --- a/drivers/regulator/88pg86x.c +++ b/drivers/regulator/88pg86x.c @@ -101,6 +101,7 @@ MODULE_DEVICE_TABLE(i2c, pg86x_i2c_id); static struct i2c_driver pg86x_regulator_driver = { .driver = { .name = "88pg86x", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(pg86x_dt_ids), }, .probe_new = pg86x_i2c_probe, diff --git a/drivers/regulator/88pm800-regulator.c b/drivers/regulator/88pm800-regulator.c index d08ee81ed1ac..83e8860309dc 100644 --- a/drivers/regulator/88pm800-regulator.c +++ b/drivers/regulator/88pm800-regulator.c @@ -274,6 +274,7 @@ static int pm800_regulator_probe(struct platform_device *pdev) static struct platform_driver pm800_regulator_driver = { .driver = { .name = "88pm80x-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = pm800_regulator_probe, }; diff --git a/drivers/regulator/88pm8607.c b/drivers/regulator/88pm8607.c index 1d1c4a7ec3e2..e6c436955e25 100644 --- a/drivers/regulator/88pm8607.c +++ b/drivers/regulator/88pm8607.c @@ -383,6 +383,7 @@ MODULE_DEVICE_TABLE(platform, pm8607_regulator_driver_ids); static struct platform_driver pm8607_regulator_driver = { .driver = { .name = "88pm860x-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = pm8607_regulator_probe, .id_table = pm8607_regulator_driver_ids, diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig index aae28d0a489c..e5f3613c15fa 100644 --- a/drivers/regulator/Kconfig +++ b/drivers/regulator/Kconfig @@ -1082,6 +1082,16 @@ config REGULATOR_RT4801 This adds support for voltage regulators in Richtek RT4801 Display Bias IC. The device supports two regulators (DSVP/DSVN). +config REGULATOR_RT4803 + tristate "Richtek RT4803 boost regualtor" + depends on I2C + select REGMAP_I2C + help + This adds support for RT4803 boost converter that integrates the + bypass switch. If the input voltage is low than the required voltage, + RT4803 will enter boost mode. Otherwise, enable internal bypass + switch to enter bypass mode. + config REGULATOR_RT4831 tristate "Richtek RT4831 DSV Regulators" depends on MFD_RT4831 @@ -1120,6 +1130,19 @@ config REGULATOR_RT5190A buck converters, 1 LDO, mute AC OFF depop function, with the general I2C control interface. +config REGULATOR_RT5739 + tristate "Richtek RT5739 Regulator" + depends on I2C + select REGMAP_I2C + help + This adds support for voltage regulator in Richtek RT5739. + It's a step-down switching voltage regulator. Using a proprietary + architecture with synchronous rectification, it is capable of + delivering 3.5A continuously at over 80% efficiency. + + This driver can also be built as a module. If so, the module + will be called rt5739. + config REGULATOR_RT5759 tristate "Richtek RT5759 Regulator" depends on I2C diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile index ee383d8fc835..58dfe0147cd4 100644 --- a/drivers/regulator/Makefile +++ b/drivers/regulator/Makefile @@ -130,10 +130,12 @@ obj-$(CONFIG_REGULATOR_RK808) += rk808-regulator.o obj-$(CONFIG_REGULATOR_RN5T618) += rn5t618-regulator.o obj-$(CONFIG_REGULATOR_ROHM) += rohm-regulator.o obj-$(CONFIG_REGULATOR_RT4801) += rt4801-regulator.o +obj-$(CONFIG_REGULATOR_RT4803) += rt4803.o obj-$(CONFIG_REGULATOR_RT4831) += rt4831-regulator.o obj-$(CONFIG_REGULATOR_RT5033) += rt5033-regulator.o obj-$(CONFIG_REGULATOR_RT5120) += rt5120-regulator.o obj-$(CONFIG_REGULATOR_RT5190A) += rt5190a-regulator.o +obj-$(CONFIG_REGULATOR_RT5739) += rt5739.o obj-$(CONFIG_REGULATOR_RT5759) += rt5759-regulator.o obj-$(CONFIG_REGULATOR_RT6160) += rt6160-regulator.o obj-$(CONFIG_REGULATOR_RT6190) += rt6190-regulator.o diff --git a/drivers/regulator/aat2870-regulator.c b/drivers/regulator/aat2870-regulator.c index d6ed5bf9235e..970d86f2bbb8 100644 --- a/drivers/regulator/aat2870-regulator.c +++ b/drivers/regulator/aat2870-regulator.c @@ -178,6 +178,7 @@ static int aat2870_regulator_probe(struct platform_device *pdev) static struct platform_driver aat2870_regulator_driver = { .driver = { .name = "aat2870-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = aat2870_regulator_probe, }; diff --git a/drivers/regulator/ab8500-ext.c b/drivers/regulator/ab8500-ext.c index 4f26952caa56..b9955aa4e0d1 100644 --- a/drivers/regulator/ab8500-ext.c +++ b/drivers/regulator/ab8500-ext.c @@ -446,6 +446,7 @@ static struct platform_driver ab8500_ext_regulator_driver = { .probe = ab8500_ext_regulator_probe, .driver = { .name = "ab8500-ext-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, }; diff --git a/drivers/regulator/ab8500.c b/drivers/regulator/ab8500.c index 23a401734a98..6b4a3a3d8385 100644 --- a/drivers/regulator/ab8500.c +++ b/drivers/regulator/ab8500.c @@ -1737,6 +1737,7 @@ static struct platform_driver ab8500_regulator_driver = { .probe = ab8500_regulator_probe, .driver = { .name = "ab8500-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, }; diff --git a/drivers/regulator/act8865-regulator.c b/drivers/regulator/act8865-regulator.c index 53f2c75cdeb4..5c409ff4aa99 100644 --- a/drivers/regulator/act8865-regulator.c +++ b/drivers/regulator/act8865-regulator.c @@ -789,6 +789,7 @@ MODULE_DEVICE_TABLE(i2c, act8865_ids); static struct i2c_driver act8865_pmic_driver = { .driver = { .name = "act8865", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe_new = act8865_pmic_probe, .id_table = act8865_ids, diff --git a/drivers/regulator/act8945a-regulator.c b/drivers/regulator/act8945a-regulator.c index 1db1c6423779..e26264529b74 100644 --- a/drivers/regulator/act8945a-regulator.c +++ b/drivers/regulator/act8945a-regulator.c @@ -348,6 +348,7 @@ static void act8945a_pmic_shutdown(struct platform_device *pdev) static struct platform_driver act8945a_pmic_driver = { .driver = { .name = "act8945a-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .pm = &act8945a_pm, }, .probe = act8945a_pmic_probe, diff --git a/drivers/regulator/ad5398.c b/drivers/regulator/ad5398.c index 2ba8ac1773d1..c228cf6956d1 100644 --- a/drivers/regulator/ad5398.c +++ b/drivers/regulator/ad5398.c @@ -257,6 +257,7 @@ static struct i2c_driver ad5398_driver = { .probe_new = ad5398_probe, .driver = { .name = "ad5398", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .id_table = ad5398_id, }; diff --git a/drivers/regulator/anatop-regulator.c b/drivers/regulator/anatop-regulator.c index f9856d4e295f..700bd0343196 100644 --- a/drivers/regulator/anatop-regulator.c +++ b/drivers/regulator/anatop-regulator.c @@ -328,6 +328,7 @@ MODULE_DEVICE_TABLE(of, of_anatop_regulator_match_tbl); static struct platform_driver anatop_regulator_driver = { .driver = { .name = "anatop_regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_anatop_regulator_match_tbl, }, .probe = anatop_regulator_probe, diff --git a/drivers/regulator/arizona-ldo1.c b/drivers/regulator/arizona-ldo1.c index ade0bef4569d..b465c0010665 100644 --- a/drivers/regulator/arizona-ldo1.c +++ b/drivers/regulator/arizona-ldo1.c @@ -380,6 +380,7 @@ static struct platform_driver arizona_ldo1_driver = { .remove = arizona_ldo1_remove, .driver = { .name = "arizona-ldo1", + .probe_type = PROBE_FORCE_SYNCHRONOUS, }, }; @@ -388,6 +389,7 @@ static struct platform_driver madera_ldo1_driver = { .remove = arizona_ldo1_remove, .driver = { .name = "madera-ldo1", + .probe_type = PROBE_FORCE_SYNCHRONOUS, }, }; diff --git a/drivers/regulator/arizona-micsupp.c b/drivers/regulator/arizona-micsupp.c index 596ecd8041cd..e250e5f3fcbc 100644 --- a/drivers/regulator/arizona-micsupp.c +++ b/drivers/regulator/arizona-micsupp.c @@ -365,6 +365,7 @@ static struct platform_driver arizona_micsupp_driver = { .probe = arizona_micsupp_probe, .driver = { .name = "arizona-micsupp", + .probe_type = PROBE_FORCE_SYNCHRONOUS, }, }; @@ -372,6 +373,7 @@ static struct platform_driver madera_micsupp_driver = { .probe = madera_micsupp_probe, .driver = { .name = "madera-micsupp", + .probe_type = PROBE_FORCE_SYNCHRONOUS, }, }; diff --git a/drivers/regulator/as3711-regulator.c b/drivers/regulator/as3711-regulator.c index b6b9206969ae..0431a732cd78 100644 --- a/drivers/regulator/as3711-regulator.c +++ b/drivers/regulator/as3711-regulator.c @@ -243,6 +243,7 @@ static int as3711_regulator_probe(struct platform_device *pdev) static struct platform_driver as3711_regulator_driver = { .driver = { .name = "as3711-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = as3711_regulator_probe, }; diff --git a/drivers/regulator/as3722-regulator.c b/drivers/regulator/as3722-regulator.c index 7bebf9ce6271..da378bfdba40 100644 --- a/drivers/regulator/as3722-regulator.c +++ b/drivers/regulator/as3722-regulator.c @@ -831,6 +831,7 @@ MODULE_DEVICE_TABLE(of, of_as3722_regulator_match); static struct platform_driver as3722_regulator_driver = { .driver = { .name = "as3722-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_as3722_regulator_match, }, .probe = as3722_regulator_probe, diff --git a/drivers/regulator/atc260x-regulator.c b/drivers/regulator/atc260x-regulator.c index 485e58b264c0..87e237d740bc 100644 --- a/drivers/regulator/atc260x-regulator.c +++ b/drivers/regulator/atc260x-regulator.c @@ -530,6 +530,7 @@ static struct platform_driver atc260x_regulator_driver = { .probe = atc260x_regulator_probe, .driver = { .name = "atc260x-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, }; diff --git a/drivers/regulator/axp20x-regulator.c b/drivers/regulator/axp20x-regulator.c index d260c442b788..943172b19722 100644 --- a/drivers/regulator/axp20x-regulator.c +++ b/drivers/regulator/axp20x-regulator.c @@ -1364,6 +1364,7 @@ static struct platform_driver axp20x_regulator_driver = { .probe = axp20x_regulator_probe, .driver = { .name = "axp20x-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, }; diff --git a/drivers/regulator/bcm590xx-regulator.c b/drivers/regulator/bcm590xx-regulator.c index 65e23fc5f9c3..9f0cda46b015 100644 --- a/drivers/regulator/bcm590xx-regulator.c +++ b/drivers/regulator/bcm590xx-regulator.c @@ -354,6 +354,7 @@ static int bcm590xx_probe(struct platform_device *pdev) static struct platform_driver bcm590xx_regulator_driver = { .driver = { .name = "bcm590xx-vregs", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = bcm590xx_probe, }; diff --git a/drivers/regulator/bd71815-regulator.c b/drivers/regulator/bd71815-regulator.c index 8b55046eded8..475b1e0110e7 100644 --- a/drivers/regulator/bd71815-regulator.c +++ b/drivers/regulator/bd71815-regulator.c @@ -201,10 +201,10 @@ static int buck12_set_hw_dvs_levels(struct device_node *np, data = container_of(desc, struct bd71815_regulator, desc); - if (of_find_property(np, "rohm,dvs-run-voltage", NULL) || - of_find_property(np, "rohm,dvs-suspend-voltage", NULL) || - of_find_property(np, "rohm,dvs-lpsr-voltage", NULL) || - of_find_property(np, "rohm,dvs-snvs-voltage", NULL)) { + if (of_property_present(np, "rohm,dvs-run-voltage") || + of_property_present(np, "rohm,dvs-suspend-voltage") || + of_property_present(np, "rohm,dvs-lpsr-voltage") || + of_property_present(np, "rohm,dvs-snvs-voltage")) { ret = regmap_read(cfg->regmap, desc->vsel_reg, &val); if (ret) return ret; @@ -619,6 +619,7 @@ MODULE_DEVICE_TABLE(platform, bd7181x_pmic_id); static struct platform_driver bd7181x_regulator = { .driver = { .name = "bd7181x-pmic", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = bd7181x_probe, .id_table = bd7181x_pmic_id, diff --git a/drivers/regulator/bd71828-regulator.c b/drivers/regulator/bd71828-regulator.c index ad728f4f2241..f3205dc9d4fc 100644 --- a/drivers/regulator/bd71828-regulator.c +++ b/drivers/regulator/bd71828-regulator.c @@ -771,7 +771,8 @@ static int bd71828_probe(struct platform_device *pdev) static struct platform_driver bd71828_regulator = { .driver = { - .name = "bd71828-pmic" + .name = "bd71828-pmic", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = bd71828_probe, }; diff --git a/drivers/regulator/bd718x7-regulator.c b/drivers/regulator/bd718x7-regulator.c index 894fab0d53d0..b0b9938c20a1 100644 --- a/drivers/regulator/bd718x7-regulator.c +++ b/drivers/regulator/bd718x7-regulator.c @@ -1829,6 +1829,7 @@ MODULE_DEVICE_TABLE(platform, bd718x7_pmic_id); static struct platform_driver bd718xx_regulator = { .driver = { .name = "bd718xx-pmic", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = bd718xx_probe, .id_table = bd718x7_pmic_id, diff --git a/drivers/regulator/bd9571mwv-regulator.c b/drivers/regulator/bd9571mwv-regulator.c index ba020a45f238..d469481d8442 100644 --- a/drivers/regulator/bd9571mwv-regulator.c +++ b/drivers/regulator/bd9571mwv-regulator.c @@ -353,6 +353,7 @@ MODULE_DEVICE_TABLE(platform, bd9571mwv_regulator_id_table); static struct platform_driver bd9571mwv_regulator_driver = { .driver = { .name = "bd9571mwv-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .pm = DEV_PM_OPS, }, .probe = bd9571mwv_regulator_probe, diff --git a/drivers/regulator/bd9576-regulator.c b/drivers/regulator/bd9576-regulator.c index 02c70768652b..d4ca7b3f4036 100644 --- a/drivers/regulator/bd9576-regulator.c +++ b/drivers/regulator/bd9576-regulator.c @@ -1126,6 +1126,7 @@ MODULE_DEVICE_TABLE(platform, bd957x_pmic_id); static struct platform_driver bd957x_regulator = { .driver = { .name = "bd957x-pmic", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = bd957x_probe, .id_table = bd957x_pmic_id, diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index 4fcd36055b02..dc741ac156c3 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -207,6 +207,71 @@ static void regulator_unlock(struct regulator_dev *rdev) mutex_unlock(®ulator_nesting_mutex); } +/** + * regulator_lock_two - lock two regulators + * @rdev1: first regulator + * @rdev2: second regulator + * @ww_ctx: w/w mutex acquire context + * + * Locks both rdevs using the regulator_ww_class. + */ +static void regulator_lock_two(struct regulator_dev *rdev1, + struct regulator_dev *rdev2, + struct ww_acquire_ctx *ww_ctx) +{ + struct regulator_dev *held, *contended; + int ret; + + ww_acquire_init(ww_ctx, ®ulator_ww_class); + + /* Try to just grab both of them */ + ret = regulator_lock_nested(rdev1, ww_ctx); + WARN_ON(ret); + ret = regulator_lock_nested(rdev2, ww_ctx); + if (ret != -EDEADLOCK) { + WARN_ON(ret); + goto exit; + } + + held = rdev1; + contended = rdev2; + while (true) { + regulator_unlock(held); + + ww_mutex_lock_slow(&contended->mutex, ww_ctx); + contended->ref_cnt++; + contended->mutex_owner = current; + swap(held, contended); + ret = regulator_lock_nested(contended, ww_ctx); + + if (ret != -EDEADLOCK) { + WARN_ON(ret); + break; + } + } + +exit: + ww_acquire_done(ww_ctx); +} + +/** + * regulator_unlock_two - unlock two regulators + * @rdev1: first regulator + * @rdev2: second regulator + * @ww_ctx: w/w mutex acquire context + * + * The inverse of regulator_lock_two(). + */ + +static void regulator_unlock_two(struct regulator_dev *rdev1, + struct regulator_dev *rdev2, + struct ww_acquire_ctx *ww_ctx) +{ + regulator_unlock(rdev2); + regulator_unlock(rdev1); + ww_acquire_fini(ww_ctx); +} + static bool regulator_supply_is_couple(struct regulator_dev *rdev) { struct regulator_dev *c_rdev; @@ -334,6 +399,7 @@ static void regulator_lock_dependent(struct regulator_dev *rdev, ww_mutex_lock_slow(&new_contended_rdev->mutex, ww_ctx); old_contended_rdev = new_contended_rdev; old_contended_rdev->ref_cnt++; + old_contended_rdev->mutex_owner = current; } err = regulator_lock_recursive(rdev, @@ -1583,9 +1649,6 @@ static int set_machine_constraints(struct regulator_dev *rdev) rdev->constraints->always_on = true; } - if (rdev->desc->off_on_delay) - rdev->last_off = ktime_get_boottime(); - /* If the constraints say the regulator should be on at this point * and we have control then make sure it is enabled. */ @@ -1619,6 +1682,8 @@ static int set_machine_constraints(struct regulator_dev *rdev) if (rdev->constraints->always_on) rdev->use_count++; + } else if (rdev->desc->off_on_delay) { + rdev->last_off = ktime_get(); } print_constraints(rdev); @@ -1627,8 +1692,8 @@ static int set_machine_constraints(struct regulator_dev *rdev) /** * set_supply - set regulator supply regulator - * @rdev: regulator name - * @supply_rdev: supply regulator name + * @rdev: regulator (locked) + * @supply_rdev: supply regulator (locked)) * * Called by platform initialisation code to set the supply regulator for this * regulator. This ensures that a regulators supply will also be enabled by the @@ -1800,6 +1865,8 @@ static struct regulator *create_regulator(struct regulator_dev *rdev, struct regulator *regulator; int err = 0; + lockdep_assert_held_once(&rdev->mutex.base); + if (dev) { char buf[REG_STR_SIZE]; int size; @@ -1827,9 +1894,7 @@ static struct regulator *create_regulator(struct regulator_dev *rdev, regulator->rdev = rdev; regulator->supply_name = supply_name; - regulator_lock(rdev); list_add(®ulator->list, &rdev->consumer_list); - regulator_unlock(rdev); if (dev) { regulator->dev = dev; @@ -1995,6 +2060,7 @@ static int regulator_resolve_supply(struct regulator_dev *rdev) { struct regulator_dev *r; struct device *dev = rdev->dev.parent; + struct ww_acquire_ctx ww_ctx; int ret = 0; /* No supply to resolve? */ @@ -2061,23 +2127,23 @@ static int regulator_resolve_supply(struct regulator_dev *rdev) * between rdev->supply null check and setting rdev->supply in * set_supply() from concurrent tasks. */ - regulator_lock(rdev); + regulator_lock_two(rdev, r, &ww_ctx); /* Supply just resolved by a concurrent task? */ if (rdev->supply) { - regulator_unlock(rdev); + regulator_unlock_two(rdev, r, &ww_ctx); put_device(&r->dev); goto out; } ret = set_supply(rdev, r); if (ret < 0) { - regulator_unlock(rdev); + regulator_unlock_two(rdev, r, &ww_ctx); put_device(&r->dev); goto out; } - regulator_unlock(rdev); + regulator_unlock_two(rdev, r, &ww_ctx); /* * In set_machine_constraints() we may have turned this regulator on @@ -2190,7 +2256,9 @@ struct regulator *_regulator_get(struct device *dev, const char *id, return regulator; } + regulator_lock(rdev); regulator = create_regulator(rdev, dev, id); + regulator_unlock(rdev); if (regulator == NULL) { regulator = ERR_PTR(-ENOMEM); module_put(rdev->owner); @@ -2668,7 +2736,7 @@ static int _regulator_do_enable(struct regulator_dev *rdev) trace_regulator_enable(rdev_get_name(rdev)); - if (rdev->desc->off_on_delay && rdev->last_off) { + if (rdev->desc->off_on_delay) { /* if needed, keep a distance of off_on_delay from last time * this regulator was disabled. */ @@ -6049,6 +6117,7 @@ static void regulator_summary_lock(struct ww_acquire_ctx *ww_ctx) ww_mutex_lock_slow(&new_contended_rdev->mutex, ww_ctx); old_contended_rdev = new_contended_rdev; old_contended_rdev->ref_cnt++; + old_contended_rdev->mutex_owner = current; } err = regulator_summary_lock_all(ww_ctx, diff --git a/drivers/regulator/cpcap-regulator.c b/drivers/regulator/cpcap-regulator.c index b0c225d98631..1fd79fb17303 100644 --- a/drivers/regulator/cpcap-regulator.c +++ b/drivers/regulator/cpcap-regulator.c @@ -553,6 +553,7 @@ static struct platform_driver cpcap_regulator_driver = { .probe = cpcap_regulator_probe, .driver = { .name = "cpcap-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(cpcap_regulator_id_table), }, }; diff --git a/drivers/regulator/cros-ec-regulator.c b/drivers/regulator/cros-ec-regulator.c index 1591636f86c3..fb9643ed7a49 100644 --- a/drivers/regulator/cros-ec-regulator.c +++ b/drivers/regulator/cros-ec-regulator.c @@ -215,6 +215,7 @@ static struct platform_driver cros_ec_regulator_driver = { .probe = cros_ec_regulator_probe, .driver = { .name = "cros-ec-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = regulator_cros_ec_of_match, }, }; diff --git a/drivers/regulator/da903x-regulator.c b/drivers/regulator/da903x-regulator.c index 770e694824ac..f79337079a45 100644 --- a/drivers/regulator/da903x-regulator.c +++ b/drivers/regulator/da903x-regulator.c @@ -471,6 +471,7 @@ static int da903x_regulator_probe(struct platform_device *pdev) static struct platform_driver da903x_regulator_driver = { .driver = { .name = "da903x-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = da903x_regulator_probe, }; diff --git a/drivers/regulator/da9052-regulator.c b/drivers/regulator/da9052-regulator.c index 23fa429ebe76..ab6f5d61b173 100644 --- a/drivers/regulator/da9052-regulator.c +++ b/drivers/regulator/da9052-regulator.c @@ -438,6 +438,7 @@ static struct platform_driver da9052_regulator_driver = { .probe = da9052_regulator_probe, .driver = { .name = "da9052-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, }; diff --git a/drivers/regulator/da9055-regulator.c b/drivers/regulator/da9055-regulator.c index 73ff5fc7d8d7..8fd9ac787588 100644 --- a/drivers/regulator/da9055-regulator.c +++ b/drivers/regulator/da9055-regulator.c @@ -576,6 +576,7 @@ static struct platform_driver da9055_regulator_driver = { .probe = da9055_regulator_probe, .driver = { .name = "da9055-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, }; diff --git a/drivers/regulator/da9062-regulator.c b/drivers/regulator/da9062-regulator.c index 1a6324001027..c28b061eef02 100644 --- a/drivers/regulator/da9062-regulator.c +++ b/drivers/regulator/da9062-regulator.c @@ -1033,6 +1033,7 @@ static int da9062_regulator_probe(struct platform_device *pdev) static struct platform_driver da9062_regulator_driver = { .driver = { .name = "da9062-regulators", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = da9062_regulator_probe, }; diff --git a/drivers/regulator/da9063-regulator.c b/drivers/regulator/da9063-regulator.c index 82f52a2a031a..c5dd77be558b 100644 --- a/drivers/regulator/da9063-regulator.c +++ b/drivers/regulator/da9063-regulator.c @@ -83,6 +83,9 @@ struct da9063_regulator_info { /* DA9063 event detection bit */ struct reg_field oc_event; + + /* DA9063 voltage monitor bit */ + struct reg_field vmon; }; /* Macros for LDO */ @@ -148,6 +151,7 @@ struct da9063_regulator { struct regmap_field *suspend; struct regmap_field *sleep; struct regmap_field *suspend_sleep; + struct regmap_field *vmon; }; /* Encapsulates all information for the regulators driver */ @@ -203,6 +207,24 @@ static const unsigned int da9063_bmem_bio_merged_limits[] = { 4600000, 4800000, 5000000, 5200000, 5400000, 5600000, 5800000, 6000000 }; +static int da9063_set_xvp(struct regulator_dev *rdev, int lim_uV, int severity, bool enable) +{ + struct da9063_regulator *regl = rdev_get_drvdata(rdev); + struct device *dev = regl->hw->dev; + + dev_dbg(dev, "%s: lim: %d, sev: %d, en: %d\n", regl->desc.name, lim_uV, severity, enable); + + /* + * only support enable and disable. + * the da9063 offers a GPIO (GP_FB2) which is unasserted if an XV happens. + * therefore ignore severity here, as there might be handlers in hardware. + */ + if (lim_uV) + return -EINVAL; + + return regmap_field_write(regl->vmon, enable ? 1 : 0); +} + static int da9063_buck_set_mode(struct regulator_dev *rdev, unsigned int mode) { struct da9063_regulator *regl = rdev_get_drvdata(rdev); @@ -541,37 +563,41 @@ static int da9063_buck_get_current_limit(struct regulator_dev *rdev) } static const struct regulator_ops da9063_buck_ops = { - .enable = regulator_enable_regmap, - .disable = regulator_disable_regmap, - .is_enabled = regulator_is_enabled_regmap, - .get_voltage_sel = regulator_get_voltage_sel_regmap, - .set_voltage_sel = regulator_set_voltage_sel_regmap, - .list_voltage = regulator_list_voltage_linear, - .set_current_limit = da9063_buck_set_current_limit, - .get_current_limit = da9063_buck_get_current_limit, - .set_mode = da9063_buck_set_mode, - .get_mode = da9063_buck_get_mode, - .get_status = da9063_buck_get_status, - .set_suspend_voltage = da9063_set_suspend_voltage, - .set_suspend_enable = da9063_suspend_enable, - .set_suspend_disable = da9063_suspend_disable, - .set_suspend_mode = da9063_buck_set_suspend_mode, + .enable = regulator_enable_regmap, + .disable = regulator_disable_regmap, + .is_enabled = regulator_is_enabled_regmap, + .get_voltage_sel = regulator_get_voltage_sel_regmap, + .set_voltage_sel = regulator_set_voltage_sel_regmap, + .list_voltage = regulator_list_voltage_linear, + .set_current_limit = da9063_buck_set_current_limit, + .get_current_limit = da9063_buck_get_current_limit, + .set_mode = da9063_buck_set_mode, + .get_mode = da9063_buck_get_mode, + .get_status = da9063_buck_get_status, + .set_suspend_voltage = da9063_set_suspend_voltage, + .set_suspend_enable = da9063_suspend_enable, + .set_suspend_disable = da9063_suspend_disable, + .set_suspend_mode = da9063_buck_set_suspend_mode, + .set_over_voltage_protection = da9063_set_xvp, + .set_under_voltage_protection = da9063_set_xvp, }; static const struct regulator_ops da9063_ldo_ops = { - .enable = regulator_enable_regmap, - .disable = regulator_disable_regmap, - .is_enabled = regulator_is_enabled_regmap, - .get_voltage_sel = regulator_get_voltage_sel_regmap, - .set_voltage_sel = regulator_set_voltage_sel_regmap, - .list_voltage = regulator_list_voltage_linear, - .set_mode = da9063_ldo_set_mode, - .get_mode = da9063_ldo_get_mode, - .get_status = da9063_ldo_get_status, - .set_suspend_voltage = da9063_set_suspend_voltage, - .set_suspend_enable = da9063_suspend_enable, - .set_suspend_disable = da9063_suspend_disable, - .set_suspend_mode = da9063_ldo_set_suspend_mode, + .enable = regulator_enable_regmap, + .disable = regulator_disable_regmap, + .is_enabled = regulator_is_enabled_regmap, + .get_voltage_sel = regulator_get_voltage_sel_regmap, + .set_voltage_sel = regulator_set_voltage_sel_regmap, + .list_voltage = regulator_list_voltage_linear, + .set_mode = da9063_ldo_set_mode, + .get_mode = da9063_ldo_get_mode, + .get_status = da9063_ldo_get_status, + .set_suspend_voltage = da9063_set_suspend_voltage, + .set_suspend_enable = da9063_suspend_enable, + .set_suspend_disable = da9063_suspend_disable, + .set_suspend_mode = da9063_ldo_set_suspend_mode, + .set_over_voltage_protection = da9063_set_xvp, + .set_under_voltage_protection = da9063_set_xvp, }; /* Info of regulators for DA9063 */ @@ -581,36 +607,42 @@ static const struct da9063_regulator_info da9063_regulator_info[] = { da9063_buck_a_limits, DA9063_REG_BUCK_ILIM_C, DA9063_BCORE1_ILIM_MASK), DA9063_BUCK_COMMON_FIELDS(BCORE1), + .vmon = BFIELD(DA9063_BB_REG_MON_REG_4, DA9063_BCORE1_MON_EN), }, { DA9063_BUCK(DA9063, BCORE2, 300, 10, 1570, da9063_buck_a_limits, DA9063_REG_BUCK_ILIM_C, DA9063_BCORE2_ILIM_MASK), DA9063_BUCK_COMMON_FIELDS(BCORE2), + .vmon = BFIELD(DA9063_BB_REG_MON_REG_4, DA9063_BCORE2_MON_EN), }, { DA9063_BUCK(DA9063, BPRO, 530, 10, 1800, da9063_buck_a_limits, DA9063_REG_BUCK_ILIM_B, DA9063_BPRO_ILIM_MASK), DA9063_BUCK_COMMON_FIELDS(BPRO), + .vmon = BFIELD(DA9063_BB_REG_MON_REG_4, DA9063_BPRO_MON_EN), }, { DA9063_BUCK(DA9063, BMEM, 800, 20, 3340, da9063_buck_b_limits, DA9063_REG_BUCK_ILIM_A, DA9063_BMEM_ILIM_MASK), DA9063_BUCK_COMMON_FIELDS(BMEM), + .vmon = BFIELD(DA9063_BB_REG_MON_REG_4, DA9063_BMEM_MON_EN), }, { DA9063_BUCK(DA9063, BIO, 800, 20, 3340, da9063_buck_b_limits, DA9063_REG_BUCK_ILIM_A, DA9063_BIO_ILIM_MASK), DA9063_BUCK_COMMON_FIELDS(BIO), + .vmon = BFIELD(DA9063_BB_REG_MON_REG_4, DA9063_BIO_MON_EN), }, { DA9063_BUCK(DA9063, BPERI, 800, 20, 3340, da9063_buck_b_limits, DA9063_REG_BUCK_ILIM_B, DA9063_BPERI_ILIM_MASK), DA9063_BUCK_COMMON_FIELDS(BPERI), + .vmon = BFIELD(DA9063_BB_REG_MON_REG_4, DA9063_BPERI_MON_EN), }, { DA9063_BUCK(DA9063, BCORES_MERGED, 300, 10, 1570, @@ -618,6 +650,7 @@ static const struct da9063_regulator_info da9063_regulator_info[] = { DA9063_REG_BUCK_ILIM_C, DA9063_BCORE1_ILIM_MASK), /* BCORES_MERGED uses the same register fields as BCORE1 */ DA9063_BUCK_COMMON_FIELDS(BCORE1), + .vmon = BFIELD(DA9063_BB_REG_MON_REG_4, DA9063_BCORE1_MON_EN), }, { DA9063_BUCK(DA9063, BMEM_BIO_MERGED, 800, 20, 3340, @@ -625,47 +658,59 @@ static const struct da9063_regulator_info da9063_regulator_info[] = { DA9063_REG_BUCK_ILIM_A, DA9063_BMEM_ILIM_MASK), /* BMEM_BIO_MERGED uses the same register fields as BMEM */ DA9063_BUCK_COMMON_FIELDS(BMEM), + .vmon = BFIELD(DA9063_BB_REG_MON_REG_4, DA9063_BMEM_MON_EN), }, { DA9063_LDO(DA9063, LDO3, 900, 20, 3440), .oc_event = BFIELD(DA9063_REG_STATUS_D, DA9063_LDO3_LIM), + .vmon = BFIELD(DA9063_BB_REG_MON_REG_2, DA9063_LDO3_MON_EN), }, { DA9063_LDO(DA9063, LDO7, 900, 50, 3600), .oc_event = BFIELD(DA9063_REG_STATUS_D, DA9063_LDO7_LIM), + .vmon = BFIELD(DA9063_BB_REG_MON_REG_2, DA9063_LDO7_MON_EN), }, { DA9063_LDO(DA9063, LDO8, 900, 50, 3600), .oc_event = BFIELD(DA9063_REG_STATUS_D, DA9063_LDO8_LIM), + .vmon = BFIELD(DA9063_BB_REG_MON_REG_2, DA9063_LDO8_MON_EN), }, { DA9063_LDO(DA9063, LDO9, 950, 50, 3600), + .vmon = BFIELD(DA9063_BB_REG_MON_REG_3, DA9063_LDO9_MON_EN), }, { DA9063_LDO(DA9063, LDO11, 900, 50, 3600), .oc_event = BFIELD(DA9063_REG_STATUS_D, DA9063_LDO11_LIM), + .vmon = BFIELD(DA9063_BB_REG_MON_REG_3, DA9063_LDO11_MON_EN), }, /* The following LDOs are present only on DA9063, not on DA9063L */ { DA9063_LDO(DA9063, LDO1, 600, 20, 1860), + .vmon = BFIELD(DA9063_BB_REG_MON_REG_2, DA9063_LDO1_MON_EN), }, { DA9063_LDO(DA9063, LDO2, 600, 20, 1860), + .vmon = BFIELD(DA9063_BB_REG_MON_REG_2, DA9063_LDO2_MON_EN), }, { DA9063_LDO(DA9063, LDO4, 900, 20, 3440), .oc_event = BFIELD(DA9063_REG_STATUS_D, DA9063_LDO4_LIM), + .vmon = BFIELD(DA9063_BB_REG_MON_REG_2, DA9063_LDO4_MON_EN), }, { DA9063_LDO(DA9063, LDO5, 900, 50, 3600), + .vmon = BFIELD(DA9063_BB_REG_MON_REG_2, DA9063_LDO5_MON_EN), }, { DA9063_LDO(DA9063, LDO6, 900, 50, 3600), + .vmon = BFIELD(DA9063_BB_REG_MON_REG_2, DA9063_LDO6_MON_EN), }, { DA9063_LDO(DA9063, LDO10, 900, 50, 3600), + .vmon = BFIELD(DA9063_BB_REG_MON_REG_3, DA9063_LDO10_MON_EN), }, }; @@ -726,6 +771,41 @@ static const struct regulator_init_data *da9063_get_regulator_initdata( return NULL; } +static int da9063_check_xvp_constraints(struct regulator_config *config) +{ + struct da9063_regulator *regl = config->driver_data; + const struct regulation_constraints *constr = &config->init_data->constraints; + const struct notification_limit *uv_l = &constr->under_voltage_limits; + const struct notification_limit *ov_l = &constr->over_voltage_limits; + + /* make sure that only one severity is used to clarify if unchanged, enabled or disabled */ + if ((!!uv_l->prot + !!uv_l->err + !!uv_l->warn) > 1) { + dev_err(config->dev, "%s: at most one voltage monitoring severity allowed!\n", + regl->desc.name); + return -EINVAL; + } + + /* make sure that UV and OV monitoring is set to the same severity and value */ + if (uv_l->prot != ov_l->prot) { + dev_err(config->dev, + "%s: protection-microvolt: value must be equal for uv and ov!\n", + regl->desc.name); + return -EINVAL; + } + if (uv_l->err != ov_l->err) { + dev_err(config->dev, "%s: error-microvolt: value must be equal for uv and ov!\n", + regl->desc.name); + return -EINVAL; + } + if (uv_l->warn != ov_l->warn) { + dev_err(config->dev, "%s: warn-microvolt: value must be equal for uv and ov!\n", + regl->desc.name); + return -EINVAL; + } + + return 0; +} + static struct of_regulator_match da9063_matches[] = { [DA9063_ID_BCORE1] = { .name = "bcore1" }, [DA9063_ID_BCORE2] = { .name = "bcore2" }, @@ -932,6 +1012,12 @@ static int da9063_regulator_probe(struct platform_device *pdev) if (IS_ERR(regl->suspend_sleep)) return PTR_ERR(regl->suspend_sleep); } + if (regl->info->vmon.reg) { + regl->vmon = devm_regmap_field_alloc(&pdev->dev, + da9063->regmap, regl->info->vmon); + if (IS_ERR(regl->vmon)) + return PTR_ERR(regl->vmon); + } /* Register regulator */ memset(&config, 0, sizeof(config)); @@ -941,6 +1027,11 @@ static int da9063_regulator_probe(struct platform_device *pdev) if (da9063_reg_matches) config.of_node = da9063_reg_matches[id].of_node; config.regmap = da9063->regmap; + + ret = da9063_check_xvp_constraints(&config); + if (ret) + return ret; + regl->rdev = devm_regulator_register(&pdev->dev, ®l->desc, &config); if (IS_ERR(regl->rdev)) { @@ -971,6 +1062,7 @@ static int da9063_regulator_probe(struct platform_device *pdev) static struct platform_driver da9063_regulator_driver = { .driver = { .name = DA9063_DRVNAME_REGULATORS, + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = da9063_regulator_probe, }; diff --git a/drivers/regulator/da9121-regulator.c b/drivers/regulator/da9121-regulator.c index d016e049d264..6ce0fdc18b9c 100644 --- a/drivers/regulator/da9121-regulator.c +++ b/drivers/regulator/da9121-regulator.c @@ -1194,6 +1194,7 @@ MODULE_DEVICE_TABLE(i2c, da9121_i2c_id); static struct i2c_driver da9121_regulator_driver = { .driver = { .name = "da9121", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(da9121_dt_ids), }, .probe_new = da9121_i2c_probe, diff --git a/drivers/regulator/da9210-regulator.c b/drivers/regulator/da9210-regulator.c index 7493af0b5c04..4332a3b8a672 100644 --- a/drivers/regulator/da9210-regulator.c +++ b/drivers/regulator/da9210-regulator.c @@ -221,6 +221,7 @@ MODULE_DEVICE_TABLE(i2c, da9210_i2c_id); static struct i2c_driver da9210_regulator_driver = { .driver = { .name = "da9210", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(da9210_dt_ids), }, .probe_new = da9210_i2c_probe, diff --git a/drivers/regulator/da9211-regulator.c b/drivers/regulator/da9211-regulator.c index 00828f5baa97..a2b4f6f1e34b 100644 --- a/drivers/regulator/da9211-regulator.c +++ b/drivers/regulator/da9211-regulator.c @@ -552,6 +552,7 @@ MODULE_DEVICE_TABLE(of, da9211_dt_ids); static struct i2c_driver da9211_regulator_driver = { .driver = { .name = "da9211", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(da9211_dt_ids), }, .probe_new = da9211_i2c_probe, diff --git a/drivers/regulator/db8500-prcmu.c b/drivers/regulator/db8500-prcmu.c index 0ce6ec4933af..34c5e485d0af 100644 --- a/drivers/regulator/db8500-prcmu.c +++ b/drivers/regulator/db8500-prcmu.c @@ -479,6 +479,7 @@ static int db8500_regulator_remove(struct platform_device *pdev) static struct platform_driver db8500_regulator_driver = { .driver = { .name = "db8500-prcmu-regulators", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = db8500_regulator_probe, .remove = db8500_regulator_remove, diff --git a/drivers/regulator/dummy.c b/drivers/regulator/dummy.c index 24e586f93855..5b9b9e4e762d 100644 --- a/drivers/regulator/dummy.c +++ b/drivers/regulator/dummy.c @@ -60,6 +60,7 @@ static struct platform_driver dummy_regulator_driver = { .probe = dummy_regulator_probe, .driver = { .name = "reg-dummy", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, }; diff --git a/drivers/regulator/fan53555.c b/drivers/regulator/fan53555.c index 41537c45f036..130f3dbe9840 100644 --- a/drivers/regulator/fan53555.c +++ b/drivers/regulator/fan53555.c @@ -8,7 +8,7 @@ // Copyright (c) 2012 Marvell Technology Ltd. // Yunfan Zhang <yfzhang@marvell.com> -#include <linux/bits.h> +#include <linux/bitops.h> #include <linux/err.h> #include <linux/i2c.h> #include <linux/module.h> @@ -26,6 +26,9 @@ #define FAN53555_VSEL0 0x00 #define FAN53555_VSEL1 0x01 +#define RK8602_VSEL0 0x06 +#define RK8602_VSEL1 0x07 + #define TCS4525_VSEL0 0x11 #define TCS4525_VSEL1 0x10 #define TCS4525_TIME 0x13 @@ -41,31 +44,32 @@ #define FAN53555_MONITOR 0x05 /* VSEL bit definitions */ -#define VSEL_BUCK_EN (1 << 7) -#define VSEL_MODE (1 << 6) +#define VSEL_BUCK_EN BIT(7) +#define VSEL_MODE BIT(6) /* Chip ID and Verison */ -#define DIE_ID 0x0F /* ID1 */ -#define DIE_REV 0x0F /* ID2 */ +#define DIE_ID 0x0F /* ID1 */ +#define DIE_REV 0x0F /* ID2 */ /* Control bit definitions */ -#define CTL_OUTPUT_DISCHG (1 << 7) -#define CTL_SLEW_MASK (0x7 << 4) -#define CTL_SLEW_SHIFT 4 -#define CTL_RESET (1 << 2) +#define CTL_OUTPUT_DISCHG BIT(7) +#define CTL_SLEW_MASK GENMASK(6, 4) +#define CTL_RESET BIT(2) #define CTL_MODE_VSEL0_MODE BIT(0) #define CTL_MODE_VSEL1_MODE BIT(1) #define FAN53555_NVOLTAGES 64 /* Numbers of voltages */ #define FAN53526_NVOLTAGES 128 +#define RK8602_NVOLTAGES 160 -#define TCS_VSEL0_MODE (1 << 7) -#define TCS_VSEL1_MODE (1 << 6) +#define TCS_VSEL0_MODE BIT(7) +#define TCS_VSEL1_MODE BIT(6) -#define TCS_SLEW_SHIFT 3 #define TCS_SLEW_MASK GENMASK(4, 3) enum fan53555_vendor { FAN53526_VENDOR_FAIRCHILD = 0, FAN53555_VENDOR_FAIRCHILD, + FAN53555_VENDOR_ROCKCHIP, /* RK8600, RK8601 */ + RK8602_VENDOR_ROCKCHIP, /* RK8602, RK8603 */ FAN53555_VENDOR_SILERGY, FAN53526_VENDOR_TCS, }; @@ -90,6 +94,14 @@ enum { }; enum { + RK8600_CHIP_ID_08 = 8, /* RK8600, RK8601 */ +}; + +enum { + RK8602_CHIP_ID_10 = 10, /* RK8602, RK8603 */ +}; + +enum { TCS4525_CHIP_ID_12 = 12, }; @@ -119,6 +131,8 @@ struct fan53555_device_info { /* Voltage setting register */ unsigned int vol_reg; unsigned int sleep_reg; + unsigned int en_reg; + unsigned int sleep_en_reg; /* Voltage range and step(linear) */ unsigned int vsel_min; unsigned int vsel_step; @@ -161,7 +175,7 @@ static int fan53555_set_suspend_enable(struct regulator_dev *rdev) { struct fan53555_device_info *di = rdev_get_drvdata(rdev); - return regmap_update_bits(rdev->regmap, di->sleep_reg, + return regmap_update_bits(rdev->regmap, di->sleep_en_reg, VSEL_BUCK_EN, VSEL_BUCK_EN); } @@ -169,7 +183,7 @@ static int fan53555_set_suspend_disable(struct regulator_dev *rdev) { struct fan53555_device_info *di = rdev_get_drvdata(rdev); - return regmap_update_bits(rdev->regmap, di->sleep_reg, + return regmap_update_bits(rdev->regmap, di->sleep_en_reg, VSEL_BUCK_EN, 0); } @@ -319,6 +333,50 @@ static int fan53555_voltages_setup_fairchild(struct fan53555_device_info *di) return 0; } +static int fan53555_voltages_setup_rockchip(struct fan53555_device_info *di) +{ + /* Init voltage range and step */ + switch (di->chip_id) { + case RK8600_CHIP_ID_08: + di->vsel_min = 712500; + di->vsel_step = 12500; + break; + default: + dev_err(di->dev, + "Chip ID %d not supported!\n", di->chip_id); + return -EINVAL; + } + di->slew_reg = FAN53555_CONTROL; + di->slew_mask = CTL_SLEW_MASK; + di->ramp_delay_table = slew_rates; + di->n_ramp_values = ARRAY_SIZE(slew_rates); + di->vsel_count = FAN53555_NVOLTAGES; + + return 0; +} + +static int rk8602_voltages_setup_rockchip(struct fan53555_device_info *di) +{ + /* Init voltage range and step */ + switch (di->chip_id) { + case RK8602_CHIP_ID_10: + di->vsel_min = 500000; + di->vsel_step = 6250; + break; + default: + dev_err(di->dev, + "Chip ID %d not supported!\n", di->chip_id); + return -EINVAL; + } + di->slew_reg = FAN53555_CONTROL; + di->slew_mask = CTL_SLEW_MASK; + di->ramp_delay_table = slew_rates; + di->n_ramp_values = ARRAY_SIZE(slew_rates); + di->vsel_count = RK8602_NVOLTAGES; + + return 0; +} + static int fan53555_voltages_setup_silergy(struct fan53555_device_info *di) { /* Init voltage range and step */ @@ -379,6 +437,7 @@ static int fan53555_device_setup(struct fan53555_device_info *di, switch (di->vendor) { case FAN53526_VENDOR_FAIRCHILD: case FAN53555_VENDOR_FAIRCHILD: + case FAN53555_VENDOR_ROCKCHIP: case FAN53555_VENDOR_SILERGY: switch (pdata->sleep_vsel_id) { case FAN53555_VSEL_ID_0: @@ -393,6 +452,27 @@ static int fan53555_device_setup(struct fan53555_device_info *di, dev_err(di->dev, "Invalid VSEL ID!\n"); return -EINVAL; } + di->sleep_en_reg = di->sleep_reg; + di->en_reg = di->vol_reg; + break; + case RK8602_VENDOR_ROCKCHIP: + switch (pdata->sleep_vsel_id) { + case FAN53555_VSEL_ID_0: + di->sleep_reg = RK8602_VSEL0; + di->vol_reg = RK8602_VSEL1; + di->sleep_en_reg = FAN53555_VSEL0; + di->en_reg = FAN53555_VSEL1; + break; + case FAN53555_VSEL_ID_1: + di->sleep_reg = RK8602_VSEL1; + di->vol_reg = RK8602_VSEL0; + di->sleep_en_reg = FAN53555_VSEL1; + di->en_reg = FAN53555_VSEL0; + break; + default: + dev_err(di->dev, "Invalid VSEL ID!\n"); + return -EINVAL; + } break; case FAN53526_VENDOR_TCS: switch (pdata->sleep_vsel_id) { @@ -408,6 +488,8 @@ static int fan53555_device_setup(struct fan53555_device_info *di, dev_err(di->dev, "Invalid VSEL ID!\n"); return -EINVAL; } + di->sleep_en_reg = di->sleep_reg; + di->en_reg = di->vol_reg; break; default: dev_err(di->dev, "vendor %d not supported!\n", di->vendor); @@ -429,10 +511,23 @@ static int fan53555_device_setup(struct fan53555_device_info *di, } break; case FAN53555_VENDOR_FAIRCHILD: + case FAN53555_VENDOR_ROCKCHIP: case FAN53555_VENDOR_SILERGY: di->mode_reg = di->vol_reg; di->mode_mask = VSEL_MODE; break; + case RK8602_VENDOR_ROCKCHIP: + di->mode_mask = VSEL_MODE; + + switch (pdata->sleep_vsel_id) { + case FAN53555_VSEL_ID_0: + di->mode_reg = FAN53555_VSEL1; + break; + case FAN53555_VSEL_ID_1: + di->mode_reg = FAN53555_VSEL0; + break; + } + break; case FAN53526_VENDOR_TCS: di->mode_reg = TCS4525_COMMAND; @@ -458,6 +553,12 @@ static int fan53555_device_setup(struct fan53555_device_info *di, case FAN53555_VENDOR_FAIRCHILD: ret = fan53555_voltages_setup_fairchild(di); break; + case FAN53555_VENDOR_ROCKCHIP: + ret = fan53555_voltages_setup_rockchip(di); + break; + case RK8602_VENDOR_ROCKCHIP: + ret = rk8602_voltages_setup_rockchip(di); + break; case FAN53555_VENDOR_SILERGY: ret = fan53555_voltages_setup_silergy(di); break; @@ -483,12 +584,12 @@ static int fan53555_regulator_register(struct fan53555_device_info *di, rdesc->ops = &fan53555_regulator_ops; rdesc->type = REGULATOR_VOLTAGE; rdesc->n_voltages = di->vsel_count; - rdesc->enable_reg = di->vol_reg; + rdesc->enable_reg = di->en_reg; rdesc->enable_mask = VSEL_BUCK_EN; rdesc->min_uV = di->vsel_min; rdesc->uV_step = di->vsel_step; rdesc->vsel_reg = di->vol_reg; - rdesc->vsel_mask = di->vsel_count - 1; + rdesc->vsel_mask = BIT(fls(di->vsel_count - 1)) - 1; rdesc->ramp_reg = di->slew_reg; rdesc->ramp_mask = di->slew_mask; rdesc->ramp_delay_table = di->ramp_delay_table; @@ -534,6 +635,12 @@ static const struct of_device_id __maybe_unused fan53555_dt_ids[] = { .compatible = "fcs,fan53555", .data = (void *)FAN53555_VENDOR_FAIRCHILD }, { + .compatible = "rockchip,rk8600", + .data = (void *)FAN53555_VENDOR_ROCKCHIP + }, { + .compatible = "rockchip,rk8602", + .data = (void *)RK8602_VENDOR_ROCKCHIP + }, { .compatible = "silergy,syr827", .data = (void *)FAN53555_VENDOR_SILERGY, }, { @@ -570,10 +677,9 @@ static int fan53555_regulator_probe(struct i2c_client *client) if (!pdata) pdata = fan53555_parse_dt(&client->dev, np, &di->desc); - if (!pdata || !pdata->regulator) { - dev_err(&client->dev, "Platform data not found!\n"); - return -ENODEV; - } + if (!pdata || !pdata->regulator) + return dev_err_probe(&client->dev, -ENODEV, + "Platform data not found!\n"); di->regulator = pdata->regulator; if (client->dev.of_node) { @@ -582,10 +688,9 @@ static int fan53555_regulator_probe(struct i2c_client *client) } else { /* if no ramp constraint set, get the pdata ramp_delay */ if (!di->regulator->constraints.ramp_delay) { - if (pdata->slew_rate >= ARRAY_SIZE(slew_rates)) { - dev_err(&client->dev, "Invalid slew_rate\n"); - return -EINVAL; - } + if (pdata->slew_rate >= ARRAY_SIZE(slew_rates)) + return dev_err_probe(&client->dev, -EINVAL, + "Invalid slew_rate\n"); di->regulator->constraints.ramp_delay = slew_rates[pdata->slew_rate]; @@ -595,34 +700,31 @@ static int fan53555_regulator_probe(struct i2c_client *client) } regmap = devm_regmap_init_i2c(client, &fan53555_regmap_config); - if (IS_ERR(regmap)) { - dev_err(&client->dev, "Failed to allocate regmap!\n"); - return PTR_ERR(regmap); - } + if (IS_ERR(regmap)) + return dev_err_probe(&client->dev, PTR_ERR(regmap), + "Failed to allocate regmap!\n"); + di->dev = &client->dev; i2c_set_clientdata(client, di); /* Get chip ID */ ret = regmap_read(regmap, FAN53555_ID1, &val); - if (ret < 0) { - dev_err(&client->dev, "Failed to get chip ID!\n"); - return ret; - } + if (ret < 0) + return dev_err_probe(&client->dev, ret, "Failed to get chip ID!\n"); + di->chip_id = val & DIE_ID; /* Get chip revision */ ret = regmap_read(regmap, FAN53555_ID2, &val); - if (ret < 0) { - dev_err(&client->dev, "Failed to get chip Rev!\n"); - return ret; - } + if (ret < 0) + return dev_err_probe(&client->dev, ret, "Failed to get chip Rev!\n"); + di->chip_rev = val & DIE_REV; dev_info(&client->dev, "FAN53555 Option[%d] Rev[%d] Detected!\n", di->chip_id, di->chip_rev); /* Device init */ ret = fan53555_device_setup(di, pdata); - if (ret < 0) { - dev_err(&client->dev, "Failed to setup device!\n"); - return ret; - } + if (ret < 0) + return dev_err_probe(&client->dev, ret, "Failed to setup device!\n"); + /* Register regulator */ config.dev = di->dev; config.init_data = di->regulator; @@ -632,9 +734,9 @@ static int fan53555_regulator_probe(struct i2c_client *client) ret = fan53555_regulator_register(di, &config); if (ret < 0) - dev_err(&client->dev, "Failed to register regulator!\n"); - return ret; + dev_err_probe(&client->dev, ret, "Failed to register regulator!\n"); + return ret; } static const struct i2c_device_id fan53555_id[] = { @@ -645,6 +747,12 @@ static const struct i2c_device_id fan53555_id[] = { .name = "fan53555", .driver_data = FAN53555_VENDOR_FAIRCHILD }, { + .name = "rk8600", + .driver_data = FAN53555_VENDOR_ROCKCHIP + }, { + .name = "rk8602", + .driver_data = RK8602_VENDOR_ROCKCHIP + }, { .name = "syr827", .driver_data = FAN53555_VENDOR_SILERGY }, { @@ -664,6 +772,7 @@ MODULE_DEVICE_TABLE(i2c, fan53555_id); static struct i2c_driver fan53555_regulator_driver = { .driver = { .name = "fan53555-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(fan53555_dt_ids), }, .probe_new = fan53555_regulator_probe, diff --git a/drivers/regulator/fan53880.c b/drivers/regulator/fan53880.c index 1d88d5381544..a3bebdee570e 100644 --- a/drivers/regulator/fan53880.c +++ b/drivers/regulator/fan53880.c @@ -172,6 +172,7 @@ MODULE_DEVICE_TABLE(i2c, fan53880_i2c_id); static struct i2c_driver fan53880_regulator_driver = { .driver = { .name = "fan53880", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = fan53880_dt_ids, }, .probe_new = fan53880_i2c_probe, diff --git a/drivers/regulator/fixed.c b/drivers/regulator/fixed.c index e6724a229d23..364d1a2683b7 100644 --- a/drivers/regulator/fixed.c +++ b/drivers/regulator/fixed.c @@ -151,7 +151,7 @@ of_get_fixed_voltage_config(struct device *dev, of_property_read_u32(np, "startup-delay-us", &config->startup_delay); of_property_read_u32(np, "off-on-delay-us", &config->off_on_delay); - if (of_find_property(np, "vin-supply", NULL)) + if (of_property_present(np, "vin-supply")) config->input_supply = "vin"; return config; @@ -334,6 +334,7 @@ static struct platform_driver regulator_fixed_voltage_driver = { .probe = reg_fixed_voltage_probe, .driver = { .name = "reg-fixed-voltage", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(fixed_of_match), }, }; diff --git a/drivers/regulator/gpio-regulator.c b/drivers/regulator/gpio-regulator.c index 95e61a2f43f5..65927fa2ef16 100644 --- a/drivers/regulator/gpio-regulator.c +++ b/drivers/regulator/gpio-regulator.c @@ -220,7 +220,7 @@ of_get_gpio_regulator_config(struct device *dev, struct device_node *np, regtype); } - if (of_find_property(np, "vin-supply", NULL)) + if (of_property_present(np, "vin-supply")) config->input_supply = "vin"; return config; @@ -368,6 +368,7 @@ static struct platform_driver gpio_regulator_driver = { .probe = gpio_regulator_probe, .driver = { .name = "gpio-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(regulator_gpio_of_match), }, }; diff --git a/drivers/regulator/hi6421-regulator.c b/drivers/regulator/hi6421-regulator.c index d144a4bdb76d..1b52423598d3 100644 --- a/drivers/regulator/hi6421-regulator.c +++ b/drivers/regulator/hi6421-regulator.c @@ -579,6 +579,7 @@ static struct platform_driver hi6421_regulator_driver = { .id_table = hi6421_regulator_table, .driver = { .name = "hi6421-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = hi6421_regulator_probe, }; diff --git a/drivers/regulator/hi6421v530-regulator.c b/drivers/regulator/hi6421v530-regulator.c index 988115f9b594..23924ff0c7b2 100644 --- a/drivers/regulator/hi6421v530-regulator.c +++ b/drivers/regulator/hi6421v530-regulator.c @@ -200,6 +200,7 @@ static struct platform_driver hi6421v530_regulator_driver = { .id_table = hi6421v530_regulator_table, .driver = { .name = "hi6421v530-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = hi6421v530_regulator_probe, }; diff --git a/drivers/regulator/hi6421v600-regulator.c b/drivers/regulator/hi6421v600-regulator.c index 4671678f6b19..4e10daa1e689 100644 --- a/drivers/regulator/hi6421v600-regulator.c +++ b/drivers/regulator/hi6421v600-regulator.c @@ -284,6 +284,7 @@ static struct platform_driver hi6421_spmi_regulator_driver = { .id_table = hi6421_spmi_regulator_table, .driver = { .name = "hi6421v600-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = hi6421_spmi_regulator_probe, }; diff --git a/drivers/regulator/hi655x-regulator.c b/drivers/regulator/hi655x-regulator.c index 556bb73f3329..1d8211f635b7 100644 --- a/drivers/regulator/hi655x-regulator.c +++ b/drivers/regulator/hi655x-regulator.c @@ -206,6 +206,7 @@ static struct platform_driver hi655x_regulator_driver = { .id_table = hi655x_regulator_table, .driver = { .name = "hi655x-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = hi655x_regulator_probe, }; diff --git a/drivers/regulator/isl6271a-regulator.c b/drivers/regulator/isl6271a-regulator.c index b23b052eab10..3c37c4de1d82 100644 --- a/drivers/regulator/isl6271a-regulator.c +++ b/drivers/regulator/isl6271a-regulator.c @@ -147,6 +147,7 @@ MODULE_DEVICE_TABLE(i2c, isl6271a_id); static struct i2c_driver isl6271a_i2c_driver = { .driver = { .name = "isl6271a", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe_new = isl6271a_probe, .id_table = isl6271a_id, diff --git a/drivers/regulator/isl9305.c b/drivers/regulator/isl9305.c index cfb765986d0d..90bc8d054304 100644 --- a/drivers/regulator/isl9305.c +++ b/drivers/regulator/isl9305.c @@ -195,6 +195,7 @@ MODULE_DEVICE_TABLE(i2c, isl9305_i2c_id); static struct i2c_driver isl9305_regulator_driver = { .driver = { .name = "isl9305", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(isl9305_dt_ids), }, .probe_new = isl9305_i2c_probe, diff --git a/drivers/regulator/lm363x-regulator.c b/drivers/regulator/lm363x-regulator.c index 4b9f618b07e9..7531b2c37f95 100644 --- a/drivers/regulator/lm363x-regulator.c +++ b/drivers/regulator/lm363x-regulator.c @@ -355,6 +355,7 @@ static struct platform_driver lm363x_regulator_driver = { .probe = lm363x_regulator_probe, .driver = { .name = "lm363x-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, }; diff --git a/drivers/regulator/lochnagar-regulator.c b/drivers/regulator/lochnagar-regulator.c index cb71fa5f43c3..11b358efbc92 100644 --- a/drivers/regulator/lochnagar-regulator.c +++ b/drivers/regulator/lochnagar-regulator.c @@ -272,6 +272,7 @@ static int lochnagar_regulator_probe(struct platform_device *pdev) static struct platform_driver lochnagar_regulator_driver = { .driver = { .name = "lochnagar-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(lochnagar_of_match), }, diff --git a/drivers/regulator/lp3971.c b/drivers/regulator/lp3971.c index 8be252f81b09..e06f2a092b89 100644 --- a/drivers/regulator/lp3971.c +++ b/drivers/regulator/lp3971.c @@ -447,6 +447,7 @@ MODULE_DEVICE_TABLE(i2c, lp3971_i2c_id); static struct i2c_driver lp3971_i2c_driver = { .driver = { .name = "LP3971", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe_new = lp3971_i2c_probe, .id_table = lp3971_i2c_id, diff --git a/drivers/regulator/lp3972.c b/drivers/regulator/lp3972.c index 27b216bf18fc..edacca8e14af 100644 --- a/drivers/regulator/lp3972.c +++ b/drivers/regulator/lp3972.c @@ -545,6 +545,7 @@ MODULE_DEVICE_TABLE(i2c, lp3972_i2c_id); static struct i2c_driver lp3972_i2c_driver = { .driver = { .name = "lp3972", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe_new = lp3972_i2c_probe, .id_table = lp3972_i2c_id, diff --git a/drivers/regulator/lp872x.c b/drivers/regulator/lp872x.c index c576894c3d52..a8b0969d4f31 100644 --- a/drivers/regulator/lp872x.c +++ b/drivers/regulator/lp872x.c @@ -832,8 +832,7 @@ static struct lp872x_platform_data return ERR_PTR(-ENOMEM); of_property_read_u8(np, "ti,general-config", &pdata->general_config); - if (of_find_property(np, "ti,update-config", NULL)) - pdata->update_config = true; + pdata->update_config = of_property_read_bool(np, "ti,update-config"); pdata->dvs = devm_kzalloc(dev, sizeof(struct lp872x_dvs), GFP_KERNEL); if (!pdata->dvs) @@ -928,7 +927,7 @@ static int lp872x_probe(struct i2c_client *cl) return lp872x_regulator_register(lp); } -static const struct of_device_id lp872x_dt_ids[] = { +static const struct of_device_id lp872x_dt_ids[] __maybe_unused = { { .compatible = "ti,lp8720", }, { .compatible = "ti,lp8725", }, { } @@ -945,6 +944,7 @@ MODULE_DEVICE_TABLE(i2c, lp872x_ids); static struct i2c_driver lp872x_driver = { .driver = { .name = "lp872x", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(lp872x_dt_ids), }, .probe_new = lp872x_probe, diff --git a/drivers/regulator/lp873x-regulator.c b/drivers/regulator/lp873x-regulator.c index d6e597922cb5..8dfdd1db2070 100644 --- a/drivers/regulator/lp873x-regulator.c +++ b/drivers/regulator/lp873x-regulator.c @@ -187,6 +187,7 @@ MODULE_DEVICE_TABLE(platform, lp873x_regulator_id_table); static struct platform_driver lp873x_regulator_driver = { .driver = { .name = "lp873x-pmic", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = lp873x_regulator_probe, .id_table = lp873x_regulator_id_table, diff --git a/drivers/regulator/lp8755.c b/drivers/regulator/lp8755.c index 467dfdcebc91..37b51b94fb5a 100644 --- a/drivers/regulator/lp8755.c +++ b/drivers/regulator/lp8755.c @@ -440,6 +440,7 @@ MODULE_DEVICE_TABLE(i2c, lp8755_id); static struct i2c_driver lp8755_i2c_driver = { .driver = { .name = LP8755_NAME, + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe_new = lp8755_probe, .remove = lp8755_remove, diff --git a/drivers/regulator/lp87565-regulator.c b/drivers/regulator/lp87565-regulator.c index d059ae85047a..bdb60d8a7f3d 100644 --- a/drivers/regulator/lp87565-regulator.c +++ b/drivers/regulator/lp87565-regulator.c @@ -237,6 +237,7 @@ MODULE_DEVICE_TABLE(platform, lp87565_regulator_id_table); static struct platform_driver lp87565_regulator_driver = { .driver = { .name = "lp87565-pmic", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = lp87565_regulator_probe, .id_table = lp87565_regulator_id_table, diff --git a/drivers/regulator/lp8788-buck.c b/drivers/regulator/lp8788-buck.c index 74b7b496b12d..e97ade09dede 100644 --- a/drivers/regulator/lp8788-buck.c +++ b/drivers/regulator/lp8788-buck.c @@ -531,6 +531,7 @@ static struct platform_driver lp8788_buck_driver = { .probe = lp8788_buck_probe, .driver = { .name = LP8788_DEV_BUCK, + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, }; diff --git a/drivers/regulator/lp8788-ldo.c b/drivers/regulator/lp8788-ldo.c index 00e9bb92c326..8e45b7b99556 100644 --- a/drivers/regulator/lp8788-ldo.c +++ b/drivers/regulator/lp8788-ldo.c @@ -564,6 +564,7 @@ static struct platform_driver lp8788_dldo_driver = { .probe = lp8788_dldo_probe, .driver = { .name = LP8788_DEV_DLDO, + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, }; @@ -611,6 +612,7 @@ static struct platform_driver lp8788_aldo_driver = { .probe = lp8788_aldo_probe, .driver = { .name = LP8788_DEV_ALDO, + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, }; diff --git a/drivers/regulator/ltc3589.c b/drivers/regulator/ltc3589.c index 460d34c50fb0..359b534d8c70 100644 --- a/drivers/regulator/ltc3589.c +++ b/drivers/regulator/ltc3589.c @@ -474,6 +474,7 @@ MODULE_DEVICE_TABLE(of, ltc3589_of_match); static struct i2c_driver ltc3589_driver = { .driver = { .name = DRIVER_NAME, + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(ltc3589_of_match), }, .probe_new = ltc3589_probe, diff --git a/drivers/regulator/ltc3676.c b/drivers/regulator/ltc3676.c index eb3d6bed6d54..a28e6c3460f1 100644 --- a/drivers/regulator/ltc3676.c +++ b/drivers/regulator/ltc3676.c @@ -371,6 +371,7 @@ MODULE_DEVICE_TABLE(of, ltc3676_of_match); static struct i2c_driver ltc3676_driver = { .driver = { .name = DRIVER_NAME, + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(ltc3676_of_match), }, .probe_new = ltc3676_regulator_probe, diff --git a/drivers/regulator/max14577-regulator.c b/drivers/regulator/max14577-regulator.c index e34face736f4..5e7171b9065a 100644 --- a/drivers/regulator/max14577-regulator.c +++ b/drivers/regulator/max14577-regulator.c @@ -241,6 +241,7 @@ MODULE_DEVICE_TABLE(platform, max14577_regulator_id); static struct platform_driver max14577_regulator_driver = { .driver = { .name = "max14577-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = max14577_regulator_probe, .id_table = max14577_regulator_id, diff --git a/drivers/regulator/max1586.c b/drivers/regulator/max1586.c index a00aa2e8ff3f..5d8852b2c168 100644 --- a/drivers/regulator/max1586.c +++ b/drivers/regulator/max1586.c @@ -292,6 +292,7 @@ static struct i2c_driver max1586_pmic_driver = { .probe_new = max1586_pmic_probe, .driver = { .name = "max1586", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(max1586_of_match), }, .id_table = max1586_id, diff --git a/drivers/regulator/max20086-regulator.c b/drivers/regulator/max20086-regulator.c index b8bf76c170fe..ace1d582a191 100644 --- a/drivers/regulator/max20086-regulator.c +++ b/drivers/regulator/max20086-regulator.c @@ -286,7 +286,7 @@ static const struct i2c_device_id max20086_i2c_id[] = { MODULE_DEVICE_TABLE(i2c, max20086_i2c_id); -static const struct of_device_id max20086_dt_ids[] = { +static const struct of_device_id max20086_dt_ids[] __maybe_unused = { { .compatible = "maxim,max20086", .data = &(const struct max20086_chip_info) { @@ -320,6 +320,7 @@ MODULE_DEVICE_TABLE(of, max20086_dt_ids); static struct i2c_driver max20086_regulator_driver = { .driver = { .name = "max20086", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(max20086_dt_ids), }, .probe_new = max20086_i2c_probe, diff --git a/drivers/regulator/max20411-regulator.c b/drivers/regulator/max20411-regulator.c index 83dacb4ff173..be8169b86a89 100644 --- a/drivers/regulator/max20411-regulator.c +++ b/drivers/regulator/max20411-regulator.c @@ -153,6 +153,7 @@ MODULE_DEVICE_TABLE(i2c, max20411_id); static struct i2c_driver max20411_i2c_driver = { .driver = { .name = "max20411", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_max20411_match_tbl, }, .probe_new = max20411_probe, diff --git a/drivers/regulator/max597x-regulator.c b/drivers/regulator/max597x-regulator.c index 648e3641885a..7873a5267555 100644 --- a/drivers/regulator/max597x-regulator.c +++ b/drivers/regulator/max597x-regulator.c @@ -501,6 +501,7 @@ static int max597x_regulator_probe(struct platform_device *pdev) static struct platform_driver max597x_regulator_driver = { .driver = { .name = "max597x-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = max597x_regulator_probe, }; diff --git a/drivers/regulator/max77620-regulator.c b/drivers/regulator/max77620-regulator.c index 3cf8f085170a..7bc87d8e9f68 100644 --- a/drivers/regulator/max77620-regulator.c +++ b/drivers/regulator/max77620-regulator.c @@ -916,6 +916,7 @@ static struct platform_driver max77620_regulator_driver = { .id_table = max77620_regulator_devtype, .driver = { .name = "max77620-pmic", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .pm = &max77620_regulator_pm_ops, }, }; diff --git a/drivers/regulator/max77650-regulator.c b/drivers/regulator/max77650-regulator.c index ca08f94a368d..f6539b945037 100644 --- a/drivers/regulator/max77650-regulator.c +++ b/drivers/regulator/max77650-regulator.c @@ -395,6 +395,7 @@ MODULE_DEVICE_TABLE(of, max77650_regulator_of_match); static struct platform_driver max77650_regulator_driver = { .driver = { .name = "max77650-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = max77650_regulator_of_match, }, .probe = max77650_regulator_probe, diff --git a/drivers/regulator/max77686-regulator.c b/drivers/regulator/max77686-regulator.c index 55a07d3f3ee2..c7b270fd9e0c 100644 --- a/drivers/regulator/max77686-regulator.c +++ b/drivers/regulator/max77686-regulator.c @@ -525,6 +525,7 @@ MODULE_DEVICE_TABLE(platform, max77686_pmic_id); static struct platform_driver max77686_pmic_driver = { .driver = { .name = "max77686-pmic", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = max77686_pmic_probe, .id_table = max77686_pmic_id, diff --git a/drivers/regulator/max77693-regulator.c b/drivers/regulator/max77693-regulator.c index 077ecbbfdf76..72a67d0c5f1e 100644 --- a/drivers/regulator/max77693-regulator.c +++ b/drivers/regulator/max77693-regulator.c @@ -281,6 +281,7 @@ MODULE_DEVICE_TABLE(platform, max77693_pmic_id); static struct platform_driver max77693_pmic_driver = { .driver = { .name = "max77693-pmic", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = max77693_pmic_probe, .id_table = max77693_pmic_id, diff --git a/drivers/regulator/max77802-regulator.c b/drivers/regulator/max77802-regulator.c index befe5f319819..69eb6abd2551 100644 --- a/drivers/regulator/max77802-regulator.c +++ b/drivers/regulator/max77802-regulator.c @@ -554,6 +554,7 @@ MODULE_DEVICE_TABLE(platform, max77802_pmic_id); static struct platform_driver max77802_pmic_driver = { .driver = { .name = "max77802-pmic", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = max77802_pmic_probe, .id_table = max77802_pmic_id, diff --git a/drivers/regulator/max77826-regulator.c b/drivers/regulator/max77826-regulator.c index f9e2e884ff54..ea5d4b18b464 100644 --- a/drivers/regulator/max77826-regulator.c +++ b/drivers/regulator/max77826-regulator.c @@ -289,6 +289,7 @@ MODULE_DEVICE_TABLE(i2c, max77826_id); static struct i2c_driver max77826_regulator_driver = { .driver = { .name = "max77826", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(max77826_of_match), }, .probe_new = max77826_i2c_probe, diff --git a/drivers/regulator/max8649.c b/drivers/regulator/max8649.c index aed5443d88e1..a517fb4e3669 100644 --- a/drivers/regulator/max8649.c +++ b/drivers/regulator/max8649.c @@ -249,6 +249,7 @@ static struct i2c_driver max8649_driver = { .probe_new = max8649_regulator_probe, .driver = { .name = "max8649", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .id_table = max8649_id, }; diff --git a/drivers/regulator/max8660.c b/drivers/regulator/max8660.c index 711623be8eb5..d6b89f07ae9e 100644 --- a/drivers/regulator/max8660.c +++ b/drivers/regulator/max8660.c @@ -506,6 +506,7 @@ static struct i2c_driver max8660_driver = { .probe_new = max8660_probe, .driver = { .name = "max8660", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .id_table = max8660_id, }; diff --git a/drivers/regulator/max8893.c b/drivers/regulator/max8893.c index 1519bf760da7..10ffd77828b7 100644 --- a/drivers/regulator/max8893.c +++ b/drivers/regulator/max8893.c @@ -171,6 +171,7 @@ static struct i2c_driver max8893_driver = { .probe_new = max8893_probe_new, .driver = { .name = "max8893", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(max8893_dt_match), }, .id_table = max8893_ids, diff --git a/drivers/regulator/max8907-regulator.c b/drivers/regulator/max8907-regulator.c index 1a6fd68f3fb1..e59aa7a3ee54 100644 --- a/drivers/regulator/max8907-regulator.c +++ b/drivers/regulator/max8907-regulator.c @@ -372,6 +372,7 @@ static int max8907_regulator_probe(struct platform_device *pdev) static struct platform_driver max8907_regulator_driver = { .driver = { .name = "max8907-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = max8907_regulator_probe, }; diff --git a/drivers/regulator/max8925-regulator.c b/drivers/regulator/max8925-regulator.c index d953b6b0db77..c1532db0a4ee 100644 --- a/drivers/regulator/max8925-regulator.c +++ b/drivers/regulator/max8925-regulator.c @@ -263,6 +263,7 @@ static int max8925_regulator_probe(struct platform_device *pdev) static struct platform_driver max8925_regulator_driver = { .driver = { .name = "max8925-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = max8925_regulator_probe, }; diff --git a/drivers/regulator/max8952.c b/drivers/regulator/max8952.c index 360a33ecc093..8ad8fe7fd263 100644 --- a/drivers/regulator/max8952.c +++ b/drivers/regulator/max8952.c @@ -316,6 +316,7 @@ static struct i2c_driver max8952_pmic_driver = { .probe_new = max8952_pmic_probe, .driver = { .name = "max8952", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(max8952_dt_match), }, .id_table = max8952_ids, diff --git a/drivers/regulator/max8973-regulator.c b/drivers/regulator/max8973-regulator.c index 7e00a45db26a..e6dc3d40da3d 100644 --- a/drivers/regulator/max8973-regulator.c +++ b/drivers/regulator/max8973-regulator.c @@ -804,6 +804,7 @@ MODULE_DEVICE_TABLE(i2c, max8973_id); static struct i2c_driver max8973_i2c_driver = { .driver = { .name = "max8973", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_max8973_match_tbl, }, .probe_new = max8973_probe, diff --git a/drivers/regulator/max8997-regulator.c b/drivers/regulator/max8997-regulator.c index ba47a5e2fbcb..0b38eaa73597 100644 --- a/drivers/regulator/max8997-regulator.c +++ b/drivers/regulator/max8997-regulator.c @@ -943,14 +943,9 @@ static int max8997_pmic_dt_parse_pdata(struct platform_device *pdev, } of_node_put(regulators_np); - if (of_get_property(pmic_np, "max8997,pmic-buck1-uses-gpio-dvs", NULL)) - pdata->buck1_gpiodvs = true; - - if (of_get_property(pmic_np, "max8997,pmic-buck2-uses-gpio-dvs", NULL)) - pdata->buck2_gpiodvs = true; - - if (of_get_property(pmic_np, "max8997,pmic-buck5-uses-gpio-dvs", NULL)) - pdata->buck5_gpiodvs = true; + pdata->buck1_gpiodvs = of_property_read_bool(pmic_np, "max8997,pmic-buck1-uses-gpio-dvs"); + pdata->buck2_gpiodvs = of_property_read_bool(pmic_np, "max8997,pmic-buck2-uses-gpio-dvs"); + pdata->buck5_gpiodvs = of_property_read_bool(pmic_np, "max8997,pmic-buck5-uses-gpio-dvs"); if (pdata->buck1_gpiodvs || pdata->buck2_gpiodvs || pdata->buck5_gpiodvs) { @@ -1202,6 +1197,7 @@ MODULE_DEVICE_TABLE(platform, max8997_pmic_id); static struct platform_driver max8997_pmic_driver = { .driver = { .name = "max8997-pmic", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = max8997_pmic_probe, .id_table = max8997_pmic_id, diff --git a/drivers/regulator/max8998.c b/drivers/regulator/max8998.c index ac69bdd398cb..fadb4717384a 100644 --- a/drivers/regulator/max8998.c +++ b/drivers/regulator/max8998.c @@ -618,8 +618,7 @@ static int max8998_pmic_dt_parse_pdata(struct max8998_dev *iodev, if (ret) return -EINVAL; - if (of_find_property(pmic_np, "max8998,pmic-buck-voltage-lock", NULL)) - pdata->buck_voltage_lock = true; + pdata->buck_voltage_lock = of_property_read_bool(pmic_np, "max8998,pmic-buck-voltage-lock"); ret = of_property_read_u32(pmic_np, "max8998,pmic-buck1-default-dvs-idx", @@ -804,6 +803,7 @@ MODULE_DEVICE_TABLE(platform, max8998_pmic_id); static struct platform_driver max8998_pmic_driver = { .driver = { .name = "max8998-pmic", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = max8998_pmic_probe, .id_table = max8998_pmic_id, diff --git a/drivers/regulator/mc13783-regulator.c b/drivers/regulator/mc13783-regulator.c index ab558b26cd7c..fb3aa1cec1f2 100644 --- a/drivers/regulator/mc13783-regulator.c +++ b/drivers/regulator/mc13783-regulator.c @@ -455,6 +455,7 @@ static int mc13783_regulator_probe(struct platform_device *pdev) static struct platform_driver mc13783_regulator_driver = { .driver = { .name = "mc13783-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = mc13783_regulator_probe, }; diff --git a/drivers/regulator/mc13892-regulator.c b/drivers/regulator/mc13892-regulator.c index 5221f7a9df91..b29cf6ba6f12 100644 --- a/drivers/regulator/mc13892-regulator.c +++ b/drivers/regulator/mc13892-regulator.c @@ -629,6 +629,7 @@ err_unlock: static struct platform_driver mc13892_regulator_driver = { .driver = { .name = "mc13892-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = mc13892_regulator_probe, }; diff --git a/drivers/regulator/mcp16502.c b/drivers/regulator/mcp16502.c index abee1b09008d..3a6d79556942 100644 --- a/drivers/regulator/mcp16502.c +++ b/drivers/regulator/mcp16502.c @@ -587,6 +587,7 @@ static struct i2c_driver mcp16502_drv = { .probe_new = mcp16502_probe, .driver = { .name = "mcp16502-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(mcp16502_ids), #ifdef CONFIG_PM .pm = &mcp16502_pm_ops, diff --git a/drivers/regulator/mp5416.c b/drivers/regulator/mp5416.c index 82892d71c2c9..91e9019430b8 100644 --- a/drivers/regulator/mp5416.c +++ b/drivers/regulator/mp5416.c @@ -237,6 +237,7 @@ MODULE_DEVICE_TABLE(i2c, mp5416_id); static struct i2c_driver mp5416_regulator_driver = { .driver = { .name = "mp5416", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(mp5416_of_match), }, .probe_new = mp5416_i2c_probe, diff --git a/drivers/regulator/mp8859.c b/drivers/regulator/mp8859.c index f2300714d5a9..b968a682f38a 100644 --- a/drivers/regulator/mp8859.c +++ b/drivers/regulator/mp8859.c @@ -129,7 +129,7 @@ static int mp8859_i2c_probe(struct i2c_client *i2c) return 0; } -static const struct of_device_id mp8859_dt_id[] = { +static const struct of_device_id mp8859_dt_id[] __maybe_unused = { {.compatible = "mps,mp8859"}, {}, }; @@ -144,6 +144,7 @@ MODULE_DEVICE_TABLE(i2c, mp8859_i2c_id); static struct i2c_driver mp8859_regulator_driver = { .driver = { .name = "mp8859", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(mp8859_dt_id), }, .probe_new = mp8859_i2c_probe, diff --git a/drivers/regulator/mp886x.c b/drivers/regulator/mp886x.c index 6a0c94c15027..250c27e462f1 100644 --- a/drivers/regulator/mp886x.c +++ b/drivers/regulator/mp886x.c @@ -362,6 +362,7 @@ MODULE_DEVICE_TABLE(i2c, mp886x_id); static struct i2c_driver mp886x_regulator_driver = { .driver = { .name = "mp886x-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = mp886x_dt_ids, }, .probe_new = mp886x_i2c_probe, diff --git a/drivers/regulator/mpq7920.c b/drivers/regulator/mpq7920.c index 54c862edf571..544d41b88514 100644 --- a/drivers/regulator/mpq7920.c +++ b/drivers/regulator/mpq7920.c @@ -318,6 +318,7 @@ MODULE_DEVICE_TABLE(i2c, mpq7920_id); static struct i2c_driver mpq7920_regulator_driver = { .driver = { .name = "mpq7920", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(mpq7920_of_match), }, .probe_new = mpq7920_i2c_probe, diff --git a/drivers/regulator/mt6311-regulator.c b/drivers/regulator/mt6311-regulator.c index 69e6af3cd505..a9f0c9f725d4 100644 --- a/drivers/regulator/mt6311-regulator.c +++ b/drivers/regulator/mt6311-regulator.c @@ -151,6 +151,7 @@ MODULE_DEVICE_TABLE(of, mt6311_dt_ids); static struct i2c_driver mt6311_regulator_driver = { .driver = { .name = "mt6311", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(mt6311_dt_ids), }, .probe_new = mt6311_i2c_probe, diff --git a/drivers/regulator/mt6315-regulator.c b/drivers/regulator/mt6315-regulator.c index 284c229e1aa4..8047081ea2f7 100644 --- a/drivers/regulator/mt6315-regulator.c +++ b/drivers/regulator/mt6315-regulator.c @@ -287,6 +287,7 @@ static void mt6315_regulator_shutdown(struct spmi_device *pdev) static struct spmi_driver mt6315_regulator_driver = { .driver = { .name = "mt6315-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = mt6315_of_match, }, .probe = mt6315_regulator_probe, diff --git a/drivers/regulator/mt6323-regulator.c b/drivers/regulator/mt6323-regulator.c index ff9016170db3..b43da848a06e 100644 --- a/drivers/regulator/mt6323-regulator.c +++ b/drivers/regulator/mt6323-regulator.c @@ -409,6 +409,7 @@ MODULE_DEVICE_TABLE(platform, mt6323_platform_ids); static struct platform_driver mt6323_regulator_driver = { .driver = { .name = "mt6323-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = mt6323_regulator_probe, .id_table = mt6323_platform_ids, diff --git a/drivers/regulator/mt6331-regulator.c b/drivers/regulator/mt6331-regulator.c index 56be9a3a84ab..0059f88c6fd7 100644 --- a/drivers/regulator/mt6331-regulator.c +++ b/drivers/regulator/mt6331-regulator.c @@ -495,6 +495,7 @@ MODULE_DEVICE_TABLE(platform, mt6331_platform_ids); static struct platform_driver mt6331_regulator_driver = { .driver = { .name = "mt6331-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = mt6331_regulator_probe, .id_table = mt6331_platform_ids, diff --git a/drivers/regulator/mt6332-regulator.c b/drivers/regulator/mt6332-regulator.c index 77a27d8127a3..8d8331a2aca5 100644 --- a/drivers/regulator/mt6332-regulator.c +++ b/drivers/regulator/mt6332-regulator.c @@ -410,6 +410,7 @@ MODULE_DEVICE_TABLE(platform, mt6332_platform_ids); static struct platform_driver mt6332_regulator_driver = { .driver = { .name = "mt6332-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = mt6332_regulator_probe, .id_table = mt6332_platform_ids, diff --git a/drivers/regulator/mt6357-regulator.c b/drivers/regulator/mt6357-regulator.c index b2352b96aed2..c0439a4e0b50 100644 --- a/drivers/regulator/mt6357-regulator.c +++ b/drivers/regulator/mt6357-regulator.c @@ -439,6 +439,7 @@ MODULE_DEVICE_TABLE(platform, mt6357_platform_ids); static struct platform_driver mt6357_regulator_driver = { .driver = { .name = "mt6357-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = mt6357_regulator_probe, .id_table = mt6357_platform_ids, diff --git a/drivers/regulator/mt6358-regulator.c b/drivers/regulator/mt6358-regulator.c index 8a5ce990f1bf..c9e16bd092f6 100644 --- a/drivers/regulator/mt6358-regulator.c +++ b/drivers/regulator/mt6358-regulator.c @@ -733,6 +733,7 @@ MODULE_DEVICE_TABLE(platform, mt6358_platform_ids); static struct platform_driver mt6358_regulator_driver = { .driver = { .name = "mt6358-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = mt6358_regulator_probe, .id_table = mt6358_platform_ids, diff --git a/drivers/regulator/mt6359-regulator.c b/drivers/regulator/mt6359-regulator.c index de3b0462832c..1849566784ab 100644 --- a/drivers/regulator/mt6359-regulator.c +++ b/drivers/regulator/mt6359-regulator.c @@ -982,6 +982,7 @@ MODULE_DEVICE_TABLE(platform, mt6359_platform_ids); static struct platform_driver mt6359_regulator_driver = { .driver = { .name = "mt6359-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = mt6359_regulator_probe, .id_table = mt6359_platform_ids, diff --git a/drivers/regulator/mt6360-regulator.c b/drivers/regulator/mt6360-regulator.c index 4d34be94d166..ad6587a378d0 100644 --- a/drivers/regulator/mt6360-regulator.c +++ b/drivers/regulator/mt6360-regulator.c @@ -446,6 +446,7 @@ MODULE_DEVICE_TABLE(platform, mt6360_regulator_id_table); static struct platform_driver mt6360_regulator_driver = { .driver = { .name = "mt6360-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = mt6360_regulator_probe, .id_table = mt6360_regulator_id_table, diff --git a/drivers/regulator/mt6370-regulator.c b/drivers/regulator/mt6370-regulator.c index e73f5a46cb9a..27cb32b726e0 100644 --- a/drivers/regulator/mt6370-regulator.c +++ b/drivers/regulator/mt6370-regulator.c @@ -379,6 +379,7 @@ MODULE_DEVICE_TABLE(platform, mt6370_devid_table); static struct platform_driver mt6370_regulator_driver = { .driver = { .name = "mt6370-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .id_table = mt6370_devid_table, .probe = mt6370_regulator_probe, diff --git a/drivers/regulator/mt6380-regulator.c b/drivers/regulator/mt6380-regulator.c index 43234296df36..83e50df7f7c3 100644 --- a/drivers/regulator/mt6380-regulator.c +++ b/drivers/regulator/mt6380-regulator.c @@ -328,6 +328,7 @@ MODULE_DEVICE_TABLE(of, mt6380_of_match); static struct platform_driver mt6380_regulator_driver = { .driver = { .name = "mt6380-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(mt6380_of_match), }, .probe = mt6380_regulator_probe, diff --git a/drivers/regulator/mt6397-regulator.c b/drivers/regulator/mt6397-regulator.c index b9bf7ade1f8a..92a2d92f84f9 100644 --- a/drivers/regulator/mt6397-regulator.c +++ b/drivers/regulator/mt6397-regulator.c @@ -397,7 +397,7 @@ static const struct platform_device_id mt6397_platform_ids[] = { }; MODULE_DEVICE_TABLE(platform, mt6397_platform_ids); -static const struct of_device_id mt6397_of_match[] = { +static const struct of_device_id mt6397_of_match[] __maybe_unused = { { .compatible = "mediatek,mt6397-regulator", }, { /* sentinel */ }, }; @@ -406,6 +406,7 @@ MODULE_DEVICE_TABLE(of, mt6397_of_match); static struct platform_driver mt6397_regulator_driver = { .driver = { .name = "mt6397-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(mt6397_of_match), }, .probe = mt6397_regulator_probe, diff --git a/drivers/regulator/mtk-dvfsrc-regulator.c b/drivers/regulator/mtk-dvfsrc-regulator.c index 234af3a66c77..efca67207a5a 100644 --- a/drivers/regulator/mtk-dvfsrc-regulator.c +++ b/drivers/regulator/mtk-dvfsrc-regulator.c @@ -194,6 +194,7 @@ static int dvfsrc_vcore_regulator_probe(struct platform_device *pdev) static struct platform_driver mtk_dvfsrc_regulator_driver = { .driver = { .name = "mtk-dvfsrc-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = dvfsrc_vcore_regulator_probe, }; diff --git a/drivers/regulator/palmas-regulator.c b/drivers/regulator/palmas-regulator.c index 337dd614695e..076966366b60 100644 --- a/drivers/regulator/palmas-regulator.c +++ b/drivers/regulator/palmas-regulator.c @@ -1666,6 +1666,7 @@ static int palmas_regulators_probe(struct platform_device *pdev) static struct platform_driver palmas_driver = { .driver = { .name = "palmas-pmic", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_palmas_match_tbl, }, .probe = palmas_regulators_probe, diff --git a/drivers/regulator/pbias-regulator.c b/drivers/regulator/pbias-regulator.c index 4eccf12f39de..0c9873e9abdc 100644 --- a/drivers/regulator/pbias-regulator.c +++ b/drivers/regulator/pbias-regulator.c @@ -231,6 +231,7 @@ static struct platform_driver pbias_regulator_driver = { .probe = pbias_regulator_probe, .driver = { .name = "pbias-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(pbias_of_match), }, }; diff --git a/drivers/regulator/pca9450-regulator.c b/drivers/regulator/pca9450-regulator.c index c6351fac9f4d..87a746dcb516 100644 --- a/drivers/regulator/pca9450-regulator.c +++ b/drivers/regulator/pca9450-regulator.c @@ -872,6 +872,7 @@ MODULE_DEVICE_TABLE(of, pca9450_of_match); static struct i2c_driver pca9450_i2c_driver = { .driver = { .name = "nxp-pca9450", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = pca9450_of_match, }, .probe_new = pca9450_i2c_probe, diff --git a/drivers/regulator/pcap-regulator.c b/drivers/regulator/pcap-regulator.c index 0345f38f6f78..319a88412154 100644 --- a/drivers/regulator/pcap-regulator.c +++ b/drivers/regulator/pcap-regulator.c @@ -251,6 +251,7 @@ static int pcap_regulator_probe(struct platform_device *pdev) static struct platform_driver pcap_regulator_driver = { .driver = { .name = "pcap-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = pcap_regulator_probe, }; diff --git a/drivers/regulator/pcf50633-regulator.c b/drivers/regulator/pcf50633-regulator.c index f40e3bb303d6..9f08a62c800e 100644 --- a/drivers/regulator/pcf50633-regulator.c +++ b/drivers/regulator/pcf50633-regulator.c @@ -101,6 +101,7 @@ static int pcf50633_regulator_probe(struct platform_device *pdev) static struct platform_driver pcf50633_regulator_driver = { .driver = { .name = "pcf50633-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = pcf50633_regulator_probe, }; diff --git a/drivers/regulator/pf8x00-regulator.c b/drivers/regulator/pf8x00-regulator.c index 5d319fb81288..99a15c3be396 100644 --- a/drivers/regulator/pf8x00-regulator.c +++ b/drivers/regulator/pf8x00-regulator.c @@ -607,6 +607,7 @@ static struct i2c_driver pf8x00_regulator_driver = { .id_table = pf8x00_i2c_id, .driver = { .name = "pf8x00", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = pf8x00_dt_ids, }, .probe_new = pf8x00_i2c_probe, diff --git a/drivers/regulator/pfuze100-regulator.c b/drivers/regulator/pfuze100-regulator.c index 9ab604289b5c..a9fcf6a41494 100644 --- a/drivers/regulator/pfuze100-regulator.c +++ b/drivers/regulator/pfuze100-regulator.c @@ -845,6 +845,7 @@ static int pfuze100_regulator_probe(struct i2c_client *client) static struct i2c_driver pfuze_driver = { .driver = { .name = "pfuze100-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = pfuze_dt_ids, }, .probe_new = pfuze100_regulator_probe, diff --git a/drivers/regulator/pv88060-regulator.c b/drivers/regulator/pv88060-regulator.c index 48238846f45c..f170e0dd1819 100644 --- a/drivers/regulator/pv88060-regulator.c +++ b/drivers/regulator/pv88060-regulator.c @@ -376,6 +376,7 @@ MODULE_DEVICE_TABLE(of, pv88060_dt_ids); static struct i2c_driver pv88060_regulator_driver = { .driver = { .name = "pv88060", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(pv88060_dt_ids), }, .probe_new = pv88060_i2c_probe, diff --git a/drivers/regulator/pv88080-regulator.c b/drivers/regulator/pv88080-regulator.c index 15a67c05f519..133b89d5215c 100644 --- a/drivers/regulator/pv88080-regulator.c +++ b/drivers/regulator/pv88080-regulator.c @@ -557,6 +557,7 @@ MODULE_DEVICE_TABLE(i2c, pv88080_i2c_id); static struct i2c_driver pv88080_regulator_driver = { .driver = { .name = "pv88080", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(pv88080_dt_ids), }, .probe_new = pv88080_i2c_probe, diff --git a/drivers/regulator/pv88090-regulator.c b/drivers/regulator/pv88090-regulator.c index a80176bdf8ec..1bc33bc10992 100644 --- a/drivers/regulator/pv88090-regulator.c +++ b/drivers/regulator/pv88090-regulator.c @@ -397,6 +397,7 @@ MODULE_DEVICE_TABLE(of, pv88090_dt_ids); static struct i2c_driver pv88090_regulator_driver = { .driver = { .name = "pv88090", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(pv88090_dt_ids), }, .probe_new = pv88090_i2c_probe, diff --git a/drivers/regulator/pwm-regulator.c b/drivers/regulator/pwm-regulator.c index b9eeaff1c661..b64d99695b84 100644 --- a/drivers/regulator/pwm-regulator.c +++ b/drivers/regulator/pwm-regulator.c @@ -334,7 +334,7 @@ static int pwm_regulator_probe(struct platform_device *pdev) memcpy(&drvdata->desc, &pwm_regulator_desc, sizeof(drvdata->desc)); - if (of_find_property(np, "voltage-table", NULL)) + if (of_property_present(np, "voltage-table")) ret = pwm_regulator_init_table(pdev, drvdata); else ret = pwm_regulator_init_continuous(pdev, drvdata); @@ -393,6 +393,7 @@ MODULE_DEVICE_TABLE(of, pwm_of_match); static struct platform_driver pwm_regulator_driver = { .driver = { .name = "pwm-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(pwm_of_match), }, .probe = pwm_regulator_probe, diff --git a/drivers/regulator/qcom-labibb-regulator.c b/drivers/regulator/qcom-labibb-regulator.c index bcf7140f3bc9..a8698ca61143 100644 --- a/drivers/regulator/qcom-labibb-regulator.c +++ b/drivers/regulator/qcom-labibb-regulator.c @@ -894,6 +894,7 @@ static int qcom_labibb_regulator_probe(struct platform_device *pdev) static struct platform_driver qcom_labibb_regulator_driver = { .driver = { .name = "qcom-lab-ibb-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = qcom_labibb_match, }, .probe = qcom_labibb_regulator_probe, diff --git a/drivers/regulator/qcom-rpmh-regulator.c b/drivers/regulator/qcom-rpmh-regulator.c index ae6021390143..b0a58c62b1e2 100644 --- a/drivers/regulator/qcom-rpmh-regulator.c +++ b/drivers/regulator/qcom-rpmh-regulator.c @@ -694,6 +694,16 @@ static const struct rpmh_vreg_hw_data pmic5_pldo_lv = { .of_map_mode = rpmh_regulator_pmic4_ldo_of_map_mode, }; +static const struct rpmh_vreg_hw_data pmic5_pldo515_mv = { + .regulator_type = VRM, + .ops = &rpmh_regulator_vrm_drms_ops, + .voltage_range = REGULATOR_LINEAR_RANGE(1800000, 0, 187, 8000), + .n_voltages = 188, + .hpm_min_load_uA = 10000, + .pmic_mode_map = pmic_mode_map_pmic5_ldo, + .of_map_mode = rpmh_regulator_pmic4_ldo_of_map_mode, +}; + static const struct rpmh_vreg_hw_data pmic5_nldo = { .regulator_type = VRM, .ops = &rpmh_regulator_vrm_drms_ops, @@ -704,6 +714,16 @@ static const struct rpmh_vreg_hw_data pmic5_nldo = { .of_map_mode = rpmh_regulator_pmic4_ldo_of_map_mode, }; +static const struct rpmh_vreg_hw_data pmic5_nldo515 = { + .regulator_type = VRM, + .ops = &rpmh_regulator_vrm_drms_ops, + .voltage_range = REGULATOR_LINEAR_RANGE(320000, 0, 210, 8000), + .n_voltages = 211, + .hpm_min_load_uA = 30000, + .pmic_mode_map = pmic_mode_map_pmic5_ldo, + .of_map_mode = rpmh_regulator_pmic4_ldo_of_map_mode, +}; + static const struct rpmh_vreg_hw_data pmic5_hfsmps510 = { .regulator_type = VRM, .ops = &rpmh_regulator_vrm_ops, @@ -749,6 +769,15 @@ static const struct rpmh_vreg_hw_data pmic5_ftsmps525_mv = { .of_map_mode = rpmh_regulator_pmic4_smps_of_map_mode, }; +static const struct rpmh_vreg_hw_data pmic5_ftsmps527 = { + .regulator_type = VRM, + .ops = &rpmh_regulator_vrm_ops, + .voltage_range = REGULATOR_LINEAR_RANGE(320000, 0, 215, 8000), + .n_voltages = 215, + .pmic_mode_map = pmic_mode_map_pmic5_smps, + .of_map_mode = rpmh_regulator_pmic4_smps_of_map_mode, +}; + static const struct rpmh_vreg_hw_data pmic5_hfsmps515 = { .regulator_type = VRM, .ops = &rpmh_regulator_vrm_ops, @@ -937,6 +966,28 @@ static const struct rpmh_vreg_init_data pmm8155au_vreg_data[] = { {} }; +static const struct rpmh_vreg_init_data pmm8654au_vreg_data[] = { + RPMH_VREG("smps1", "smp%s1", &pmic5_ftsmps527, "vdd-s1"), + RPMH_VREG("smps2", "smp%s2", &pmic5_ftsmps527, "vdd-s2"), + RPMH_VREG("smps3", "smp%s3", &pmic5_ftsmps527, "vdd-s3"), + RPMH_VREG("smps4", "smp%s4", &pmic5_ftsmps527, "vdd-s4"), + RPMH_VREG("smps5", "smp%s5", &pmic5_ftsmps527, "vdd-s5"), + RPMH_VREG("smps6", "smp%s6", &pmic5_ftsmps527, "vdd-s6"), + RPMH_VREG("smps7", "smp%s7", &pmic5_ftsmps527, "vdd-s7"), + RPMH_VREG("smps8", "smp%s8", &pmic5_ftsmps527, "vdd-s8"), + RPMH_VREG("smps9", "smp%s9", &pmic5_ftsmps527, "vdd-s9"), + RPMH_VREG("ldo1", "ldo%s1", &pmic5_nldo515, "vdd-s9"), + RPMH_VREG("ldo2", "ldo%s2", &pmic5_nldo515, "vdd-l2-l3"), + RPMH_VREG("ldo3", "ldo%s3", &pmic5_nldo515, "vdd-l2-l3"), + RPMH_VREG("ldo4", "ldo%s4", &pmic5_nldo515, "vdd-s9"), + RPMH_VREG("ldo5", "ldo%s5", &pmic5_nldo515, "vdd-s9"), + RPMH_VREG("ldo6", "ldo%s6", &pmic5_nldo515, "vdd-l6-l7"), + RPMH_VREG("ldo7", "ldo%s7", &pmic5_nldo515, "vdd-l6-l7"), + RPMH_VREG("ldo8", "ldo%s8", &pmic5_pldo515_mv, "vdd-l8-l9"), + RPMH_VREG("ldo9", "ldo%s9", &pmic5_pldo, "vdd-l8-l9"), + {} +}; + static const struct rpmh_vreg_init_data pm8350_vreg_data[] = { RPMH_VREG("smps1", "smp%s1", &pmic5_ftsmps510, "vdd-s1"), RPMH_VREG("smps2", "smp%s2", &pmic5_ftsmps510, "vdd-s2"), @@ -1432,6 +1483,10 @@ static const struct of_device_id __maybe_unused rpmh_regulator_match_table[] = { .data = pmm8155au_vreg_data, }, { + .compatible = "qcom,pmm8654au-rpmh-regulators", + .data = pmm8654au_vreg_data, + }, + { .compatible = "qcom,pmx55-rpmh-regulators", .data = pmx55_vreg_data, }, @@ -1462,6 +1517,7 @@ MODULE_DEVICE_TABLE(of, rpmh_regulator_match_table); static struct platform_driver rpmh_regulator_driver = { .driver = { .name = "qcom-rpmh-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(rpmh_regulator_match_table), }, .probe = rpmh_regulator_probe, diff --git a/drivers/regulator/qcom_rpm-regulator.c b/drivers/regulator/qcom_rpm-regulator.c index 3c41b71a1f52..f95bc9208c13 100644 --- a/drivers/regulator/qcom_rpm-regulator.c +++ b/drivers/regulator/qcom_rpm-regulator.c @@ -991,6 +991,7 @@ static struct platform_driver rpm_reg_driver = { .probe = rpm_reg_probe, .driver = { .name = "qcom_rpm_reg", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(rpm_of_match), }, }; diff --git a/drivers/regulator/qcom_smd-regulator.c b/drivers/regulator/qcom_smd-regulator.c index 9f2b58458841..18189f35db68 100644 --- a/drivers/regulator/qcom_smd-regulator.c +++ b/drivers/regulator/qcom_smd-regulator.c @@ -749,7 +749,7 @@ static const struct regulator_desc pms405_pldo600 = { .ops = &rpm_smps_ldo_ops, }; -static const struct regulator_desc mp5496_smpa2 = { +static const struct regulator_desc mp5496_smps = { .linear_ranges = (struct linear_range[]) { REGULATOR_LINEAR_RANGE(600000, 0, 127, 12500), }, @@ -794,7 +794,8 @@ struct rpm_regulator_data { }; static const struct rpm_regulator_data rpm_mp5496_regulators[] = { - { "s2", QCOM_SMD_RPM_SMPA, 2, &mp5496_smpa2, "s2" }, + { "s1", QCOM_SMD_RPM_SMPA, 1, &mp5496_smps, "s1" }, + { "s2", QCOM_SMD_RPM_SMPA, 2, &mp5496_smps, "s2" }, { "l2", QCOM_SMD_RPM_LDOA, 2, &mp5496_ldoa2, "l2" }, {} }; @@ -1440,6 +1441,7 @@ static struct platform_driver rpm_reg_driver = { .probe = rpm_reg_probe, .driver = { .name = "qcom_rpm_smd_regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = rpm_of_match, }, }; diff --git a/drivers/regulator/qcom_spmi-regulator.c b/drivers/regulator/qcom_spmi-regulator.c index 3e312729741e..c95f6e9c7ab5 100644 --- a/drivers/regulator/qcom_spmi-regulator.c +++ b/drivers/regulator/qcom_spmi-regulator.c @@ -2484,6 +2484,7 @@ static int qcom_spmi_regulator_probe(struct platform_device *pdev) static struct platform_driver qcom_spmi_regulator_driver = { .driver = { .name = "qcom-spmi-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = qcom_spmi_regulator_match, }, .probe = qcom_spmi_regulator_probe, diff --git a/drivers/regulator/qcom_usb_vbus-regulator.c b/drivers/regulator/qcom_usb_vbus-regulator.c index 2e627c2b6c51..57ec613f4a0a 100644 --- a/drivers/regulator/qcom_usb_vbus-regulator.c +++ b/drivers/regulator/qcom_usb_vbus-regulator.c @@ -100,6 +100,7 @@ MODULE_DEVICE_TABLE(of, qcom_usb_vbus_regulator_match); static struct platform_driver qcom_usb_vbus_regulator_driver = { .driver = { .name = "qcom-usb-vbus-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = qcom_usb_vbus_regulator_match, }, .probe = qcom_usb_vbus_regulator_probe, diff --git a/drivers/regulator/rc5t583-regulator.c b/drivers/regulator/rc5t583-regulator.c index 62641b08b88a..a5afca73715d 100644 --- a/drivers/regulator/rc5t583-regulator.c +++ b/drivers/regulator/rc5t583-regulator.c @@ -149,6 +149,7 @@ skip_ext_pwr_config: static struct platform_driver rc5t583_regulator_driver = { .driver = { .name = "rc5t583-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = rc5t583_regulator_probe, }; diff --git a/drivers/regulator/rk808-regulator.c b/drivers/regulator/rk808-regulator.c index fa9fc1aa1ae3..3637e81654a8 100644 --- a/drivers/regulator/rk808-regulator.c +++ b/drivers/regulator/rk808-regulator.c @@ -1354,7 +1354,8 @@ static int rk808_regulator_probe(struct platform_device *pdev) static struct platform_driver rk808_regulator_driver = { .probe = rk808_regulator_probe, .driver = { - .name = "rk808-regulator" + .name = "rk808-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, }; diff --git a/drivers/regulator/rn5t618-regulator.c b/drivers/regulator/rn5t618-regulator.c index 5c12d57be040..91808e0735b3 100644 --- a/drivers/regulator/rn5t618-regulator.c +++ b/drivers/regulator/rn5t618-regulator.c @@ -143,6 +143,7 @@ static struct platform_driver rn5t618_regulator_driver = { .probe = rn5t618_regulator_probe, .driver = { .name = "rn5t618-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, }; diff --git a/drivers/regulator/rpi-panel-attiny-regulator.c b/drivers/regulator/rpi-panel-attiny-regulator.c index 34514976475e..9afe961a87f1 100644 --- a/drivers/regulator/rpi-panel-attiny-regulator.c +++ b/drivers/regulator/rpi-panel-attiny-regulator.c @@ -396,6 +396,7 @@ MODULE_DEVICE_TABLE(of, attiny_dt_ids); static struct i2c_driver attiny_regulator_driver = { .driver = { .name = "rpi_touchscreen_attiny", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(attiny_dt_ids), }, .probe_new = attiny_i2c_probe, diff --git a/drivers/regulator/rt4801-regulator.c b/drivers/regulator/rt4801-regulator.c index 563d79196fdd..be3dc981195c 100644 --- a/drivers/regulator/rt4801-regulator.c +++ b/drivers/regulator/rt4801-regulator.c @@ -239,6 +239,7 @@ MODULE_DEVICE_TABLE(of, rt4801_of_id); static struct i2c_driver rt4801_driver = { .driver = { .name = "rt4801", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(rt4801_of_id), }, .probe_new = rt4801_probe, diff --git a/drivers/regulator/rt4803.c b/drivers/regulator/rt4803.c new file mode 100644 index 000000000000..c96fb026dc10 --- /dev/null +++ b/drivers/regulator/rt4803.c @@ -0,0 +1,216 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (C) 2023 Richtek Technology Corp. + * + * Author: ChiYuan Huang <cy_huang@richtek.com> + */ + +#include <linux/i2c.h> +#include <linux/kernel.h> +#include <linux/mod_devicetable.h> +#include <linux/module.h> +#include <linux/property.h> +#include <linux/regmap.h> +#include <linux/regulator/driver.h> +#include <linux/regulator/of_regulator.h> + +#define RT4803_AUTO_MODE 1 +#define RT4803_FPWM_MODE 2 + +#define RT4803_REG_CONFIG 0x01 +#define RT4803_REG_VSELL 0x02 +#define RT4803_REG_VSELH 0x03 +#define RT4803_REG_ILIM 0x04 +#define RT4803_REG_STAT 0x05 + +#define RT4803_MODE_MASK GENMASK(1, 0) +#define RT4803_VSEL_MASK GENMASK(4, 0) +#define RT4803_ILIM_MASK GENMASK(3, 0) +#define RT4803_TSD_MASK BIT(7) +#define RT4803_HOTDIE_MASK BIT(6) +#define RT4803_FAULT_MASK BIT(1) +#define RT4803_PGOOD_MASK BIT(0) + +#define RT4803_VOUT_MINUV 2850000 +#define RT4803_VOUT_STEPUV 50000 +#define RT4803_VOUT_NUM 32 + +static int rt4803_set_mode(struct regulator_dev *rdev, unsigned int mode) +{ + struct regmap *regmap = rdev_get_regmap(rdev); + unsigned int modeval; + + switch (mode) { + case REGULATOR_MODE_NORMAL: + modeval = RT4803_AUTO_MODE; + break; + case REGULATOR_MODE_FAST: + modeval = RT4803_FPWM_MODE; + break; + default: + return -EINVAL; + } + + modeval <<= ffs(RT4803_MODE_MASK) - 1; + + return regmap_update_bits(regmap, RT4803_REG_CONFIG, RT4803_MODE_MASK, modeval); +} + +static unsigned int rt4803_get_mode(struct regulator_dev *rdev) +{ + struct regmap *regmap = rdev_get_regmap(rdev); + unsigned int modeval; + int ret; + + ret = regmap_read(regmap, RT4803_REG_CONFIG, &modeval); + if (ret) + return REGULATOR_MODE_INVALID; + + modeval >>= ffs(RT4803_MODE_MASK) - 1; + + switch (modeval) { + case RT4803_AUTO_MODE: + return REGULATOR_MODE_NORMAL; + case RT4803_FPWM_MODE: + return REGULATOR_MODE_FAST; + default: + return REGULATOR_MODE_INVALID; + } +} + +static int rt4803_get_error_flags(struct regulator_dev *rdev, unsigned int *flags) +{ + struct regmap *regmap = rdev_get_regmap(rdev); + unsigned int state, events = 0; + int ret; + + ret = regmap_read(regmap, RT4803_REG_STAT, &state); + if (ret) + return ret; + + if (state & RT4803_PGOOD_MASK) + goto out_error_flag; + + if (state & RT4803_FAULT_MASK) + events |= REGULATOR_ERROR_FAIL; + + if (state & RT4803_HOTDIE_MASK) + events |= REGULATOR_ERROR_OVER_TEMP_WARN; + + if (state & RT4803_TSD_MASK) + events |= REGULATOR_ERROR_OVER_TEMP; + +out_error_flag: + *flags = events; + return 0; +} + +static int rt4803_set_suspend_voltage(struct regulator_dev *rdev, int uV) +{ + struct regmap *regmap = rdev_get_regmap(rdev); + unsigned int reg, vsel; + + if (rdev->desc->vsel_reg == RT4803_REG_VSELL) + reg = RT4803_REG_VSELH; + else + reg = RT4803_REG_VSELL; + + vsel = (uV - rdev->desc->min_uV) / rdev->desc->uV_step; + vsel <<= ffs(RT4803_VSEL_MASK) - 1; + + return regmap_update_bits(regmap, reg, RT4803_VSEL_MASK, vsel); +} + +static const struct regulator_ops rt4803_regulator_ops = { + .list_voltage = regulator_list_voltage_linear, + .set_voltage_sel = regulator_set_voltage_sel_regmap, + .get_voltage_sel = regulator_get_voltage_sel_regmap, + .set_mode = rt4803_set_mode, + .get_mode = rt4803_get_mode, + .get_error_flags = rt4803_get_error_flags, + .set_suspend_voltage = rt4803_set_suspend_voltage, +}; + +static unsigned int rt4803_of_map_mode(unsigned int mode) +{ + switch (mode) { + case RT4803_AUTO_MODE: + return REGULATOR_MODE_NORMAL; + case RT4803_FPWM_MODE: + return REGULATOR_MODE_FAST; + default: + return REGULATOR_MODE_INVALID; + } +} + +static const struct regmap_config rt4803_regmap_config = { + .reg_bits = 8, + .val_bits = 8, + .max_register = RT4803_REG_STAT, +}; + +static int rt4803_probe(struct i2c_client *i2c) +{ + struct device *dev = &i2c->dev; + struct regmap *regmap; + struct regulator_desc *desc; + struct regulator_config cfg = {}; + struct regulator_dev *rdev; + bool vsel_act_high; + int ret; + + desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL); + if (!desc) + return -ENOMEM; + + regmap = devm_regmap_init_i2c(i2c, &rt4803_regmap_config); + if (IS_ERR(regmap)) + return dev_err_probe(dev, PTR_ERR(regmap), "Failed to init regmap\n"); + + /* Always configure the input current limit to max 5A at initial */ + ret = regmap_update_bits(regmap, RT4803_REG_ILIM, RT4803_ILIM_MASK, 0xff); + if (ret) + return dev_err_probe(dev, ret, "Failed to config ILIM to max\n"); + + vsel_act_high = device_property_read_bool(dev, "richtek,vsel-active-high"); + + desc->name = "rt4803-regulator"; + desc->type = REGULATOR_VOLTAGE; + desc->owner = THIS_MODULE; + desc->ops = &rt4803_regulator_ops; + desc->min_uV = RT4803_VOUT_MINUV; + desc->uV_step = RT4803_VOUT_STEPUV; + desc->n_voltages = RT4803_VOUT_NUM; + desc->vsel_mask = RT4803_VSEL_MASK; + desc->of_map_mode = rt4803_of_map_mode; + if (vsel_act_high) + desc->vsel_reg = RT4803_REG_VSELH; + else + desc->vsel_reg = RT4803_REG_VSELL; + + cfg.dev = dev; + cfg.of_node = dev_of_node(dev); + cfg.init_data = of_get_regulator_init_data(dev, dev_of_node(dev), desc); + + rdev = devm_regulator_register(dev, desc, &cfg); + return PTR_ERR_OR_ZERO(rdev); +} + +static const struct of_device_id rt4803_device_match_table[] = { + { .compatible = "richtek,rt4803" }, + {} +}; +MODULE_DEVICE_TABLE(of, rt4803_device_match_table); + +static struct i2c_driver rt4803_driver = { + .driver = { + .name = "rt4803", + .of_match_table = rt4803_device_match_table, + }, + .probe = rt4803_probe, +}; +module_i2c_driver(rt4803_driver); + +MODULE_DESCRIPTION("Richtek RT4803 voltage regulator driver"); +MODULE_AUTHOR("ChiYuan Huang <cy_huang@richtek.com>"); +MODULE_LICENSE("GPL"); diff --git a/drivers/regulator/rt4831-regulator.c b/drivers/regulator/rt4831-regulator.c index 2016062cd7ef..97e6f7e2a0ba 100644 --- a/drivers/regulator/rt4831-regulator.c +++ b/drivers/regulator/rt4831-regulator.c @@ -194,6 +194,7 @@ MODULE_DEVICE_TABLE(platform, rt4831_regulator_match); static struct platform_driver rt4831_regulator_driver = { .driver = { .name = "rt4831-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .id_table = rt4831_regulator_match, .probe = rt4831_regulator_probe, diff --git a/drivers/regulator/rt5033-regulator.c b/drivers/regulator/rt5033-regulator.c index da4cf5a6acc2..2ba74f205543 100644 --- a/drivers/regulator/rt5033-regulator.c +++ b/drivers/regulator/rt5033-regulator.c @@ -124,6 +124,7 @@ MODULE_DEVICE_TABLE(platform, rt5033_regulator_id); static struct platform_driver rt5033_regulator_driver = { .driver = { .name = "rt5033-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = rt5033_regulator_probe, .id_table = rt5033_regulator_id, diff --git a/drivers/regulator/rt5120-regulator.c b/drivers/regulator/rt5120-regulator.c index 8173ede09414..a388ac70865f 100644 --- a/drivers/regulator/rt5120-regulator.c +++ b/drivers/regulator/rt5120-regulator.c @@ -409,6 +409,7 @@ MODULE_DEVICE_TABLE(platform, rt5120_regulator_dev_table); static struct platform_driver rt5120_regulator_driver = { .driver = { .name = "rt5120-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .id_table = rt5120_regulator_dev_table, .probe = rt5120_regulator_probe, diff --git a/drivers/regulator/rt5190a-regulator.c b/drivers/regulator/rt5190a-regulator.c index 4a3397b32582..f6c12f87fb8d 100644 --- a/drivers/regulator/rt5190a-regulator.c +++ b/drivers/regulator/rt5190a-regulator.c @@ -505,6 +505,7 @@ MODULE_DEVICE_TABLE(of, rt5190a_device_table); static struct i2c_driver rt5190a_driver = { .driver = { .name = "rt5190a", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = rt5190a_device_table, }, .probe_new = rt5190a_probe, diff --git a/drivers/regulator/rt5739.c b/drivers/regulator/rt5739.c new file mode 100644 index 000000000000..74fc5bf6d87e --- /dev/null +++ b/drivers/regulator/rt5739.c @@ -0,0 +1,291 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Device driver for RT5739 regulator + * + * Copyright (C) 2023 Richtek Technology Corp. + * + * Author: ChiYuan Huang <cy_huang@richtek.com> + */ + +#include <linux/bits.h> +#include <linux/gpio/consumer.h> +#include <linux/i2c.h> +#include <linux/kernel.h> +#include <linux/mod_devicetable.h> +#include <linux/property.h> +#include <linux/regmap.h> +#include <linux/regulator/driver.h> +#include <linux/regulator/of_regulator.h> + +#define RT5739_AUTO_MODE 0 +#define RT5739_FPWM_MODE 1 + +#define RT5739_REG_NSEL0 0x00 +#define RT5739_REG_NSEL1 0x01 +#define RT5739_REG_CNTL1 0x02 +#define RT5739_REG_ID1 0x03 +#define RT5739_REG_CNTL2 0x06 +#define RT5739_REG_CNTL4 0x08 + +#define RT5739_VSEL_MASK GENMASK(7, 0) +#define RT5739_MODEVSEL1_MASK BIT(1) +#define RT5739_MODEVSEL0_MASK BIT(0) +#define RT5739_VID_MASK GENMASK(7, 5) +#define RT5739_ACTD_MASK BIT(7) +#define RT5739_ENVSEL1_MASK BIT(1) +#define RT5739_ENVSEL0_MASK BIT(0) + +#define RT5739_VOLT_MINUV 300000 +#define RT5739_VOLT_MAXUV 1300000 +#define RT5739_VOLT_STPUV 5000 +#define RT5739_N_VOLTS 201 +#define RT5739_I2CRDY_TIMEUS 1000 + +static int rt5739_set_mode(struct regulator_dev *rdev, unsigned int mode) +{ + const struct regulator_desc *desc = rdev->desc; + struct regmap *regmap = rdev_get_regmap(rdev); + unsigned int mask, val; + + if (desc->vsel_reg == RT5739_REG_NSEL0) + mask = RT5739_MODEVSEL0_MASK; + else + mask = RT5739_MODEVSEL1_MASK; + + switch (mode) { + case REGULATOR_MODE_FAST: + val = mask; + break; + case REGULATOR_MODE_NORMAL: + val = 0; + break; + default: + return -EINVAL; + } + + return regmap_update_bits(regmap, RT5739_REG_CNTL1, mask, val); +} + +static unsigned int rt5739_get_mode(struct regulator_dev *rdev) +{ + const struct regulator_desc *desc = rdev->desc; + struct regmap *regmap = rdev_get_regmap(rdev); + unsigned int mask, val; + int ret; + + if (desc->vsel_reg == RT5739_REG_NSEL0) + mask = RT5739_MODEVSEL0_MASK; + else + mask = RT5739_MODEVSEL1_MASK; + + ret = regmap_read(regmap, RT5739_REG_CNTL1, &val); + if (ret) + return REGULATOR_MODE_INVALID; + + if (val & mask) + return REGULATOR_MODE_FAST; + + return REGULATOR_MODE_NORMAL; +} + +static int rt5739_set_suspend_voltage(struct regulator_dev *rdev, int uV) +{ + const struct regulator_desc *desc = rdev->desc; + struct regmap *regmap = rdev_get_regmap(rdev); + unsigned int reg, vsel; + + if (uV < RT5739_VOLT_MINUV || uV > RT5739_VOLT_MAXUV) + return -EINVAL; + + if (desc->vsel_reg == RT5739_REG_NSEL0) + reg = RT5739_REG_NSEL1; + else + reg = RT5739_REG_NSEL0; + + vsel = (uV - RT5739_VOLT_MINUV) / RT5739_VOLT_STPUV; + return regmap_write(regmap, reg, vsel); +} + +static int rt5739_set_suspend_enable(struct regulator_dev *rdev) +{ + const struct regulator_desc *desc = rdev->desc; + struct regmap *regmap = rdev_get_regmap(rdev); + unsigned int mask; + + if (desc->vsel_reg == RT5739_REG_NSEL0) + mask = RT5739_ENVSEL1_MASK; + else + mask = RT5739_ENVSEL0_MASK; + + return regmap_update_bits(regmap, desc->enable_reg, mask, mask); +} + +static int rt5739_set_suspend_disable(struct regulator_dev *rdev) +{ + const struct regulator_desc *desc = rdev->desc; + struct regmap *regmap = rdev_get_regmap(rdev); + unsigned int mask; + + if (desc->vsel_reg == RT5739_REG_NSEL0) + mask = RT5739_ENVSEL1_MASK; + else + mask = RT5739_ENVSEL0_MASK; + + return regmap_update_bits(regmap, desc->enable_reg, mask, 0); +} + +static int rt5739_set_suspend_mode(struct regulator_dev *rdev, + unsigned int mode) +{ + const struct regulator_desc *desc = rdev->desc; + struct regmap *regmap = rdev_get_regmap(rdev); + unsigned int mask, val; + + if (desc->vsel_reg == RT5739_REG_NSEL0) + mask = RT5739_MODEVSEL1_MASK; + else + mask = RT5739_MODEVSEL0_MASK; + + switch (mode) { + case REGULATOR_MODE_FAST: + val = mask; + break; + case REGULATOR_MODE_NORMAL: + val = 0; + break; + default: + return -EINVAL; + } + + return regmap_update_bits(regmap, RT5739_REG_CNTL1, mask, val); +} + +static const struct regulator_ops rt5739_regulator_ops = { + .list_voltage = regulator_list_voltage_linear, + .get_voltage_sel = regulator_get_voltage_sel_regmap, + .set_voltage_sel = regulator_set_voltage_sel_regmap, + .enable = regulator_enable_regmap, + .disable = regulator_disable_regmap, + .is_enabled = regulator_is_enabled_regmap, + .set_active_discharge = regulator_set_active_discharge_regmap, + .set_mode = rt5739_set_mode, + .get_mode = rt5739_get_mode, + .set_suspend_voltage = rt5739_set_suspend_voltage, + .set_suspend_enable = rt5739_set_suspend_enable, + .set_suspend_disable = rt5739_set_suspend_disable, + .set_suspend_mode = rt5739_set_suspend_mode, +}; + +static unsigned int rt5739_of_map_mode(unsigned int mode) +{ + switch (mode) { + case RT5739_AUTO_MODE: + return REGULATOR_MODE_NORMAL; + case RT5739_FPWM_MODE: + return REGULATOR_MODE_FAST; + default: + return REGULATOR_MODE_INVALID; + } +} + +static void rt5739_init_regulator_desc(struct regulator_desc *desc, + bool vsel_active_high) +{ + /* Fixed */ + desc->name = "rt5739-regulator"; + desc->owner = THIS_MODULE; + desc->ops = &rt5739_regulator_ops; + desc->n_voltages = RT5739_N_VOLTS; + desc->min_uV = RT5739_VOLT_MINUV; + desc->uV_step = RT5739_VOLT_STPUV; + desc->vsel_mask = RT5739_VSEL_MASK; + desc->enable_reg = RT5739_REG_CNTL2; + desc->active_discharge_reg = RT5739_REG_CNTL1; + desc->active_discharge_mask = RT5739_ACTD_MASK; + desc->active_discharge_on = RT5739_ACTD_MASK; + desc->of_map_mode = rt5739_of_map_mode; + + /* Assigned by vsel level */ + if (vsel_active_high) { + desc->vsel_reg = RT5739_REG_NSEL1; + desc->enable_mask = RT5739_ENVSEL1_MASK; + } else { + desc->vsel_reg = RT5739_REG_NSEL0; + desc->enable_mask = RT5739_ENVSEL0_MASK; + } +} + +static const struct regmap_config rt5739_regmap_config = { + .name = "rt5739", + .reg_bits = 8, + .val_bits = 8, + .max_register = RT5739_REG_CNTL4, +}; + +static int rt5739_probe(struct i2c_client *i2c) +{ + struct device *dev = &i2c->dev; + struct regulator_desc *desc; + struct regmap *regmap; + struct gpio_desc *enable_gpio; + struct regulator_config cfg = {}; + struct regulator_dev *rdev; + bool vsel_acth; + unsigned int vid; + int ret; + + desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL); + if (!desc) + return -ENOMEM; + + enable_gpio = devm_gpiod_get_optional(dev, "enable", GPIOD_OUT_HIGH); + if (IS_ERR(enable_gpio)) + return dev_err_probe(dev, PTR_ERR(enable_gpio), "Failed to get 'enable' gpio\n"); + else if (enable_gpio) + usleep_range(RT5739_I2CRDY_TIMEUS, RT5739_I2CRDY_TIMEUS + 1000); + + regmap = devm_regmap_init_i2c(i2c, &rt5739_regmap_config); + if (IS_ERR(regmap)) + return dev_err_probe(dev, PTR_ERR(regmap), "Failed to init regmap\n"); + + ret = regmap_read(regmap, RT5739_REG_ID1, &vid); + if (ret) + return dev_err_probe(dev, ret, "Failed to read VID\n"); + + /* RT5739: (VID & MASK) must be 0 */ + if (vid & RT5739_VID_MASK) + return dev_err_probe(dev, -ENODEV, "Incorrect VID (0x%02x)\n", vid); + + vsel_acth = device_property_read_bool(dev, "richtek,vsel-active-high"); + + rt5739_init_regulator_desc(desc, vsel_acth); + + cfg.dev = dev; + cfg.of_node = dev_of_node(dev); + cfg.init_data = of_get_regulator_init_data(dev, dev_of_node(dev), desc); + rdev = devm_regulator_register(dev, desc, &cfg); + if (IS_ERR(rdev)) + return dev_err_probe(dev, PTR_ERR(rdev), "Failed to register regulator\n"); + + return 0; +} + +static const struct of_device_id rt5739_device_table[] = { + { .compatible = "richtek,rt5739" }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, rt5739_device_table); + +static struct i2c_driver rt5739_driver = { + .driver = { + .name = "rt5739", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, + .of_match_table = rt5739_device_table, + }, + .probe_new = rt5739_probe, +}; +module_i2c_driver(rt5739_driver); + +MODULE_AUTHOR("ChiYuan Huang <cy_huang@richtek.com>"); +MODULE_DESCRIPTION("Richtek RT5739 regulator driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/regulator/rt5759-regulator.c b/drivers/regulator/rt5759-regulator.c index 8488417f4b2c..d5a42ad21a9a 100644 --- a/drivers/regulator/rt5759-regulator.c +++ b/drivers/regulator/rt5759-regulator.c @@ -359,6 +359,7 @@ MODULE_DEVICE_TABLE(of, rt5759_device_table); static struct i2c_driver rt5759_driver = { .driver = { .name = "rt5759", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(rt5759_device_table), }, .probe_new = rt5759_probe, diff --git a/drivers/regulator/rt6160-regulator.c b/drivers/regulator/rt6160-regulator.c index 5d7b0e7ad69a..8990dac23460 100644 --- a/drivers/regulator/rt6160-regulator.c +++ b/drivers/regulator/rt6160-regulator.c @@ -308,6 +308,7 @@ MODULE_DEVICE_TABLE(of, rt6160_of_match_table); static struct i2c_driver rt6160_driver = { .driver = { .name = "rt6160", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = rt6160_of_match_table, }, .probe_new = rt6160_probe, diff --git a/drivers/regulator/rt6190-regulator.c b/drivers/regulator/rt6190-regulator.c index 995e028abdd7..ca91a1f6d3c8 100644 --- a/drivers/regulator/rt6190-regulator.c +++ b/drivers/regulator/rt6190-regulator.c @@ -483,6 +483,7 @@ MODULE_DEVICE_TABLE(of, rt6190_of_dev_table); static struct i2c_driver rt6190_driver = { .driver = { .name = "rt6190", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = rt6190_of_dev_table, .pm = pm_ptr(&rt6190_dev_pm), }, diff --git a/drivers/regulator/rt6245-regulator.c b/drivers/regulator/rt6245-regulator.c index cb22a207e9ff..8721d11c7964 100644 --- a/drivers/regulator/rt6245-regulator.c +++ b/drivers/regulator/rt6245-regulator.c @@ -243,6 +243,7 @@ MODULE_DEVICE_TABLE(of, rt6245_of_match_table); static struct i2c_driver rt6245_driver = { .driver = { .name = "rt6245", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = rt6245_of_match_table, }, .probe_new = rt6245_probe, diff --git a/drivers/regulator/rtmv20-regulator.c b/drivers/regulator/rtmv20-regulator.c index 2ee334174e2b..7cbb812477e1 100644 --- a/drivers/regulator/rtmv20-regulator.c +++ b/drivers/regulator/rtmv20-regulator.c @@ -425,6 +425,7 @@ MODULE_DEVICE_TABLE(of, rtmv20_of_id); static struct i2c_driver rtmv20_driver = { .driver = { .name = "rtmv20", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(rtmv20_of_id), .pm = &rtmv20_pm, }, diff --git a/drivers/regulator/rtq2134-regulator.c b/drivers/regulator/rtq2134-regulator.c index 8e13dea354a2..ee1577dc3cfc 100644 --- a/drivers/regulator/rtq2134-regulator.c +++ b/drivers/regulator/rtq2134-regulator.c @@ -363,6 +363,7 @@ MODULE_DEVICE_TABLE(of, rtq2134_device_tables); static struct i2c_driver rtq2134_driver = { .driver = { .name = "rtq2134", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = rtq2134_device_tables, }, .probe_new = rtq2134_probe, diff --git a/drivers/regulator/rtq6752-regulator.c b/drivers/regulator/rtq6752-regulator.c index dfe45fb67353..8559a266a7eb 100644 --- a/drivers/regulator/rtq6752-regulator.c +++ b/drivers/regulator/rtq6752-regulator.c @@ -278,6 +278,7 @@ MODULE_DEVICE_TABLE(of, rtq6752_device_table); static struct i2c_driver rtq6752_driver = { .driver = { .name = "rtq6752", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = rtq6752_device_table, }, .probe_new = rtq6752_probe, diff --git a/drivers/regulator/s2mpa01.c b/drivers/regulator/s2mpa01.c index 28b424fe7bea..b147ff6a16b1 100644 --- a/drivers/regulator/s2mpa01.c +++ b/drivers/regulator/s2mpa01.c @@ -376,6 +376,7 @@ MODULE_DEVICE_TABLE(platform, s2mpa01_pmic_id); static struct platform_driver s2mpa01_pmic_driver = { .driver = { .name = "s2mpa01-pmic", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = s2mpa01_pmic_probe, .id_table = s2mpa01_pmic_id, diff --git a/drivers/regulator/s2mps11.c b/drivers/regulator/s2mps11.c index ebc67e3ddd4f..570b61420f3a 100644 --- a/drivers/regulator/s2mps11.c +++ b/drivers/regulator/s2mps11.c @@ -1238,6 +1238,7 @@ MODULE_DEVICE_TABLE(platform, s2mps11_pmic_id); static struct platform_driver s2mps11_pmic_driver = { .driver = { .name = "s2mps11-pmic", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = s2mps11_pmic_probe, .id_table = s2mps11_pmic_id, diff --git a/drivers/regulator/s5m8767.c b/drivers/regulator/s5m8767.c index 754c6fcc6e64..bfc0e143bf40 100644 --- a/drivers/regulator/s5m8767.c +++ b/drivers/regulator/s5m8767.c @@ -605,7 +605,7 @@ static int s5m8767_pmic_dt_parse_pdata(struct platform_device *pdev, of_node_put(regulators_np); - if (of_get_property(pmic_np, "s5m8767,pmic-buck2-uses-gpio-dvs", NULL)) { + if (of_property_read_bool(pmic_np, "s5m8767,pmic-buck2-uses-gpio-dvs")) { pdata->buck2_gpiodvs = true; if (of_property_read_u32_array(pmic_np, @@ -616,7 +616,7 @@ static int s5m8767_pmic_dt_parse_pdata(struct platform_device *pdev, } } - if (of_get_property(pmic_np, "s5m8767,pmic-buck3-uses-gpio-dvs", NULL)) { + if (of_property_read_bool(pmic_np, "s5m8767,pmic-buck3-uses-gpio-dvs")) { pdata->buck3_gpiodvs = true; if (of_property_read_u32_array(pmic_np, @@ -627,7 +627,7 @@ static int s5m8767_pmic_dt_parse_pdata(struct platform_device *pdev, } } - if (of_get_property(pmic_np, "s5m8767,pmic-buck4-uses-gpio-dvs", NULL)) { + if (of_property_read_bool(pmic_np, "s5m8767,pmic-buck4-uses-gpio-dvs")) { pdata->buck4_gpiodvs = true; if (of_property_read_u32_array(pmic_np, @@ -661,14 +661,9 @@ static int s5m8767_pmic_dt_parse_pdata(struct platform_device *pdev, if (ret) return -EINVAL; - if (of_get_property(pmic_np, "s5m8767,pmic-buck2-ramp-enable", NULL)) - pdata->buck2_ramp_enable = true; - - if (of_get_property(pmic_np, "s5m8767,pmic-buck3-ramp-enable", NULL)) - pdata->buck3_ramp_enable = true; - - if (of_get_property(pmic_np, "s5m8767,pmic-buck4-ramp-enable", NULL)) - pdata->buck4_ramp_enable = true; + pdata->buck2_ramp_enable = of_property_read_bool(pmic_np, "s5m8767,pmic-buck2-ramp-enable"); + pdata->buck3_ramp_enable = of_property_read_bool(pmic_np, "s5m8767,pmic-buck3-ramp-enable"); + pdata->buck4_ramp_enable = of_property_read_bool(pmic_np, "s5m8767,pmic-buck4-ramp-enable"); if (pdata->buck2_ramp_enable || pdata->buck3_ramp_enable || pdata->buck4_ramp_enable) { @@ -1004,6 +999,7 @@ MODULE_DEVICE_TABLE(platform, s5m8767_pmic_id); static struct platform_driver s5m8767_pmic_driver = { .driver = { .name = "s5m8767-pmic", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = s5m8767_pmic_probe, .id_table = s5m8767_pmic_id, diff --git a/drivers/regulator/sc2731-regulator.c b/drivers/regulator/sc2731-regulator.c index 71e5ceb679f4..5447e1a47d15 100644 --- a/drivers/regulator/sc2731-regulator.c +++ b/drivers/regulator/sc2731-regulator.c @@ -245,6 +245,7 @@ static int sc2731_regulator_probe(struct platform_device *pdev) static struct platform_driver sc2731_regulator_driver = { .driver = { .name = "sc27xx-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = sc2731_regulator_probe, }; diff --git a/drivers/regulator/sky81452-regulator.c b/drivers/regulator/sky81452-regulator.c index 37658affe072..359e83e37d2d 100644 --- a/drivers/regulator/sky81452-regulator.c +++ b/drivers/regulator/sky81452-regulator.c @@ -79,6 +79,7 @@ static int sky81452_reg_probe(struct platform_device *pdev) static struct platform_driver sky81452_reg_driver = { .driver = { .name = "sky81452-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = sky81452_reg_probe, }; diff --git a/drivers/regulator/slg51000-regulator.c b/drivers/regulator/slg51000-regulator.c index 1b2eee95ad3f..559ae031010f 100644 --- a/drivers/regulator/slg51000-regulator.c +++ b/drivers/regulator/slg51000-regulator.c @@ -505,6 +505,7 @@ MODULE_DEVICE_TABLE(i2c, slg51000_i2c_id); static struct i2c_driver slg51000_regulator_driver = { .driver = { .name = "slg51000-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe_new = slg51000_i2c_probe, .id_table = slg51000_i2c_id, diff --git a/drivers/regulator/sm5703-regulator.c b/drivers/regulator/sm5703-regulator.c index 229df7170792..702461cf075e 100644 --- a/drivers/regulator/sm5703-regulator.c +++ b/drivers/regulator/sm5703-regulator.c @@ -157,6 +157,7 @@ MODULE_DEVICE_TABLE(platform, sm5703_regulator_id); static struct platform_driver sm5703_regulator_driver = { .driver = { .name = "sm5703-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = sm5703_regulator_probe, .id_table = sm5703_regulator_id, diff --git a/drivers/regulator/stm32-booster.c b/drivers/regulator/stm32-booster.c index 3136ea8a35d5..b64dc5a497fa 100644 --- a/drivers/regulator/stm32-booster.c +++ b/drivers/regulator/stm32-booster.c @@ -117,6 +117,7 @@ static struct platform_driver stm32_booster_driver = { .probe = stm32_booster_probe, .driver = { .name = "stm32-booster", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(stm32_booster_of_match), }, }; diff --git a/drivers/regulator/stm32-pwr.c b/drivers/regulator/stm32-pwr.c index 2a42acb7c24e..68aa9d92953d 100644 --- a/drivers/regulator/stm32-pwr.c +++ b/drivers/regulator/stm32-pwr.c @@ -129,17 +129,16 @@ static const struct regulator_desc stm32_pwr_desc[] = { static int stm32_pwr_regulator_probe(struct platform_device *pdev) { - struct device_node *np = pdev->dev.of_node; struct stm32_pwr_reg *priv; void __iomem *base; struct regulator_dev *rdev; struct regulator_config config = { }; int i, ret = 0; - base = of_iomap(np, 0); - if (!base) { + base = devm_platform_ioremap_resource(pdev, 0); + if (IS_ERR(base)) { dev_err(&pdev->dev, "Unable to map IO memory\n"); - return -ENOMEM; + return PTR_ERR(base); } config.dev = &pdev->dev; @@ -176,6 +175,7 @@ static struct platform_driver stm32_pwr_driver = { .probe = stm32_pwr_regulator_probe, .driver = { .name = "stm32-pwr-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(stm32_pwr_of_match), }, }; diff --git a/drivers/regulator/stm32-vrefbuf.c b/drivers/regulator/stm32-vrefbuf.c index 7a454b7b6eab..f5ccc7dd309a 100644 --- a/drivers/regulator/stm32-vrefbuf.c +++ b/drivers/regulator/stm32-vrefbuf.c @@ -285,6 +285,7 @@ static struct platform_driver stm32_vrefbuf_driver = { .remove = stm32_vrefbuf_remove, .driver = { .name = "stm32-vrefbuf", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(stm32_vrefbuf_of_match), .pm = &stm32_vrefbuf_pm_ops, }, diff --git a/drivers/regulator/stpmic1_regulator.c b/drivers/regulator/stpmic1_regulator.c index 2d7597c76e4a..79d1a3eb18d4 100644 --- a/drivers/regulator/stpmic1_regulator.c +++ b/drivers/regulator/stpmic1_regulator.c @@ -576,7 +576,7 @@ static int stpmic1_regulator_register(struct platform_device *pdev, int id, } /* set mask reset */ - if (of_get_property(config.of_node, "st,mask-reset", NULL) && + if (of_property_read_bool(config.of_node, "st,mask-reset") && cfg->mask_reset_reg != 0) { ret = regmap_update_bits(pmic_dev->regmap, cfg->mask_reset_reg, @@ -638,6 +638,7 @@ MODULE_DEVICE_TABLE(of, of_pmic_regulator_match); static struct platform_driver stpmic1_regulator_driver = { .driver = { .name = "stpmic1-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(of_pmic_regulator_match), }, .probe = stpmic1_regulator_probe, diff --git a/drivers/regulator/stw481x-vmmc.c b/drivers/regulator/stw481x-vmmc.c index 127ab43add49..3958d906bd77 100644 --- a/drivers/regulator/stw481x-vmmc.c +++ b/drivers/regulator/stw481x-vmmc.c @@ -95,6 +95,7 @@ static const struct of_device_id stw481x_vmmc_match[] = { static struct platform_driver stw481x_vmmc_regulator_driver = { .driver = { .name = "stw481x-vmmc-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = stw481x_vmmc_match, }, .probe = stw481x_vmmc_regulator_probe, diff --git a/drivers/regulator/sy7636a-regulator.c b/drivers/regulator/sy7636a-regulator.c index 29fc27c2cda0..d1e7ba1fb3e1 100644 --- a/drivers/regulator/sy7636a-regulator.c +++ b/drivers/regulator/sy7636a-regulator.c @@ -127,6 +127,7 @@ MODULE_DEVICE_TABLE(platform, sy7636a_regulator_id_table); static struct platform_driver sy7636a_regulator_driver = { .driver = { .name = "sy7636a-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = sy7636a_regulator_probe, .id_table = sy7636a_regulator_id_table, diff --git a/drivers/regulator/sy8106a-regulator.c b/drivers/regulator/sy8106a-regulator.c index b10bd99768a3..e3c753986309 100644 --- a/drivers/regulator/sy8106a-regulator.c +++ b/drivers/regulator/sy8106a-regulator.c @@ -138,6 +138,7 @@ MODULE_DEVICE_TABLE(i2c, sy8106a_i2c_id); static struct i2c_driver sy8106a_regulator_driver = { .driver = { .name = "sy8106a", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = sy8106a_i2c_of_match, }, .probe_new = sy8106a_i2c_probe, diff --git a/drivers/regulator/sy8824x.c b/drivers/regulator/sy8824x.c index 2a81519bdf67..c327ad69f676 100644 --- a/drivers/regulator/sy8824x.c +++ b/drivers/regulator/sy8824x.c @@ -233,6 +233,7 @@ MODULE_DEVICE_TABLE(i2c, sy8824_id); static struct i2c_driver sy8824_regulator_driver = { .driver = { .name = "sy8824-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = sy8824_dt_ids, }, .probe_new = sy8824_i2c_probe, diff --git a/drivers/regulator/sy8827n.c b/drivers/regulator/sy8827n.c index 936a94b6df5b..99ca08cc3a6a 100644 --- a/drivers/regulator/sy8827n.c +++ b/drivers/regulator/sy8827n.c @@ -187,6 +187,7 @@ MODULE_DEVICE_TABLE(i2c, sy8827n_id); static struct i2c_driver sy8827n_regulator_driver = { .driver = { .name = "sy8827n-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = sy8827n_dt_ids, }, .probe_new = sy8827n_i2c_probe, diff --git a/drivers/regulator/ti-abb-regulator.c b/drivers/regulator/ti-abb-regulator.c index 115345e9fded..86d2d80b4b41 100644 --- a/drivers/regulator/ti-abb-regulator.c +++ b/drivers/regulator/ti-abb-regulator.c @@ -865,6 +865,7 @@ static struct platform_driver ti_abb_driver = { .probe = ti_abb_probe, .driver = { .name = "ti_abb", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(ti_abb_of_match), }, }; diff --git a/drivers/regulator/tps51632-regulator.c b/drivers/regulator/tps51632-regulator.c index 152c5ad6709c..9bd4e72914ed 100644 --- a/drivers/regulator/tps51632-regulator.c +++ b/drivers/regulator/tps51632-regulator.c @@ -351,6 +351,7 @@ MODULE_DEVICE_TABLE(i2c, tps51632_id); static struct i2c_driver tps51632_i2c_driver = { .driver = { .name = "tps51632", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(tps51632_of_match), }, .probe_new = tps51632_probe, diff --git a/drivers/regulator/tps6105x-regulator.c b/drivers/regulator/tps6105x-regulator.c index a6469fe05635..a09c6ae6a0ce 100644 --- a/drivers/regulator/tps6105x-regulator.c +++ b/drivers/regulator/tps6105x-regulator.c @@ -93,6 +93,7 @@ static int tps6105x_regulator_probe(struct platform_device *pdev) static struct platform_driver tps6105x_regulator_driver = { .driver = { .name = "tps6105x-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = tps6105x_regulator_probe, }; diff --git a/drivers/regulator/tps62360-regulator.c b/drivers/regulator/tps62360-regulator.c index da1b2b1341ae..65cc08d1a67d 100644 --- a/drivers/regulator/tps62360-regulator.c +++ b/drivers/regulator/tps62360-regulator.c @@ -296,17 +296,10 @@ static struct tps62360_regulator_platform_data * return NULL; } - if (of_find_property(np, "ti,vsel0-state-high", NULL)) - pdata->vsel0_def_state = 1; - - if (of_find_property(np, "ti,vsel1-state-high", NULL)) - pdata->vsel1_def_state = 1; - - if (of_find_property(np, "ti,enable-pull-down", NULL)) - pdata->en_internal_pulldn = true; - - if (of_find_property(np, "ti,enable-vout-discharge", NULL)) - pdata->en_discharge = true; + pdata->vsel0_def_state = of_property_read_bool(np, "ti,vsel0-state-high"); + pdata->vsel1_def_state = of_property_read_bool(np, "ti,vsel1-state-high"); + pdata->en_internal_pulldn = of_property_read_bool(np, "ti,enable-pull-down"); + pdata->en_discharge = of_property_read_bool(np, "ti,enable-vout-discharge"); return pdata; } @@ -495,6 +488,7 @@ MODULE_DEVICE_TABLE(i2c, tps62360_id); static struct i2c_driver tps62360_i2c_driver = { .driver = { .name = "tps62360", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(tps62360_of_match), }, .probe_new = tps62360_probe, diff --git a/drivers/regulator/tps6286x-regulator.c b/drivers/regulator/tps6286x-regulator.c index 207ac1d1d88d..f92e7649d0a0 100644 --- a/drivers/regulator/tps6286x-regulator.c +++ b/drivers/regulator/tps6286x-regulator.c @@ -147,6 +147,7 @@ MODULE_DEVICE_TABLE(i2c, tps6286x_i2c_id); static struct i2c_driver tps6286x_regulator_driver = { .driver = { .name = "tps6286x", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(tps6286x_dt_ids), }, .probe_new = tps6286x_i2c_probe, diff --git a/drivers/regulator/tps65023-regulator.c b/drivers/regulator/tps65023-regulator.c index 680a57ff0837..d87cac63f346 100644 --- a/drivers/regulator/tps65023-regulator.c +++ b/drivers/regulator/tps65023-regulator.c @@ -334,6 +334,7 @@ MODULE_DEVICE_TABLE(i2c, tps_65023_id); static struct i2c_driver tps_65023_i2c_driver = { .driver = { .name = "tps65023", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(tps65023_of_match), }, .probe_new = tps_65023_probe, diff --git a/drivers/regulator/tps6507x-regulator.c b/drivers/regulator/tps6507x-regulator.c index b83816ee6867..6655d9c31187 100644 --- a/drivers/regulator/tps6507x-regulator.c +++ b/drivers/regulator/tps6507x-regulator.c @@ -438,6 +438,7 @@ static int tps6507x_pmic_probe(struct platform_device *pdev) static struct platform_driver tps6507x_pmic_driver = { .driver = { .name = "tps6507x-pmic", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = tps6507x_pmic_probe, }; diff --git a/drivers/regulator/tps65086-regulator.c b/drivers/regulator/tps65086-regulator.c index f1bc54c825dd..663789198ba5 100644 --- a/drivers/regulator/tps65086-regulator.c +++ b/drivers/regulator/tps65086-regulator.c @@ -235,6 +235,7 @@ MODULE_DEVICE_TABLE(platform, tps65086_regulator_id_table); static struct platform_driver tps65086_regulator_driver = { .driver = { .name = "tps65086-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = tps65086_regulator_probe, .id_table = tps65086_regulator_id_table, diff --git a/drivers/regulator/tps65090-regulator.c b/drivers/regulator/tps65090-regulator.c index 1d2e04f452d4..8f916ee366e5 100644 --- a/drivers/regulator/tps65090-regulator.c +++ b/drivers/regulator/tps65090-regulator.c @@ -511,6 +511,7 @@ static int tps65090_regulator_probe(struct platform_device *pdev) static struct platform_driver tps65090_regulator_driver = { .driver = { .name = "tps65090-pmic", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = tps65090_regulator_probe, }; diff --git a/drivers/regulator/tps65132-regulator.c b/drivers/regulator/tps65132-regulator.c index 0edc83089ba2..d4b02ee791d1 100644 --- a/drivers/regulator/tps65132-regulator.c +++ b/drivers/regulator/tps65132-regulator.c @@ -270,6 +270,7 @@ MODULE_DEVICE_TABLE(i2c, tps65132_id); static struct i2c_driver tps65132_i2c_driver = { .driver = { .name = "tps65132", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe_new = tps65132_probe, .id_table = tps65132_id, diff --git a/drivers/regulator/tps65217-regulator.c b/drivers/regulator/tps65217-regulator.c index 6bb5b02e19e2..b167ba22fe16 100644 --- a/drivers/regulator/tps65217-regulator.c +++ b/drivers/regulator/tps65217-regulator.c @@ -258,6 +258,7 @@ static int tps65217_regulator_probe(struct platform_device *pdev) static struct platform_driver tps65217_regulator_driver = { .driver = { .name = "tps65217-pmic", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = tps65217_regulator_probe, }; diff --git a/drivers/regulator/tps65218-regulator.c b/drivers/regulator/tps65218-regulator.c index 48809c3b3abc..13985883e5f0 100644 --- a/drivers/regulator/tps65218-regulator.c +++ b/drivers/regulator/tps65218-regulator.c @@ -349,6 +349,7 @@ MODULE_DEVICE_TABLE(platform, tps65218_regulator_id_table); static struct platform_driver tps65218_regulator_driver = { .driver = { .name = "tps65218-pmic", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = tps65218_regulator_probe, .id_table = tps65218_regulator_id_table, diff --git a/drivers/regulator/tps65219-regulator.c b/drivers/regulator/tps65219-regulator.c index 4b5acaa45049..b1719ee990ab 100644 --- a/drivers/regulator/tps65219-regulator.c +++ b/drivers/regulator/tps65219-regulator.c @@ -380,6 +380,7 @@ MODULE_DEVICE_TABLE(platform, tps65219_regulator_id_table); static struct platform_driver tps65219_regulator_driver = { .driver = { .name = "tps65219-pmic", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = tps65219_regulator_probe, .id_table = tps65219_regulator_id_table, diff --git a/drivers/regulator/tps6524x-regulator.c b/drivers/regulator/tps6524x-regulator.c index 740aeccdfb1f..3fee7e38c68b 100644 --- a/drivers/regulator/tps6524x-regulator.c +++ b/drivers/regulator/tps6524x-regulator.c @@ -628,6 +628,7 @@ static struct spi_driver pmic_driver = { .probe = pmic_probe, .driver = { .name = "tps6524x", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, }; diff --git a/drivers/regulator/tps6586x-regulator.c b/drivers/regulator/tps6586x-regulator.c index 18bf4b885b08..1ab5767590f3 100644 --- a/drivers/regulator/tps6586x-regulator.c +++ b/drivers/regulator/tps6586x-regulator.c @@ -520,6 +520,7 @@ static int tps6586x_regulator_probe(struct platform_device *pdev) static struct platform_driver tps6586x_regulator_driver = { .driver = { .name = "tps6586x-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = tps6586x_regulator_probe, }; diff --git a/drivers/regulator/tps65910-regulator.c b/drivers/regulator/tps65910-regulator.c index 06cbe60c990f..2a0965ba1570 100644 --- a/drivers/regulator/tps65910-regulator.c +++ b/drivers/regulator/tps65910-regulator.c @@ -1255,6 +1255,7 @@ static void tps65910_shutdown(struct platform_device *pdev) static struct platform_driver tps65910_driver = { .driver = { .name = "tps65910-pmic", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = tps65910_probe, .shutdown = tps65910_shutdown, diff --git a/drivers/regulator/tps65912-regulator.c b/drivers/regulator/tps65912-regulator.c index 76f90202ae09..7ff7877a2e09 100644 --- a/drivers/regulator/tps65912-regulator.c +++ b/drivers/regulator/tps65912-regulator.c @@ -150,6 +150,7 @@ MODULE_DEVICE_TABLE(platform, tps65912_regulator_id_table); static struct platform_driver tps65912_regulator_driver = { .driver = { .name = "tps65912-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = tps65912_regulator_probe, .id_table = tps65912_regulator_id_table, diff --git a/drivers/regulator/tps68470-regulator.c b/drivers/regulator/tps68470-regulator.c index 4bca7c4128ab..de7db7690f6b 100644 --- a/drivers/regulator/tps68470-regulator.c +++ b/drivers/regulator/tps68470-regulator.c @@ -175,6 +175,7 @@ static int tps68470_regulator_probe(struct platform_device *pdev) static struct platform_driver tps68470_regulator_driver = { .driver = { .name = "tps68470-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = tps68470_regulator_probe, }; diff --git a/drivers/regulator/twl-regulator.c b/drivers/regulator/twl-regulator.c index e2a20d512152..3e724f5345de 100644 --- a/drivers/regulator/twl-regulator.c +++ b/drivers/regulator/twl-regulator.c @@ -656,6 +656,7 @@ static struct platform_driver twlreg_driver = { */ .driver = { .name = "twl4030_reg", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(twl_of_match), }, }; diff --git a/drivers/regulator/twl6030-regulator.c b/drivers/regulator/twl6030-regulator.c index f3856750944f..f9c695f9bde8 100644 --- a/drivers/regulator/twl6030-regulator.c +++ b/drivers/regulator/twl6030-regulator.c @@ -729,7 +729,7 @@ static int twlreg_probe(struct platform_device *pdev) break; } - if (of_get_property(np, "ti,retain-on-reset", NULL)) + if (of_property_read_bool(np, "ti,retain-on-reset")) info->flags |= TWL_6030_WARM_RESET; config.dev = &pdev->dev; @@ -765,6 +765,7 @@ static struct platform_driver twlreg_driver = { */ .driver = { .name = "twl6030_reg", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(twl_of_match), }, }; diff --git a/drivers/regulator/uniphier-regulator.c b/drivers/regulator/uniphier-regulator.c index 39a68b01fc38..7e2785e10dc6 100644 --- a/drivers/regulator/uniphier-regulator.c +++ b/drivers/regulator/uniphier-regulator.c @@ -212,6 +212,7 @@ static struct platform_driver uniphier_regulator_driver = { .remove = uniphier_regulator_remove, .driver = { .name = "uniphier-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = uniphier_regulator_match, }, }; diff --git a/drivers/regulator/userspace-consumer.c b/drivers/regulator/userspace-consumer.c index 402c8037cf39..97f075ed68c9 100644 --- a/drivers/regulator/userspace-consumer.c +++ b/drivers/regulator/userspace-consumer.c @@ -216,6 +216,7 @@ static struct platform_driver regulator_userspace_consumer_driver = { .remove = regulator_userspace_consumer_remove, .driver = { .name = "reg-userspace-consumer", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = regulator_userspace_consumer_of_match, }, }; diff --git a/drivers/regulator/vctrl-regulator.c b/drivers/regulator/vctrl-regulator.c index aac7be3b33f7..85dca90233f6 100644 --- a/drivers/regulator/vctrl-regulator.c +++ b/drivers/regulator/vctrl-regulator.c @@ -543,6 +543,7 @@ static struct platform_driver vctrl_driver = { .probe = vctrl_probe, .driver = { .name = "vctrl-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(vctrl_of_match), }, }; diff --git a/drivers/regulator/vexpress-regulator.c b/drivers/regulator/vexpress-regulator.c index 5d39663efcaa..b545dbc70a4d 100644 --- a/drivers/regulator/vexpress-regulator.c +++ b/drivers/regulator/vexpress-regulator.c @@ -88,6 +88,7 @@ static struct platform_driver vexpress_regulator_driver = { .probe = vexpress_regulator_probe, .driver = { .name = DRVNAME, + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = vexpress_regulator_of_match, }, }; diff --git a/drivers/regulator/virtual.c b/drivers/regulator/virtual.c index 5d32628a5011..d5a160efdae6 100644 --- a/drivers/regulator/virtual.c +++ b/drivers/regulator/virtual.c @@ -362,6 +362,7 @@ static struct platform_driver regulator_virtual_consumer_driver = { .remove = regulator_virtual_remove, .driver = { .name = "reg-virt-consumer", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(regulator_virtual_consumer_of_match), }, }; diff --git a/drivers/regulator/vqmmc-ipq4019-regulator.c b/drivers/regulator/vqmmc-ipq4019-regulator.c index c4213f096fe5..086da36abc0b 100644 --- a/drivers/regulator/vqmmc-ipq4019-regulator.c +++ b/drivers/regulator/vqmmc-ipq4019-regulator.c @@ -89,6 +89,7 @@ static struct platform_driver ipq4019_regulator_driver = { .probe = ipq4019_regulator_probe, .driver = { .name = "vqmmc-ipq4019-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, .of_match_table = of_match_ptr(regulator_ipq4019_of_match), }, }; diff --git a/drivers/regulator/wm831x-dcdc.c b/drivers/regulator/wm831x-dcdc.c index e43ed4d93f71..834d7c181971 100644 --- a/drivers/regulator/wm831x-dcdc.c +++ b/drivers/regulator/wm831x-dcdc.c @@ -505,6 +505,7 @@ static struct platform_driver wm831x_buckv_driver = { .probe = wm831x_buckv_probe, .driver = { .name = "wm831x-buckv", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, }; @@ -632,6 +633,7 @@ static struct platform_driver wm831x_buckp_driver = { .probe = wm831x_buckp_probe, .driver = { .name = "wm831x-buckp", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, }; @@ -747,6 +749,7 @@ static struct platform_driver wm831x_boostp_driver = { .probe = wm831x_boostp_probe, .driver = { .name = "wm831x-boostp", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, }; @@ -822,6 +825,7 @@ static struct platform_driver wm831x_epe_driver = { .probe = wm831x_epe_probe, .driver = { .name = "wm831x-epe", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, }; diff --git a/drivers/regulator/wm831x-isink.c b/drivers/regulator/wm831x-isink.c index eade3ae3e333..ed5e191e8896 100644 --- a/drivers/regulator/wm831x-isink.c +++ b/drivers/regulator/wm831x-isink.c @@ -189,6 +189,7 @@ static struct platform_driver wm831x_isink_driver = { .probe = wm831x_isink_probe, .driver = { .name = "wm831x-isink", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, }; diff --git a/drivers/regulator/wm831x-ldo.c b/drivers/regulator/wm831x-ldo.c index e091b189ecc0..76b89b1cd519 100644 --- a/drivers/regulator/wm831x-ldo.c +++ b/drivers/regulator/wm831x-ldo.c @@ -303,6 +303,7 @@ static struct platform_driver wm831x_gp_ldo_driver = { .probe = wm831x_gp_ldo_probe, .driver = { .name = "wm831x-ldo", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, }; @@ -512,6 +513,7 @@ static struct platform_driver wm831x_aldo_driver = { .probe = wm831x_aldo_probe, .driver = { .name = "wm831x-aldo", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, }; @@ -645,6 +647,7 @@ static struct platform_driver wm831x_alive_ldo_driver = { .probe = wm831x_alive_ldo_probe, .driver = { .name = "wm831x-alive-ldo", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, }; diff --git a/drivers/regulator/wm8350-regulator.c b/drivers/regulator/wm8350-regulator.c index b1d5aac8917d..1445bafcab40 100644 --- a/drivers/regulator/wm8350-regulator.c +++ b/drivers/regulator/wm8350-regulator.c @@ -1309,6 +1309,7 @@ static struct platform_driver wm8350_regulator_driver = { .remove = wm8350_regulator_remove, .driver = { .name = "wm8350-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, }; diff --git a/drivers/regulator/wm8400-regulator.c b/drivers/regulator/wm8400-regulator.c index e9fd13707721..c4a229f66dec 100644 --- a/drivers/regulator/wm8400-regulator.c +++ b/drivers/regulator/wm8400-regulator.c @@ -223,6 +223,7 @@ static int wm8400_regulator_probe(struct platform_device *pdev) static struct platform_driver wm8400_regulator_driver = { .driver = { .name = "wm8400-regulator", + .probe_type = PROBE_PREFER_ASYNCHRONOUS, }, .probe = wm8400_regulator_probe, }; diff --git a/drivers/regulator/wm8994-regulator.c b/drivers/regulator/wm8994-regulator.c index 40befdd9dfa9..2946db448aec 100644 --- a/drivers/regulator/wm8994-regulator.c +++ b/drivers/regulator/wm8994-regulator.c @@ -227,6 +227,7 @@ static struct platform_driver wm8994_ldo_driver = { .probe = wm8994_ldo_probe, .driver = { .name = "wm8994-ldo", + .probe_type = PROBE_FORCE_SYNCHRONOUS, }, }; |