[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