devres.c 23 KB

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