9d2b10a7a30b504828d447f9d2fc0afe3b113f0f
[openwrt/staging/yousong.git] /
1 From 18c2353cd57e25ececa0551b2ec22fd1f76f6484 Mon Sep 17 00:00:00 2001
2 From: Takashi Iwai <tiwai@suse.de>
3 Date: Tue, 4 Sep 2018 17:58:58 +0200
4 Subject: [PATCH 468/703] staging: bcm2835-audio: Simplify card object
5 management
6
7 commit 872ae2d63d516a2a3b9c833d8685afcfa7814542 upstream.
8
9 Instead of creating a dummy child device to manage the card object,
10 just use devm stuff directly for releasing with snd_card_free().
11 This results in a lot of code reduction.
12
13 Since the dummy child devices are gone, the device object to be passed
14 to the memory allocator needs to be adjusted as well.
15
16 Signed-off-by: Takashi Iwai <tiwai@suse.de>
17 Tested-by: Stefan Wahren <stefan.wahren@i2se.com>
18 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
19 ---
20 .../vc04_services/bcm2835-audio/bcm2835-pcm.c | 2 +-
21 .../vc04_services/bcm2835-audio/bcm2835.c | 120 +++++-------------
22 2 files changed, 33 insertions(+), 89 deletions(-)
23
24 --- a/drivers/staging/vc04_services/bcm2835-audio/bcm2835-pcm.c
25 +++ b/drivers/staging/vc04_services/bcm2835-audio/bcm2835-pcm.c
26 @@ -349,7 +349,7 @@ int snd_bcm2835_new_pcm(struct bcm2835_c
27 &snd_bcm2835_playback_ops);
28
29 snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
30 - chip->card->dev->parent, 128 * 1024, 128 * 1024);
31 + chip->card->dev, 128 * 1024, 128 * 1024);
32
33 if (spdif)
34 chip->pcm_spdif = pcm;
35 --- a/drivers/staging/vc04_services/bcm2835-audio/bcm2835.c
36 +++ b/drivers/staging/vc04_services/bcm2835-audio/bcm2835.c
37 @@ -22,38 +22,6 @@ module_param(enable_compat_alsa, bool, 0
38 MODULE_PARM_DESC(enable_compat_alsa,
39 "Enables ALSA compatibility virtual audio device");
40
41 -static void snd_devm_unregister_child(struct device *dev, void *res)
42 -{
43 - struct device *childdev = *(struct device **)res;
44 - struct bcm2835_chip *chip = dev_get_drvdata(childdev);
45 - struct snd_card *card = chip->card;
46 -
47 - snd_card_free(card);
48 -
49 - device_unregister(childdev);
50 -}
51 -
52 -static int snd_devm_add_child(struct device *dev, struct device *child)
53 -{
54 - struct device **dr;
55 - int ret;
56 -
57 - dr = devres_alloc(snd_devm_unregister_child, sizeof(*dr), GFP_KERNEL);
58 - if (!dr)
59 - return -ENOMEM;
60 -
61 - ret = device_add(child);
62 - if (ret) {
63 - devres_free(dr);
64 - return ret;
65 - }
66 -
67 - *dr = child;
68 - devres_add(dev, dr);
69 -
70 - return 0;
71 -}
72 -
73 static void bcm2835_devm_free_vchi_ctx(struct device *dev, void *res)
74 {
75 struct bcm2835_vchi_ctx *vchi_ctx = res;
76 @@ -84,36 +52,6 @@ static int bcm2835_devm_add_vchi_ctx(str
77 return 0;
78 }
79
80 -static void snd_bcm2835_release(struct device *dev)
81 -{
82 -}
83 -
84 -static struct device *
85 -snd_create_device(struct device *parent,
86 - struct device_driver *driver,
87 - const char *name)
88 -{
89 - struct device *device;
90 - int ret;
91 -
92 - device = devm_kzalloc(parent, sizeof(*device), GFP_KERNEL);
93 - if (!device)
94 - return ERR_PTR(-ENOMEM);
95 -
96 - device_initialize(device);
97 - device->parent = parent;
98 - device->driver = driver;
99 - device->release = snd_bcm2835_release;
100 -
101 - dev_set_name(device, "%s", name);
102 -
103 - ret = snd_devm_add_child(parent, device);
104 - if (ret)
105 - return ERR_PTR(ret);
106 -
107 - return device;
108 -}
109 -
110 typedef int (*bcm2835_audio_newpcm_func)(struct bcm2835_chip *chip,
111 const char *name,
112 enum snd_bcm2835_route route,
113 @@ -216,40 +154,36 @@ static struct bcm2835_audio_drivers chil
114 },
115 };
116
117 -static int snd_add_child_device(struct device *device,
118 +static void bcm2835_card_free(void *data)
119 +{
120 + snd_card_free(data);
121 +}
122 +
123 +static int snd_add_child_device(struct device *dev,
124 struct bcm2835_audio_driver *audio_driver,
125 u32 numchans)
126 {
127 struct snd_card *card;
128 - struct device *child;
129 struct bcm2835_chip *chip;
130 int err;
131
132 - child = snd_create_device(device, &audio_driver->driver,
133 - audio_driver->driver.name);
134 - if (IS_ERR(child)) {
135 - dev_err(device,
136 - "Unable to create child device %p, error %ld",
137 - audio_driver->driver.name,
138 - PTR_ERR(child));
139 - return PTR_ERR(child);
140 - }
141 -
142 - err = snd_card_new(child, -1, NULL, THIS_MODULE, sizeof(*chip), &card);
143 + err = snd_card_new(dev, -1, NULL, THIS_MODULE, sizeof(*chip), &card);
144 if (err < 0) {
145 - dev_err(child, "Failed to create card");
146 + dev_err(dev, "Failed to create card");
147 return err;
148 }
149
150 chip = card->private_data;
151 chip->card = card;
152 - chip->dev = child;
153 + chip->dev = dev;
154 mutex_init(&chip->audio_mutex);
155
156 - chip->vchi_ctx = devres_find(device,
157 + chip->vchi_ctx = devres_find(dev,
158 bcm2835_devm_free_vchi_ctx, NULL, NULL);
159 - if (!chip->vchi_ctx)
160 - return -ENODEV;
161 + if (!chip->vchi_ctx) {
162 + err = -ENODEV;
163 + goto error;
164 + }
165
166 strcpy(card->driver, audio_driver->driver.name);
167 strcpy(card->shortname, audio_driver->shortname);
168 @@ -259,26 +193,36 @@ static int snd_add_child_device(struct d
169 audio_driver->route,
170 numchans);
171 if (err) {
172 - dev_err(child, "Failed to create pcm, error %d\n", err);
173 - return err;
174 + dev_err(dev, "Failed to create pcm, error %d\n", err);
175 + goto error;
176 }
177
178 err = audio_driver->newctl(chip);
179 if (err) {
180 - dev_err(child, "Failed to create controls, error %d\n", err);
181 - return err;
182 + dev_err(dev, "Failed to create controls, error %d\n", err);
183 + goto error;
184 }
185
186 err = snd_card_register(card);
187 if (err) {
188 - dev_err(child, "Failed to register card, error %d\n", err);
189 - return err;
190 + dev_err(dev, "Failed to register card, error %d\n", err);
191 + goto error;
192 }
193
194 - dev_set_drvdata(child, chip);
195 - dev_info(child, "card created with %d channels\n", numchans);
196 + dev_set_drvdata(dev, chip);
197
198 + err = devm_add_action(dev, bcm2835_card_free, card);
199 + if (err < 0) {
200 + dev_err(dev, "Failed to add devm action, err %d\n", err);
201 + goto error;
202 + }
203 +
204 + dev_info(dev, "card created with %d channels\n", numchans);
205 return 0;
206 +
207 + error:
208 + snd_card_free(card);
209 + return err;
210 }
211
212 static int snd_add_child_devices(struct device *device, u32 numchans)