xref: /linux/drivers/regulator/devres.c (revision 8e1bb4a41aa78d6105e59186af3dcd545fc66e70)
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 					     int 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 				      int 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 error code 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 error code if needed instead of the
178 	 * 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, an errno 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, an errno 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, an errno 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(dev, in_consumers,
336 				      num_consumers * sizeof(*in_consumers),
337 				      GFP_KERNEL);
338 	if (*out_consumers == NULL)
339 		return -ENOMEM;
340 
341 	return devm_regulator_bulk_get(dev, num_consumers, *out_consumers);
342 }
343 EXPORT_SYMBOL_GPL(devm_regulator_bulk_get_const);
344 
345 static int devm_regulator_bulk_match(struct device *dev, void *res,
346 				     void *data)
347 {
348 	struct regulator_bulk_devres *match = res;
349 	struct regulator_bulk_data *target = data;
350 
351 	/*
352 	 * We check the put uses same consumer list as the get did.
353 	 * We _could_ scan all entries in consumer array and check the
354 	 * regulators match but ATM I don't see the need. We can change this
355 	 * later if needed.
356 	 */
357 	return match->consumers == target;
358 }
359 
360 /**
361  * devm_regulator_bulk_put - Resource managed regulator_bulk_put()
362  * @consumers: consumers to free
363  *
364  * Deallocate regulators allocated with devm_regulator_bulk_get(). Normally
365  * this function will not need to be called and the resource management
366  * code will ensure that the resource is freed.
367  */
368 void devm_regulator_bulk_put(struct regulator_bulk_data *consumers)
369 {
370 	int rc;
371 	struct regulator *regulator = consumers[0].consumer;
372 
373 	rc = devres_release(regulator->dev, devm_regulator_bulk_release,
374 			    devm_regulator_bulk_match, consumers);
375 	if (rc != 0)
376 		WARN_ON(rc);
377 }
378 EXPORT_SYMBOL_GPL(devm_regulator_bulk_put);
379 
380 static void devm_regulator_bulk_disable(void *res)
381 {
382 	struct regulator_bulk_devres *devres = res;
383 	int i;
384 
385 	for (i = 0; i < devres->num_consumers; i++)
386 		regulator_disable(devres->consumers[i].consumer);
387 }
388 
389 /**
390  * devm_regulator_bulk_get_enable - managed get'n enable multiple regulators
391  *
392  * @dev:           device to supply
393  * @num_consumers: number of consumers to register
394  * @id:            list of supply names or regulator IDs
395  *
396  * @return 0 on success, an errno on failure.
397  *
398  * This helper function allows drivers to get several regulator
399  * consumers in one operation with management, the regulators will
400  * automatically be freed when the device is unbound.  If any of the
401  * regulators cannot be acquired then any regulators that were
402  * allocated will be freed before returning to the caller.
403  */
404 int devm_regulator_bulk_get_enable(struct device *dev, int num_consumers,
405 				   const char * const *id)
406 {
407 	struct regulator_bulk_devres *devres;
408 	struct regulator_bulk_data *consumers;
409 	int i, ret;
410 
411 	devres = devm_kmalloc(dev, sizeof(*devres), GFP_KERNEL);
412 	if (!devres)
413 		return -ENOMEM;
414 
415 	devres->consumers = devm_kcalloc(dev, num_consumers, sizeof(*consumers),
416 					 GFP_KERNEL);
417 	consumers = devres->consumers;
418 	if (!consumers)
419 		return -ENOMEM;
420 
421 	devres->num_consumers = num_consumers;
422 
423 	for (i = 0; i < num_consumers; i++)
424 		consumers[i].supply = id[i];
425 
426 	ret = devm_regulator_bulk_get(dev, num_consumers, consumers);
427 	if (ret)
428 		return ret;
429 
430 	for (i = 0; i < num_consumers; i++) {
431 		ret = regulator_enable(consumers[i].consumer);
432 		if (ret)
433 			goto unwind;
434 	}
435 
436 	ret = devm_add_action(dev, devm_regulator_bulk_disable, devres);
437 	if (!ret)
438 		return 0;
439 
440 unwind:
441 	while (--i >= 0)
442 		regulator_disable(consumers[i].consumer);
443 
444 	devm_regulator_bulk_put(consumers);
445 
446 	return ret;
447 }
448 EXPORT_SYMBOL_GPL(devm_regulator_bulk_get_enable);
449 
450 static void devm_rdev_release(struct device *dev, void *res)
451 {
452 	regulator_unregister(*(struct regulator_dev **)res);
453 }
454 
455 /**
456  * devm_regulator_register - Resource managed regulator_register()
457  * @dev:            device to supply
458  * @regulator_desc: regulator to register
459  * @config:         runtime configuration for regulator
460  *
461  * Called by regulator drivers to register a regulator.  Returns a
462  * valid pointer to struct regulator_dev on success or an ERR_PTR() on
463  * error.  The regulator will automatically be released when the device
464  * is unbound.
465  */
466 struct regulator_dev *devm_regulator_register(struct device *dev,
467 				  const struct regulator_desc *regulator_desc,
468 				  const struct regulator_config *config)
469 {
470 	struct regulator_dev **ptr, *rdev;
471 
472 	ptr = devres_alloc(devm_rdev_release, sizeof(*ptr),
473 			   GFP_KERNEL);
474 	if (!ptr)
475 		return ERR_PTR(-ENOMEM);
476 
477 	rdev = regulator_register(dev, regulator_desc, config);
478 	if (!IS_ERR(rdev)) {
479 		*ptr = rdev;
480 		devres_add(dev, ptr);
481 	} else {
482 		devres_free(ptr);
483 	}
484 
485 	return rdev;
486 }
487 EXPORT_SYMBOL_GPL(devm_regulator_register);
488 
489 struct regulator_supply_alias_match {
490 	struct device *dev;
491 	const char *id;
492 };
493 
494 static int devm_regulator_match_supply_alias(struct device *dev, void *res,
495 					     void *data)
496 {
497 	struct regulator_supply_alias_match *match = res;
498 	struct regulator_supply_alias_match *target = data;
499 
500 	return match->dev == target->dev && strcmp(match->id, target->id) == 0;
501 }
502 
503 static void devm_regulator_destroy_supply_alias(struct device *dev, void *res)
504 {
505 	struct regulator_supply_alias_match *match = res;
506 
507 	regulator_unregister_supply_alias(match->dev, match->id);
508 }
509 
510 /**
511  * devm_regulator_register_supply_alias - Resource managed
512  * regulator_register_supply_alias()
513  *
514  * @dev:       device to supply
515  * @id:        supply name or regulator ID
516  * @alias_dev: device that should be used to lookup the supply
517  * @alias_id:  supply name or regulator ID that should be used to lookup the
518  * supply
519  *
520  * The supply alias will automatically be unregistered when the source
521  * device is unbound.
522  */
523 int devm_regulator_register_supply_alias(struct device *dev, const char *id,
524 					 struct device *alias_dev,
525 					 const char *alias_id)
526 {
527 	struct regulator_supply_alias_match *match;
528 	int ret;
529 
530 	match = devres_alloc(devm_regulator_destroy_supply_alias,
531 			   sizeof(struct regulator_supply_alias_match),
532 			   GFP_KERNEL);
533 	if (!match)
534 		return -ENOMEM;
535 
536 	match->dev = dev;
537 	match->id = id;
538 
539 	ret = regulator_register_supply_alias(dev, id, alias_dev, alias_id);
540 	if (ret < 0) {
541 		devres_free(match);
542 		return ret;
543 	}
544 
545 	devres_add(dev, match);
546 
547 	return 0;
548 }
549 EXPORT_SYMBOL_GPL(devm_regulator_register_supply_alias);
550 
551 static void devm_regulator_unregister_supply_alias(struct device *dev,
552 						   const char *id)
553 {
554 	struct regulator_supply_alias_match match;
555 	int rc;
556 
557 	match.dev = dev;
558 	match.id = id;
559 
560 	rc = devres_release(dev, devm_regulator_destroy_supply_alias,
561 			    devm_regulator_match_supply_alias, &match);
562 	if (rc != 0)
563 		WARN_ON(rc);
564 }
565 
566 /**
567  * devm_regulator_bulk_register_supply_alias - Managed register
568  * multiple aliases
569  *
570  * @dev:       device to supply
571  * @id:        list of supply names or regulator IDs
572  * @alias_dev: device that should be used to lookup the supply
573  * @alias_id:  list of supply names or regulator IDs that should be used to
574  *             lookup the supply
575  * @num_id:    number of aliases to register
576  *
577  * @return 0 on success, an errno on failure.
578  *
579  * This helper function allows drivers to register several supply
580  * aliases in one operation, the aliases will be automatically
581  * unregisters when the source device is unbound.  If any of the
582  * aliases cannot be registered any aliases that were registered
583  * will be removed before returning to the caller.
584  */
585 int devm_regulator_bulk_register_supply_alias(struct device *dev,
586 					      const char *const *id,
587 					      struct device *alias_dev,
588 					      const char *const *alias_id,
589 					      int num_id)
590 {
591 	int i;
592 	int ret;
593 
594 	for (i = 0; i < num_id; ++i) {
595 		ret = devm_regulator_register_supply_alias(dev, id[i],
596 							   alias_dev,
597 							   alias_id[i]);
598 		if (ret < 0)
599 			goto err;
600 	}
601 
602 	return 0;
603 
604 err:
605 	dev_err(dev,
606 		"Failed to create supply alias %s,%s -> %s,%s\n",
607 		id[i], dev_name(dev), alias_id[i], dev_name(alias_dev));
608 
609 	while (--i >= 0)
610 		devm_regulator_unregister_supply_alias(dev, id[i]);
611 
612 	return ret;
613 }
614 EXPORT_SYMBOL_GPL(devm_regulator_bulk_register_supply_alias);
615 
616 struct regulator_notifier_match {
617 	struct regulator *regulator;
618 	struct notifier_block *nb;
619 };
620 
621 static int devm_regulator_match_notifier(struct device *dev, void *res,
622 					 void *data)
623 {
624 	struct regulator_notifier_match *match = res;
625 	struct regulator_notifier_match *target = data;
626 
627 	return match->regulator == target->regulator && match->nb == target->nb;
628 }
629 
630 static void devm_regulator_destroy_notifier(struct device *dev, void *res)
631 {
632 	struct regulator_notifier_match *match = res;
633 
634 	regulator_unregister_notifier(match->regulator, match->nb);
635 }
636 
637 /**
638  * devm_regulator_register_notifier - Resource managed
639  * regulator_register_notifier
640  *
641  * @regulator: regulator source
642  * @nb:        notifier block
643  *
644  * The notifier will be registers under the consumer device and be
645  * automatically be unregistered when the source device is unbound.
646  */
647 int devm_regulator_register_notifier(struct regulator *regulator,
648 				     struct notifier_block *nb)
649 {
650 	struct regulator_notifier_match *match;
651 	int ret;
652 
653 	match = devres_alloc(devm_regulator_destroy_notifier,
654 			     sizeof(struct regulator_notifier_match),
655 			     GFP_KERNEL);
656 	if (!match)
657 		return -ENOMEM;
658 
659 	match->regulator = regulator;
660 	match->nb = nb;
661 
662 	ret = regulator_register_notifier(regulator, nb);
663 	if (ret < 0) {
664 		devres_free(match);
665 		return ret;
666 	}
667 
668 	devres_add(regulator->dev, match);
669 
670 	return 0;
671 }
672 EXPORT_SYMBOL_GPL(devm_regulator_register_notifier);
673 
674 /**
675  * devm_regulator_unregister_notifier - Resource managed
676  * regulator_unregister_notifier()
677  *
678  * @regulator: regulator source
679  * @nb:        notifier block
680  *
681  * Unregister a notifier registered with devm_regulator_register_notifier().
682  * Normally this function will not need to be called and the resource
683  * management code will ensure that the resource is freed.
684  */
685 void devm_regulator_unregister_notifier(struct regulator *regulator,
686 					struct notifier_block *nb)
687 {
688 	struct regulator_notifier_match match;
689 	int rc;
690 
691 	match.regulator = regulator;
692 	match.nb = nb;
693 
694 	rc = devres_release(regulator->dev, devm_regulator_destroy_notifier,
695 			    devm_regulator_match_notifier, &match);
696 	if (rc != 0)
697 		WARN_ON(rc);
698 }
699 EXPORT_SYMBOL_GPL(devm_regulator_unregister_notifier);
700 
701 static void regulator_irq_helper_drop(void *res)
702 {
703 	regulator_irq_helper_cancel(&res);
704 }
705 
706 /**
707  * devm_regulator_irq_helper - resource managed registration of IRQ based
708  * regulator event/error notifier
709  *
710  * @dev:		device to which lifetime the helper's lifetime is
711  *			bound.
712  * @d:			IRQ helper descriptor.
713  * @irq:		IRQ used to inform events/errors to be notified.
714  * @irq_flags:		Extra IRQ flags to be OR'ed with the default
715  *			IRQF_ONESHOT when requesting the (threaded) irq.
716  * @common_errs:	Errors which can be flagged by this IRQ for all rdevs.
717  *			When IRQ is re-enabled these errors will be cleared
718  *			from all associated regulators
719  * @per_rdev_errs:	Optional error flag array describing errors specific
720  *			for only some of the regulators. These errors will be
721  *			or'ed with common errors. If this is given the array
722  *			should contain rdev_amount flags. Can be set to NULL
723  *			if there is no regulator specific error flags for this
724  *			IRQ.
725  * @rdev:		Array of pointers to regulators associated with this
726  *			IRQ.
727  * @rdev_amount:	Amount of regulators associated with this IRQ.
728  *
729  * Return: handle to irq_helper or an ERR_PTR() encoded error code.
730  */
731 void *devm_regulator_irq_helper(struct device *dev,
732 				const struct regulator_irq_desc *d, int irq,
733 				int irq_flags, int common_errs,
734 				int *per_rdev_errs,
735 				struct regulator_dev **rdev, int rdev_amount)
736 {
737 	void *ptr;
738 	int ret;
739 
740 	ptr = regulator_irq_helper(dev, d, irq, irq_flags, common_errs,
741 				    per_rdev_errs, rdev, rdev_amount);
742 	if (IS_ERR(ptr))
743 		return ptr;
744 
745 	ret = devm_add_action_or_reset(dev, regulator_irq_helper_drop, ptr);
746 	if (ret)
747 		return ERR_PTR(ret);
748 
749 	return ptr;
750 }
751 EXPORT_SYMBOL_GPL(devm_regulator_irq_helper);
752