aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/reset/core.c
diff options
context:
space:
mode:
authorOlof Johansson <olof@lixom.net>2016-06-03 12:18:58 -0700
committerOlof Johansson <olof@lixom.net>2016-06-03 12:18:58 -0700
commite7a6bb9a05ea9d755f7fc78bd5b8a16632a26fb8 (patch)
treee8c66ed4e5662ced238a9218826e53a6d5a80e8d /drivers/reset/core.c
parentLinux 4.7-rc1 (diff)
parentreset: Return -ENOTSUPP when not configured (diff)
Merge tag 'reset-for-4.8' of git://git.pengutronix.de/git/pza/linux into next/drivers
Reset controller changes for v4.8 - add devm_reset_controller_register API to get rid of a good amount of boilerplate across reset drivers. - move reset controller Kconfig options into a sub-menu - fix inconsistent return values, let all reset_control_get stubs return -ENOTSUPP * tag 'reset-for-4.8' of git://git.pengutronix.de/git/pza/linux: reset: Return -ENOTSUPP when not configured reset: oxnas: Use devm register API and get rid of platform remove reset: fix Kconfig menu to include reset drivers in sub-menu reset: zynq: use devm_reset_controller_register() reset: socfpga: use devm_reset_controller_register() reset: sunxi: use devm_reset_controller_register() reset: pistachio: use devm_reset_controller_register() reset: ath79: use devm_reset_controller_register() reset: add devm_reset_controller_register API Signed-off-by: Olof Johansson <olof@lixom.net>
Diffstat (limited to 'drivers/reset/core.c')
-rw-r--r--drivers/reset/core.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/drivers/reset/core.c b/drivers/reset/core.c
index 72b32bd15549..395dc9ce492e 100644
--- a/drivers/reset/core.c
+++ b/drivers/reset/core.c
@@ -93,6 +93,43 @@ void reset_controller_unregister(struct reset_controller_dev *rcdev)
}
EXPORT_SYMBOL_GPL(reset_controller_unregister);
+static void devm_reset_controller_release(struct device *dev, void *res)
+{
+ reset_controller_unregister(*(struct reset_controller_dev **)res);
+}
+
+/**
+ * devm_reset_controller_register - resource managed reset_controller_register()
+ * @dev: device that is registering this reset controller
+ * @rcdev: a pointer to the initialized reset controller device
+ *
+ * Managed reset_controller_register(). For reset controllers registered by
+ * this function, reset_controller_unregister() is automatically called on
+ * driver detach. See reset_controller_register() for more information.
+ */
+int devm_reset_controller_register(struct device *dev,
+ struct reset_controller_dev *rcdev)
+{
+ struct reset_controller_dev **rcdevp;
+ int ret;
+
+ rcdevp = devres_alloc(devm_reset_controller_release, sizeof(*rcdevp),
+ GFP_KERNEL);
+ if (!rcdevp)
+ return -ENOMEM;
+
+ ret = reset_controller_register(rcdev);
+ if (!ret) {
+ *rcdevp = rcdev;
+ devres_add(dev, rcdevp);
+ } else {
+ devres_free(rcdevp);
+ }
+
+ return ret;
+}
+EXPORT_SYMBOL_GPL(devm_reset_controller_register);
+
/**
* reset_control_reset - reset the controlled device
* @rstc: reset controller