xref: /linux/drivers/regulator/devres.c (revision 4dd10fbbeb9c33709edc89916e19c03c780a0751)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * devres.c  --  Voltage/Current Regulator framework devres implementation.
4  *
5  * Copyright 2013 Linaro Ltd
6  */
7 
8 #include <linux/kernel.h>
9 #include <linux/err.h>
10 #include <linux/regmap.h>
11 #include <linux/regulator/consumer.h>
12 #include <linux/regulator/driver.h>
13 #include <linux/module.h>
14 
15 #include "internal.h"
16 
17 static void devm_regulator_release(struct device *dev, void *res)
18 {
19 	regulator_put(*(struct regulator **)res);
20 }
21 
22 static struct regulator *_devm_regulator_get(struct device *dev, const char *id,
23 					     enum regulator_get_type get_type)
24 {
25 	struct regulator **ptr, *regulator;
26 
27 	ptr = devres_alloc(devm_regulator_release, sizeof(*ptr), GFP_KERNEL);
28 	if (!ptr)
29 		return ERR_PTR(-ENOMEM);
30 
31 	regulator = _regulator_get(dev, id, get_type);
32 	if (!IS_ERR(regulator)) {
33 		*ptr = regulator;
34 		devres_add(dev, ptr);
35 	} else {
36 		devres_free(ptr);
37 	}
38 
39 	return regulator;
40 }
41 
42 /**
43  * devm_regulator_get - Resource managed regulator_get()
44  * @dev: device to supply
45  * @id:  supply name or regulator ID.
46  *
47  * Managed regulator_get(). Regulators returned from this function are
48  * automatically regulator_put() on driver detach. See regulator_get() for more
49  * information.
50  */
51 struct regulator *devm_regulator_get(struct device *dev, const char *id)
52 {
53 	return _devm_regulator_get(dev, id, NORMAL_GET);
54 }
55 EXPORT_SYMBOL_GPL(devm_regulator_get);
56 
57 /**
58  * devm_regulator_get_exclusive - Resource managed regulator_get_exclusive()
59  * @dev: device to supply
60  * @id:  supply name or regulator ID.
61  *
62  * Managed regulator_get_exclusive(). Regulators returned from this function
63  * are automatically regulator_put() on driver detach. See regulator_get() for
64  * more information.
65  */
66 struct regulator *devm_regulator_get_exclusive(struct device *dev,
67 					       const char *id)
68 {
69 	return _devm_regulator_get(dev, id, EXCLUSIVE_GET);
70 }
71 EXPORT_SYMBOL_GPL(devm_regulator_get_exclusive);
72 
73 static void regulator_action_disable(void *d)
74 {
75 	struct regulator *r = (struct regulator *)d;
76 
77 	regulator_disable(r);
78 }
79 
80 static int _devm_regulator_get_enable(struct device *dev, const char *id,
81 				      enum regulator_get_type get_type)
82 {
83 	struct regulator *r;
84 	int ret;
85 
86 	r = _devm_regulator_get(dev, id, get_type);
87 	if (IS_ERR(r))
88 		return PTR_ERR(r);
89 
90 	ret = regulator_enable(r);
91 	if (!ret)
92 		ret = devm_add_action_or_reset(dev, &regulator_action_disable, r);
93 
94 	if (ret)
95 		devm_regulator_put(r);
96 
97 	return ret;
98 }
99 
100 /**
101  * devm_regulator_get_enable_optional - Resource managed regulator get and enable
102  * @dev: device to supply
103  * @id:  supply name or regulator ID.
104  *
105  * Get and enable regulator for duration of the device life-time.
106  * regulator_disable() and regulator_put() are automatically called on driver
107  * detach. See regulator_get_optional() and regulator_enable() for more
108  * information.
109  */
110 int devm_regulator_get_enable_optional(struct device *dev, const char *id)
111 {
112 	return _devm_regulator_get_enable(dev, id, OPTIONAL_GET);
113 }
114 EXPORT_SYMBOL_GPL(devm_regulator_get_enable_optional);
115 
116 /**
117  * devm_regulator_get_enable - Resource managed regulator get and enable
118  * @dev: device to supply
119  * @id:  supply name or regulator ID.
120  *
121  * Get and enable regulator for duration of the device life-time.
122  * regulator_disable() and regulator_put() are automatically called on driver
123  * detach. See regulator_get() and regulator_enable() for more
124  * information.
125  */
126 int devm_regulator_get_enable(struct device *dev, const char *id)
127 {
128 	return _devm_regulator_get_enable(dev, id, NORMAL_GET);
129 }
130 EXPORT_SYMBOL_GPL(devm_regulator_get_enable);
131 
132 /**
133  * devm_regulator_get_optional - Resource managed regulator_get_optional()
134  * @dev: device to supply
135  * @id:  supply name or regulator ID.
136  *
137  * Managed regulator_get_optional(). Regulators returned from this
138  * function are automatically regulator_put() on driver detach. See
139  * regulator_get_optional() for more information.
140  */
141 struct regulator *devm_regulator_get_optional(struct device *dev,
142 					      const char *id)
143 {
144 	return _devm_regulator_get(dev, id, OPTIONAL_GET);
145 }
146 EXPORT_SYMBOL_GPL(devm_regulator_get_optional);
147 
148 /**
149  * devm_regulator_get_enable_read_voltage - Resource managed regulator get and
150  *                                          enable that returns the voltage
151  * @dev: device to supply
152  * @id:  supply name or regulator ID.
153  *
154  * Get and enable regulator for duration of the device life-time.
155  * regulator_disable() and regulator_put() are automatically called on driver
156  * detach. See regulator_get_optional(), regulator_enable(), and
157  * regulator_get_voltage() for more information.
158  *
159  * This is a convenience function for supplies that provide a reference voltage
160  * where the consumer driver just needs to know the voltage and keep the
161  * regulator enabled.
162  *
163  * In cases where the supply is not strictly required, callers can check for
164  * -ENODEV error and handle it accordingly.
165  *
166  * Returns: voltage in microvolts on success, or an negative error number on failure.
167  */
168 int devm_regulator_get_enable_read_voltage(struct device *dev, const char *id)
169 {
170 	struct regulator *r;
171 	int ret;
172 
173 	/*
174 	 * Since we need a real voltage, we use devm_regulator_get_optional()
175 	 * rather than getting a dummy regulator with devm_regulator_get() and
176 	 * then letting regulator_get_voltage() fail with -EINVAL. This way, the
177 	 * caller can handle the -ENODEV negative error number if needed instead
178 	 * of the ambiguous -EINVAL.
179 	 */
180 	r = devm_regulator_get_optional(dev, id);
181 	if (IS_ERR(r))
182 		return PTR_ERR(r);
183 
184 	ret = regulator_enable(r);
185 	if (ret)
186 		goto err_regulator_put;
187 
188 	ret = devm_add_action_or_reset(dev, regulator_action_disable, r);
189 	if (ret)
190 		goto err_regulator_put;
191 
192 	ret = regulator_get_voltage(r);
193 	if (ret < 0)
194 		goto err_release_action;
195 
196 	return ret;
197 
198 err_release_action:
199 	devm_release_action(dev, regulator_action_disable, r);
200 err_regulator_put:
201 	devm_regulator_put(r);
202 
203 	return ret;
204 }
205 EXPORT_SYMBOL_GPL(devm_regulator_get_enable_read_voltage);
206 
207 static int devm_regulator_match(struct device *dev, void *res, void *data)
208 {
209 	struct regulator **r = res;
210 	if (!r || !*r) {
211 		WARN_ON(!r || !*r);
212 		return 0;
213 	}
214 	return *r == data;
215 }
216 
217 /**
218  * devm_regulator_put - Resource managed regulator_put()
219  * @regulator: regulator to free
220  *
221  * Deallocate a regulator allocated with devm_regulator_get(). Normally
222  * this function will not need to be called and the resource management
223  * code will ensure that the resource is freed.
224  */
225 void devm_regulator_put(struct regulator *regulator)
226 {
227 	int rc;
228 
229 	rc = devres_release(regulator->dev, devm_regulator_release,
230 			    devm_regulator_match, regulator);
231 	if (rc != 0)
232 		WARN_ON(rc);
233 }
234 EXPORT_SYMBOL_GPL(devm_regulator_put);
235 
236 struct regulator_bulk_devres {
237 	struct regulator_bulk_data *consumers;
238 	int num_consumers;
239 };
240 
241 static void devm_regulator_bulk_release(struct device *dev, void *res)
242 {
243 	struct regulator_bulk_devres *devres = res;
244 
245 	regulator_bulk_free(devres->num_consumers, devres->consumers);
246 }
247 
248 static int _devm_regulator_bulk_get(struct device *dev, int num_consumers,
249 				    struct regulator_bulk_data *consumers,
250 				    enum regulator_get_type get_type)
251 {
252 	struct regulator_bulk_devres *devres;
253 	int ret;
254 
255 	devres = devres_alloc(devm_regulator_bulk_release,
256 			      sizeof(*devres), GFP_KERNEL);
257 	if (!devres)
258 		return -ENOMEM;
259 
260 	ret = _regulator_bulk_get(dev, num_consumers, consumers, get_type);
261 	if (!ret) {
262 		devres->consumers = consumers;
263 		devres->num_consumers = num_consumers;
264 		devres_add(dev, devres);
265 	} else {
266 		devres_free(devres);
267 	}
268 
269 	return ret;
270 }
271 
272 /**
273  * devm_regulator_bulk_get - managed get multiple regulator consumers
274  *
275  * @dev:           device to supply
276  * @num_consumers: number of consumers to register
277  * @consumers:     configuration of consumers; clients are stored here.
278  *
279  * @return 0 on success, a negative error number on failure.
280  *
281  * This helper function allows drivers to get several regulator
282  * consumers in one operation with management, the regulators will
283  * automatically be freed when the device is unbound.  If any of the
284  * regulators cannot be acquired then any regulators that were
285  * allocated will be freed before returning to the caller.
286  */
287 int devm_regulator_bulk_get(struct device *dev, int num_consumers,
288 			    struct regulator_bulk_data *consumers)
289 {
290 	return _devm_regulator_bulk_get(dev, num_consumers, consumers, NORMAL_GET);
291 }
292 EXPORT_SYMBOL_GPL(devm_regulator_bulk_get);
293 
294 /**
295  * devm_regulator_bulk_get_exclusive - managed exclusive get of multiple
296  * regulator consumers
297  *
298  * @dev:           device to supply
299  * @num_consumers: number of consumers to register
300  * @consumers:     configuration of consumers; clients are stored here.
301  *
302  * @return 0 on success, a negative error number on failure.
303  *
304  * This helper function allows drivers to exclusively get several
305  * regulator consumers in one operation with management, the regulators
306  * will automatically be freed when the device is unbound.  If any of
307  * the regulators cannot be acquired then any regulators that were
308  * allocated will be freed before returning to the caller.
309  */
310 int devm_regulator_bulk_get_exclusive(struct device *dev, int num_consumers,
311 				      struct regulator_bulk_data *consumers)
312 {
313 	return _devm_regulator_bulk_get(dev, num_consumers, consumers, EXCLUSIVE_GET);
314 }
315 EXPORT_SYMBOL_GPL(devm_regulator_bulk_get_exclusive);
316 
317 /**
318  * devm_regulator_bulk_get_const - devm_regulator_bulk_get() w/ const data
319  *
320  * @dev:           device to supply
321  * @num_consumers: number of consumers to register
322  * @in_consumers:  const configuration of consumers
323  * @out_consumers: in_consumers is copied here and this is passed to
324  *		   devm_regulator_bulk_get().
325  *
326  * This is a convenience function to allow bulk regulator configuration
327  * to be stored "static const" in files.
328  *
329  * Return: 0 on success, a negative error number on failure.
330  */
331 int devm_regulator_bulk_get_const(struct device *dev, int num_consumers,
332 				  const struct regulator_bulk_data *in_consumers,
333 				  struct regulator_bulk_data **out_consumers)
334 {
335 	*out_consumers = devm_kmemdup_array(dev, in_consumers, num_consumers,
336 					    sizeof(*in_consumers), GFP_KERNEL);
337 	if (*out_consumers == NULL)
338 		return -ENOMEM;
339 
340 	return devm_regulator_bulk_get(dev, num_consumers, *out_consumers);
341 }
342 EXPORT_SYMBOL_GPL(devm_regulator_bulk_get_const);
343 
344 static int devm_regulator_bulk_match(struct device *dev, void *res,
345 				     void *data)
346 {
347 	struct regulator_bulk_devres *match = res;
348 	struct regulator_bulk_data *target = data;
349 
350 	/*
351 	 * We check the put uses same consumer list as the get did.
352 	 * We _could_ scan all entries in consumer array and check the
353 	 * regulators match but ATM I don't see the need. We can change this
354 	 * later if needed.
355 	 */
356 	return match->consumers == target;
357 }
358 
359 /**
360  * devm_regulator_bulk_put - Resource managed regulator_bulk_put()
361  * @consumers: consumers to free
362  *
363  * Deallocate regulators allocated with devm_regulator_bulk_get(). Normally
364  * this function will not need to be called and the resource management
365  * code will ensure that the resource is freed.
366  */
367 void devm_regulator_bulk_put(struct regulator_bulk_data *consumers)
368 {
369 	int rc;
370 	struct regulator *regulator = consumers[0].consumer;
371 
372 	rc = devres_release(regulator->dev, devm_regulator_bulk_release,
373 			    devm_regulator_bulk_match, consumers);
374 	if (rc != 0)
375 		WARN_ON(rc);
376 }
377 EXPORT_SYMBOL_GPL(devm_regulator_bulk_put);
378 
379 static void devm_regulator_bulk_disable(void *res)
380 {
381 	struct regulator_bulk_devres *devres = res;
382 	int i;
383 
384 	for (i = 0; i < devres->num_consumers; i++)
385 		regulator_disable(devres->consumers[i].consumer);
386 }
387 
388 /**
389  * devm_regulator_bulk_get_enable - managed get'n enable multiple regulators
390  *
391  * @dev:           device to supply
392  * @num_consumers: number of consumers to register
393  * @id:            list of supply names or regulator IDs
394  *
395  * @return 0 on success, a negative error number on failure.
396  *
397  * This helper function allows drivers to get several regulator
398  * consumers in one operation with management, the regulators will
399  * automatically be freed when the device is unbound.  If any of the
400  * regulators cannot be acquired then any regulators that were
401  * allocated will be freed before returning to the caller.
402  */
403 int devm_regulator_bulk_get_enable(struct device *dev, int num_consumers,
404 				   const char * const *id)
405 {
406 	struct regulator_bulk_devres *devres;
407 	struct regulator_bulk_data *consumers;
408 	int i, ret;
409 
410 	devres = devm_kmalloc_obj(dev, *devres);
411 	if (!devres)
412 		return -ENOMEM;
413 
414 	devres->consumers = devm_kzalloc_objs(dev, *consumers, num_consumers);
415 	consumers = devres->consumers;
416 	if (!consumers)
417 		return -ENOMEM;
418 
419 	devres->num_consumers = num_consumers;
420 
421 	for (i = 0; i < num_consumers; i++)
422 		consumers[i].supply = id[i];
423 
424 	ret = devm_regulator_bulk_get(dev, num_consumers, consumers);
425 	if (ret)
426 		return ret;
427 
428 	for (i = 0; i < num_consumers; i++) {
429 		ret = regulator_enable(consumers[i].consumer);
430 		if (ret)
431 			goto unwind;
432 	}
433 
434 	ret = devm_add_action(dev, devm_regulator_bulk_disable, devres);
435 	if (!ret)
436 		return 0;
437 
438 unwind:
439 	while (--i >= 0)
440 		regulator_disable(consumers[i].consumer);
441 
442 	devm_regulator_bulk_put(consumers);
443 
444 	return ret;
445 }
446 EXPORT_SYMBOL_GPL(devm_regulator_bulk_get_enable);
447 
448 static void devm_rdev_release(struct device *dev, void *res)
449 {
450 	regulator_unregister(*(struct regulator_dev **)res);
451 }
452 
453 /**
454  * devm_regulator_register - Resource managed regulator_register()
455  * @dev:            device to supply
456  * @regulator_desc: regulator to register
457  * @config:         runtime configuration for regulator
458  *
459  * Called by regulator drivers to register a regulator.  Returns a
460  * valid pointer to struct regulator_dev on success or an ERR_PTR() on
461  * error.  The regulator will automatically be released when the device
462  * is unbound.
463  */
464 struct regulator_dev *devm_regulator_register(struct device *dev,
465 				  const struct regulator_desc *regulator_desc,
466 				  const struct regulator_config *config)
467 {
468 	struct regulator_dev **ptr, *rdev;
469 
470 	ptr = devres_alloc(devm_rdev_release, sizeof(*ptr),
471 			   GFP_KERNEL);
472 	if (!ptr)
473 		return ERR_PTR(-ENOMEM);
474 
475 	rdev = regulator_register(dev, regulator_desc, config);
476 	if (!IS_ERR(rdev)) {
477 		*ptr = rdev;
478 		devres_add(dev, ptr);
479 	} else {
480 		devres_free(ptr);
481 	}
482 
483 	return rdev;
484 }
485 EXPORT_SYMBOL_GPL(devm_regulator_register);
486 
487 struct regulator_supply_alias_match {
488 	struct device *dev;
489 	const char *id;
490 };
491 
492 static int devm_regulator_match_supply_alias(struct device *dev, void *res,
493 					     void *data)
494 {
495 	struct regulator_supply_alias_match *match = res;
496 	struct regulator_supply_alias_match *target = data;
497 
498 	return match->dev == target->dev && strcmp(match->id, target->id) == 0;
499 }
500 
501 static void devm_regulator_destroy_supply_alias(struct device *dev, void *res)
502 {
503 	struct regulator_supply_alias_match *match = res;
504 
505 	regulator_unregister_supply_alias(match->dev, match->id);
506 }
507 
508 /**
509  * devm_regulator_register_supply_alias - Resource managed
510  * regulator_register_supply_alias()
511  *
512  * @dev:       device to supply
513  * @id:        supply name or regulator ID
514  * @alias_dev: device that should be used to lookup the supply
515  * @alias_id:  supply name or regulator ID that should be used to lookup the
516  * supply
517  *
518  * The supply alias will automatically be unregistered when the source
519  * device is unbound.
520  */
521 int devm_regulator_register_supply_alias(struct device *dev, const char *id,
522 					 struct device *alias_dev,
523 					 const char *alias_id)
524 {
525 	struct regulator_supply_alias_match *match;
526 	int ret;
527 
528 	match = devres_alloc(devm_regulator_destroy_supply_alias,
529 			   sizeof(struct regulator_supply_alias_match),
530 			   GFP_KERNEL);
531 	if (!match)
532 		return -ENOMEM;
533 
534 	match->dev = dev;
535 	match->id = id;
536 
537 	ret = regulator_register_supply_alias(dev, id, alias_dev, alias_id);
538 	if (ret < 0) {
539 		devres_free(match);
540 		return ret;
541 	}
542 
543 	devres_add(dev, match);
544 
545 	return 0;
546 }
547 EXPORT_SYMBOL_GPL(devm_regulator_register_supply_alias);
548 
549 static void devm_regulator_unregister_supply_alias(struct device *dev,
550 						   const char *id)
551 {
552 	struct regulator_supply_alias_match match;
553 	int rc;
554 
555 	match.dev = dev;
556 	match.id = id;
557 
558 	rc = devres_release(dev, devm_regulator_destroy_supply_alias,
559 			    devm_regulator_match_supply_alias, &match);
560 	if (rc != 0)
561 		WARN_ON(rc);
562 }
563 
564 /**
565  * devm_regulator_bulk_register_supply_alias - Managed register
566  * multiple aliases
567  *
568  * @dev:       device to supply
569  * @id:        list of supply names or regulator IDs
570  * @alias_dev: device that should be used to lookup the supply
571  * @alias_id:  list of supply names or regulator IDs that should be used to
572  *             lookup the supply
573  * @num_id:    number of aliases to register
574  *
575  * @return 0 on success, a negative error number on failure.
576  *
577  * This helper function allows drivers to register several supply
578  * aliases in one operation, the aliases will be automatically
579  * unregisters when the source device is unbound.  If any of the
580  * aliases cannot be registered any aliases that were registered
581  * will be removed before returning to the caller.
582  */
583 int devm_regulator_bulk_register_supply_alias(struct device *dev,
584 					      const char *const *id,
585 					      struct device *alias_dev,
586 					      const char *const *alias_id,
587 					      int num_id)
588 {
589 	int i;
590 	int ret;
591 
592 	for (i = 0; i < num_id; ++i) {
593 		ret = devm_regulator_register_supply_alias(dev, id[i],
594 							   alias_dev,
595 							   alias_id[i]);
596 		if (ret < 0)
597 			goto err;
598 	}
599 
600 	return 0;
601 
602 err:
603 	dev_err(dev,
604 		"Failed to create supply alias %s,%s -> %s,%s\n",
605 		id[i], dev_name(dev), alias_id[i], dev_name(alias_dev));
606 
607 	while (--i >= 0)
608 		devm_regulator_unregister_supply_alias(dev, id[i]);
609 
610 	return ret;
611 }
612 EXPORT_SYMBOL_GPL(devm_regulator_bulk_register_supply_alias);
613 
614 struct regulator_notifier_match {
615 	struct regulator *regulator;
616 	struct notifier_block *nb;
617 };
618 
619 static int devm_regulator_match_notifier(struct device *dev, void *res,
620 					 void *data)
621 {
622 	struct regulator_notifier_match *match = res;
623 	struct regulator_notifier_match *target = data;
624 
625 	return match->regulator == target->regulator && match->nb == target->nb;
626 }
627 
628 static void devm_regulator_destroy_notifier(struct device *dev, void *res)
629 {
630 	struct regulator_notifier_match *match = res;
631 
632 	regulator_unregister_notifier(match->regulator, match->nb);
633 }
634 
635 /**
636  * devm_regulator_register_notifier - Resource managed
637  * regulator_register_notifier
638  *
639  * @regulator: regulator source
640  * @nb:        notifier block
641  *
642  * The notifier will be registers under the consumer device and be
643  * automatically be unregistered when the source device is unbound.
644  */
645 int devm_regulator_register_notifier(struct regulator *regulator,
646 				     struct notifier_block *nb)
647 {
648 	struct regulator_notifier_match *match;
649 	int ret;
650 
651 	match = devres_alloc(devm_regulator_destroy_notifier,
652 			     sizeof(struct regulator_notifier_match),
653 			     GFP_KERNEL);
654 	if (!match)
655 		return -ENOMEM;
656 
657 	match->regulator = regulator;
658 	match->nb = nb;
659 
660 	ret = regulator_register_notifier(regulator, nb);
661 	if (ret < 0) {
662 		devres_free(match);
663 		return ret;
664 	}
665 
666 	devres_add(regulator->dev, match);
667 
668 	return 0;
669 }
670 EXPORT_SYMBOL_GPL(devm_regulator_register_notifier);
671 
672 /**
673  * devm_regulator_unregister_notifier - Resource managed
674  * regulator_unregister_notifier()
675  *
676  * @regulator: regulator source
677  * @nb:        notifier block
678  *
679  * Unregister a notifier registered with devm_regulator_register_notifier().
680  * Normally this function will not need to be called and the resource
681  * management code will ensure that the resource is freed.
682  */
683 void devm_regulator_unregister_notifier(struct regulator *regulator,
684 					struct notifier_block *nb)
685 {
686 	struct regulator_notifier_match match;
687 	int rc;
688 
689 	match.regulator = regulator;
690 	match.nb = nb;
691 
692 	rc = devres_release(regulator->dev, devm_regulator_destroy_notifier,
693 			    devm_regulator_match_notifier, &match);
694 	if (rc != 0)
695 		WARN_ON(rc);
696 }
697 EXPORT_SYMBOL_GPL(devm_regulator_unregister_notifier);
698 
699 static void regulator_irq_helper_drop(void *res)
700 {
701 	regulator_irq_helper_cancel(&res);
702 }
703 
704 /**
705  * devm_regulator_irq_helper - resource managed registration of IRQ based
706  * regulator event/error notifier
707  *
708  * @dev:		device to which lifetime the helper's lifetime is
709  *			bound.
710  * @d:			IRQ helper descriptor.
711  * @irq:		IRQ used to inform events/errors to be notified.
712  * @irq_flags:		Extra IRQ flags to be OR'ed with the default
713  *			IRQF_ONESHOT when requesting the (threaded) irq.
714  * @common_errs:	Errors which can be flagged by this IRQ for all rdevs.
715  *			When IRQ is re-enabled these errors will be cleared
716  *			from all associated regulators
717  * @per_rdev_errs:	Optional error flag array describing errors specific
718  *			for only some of the regulators. These errors will be
719  *			or'ed with common errors. If this is given the array
720  *			should contain rdev_amount flags. Can be set to NULL
721  *			if there is no regulator specific error flags for this
722  *			IRQ.
723  * @rdev:		Array of pointers to regulators associated with this
724  *			IRQ.
725  * @rdev_amount:	Amount of regulators associated with this IRQ.
726  *
727  * Return: handle to irq_helper or an ERR_PTR() encoded negative error number.
728  */
729 void *devm_regulator_irq_helper(struct device *dev,
730 				const struct regulator_irq_desc *d, int irq,
731 				int irq_flags, int common_errs,
732 				int *per_rdev_errs,
733 				struct regulator_dev **rdev, int rdev_amount)
734 {
735 	void *ptr;
736 	int ret;
737 
738 	ptr = regulator_irq_helper(dev, d, irq, irq_flags, common_errs,
739 				    per_rdev_errs, rdev, rdev_amount);
740 	if (IS_ERR(ptr))
741 		return ptr;
742 
743 	ret = devm_add_action_or_reset(dev, regulator_irq_helper_drop, ptr);
744 	if (ret)
745 		return ERR_PTR(ret);
746 
747 	return ptr;
748 }
749 EXPORT_SYMBOL_GPL(devm_regulator_irq_helper);
750 
751 #if IS_ENABLED(CONFIG_OF)
752 static struct regulator *_devm_of_regulator_get(struct device *dev, struct device_node *node,
753 						const char *id, enum regulator_get_type get_type)
754 {
755 	struct regulator **ptr, *regulator;
756 
757 	ptr = devres_alloc(devm_regulator_release, sizeof(*ptr), GFP_KERNEL);
758 	if (!ptr)
759 		return ERR_PTR(-ENOMEM);
760 
761 	regulator = _of_regulator_get(dev, node, id, get_type);
762 	if (!IS_ERR(regulator)) {
763 		*ptr = regulator;
764 		devres_add(dev, ptr);
765 	} else {
766 		devres_free(ptr);
767 	}
768 
769 	return regulator;
770 }
771 
772 /**
773  * devm_of_regulator_get - Resource managed of_regulator_get()
774  * @dev: device used for dev_printk() messages and resource lifetime management
775  * @node: device node for regulator "consumer"
776  * @id:  supply name or regulator ID.
777  *
778  * Managed of_regulator_get(). Regulators returned from this
779  * function are automatically regulator_put() on driver detach. See
780  * of_regulator_get() for more information.
781  */
782 struct regulator *devm_of_regulator_get(struct device *dev, struct device_node *node,
783 						 const char *id)
784 {
785 	return _devm_of_regulator_get(dev, node, id, NORMAL_GET);
786 }
787 EXPORT_SYMBOL_GPL(devm_of_regulator_get);
788 
789 /**
790  * devm_of_regulator_get_optional - Resource managed of_regulator_get_optional()
791  * @dev: device used for dev_printk() messages and resource lifetime management
792  * @node: device node for regulator "consumer"
793  * @id:  supply name or regulator ID.
794  *
795  * Managed regulator_get_optional(). Regulators returned from this
796  * function are automatically regulator_put() on driver detach. See
797  * of_regulator_get_optional() for more information.
798  */
799 struct regulator *devm_of_regulator_get_optional(struct device *dev, struct device_node *node,
800 						 const char *id)
801 {
802 	return _devm_of_regulator_get(dev, node, id, OPTIONAL_GET);
803 }
804 EXPORT_SYMBOL_GPL(devm_of_regulator_get_optional);
805 #endif
806