pinctrl: nomadik: fix inversion of gpio direction
[deliverable/linux.git] / drivers / pinctrl / core.c
index f67a8b7a4e18252338c54c282152b78971d34225..98d2a1bb44cb2a2c979ce8d428325f47da354f5b 100644 (file)
@@ -1872,6 +1872,69 @@ void pinctrl_unregister(struct pinctrl_dev *pctldev)
 }
 EXPORT_SYMBOL_GPL(pinctrl_unregister);
 
+static void devm_pinctrl_dev_release(struct device *dev, void *res)
+{
+       struct pinctrl_dev *pctldev = *(struct pinctrl_dev **)res;
+
+       pinctrl_unregister(pctldev);
+}
+
+static int devm_pinctrl_dev_match(struct device *dev, void *res, void *data)
+{
+       struct pctldev **r = res;
+
+       if (WARN_ON(!r || !*r))
+               return 0;
+
+       return *r == data;
+}
+
+/**
+ * devm_pinctrl_register() - Resource managed version of pinctrl_register().
+ * @dev: parent device for this pin controller
+ * @pctldesc: descriptor for this pin controller
+ * @driver_data: private pin controller data for this pin controller
+ *
+ * Returns an error pointer if pincontrol register failed. Otherwise
+ * it returns valid pinctrl handle.
+ *
+ * The pinctrl device will be automatically released when the device is unbound.
+ */
+struct pinctrl_dev *devm_pinctrl_register(struct device *dev,
+                                         struct pinctrl_desc *pctldesc,
+                                         void *driver_data)
+{
+       struct pinctrl_dev **ptr, *pctldev;
+
+       ptr = devres_alloc(devm_pinctrl_dev_release, sizeof(*ptr), GFP_KERNEL);
+       if (!ptr)
+               return ERR_PTR(-ENOMEM);
+
+       pctldev = pinctrl_register(pctldesc, dev, driver_data);
+       if (IS_ERR(pctldev)) {
+               devres_free(ptr);
+               return pctldev;
+       }
+
+       *ptr = pctldev;
+       devres_add(dev, ptr);
+
+       return pctldev;
+}
+EXPORT_SYMBOL_GPL(devm_pinctrl_register);
+
+/**
+ * devm_pinctrl_unregister() - Resource managed version of pinctrl_unregister().
+ * @dev: device for which which resource was allocated
+ * @pctldev: the pinctrl device to unregister.
+ */
+void devm_pinctrl_unregister(struct device *dev, struct pinctrl_dev *pctldev)
+{
+       WARN_ON(devres_release(dev, devm_pinctrl_dev_release,
+                              devm_pinctrl_dev_match, pctldev));
+}
+EXPORT_SYMBOL_GPL(devm_pinctrl_unregister);
+
 static int __init pinctrl_init(void)
 {
        pr_info("initialized pinctrl subsystem\n");
This page took 0.031387 seconds and 5 git commands to generate.