aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/power
diff options
context:
space:
mode:
authorBjorn Andersson <bjorn.andersson@linaro.org>2016-08-04 01:04:05 -0400
committerSebastian Reichel <sre@kernel.org>2016-08-15 18:29:22 -0400
commitc1a9634f1aaf5e10c23f8890ea2e64c61d48cb44 (patch)
tree0343e34cde7460534ec10e47bc3c38eefff8d9a3 /drivers/power
parent957cb720518341abf19009044f240a6342bdd039 (diff)
power: reset: reboot-mode: Add managed resource API
Provide managed resource version of reboot_mode_register() and reboot_mode_unregister() to simplify implementations. Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org> Tested-by: John Stultz <john.stultz@linaro.org> Signed-off-by: Sebastian Reichel <sre@kernel.org>
Diffstat (limited to 'drivers/power')
-rw-r--r--drivers/power/reset/reboot-mode.c59
-rw-r--r--drivers/power/reset/reboot-mode.h4
2 files changed, 63 insertions, 0 deletions
diff --git a/drivers/power/reset/reboot-mode.c b/drivers/power/reset/reboot-mode.c
index 2dfbbce0f817..fb512183ace3 100644
--- a/drivers/power/reset/reboot-mode.c
+++ b/drivers/power/reset/reboot-mode.c
@@ -135,6 +135,65 @@ int reboot_mode_unregister(struct reboot_mode_driver *reboot)
135} 135}
136EXPORT_SYMBOL_GPL(reboot_mode_unregister); 136EXPORT_SYMBOL_GPL(reboot_mode_unregister);
137 137
138static void devm_reboot_mode_release(struct device *dev, void *res)
139{
140 reboot_mode_unregister(*(struct reboot_mode_driver **)res);
141}
142
143/**
144 * devm_reboot_mode_register() - resource managed reboot_mode_register()
145 * @dev: device to associate this resource with
146 * @reboot: reboot mode driver
147 *
148 * Returns: 0 on success or a negative error code on failure.
149 */
150int devm_reboot_mode_register(struct device *dev,
151 struct reboot_mode_driver *reboot)
152{
153 struct reboot_mode_driver **dr;
154 int rc;
155
156 dr = devres_alloc(devm_reboot_mode_release, sizeof(*dr), GFP_KERNEL);
157 if (!dr)
158 return -ENOMEM;
159
160 rc = reboot_mode_register(reboot);
161 if (rc) {
162 devres_free(dr);
163 return rc;
164 }
165
166 *dr = reboot;
167 devres_add(dev, dr);
168
169 return 0;
170}
171EXPORT_SYMBOL_GPL(devm_reboot_mode_register);
172
173static int devm_reboot_mode_match(struct device *dev, void *res, void *data)
174{
175 struct reboot_mode_driver **p = res;
176
177 if (WARN_ON(!p || !*p))
178 return 0;
179
180 return *p == data;
181}
182
183/**
184 * devm_reboot_mode_unregister() - resource managed reboot_mode_unregister()
185 * @dev: device to associate this resource with
186 * @reboot: reboot mode driver
187 */
188void devm_reboot_mode_unregister(struct device *dev,
189 struct reboot_mode_driver *reboot)
190{
191 WARN_ON(devres_release(dev,
192 devm_reboot_mode_release,
193 devm_reboot_mode_match, reboot));
194}
195EXPORT_SYMBOL_GPL(devm_reboot_mode_unregister);
196
138MODULE_AUTHOR("Andy Yan <andy.yan@rock-chips.com"); 197MODULE_AUTHOR("Andy Yan <andy.yan@rock-chips.com");
139MODULE_DESCRIPTION("System reboot mode core library"); 198MODULE_DESCRIPTION("System reboot mode core library");
140MODULE_LICENSE("GPL v2"); 199MODULE_LICENSE("GPL v2");
diff --git a/drivers/power/reset/reboot-mode.h b/drivers/power/reset/reboot-mode.h
index 2491bb71f591..75f7fe5c881f 100644
--- a/drivers/power/reset/reboot-mode.h
+++ b/drivers/power/reset/reboot-mode.h
@@ -10,5 +10,9 @@ struct reboot_mode_driver {
10 10
11int reboot_mode_register(struct reboot_mode_driver *reboot); 11int reboot_mode_register(struct reboot_mode_driver *reboot);
12int reboot_mode_unregister(struct reboot_mode_driver *reboot); 12int reboot_mode_unregister(struct reboot_mode_driver *reboot);
13int devm_reboot_mode_register(struct device *dev,
14 struct reboot_mode_driver *reboot);
15void devm_reboot_mode_unregister(struct device *dev,
16 struct reboot_mode_driver *reboot);
13 17
14#endif 18#endif