]> git.openfabrics.org - ~emulex/infiniband.git/commitdiff
reset: Add of_reset_control_get
authorMaxime Ripard <maxime.ripard@free-electrons.com>
Fri, 20 Dec 2013 21:41:07 +0000 (22:41 +0100)
committerPhilipp Zabel <p.zabel@pengutronix.de>
Mon, 3 Feb 2014 09:19:40 +0000 (10:19 +0100)
In some cases, you might need to deassert from reset an hardware block that
doesn't associated to a struct device (CPUs, timers, etc.).

Add a small helper to retrieve the reset controller from the device tree
without the need to pass a struct device.

Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
drivers/reset/core.c
include/linux/reset.h

index 217d2fa4fd951b7bb212c88c1e73ea37a2aff64d..baeaf82d40d9f1982761d68ee1cf0c56cd6c346e 100644 (file)
@@ -126,15 +126,16 @@ int reset_control_deassert(struct reset_control *rstc)
 EXPORT_SYMBOL_GPL(reset_control_deassert);
 
 /**
- * reset_control_get - Lookup and obtain a reference to a reset controller.
- * @dev: device to be reset by the controller
+ * of_reset_control_get - Lookup and obtain a reference to a reset controller.
+ * @node: device to be reset by the controller
  * @id: reset line name
  *
  * Returns a struct reset_control or IS_ERR() condition containing errno.
  *
  * Use of id names is optional.
  */
-struct reset_control *reset_control_get(struct device *dev, const char *id)
+struct reset_control *of_reset_control_get(struct device_node *node,
+                                          const char *id)
 {
        struct reset_control *rstc = ERR_PTR(-EPROBE_DEFER);
        struct reset_controller_dev *r, *rcdev;
@@ -143,13 +144,10 @@ struct reset_control *reset_control_get(struct device *dev, const char *id)
        int rstc_id;
        int ret;
 
-       if (!dev)
-               return ERR_PTR(-EINVAL);
-
        if (id)
-               index = of_property_match_string(dev->of_node,
+               index = of_property_match_string(node,
                                                 "reset-names", id);
-       ret = of_parse_phandle_with_args(dev->of_node, "resets", "#reset-cells",
+       ret = of_parse_phandle_with_args(node, "resets", "#reset-cells",
                                         index, &args);
        if (ret)
                return ERR_PTR(ret);
@@ -184,12 +182,35 @@ struct reset_control *reset_control_get(struct device *dev, const char *id)
                return ERR_PTR(-ENOMEM);
        }
 
-       rstc->dev = dev;
        rstc->rcdev = rcdev;
        rstc->id = rstc_id;
 
        return rstc;
 }
+EXPORT_SYMBOL_GPL(of_reset_control_get);
+
+/**
+ * reset_control_get - Lookup and obtain a reference to a reset controller.
+ * @dev: device to be reset by the controller
+ * @id: reset line name
+ *
+ * Returns a struct reset_control or IS_ERR() condition containing errno.
+ *
+ * Use of id names is optional.
+ */
+struct reset_control *reset_control_get(struct device *dev, const char *id)
+{
+       struct reset_control *rstc;
+
+       if (!dev)
+               return ERR_PTR(-EINVAL);
+
+       rstc = of_reset_control_get(dev->of_node, id);
+       if (!IS_ERR(rstc))
+               rstc->dev = dev;
+
+       return rstc;
+}
 EXPORT_SYMBOL_GPL(reset_control_get);
 
 /**
index 6082247feab11013e6b1f0faa3e2721bf6a643bc..a398025d113817c75b844a501f1f24b5db2bd08e 100644 (file)
@@ -1,6 +1,8 @@
 #ifndef _LINUX_RESET_H_
 #define _LINUX_RESET_H_
 
+#include <linux/of.h>
+
 struct device;
 struct reset_control;
 
@@ -8,6 +10,8 @@ int reset_control_reset(struct reset_control *rstc);
 int reset_control_assert(struct reset_control *rstc);
 int reset_control_deassert(struct reset_control *rstc);
 
+struct reset_control *of_reset_control_get(struct device_node *node,
+                                          const char *id);
 struct reset_control *reset_control_get(struct device *dev, const char *id);
 void reset_control_put(struct reset_control *rstc);
 struct reset_control *devm_reset_control_get(struct device *dev, const char *id);