blob: ac7ba97e8dddb344ed6c8b9bcf5c87304d094ac8 [file] [log] [blame]
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +00001/*
Kuninori Morimoto53e682b2016-08-23 01:34:17 +00002 * ASoC simple SCU sound card support
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +00003 *
4 * Copyright (C) 2015 Renesas Solutions Corp.
5 * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
6 *
7 * based on ${LINUX}/sound/soc/generic/simple-card.c
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
12 */
13#include <linux/clk.h>
14#include <linux/device.h>
15#include <linux/module.h>
16#include <linux/of.h>
17#include <linux/of_device.h>
18#include <linux/platform_device.h>
19#include <linux/string.h>
20#include <sound/jack.h>
21#include <sound/soc.h>
22#include <sound/soc-dai.h>
Kuninori Morimotod6a4a9a42016-06-30 06:03:13 +000023#include <sound/simple_card_utils.h>
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +000024
Kuninori Morimoto53e682b2016-08-23 01:34:17 +000025static const struct of_device_id asoc_simple_card_of_match[] = {
Kuninori Morimotob7419dd2015-07-15 07:08:05 +000026 { .compatible = "renesas,rsrc-card", },
Kuninori Morimoto64df0e62016-08-23 01:34:43 +000027 { .compatible = "simple-scu-audio-card", },
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +000028 {},
29};
Kuninori Morimoto53e682b2016-08-23 01:34:17 +000030MODULE_DEVICE_TABLE(of, asoc_simple_card_of_match);
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +000031
Kuninori Morimoto53e682b2016-08-23 01:34:17 +000032struct asoc_simple_card_priv {
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +000033 struct snd_soc_card snd_card;
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +000034 struct snd_soc_codec_conf codec_conf;
Kuninori Morimoto303c3be2016-07-11 23:58:50 +000035 struct asoc_simple_dai *dai_props;
Kuninori Morimoto3433bf02015-06-15 06:22:30 +000036 struct snd_soc_dai_link *dai_link;
Kuninori Morimotoaf7e2be2015-03-26 04:01:46 +000037 u32 convert_rate;
Kuninori Morimotof90432f2016-02-25 05:51:44 +000038 u32 convert_channels;
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +000039};
40
Kuninori Morimoto53e682b2016-08-23 01:34:17 +000041#define simple_priv_to_dev(priv) ((priv)->snd_card.dev)
42#define simple_priv_to_link(priv, i) ((priv)->snd_card.dai_link + (i))
43#define simple_priv_to_props(priv, i) ((priv)->dai_props + (i))
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +000044
Kuninori Morimoto5bbf38662016-08-08 06:02:31 +000045#define DAI "sound-dai"
46#define CELL "#sound-dai-cells"
Kuninori Morimoto64df0e62016-08-23 01:34:43 +000047#define PREFIX "simple-audio-card,"
Kuninori Morimoto5bbf38662016-08-08 06:02:31 +000048
Kuninori Morimoto53e682b2016-08-23 01:34:17 +000049static int asoc_simple_card_startup(struct snd_pcm_substream *substream)
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +000050{
51 struct snd_soc_pcm_runtime *rtd = substream->private_data;
Kuninori Morimoto53e682b2016-08-23 01:34:17 +000052 struct asoc_simple_card_priv *priv = snd_soc_card_get_drvdata(rtd->card);
Kuninori Morimoto303c3be2016-07-11 23:58:50 +000053 struct asoc_simple_dai *dai_props =
Kuninori Morimoto53e682b2016-08-23 01:34:17 +000054 simple_priv_to_props(priv, rtd->num);
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +000055
Kuninori Morimoto04700022015-06-15 06:24:15 +000056 return clk_prepare_enable(dai_props->clk);
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +000057}
58
Kuninori Morimoto53e682b2016-08-23 01:34:17 +000059static void asoc_simple_card_shutdown(struct snd_pcm_substream *substream)
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +000060{
61 struct snd_soc_pcm_runtime *rtd = substream->private_data;
Kuninori Morimoto53e682b2016-08-23 01:34:17 +000062 struct asoc_simple_card_priv *priv = snd_soc_card_get_drvdata(rtd->card);
Kuninori Morimoto303c3be2016-07-11 23:58:50 +000063 struct asoc_simple_dai *dai_props =
Kuninori Morimoto53e682b2016-08-23 01:34:17 +000064 simple_priv_to_props(priv, rtd->num);
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +000065
Kuninori Morimoto04700022015-06-15 06:24:15 +000066 clk_disable_unprepare(dai_props->clk);
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +000067}
68
Kuninori Morimoto53e682b2016-08-23 01:34:17 +000069static struct snd_soc_ops asoc_simple_card_ops = {
70 .startup = asoc_simple_card_startup,
71 .shutdown = asoc_simple_card_shutdown,
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +000072};
73
Kuninori Morimoto53e682b2016-08-23 01:34:17 +000074static int asoc_simple_card_dai_init(struct snd_soc_pcm_runtime *rtd)
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +000075{
Kuninori Morimoto53e682b2016-08-23 01:34:17 +000076 struct asoc_simple_card_priv *priv = snd_soc_card_get_drvdata(rtd->card);
Kuninori Morimoto04700022015-06-15 06:24:15 +000077 struct snd_soc_dai *dai;
78 struct snd_soc_dai_link *dai_link;
Kuninori Morimoto303c3be2016-07-11 23:58:50 +000079 struct asoc_simple_dai *dai_props;
Mengdong Lin1a497982015-11-18 02:34:11 -050080 int num = rtd->num;
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +000081
Kuninori Morimoto53e682b2016-08-23 01:34:17 +000082 dai_link = simple_priv_to_link(priv, num);
83 dai_props = simple_priv_to_props(priv, num);
Kuninori Morimoto04700022015-06-15 06:24:15 +000084 dai = dai_link->dynamic ?
85 rtd->cpu_dai :
86 rtd->codec_dai;
87
Kuninori Morimoto600ee202016-08-09 05:49:21 +000088 return asoc_simple_card_init_dai(dai, dai_props);
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +000089}
90
Kuninori Morimoto53e682b2016-08-23 01:34:17 +000091static int asoc_simple_card_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
Kuninori Morimotoaf7e2be2015-03-26 04:01:46 +000092 struct snd_pcm_hw_params *params)
93{
Kuninori Morimoto53e682b2016-08-23 01:34:17 +000094 struct asoc_simple_card_priv *priv = snd_soc_card_get_drvdata(rtd->card);
Kuninori Morimotoaf7e2be2015-03-26 04:01:46 +000095 struct snd_interval *rate = hw_param_interval(params,
96 SNDRV_PCM_HW_PARAM_RATE);
Kuninori Morimotof90432f2016-02-25 05:51:44 +000097 struct snd_interval *channels = hw_param_interval(params,
98 SNDRV_PCM_HW_PARAM_CHANNELS);
Kuninori Morimotoaf7e2be2015-03-26 04:01:46 +000099
Kuninori Morimotof90432f2016-02-25 05:51:44 +0000100 if (priv->convert_rate)
101 rate->min =
102 rate->max = priv->convert_rate;
Kuninori Morimotoaf7e2be2015-03-26 04:01:46 +0000103
Kuninori Morimotof90432f2016-02-25 05:51:44 +0000104 if (priv->convert_channels)
105 channels->min =
106 channels->max = priv->convert_channels;
Kuninori Morimotoaf7e2be2015-03-26 04:01:46 +0000107
108 return 0;
109}
110
Kuninori Morimoto53e682b2016-08-23 01:34:17 +0000111static int asoc_simple_card_parse_links(struct device_node *np,
112 struct asoc_simple_card_priv *priv,
113 int idx, bool is_fe)
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +0000114{
Kuninori Morimoto53e682b2016-08-23 01:34:17 +0000115 struct device *dev = simple_priv_to_dev(priv);
116 struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, idx);
117 struct asoc_simple_dai *dai_props = simple_priv_to_props(priv, idx);
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +0000118 int ret;
119
Kuninori Morimoto6dad9752015-12-17 02:48:23 +0000120 /* Parse TDM slot */
121 ret = snd_soc_of_parse_tdm_slot(np,
122 &dai_props->tx_slot_mask,
123 &dai_props->rx_slot_mask,
124 &dai_props->slots,
125 &dai_props->slot_width);
126 if (ret)
127 return ret;
128
Kuninori Morimoto04700022015-06-15 06:24:15 +0000129 if (is_fe) {
Kuninori Morimoto27b01082016-08-10 02:21:03 +0000130 int is_single_links = 0;
131
Kuninori Morimoto04700022015-06-15 06:24:15 +0000132 /* BE is dummy */
133 dai_link->codec_of_node = NULL;
134 dai_link->codec_dai_name = "snd-soc-dummy-dai";
135 dai_link->codec_name = "snd-soc-dummy";
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +0000136
Kuninori Morimoto04700022015-06-15 06:24:15 +0000137 /* FE settings */
138 dai_link->dynamic = 1;
139 dai_link->dpcm_merged_format = 1;
Kuninori Morimoto5bbf38662016-08-08 06:02:31 +0000140
141 ret = asoc_simple_card_parse_cpu(np, dai_link, DAI, CELL,
142 &is_single_links);
143 if (ret)
Kuninori Morimoto575f1f92015-12-01 08:33:23 +0000144 return ret;
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +0000145
Kuninori Morimotoc9a235d2016-07-19 02:53:32 +0000146 ret = asoc_simple_card_parse_clk_cpu(np, dai_link, dai_props);
147 if (ret < 0)
148 return ret;
149
Kuninori Morimoto8a99a6b2016-07-11 23:58:25 +0000150 ret = asoc_simple_card_set_dailink_name(dev, dai_link,
151 "fe.%s",
152 dai_link->cpu_dai_name);
153 if (ret < 0)
154 return ret;
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +0000155
Kuninori Morimoto27b01082016-08-10 02:21:03 +0000156 asoc_simple_card_canonicalize_cpu(dai_link, is_single_links);
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +0000157 } else {
Kuninori Morimoto04700022015-06-15 06:24:15 +0000158 /* FE is dummy */
159 dai_link->cpu_of_node = NULL;
160 dai_link->cpu_dai_name = "snd-soc-dummy-dai";
161 dai_link->cpu_name = "snd-soc-dummy";
162
163 /* BE settings */
164 dai_link->no_pcm = 1;
Kuninori Morimoto53e682b2016-08-23 01:34:17 +0000165 dai_link->be_hw_params_fixup = asoc_simple_card_be_hw_params_fixup;
Kuninori Morimoto5bbf38662016-08-08 06:02:31 +0000166
167 ret = asoc_simple_card_parse_codec(np, dai_link, DAI, CELL);
Kuninori Morimoto575f1f92015-12-01 08:33:23 +0000168 if (ret < 0)
169 return ret;
Kuninori Morimoto04700022015-06-15 06:24:15 +0000170
Kuninori Morimotoc9a235d2016-07-19 02:53:32 +0000171 ret = asoc_simple_card_parse_clk_codec(np, dai_link, dai_props);
172 if (ret < 0)
173 return ret;
174
Kuninori Morimoto8a99a6b2016-07-11 23:58:25 +0000175 ret = asoc_simple_card_set_dailink_name(dev, dai_link,
176 "be.%s",
177 dai_link->codec_dai_name);
178 if (ret < 0)
179 return ret;
180
Kuninori Morimoto64df0e62016-08-23 01:34:43 +0000181 snd_soc_of_parse_audio_prefix(&priv->snd_card,
182 &priv->codec_conf,
183 dai_link->codec_of_node,
184 PREFIX "prefix");
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +0000185 }
186
Kuninori Morimotoa09f3832016-08-09 05:50:19 +0000187 ret = asoc_simple_card_canonicalize_dailink(dai_link);
188 if (ret < 0)
189 return ret;
190
Kuninori Morimoto04700022015-06-15 06:24:15 +0000191 dai_link->dpcm_playback = 1;
192 dai_link->dpcm_capture = 1;
Kuninori Morimoto53e682b2016-08-23 01:34:17 +0000193 dai_link->ops = &asoc_simple_card_ops;
194 dai_link->init = asoc_simple_card_dai_init;
Kuninori Morimoto04700022015-06-15 06:24:15 +0000195
Kuninori Morimoto04700022015-06-15 06:24:15 +0000196 dev_dbg(dev, "\t%s / %04x / %d\n",
Kuninori Morimoto8a99a6b2016-07-11 23:58:25 +0000197 dai_link->name,
Kuninori Morimotoae638b72015-12-17 02:48:58 +0000198 dai_link->dai_fmt,
Kuninori Morimoto04700022015-06-15 06:24:15 +0000199 dai_props->sysclk);
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +0000200
Kuninori Morimotoc9a235d2016-07-19 02:53:32 +0000201 return 0;
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +0000202}
203
Kuninori Morimoto53e682b2016-08-23 01:34:17 +0000204static int asoc_simple_card_dai_link_of(struct device_node *node,
205 struct asoc_simple_card_priv *priv)
Kuninori Morimotoaf998f82015-12-17 02:49:43 +0000206{
Kuninori Morimoto53e682b2016-08-23 01:34:17 +0000207 struct device *dev = simple_priv_to_dev(priv);
Kuninori Morimotoaf998f82015-12-17 02:49:43 +0000208 struct snd_soc_dai_link *dai_link;
209 struct device_node *np;
210 unsigned int daifmt = 0;
211 int ret, i;
212 bool is_fe;
213
214 /* find 1st codec */
215 i = 0;
216 for_each_child_of_node(node, np) {
Kuninori Morimoto53e682b2016-08-23 01:34:17 +0000217 dai_link = simple_priv_to_link(priv, i);
Kuninori Morimotoaf998f82015-12-17 02:49:43 +0000218
Kuninori Morimoto64df0e62016-08-23 01:34:43 +0000219 if (strcmp(np->name, PREFIX "codec") == 0) {
Kuninori Morimotod6a4a9a42016-06-30 06:03:13 +0000220 ret = asoc_simple_card_parse_daifmt(dev, node, np,
Kuninori Morimoto64df0e62016-08-23 01:34:43 +0000221 PREFIX, &daifmt);
Kuninori Morimotoaf998f82015-12-17 02:49:43 +0000222 if (ret < 0)
223 return ret;
224 break;
225 }
226 i++;
227 }
228
229 i = 0;
230 for_each_child_of_node(node, np) {
Kuninori Morimoto53e682b2016-08-23 01:34:17 +0000231 dai_link = simple_priv_to_link(priv, i);
Kuninori Morimotoaf998f82015-12-17 02:49:43 +0000232 dai_link->dai_fmt = daifmt;
233
234 is_fe = false;
Kuninori Morimoto64df0e62016-08-23 01:34:43 +0000235 if (strcmp(np->name, PREFIX "cpu") == 0)
Kuninori Morimotoaf998f82015-12-17 02:49:43 +0000236 is_fe = true;
237
Kuninori Morimoto53e682b2016-08-23 01:34:17 +0000238 ret = asoc_simple_card_parse_links(np, priv, i, is_fe);
Kuninori Morimotoaf998f82015-12-17 02:49:43 +0000239 if (ret < 0)
240 return ret;
241 i++;
242 }
243
244 return 0;
245}
246
Kuninori Morimoto53e682b2016-08-23 01:34:17 +0000247static int asoc_simple_card_parse_of(struct device_node *node,
248 struct asoc_simple_card_priv *priv,
Kuninori Morimoto3c7e64d2015-06-15 06:22:05 +0000249 struct device *dev)
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +0000250{
Kuninori Morimoto303c3be2016-07-11 23:58:50 +0000251 struct asoc_simple_dai *props;
Kuninori Morimoto3433bf02015-06-15 06:22:30 +0000252 struct snd_soc_dai_link *links;
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +0000253 int ret;
Kuninori Morimotoaf998f82015-12-17 02:49:43 +0000254 int num;
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +0000255
256 if (!node)
257 return -EINVAL;
258
Kuninori Morimoto3433bf02015-06-15 06:22:30 +0000259 num = of_get_child_count(node);
260 props = devm_kzalloc(dev, sizeof(*props) * num, GFP_KERNEL);
261 links = devm_kzalloc(dev, sizeof(*links) * num, GFP_KERNEL);
262 if (!props || !links)
263 return -ENOMEM;
264
265 priv->dai_props = props;
266 priv->dai_link = links;
Kuninori Morimoto3433bf02015-06-15 06:22:30 +0000267
Kuninori Morimoto3c7e64d2015-06-15 06:22:05 +0000268 /* Init snd_soc_card */
269 priv->snd_card.owner = THIS_MODULE;
270 priv->snd_card.dev = dev;
271 priv->snd_card.dai_link = priv->dai_link;
Kuninori Morimoto3433bf02015-06-15 06:22:30 +0000272 priv->snd_card.num_links = num;
Kuninori Morimoto3c7e64d2015-06-15 06:22:05 +0000273 priv->snd_card.codec_conf = &priv->codec_conf;
274 priv->snd_card.num_configs = 1;
Kuninori Morimotob7419dd2015-07-15 07:08:05 +0000275
Kuninori Morimoto64df0e62016-08-23 01:34:43 +0000276 ret = snd_soc_of_parse_audio_routing(&priv->snd_card, PREFIX "routing");
277 if (ret < 0)
278 return ret;
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +0000279
Kuninori Morimotoaf7e2be2015-03-26 04:01:46 +0000280 /* sampling rate convert */
Kuninori Morimoto64df0e62016-08-23 01:34:43 +0000281 of_property_read_u32(node, PREFIX "convert-rate", &priv->convert_rate);
Kuninori Morimotoaf7e2be2015-03-26 04:01:46 +0000282
Kuninori Morimotof90432f2016-02-25 05:51:44 +0000283 /* channels transfer */
Kuninori Morimoto64df0e62016-08-23 01:34:43 +0000284 of_property_read_u32(node, PREFIX "convert-channels", &priv->convert_channels);
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +0000285
Kuninori Morimoto53e682b2016-08-23 01:34:17 +0000286 ret = asoc_simple_card_dai_link_of(node, priv);
Kuninori Morimotoaf998f82015-12-17 02:49:43 +0000287 if (ret < 0)
288 return ret;
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +0000289
Kuninori Morimoto64df0e62016-08-23 01:34:43 +0000290 ret = asoc_simple_card_parse_card_name(&priv->snd_card, PREFIX);
Kuninori Morimoto53ae9182016-07-12 00:00:00 +0000291 if (ret < 0)
292 return ret;
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +0000293
Kuninori Morimoto64df0e62016-08-23 01:34:43 +0000294 dev_dbg(dev, "New card: %s\n",
295 priv->snd_card.name ? priv->snd_card.name : "");
296 dev_dbg(dev, "convert_rate %d\n", priv->convert_rate);
297 dev_dbg(dev, "convert_channels %d\n", priv->convert_channels);
298
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +0000299 return 0;
300}
301
Kuninori Morimoto53e682b2016-08-23 01:34:17 +0000302static int asoc_simple_card_probe(struct platform_device *pdev)
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +0000303{
Kuninori Morimoto53e682b2016-08-23 01:34:17 +0000304 struct asoc_simple_card_priv *priv;
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +0000305 struct device_node *np = pdev->dev.of_node;
306 struct device *dev = &pdev->dev;
307 int ret;
308
309 /* Allocate the private data */
310 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
311 if (!priv)
312 return -ENOMEM;
313
Kuninori Morimoto53e682b2016-08-23 01:34:17 +0000314 ret = asoc_simple_card_parse_of(np, priv, dev);
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +0000315 if (ret < 0) {
316 if (ret != -EPROBE_DEFER)
317 dev_err(dev, "parse error %d\n", ret);
318 goto err;
319 }
320
321 snd_soc_card_set_drvdata(&priv->snd_card, priv);
322
323 ret = devm_snd_soc_register_card(&pdev->dev, &priv->snd_card);
324 if (ret >= 0)
325 return ret;
326err:
Kuninori Morimoto239486b2016-08-10 02:22:01 +0000327 asoc_simple_card_clean_reference(&priv->snd_card);
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +0000328
329 return ret;
330}
331
Kuninori Morimoto53e682b2016-08-23 01:34:17 +0000332static int asoc_simple_card_remove(struct platform_device *pdev)
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +0000333{
334 struct snd_soc_card *card = platform_get_drvdata(pdev);
335
Kuninori Morimoto239486b2016-08-10 02:22:01 +0000336 return asoc_simple_card_clean_reference(card);
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +0000337}
338
Kuninori Morimoto53e682b2016-08-23 01:34:17 +0000339static struct platform_driver asoc_simple_card = {
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +0000340 .driver = {
Kuninori Morimoto64df0e62016-08-23 01:34:43 +0000341 .name = "simple-scu-audio-card",
Kuninori Morimoto53e682b2016-08-23 01:34:17 +0000342 .of_match_table = asoc_simple_card_of_match,
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +0000343 },
Kuninori Morimoto53e682b2016-08-23 01:34:17 +0000344 .probe = asoc_simple_card_probe,
345 .remove = asoc_simple_card_remove,
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +0000346};
347
Kuninori Morimoto53e682b2016-08-23 01:34:17 +0000348module_platform_driver(asoc_simple_card);
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +0000349
Kuninori Morimoto53e682b2016-08-23 01:34:17 +0000350MODULE_ALIAS("platform:asoc-simple-scu-card");
Kuninori Morimoto93bc0472016-08-25 01:56:38 +0000351MODULE_LICENSE("GPL v2");
Kuninori Morimoto53e682b2016-08-23 01:34:17 +0000352MODULE_DESCRIPTION("ASoC Simple SCU Sound Card");
Kuninori Morimoto415f1cb2015-03-26 04:01:27 +0000353MODULE_AUTHOR("Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>");