regulator: core: Properly handle case where supply is the couple
Check whether supply regulator is the couple to avoid infinite recursion during of locking. Signed-off-by: Dmitry Osipenko <digetx@gmail.com> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
f8702f9e4a
commit
089e2cc2e1
|
@ -233,6 +233,21 @@ void regulator_unlock(struct regulator_dev *rdev)
|
|||
mutex_unlock(®ulator_nesting_mutex);
|
||||
}
|
||||
|
||||
static bool regulator_supply_is_couple(struct regulator_dev *rdev)
|
||||
{
|
||||
struct regulator_dev *c_rdev;
|
||||
int i;
|
||||
|
||||
for (i = 1; i < rdev->coupling_desc.n_coupled; i++) {
|
||||
c_rdev = rdev->coupling_desc.coupled_rdevs[i];
|
||||
|
||||
if (rdev->supply->rdev == c_rdev)
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static void regulator_unlock_recursive(struct regulator_dev *rdev,
|
||||
unsigned int n_coupled)
|
||||
{
|
||||
|
@ -245,7 +260,7 @@ static void regulator_unlock_recursive(struct regulator_dev *rdev,
|
|||
if (!c_rdev)
|
||||
continue;
|
||||
|
||||
if (c_rdev->supply)
|
||||
if (c_rdev->supply && !regulator_supply_is_couple(c_rdev))
|
||||
regulator_unlock_recursive(
|
||||
c_rdev->supply->rdev,
|
||||
c_rdev->coupling_desc.n_coupled);
|
||||
|
@ -283,7 +298,7 @@ static int regulator_lock_recursive(struct regulator_dev *rdev,
|
|||
*old_contended_rdev = NULL;
|
||||
}
|
||||
|
||||
if (c_rdev->supply) {
|
||||
if (c_rdev->supply && !regulator_supply_is_couple(c_rdev)) {
|
||||
err = regulator_lock_recursive(c_rdev->supply->rdev,
|
||||
new_contended_rdev,
|
||||
old_contended_rdev,
|
||||
|
|
Loading…
Reference in New Issue