test-component.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647
  1. // SPDX-License-Identifier: GPL-2.0
  2. //
  3. // test-component.c -- Test Audio Component driver
  4. //
  5. // Copyright (C) 2020 Renesas Electronics Corporation
  6. // Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
  7. #include <linux/slab.h>
  8. #include <linux/of.h>
  9. #include <linux/of_graph.h>
  10. #include <linux/module.h>
  11. #include <linux/workqueue.h>
  12. #include <sound/pcm.h>
  13. #include <sound/soc.h>
  14. #define TEST_NAME_LEN 32
  15. struct test_dai_name {
  16. char name[TEST_NAME_LEN];
  17. char name_playback[TEST_NAME_LEN];
  18. char name_capture[TEST_NAME_LEN];
  19. };
  20. struct test_priv {
  21. struct device *dev;
  22. struct snd_pcm_substream *substream;
  23. struct delayed_work dwork;
  24. struct snd_soc_component_driver *component_driver;
  25. struct snd_soc_dai_driver *dai_driver;
  26. struct test_dai_name *name;
  27. };
  28. struct test_adata {
  29. u32 is_cpu:1;
  30. u32 cmp_v:1;
  31. u32 dai_v:1;
  32. };
  33. #define mile_stone(d) dev_info((d)->dev, "%s() : %s", __func__, (d)->driver->name)
  34. #define mile_stone_x(dev) dev_info(dev, "%s()", __func__)
  35. static int test_dai_set_sysclk(struct snd_soc_dai *dai,
  36. int clk_id, unsigned int freq, int dir)
  37. {
  38. mile_stone(dai);
  39. return 0;
  40. }
  41. static int test_dai_set_pll(struct snd_soc_dai *dai, int pll_id, int source,
  42. unsigned int freq_in, unsigned int freq_out)
  43. {
  44. mile_stone(dai);
  45. return 0;
  46. }
  47. static int test_dai_set_clkdiv(struct snd_soc_dai *dai, int div_id, int div)
  48. {
  49. mile_stone(dai);
  50. return 0;
  51. }
  52. static int test_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
  53. {
  54. unsigned int format = fmt & SND_SOC_DAIFMT_FORMAT_MASK;
  55. unsigned int clock = fmt & SND_SOC_DAIFMT_CLOCK_MASK;
  56. unsigned int inv = fmt & SND_SOC_DAIFMT_INV_MASK;
  57. unsigned int master = fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK;
  58. char *str;
  59. dev_info(dai->dev, "name : %s", dai->name);
  60. str = "unknown";
  61. switch (format) {
  62. case SND_SOC_DAIFMT_I2S:
  63. str = "i2s";
  64. break;
  65. case SND_SOC_DAIFMT_RIGHT_J:
  66. str = "right_j";
  67. break;
  68. case SND_SOC_DAIFMT_LEFT_J:
  69. str = "left_j";
  70. break;
  71. case SND_SOC_DAIFMT_DSP_A:
  72. str = "dsp_a";
  73. break;
  74. case SND_SOC_DAIFMT_DSP_B:
  75. str = "dsp_b";
  76. break;
  77. case SND_SOC_DAIFMT_AC97:
  78. str = "ac97";
  79. break;
  80. case SND_SOC_DAIFMT_PDM:
  81. str = "pdm";
  82. break;
  83. }
  84. dev_info(dai->dev, "format : %s", str);
  85. if (clock == SND_SOC_DAIFMT_CONT)
  86. str = "continuous";
  87. else
  88. str = "gated";
  89. dev_info(dai->dev, "clock : %s", str);
  90. str = "unknown";
  91. switch (master) {
  92. case SND_SOC_DAIFMT_BP_FP:
  93. str = "clk provider, frame provider";
  94. break;
  95. case SND_SOC_DAIFMT_BC_FP:
  96. str = "clk consumer, frame provider";
  97. break;
  98. case SND_SOC_DAIFMT_BP_FC:
  99. str = "clk provider, frame consumer";
  100. break;
  101. case SND_SOC_DAIFMT_BC_FC:
  102. str = "clk consumer, frame consumer";
  103. break;
  104. }
  105. dev_info(dai->dev, "clock : codec is %s", str);
  106. str = "unknown";
  107. switch (inv) {
  108. case SND_SOC_DAIFMT_NB_NF:
  109. str = "normal bit, normal frame";
  110. break;
  111. case SND_SOC_DAIFMT_NB_IF:
  112. str = "normal bit, invert frame";
  113. break;
  114. case SND_SOC_DAIFMT_IB_NF:
  115. str = "invert bit, normal frame";
  116. break;
  117. case SND_SOC_DAIFMT_IB_IF:
  118. str = "invert bit, invert frame";
  119. break;
  120. }
  121. dev_info(dai->dev, "signal : %s", str);
  122. return 0;
  123. }
  124. static int test_dai_mute_stream(struct snd_soc_dai *dai, int mute, int stream)
  125. {
  126. mile_stone(dai);
  127. return 0;
  128. }
  129. static int test_dai_startup(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
  130. {
  131. mile_stone(dai);
  132. return 0;
  133. }
  134. static void test_dai_shutdown(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
  135. {
  136. mile_stone(dai);
  137. }
  138. static int test_dai_hw_params(struct snd_pcm_substream *substream,
  139. struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
  140. {
  141. mile_stone(dai);
  142. return 0;
  143. }
  144. static int test_dai_hw_free(struct snd_pcm_substream *substream, struct snd_soc_dai *dai)
  145. {
  146. mile_stone(dai);
  147. return 0;
  148. }
  149. static int test_dai_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai)
  150. {
  151. mile_stone(dai);
  152. return 0;
  153. }
  154. static const u64 test_dai_formats =
  155. /*
  156. * Select below from Sound Card, not auto
  157. * SND_SOC_POSSIBLE_DAIFMT_BP_FP
  158. * SND_SOC_POSSIBLE_DAIFMT_BC_FP
  159. * SND_SOC_POSSIBLE_DAIFMT_BP_FC
  160. * SND_SOC_POSSIBLE_DAIFMT_BC_FC
  161. */
  162. SND_SOC_POSSIBLE_DAIFMT_I2S |
  163. SND_SOC_POSSIBLE_DAIFMT_RIGHT_J |
  164. SND_SOC_POSSIBLE_DAIFMT_LEFT_J |
  165. SND_SOC_POSSIBLE_DAIFMT_DSP_A |
  166. SND_SOC_POSSIBLE_DAIFMT_DSP_B |
  167. SND_SOC_POSSIBLE_DAIFMT_AC97 |
  168. SND_SOC_POSSIBLE_DAIFMT_PDM |
  169. SND_SOC_POSSIBLE_DAIFMT_NB_NF |
  170. SND_SOC_POSSIBLE_DAIFMT_NB_IF |
  171. SND_SOC_POSSIBLE_DAIFMT_IB_NF |
  172. SND_SOC_POSSIBLE_DAIFMT_IB_IF;
  173. static const struct snd_soc_dai_ops test_ops = {
  174. .set_fmt = test_dai_set_fmt,
  175. .startup = test_dai_startup,
  176. .shutdown = test_dai_shutdown,
  177. .auto_selectable_formats = &test_dai_formats,
  178. .num_auto_selectable_formats = 1,
  179. };
  180. static const struct snd_soc_dai_ops test_verbose_ops = {
  181. .set_sysclk = test_dai_set_sysclk,
  182. .set_pll = test_dai_set_pll,
  183. .set_clkdiv = test_dai_set_clkdiv,
  184. .set_fmt = test_dai_set_fmt,
  185. .mute_stream = test_dai_mute_stream,
  186. .startup = test_dai_startup,
  187. .shutdown = test_dai_shutdown,
  188. .hw_params = test_dai_hw_params,
  189. .hw_free = test_dai_hw_free,
  190. .trigger = test_dai_trigger,
  191. .auto_selectable_formats = &test_dai_formats,
  192. .num_auto_selectable_formats = 1,
  193. };
  194. #define STUB_RATES SNDRV_PCM_RATE_8000_384000
  195. #define STUB_FORMATS (SNDRV_PCM_FMTBIT_S8 | \
  196. SNDRV_PCM_FMTBIT_U8 | \
  197. SNDRV_PCM_FMTBIT_S16_LE | \
  198. SNDRV_PCM_FMTBIT_U16_LE | \
  199. SNDRV_PCM_FMTBIT_S24_LE | \
  200. SNDRV_PCM_FMTBIT_S24_3LE | \
  201. SNDRV_PCM_FMTBIT_U24_LE | \
  202. SNDRV_PCM_FMTBIT_S32_LE | \
  203. SNDRV_PCM_FMTBIT_U32_LE)
  204. static int test_component_probe(struct snd_soc_component *component)
  205. {
  206. mile_stone(component);
  207. return 0;
  208. }
  209. static void test_component_remove(struct snd_soc_component *component)
  210. {
  211. mile_stone(component);
  212. }
  213. static int test_component_suspend(struct snd_soc_component *component)
  214. {
  215. mile_stone(component);
  216. return 0;
  217. }
  218. static int test_component_resume(struct snd_soc_component *component)
  219. {
  220. mile_stone(component);
  221. return 0;
  222. }
  223. #define PREALLOC_BUFFER (32 * 1024)
  224. static int test_component_pcm_construct(struct snd_soc_component *component,
  225. struct snd_soc_pcm_runtime *rtd)
  226. {
  227. mile_stone(component);
  228. snd_pcm_set_managed_buffer_all(
  229. rtd->pcm,
  230. SNDRV_DMA_TYPE_DEV,
  231. rtd->card->snd_card->dev,
  232. PREALLOC_BUFFER, PREALLOC_BUFFER);
  233. return 0;
  234. }
  235. static void test_component_pcm_destruct(struct snd_soc_component *component,
  236. struct snd_pcm *pcm)
  237. {
  238. mile_stone(component);
  239. }
  240. static int test_component_set_sysclk(struct snd_soc_component *component,
  241. int clk_id, int source, unsigned int freq, int dir)
  242. {
  243. mile_stone(component);
  244. return 0;
  245. }
  246. static int test_component_set_pll(struct snd_soc_component *component, int pll_id,
  247. int source, unsigned int freq_in, unsigned int freq_out)
  248. {
  249. mile_stone(component);
  250. return 0;
  251. }
  252. static int test_component_set_jack(struct snd_soc_component *component,
  253. struct snd_soc_jack *jack, void *data)
  254. {
  255. mile_stone(component);
  256. return 0;
  257. }
  258. static void test_component_seq_notifier(struct snd_soc_component *component,
  259. enum snd_soc_dapm_type type, int subseq)
  260. {
  261. mile_stone(component);
  262. }
  263. static int test_component_stream_event(struct snd_soc_component *component, int event)
  264. {
  265. mile_stone(component);
  266. return 0;
  267. }
  268. static int test_component_set_bias_level(struct snd_soc_component *component,
  269. enum snd_soc_bias_level level)
  270. {
  271. mile_stone(component);
  272. return 0;
  273. }
  274. static const struct snd_pcm_hardware test_component_hardware = {
  275. /* Random values to keep userspace happy when checking constraints */
  276. .info = SNDRV_PCM_INFO_INTERLEAVED |
  277. SNDRV_PCM_INFO_MMAP |
  278. SNDRV_PCM_INFO_MMAP_VALID,
  279. .buffer_bytes_max = 32 * 1024,
  280. .period_bytes_min = 32,
  281. .period_bytes_max = 8192,
  282. .periods_min = 1,
  283. .periods_max = 128,
  284. .fifo_size = 256,
  285. };
  286. static int test_component_open(struct snd_soc_component *component,
  287. struct snd_pcm_substream *substream)
  288. {
  289. struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
  290. mile_stone(component);
  291. /* BE's dont need dummy params */
  292. if (!rtd->dai_link->no_pcm)
  293. snd_soc_set_runtime_hwparams(substream, &test_component_hardware);
  294. return 0;
  295. }
  296. static int test_component_close(struct snd_soc_component *component,
  297. struct snd_pcm_substream *substream)
  298. {
  299. mile_stone(component);
  300. return 0;
  301. }
  302. static int test_component_ioctl(struct snd_soc_component *component,
  303. struct snd_pcm_substream *substream,
  304. unsigned int cmd, void *arg)
  305. {
  306. mile_stone(component);
  307. return 0;
  308. }
  309. static int test_component_hw_params(struct snd_soc_component *component,
  310. struct snd_pcm_substream *substream,
  311. struct snd_pcm_hw_params *params)
  312. {
  313. mile_stone(component);
  314. return 0;
  315. }
  316. static int test_component_hw_free(struct snd_soc_component *component,
  317. struct snd_pcm_substream *substream)
  318. {
  319. mile_stone(component);
  320. return 0;
  321. }
  322. static int test_component_prepare(struct snd_soc_component *component,
  323. struct snd_pcm_substream *substream)
  324. {
  325. mile_stone(component);
  326. return 0;
  327. }
  328. static void test_component_timer_stop(struct test_priv *priv)
  329. {
  330. cancel_delayed_work(&priv->dwork);
  331. }
  332. static void test_component_timer_start(struct test_priv *priv)
  333. {
  334. schedule_delayed_work(&priv->dwork, msecs_to_jiffies(10));
  335. }
  336. static void test_component_dwork(struct work_struct *work)
  337. {
  338. struct test_priv *priv = container_of(work, struct test_priv, dwork.work);
  339. if (priv->substream)
  340. snd_pcm_period_elapsed(priv->substream);
  341. test_component_timer_start(priv);
  342. }
  343. static int test_component_trigger(struct snd_soc_component *component,
  344. struct snd_pcm_substream *substream, int cmd)
  345. {
  346. struct test_priv *priv = dev_get_drvdata(component->dev);
  347. mile_stone(component);
  348. switch (cmd) {
  349. case SNDRV_PCM_TRIGGER_START:
  350. test_component_timer_start(priv);
  351. priv->substream = substream; /* set substream later */
  352. break;
  353. case SNDRV_PCM_TRIGGER_STOP:
  354. priv->substream = NULL;
  355. test_component_timer_stop(priv);
  356. }
  357. return 0;
  358. }
  359. static int test_component_sync_stop(struct snd_soc_component *component,
  360. struct snd_pcm_substream *substream)
  361. {
  362. mile_stone(component);
  363. return 0;
  364. }
  365. static snd_pcm_uframes_t test_component_pointer(struct snd_soc_component *component,
  366. struct snd_pcm_substream *substream)
  367. {
  368. struct snd_pcm_runtime *runtime = substream->runtime;
  369. static int pointer;
  370. if (!runtime)
  371. return 0;
  372. pointer += 10;
  373. if (pointer > PREALLOC_BUFFER)
  374. pointer = 0;
  375. /* mile_stone(component); */
  376. return bytes_to_frames(runtime, pointer);
  377. }
  378. static int test_component_get_time_info(struct snd_soc_component *component,
  379. struct snd_pcm_substream *substream,
  380. struct timespec64 *system_ts,
  381. struct timespec64 *audio_ts,
  382. struct snd_pcm_audio_tstamp_config *audio_tstamp_config,
  383. struct snd_pcm_audio_tstamp_report *audio_tstamp_report)
  384. {
  385. mile_stone(component);
  386. return 0;
  387. }
  388. static int test_component_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
  389. struct snd_pcm_hw_params *params)
  390. {
  391. mile_stone_x(rtd->dev);
  392. return 0;
  393. }
  394. /* CPU */
  395. static const struct test_adata test_cpu = { .is_cpu = 1, .cmp_v = 0, .dai_v = 0, };
  396. static const struct test_adata test_cpu_vv = { .is_cpu = 1, .cmp_v = 1, .dai_v = 1, };
  397. static const struct test_adata test_cpu_nv = { .is_cpu = 1, .cmp_v = 0, .dai_v = 1, };
  398. static const struct test_adata test_cpu_vn = { .is_cpu = 1, .cmp_v = 1, .dai_v = 0, };
  399. /* Codec */
  400. static const struct test_adata test_codec = { .is_cpu = 0, .cmp_v = 0, .dai_v = 0, };
  401. static const struct test_adata test_codec_vv = { .is_cpu = 0, .cmp_v = 1, .dai_v = 1, };
  402. static const struct test_adata test_codec_nv = { .is_cpu = 0, .cmp_v = 0, .dai_v = 1, };
  403. static const struct test_adata test_codec_vn = { .is_cpu = 0, .cmp_v = 1, .dai_v = 0, };
  404. static const struct of_device_id test_of_match[] = {
  405. { .compatible = "test-cpu", .data = (void *)&test_cpu, },
  406. { .compatible = "test-cpu-verbose", .data = (void *)&test_cpu_vv, },
  407. { .compatible = "test-cpu-verbose-dai", .data = (void *)&test_cpu_nv, },
  408. { .compatible = "test-cpu-verbose-component", .data = (void *)&test_cpu_vn, },
  409. { .compatible = "test-codec", .data = (void *)&test_codec, },
  410. { .compatible = "test-codec-verbose", .data = (void *)&test_codec_vv, },
  411. { .compatible = "test-codec-verbose-dai", .data = (void *)&test_codec_nv, },
  412. { .compatible = "test-codec-verbose-component", .data = (void *)&test_codec_vn, },
  413. {},
  414. };
  415. MODULE_DEVICE_TABLE(of, test_of_match);
  416. static const struct snd_soc_dapm_widget widgets[] = {
  417. /*
  418. * FIXME
  419. *
  420. * Just IN/OUT is OK for now,
  421. * but need to be updated ?
  422. */
  423. SND_SOC_DAPM_INPUT("IN"),
  424. SND_SOC_DAPM_OUTPUT("OUT"),
  425. };
  426. static int test_driver_probe(struct platform_device *pdev)
  427. {
  428. struct device *dev = &pdev->dev;
  429. struct device_node *node = dev->of_node;
  430. struct device_node *ep;
  431. const struct test_adata *adata = of_device_get_match_data(&pdev->dev);
  432. struct snd_soc_component_driver *cdriv;
  433. struct snd_soc_dai_driver *ddriv;
  434. struct test_dai_name *dname;
  435. struct test_priv *priv;
  436. int num, ret, i;
  437. num = of_graph_get_endpoint_count(node);
  438. if (!num) {
  439. dev_err(dev, "no port exits\n");
  440. return -EINVAL;
  441. }
  442. priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
  443. cdriv = devm_kzalloc(dev, sizeof(*cdriv), GFP_KERNEL);
  444. ddriv = devm_kzalloc(dev, sizeof(*ddriv) * num, GFP_KERNEL);
  445. dname = devm_kzalloc(dev, sizeof(*dname) * num, GFP_KERNEL);
  446. if (!priv || !cdriv || !ddriv || !dname || !adata)
  447. return -EINVAL;
  448. priv->dev = dev;
  449. priv->component_driver = cdriv;
  450. priv->dai_driver = ddriv;
  451. priv->name = dname;
  452. INIT_DELAYED_WORK(&priv->dwork, test_component_dwork);
  453. dev_set_drvdata(dev, priv);
  454. if (adata->is_cpu) {
  455. cdriv->name = "test_cpu";
  456. cdriv->pcm_construct = test_component_pcm_construct;
  457. cdriv->pointer = test_component_pointer;
  458. cdriv->trigger = test_component_trigger;
  459. cdriv->legacy_dai_naming = 1;
  460. } else {
  461. cdriv->name = "test_codec";
  462. cdriv->idle_bias_on = 1;
  463. cdriv->endianness = 1;
  464. }
  465. cdriv->open = test_component_open;
  466. cdriv->dapm_widgets = widgets;
  467. cdriv->num_dapm_widgets = ARRAY_SIZE(widgets);
  468. if (adata->cmp_v) {
  469. cdriv->probe = test_component_probe;
  470. cdriv->remove = test_component_remove;
  471. cdriv->suspend = test_component_suspend;
  472. cdriv->resume = test_component_resume;
  473. cdriv->set_sysclk = test_component_set_sysclk;
  474. cdriv->set_pll = test_component_set_pll;
  475. cdriv->set_jack = test_component_set_jack;
  476. cdriv->seq_notifier = test_component_seq_notifier;
  477. cdriv->stream_event = test_component_stream_event;
  478. cdriv->set_bias_level = test_component_set_bias_level;
  479. cdriv->close = test_component_close;
  480. cdriv->ioctl = test_component_ioctl;
  481. cdriv->hw_params = test_component_hw_params;
  482. cdriv->hw_free = test_component_hw_free;
  483. cdriv->prepare = test_component_prepare;
  484. cdriv->sync_stop = test_component_sync_stop;
  485. cdriv->get_time_info = test_component_get_time_info;
  486. cdriv->be_hw_params_fixup = test_component_be_hw_params_fixup;
  487. if (adata->is_cpu)
  488. cdriv->pcm_destruct = test_component_pcm_destruct;
  489. }
  490. i = 0;
  491. for_each_endpoint_of_node(node, ep) {
  492. snprintf(dname[i].name, TEST_NAME_LEN, "%s.%d", node->name, i);
  493. ddriv[i].name = dname[i].name;
  494. snprintf(dname[i].name_playback, TEST_NAME_LEN, "DAI%d Playback", i);
  495. ddriv[i].playback.stream_name = dname[i].name_playback;
  496. ddriv[i].playback.channels_min = 1;
  497. ddriv[i].playback.channels_max = 384;
  498. ddriv[i].playback.rates = STUB_RATES;
  499. ddriv[i].playback.formats = STUB_FORMATS;
  500. snprintf(dname[i].name_capture, TEST_NAME_LEN, "DAI%d Capture", i);
  501. ddriv[i].capture.stream_name = dname[i].name_capture;
  502. ddriv[i].capture.channels_min = 1;
  503. ddriv[i].capture.channels_max = 384;
  504. ddriv[i].capture.rates = STUB_RATES;
  505. ddriv[i].capture.formats = STUB_FORMATS;
  506. if (adata->dai_v)
  507. ddriv[i].ops = &test_verbose_ops;
  508. else
  509. ddriv[i].ops = &test_ops;
  510. i++;
  511. }
  512. ret = devm_snd_soc_register_component(dev, cdriv, ddriv, num);
  513. if (ret < 0)
  514. return ret;
  515. mile_stone_x(dev);
  516. return 0;
  517. }
  518. static void test_driver_remove(struct platform_device *pdev)
  519. {
  520. mile_stone_x(&pdev->dev);
  521. }
  522. static struct platform_driver test_driver = {
  523. .driver = {
  524. .name = "test-component",
  525. .of_match_table = test_of_match,
  526. },
  527. .probe = test_driver_probe,
  528. .remove = test_driver_remove,
  529. };
  530. module_platform_driver(test_driver);
  531. MODULE_ALIAS("platform:asoc-test-component");
  532. MODULE_AUTHOR("Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>");
  533. MODULE_DESCRIPTION("ASoC Test Component");
  534. MODULE_LICENSE("GPL v2");