aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/power/reset/reboot-mode.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/power/reset/reboot-mode.c')
-rw-r--r--drivers/power/reset/reboot-mode.c59
1 files changed, 59 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");