[PATCH v1 3/3] regulator: fixed: forward under-voltage events

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Add handler to forward under-voltage events.
On systems for more or less complicated regulator chains we need to
forward under-voltage events to actual driver which need to react on
them.

Signed-off-by: Oleksij Rempel <o.rempel@xxxxxxxxxxxxxx>
---
 drivers/regulator/fixed.c | 36 +++++++++++++++++++++++++++++++++++-
 1 file changed, 35 insertions(+), 1 deletion(-)

diff --git a/drivers/regulator/fixed.c b/drivers/regulator/fixed.c
index 493dd244e4f4..99d37f1ebbc9 100644
--- a/drivers/regulator/fixed.c
+++ b/drivers/regulator/fixed.c
@@ -33,6 +33,7 @@
 struct fixed_voltage_data {
 	struct regulator_desc desc;
 	struct regulator_dev *dev;
+	struct notifier_block nb;
 
 	struct clk *enable_clock;
 	unsigned int enable_counter;
@@ -105,6 +106,39 @@ static int reg_is_enabled(struct regulator_dev *rdev)
 	return priv->enable_counter > 0;
 }
 
+static int reg_fixed_regulator_notifier(struct notifier_block *nb,
+					unsigned long event, void *data)
+{
+	struct fixed_voltage_data *priv =
+		container_of(nb, struct fixed_voltage_data, nb);
+	struct regulator_dev *rdev = priv->dev;
+
+	if (event != REGULATOR_EVENT_UNDER_VOLTAGE_WARN &&
+	    event != REGULATOR_EVENT_UNDER_VOLTAGE)
+		return NOTIFY_OK;
+
+	regulator_notifier_call_chain(rdev, event, NULL);
+
+	return NOTIFY_OK;
+}
+
+static int reg_fixed_register_reg_notifier(struct fixed_voltage_data *priv,
+					   struct device *dev)
+{
+	struct regulator_dev *rdev = priv->dev;
+	int ret;
+
+	if (!rdev->supply)
+		return 0;
+
+	priv->nb.notifier_call = reg_fixed_regulator_notifier;
+	ret = devm_regulator_register_notifier(rdev->supply, &priv->nb);
+	if (ret)
+		return dev_err_probe(dev, ret, "Failed to register notifier\n");
+
+	return 0;
+}
+
 static irqreturn_t reg_fixed_under_voltage_irq_handler(int irq, void *data)
 {
 	struct fixed_voltage_data *priv = data;
@@ -327,7 +361,7 @@ static int reg_fixed_voltage_probe(struct platform_device *pdev)
 	if (ret)
 		return ret;
 
-	return 0;
+	return reg_fixed_register_reg_notifier(drvdata, dev);
 }
 
 #if defined(CONFIG_OF)
-- 
2.39.2





[Index of Archives]     [Device Tree Compilter]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux PCI Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Yosemite Backpacking]


  Powered by Linux