diff options
author | Bjorn Andersson <bjorn.andersson@linaro.org> | 2016-08-04 01:04:05 -0400 |
---|---|---|
committer | Sebastian Reichel <sre@kernel.org> | 2016-08-15 18:29:22 -0400 |
commit | c1a9634f1aaf5e10c23f8890ea2e64c61d48cb44 (patch) | |
tree | 0343e34cde7460534ec10e47bc3c38eefff8d9a3 /drivers/power | |
parent | 957cb720518341abf19009044f240a6342bdd039 (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.c | 59 | ||||
-rw-r--r-- | drivers/power/reset/reboot-mode.h | 4 |
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 | } |
136 | EXPORT_SYMBOL_GPL(reboot_mode_unregister); | 136 | EXPORT_SYMBOL_GPL(reboot_mode_unregister); |
137 | 137 | ||
138 | static 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 | */ | ||
150 | int 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 | } | ||
171 | EXPORT_SYMBOL_GPL(devm_reboot_mode_register); | ||
172 | |||
173 | static 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 | */ | ||
188 | void 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 | } | ||
195 | EXPORT_SYMBOL_GPL(devm_reboot_mode_unregister); | ||
196 | |||
138 | MODULE_AUTHOR("Andy Yan <andy.yan@rock-chips.com"); | 197 | MODULE_AUTHOR("Andy Yan <andy.yan@rock-chips.com"); |
139 | MODULE_DESCRIPTION("System reboot mode core library"); | 198 | MODULE_DESCRIPTION("System reboot mode core library"); |
140 | MODULE_LICENSE("GPL v2"); | 199 | MODULE_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 | ||
11 | int reboot_mode_register(struct reboot_mode_driver *reboot); | 11 | int reboot_mode_register(struct reboot_mode_driver *reboot); |
12 | int reboot_mode_unregister(struct reboot_mode_driver *reboot); | 12 | int reboot_mode_unregister(struct reboot_mode_driver *reboot); |
13 | int devm_reboot_mode_register(struct device *dev, | ||
14 | struct reboot_mode_driver *reboot); | ||
15 | void devm_reboot_mode_unregister(struct device *dev, | ||
16 | struct reboot_mode_driver *reboot); | ||
13 | 17 | ||
14 | #endif | 18 | #endif |