Skip to content

Commit 7158b57

Browse files
rbilovolFelipe Balbi
authored andcommitted
usb: gadget: f_uac2: remove platform driver/device creation
Simplify f_uac2 by removing platform driver/device creation; use composite's usb_gadget device as parent for sound card and for debug prints. This removes extra layer of code without any functional change. Signed-off-by: Ruslan Bilovol <[email protected]> Signed-off-by: Felipe Balbi <[email protected]>
1 parent 1fc4926 commit 7158b57

File tree

1 file changed

+28
-79
lines changed

1 file changed

+28
-79
lines changed

drivers/usb/gadget/function/f_uac2.c

Lines changed: 28 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313

1414
#include <linux/usb/audio.h>
1515
#include <linux/usb/audio-v2.h>
16-
#include <linux/platform_device.h>
1716
#include <linux/module.h>
1817

1918
#include <sound/core.h>
@@ -51,8 +50,6 @@
5150
#define UNFLW_CTRL 8
5251
#define OVFLW_CTRL 10
5352

54-
static const char *uac2_name = "snd_uac2";
55-
5653
struct uac2_req {
5754
struct uac2_rtd_params *pp; /* parent param */
5855
struct usb_request *req;
@@ -81,9 +78,6 @@ struct uac2_rtd_params {
8178
};
8279

8380
struct snd_uac2_chip {
84-
struct platform_device pdev;
85-
struct platform_driver pdrv;
86-
8781
struct uac2_rtd_params p_prm;
8882
struct uac2_rtd_params c_prm;
8983

@@ -122,6 +116,7 @@ struct audio_dev {
122116

123117
struct usb_ep *in_ep, *out_ep;
124118
struct usb_function func;
119+
struct usb_gadget *gadget;
125120

126121
/* The ALSA Sound Card it represents on the USB-Client side */
127122
struct snd_uac2_chip uac2;
@@ -139,12 +134,6 @@ struct audio_dev *uac2_to_agdev(struct snd_uac2_chip *u)
139134
return container_of(u, struct audio_dev, uac2);
140135
}
141136

142-
static inline
143-
struct snd_uac2_chip *pdev_to_uac2(struct platform_device *p)
144-
{
145-
return container_of(p, struct snd_uac2_chip, pdev);
146-
}
147-
148137
static inline
149138
struct f_uac2_opts *agdev_to_uac2_opts(struct audio_dev *agdev)
150139
{
@@ -254,7 +243,7 @@ agdev_iso_complete(struct usb_ep *ep, struct usb_request *req)
254243

255244
exit:
256245
if (usb_ep_queue(ep, req, GFP_ATOMIC))
257-
dev_err(&uac2->pdev.dev, "%d Error!\n", __LINE__);
246+
dev_err(uac2->card->dev, "%d Error!\n", __LINE__);
258247

259248
if (update_alsa)
260249
snd_pcm_period_elapsed(substream);
@@ -440,23 +429,22 @@ static struct snd_pcm_ops uac2_pcm_ops = {
440429
.prepare = uac2_pcm_null,
441430
};
442431

443-
static int snd_uac2_probe(struct platform_device *pdev)
432+
static int snd_uac2_probe(struct audio_dev *audio_dev)
444433
{
445-
struct snd_uac2_chip *uac2 = pdev_to_uac2(pdev);
434+
struct snd_uac2_chip *uac2 = &audio_dev->uac2;
446435
struct snd_card *card;
447436
struct snd_pcm *pcm;
448-
struct audio_dev *audio_dev;
449437
struct f_uac2_opts *opts;
450438
int err;
451439
int p_chmask, c_chmask;
452440

453-
audio_dev = uac2_to_agdev(uac2);
454441
opts = container_of(audio_dev->func.fi, struct f_uac2_opts, func_inst);
455442
p_chmask = opts->p_chmask;
456443
c_chmask = opts->c_chmask;
457444

458445
/* Choose any slot, with no id */
459-
err = snd_card_new(&pdev->dev, -1, NULL, THIS_MODULE, 0, &card);
446+
err = snd_card_new(&audio_dev->gadget->dev,
447+
-1, NULL, THIS_MODULE, 0, &card);
460448
if (err < 0)
461449
return err;
462450

@@ -481,16 +469,15 @@ static int snd_uac2_probe(struct platform_device *pdev)
481469

482470
strcpy(card->driver, "UAC2_Gadget");
483471
strcpy(card->shortname, "UAC2_Gadget");
484-
sprintf(card->longname, "UAC2_Gadget %i", pdev->id);
472+
sprintf(card->longname, "UAC2_Gadget %i", card->dev->id);
485473

486474
snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_CONTINUOUS,
487475
snd_dma_continuous_data(GFP_KERNEL), 0, BUFF_SIZE_MAX);
488476

489477
err = snd_card_register(card);
490-
if (!err) {
491-
platform_set_drvdata(pdev, card);
478+
479+
if (!err)
492480
return 0;
493-
}
494481

495482
snd_fail:
496483
snd_card_free(card);
@@ -501,55 +488,16 @@ static int snd_uac2_probe(struct platform_device *pdev)
501488
return err;
502489
}
503490

504-
static int snd_uac2_remove(struct platform_device *pdev)
491+
static int snd_uac2_remove(struct audio_dev *audio_dev)
505492
{
506-
struct snd_card *card = platform_get_drvdata(pdev);
493+
struct snd_card *card = audio_dev->uac2.card;
507494

508495
if (card)
509496
return snd_card_free(card);
510497

511498
return 0;
512499
}
513500

514-
static void snd_uac2_release(struct device *dev)
515-
{
516-
dev_dbg(dev, "releasing '%s'\n", dev_name(dev));
517-
}
518-
519-
static int alsa_uac2_init(struct audio_dev *agdev)
520-
{
521-
struct snd_uac2_chip *uac2 = &agdev->uac2;
522-
int err;
523-
524-
uac2->pdrv.probe = snd_uac2_probe;
525-
uac2->pdrv.remove = snd_uac2_remove;
526-
uac2->pdrv.driver.name = uac2_name;
527-
528-
uac2->pdev.id = 0;
529-
uac2->pdev.name = uac2_name;
530-
uac2->pdev.dev.release = snd_uac2_release;
531-
532-
/* Register snd_uac2 driver */
533-
err = platform_driver_register(&uac2->pdrv);
534-
if (err)
535-
return err;
536-
537-
/* Register snd_uac2 device */
538-
err = platform_device_register(&uac2->pdev);
539-
if (err)
540-
platform_driver_unregister(&uac2->pdrv);
541-
542-
return err;
543-
}
544-
545-
static void alsa_uac2_exit(struct audio_dev *agdev)
546-
{
547-
struct snd_uac2_chip *uac2 = &agdev->uac2;
548-
549-
platform_driver_unregister(&uac2->pdrv);
550-
platform_device_unregister(&uac2->pdev);
551-
}
552-
553501

554502
/* --------- USB Function Interface ------------- */
555503

@@ -960,7 +908,7 @@ free_ep(struct uac2_rtd_params *prm, struct usb_ep *ep)
960908
}
961909

962910
if (usb_ep_disable(ep))
963-
dev_err(&uac2->pdev.dev,
911+
dev_err(uac2->card->dev,
964912
"%s:%d Error!\n", __func__, __LINE__);
965913
}
966914

@@ -994,7 +942,7 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn)
994942
struct snd_uac2_chip *uac2 = &agdev->uac2;
995943
struct usb_composite_dev *cdev = cfg->cdev;
996944
struct usb_gadget *gadget = cdev->gadget;
997-
struct device *dev = &uac2->pdev.dev;
945+
struct device *dev = &gadget->dev;
998946
struct uac2_rtd_params *prm;
999947
struct f_uac2_opts *uac2_opts;
1000948
struct usb_string *us;
@@ -1094,6 +1042,8 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn)
10941042
if (ret)
10951043
return ret;
10961044

1045+
agdev->gadget = gadget;
1046+
10971047
prm = &agdev->uac2.c_prm;
10981048
prm->max_psize = hs_epout_desc.wMaxPacketSize;
10991049
prm->ureq = kcalloc(uac2_opts->req_number, sizeof(struct uac2_req),
@@ -1124,7 +1074,7 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn)
11241074
goto err_no_memory;
11251075
}
11261076

1127-
ret = alsa_uac2_init(agdev);
1077+
ret = snd_uac2_probe(agdev);
11281078
if (ret)
11291079
goto err_no_memory;
11301080
return 0;
@@ -1136,6 +1086,7 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn)
11361086
kfree(agdev->uac2.c_prm.rbuf);
11371087
err_free_descs:
11381088
usb_free_all_descriptors(fn);
1089+
agdev->gadget = NULL;
11391090
return ret;
11401091
}
11411092

@@ -1147,7 +1098,7 @@ afunc_set_alt(struct usb_function *fn, unsigned intf, unsigned alt)
11471098
struct f_uac2_opts *opts = agdev_to_uac2_opts(agdev);
11481099
struct snd_uac2_chip *uac2 = &agdev->uac2;
11491100
struct usb_gadget *gadget = cdev->gadget;
1150-
struct device *dev = &uac2->pdev.dev;
1101+
struct device *dev = &gadget->dev;
11511102
struct usb_request *req;
11521103
struct usb_ep *ep;
11531104
struct uac2_rtd_params *prm;
@@ -1247,7 +1198,6 @@ static int
12471198
afunc_get_alt(struct usb_function *fn, unsigned intf)
12481199
{
12491200
struct audio_dev *agdev = func_to_agdev(fn);
1250-
struct snd_uac2_chip *uac2 = &agdev->uac2;
12511201

12521202
if (intf == agdev->ac_intf)
12531203
return agdev->ac_alt;
@@ -1256,7 +1206,7 @@ afunc_get_alt(struct usb_function *fn, unsigned intf)
12561206
else if (intf == agdev->as_in_intf)
12571207
return agdev->as_in_alt;
12581208
else
1259-
dev_err(&uac2->pdev.dev,
1209+
dev_err(&agdev->gadget->dev,
12601210
"%s:%d Invalid Interface %d!\n",
12611211
__func__, __LINE__, intf);
12621212

@@ -1281,7 +1231,6 @@ in_rq_cur(struct usb_function *fn, const struct usb_ctrlrequest *cr)
12811231
{
12821232
struct usb_request *req = fn->config->cdev->req;
12831233
struct audio_dev *agdev = func_to_agdev(fn);
1284-
struct snd_uac2_chip *uac2 = &agdev->uac2;
12851234
struct f_uac2_opts *opts;
12861235
u16 w_length = le16_to_cpu(cr->wLength);
12871236
u16 w_index = le16_to_cpu(cr->wIndex);
@@ -1310,7 +1259,7 @@ in_rq_cur(struct usb_function *fn, const struct usb_ctrlrequest *cr)
13101259
*(u8 *)req->buf = 1;
13111260
value = min_t(unsigned, w_length, 1);
13121261
} else {
1313-
dev_err(&uac2->pdev.dev,
1262+
dev_err(&agdev->gadget->dev,
13141263
"%s:%d control_selector=%d TODO!\n",
13151264
__func__, __LINE__, control_selector);
13161265
}
@@ -1323,7 +1272,6 @@ in_rq_range(struct usb_function *fn, const struct usb_ctrlrequest *cr)
13231272
{
13241273
struct usb_request *req = fn->config->cdev->req;
13251274
struct audio_dev *agdev = func_to_agdev(fn);
1326-
struct snd_uac2_chip *uac2 = &agdev->uac2;
13271275
struct f_uac2_opts *opts;
13281276
u16 w_length = le16_to_cpu(cr->wLength);
13291277
u16 w_index = le16_to_cpu(cr->wIndex);
@@ -1353,7 +1301,7 @@ in_rq_range(struct usb_function *fn, const struct usb_ctrlrequest *cr)
13531301
value = min_t(unsigned, w_length, sizeof r);
13541302
memcpy(req->buf, &r, value);
13551303
} else {
1356-
dev_err(&uac2->pdev.dev,
1304+
dev_err(&agdev->gadget->dev,
13571305
"%s:%d control_selector=%d TODO!\n",
13581306
__func__, __LINE__, control_selector);
13591307
}
@@ -1389,12 +1337,11 @@ static int
13891337
setup_rq_inf(struct usb_function *fn, const struct usb_ctrlrequest *cr)
13901338
{
13911339
struct audio_dev *agdev = func_to_agdev(fn);
1392-
struct snd_uac2_chip *uac2 = &agdev->uac2;
13931340
u16 w_index = le16_to_cpu(cr->wIndex);
13941341
u8 intf = w_index & 0xff;
13951342

13961343
if (intf != agdev->ac_intf) {
1397-
dev_err(&uac2->pdev.dev,
1344+
dev_err(&agdev->gadget->dev,
13981345
"%s:%d Error!\n", __func__, __LINE__);
13991346
return -EOPNOTSUPP;
14001347
}
@@ -1412,7 +1359,6 @@ afunc_setup(struct usb_function *fn, const struct usb_ctrlrequest *cr)
14121359
{
14131360
struct usb_composite_dev *cdev = fn->config->cdev;
14141361
struct audio_dev *agdev = func_to_agdev(fn);
1415-
struct snd_uac2_chip *uac2 = &agdev->uac2;
14161362
struct usb_request *req = cdev->req;
14171363
u16 w_length = le16_to_cpu(cr->wLength);
14181364
int value = -EOPNOTSUPP;
@@ -1424,14 +1370,15 @@ afunc_setup(struct usb_function *fn, const struct usb_ctrlrequest *cr)
14241370
if ((cr->bRequestType & USB_RECIP_MASK) == USB_RECIP_INTERFACE)
14251371
value = setup_rq_inf(fn, cr);
14261372
else
1427-
dev_err(&uac2->pdev.dev, "%s:%d Error!\n", __func__, __LINE__);
1373+
dev_err(&agdev->gadget->dev, "%s:%d Error!\n",
1374+
__func__, __LINE__);
14281375

14291376
if (value >= 0) {
14301377
req->length = value;
14311378
req->zero = value < w_length;
14321379
value = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC);
14331380
if (value < 0) {
1434-
dev_err(&uac2->pdev.dev,
1381+
dev_err(&agdev->gadget->dev,
14351382
"%s:%d Error!\n", __func__, __LINE__);
14361383
req->status = 0;
14371384
}
@@ -1573,7 +1520,7 @@ static void afunc_unbind(struct usb_configuration *c, struct usb_function *f)
15731520
struct audio_dev *agdev = func_to_agdev(f);
15741521
struct uac2_rtd_params *prm;
15751522

1576-
alsa_uac2_exit(agdev);
1523+
snd_uac2_remove(agdev);
15771524

15781525
prm = &agdev->uac2.p_prm;
15791526
kfree(prm->rbuf);
@@ -1582,6 +1529,8 @@ static void afunc_unbind(struct usb_configuration *c, struct usb_function *f)
15821529
kfree(prm->rbuf);
15831530
kfree(prm->ureq);
15841531
usb_free_all_descriptors(f);
1532+
1533+
agdev->gadget = NULL;
15851534
}
15861535

15871536
static struct usb_function *afunc_alloc(struct usb_function_instance *fi)

0 commit comments

Comments
 (0)