Commit f8702f9e authored by Dmitry Osipenko's avatar Dmitry Osipenko Committed by Mark Brown

regulator: core: Use ww_mutex for regulators locking

Wait/wound mutex shall be used in order to avoid lockups on locking of
coupled regulators.
Signed-off-by: default avatarDmitry Osipenko <digetx@gmail.com>
Suggested-by: default avatarLucas Stach <l.stach@pengutronix.de>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 6303f3e7
This diff is collapsed.
...@@ -131,7 +131,7 @@ static irqreturn_t da9210_irq_handler(int irq, void *data) ...@@ -131,7 +131,7 @@ static irqreturn_t da9210_irq_handler(int irq, void *data)
if (error < 0) if (error < 0)
goto error_i2c; goto error_i2c;
mutex_lock(&chip->rdev->mutex); regulator_lock(chip->rdev);
if (val & DA9210_E_OVCURR) { if (val & DA9210_E_OVCURR) {
regulator_notifier_call_chain(chip->rdev, regulator_notifier_call_chain(chip->rdev,
...@@ -157,7 +157,7 @@ static irqreturn_t da9210_irq_handler(int irq, void *data) ...@@ -157,7 +157,7 @@ static irqreturn_t da9210_irq_handler(int irq, void *data)
handled |= DA9210_E_VMAX; handled |= DA9210_E_VMAX;
} }
mutex_unlock(&chip->rdev->mutex); regulator_unlock(chip->rdev);
if (handled) { if (handled) {
/* Clear handled events */ /* Clear handled events */
......
...@@ -489,14 +489,14 @@ static irqreturn_t stpmic1_curlim_irq_handler(int irq, void *data) ...@@ -489,14 +489,14 @@ static irqreturn_t stpmic1_curlim_irq_handler(int irq, void *data)
{ {
struct regulator_dev *rdev = (struct regulator_dev *)data; struct regulator_dev *rdev = (struct regulator_dev *)data;
mutex_lock(&rdev->mutex); regulator_lock(rdev, NULL);
/* Send an overcurrent notification */ /* Send an overcurrent notification */
regulator_notifier_call_chain(rdev, regulator_notifier_call_chain(rdev,
REGULATOR_EVENT_OVER_CURRENT, REGULATOR_EVENT_OVER_CURRENT,
NULL); NULL);
mutex_unlock(&rdev->mutex); regulator_unlock(rdev);
return IRQ_HANDLED; return IRQ_HANDLED;
} }
......
...@@ -1153,7 +1153,7 @@ static irqreturn_t pmic_uv_handler(int irq, void *data) ...@@ -1153,7 +1153,7 @@ static irqreturn_t pmic_uv_handler(int irq, void *data)
{ {
struct regulator_dev *rdev = (struct regulator_dev *)data; struct regulator_dev *rdev = (struct regulator_dev *)data;
mutex_lock(&rdev->mutex); regulator_lock(rdev);
if (irq == WM8350_IRQ_CS1 || irq == WM8350_IRQ_CS2) if (irq == WM8350_IRQ_CS1 || irq == WM8350_IRQ_CS2)
regulator_notifier_call_chain(rdev, regulator_notifier_call_chain(rdev,
REGULATOR_EVENT_REGULATION_OUT, REGULATOR_EVENT_REGULATION_OUT,
...@@ -1162,7 +1162,7 @@ static irqreturn_t pmic_uv_handler(int irq, void *data) ...@@ -1162,7 +1162,7 @@ static irqreturn_t pmic_uv_handler(int irq, void *data)
regulator_notifier_call_chain(rdev, regulator_notifier_call_chain(rdev,
REGULATOR_EVENT_UNDER_VOLTAGE, REGULATOR_EVENT_UNDER_VOLTAGE,
NULL); NULL);
mutex_unlock(&rdev->mutex); regulator_unlock(rdev);
return IRQ_HANDLED; return IRQ_HANDLED;
} }
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include <linux/device.h> #include <linux/device.h>
#include <linux/notifier.h> #include <linux/notifier.h>
#include <linux/regulator/consumer.h> #include <linux/regulator/consumer.h>
#include <linux/ww_mutex.h>
struct gpio_desc; struct gpio_desc;
struct regmap; struct regmap;
...@@ -462,7 +463,7 @@ struct regulator_dev { ...@@ -462,7 +463,7 @@ struct regulator_dev {
struct coupling_desc coupling_desc; struct coupling_desc coupling_desc;
struct blocking_notifier_head notifier; struct blocking_notifier_head notifier;
struct mutex mutex; /* consumer lock */ struct ww_mutex mutex; /* consumer lock */
struct task_struct *mutex_owner; struct task_struct *mutex_owner;
int ref_cnt; int ref_cnt;
struct module *owner; struct module *owner;
...@@ -545,4 +546,7 @@ int regulator_set_active_discharge_regmap(struct regulator_dev *rdev, ...@@ -545,4 +546,7 @@ int regulator_set_active_discharge_regmap(struct regulator_dev *rdev,
bool enable); bool enable);
void *regulator_get_init_drvdata(struct regulator_init_data *reg_init_data); void *regulator_get_init_drvdata(struct regulator_init_data *reg_init_data);
void regulator_lock(struct regulator_dev *rdev);
void regulator_unlock(struct regulator_dev *rdev);
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment