Thread (38 messages) 38 messages, 9 authors, 2014-04-03

[PATCH v2 01/11] base: power: Add generic OF-based power domain look-up

From: Lorenzo Pieralisi <hidden>
Date: 2014-03-05 18:37:17
Also in: linux-devicetree, linux-pm, linux-samsung-soc

On Mon, Mar 03, 2014 at 04:02:06PM +0000, Tomasz Figa wrote:

[...]
+/**
+ * genpd_bind_domain - Bind device to its power domain using Device Tree.
+ * @dev: Device to bind to its power domain.
+ *
+ * Tries to parse power domain specifier from device's OF node and if succeeds
+ * attaches the device to retrieved power domain.
+ *
+ * Returns 0 on success or negative error code otherwise.
+ */
+int genpd_bind_domain(struct device *dev)
+{
+       struct of_phandle_args pd_args;
+       struct generic_pm_domain *pd;
+       int ret;
+
+       if (!dev->of_node)
+               return 0;
Returning 0 (ie success) is deliberate here right ? It is a bit misleading
but I can see why (if a device has no backing DT node, it is up to
platform code to bind it). Probably deserves a comment.
+
+       ret = of_parse_phandle_with_args(dev->of_node, "power-domain",
+                                       "#power-domain-cells", 0, &pd_args);
+       if (ret < 0) {
+               if (ret != -ENOENT)
+                       return ret;
+
+               /*
+                * Try legacy Samsung-specific bindings
+                * (for backwards compatibility of DT ABI)
+                */
+               pd_args.args_count = 0;
+               pd_args.np = of_parse_phandle(dev->of_node,
+                                               "samsung,power-domain", 0);
+               if (!pd_args.np)
+                       return 0;
Same here.
+       }
+
+       pd = of_genpd_get_from_provider(&pd_args);
+       if (IS_ERR(pd)) {
+               if (PTR_ERR(pd) != -EPROBE_DEFER)
+                       dev_err(dev, "failed to find power domain: %ld\n",
+                               PTR_ERR(pd));
+               return PTR_ERR(pd);
+       }
+
+       dev_dbg(dev, "adding to power domain %s\n", pd->name);
+
+       while (1) {
+               ret = pm_genpd_add_device(pd, dev);
+               if (ret != -EAGAIN)
+                       break;
+               cond_resched();
+       }
+
+       if (ret < 0) {
+               dev_err(dev, "failed to add to power domain %s: %d",
+                       pd->name, ret);
+               return ret;
+       }
+
+       pm_genpd_dev_need_restore(dev, true);
+
+       return 0;
+}
+
+/**
+ * genpd_unbind_domain - Unbind device from its power domain.
+ * @dev: Device to unbind from its power domain.
+ *
+ * Unbinds device from power domain previously bound to it.
+ *
+ * Returns 0 on success or negative error code otherwise.
+ */
+int genpd_unbind_domain(struct device *dev)
+{
+       struct generic_pm_domain *pd = dev_to_genpd(dev);
+       int ret;
+
+       if (!dev->of_node || IS_ERR(pd))
+               return 0;
And here.

Thanks for posting it,
Lorenzo
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help