soc-devres.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. // SPDX-License-Identifier: GPL-2.0+
  2. //
  3. // soc-devres.c -- ALSA SoC Audio Layer devres functions
  4. //
  5. // Copyright (C) 2013 Linaro Ltd
  6. #include <linux/module.h>
  7. #include <linux/moduleparam.h>
  8. #include <sound/soc.h>
  9. #include <sound/dmaengine_pcm.h>
  10. static void devm_component_release(struct device *dev, void *res)
  11. {
  12. snd_soc_unregister_component(*(struct device **)res);
  13. }
  14. /**
  15. * devm_snd_soc_register_component - resource managed component registration
  16. * @dev: Device used to manage component
  17. * @cmpnt_drv: Component driver
  18. * @dai_drv: DAI driver
  19. * @num_dai: Number of DAIs to register
  20. *
  21. * Register a component with automatic unregistration when the device is
  22. * unregistered.
  23. */
  24. int devm_snd_soc_register_component(struct device *dev,
  25. const struct snd_soc_component_driver *cmpnt_drv,
  26. struct snd_soc_dai_driver *dai_drv, int num_dai)
  27. {
  28. struct device **ptr;
  29. int ret;
  30. ptr = devres_alloc(devm_component_release, sizeof(*ptr), GFP_KERNEL);
  31. if (!ptr)
  32. return -ENOMEM;
  33. ret = snd_soc_register_component(dev, cmpnt_drv, dai_drv, num_dai);
  34. if (ret == 0) {
  35. *ptr = dev;
  36. devres_add(dev, ptr);
  37. } else {
  38. devres_free(ptr);
  39. }
  40. return ret;
  41. }
  42. EXPORT_SYMBOL_GPL(devm_snd_soc_register_component);
  43. static void devm_card_release(struct device *dev, void *res)
  44. {
  45. snd_soc_unregister_card(*(struct snd_soc_card **)res);
  46. }
  47. /**
  48. * devm_snd_soc_register_card - resource managed card registration
  49. * @dev: Device used to manage card
  50. * @card: Card to register
  51. *
  52. * Register a card with automatic unregistration when the device is
  53. * unregistered.
  54. */
  55. int devm_snd_soc_register_card(struct device *dev, struct snd_soc_card *card)
  56. {
  57. struct snd_soc_card **ptr;
  58. int ret;
  59. ptr = devres_alloc(devm_card_release, sizeof(*ptr), GFP_KERNEL);
  60. if (!ptr)
  61. return -ENOMEM;
  62. ret = snd_soc_register_card(card);
  63. if (ret == 0) {
  64. *ptr = card;
  65. devres_add(dev, ptr);
  66. } else {
  67. devres_free(ptr);
  68. }
  69. return ret;
  70. }
  71. EXPORT_SYMBOL_GPL(devm_snd_soc_register_card);
  72. #ifdef CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM
  73. static void devm_dmaengine_pcm_release(struct device *dev, void *res)
  74. {
  75. snd_dmaengine_pcm_unregister(*(struct device **)res);
  76. }
  77. /**
  78. * devm_snd_dmaengine_pcm_register - resource managed dmaengine PCM registration
  79. * @dev: The parent device for the PCM device
  80. * @config: Platform specific PCM configuration
  81. * @flags: Platform specific quirks
  82. *
  83. * Register a dmaengine based PCM device with automatic unregistration when the
  84. * device is unregistered.
  85. */
  86. int devm_snd_dmaengine_pcm_register(struct device *dev,
  87. const struct snd_dmaengine_pcm_config *config, unsigned int flags)
  88. {
  89. struct device **ptr;
  90. int ret;
  91. ptr = devres_alloc(devm_dmaengine_pcm_release, sizeof(*ptr), GFP_KERNEL);
  92. if (!ptr)
  93. return -ENOMEM;
  94. ret = snd_dmaengine_pcm_register(dev, config, flags);
  95. if (ret == 0) {
  96. *ptr = dev;
  97. devres_add(dev, ptr);
  98. } else {
  99. devres_free(ptr);
  100. }
  101. return ret;
  102. }
  103. EXPORT_SYMBOL_GPL(devm_snd_dmaengine_pcm_register);
  104. #endif