1
2
3
4
5
6
7
8
9
10
11
12#include <linux/module.h>
13#include <linux/moduleparam.h>
14#include <sound/soc.h>
15#include <sound/dmaengine_pcm.h>
16
17static void devm_component_release(struct device *dev, void *res)
18{
19 snd_soc_unregister_component(*(struct device **)res);
20}
21
22
23
24
25
26
27
28
29
30
31
32int devm_snd_soc_register_component(struct device *dev,
33 const struct snd_soc_component_driver *cmpnt_drv,
34 struct snd_soc_dai_driver *dai_drv, int num_dai)
35{
36 struct device **ptr;
37 int ret;
38
39 ptr = devres_alloc(devm_component_release, sizeof(*ptr), GFP_KERNEL);
40 if (!ptr)
41 return -ENOMEM;
42
43 ret = snd_soc_register_component(dev, cmpnt_drv, dai_drv, num_dai);
44 if (ret == 0) {
45 *ptr = dev;
46 devres_add(dev, ptr);
47 } else {
48 devres_free(ptr);
49 }
50
51 return ret;
52}
53EXPORT_SYMBOL_GPL(devm_snd_soc_register_component);
54
55static void devm_platform_release(struct device *dev, void *res)
56{
57 snd_soc_unregister_platform(*(struct device **)res);
58}
59
60
61
62
63
64
65
66
67
68int devm_snd_soc_register_platform(struct device *dev,
69 const struct snd_soc_platform_driver *platform_drv)
70{
71 struct device **ptr;
72 int ret;
73
74 ptr = devres_alloc(devm_platform_release, sizeof(*ptr), GFP_KERNEL);
75 if (!ptr)
76 return -ENOMEM;
77
78 ret = snd_soc_register_platform(dev, platform_drv);
79 if (ret == 0) {
80 *ptr = dev;
81 devres_add(dev, ptr);
82 } else {
83 devres_free(ptr);
84 }
85
86 return ret;
87}
88EXPORT_SYMBOL_GPL(devm_snd_soc_register_platform);
89
90static void devm_card_release(struct device *dev, void *res)
91{
92 snd_soc_unregister_card(*(struct snd_soc_card **)res);
93}
94
95
96
97
98
99
100
101
102
103int devm_snd_soc_register_card(struct device *dev, struct snd_soc_card *card)
104{
105 struct snd_soc_card **ptr;
106 int ret;
107
108 ptr = devres_alloc(devm_card_release, sizeof(*ptr), GFP_KERNEL);
109 if (!ptr)
110 return -ENOMEM;
111
112 ret = snd_soc_register_card(card);
113 if (ret == 0) {
114 *ptr = card;
115 devres_add(dev, ptr);
116 } else {
117 devres_free(ptr);
118 }
119
120 return ret;
121}
122EXPORT_SYMBOL_GPL(devm_snd_soc_register_card);
123
124#ifdef CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM
125
126static void devm_dmaengine_pcm_release(struct device *dev, void *res)
127{
128 snd_dmaengine_pcm_unregister(*(struct device **)res);
129}
130
131
132
133
134
135
136
137
138
139
140int devm_snd_dmaengine_pcm_register(struct device *dev,
141 const struct snd_dmaengine_pcm_config *config, unsigned int flags)
142{
143 struct device **ptr;
144 int ret;
145
146 ptr = devres_alloc(devm_dmaengine_pcm_release, sizeof(*ptr), GFP_KERNEL);
147 if (!ptr)
148 return -ENOMEM;
149
150 ret = snd_dmaengine_pcm_register(dev, config, flags);
151 if (ret == 0) {
152 *ptr = dev;
153 devres_add(dev, ptr);
154 } else {
155 devres_free(ptr);
156 }
157
158 return ret;
159}
160EXPORT_SYMBOL_GPL(devm_snd_dmaengine_pcm_register);
161
162#endif
163