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

ASoC: simple-scu-card: remove simple-scu-card

It is already merged into simple-card.
simple-scu-card is no longer needed.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Kuninori Morimoto and committed by
Mark Brown
c8ed6aca bb93487b

-484
-8
sound/soc/generic/Kconfig
··· 8 8 This option enables generic simple sound card support 9 9 It also support DPCM of multi CPU single Codec ststem. 10 10 11 - config SND_SIMPLE_SCU_CARD 12 - tristate "ASoC Simple SCU sound card support" 13 - depends on OF 14 - select SND_SIMPLE_CARD_UTILS 15 - help 16 - This option enables generic simple SCU sound card support. 17 - It supports DPCM of multi CPU single Codec system. 18 - 19 11 config SND_AUDIO_GRAPH_CARD 20 12 tristate "ASoC Audio Graph sound card support" 21 13 depends on OF
-2
sound/soc/generic/Makefile
··· 1 1 # SPDX-License-Identifier: GPL-2.0 2 2 snd-soc-simple-card-utils-objs := simple-card-utils.o 3 3 snd-soc-simple-card-objs := simple-card.o 4 - snd-soc-simple-scu-card-objs := simple-scu-card.o 5 4 snd-soc-audio-graph-card-objs := audio-graph-card.o 6 5 7 6 obj-$(CONFIG_SND_SIMPLE_CARD_UTILS) += snd-soc-simple-card-utils.o 8 7 obj-$(CONFIG_SND_SIMPLE_CARD) += snd-soc-simple-card.o 9 - obj-$(CONFIG_SND_SIMPLE_SCU_CARD) += snd-soc-simple-scu-card.o 10 8 obj-$(CONFIG_SND_AUDIO_GRAPH_CARD) += snd-soc-audio-graph-card.o
-474
sound/soc/generic/simple-scu-card.c
··· 1 - // SPDX-License-Identifier: GPL-2.0 2 - // 3 - // ASoC simple SCU sound card support 4 - // 5 - // Copyright (C) 2015 Renesas Solutions Corp. 6 - // Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> 7 - // 8 - // based on ${LINUX}/sound/soc/generic/simple-card.c 9 - 10 - #include <linux/clk.h> 11 - #include <linux/device.h> 12 - #include <linux/module.h> 13 - #include <linux/of.h> 14 - #include <linux/of_device.h> 15 - #include <linux/platform_device.h> 16 - #include <linux/string.h> 17 - #include <sound/jack.h> 18 - #include <sound/soc.h> 19 - #include <sound/soc-dai.h> 20 - #include <sound/simple_card_utils.h> 21 - 22 - struct simple_card_data { 23 - struct snd_soc_card snd_card; 24 - struct simple_dai_props { 25 - struct asoc_simple_dai *cpu_dai; 26 - struct asoc_simple_dai *codec_dai; 27 - struct snd_soc_dai_link_component codecs; 28 - struct snd_soc_dai_link_component platform; 29 - struct asoc_simple_card_data adata; 30 - struct snd_soc_codec_conf *codec_conf; 31 - } *dai_props; 32 - struct snd_soc_dai_link *dai_link; 33 - struct asoc_simple_dai *dais; 34 - struct asoc_simple_card_data adata; 35 - struct snd_soc_codec_conf *codec_conf; 36 - }; 37 - 38 - #define simple_priv_to_card(priv) (&(priv)->snd_card) 39 - #define simple_priv_to_props(priv, i) ((priv)->dai_props + (i)) 40 - #define simple_priv_to_dev(priv) (simple_priv_to_card(priv)->dev) 41 - #define simple_priv_to_link(priv, i) (simple_priv_to_card(priv)->dai_link + (i)) 42 - 43 - #define DAI "sound-dai" 44 - #define CELL "#sound-dai-cells" 45 - #define PREFIX "simple-audio-card," 46 - 47 - static int asoc_simple_card_startup(struct snd_pcm_substream *substream) 48 - { 49 - struct snd_soc_pcm_runtime *rtd = substream->private_data; 50 - struct simple_card_data *priv = snd_soc_card_get_drvdata(rtd->card); 51 - struct simple_dai_props *dai_props = 52 - simple_priv_to_props(priv, rtd->num); 53 - int ret; 54 - 55 - ret = asoc_simple_card_clk_enable(dai_props->cpu_dai); 56 - if (ret) 57 - return ret; 58 - 59 - ret = asoc_simple_card_clk_enable(dai_props->codec_dai); 60 - if (ret) 61 - asoc_simple_card_clk_disable(dai_props->cpu_dai); 62 - 63 - return ret; 64 - } 65 - 66 - static void asoc_simple_card_shutdown(struct snd_pcm_substream *substream) 67 - { 68 - struct snd_soc_pcm_runtime *rtd = substream->private_data; 69 - struct simple_card_data *priv = snd_soc_card_get_drvdata(rtd->card); 70 - struct simple_dai_props *dai_props = 71 - simple_priv_to_props(priv, rtd->num); 72 - 73 - asoc_simple_card_clk_disable(dai_props->cpu_dai); 74 - 75 - asoc_simple_card_clk_disable(dai_props->codec_dai); 76 - } 77 - 78 - static const struct snd_soc_ops asoc_simple_card_ops = { 79 - .startup = asoc_simple_card_startup, 80 - .shutdown = asoc_simple_card_shutdown, 81 - }; 82 - 83 - static int asoc_simple_card_dai_init(struct snd_soc_pcm_runtime *rtd) 84 - { 85 - struct simple_card_data *priv = snd_soc_card_get_drvdata(rtd->card); 86 - struct simple_dai_props *dai_props = simple_priv_to_props(priv, rtd->num); 87 - int ret; 88 - 89 - ret = asoc_simple_card_init_dai(rtd->codec_dai, 90 - dai_props->codec_dai); 91 - if (ret < 0) 92 - return ret; 93 - 94 - ret = asoc_simple_card_init_dai(rtd->cpu_dai, 95 - dai_props->cpu_dai); 96 - if (ret < 0) 97 - return ret; 98 - 99 - return 0; 100 - } 101 - 102 - static int asoc_simple_card_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, 103 - struct snd_pcm_hw_params *params) 104 - { 105 - struct simple_card_data *priv = snd_soc_card_get_drvdata(rtd->card); 106 - struct simple_dai_props *dai_props = simple_priv_to_props(priv, rtd->num); 107 - 108 - asoc_simple_card_convert_fixup(&dai_props->adata, params); 109 - 110 - /* overwrite by top level adata if exist */ 111 - asoc_simple_card_convert_fixup(&priv->adata, params); 112 - 113 - return 0; 114 - } 115 - 116 - static int asoc_simple_card_dai_link_of(struct device_node *link, 117 - struct device_node *np, 118 - struct device_node *codec, 119 - struct simple_card_data *priv, 120 - int *dai_idx, int link_idx, 121 - int *conf_idx, int is_fe, 122 - bool is_top_level_node) 123 - { 124 - struct device *dev = simple_priv_to_dev(priv); 125 - struct snd_soc_dai_link *dai_link = simple_priv_to_link(priv, link_idx); 126 - struct simple_dai_props *dai_props = simple_priv_to_props(priv, link_idx); 127 - struct snd_soc_card *card = simple_priv_to_card(priv); 128 - struct asoc_simple_dai *dai; 129 - char *prefix = ""; 130 - int ret; 131 - 132 - /* For single DAI link & old style of DT node */ 133 - if (is_top_level_node) 134 - prefix = PREFIX; 135 - 136 - if (is_fe) { 137 - int is_single_links = 0; 138 - struct snd_soc_dai_link_component *codecs; 139 - 140 - /* BE is dummy */ 141 - codecs = dai_link->codecs; 142 - codecs->of_node = NULL; 143 - codecs->dai_name = "snd-soc-dummy-dai"; 144 - codecs->name = "snd-soc-dummy"; 145 - 146 - /* FE settings */ 147 - dai_link->dynamic = 1; 148 - dai_link->dpcm_merged_format = 1; 149 - 150 - dai = 151 - dai_props->cpu_dai = &priv->dais[(*dai_idx)++]; 152 - 153 - ret = asoc_simple_card_parse_cpu(np, dai_link, DAI, CELL, 154 - &is_single_links); 155 - if (ret) 156 - return ret; 157 - 158 - ret = asoc_simple_card_parse_clk_cpu(dev, np, dai_link, dai); 159 - if (ret < 0) 160 - return ret; 161 - 162 - ret = asoc_simple_card_set_dailink_name(dev, dai_link, 163 - "fe.%s", 164 - dai_link->cpu_dai_name); 165 - if (ret < 0) 166 - return ret; 167 - 168 - asoc_simple_card_canonicalize_cpu(dai_link, is_single_links); 169 - } else { 170 - struct snd_soc_codec_conf *cconf; 171 - 172 - /* FE is dummy */ 173 - dai_link->cpu_of_node = NULL; 174 - dai_link->cpu_dai_name = "snd-soc-dummy-dai"; 175 - dai_link->cpu_name = "snd-soc-dummy"; 176 - 177 - /* BE settings */ 178 - dai_link->no_pcm = 1; 179 - dai_link->be_hw_params_fixup = asoc_simple_card_be_hw_params_fixup; 180 - 181 - dai = 182 - dai_props->codec_dai = &priv->dais[(*dai_idx)++]; 183 - 184 - cconf = 185 - dai_props->codec_conf = &priv->codec_conf[(*conf_idx)++]; 186 - 187 - ret = asoc_simple_card_parse_codec(np, dai_link, DAI, CELL); 188 - if (ret < 0) 189 - return ret; 190 - 191 - ret = asoc_simple_card_parse_clk_codec(dev, np, dai_link, dai); 192 - if (ret < 0) 193 - return ret; 194 - 195 - ret = asoc_simple_card_set_dailink_name(dev, dai_link, 196 - "be.%s", 197 - dai_link->codecs->dai_name); 198 - if (ret < 0) 199 - return ret; 200 - 201 - /* check "prefix" from top node */ 202 - snd_soc_of_parse_audio_prefix(card, cconf, 203 - dai_link->codecs->of_node, 204 - PREFIX "prefix"); 205 - /* check "prefix" from each node if top doesn't have */ 206 - if (!cconf->of_node) 207 - snd_soc_of_parse_node_prefix(np, cconf, 208 - dai_link->codecs->of_node, 209 - "prefix"); 210 - } 211 - 212 - asoc_simple_card_parse_convert(dev, link, prefix, &dai_props->adata); 213 - 214 - ret = asoc_simple_card_of_parse_tdm(np, dai); 215 - if (ret) 216 - return ret; 217 - 218 - ret = asoc_simple_card_canonicalize_dailink(dai_link); 219 - if (ret < 0) 220 - return ret; 221 - 222 - ret = asoc_simple_card_parse_daifmt(dev, link, codec, 223 - prefix, &dai_link->dai_fmt); 224 - if (ret < 0) 225 - return ret; 226 - 227 - dai_link->dpcm_playback = 1; 228 - dai_link->dpcm_capture = 1; 229 - dai_link->ops = &asoc_simple_card_ops; 230 - dai_link->init = asoc_simple_card_dai_init; 231 - 232 - return 0; 233 - } 234 - 235 - static int asoc_simple_card_parse_of(struct simple_card_data *priv) 236 - 237 - { 238 - struct device *dev = simple_priv_to_dev(priv); 239 - struct device_node *top = dev->of_node; 240 - struct device_node *node; 241 - struct device_node *np; 242 - struct device_node *codec; 243 - struct snd_soc_card *card = simple_priv_to_card(priv); 244 - bool is_fe; 245 - int ret, loop; 246 - int dai_idx, link_idx, conf_idx; 247 - 248 - if (!top) 249 - return -EINVAL; 250 - 251 - ret = asoc_simple_card_of_parse_widgets(card, PREFIX); 252 - if (ret < 0) 253 - return ret; 254 - 255 - ret = asoc_simple_card_of_parse_routing(card, PREFIX); 256 - if (ret < 0) 257 - return ret; 258 - 259 - asoc_simple_card_parse_convert(dev, top, PREFIX, &priv->adata); 260 - 261 - loop = 1; 262 - link_idx = 0; 263 - dai_idx = 0; 264 - conf_idx = 0; 265 - node = of_get_child_by_name(top, PREFIX "dai-link"); 266 - if (!node) { 267 - node = dev->of_node; 268 - loop = 0; 269 - } 270 - 271 - do { 272 - codec = of_get_child_by_name(node, 273 - loop ? "codec" : PREFIX "codec"); 274 - if (!codec) 275 - return -ENODEV; 276 - 277 - for_each_child_of_node(node, np) { 278 - is_fe = (np != codec); 279 - 280 - ret = asoc_simple_card_dai_link_of(node, np, codec, priv, 281 - &dai_idx, link_idx++, 282 - &conf_idx, 283 - is_fe, !loop); 284 - if (ret < 0) 285 - return ret; 286 - } 287 - node = of_get_next_child(top, node); 288 - } while (loop && node); 289 - 290 - ret = asoc_simple_card_parse_card_name(card, PREFIX); 291 - if (ret < 0) 292 - return ret; 293 - 294 - return 0; 295 - } 296 - 297 - static void asoc_simple_card_get_dais_count(struct device *dev, 298 - int *link_num, 299 - int *dais_num, 300 - int *ccnf_num) 301 - { 302 - struct device_node *top = dev->of_node; 303 - struct device_node *node; 304 - int loop; 305 - int num; 306 - 307 - /* 308 - * link_num : number of links. 309 - * CPU-Codec / CPU-dummy / dummy-Codec 310 - * dais_num : number of DAIs 311 - * ccnf_num : number of codec_conf 312 - * same number for "dummy-Codec" 313 - * 314 - * ex1) 315 - * CPU0 --- Codec0 link : 5 316 - * CPU1 --- Codec1 dais : 7 317 - * CPU2 -/ ccnf : 1 318 - * CPU3 --- Codec2 319 - * 320 - * => 5 links = 2xCPU-Codec + 2xCPU-dummy + 1xdummy-Codec 321 - * => 7 DAIs = 4xCPU + 3xCodec 322 - * => 1 ccnf = 1xdummy-Codec 323 - * 324 - * ex2) 325 - * CPU0 --- Codec0 link : 5 326 - * CPU1 --- Codec1 dais : 6 327 - * CPU2 -/ ccnf : 1 328 - * CPU3 -/ 329 - * 330 - * => 5 links = 1xCPU-Codec + 3xCPU-dummy + 1xdummy-Codec 331 - * => 6 DAIs = 4xCPU + 2xCodec 332 - * => 1 ccnf = 1xdummy-Codec 333 - * 334 - * ex3) 335 - * CPU0 --- Codec0 link : 6 336 - * CPU1 -/ dais : 6 337 - * CPU2 --- Codec1 ccnf : 2 338 - * CPU3 -/ 339 - * 340 - * => 6 links = 0xCPU-Codec + 4xCPU-dummy + 2xdummy-Codec 341 - * => 6 DAIs = 4xCPU + 2xCodec 342 - * => 2 ccnf = 2xdummy-Codec 343 - */ 344 - if (!top) { 345 - (*link_num) = 1; 346 - (*dais_num) = 2; 347 - (*ccnf_num) = 0; 348 - return; 349 - } 350 - 351 - loop = 1; 352 - node = of_get_child_by_name(top, PREFIX "dai-link"); 353 - if (!node) { 354 - node = top; 355 - loop = 0; 356 - } 357 - 358 - do { 359 - num = of_get_child_count(node); 360 - (*dais_num) += num; 361 - if (num > 2) { 362 - (*link_num) += num; 363 - (*ccnf_num)++; 364 - } else { 365 - (*link_num)++; 366 - } 367 - node = of_get_next_child(top, node); 368 - } while (loop && node); 369 - } 370 - 371 - static int asoc_simple_card_probe(struct platform_device *pdev) 372 - { 373 - struct simple_card_data *priv; 374 - struct snd_soc_dai_link *dai_link; 375 - struct simple_dai_props *dai_props; 376 - struct asoc_simple_dai *dais; 377 - struct snd_soc_card *card; 378 - struct snd_soc_codec_conf *cconf; 379 - struct device *dev = &pdev->dev; 380 - int ret, i; 381 - int lnum = 0, dnum = 0, cnum = 0; 382 - 383 - /* Allocate the private data */ 384 - priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); 385 - if (!priv) 386 - return -ENOMEM; 387 - 388 - asoc_simple_card_get_dais_count(dev, &lnum, &dnum, &cnum); 389 - if (!lnum || !dnum) 390 - return -EINVAL; 391 - 392 - dai_props = devm_kcalloc(dev, lnum, sizeof(*dai_props), GFP_KERNEL); 393 - dai_link = devm_kcalloc(dev, lnum, sizeof(*dai_link), GFP_KERNEL); 394 - dais = devm_kcalloc(dev, dnum, sizeof(*dais), GFP_KERNEL); 395 - cconf = devm_kcalloc(dev, cnum, sizeof(*cconf), GFP_KERNEL); 396 - if (!dai_props || !dai_link || !dais) 397 - return -ENOMEM; 398 - 399 - /* 400 - * Use snd_soc_dai_link_component instead of legacy style 401 - * It is codec only. but cpu/platform will be supported in the future. 402 - * see 403 - * soc-core.c :: snd_soc_init_multicodec() 404 - */ 405 - for (i = 0; i < lnum; i++) { 406 - dai_link[i].codecs = &dai_props[i].codecs; 407 - dai_link[i].num_codecs = 1; 408 - dai_link[i].platform = &dai_props[i].platform; 409 - } 410 - 411 - priv->dai_props = dai_props; 412 - priv->dai_link = dai_link; 413 - priv->dais = dais; 414 - priv->codec_conf = cconf; 415 - 416 - /* Init snd_soc_card */ 417 - card = simple_priv_to_card(priv); 418 - card->owner = THIS_MODULE; 419 - card->dev = dev; 420 - card->dai_link = priv->dai_link; 421 - card->num_links = lnum; 422 - card->codec_conf = cconf; 423 - card->num_configs = cnum; 424 - 425 - ret = asoc_simple_card_parse_of(priv); 426 - if (ret < 0) { 427 - if (ret != -EPROBE_DEFER) 428 - dev_err(dev, "parse error %d\n", ret); 429 - goto err; 430 - } 431 - 432 - snd_soc_card_set_drvdata(card, priv); 433 - 434 - ret = devm_snd_soc_register_card(dev, card); 435 - if (ret < 0) 436 - goto err; 437 - 438 - return 0; 439 - err: 440 - asoc_simple_card_clean_reference(card); 441 - 442 - return ret; 443 - } 444 - 445 - static int asoc_simple_card_remove(struct platform_device *pdev) 446 - { 447 - struct snd_soc_card *card = platform_get_drvdata(pdev); 448 - 449 - return asoc_simple_card_clean_reference(card); 450 - } 451 - 452 - static const struct of_device_id asoc_simple_of_match[] = { 453 - { .compatible = "renesas,rsrc-card", }, 454 - { .compatible = "simple-scu-audio-card", }, 455 - {}, 456 - }; 457 - MODULE_DEVICE_TABLE(of, asoc_simple_of_match); 458 - 459 - static struct platform_driver asoc_simple_card = { 460 - .driver = { 461 - .name = "simple-scu-audio-card", 462 - .pm = &snd_soc_pm_ops, 463 - .of_match_table = asoc_simple_of_match, 464 - }, 465 - .probe = asoc_simple_card_probe, 466 - .remove = asoc_simple_card_remove, 467 - }; 468 - 469 - module_platform_driver(asoc_simple_card); 470 - 471 - MODULE_ALIAS("platform:asoc-simple-scu-card"); 472 - MODULE_LICENSE("GPL v2"); 473 - MODULE_DESCRIPTION("ASoC Simple SCU Sound Card"); 474 - MODULE_AUTHOR("Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>");