Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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 <ruslan.bilovol@gmail.com>
Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>

authored by

Ruslan Bilovol and committed by
Felipe Balbi
7158b57a 1fc4926d

+28 -79
+28 -79
drivers/usb/gadget/function/f_uac2.c
··· 13 13 14 14 #include <linux/usb/audio.h> 15 15 #include <linux/usb/audio-v2.h> 16 - #include <linux/platform_device.h> 17 16 #include <linux/module.h> 18 17 19 18 #include <sound/core.h> ··· 50 51 #define UNFLW_CTRL 8 51 52 #define OVFLW_CTRL 10 52 53 53 - static const char *uac2_name = "snd_uac2"; 54 - 55 54 struct uac2_req { 56 55 struct uac2_rtd_params *pp; /* parent param */ 57 56 struct usb_request *req; ··· 78 81 }; 79 82 80 83 struct snd_uac2_chip { 81 - struct platform_device pdev; 82 - struct platform_driver pdrv; 83 - 84 84 struct uac2_rtd_params p_prm; 85 85 struct uac2_rtd_params c_prm; 86 86 ··· 116 122 117 123 struct usb_ep *in_ep, *out_ep; 118 124 struct usb_function func; 125 + struct usb_gadget *gadget; 119 126 120 127 /* The ALSA Sound Card it represents on the USB-Client side */ 121 128 struct snd_uac2_chip uac2; ··· 132 137 struct audio_dev *uac2_to_agdev(struct snd_uac2_chip *u) 133 138 { 134 139 return container_of(u, struct audio_dev, uac2); 135 - } 136 - 137 - static inline 138 - struct snd_uac2_chip *pdev_to_uac2(struct platform_device *p) 139 - { 140 - return container_of(p, struct snd_uac2_chip, pdev); 141 140 } 142 141 143 142 static inline ··· 243 254 244 255 exit: 245 256 if (usb_ep_queue(ep, req, GFP_ATOMIC)) 246 - dev_err(&uac2->pdev.dev, "%d Error!\n", __LINE__); 257 + dev_err(uac2->card->dev, "%d Error!\n", __LINE__); 247 258 248 259 if (update_alsa) 249 260 snd_pcm_period_elapsed(substream); ··· 429 440 .prepare = uac2_pcm_null, 430 441 }; 431 442 432 - static int snd_uac2_probe(struct platform_device *pdev) 443 + static int snd_uac2_probe(struct audio_dev *audio_dev) 433 444 { 434 - struct snd_uac2_chip *uac2 = pdev_to_uac2(pdev); 445 + struct snd_uac2_chip *uac2 = &audio_dev->uac2; 435 446 struct snd_card *card; 436 447 struct snd_pcm *pcm; 437 - struct audio_dev *audio_dev; 438 448 struct f_uac2_opts *opts; 439 449 int err; 440 450 int p_chmask, c_chmask; 441 451 442 - audio_dev = uac2_to_agdev(uac2); 443 452 opts = container_of(audio_dev->func.fi, struct f_uac2_opts, func_inst); 444 453 p_chmask = opts->p_chmask; 445 454 c_chmask = opts->c_chmask; 446 455 447 456 /* Choose any slot, with no id */ 448 - err = snd_card_new(&pdev->dev, -1, NULL, THIS_MODULE, 0, &card); 457 + err = snd_card_new(&audio_dev->gadget->dev, 458 + -1, NULL, THIS_MODULE, 0, &card); 449 459 if (err < 0) 450 460 return err; 451 461 ··· 469 481 470 482 strcpy(card->driver, "UAC2_Gadget"); 471 483 strcpy(card->shortname, "UAC2_Gadget"); 472 - sprintf(card->longname, "UAC2_Gadget %i", pdev->id); 484 + sprintf(card->longname, "UAC2_Gadget %i", card->dev->id); 473 485 474 486 snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_CONTINUOUS, 475 487 snd_dma_continuous_data(GFP_KERNEL), 0, BUFF_SIZE_MAX); 476 488 477 489 err = snd_card_register(card); 478 - if (!err) { 479 - platform_set_drvdata(pdev, card); 490 + 491 + if (!err) 480 492 return 0; 481 - } 482 493 483 494 snd_fail: 484 495 snd_card_free(card); ··· 488 501 return err; 489 502 } 490 503 491 - static int snd_uac2_remove(struct platform_device *pdev) 504 + static int snd_uac2_remove(struct audio_dev *audio_dev) 492 505 { 493 - struct snd_card *card = platform_get_drvdata(pdev); 506 + struct snd_card *card = audio_dev->uac2.card; 494 507 495 508 if (card) 496 509 return snd_card_free(card); 497 510 498 511 return 0; 499 - } 500 - 501 - static void snd_uac2_release(struct device *dev) 502 - { 503 - dev_dbg(dev, "releasing '%s'\n", dev_name(dev)); 504 - } 505 - 506 - static int alsa_uac2_init(struct audio_dev *agdev) 507 - { 508 - struct snd_uac2_chip *uac2 = &agdev->uac2; 509 - int err; 510 - 511 - uac2->pdrv.probe = snd_uac2_probe; 512 - uac2->pdrv.remove = snd_uac2_remove; 513 - uac2->pdrv.driver.name = uac2_name; 514 - 515 - uac2->pdev.id = 0; 516 - uac2->pdev.name = uac2_name; 517 - uac2->pdev.dev.release = snd_uac2_release; 518 - 519 - /* Register snd_uac2 driver */ 520 - err = platform_driver_register(&uac2->pdrv); 521 - if (err) 522 - return err; 523 - 524 - /* Register snd_uac2 device */ 525 - err = platform_device_register(&uac2->pdev); 526 - if (err) 527 - platform_driver_unregister(&uac2->pdrv); 528 - 529 - return err; 530 - } 531 - 532 - static void alsa_uac2_exit(struct audio_dev *agdev) 533 - { 534 - struct snd_uac2_chip *uac2 = &agdev->uac2; 535 - 536 - platform_driver_unregister(&uac2->pdrv); 537 - platform_device_unregister(&uac2->pdev); 538 512 } 539 513 540 514 ··· 908 960 } 909 961 910 962 if (usb_ep_disable(ep)) 911 - dev_err(&uac2->pdev.dev, 963 + dev_err(uac2->card->dev, 912 964 "%s:%d Error!\n", __func__, __LINE__); 913 965 } 914 966 ··· 942 994 struct snd_uac2_chip *uac2 = &agdev->uac2; 943 995 struct usb_composite_dev *cdev = cfg->cdev; 944 996 struct usb_gadget *gadget = cdev->gadget; 945 - struct device *dev = &uac2->pdev.dev; 997 + struct device *dev = &gadget->dev; 946 998 struct uac2_rtd_params *prm; 947 999 struct f_uac2_opts *uac2_opts; 948 1000 struct usb_string *us; ··· 1042 1094 if (ret) 1043 1095 return ret; 1044 1096 1097 + agdev->gadget = gadget; 1098 + 1045 1099 prm = &agdev->uac2.c_prm; 1046 1100 prm->max_psize = hs_epout_desc.wMaxPacketSize; 1047 1101 prm->ureq = kcalloc(uac2_opts->req_number, sizeof(struct uac2_req), ··· 1074 1124 goto err_no_memory; 1075 1125 } 1076 1126 1077 - ret = alsa_uac2_init(agdev); 1127 + ret = snd_uac2_probe(agdev); 1078 1128 if (ret) 1079 1129 goto err_no_memory; 1080 1130 return 0; ··· 1086 1136 kfree(agdev->uac2.c_prm.rbuf); 1087 1137 err_free_descs: 1088 1138 usb_free_all_descriptors(fn); 1139 + agdev->gadget = NULL; 1089 1140 return ret; 1090 1141 } 1091 1142 ··· 1098 1147 struct f_uac2_opts *opts = agdev_to_uac2_opts(agdev); 1099 1148 struct snd_uac2_chip *uac2 = &agdev->uac2; 1100 1149 struct usb_gadget *gadget = cdev->gadget; 1101 - struct device *dev = &uac2->pdev.dev; 1150 + struct device *dev = &gadget->dev; 1102 1151 struct usb_request *req; 1103 1152 struct usb_ep *ep; 1104 1153 struct uac2_rtd_params *prm; ··· 1198 1247 afunc_get_alt(struct usb_function *fn, unsigned intf) 1199 1248 { 1200 1249 struct audio_dev *agdev = func_to_agdev(fn); 1201 - struct snd_uac2_chip *uac2 = &agdev->uac2; 1202 1250 1203 1251 if (intf == agdev->ac_intf) 1204 1252 return agdev->ac_alt; ··· 1206 1256 else if (intf == agdev->as_in_intf) 1207 1257 return agdev->as_in_alt; 1208 1258 else 1209 - dev_err(&uac2->pdev.dev, 1259 + dev_err(&agdev->gadget->dev, 1210 1260 "%s:%d Invalid Interface %d!\n", 1211 1261 __func__, __LINE__, intf); 1212 1262 ··· 1231 1281 { 1232 1282 struct usb_request *req = fn->config->cdev->req; 1233 1283 struct audio_dev *agdev = func_to_agdev(fn); 1234 - struct snd_uac2_chip *uac2 = &agdev->uac2; 1235 1284 struct f_uac2_opts *opts; 1236 1285 u16 w_length = le16_to_cpu(cr->wLength); 1237 1286 u16 w_index = le16_to_cpu(cr->wIndex); ··· 1259 1310 *(u8 *)req->buf = 1; 1260 1311 value = min_t(unsigned, w_length, 1); 1261 1312 } else { 1262 - dev_err(&uac2->pdev.dev, 1313 + dev_err(&agdev->gadget->dev, 1263 1314 "%s:%d control_selector=%d TODO!\n", 1264 1315 __func__, __LINE__, control_selector); 1265 1316 } ··· 1272 1323 { 1273 1324 struct usb_request *req = fn->config->cdev->req; 1274 1325 struct audio_dev *agdev = func_to_agdev(fn); 1275 - struct snd_uac2_chip *uac2 = &agdev->uac2; 1276 1326 struct f_uac2_opts *opts; 1277 1327 u16 w_length = le16_to_cpu(cr->wLength); 1278 1328 u16 w_index = le16_to_cpu(cr->wIndex); ··· 1301 1353 value = min_t(unsigned, w_length, sizeof r); 1302 1354 memcpy(req->buf, &r, value); 1303 1355 } else { 1304 - dev_err(&uac2->pdev.dev, 1356 + dev_err(&agdev->gadget->dev, 1305 1357 "%s:%d control_selector=%d TODO!\n", 1306 1358 __func__, __LINE__, control_selector); 1307 1359 } ··· 1337 1389 setup_rq_inf(struct usb_function *fn, const struct usb_ctrlrequest *cr) 1338 1390 { 1339 1391 struct audio_dev *agdev = func_to_agdev(fn); 1340 - struct snd_uac2_chip *uac2 = &agdev->uac2; 1341 1392 u16 w_index = le16_to_cpu(cr->wIndex); 1342 1393 u8 intf = w_index & 0xff; 1343 1394 1344 1395 if (intf != agdev->ac_intf) { 1345 - dev_err(&uac2->pdev.dev, 1396 + dev_err(&agdev->gadget->dev, 1346 1397 "%s:%d Error!\n", __func__, __LINE__); 1347 1398 return -EOPNOTSUPP; 1348 1399 } ··· 1359 1412 { 1360 1413 struct usb_composite_dev *cdev = fn->config->cdev; 1361 1414 struct audio_dev *agdev = func_to_agdev(fn); 1362 - struct snd_uac2_chip *uac2 = &agdev->uac2; 1363 1415 struct usb_request *req = cdev->req; 1364 1416 u16 w_length = le16_to_cpu(cr->wLength); 1365 1417 int value = -EOPNOTSUPP; ··· 1370 1424 if ((cr->bRequestType & USB_RECIP_MASK) == USB_RECIP_INTERFACE) 1371 1425 value = setup_rq_inf(fn, cr); 1372 1426 else 1373 - dev_err(&uac2->pdev.dev, "%s:%d Error!\n", __func__, __LINE__); 1427 + dev_err(&agdev->gadget->dev, "%s:%d Error!\n", 1428 + __func__, __LINE__); 1374 1429 1375 1430 if (value >= 0) { 1376 1431 req->length = value; 1377 1432 req->zero = value < w_length; 1378 1433 value = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC); 1379 1434 if (value < 0) { 1380 - dev_err(&uac2->pdev.dev, 1435 + dev_err(&agdev->gadget->dev, 1381 1436 "%s:%d Error!\n", __func__, __LINE__); 1382 1437 req->status = 0; 1383 1438 } ··· 1520 1573 struct audio_dev *agdev = func_to_agdev(f); 1521 1574 struct uac2_rtd_params *prm; 1522 1575 1523 - alsa_uac2_exit(agdev); 1576 + snd_uac2_remove(agdev); 1524 1577 1525 1578 prm = &agdev->uac2.p_prm; 1526 1579 kfree(prm->rbuf); ··· 1529 1582 kfree(prm->rbuf); 1530 1583 kfree(prm->ureq); 1531 1584 usb_free_all_descriptors(f); 1585 + 1586 + agdev->gadget = NULL; 1532 1587 } 1533 1588 1534 1589 static struct usb_function *afunc_alloc(struct usb_function_instance *fi)