soc-topology.c (73187B)
1// SPDX-License-Identifier: GPL-2.0+ 2// 3// soc-topology.c -- ALSA SoC Topology 4// 5// Copyright (C) 2012 Texas Instruments Inc. 6// Copyright (C) 2015 Intel Corporation. 7// 8// Authors: Liam Girdwood <liam.r.girdwood@linux.intel.com> 9// K, Mythri P <mythri.p.k@intel.com> 10// Prusty, Subhransu S <subhransu.s.prusty@intel.com> 11// B, Jayachandran <jayachandran.b@intel.com> 12// Abdullah, Omair M <omair.m.abdullah@intel.com> 13// Jin, Yao <yao.jin@intel.com> 14// Lin, Mengdong <mengdong.lin@intel.com> 15// 16// Add support to read audio firmware topology alongside firmware text. The 17// topology data can contain kcontrols, DAPM graphs, widgets, DAIs, DAI links, 18// equalizers, firmware, coefficients etc. 19// 20// This file only manages the core ALSA and ASoC components, all other bespoke 21// firmware topology data is passed to component drivers for bespoke handling. 22 23#include <linux/kernel.h> 24#include <linux/export.h> 25#include <linux/list.h> 26#include <linux/firmware.h> 27#include <linux/slab.h> 28#include <sound/soc.h> 29#include <sound/soc-dapm.h> 30#include <sound/soc-topology.h> 31#include <sound/tlv.h> 32 33#define SOC_TPLG_MAGIC_BIG_ENDIAN 0x436F5341 /* ASoC in reverse */ 34 35/* 36 * We make several passes over the data (since it wont necessarily be ordered) 37 * and process objects in the following order. This guarantees the component 38 * drivers will be ready with any vendor data before the mixers and DAPM objects 39 * are loaded (that may make use of the vendor data). 40 */ 41#define SOC_TPLG_PASS_MANIFEST 0 42#define SOC_TPLG_PASS_VENDOR 1 43#define SOC_TPLG_PASS_CONTROL 2 44#define SOC_TPLG_PASS_WIDGET 3 45#define SOC_TPLG_PASS_PCM_DAI 4 46#define SOC_TPLG_PASS_GRAPH 5 47#define SOC_TPLG_PASS_PINS 6 48#define SOC_TPLG_PASS_BE_DAI 7 49#define SOC_TPLG_PASS_LINK 8 50 51#define SOC_TPLG_PASS_START SOC_TPLG_PASS_MANIFEST 52#define SOC_TPLG_PASS_END SOC_TPLG_PASS_LINK 53 54/* topology context */ 55struct soc_tplg { 56 const struct firmware *fw; 57 58 /* runtime FW parsing */ 59 const u8 *pos; /* read position */ 60 const u8 *hdr_pos; /* header position */ 61 unsigned int pass; /* pass number */ 62 63 /* component caller */ 64 struct device *dev; 65 struct snd_soc_component *comp; 66 u32 index; /* current block index */ 67 68 /* vendor specific kcontrol operations */ 69 const struct snd_soc_tplg_kcontrol_ops *io_ops; 70 int io_ops_count; 71 72 /* vendor specific bytes ext handlers, for TLV bytes controls */ 73 const struct snd_soc_tplg_bytes_ext_ops *bytes_ext_ops; 74 int bytes_ext_ops_count; 75 76 /* optional fw loading callbacks to component drivers */ 77 struct snd_soc_tplg_ops *ops; 78}; 79 80static int soc_tplg_process_headers(struct soc_tplg *tplg); 81static int soc_tplg_complete(struct soc_tplg *tplg); 82 83/* check we dont overflow the data for this control chunk */ 84static int soc_tplg_check_elem_count(struct soc_tplg *tplg, size_t elem_size, 85 unsigned int count, size_t bytes, const char *elem_type) 86{ 87 const u8 *end = tplg->pos + elem_size * count; 88 89 if (end > tplg->fw->data + tplg->fw->size) { 90 dev_err(tplg->dev, "ASoC: %s overflow end of data\n", 91 elem_type); 92 return -EINVAL; 93 } 94 95 /* check there is enough room in chunk for control. 96 extra bytes at the end of control are for vendor data here */ 97 if (elem_size * count > bytes) { 98 dev_err(tplg->dev, 99 "ASoC: %s count %d of size %zu is bigger than chunk %zu\n", 100 elem_type, count, elem_size, bytes); 101 return -EINVAL; 102 } 103 104 return 0; 105} 106 107static inline bool soc_tplg_is_eof(struct soc_tplg *tplg) 108{ 109 const u8 *end = tplg->hdr_pos; 110 111 if (end >= tplg->fw->data + tplg->fw->size) 112 return true; 113 return false; 114} 115 116static inline unsigned long soc_tplg_get_hdr_offset(struct soc_tplg *tplg) 117{ 118 return (unsigned long)(tplg->hdr_pos - tplg->fw->data); 119} 120 121static inline unsigned long soc_tplg_get_offset(struct soc_tplg *tplg) 122{ 123 return (unsigned long)(tplg->pos - tplg->fw->data); 124} 125 126/* mapping of Kcontrol types and associated operations. */ 127static const struct snd_soc_tplg_kcontrol_ops io_ops[] = { 128 {SND_SOC_TPLG_CTL_VOLSW, snd_soc_get_volsw, 129 snd_soc_put_volsw, snd_soc_info_volsw}, 130 {SND_SOC_TPLG_CTL_VOLSW_SX, snd_soc_get_volsw_sx, 131 snd_soc_put_volsw_sx, NULL}, 132 {SND_SOC_TPLG_CTL_ENUM, snd_soc_get_enum_double, 133 snd_soc_put_enum_double, snd_soc_info_enum_double}, 134 {SND_SOC_TPLG_CTL_ENUM_VALUE, snd_soc_get_enum_double, 135 snd_soc_put_enum_double, NULL}, 136 {SND_SOC_TPLG_CTL_BYTES, snd_soc_bytes_get, 137 snd_soc_bytes_put, snd_soc_bytes_info}, 138 {SND_SOC_TPLG_CTL_RANGE, snd_soc_get_volsw_range, 139 snd_soc_put_volsw_range, snd_soc_info_volsw_range}, 140 {SND_SOC_TPLG_CTL_VOLSW_XR_SX, snd_soc_get_xr_sx, 141 snd_soc_put_xr_sx, snd_soc_info_xr_sx}, 142 {SND_SOC_TPLG_CTL_STROBE, snd_soc_get_strobe, 143 snd_soc_put_strobe, NULL}, 144 {SND_SOC_TPLG_DAPM_CTL_VOLSW, snd_soc_dapm_get_volsw, 145 snd_soc_dapm_put_volsw, snd_soc_info_volsw}, 146 {SND_SOC_TPLG_DAPM_CTL_ENUM_DOUBLE, snd_soc_dapm_get_enum_double, 147 snd_soc_dapm_put_enum_double, snd_soc_info_enum_double}, 148 {SND_SOC_TPLG_DAPM_CTL_ENUM_VIRT, snd_soc_dapm_get_enum_double, 149 snd_soc_dapm_put_enum_double, NULL}, 150 {SND_SOC_TPLG_DAPM_CTL_ENUM_VALUE, snd_soc_dapm_get_enum_double, 151 snd_soc_dapm_put_enum_double, NULL}, 152 {SND_SOC_TPLG_DAPM_CTL_PIN, snd_soc_dapm_get_pin_switch, 153 snd_soc_dapm_put_pin_switch, snd_soc_dapm_info_pin_switch}, 154}; 155 156struct soc_tplg_map { 157 int uid; 158 int kid; 159}; 160 161/* mapping of widget types from UAPI IDs to kernel IDs */ 162static const struct soc_tplg_map dapm_map[] = { 163 {SND_SOC_TPLG_DAPM_INPUT, snd_soc_dapm_input}, 164 {SND_SOC_TPLG_DAPM_OUTPUT, snd_soc_dapm_output}, 165 {SND_SOC_TPLG_DAPM_MUX, snd_soc_dapm_mux}, 166 {SND_SOC_TPLG_DAPM_MIXER, snd_soc_dapm_mixer}, 167 {SND_SOC_TPLG_DAPM_PGA, snd_soc_dapm_pga}, 168 {SND_SOC_TPLG_DAPM_OUT_DRV, snd_soc_dapm_out_drv}, 169 {SND_SOC_TPLG_DAPM_ADC, snd_soc_dapm_adc}, 170 {SND_SOC_TPLG_DAPM_DAC, snd_soc_dapm_dac}, 171 {SND_SOC_TPLG_DAPM_SWITCH, snd_soc_dapm_switch}, 172 {SND_SOC_TPLG_DAPM_PRE, snd_soc_dapm_pre}, 173 {SND_SOC_TPLG_DAPM_POST, snd_soc_dapm_post}, 174 {SND_SOC_TPLG_DAPM_AIF_IN, snd_soc_dapm_aif_in}, 175 {SND_SOC_TPLG_DAPM_AIF_OUT, snd_soc_dapm_aif_out}, 176 {SND_SOC_TPLG_DAPM_DAI_IN, snd_soc_dapm_dai_in}, 177 {SND_SOC_TPLG_DAPM_DAI_OUT, snd_soc_dapm_dai_out}, 178 {SND_SOC_TPLG_DAPM_DAI_LINK, snd_soc_dapm_dai_link}, 179 {SND_SOC_TPLG_DAPM_BUFFER, snd_soc_dapm_buffer}, 180 {SND_SOC_TPLG_DAPM_SCHEDULER, snd_soc_dapm_scheduler}, 181 {SND_SOC_TPLG_DAPM_EFFECT, snd_soc_dapm_effect}, 182 {SND_SOC_TPLG_DAPM_SIGGEN, snd_soc_dapm_siggen}, 183 {SND_SOC_TPLG_DAPM_SRC, snd_soc_dapm_src}, 184 {SND_SOC_TPLG_DAPM_ASRC, snd_soc_dapm_asrc}, 185 {SND_SOC_TPLG_DAPM_ENCODER, snd_soc_dapm_encoder}, 186 {SND_SOC_TPLG_DAPM_DECODER, snd_soc_dapm_decoder}, 187}; 188 189static int tplc_chan_get_reg(struct soc_tplg *tplg, 190 struct snd_soc_tplg_channel *chan, int map) 191{ 192 int i; 193 194 for (i = 0; i < SND_SOC_TPLG_MAX_CHAN; i++) { 195 if (le32_to_cpu(chan[i].id) == map) 196 return le32_to_cpu(chan[i].reg); 197 } 198 199 return -EINVAL; 200} 201 202static int tplc_chan_get_shift(struct soc_tplg *tplg, 203 struct snd_soc_tplg_channel *chan, int map) 204{ 205 int i; 206 207 for (i = 0; i < SND_SOC_TPLG_MAX_CHAN; i++) { 208 if (le32_to_cpu(chan[i].id) == map) 209 return le32_to_cpu(chan[i].shift); 210 } 211 212 return -EINVAL; 213} 214 215static int get_widget_id(int tplg_type) 216{ 217 int i; 218 219 for (i = 0; i < ARRAY_SIZE(dapm_map); i++) { 220 if (tplg_type == dapm_map[i].uid) 221 return dapm_map[i].kid; 222 } 223 224 return -EINVAL; 225} 226 227static inline void soc_bind_err(struct soc_tplg *tplg, 228 struct snd_soc_tplg_ctl_hdr *hdr, int index) 229{ 230 dev_err(tplg->dev, 231 "ASoC: invalid control type (g,p,i) %d:%d:%d index %d at 0x%lx\n", 232 hdr->ops.get, hdr->ops.put, hdr->ops.info, index, 233 soc_tplg_get_offset(tplg)); 234} 235 236static inline void soc_control_err(struct soc_tplg *tplg, 237 struct snd_soc_tplg_ctl_hdr *hdr, const char *name) 238{ 239 dev_err(tplg->dev, 240 "ASoC: no complete control IO handler for %s type (g,p,i) %d:%d:%d at 0x%lx\n", 241 name, hdr->ops.get, hdr->ops.put, hdr->ops.info, 242 soc_tplg_get_offset(tplg)); 243} 244 245/* pass vendor data to component driver for processing */ 246static int soc_tplg_vendor_load(struct soc_tplg *tplg, 247 struct snd_soc_tplg_hdr *hdr) 248{ 249 int ret = 0; 250 251 if (tplg->ops && tplg->ops->vendor_load) 252 ret = tplg->ops->vendor_load(tplg->comp, tplg->index, hdr); 253 else { 254 dev_err(tplg->dev, "ASoC: no vendor load callback for ID %d\n", 255 hdr->vendor_type); 256 return -EINVAL; 257 } 258 259 if (ret < 0) 260 dev_err(tplg->dev, 261 "ASoC: vendor load failed at hdr offset %ld/0x%lx for type %d:%d\n", 262 soc_tplg_get_hdr_offset(tplg), 263 soc_tplg_get_hdr_offset(tplg), 264 hdr->type, hdr->vendor_type); 265 return ret; 266} 267 268/* optionally pass new dynamic widget to component driver. This is mainly for 269 * external widgets where we can assign private data/ops */ 270static int soc_tplg_widget_load(struct soc_tplg *tplg, 271 struct snd_soc_dapm_widget *w, struct snd_soc_tplg_dapm_widget *tplg_w) 272{ 273 if (tplg->ops && tplg->ops->widget_load) 274 return tplg->ops->widget_load(tplg->comp, tplg->index, w, 275 tplg_w); 276 277 return 0; 278} 279 280/* optionally pass new dynamic widget to component driver. This is mainly for 281 * external widgets where we can assign private data/ops */ 282static int soc_tplg_widget_ready(struct soc_tplg *tplg, 283 struct snd_soc_dapm_widget *w, struct snd_soc_tplg_dapm_widget *tplg_w) 284{ 285 if (tplg->ops && tplg->ops->widget_ready) 286 return tplg->ops->widget_ready(tplg->comp, tplg->index, w, 287 tplg_w); 288 289 return 0; 290} 291 292/* pass DAI configurations to component driver for extra initialization */ 293static int soc_tplg_dai_load(struct soc_tplg *tplg, 294 struct snd_soc_dai_driver *dai_drv, 295 struct snd_soc_tplg_pcm *pcm, struct snd_soc_dai *dai) 296{ 297 if (tplg->ops && tplg->ops->dai_load) 298 return tplg->ops->dai_load(tplg->comp, tplg->index, dai_drv, 299 pcm, dai); 300 301 return 0; 302} 303 304/* pass link configurations to component driver for extra initialization */ 305static int soc_tplg_dai_link_load(struct soc_tplg *tplg, 306 struct snd_soc_dai_link *link, struct snd_soc_tplg_link_config *cfg) 307{ 308 if (tplg->ops && tplg->ops->link_load) 309 return tplg->ops->link_load(tplg->comp, tplg->index, link, cfg); 310 311 return 0; 312} 313 314/* tell the component driver that all firmware has been loaded in this request */ 315static int soc_tplg_complete(struct soc_tplg *tplg) 316{ 317 if (tplg->ops && tplg->ops->complete) 318 return tplg->ops->complete(tplg->comp); 319 320 return 0; 321} 322 323/* add a dynamic kcontrol */ 324static int soc_tplg_add_dcontrol(struct snd_card *card, struct device *dev, 325 const struct snd_kcontrol_new *control_new, const char *prefix, 326 void *data, struct snd_kcontrol **kcontrol) 327{ 328 int err; 329 330 *kcontrol = snd_soc_cnew(control_new, data, control_new->name, prefix); 331 if (*kcontrol == NULL) { 332 dev_err(dev, "ASoC: Failed to create new kcontrol %s\n", 333 control_new->name); 334 return -ENOMEM; 335 } 336 337 err = snd_ctl_add(card, *kcontrol); 338 if (err < 0) { 339 dev_err(dev, "ASoC: Failed to add %s: %d\n", 340 control_new->name, err); 341 return err; 342 } 343 344 return 0; 345} 346 347/* add a dynamic kcontrol for component driver */ 348static int soc_tplg_add_kcontrol(struct soc_tplg *tplg, 349 struct snd_kcontrol_new *k, struct snd_kcontrol **kcontrol) 350{ 351 struct snd_soc_component *comp = tplg->comp; 352 353 return soc_tplg_add_dcontrol(comp->card->snd_card, 354 tplg->dev, k, comp->name_prefix, comp, kcontrol); 355} 356 357/* remove a mixer kcontrol */ 358static void remove_mixer(struct snd_soc_component *comp, 359 struct snd_soc_dobj *dobj, int pass) 360{ 361 struct snd_card *card = comp->card->snd_card; 362 363 if (pass != SOC_TPLG_PASS_CONTROL) 364 return; 365 366 if (dobj->ops && dobj->ops->control_unload) 367 dobj->ops->control_unload(comp, dobj); 368 369 snd_ctl_remove(card, dobj->control.kcontrol); 370 list_del(&dobj->list); 371} 372 373/* remove an enum kcontrol */ 374static void remove_enum(struct snd_soc_component *comp, 375 struct snd_soc_dobj *dobj, int pass) 376{ 377 struct snd_card *card = comp->card->snd_card; 378 379 if (pass != SOC_TPLG_PASS_CONTROL) 380 return; 381 382 if (dobj->ops && dobj->ops->control_unload) 383 dobj->ops->control_unload(comp, dobj); 384 385 snd_ctl_remove(card, dobj->control.kcontrol); 386 list_del(&dobj->list); 387} 388 389/* remove a byte kcontrol */ 390static void remove_bytes(struct snd_soc_component *comp, 391 struct snd_soc_dobj *dobj, int pass) 392{ 393 struct snd_card *card = comp->card->snd_card; 394 395 if (pass != SOC_TPLG_PASS_CONTROL) 396 return; 397 398 if (dobj->ops && dobj->ops->control_unload) 399 dobj->ops->control_unload(comp, dobj); 400 401 snd_ctl_remove(card, dobj->control.kcontrol); 402 list_del(&dobj->list); 403} 404 405/* remove a route */ 406static void remove_route(struct snd_soc_component *comp, 407 struct snd_soc_dobj *dobj, int pass) 408{ 409 if (pass != SOC_TPLG_PASS_GRAPH) 410 return; 411 412 if (dobj->ops && dobj->ops->dapm_route_unload) 413 dobj->ops->dapm_route_unload(comp, dobj); 414 415 list_del(&dobj->list); 416} 417 418/* remove a widget and it's kcontrols - routes must be removed first */ 419static void remove_widget(struct snd_soc_component *comp, 420 struct snd_soc_dobj *dobj, int pass) 421{ 422 struct snd_card *card = comp->card->snd_card; 423 struct snd_soc_dapm_widget *w = 424 container_of(dobj, struct snd_soc_dapm_widget, dobj); 425 int i; 426 427 if (pass != SOC_TPLG_PASS_WIDGET) 428 return; 429 430 if (dobj->ops && dobj->ops->widget_unload) 431 dobj->ops->widget_unload(comp, dobj); 432 433 if (!w->kcontrols) 434 goto free_news; 435 436 for (i = 0; w->kcontrols && i < w->num_kcontrols; i++) 437 snd_ctl_remove(card, w->kcontrols[i]); 438 439free_news: 440 441 list_del(&dobj->list); 442 443 /* widget w is freed by soc-dapm.c */ 444} 445 446/* remove DAI configurations */ 447static void remove_dai(struct snd_soc_component *comp, 448 struct snd_soc_dobj *dobj, int pass) 449{ 450 struct snd_soc_dai_driver *dai_drv = 451 container_of(dobj, struct snd_soc_dai_driver, dobj); 452 struct snd_soc_dai *dai, *_dai; 453 454 if (pass != SOC_TPLG_PASS_PCM_DAI) 455 return; 456 457 if (dobj->ops && dobj->ops->dai_unload) 458 dobj->ops->dai_unload(comp, dobj); 459 460 for_each_component_dais_safe(comp, dai, _dai) 461 if (dai->driver == dai_drv) 462 snd_soc_unregister_dai(dai); 463 464 list_del(&dobj->list); 465} 466 467/* remove link configurations */ 468static void remove_link(struct snd_soc_component *comp, 469 struct snd_soc_dobj *dobj, int pass) 470{ 471 struct snd_soc_dai_link *link = 472 container_of(dobj, struct snd_soc_dai_link, dobj); 473 474 if (pass != SOC_TPLG_PASS_PCM_DAI) 475 return; 476 477 if (dobj->ops && dobj->ops->link_unload) 478 dobj->ops->link_unload(comp, dobj); 479 480 list_del(&dobj->list); 481 snd_soc_remove_pcm_runtime(comp->card, 482 snd_soc_get_pcm_runtime(comp->card, link)); 483} 484 485/* unload dai link */ 486static void remove_backend_link(struct snd_soc_component *comp, 487 struct snd_soc_dobj *dobj, int pass) 488{ 489 if (pass != SOC_TPLG_PASS_LINK) 490 return; 491 492 if (dobj->ops && dobj->ops->link_unload) 493 dobj->ops->link_unload(comp, dobj); 494 495 /* 496 * We don't free the link here as what remove_link() do since BE 497 * links are not allocated by topology. 498 * We however need to reset the dobj type to its initial values 499 */ 500 dobj->type = SND_SOC_DOBJ_NONE; 501 list_del(&dobj->list); 502} 503 504/* bind a kcontrol to it's IO handlers */ 505static int soc_tplg_kcontrol_bind_io(struct snd_soc_tplg_ctl_hdr *hdr, 506 struct snd_kcontrol_new *k, 507 const struct soc_tplg *tplg) 508{ 509 const struct snd_soc_tplg_kcontrol_ops *ops; 510 const struct snd_soc_tplg_bytes_ext_ops *ext_ops; 511 int num_ops, i; 512 513 if (le32_to_cpu(hdr->ops.info) == SND_SOC_TPLG_CTL_BYTES 514 && k->iface & SNDRV_CTL_ELEM_IFACE_MIXER 515 && (k->access & SNDRV_CTL_ELEM_ACCESS_TLV_READ 516 || k->access & SNDRV_CTL_ELEM_ACCESS_TLV_WRITE) 517 && k->access & SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK) { 518 struct soc_bytes_ext *sbe; 519 struct snd_soc_tplg_bytes_control *be; 520 521 sbe = (struct soc_bytes_ext *)k->private_value; 522 be = container_of(hdr, struct snd_soc_tplg_bytes_control, hdr); 523 524 /* TLV bytes controls need standard kcontrol info handler, 525 * TLV callback and extended put/get handlers. 526 */ 527 k->info = snd_soc_bytes_info_ext; 528 k->tlv.c = snd_soc_bytes_tlv_callback; 529 530 /* 531 * When a topology-based implementation abuses the 532 * control interface and uses bytes_ext controls of 533 * more than 512 bytes, we need to disable the size 534 * checks, otherwise accesses to such controls will 535 * return an -EINVAL error and prevent the card from 536 * being configured. 537 */ 538 if (IS_ENABLED(CONFIG_SND_CTL_VALIDATION) && sbe->max > 512) 539 k->access |= SNDRV_CTL_ELEM_ACCESS_SKIP_CHECK; 540 541 ext_ops = tplg->bytes_ext_ops; 542 num_ops = tplg->bytes_ext_ops_count; 543 for (i = 0; i < num_ops; i++) { 544 if (!sbe->put && 545 ext_ops[i].id == le32_to_cpu(be->ext_ops.put)) 546 sbe->put = ext_ops[i].put; 547 if (!sbe->get && 548 ext_ops[i].id == le32_to_cpu(be->ext_ops.get)) 549 sbe->get = ext_ops[i].get; 550 } 551 552 if ((k->access & SNDRV_CTL_ELEM_ACCESS_TLV_READ) && !sbe->get) 553 return -EINVAL; 554 if ((k->access & SNDRV_CTL_ELEM_ACCESS_TLV_WRITE) && !sbe->put) 555 return -EINVAL; 556 return 0; 557 } 558 559 /* try and map vendor specific kcontrol handlers first */ 560 ops = tplg->io_ops; 561 num_ops = tplg->io_ops_count; 562 for (i = 0; i < num_ops; i++) { 563 564 if (k->put == NULL && ops[i].id == le32_to_cpu(hdr->ops.put)) 565 k->put = ops[i].put; 566 if (k->get == NULL && ops[i].id == le32_to_cpu(hdr->ops.get)) 567 k->get = ops[i].get; 568 if (k->info == NULL && ops[i].id == le32_to_cpu(hdr->ops.info)) 569 k->info = ops[i].info; 570 } 571 572 /* vendor specific handlers found ? */ 573 if (k->put && k->get && k->info) 574 return 0; 575 576 /* none found so try standard kcontrol handlers */ 577 ops = io_ops; 578 num_ops = ARRAY_SIZE(io_ops); 579 for (i = 0; i < num_ops; i++) { 580 581 if (k->put == NULL && ops[i].id == le32_to_cpu(hdr->ops.put)) 582 k->put = ops[i].put; 583 if (k->get == NULL && ops[i].id == le32_to_cpu(hdr->ops.get)) 584 k->get = ops[i].get; 585 if (k->info == NULL && ops[i].id == le32_to_cpu(hdr->ops.info)) 586 k->info = ops[i].info; 587 } 588 589 /* standard handlers found ? */ 590 if (k->put && k->get && k->info) 591 return 0; 592 593 /* nothing to bind */ 594 return -EINVAL; 595} 596 597/* bind a widgets to it's evnt handlers */ 598int snd_soc_tplg_widget_bind_event(struct snd_soc_dapm_widget *w, 599 const struct snd_soc_tplg_widget_events *events, 600 int num_events, u16 event_type) 601{ 602 int i; 603 604 w->event = NULL; 605 606 for (i = 0; i < num_events; i++) { 607 if (event_type == events[i].type) { 608 609 /* found - so assign event */ 610 w->event = events[i].event_handler; 611 return 0; 612 } 613 } 614 615 /* not found */ 616 return -EINVAL; 617} 618EXPORT_SYMBOL_GPL(snd_soc_tplg_widget_bind_event); 619 620/* optionally pass new dynamic kcontrol to component driver. */ 621static int soc_tplg_control_load(struct soc_tplg *tplg, 622 struct snd_kcontrol_new *k, struct snd_soc_tplg_ctl_hdr *hdr) 623{ 624 if (tplg->ops && tplg->ops->control_load) 625 return tplg->ops->control_load(tplg->comp, tplg->index, k, 626 hdr); 627 628 return 0; 629} 630 631 632static int soc_tplg_create_tlv_db_scale(struct soc_tplg *tplg, 633 struct snd_kcontrol_new *kc, struct snd_soc_tplg_tlv_dbscale *scale) 634{ 635 unsigned int item_len = 2 * sizeof(unsigned int); 636 unsigned int *p; 637 638 p = devm_kzalloc(tplg->dev, item_len + 2 * sizeof(unsigned int), GFP_KERNEL); 639 if (!p) 640 return -ENOMEM; 641 642 p[0] = SNDRV_CTL_TLVT_DB_SCALE; 643 p[1] = item_len; 644 p[2] = le32_to_cpu(scale->min); 645 p[3] = (le32_to_cpu(scale->step) & TLV_DB_SCALE_MASK) 646 | (le32_to_cpu(scale->mute) ? TLV_DB_SCALE_MUTE : 0); 647 648 kc->tlv.p = (void *)p; 649 return 0; 650} 651 652static int soc_tplg_create_tlv(struct soc_tplg *tplg, 653 struct snd_kcontrol_new *kc, struct snd_soc_tplg_ctl_hdr *tc) 654{ 655 struct snd_soc_tplg_ctl_tlv *tplg_tlv; 656 u32 access = le32_to_cpu(tc->access); 657 658 if (!(access & SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE)) 659 return 0; 660 661 if (!(access & SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK)) { 662 tplg_tlv = &tc->tlv; 663 switch (le32_to_cpu(tplg_tlv->type)) { 664 case SNDRV_CTL_TLVT_DB_SCALE: 665 return soc_tplg_create_tlv_db_scale(tplg, kc, 666 &tplg_tlv->scale); 667 668 /* TODO: add support for other TLV types */ 669 default: 670 dev_dbg(tplg->dev, "Unsupported TLV type %d\n", 671 tplg_tlv->type); 672 return -EINVAL; 673 } 674 } 675 676 return 0; 677} 678 679static int soc_tplg_dbytes_create(struct soc_tplg *tplg, size_t size) 680{ 681 struct snd_soc_tplg_bytes_control *be; 682 struct soc_bytes_ext *sbe; 683 struct snd_kcontrol_new kc; 684 int ret = 0; 685 686 if (soc_tplg_check_elem_count(tplg, 687 sizeof(struct snd_soc_tplg_bytes_control), 688 1, size, "mixer bytes")) 689 return -EINVAL; 690 691 be = (struct snd_soc_tplg_bytes_control *)tplg->pos; 692 693 /* validate kcontrol */ 694 if (strnlen(be->hdr.name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) == 695 SNDRV_CTL_ELEM_ID_NAME_MAXLEN) 696 return -EINVAL; 697 698 sbe = devm_kzalloc(tplg->dev, sizeof(*sbe), GFP_KERNEL); 699 if (sbe == NULL) 700 return -ENOMEM; 701 702 tplg->pos += (sizeof(struct snd_soc_tplg_bytes_control) + 703 le32_to_cpu(be->priv.size)); 704 705 dev_dbg(tplg->dev, 706 "ASoC: adding bytes kcontrol %s with access 0x%x\n", 707 be->hdr.name, be->hdr.access); 708 709 memset(&kc, 0, sizeof(kc)); 710 kc.name = be->hdr.name; 711 kc.private_value = (long)sbe; 712 kc.iface = SNDRV_CTL_ELEM_IFACE_MIXER; 713 kc.access = le32_to_cpu(be->hdr.access); 714 715 sbe->max = le32_to_cpu(be->max); 716 sbe->dobj.type = SND_SOC_DOBJ_BYTES; 717 sbe->dobj.ops = tplg->ops; 718 INIT_LIST_HEAD(&sbe->dobj.list); 719 720 /* map io handlers */ 721 ret = soc_tplg_kcontrol_bind_io(&be->hdr, &kc, tplg); 722 if (ret) { 723 soc_control_err(tplg, &be->hdr, be->hdr.name); 724 goto err; 725 } 726 727 /* pass control to driver for optional further init */ 728 ret = soc_tplg_control_load(tplg, &kc, (struct snd_soc_tplg_ctl_hdr *)be); 729 if (ret < 0) { 730 dev_err(tplg->dev, "ASoC: failed to init %s\n", be->hdr.name); 731 goto err; 732 } 733 734 /* register control here */ 735 ret = soc_tplg_add_kcontrol(tplg, &kc, &sbe->dobj.control.kcontrol); 736 if (ret < 0) { 737 dev_err(tplg->dev, "ASoC: failed to add %s\n", be->hdr.name); 738 goto err; 739 } 740 741 list_add(&sbe->dobj.list, &tplg->comp->dobj_list); 742 743err: 744 return ret; 745} 746 747static int soc_tplg_dmixer_create(struct soc_tplg *tplg, size_t size) 748{ 749 struct snd_soc_tplg_mixer_control *mc; 750 struct soc_mixer_control *sm; 751 struct snd_kcontrol_new kc; 752 int ret = 0; 753 754 if (soc_tplg_check_elem_count(tplg, 755 sizeof(struct snd_soc_tplg_mixer_control), 756 1, size, "mixers")) 757 return -EINVAL; 758 759 mc = (struct snd_soc_tplg_mixer_control *)tplg->pos; 760 761 /* validate kcontrol */ 762 if (strnlen(mc->hdr.name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) == 763 SNDRV_CTL_ELEM_ID_NAME_MAXLEN) 764 return -EINVAL; 765 766 sm = devm_kzalloc(tplg->dev, sizeof(*sm), GFP_KERNEL); 767 if (sm == NULL) 768 return -ENOMEM; 769 tplg->pos += (sizeof(struct snd_soc_tplg_mixer_control) + 770 le32_to_cpu(mc->priv.size)); 771 772 dev_dbg(tplg->dev, 773 "ASoC: adding mixer kcontrol %s with access 0x%x\n", 774 mc->hdr.name, mc->hdr.access); 775 776 memset(&kc, 0, sizeof(kc)); 777 kc.name = mc->hdr.name; 778 kc.private_value = (long)sm; 779 kc.iface = SNDRV_CTL_ELEM_IFACE_MIXER; 780 kc.access = le32_to_cpu(mc->hdr.access); 781 782 /* we only support FL/FR channel mapping atm */ 783 sm->reg = tplc_chan_get_reg(tplg, mc->channel, SNDRV_CHMAP_FL); 784 sm->rreg = tplc_chan_get_reg(tplg, mc->channel, SNDRV_CHMAP_FR); 785 sm->shift = tplc_chan_get_shift(tplg, mc->channel, SNDRV_CHMAP_FL); 786 sm->rshift = tplc_chan_get_shift(tplg, mc->channel, SNDRV_CHMAP_FR); 787 788 sm->max = le32_to_cpu(mc->max); 789 sm->min = le32_to_cpu(mc->min); 790 sm->invert = le32_to_cpu(mc->invert); 791 sm->platform_max = le32_to_cpu(mc->platform_max); 792 sm->dobj.index = tplg->index; 793 sm->dobj.ops = tplg->ops; 794 sm->dobj.type = SND_SOC_DOBJ_MIXER; 795 INIT_LIST_HEAD(&sm->dobj.list); 796 797 /* map io handlers */ 798 ret = soc_tplg_kcontrol_bind_io(&mc->hdr, &kc, tplg); 799 if (ret) { 800 soc_control_err(tplg, &mc->hdr, mc->hdr.name); 801 goto err; 802 } 803 804 /* create any TLV data */ 805 ret = soc_tplg_create_tlv(tplg, &kc, &mc->hdr); 806 if (ret < 0) { 807 dev_err(tplg->dev, "ASoC: failed to create TLV %s\n", mc->hdr.name); 808 goto err; 809 } 810 811 /* pass control to driver for optional further init */ 812 ret = soc_tplg_control_load(tplg, &kc, (struct snd_soc_tplg_ctl_hdr *)mc); 813 if (ret < 0) { 814 dev_err(tplg->dev, "ASoC: failed to init %s\n", mc->hdr.name); 815 goto err; 816 } 817 818 /* register control here */ 819 ret = soc_tplg_add_kcontrol(tplg, &kc, &sm->dobj.control.kcontrol); 820 if (ret < 0) { 821 dev_err(tplg->dev, "ASoC: failed to add %s\n", mc->hdr.name); 822 goto err; 823 } 824 825 list_add(&sm->dobj.list, &tplg->comp->dobj_list); 826 827err: 828 return ret; 829} 830 831static int soc_tplg_denum_create_texts(struct soc_tplg *tplg, struct soc_enum *se, 832 struct snd_soc_tplg_enum_control *ec) 833{ 834 int i, ret; 835 836 if (le32_to_cpu(ec->items) > ARRAY_SIZE(ec->texts)) 837 return -EINVAL; 838 839 se->dobj.control.dtexts = 840 devm_kcalloc(tplg->dev, le32_to_cpu(ec->items), sizeof(char *), GFP_KERNEL); 841 if (se->dobj.control.dtexts == NULL) 842 return -ENOMEM; 843 844 for (i = 0; i < le32_to_cpu(ec->items); i++) { 845 846 if (strnlen(ec->texts[i], SNDRV_CTL_ELEM_ID_NAME_MAXLEN) == 847 SNDRV_CTL_ELEM_ID_NAME_MAXLEN) { 848 ret = -EINVAL; 849 goto err; 850 } 851 852 se->dobj.control.dtexts[i] = devm_kstrdup(tplg->dev, ec->texts[i], GFP_KERNEL); 853 if (!se->dobj.control.dtexts[i]) { 854 ret = -ENOMEM; 855 goto err; 856 } 857 } 858 859 se->items = le32_to_cpu(ec->items); 860 se->texts = (const char * const *)se->dobj.control.dtexts; 861 return 0; 862 863err: 864 return ret; 865} 866 867static int soc_tplg_denum_create_values(struct soc_tplg *tplg, struct soc_enum *se, 868 struct snd_soc_tplg_enum_control *ec) 869{ 870 int i; 871 872 /* 873 * Following "if" checks if we have at most SND_SOC_TPLG_NUM_TEXTS 874 * values instead of using ARRAY_SIZE(ec->values) due to the fact that 875 * it is oversized for its purpose. Additionally it is done so because 876 * it is defined in UAPI header where it can't be easily changed. 877 */ 878 if (le32_to_cpu(ec->items) > SND_SOC_TPLG_NUM_TEXTS) 879 return -EINVAL; 880 881 se->dobj.control.dvalues = devm_kcalloc(tplg->dev, le32_to_cpu(ec->items), 882 sizeof(*se->dobj.control.dvalues), 883 GFP_KERNEL); 884 if (!se->dobj.control.dvalues) 885 return -ENOMEM; 886 887 /* convert from little-endian */ 888 for (i = 0; i < le32_to_cpu(ec->items); i++) { 889 se->dobj.control.dvalues[i] = le32_to_cpu(ec->values[i]); 890 } 891 892 return 0; 893} 894 895static int soc_tplg_denum_create(struct soc_tplg *tplg, size_t size) 896{ 897 struct snd_soc_tplg_enum_control *ec; 898 struct soc_enum *se; 899 struct snd_kcontrol_new kc; 900 int ret = 0; 901 902 if (soc_tplg_check_elem_count(tplg, 903 sizeof(struct snd_soc_tplg_enum_control), 904 1, size, "enums")) 905 return -EINVAL; 906 907 ec = (struct snd_soc_tplg_enum_control *)tplg->pos; 908 909 /* validate kcontrol */ 910 if (strnlen(ec->hdr.name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) == 911 SNDRV_CTL_ELEM_ID_NAME_MAXLEN) 912 return -EINVAL; 913 914 se = devm_kzalloc(tplg->dev, (sizeof(*se)), GFP_KERNEL); 915 if (se == NULL) 916 return -ENOMEM; 917 918 tplg->pos += (sizeof(struct snd_soc_tplg_enum_control) + 919 le32_to_cpu(ec->priv.size)); 920 921 dev_dbg(tplg->dev, "ASoC: adding enum kcontrol %s size %d\n", 922 ec->hdr.name, ec->items); 923 924 memset(&kc, 0, sizeof(kc)); 925 kc.name = ec->hdr.name; 926 kc.private_value = (long)se; 927 kc.iface = SNDRV_CTL_ELEM_IFACE_MIXER; 928 kc.access = le32_to_cpu(ec->hdr.access); 929 930 se->reg = tplc_chan_get_reg(tplg, ec->channel, SNDRV_CHMAP_FL); 931 se->shift_l = tplc_chan_get_shift(tplg, ec->channel, 932 SNDRV_CHMAP_FL); 933 se->shift_r = tplc_chan_get_shift(tplg, ec->channel, 934 SNDRV_CHMAP_FL); 935 936 se->mask = le32_to_cpu(ec->mask); 937 se->dobj.index = tplg->index; 938 se->dobj.type = SND_SOC_DOBJ_ENUM; 939 se->dobj.ops = tplg->ops; 940 INIT_LIST_HEAD(&se->dobj.list); 941 942 switch (le32_to_cpu(ec->hdr.ops.info)) { 943 case SND_SOC_TPLG_DAPM_CTL_ENUM_VALUE: 944 case SND_SOC_TPLG_CTL_ENUM_VALUE: 945 ret = soc_tplg_denum_create_values(tplg, se, ec); 946 if (ret < 0) { 947 dev_err(tplg->dev, 948 "ASoC: could not create values for %s\n", 949 ec->hdr.name); 950 goto err; 951 } 952 fallthrough; 953 case SND_SOC_TPLG_CTL_ENUM: 954 case SND_SOC_TPLG_DAPM_CTL_ENUM_DOUBLE: 955 case SND_SOC_TPLG_DAPM_CTL_ENUM_VIRT: 956 ret = soc_tplg_denum_create_texts(tplg, se, ec); 957 if (ret < 0) { 958 dev_err(tplg->dev, 959 "ASoC: could not create texts for %s\n", 960 ec->hdr.name); 961 goto err; 962 } 963 break; 964 default: 965 ret = -EINVAL; 966 dev_err(tplg->dev, 967 "ASoC: invalid enum control type %d for %s\n", 968 ec->hdr.ops.info, ec->hdr.name); 969 goto err; 970 } 971 972 /* map io handlers */ 973 ret = soc_tplg_kcontrol_bind_io(&ec->hdr, &kc, tplg); 974 if (ret) { 975 soc_control_err(tplg, &ec->hdr, ec->hdr.name); 976 goto err; 977 } 978 979 /* pass control to driver for optional further init */ 980 ret = soc_tplg_control_load(tplg, &kc, (struct snd_soc_tplg_ctl_hdr *)ec); 981 if (ret < 0) { 982 dev_err(tplg->dev, "ASoC: failed to init %s\n", ec->hdr.name); 983 goto err; 984 } 985 986 /* register control here */ 987 ret = soc_tplg_add_kcontrol(tplg, &kc, &se->dobj.control.kcontrol); 988 if (ret < 0) { 989 dev_err(tplg->dev, "ASoC: could not add kcontrol %s\n", ec->hdr.name); 990 goto err; 991 } 992 993 list_add(&se->dobj.list, &tplg->comp->dobj_list); 994 995err: 996 return ret; 997} 998 999static int soc_tplg_kcontrol_elems_load(struct soc_tplg *tplg, 1000 struct snd_soc_tplg_hdr *hdr) 1001{ 1002 int ret; 1003 int i; 1004 1005 dev_dbg(tplg->dev, "ASoC: adding %d kcontrols at 0x%lx\n", hdr->count, 1006 soc_tplg_get_offset(tplg)); 1007 1008 for (i = 0; i < le32_to_cpu(hdr->count); i++) { 1009 struct snd_soc_tplg_ctl_hdr *control_hdr = (struct snd_soc_tplg_ctl_hdr *)tplg->pos; 1010 1011 if (le32_to_cpu(control_hdr->size) != sizeof(*control_hdr)) { 1012 dev_err(tplg->dev, "ASoC: invalid control size\n"); 1013 return -EINVAL; 1014 } 1015 1016 switch (le32_to_cpu(control_hdr->ops.info)) { 1017 case SND_SOC_TPLG_CTL_VOLSW: 1018 case SND_SOC_TPLG_CTL_STROBE: 1019 case SND_SOC_TPLG_CTL_VOLSW_SX: 1020 case SND_SOC_TPLG_CTL_VOLSW_XR_SX: 1021 case SND_SOC_TPLG_CTL_RANGE: 1022 case SND_SOC_TPLG_DAPM_CTL_VOLSW: 1023 case SND_SOC_TPLG_DAPM_CTL_PIN: 1024 ret = soc_tplg_dmixer_create(tplg, le32_to_cpu(hdr->payload_size)); 1025 break; 1026 case SND_SOC_TPLG_CTL_ENUM: 1027 case SND_SOC_TPLG_CTL_ENUM_VALUE: 1028 case SND_SOC_TPLG_DAPM_CTL_ENUM_DOUBLE: 1029 case SND_SOC_TPLG_DAPM_CTL_ENUM_VIRT: 1030 case SND_SOC_TPLG_DAPM_CTL_ENUM_VALUE: 1031 ret = soc_tplg_denum_create(tplg, le32_to_cpu(hdr->payload_size)); 1032 break; 1033 case SND_SOC_TPLG_CTL_BYTES: 1034 ret = soc_tplg_dbytes_create(tplg, le32_to_cpu(hdr->payload_size)); 1035 break; 1036 default: 1037 soc_bind_err(tplg, control_hdr, i); 1038 return -EINVAL; 1039 } 1040 if (ret < 0) { 1041 dev_err(tplg->dev, "ASoC: invalid control\n"); 1042 return ret; 1043 } 1044 1045 } 1046 1047 return 0; 1048} 1049 1050/* optionally pass new dynamic kcontrol to component driver. */ 1051static int soc_tplg_add_route(struct soc_tplg *tplg, 1052 struct snd_soc_dapm_route *route) 1053{ 1054 if (tplg->ops && tplg->ops->dapm_route_load) 1055 return tplg->ops->dapm_route_load(tplg->comp, tplg->index, 1056 route); 1057 1058 return 0; 1059} 1060 1061static int soc_tplg_dapm_graph_elems_load(struct soc_tplg *tplg, 1062 struct snd_soc_tplg_hdr *hdr) 1063{ 1064 struct snd_soc_dapm_context *dapm = &tplg->comp->dapm; 1065 struct snd_soc_tplg_dapm_graph_elem *elem; 1066 struct snd_soc_dapm_route *route; 1067 int count, i; 1068 int ret = 0; 1069 1070 count = le32_to_cpu(hdr->count); 1071 1072 if (soc_tplg_check_elem_count(tplg, 1073 sizeof(struct snd_soc_tplg_dapm_graph_elem), 1074 count, le32_to_cpu(hdr->payload_size), "graph")) 1075 return -EINVAL; 1076 1077 dev_dbg(tplg->dev, "ASoC: adding %d DAPM routes for index %d\n", count, 1078 hdr->index); 1079 1080 for (i = 0; i < count; i++) { 1081 route = devm_kzalloc(tplg->dev, sizeof(*route), GFP_KERNEL); 1082 if (!route) 1083 return -ENOMEM; 1084 elem = (struct snd_soc_tplg_dapm_graph_elem *)tplg->pos; 1085 tplg->pos += sizeof(struct snd_soc_tplg_dapm_graph_elem); 1086 1087 /* validate routes */ 1088 if (strnlen(elem->source, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) == 1089 SNDRV_CTL_ELEM_ID_NAME_MAXLEN) { 1090 ret = -EINVAL; 1091 break; 1092 } 1093 if (strnlen(elem->sink, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) == 1094 SNDRV_CTL_ELEM_ID_NAME_MAXLEN) { 1095 ret = -EINVAL; 1096 break; 1097 } 1098 if (strnlen(elem->control, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) == 1099 SNDRV_CTL_ELEM_ID_NAME_MAXLEN) { 1100 ret = -EINVAL; 1101 break; 1102 } 1103 1104 route->source = elem->source; 1105 route->sink = elem->sink; 1106 1107 /* set to NULL atm for tplg users */ 1108 route->connected = NULL; 1109 if (strnlen(elem->control, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) == 0) 1110 route->control = NULL; 1111 else 1112 route->control = elem->control; 1113 1114 /* add route dobj to dobj_list */ 1115 route->dobj.type = SND_SOC_DOBJ_GRAPH; 1116 route->dobj.ops = tplg->ops; 1117 route->dobj.index = tplg->index; 1118 list_add(&route->dobj.list, &tplg->comp->dobj_list); 1119 1120 ret = soc_tplg_add_route(tplg, route); 1121 if (ret < 0) { 1122 dev_err(tplg->dev, "ASoC: topology: add_route failed: %d\n", ret); 1123 break; 1124 } 1125 1126 /* add route, but keep going if some fail */ 1127 snd_soc_dapm_add_routes(dapm, route, 1); 1128 } 1129 1130 return ret; 1131} 1132 1133static int soc_tplg_dapm_widget_dmixer_create(struct soc_tplg *tplg, struct snd_kcontrol_new *kc) 1134{ 1135 struct soc_mixer_control *sm; 1136 struct snd_soc_tplg_mixer_control *mc; 1137 int err; 1138 1139 mc = (struct snd_soc_tplg_mixer_control *)tplg->pos; 1140 1141 /* validate kcontrol */ 1142 if (strnlen(mc->hdr.name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) == 1143 SNDRV_CTL_ELEM_ID_NAME_MAXLEN) 1144 return -EINVAL; 1145 1146 sm = devm_kzalloc(tplg->dev, sizeof(*sm), GFP_KERNEL); 1147 if (!sm) 1148 return -ENOMEM; 1149 1150 tplg->pos += sizeof(struct snd_soc_tplg_mixer_control) + 1151 le32_to_cpu(mc->priv.size); 1152 1153 dev_dbg(tplg->dev, " adding DAPM widget mixer control %s\n", 1154 mc->hdr.name); 1155 1156 kc->private_value = (long)sm; 1157 kc->name = devm_kstrdup(tplg->dev, mc->hdr.name, GFP_KERNEL); 1158 if (!kc->name) 1159 return -ENOMEM; 1160 kc->iface = SNDRV_CTL_ELEM_IFACE_MIXER; 1161 kc->access = le32_to_cpu(mc->hdr.access); 1162 1163 /* we only support FL/FR channel mapping atm */ 1164 sm->reg = tplc_chan_get_reg(tplg, mc->channel, 1165 SNDRV_CHMAP_FL); 1166 sm->rreg = tplc_chan_get_reg(tplg, mc->channel, 1167 SNDRV_CHMAP_FR); 1168 sm->shift = tplc_chan_get_shift(tplg, mc->channel, 1169 SNDRV_CHMAP_FL); 1170 sm->rshift = tplc_chan_get_shift(tplg, mc->channel, 1171 SNDRV_CHMAP_FR); 1172 1173 sm->max = le32_to_cpu(mc->max); 1174 sm->min = le32_to_cpu(mc->min); 1175 sm->invert = le32_to_cpu(mc->invert); 1176 sm->platform_max = le32_to_cpu(mc->platform_max); 1177 sm->dobj.index = tplg->index; 1178 INIT_LIST_HEAD(&sm->dobj.list); 1179 1180 /* map io handlers */ 1181 err = soc_tplg_kcontrol_bind_io(&mc->hdr, kc, tplg); 1182 if (err) { 1183 soc_control_err(tplg, &mc->hdr, mc->hdr.name); 1184 return err; 1185 } 1186 1187 /* create any TLV data */ 1188 err = soc_tplg_create_tlv(tplg, kc, &mc->hdr); 1189 if (err < 0) { 1190 dev_err(tplg->dev, "ASoC: failed to create TLV %s\n", 1191 mc->hdr.name); 1192 return err; 1193 } 1194 1195 /* pass control to driver for optional further init */ 1196 err = soc_tplg_control_load(tplg, kc, (struct snd_soc_tplg_ctl_hdr *)mc); 1197 if (err < 0) { 1198 dev_err(tplg->dev, "ASoC: failed to init %s\n", 1199 mc->hdr.name); 1200 return err; 1201 } 1202 1203 return 0; 1204} 1205 1206static int soc_tplg_dapm_widget_denum_create(struct soc_tplg *tplg, struct snd_kcontrol_new *kc) 1207{ 1208 struct snd_soc_tplg_enum_control *ec; 1209 struct soc_enum *se; 1210 int err; 1211 1212 ec = (struct snd_soc_tplg_enum_control *)tplg->pos; 1213 /* validate kcontrol */ 1214 if (strnlen(ec->hdr.name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) == 1215 SNDRV_CTL_ELEM_ID_NAME_MAXLEN) 1216 return -EINVAL; 1217 1218 se = devm_kzalloc(tplg->dev, sizeof(*se), GFP_KERNEL); 1219 if (!se) 1220 return -ENOMEM; 1221 1222 tplg->pos += (sizeof(struct snd_soc_tplg_enum_control) + 1223 le32_to_cpu(ec->priv.size)); 1224 1225 dev_dbg(tplg->dev, " adding DAPM widget enum control %s\n", 1226 ec->hdr.name); 1227 1228 kc->private_value = (long)se; 1229 kc->name = devm_kstrdup(tplg->dev, ec->hdr.name, GFP_KERNEL); 1230 if (!kc->name) 1231 return -ENOMEM; 1232 kc->iface = SNDRV_CTL_ELEM_IFACE_MIXER; 1233 kc->access = le32_to_cpu(ec->hdr.access); 1234 1235 /* we only support FL/FR channel mapping atm */ 1236 se->reg = tplc_chan_get_reg(tplg, ec->channel, SNDRV_CHMAP_FL); 1237 se->shift_l = tplc_chan_get_shift(tplg, ec->channel, 1238 SNDRV_CHMAP_FL); 1239 se->shift_r = tplc_chan_get_shift(tplg, ec->channel, 1240 SNDRV_CHMAP_FR); 1241 1242 se->items = le32_to_cpu(ec->items); 1243 se->mask = le32_to_cpu(ec->mask); 1244 se->dobj.index = tplg->index; 1245 1246 switch (le32_to_cpu(ec->hdr.ops.info)) { 1247 case SND_SOC_TPLG_CTL_ENUM_VALUE: 1248 case SND_SOC_TPLG_DAPM_CTL_ENUM_VALUE: 1249 err = soc_tplg_denum_create_values(tplg, se, ec); 1250 if (err < 0) { 1251 dev_err(tplg->dev, "ASoC: could not create values for %s\n", 1252 ec->hdr.name); 1253 return err; 1254 } 1255 fallthrough; 1256 case SND_SOC_TPLG_CTL_ENUM: 1257 case SND_SOC_TPLG_DAPM_CTL_ENUM_DOUBLE: 1258 case SND_SOC_TPLG_DAPM_CTL_ENUM_VIRT: 1259 err = soc_tplg_denum_create_texts(tplg, se, ec); 1260 if (err < 0) { 1261 dev_err(tplg->dev, "ASoC: could not create texts for %s\n", 1262 ec->hdr.name); 1263 return err; 1264 } 1265 break; 1266 default: 1267 dev_err(tplg->dev, "ASoC: invalid enum control type %d for %s\n", 1268 ec->hdr.ops.info, ec->hdr.name); 1269 return -EINVAL; 1270 } 1271 1272 /* map io handlers */ 1273 err = soc_tplg_kcontrol_bind_io(&ec->hdr, kc, tplg); 1274 if (err) { 1275 soc_control_err(tplg, &ec->hdr, ec->hdr.name); 1276 return err; 1277 } 1278 1279 /* pass control to driver for optional further init */ 1280 err = soc_tplg_control_load(tplg, kc, (struct snd_soc_tplg_ctl_hdr *)ec); 1281 if (err < 0) { 1282 dev_err(tplg->dev, "ASoC: failed to init %s\n", 1283 ec->hdr.name); 1284 return err; 1285 } 1286 1287 return 0; 1288} 1289 1290static int soc_tplg_dapm_widget_dbytes_create(struct soc_tplg *tplg, struct snd_kcontrol_new *kc) 1291{ 1292 struct snd_soc_tplg_bytes_control *be; 1293 struct soc_bytes_ext *sbe; 1294 int err; 1295 1296 be = (struct snd_soc_tplg_bytes_control *)tplg->pos; 1297 1298 /* validate kcontrol */ 1299 if (strnlen(be->hdr.name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) == 1300 SNDRV_CTL_ELEM_ID_NAME_MAXLEN) 1301 return -EINVAL; 1302 1303 sbe = devm_kzalloc(tplg->dev, sizeof(*sbe), GFP_KERNEL); 1304 if (!sbe) 1305 return -ENOMEM; 1306 1307 tplg->pos += (sizeof(struct snd_soc_tplg_bytes_control) + 1308 le32_to_cpu(be->priv.size)); 1309 1310 dev_dbg(tplg->dev, 1311 "ASoC: adding bytes kcontrol %s with access 0x%x\n", 1312 be->hdr.name, be->hdr.access); 1313 1314 kc->private_value = (long)sbe; 1315 kc->name = devm_kstrdup(tplg->dev, be->hdr.name, GFP_KERNEL); 1316 if (!kc->name) 1317 return -ENOMEM; 1318 kc->iface = SNDRV_CTL_ELEM_IFACE_MIXER; 1319 kc->access = le32_to_cpu(be->hdr.access); 1320 1321 sbe->max = le32_to_cpu(be->max); 1322 INIT_LIST_HEAD(&sbe->dobj.list); 1323 1324 /* map standard io handlers and check for external handlers */ 1325 err = soc_tplg_kcontrol_bind_io(&be->hdr, kc, tplg); 1326 if (err) { 1327 soc_control_err(tplg, &be->hdr, be->hdr.name); 1328 return err; 1329 } 1330 1331 /* pass control to driver for optional further init */ 1332 err = soc_tplg_control_load(tplg, kc, (struct snd_soc_tplg_ctl_hdr *)be); 1333 if (err < 0) { 1334 dev_err(tplg->dev, "ASoC: failed to init %s\n", 1335 be->hdr.name); 1336 return err; 1337 } 1338 1339 return 0; 1340} 1341 1342static int soc_tplg_dapm_widget_create(struct soc_tplg *tplg, 1343 struct snd_soc_tplg_dapm_widget *w) 1344{ 1345 struct snd_soc_dapm_context *dapm = &tplg->comp->dapm; 1346 struct snd_soc_dapm_widget template, *widget; 1347 struct snd_soc_tplg_ctl_hdr *control_hdr; 1348 struct snd_soc_card *card = tplg->comp->card; 1349 unsigned int *kcontrol_type = NULL; 1350 struct snd_kcontrol_new *kc; 1351 int mixer_count = 0; 1352 int bytes_count = 0; 1353 int enum_count = 0; 1354 int ret = 0; 1355 int i; 1356 1357 if (strnlen(w->name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) == 1358 SNDRV_CTL_ELEM_ID_NAME_MAXLEN) 1359 return -EINVAL; 1360 if (strnlen(w->sname, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) == 1361 SNDRV_CTL_ELEM_ID_NAME_MAXLEN) 1362 return -EINVAL; 1363 1364 dev_dbg(tplg->dev, "ASoC: creating DAPM widget %s id %d\n", 1365 w->name, w->id); 1366 1367 memset(&template, 0, sizeof(template)); 1368 1369 /* map user to kernel widget ID */ 1370 template.id = get_widget_id(le32_to_cpu(w->id)); 1371 if ((int)template.id < 0) 1372 return template.id; 1373 1374 /* strings are allocated here, but used and freed by the widget */ 1375 template.name = kstrdup(w->name, GFP_KERNEL); 1376 if (!template.name) 1377 return -ENOMEM; 1378 template.sname = kstrdup(w->sname, GFP_KERNEL); 1379 if (!template.sname) { 1380 ret = -ENOMEM; 1381 goto err; 1382 } 1383 template.reg = le32_to_cpu(w->reg); 1384 template.shift = le32_to_cpu(w->shift); 1385 template.mask = le32_to_cpu(w->mask); 1386 template.subseq = le32_to_cpu(w->subseq); 1387 template.on_val = w->invert ? 0 : 1; 1388 template.off_val = w->invert ? 1 : 0; 1389 template.ignore_suspend = le32_to_cpu(w->ignore_suspend); 1390 template.event_flags = le16_to_cpu(w->event_flags); 1391 template.dobj.index = tplg->index; 1392 1393 tplg->pos += 1394 (sizeof(struct snd_soc_tplg_dapm_widget) + 1395 le32_to_cpu(w->priv.size)); 1396 1397 if (w->num_kcontrols == 0) { 1398 template.num_kcontrols = 0; 1399 goto widget; 1400 } 1401 1402 template.num_kcontrols = le32_to_cpu(w->num_kcontrols); 1403 kc = devm_kcalloc(tplg->dev, le32_to_cpu(w->num_kcontrols), sizeof(*kc), GFP_KERNEL); 1404 if (!kc) 1405 goto hdr_err; 1406 1407 kcontrol_type = devm_kcalloc(tplg->dev, le32_to_cpu(w->num_kcontrols), sizeof(unsigned int), 1408 GFP_KERNEL); 1409 if (!kcontrol_type) 1410 goto hdr_err; 1411 1412 for (i = 0; i < le32_to_cpu(w->num_kcontrols); i++) { 1413 control_hdr = (struct snd_soc_tplg_ctl_hdr *)tplg->pos; 1414 switch (le32_to_cpu(control_hdr->ops.info)) { 1415 case SND_SOC_TPLG_CTL_VOLSW: 1416 case SND_SOC_TPLG_CTL_STROBE: 1417 case SND_SOC_TPLG_CTL_VOLSW_SX: 1418 case SND_SOC_TPLG_CTL_VOLSW_XR_SX: 1419 case SND_SOC_TPLG_CTL_RANGE: 1420 case SND_SOC_TPLG_DAPM_CTL_VOLSW: 1421 /* volume mixer */ 1422 kc[i].index = mixer_count; 1423 kcontrol_type[i] = SND_SOC_TPLG_TYPE_MIXER; 1424 mixer_count++; 1425 ret = soc_tplg_dapm_widget_dmixer_create(tplg, &kc[i]); 1426 if (ret < 0) 1427 goto hdr_err; 1428 break; 1429 case SND_SOC_TPLG_CTL_ENUM: 1430 case SND_SOC_TPLG_CTL_ENUM_VALUE: 1431 case SND_SOC_TPLG_DAPM_CTL_ENUM_DOUBLE: 1432 case SND_SOC_TPLG_DAPM_CTL_ENUM_VIRT: 1433 case SND_SOC_TPLG_DAPM_CTL_ENUM_VALUE: 1434 /* enumerated mixer */ 1435 kc[i].index = enum_count; 1436 kcontrol_type[i] = SND_SOC_TPLG_TYPE_ENUM; 1437 enum_count++; 1438 ret = soc_tplg_dapm_widget_denum_create(tplg, &kc[i]); 1439 if (ret < 0) 1440 goto hdr_err; 1441 break; 1442 case SND_SOC_TPLG_CTL_BYTES: 1443 /* bytes control */ 1444 kc[i].index = bytes_count; 1445 kcontrol_type[i] = SND_SOC_TPLG_TYPE_BYTES; 1446 bytes_count++; 1447 ret = soc_tplg_dapm_widget_dbytes_create(tplg, &kc[i]); 1448 if (ret < 0) 1449 goto hdr_err; 1450 break; 1451 default: 1452 dev_err(tplg->dev, "ASoC: invalid widget control type %d:%d:%d\n", 1453 control_hdr->ops.get, control_hdr->ops.put, 1454 le32_to_cpu(control_hdr->ops.info)); 1455 ret = -EINVAL; 1456 goto hdr_err; 1457 } 1458 } 1459 1460 template.kcontrol_news = kc; 1461 dev_dbg(tplg->dev, "ASoC: template %s with %d/%d/%d (mixer/enum/bytes) control\n", 1462 w->name, mixer_count, enum_count, bytes_count); 1463 1464widget: 1465 ret = soc_tplg_widget_load(tplg, &template, w); 1466 if (ret < 0) 1467 goto hdr_err; 1468 1469 /* card dapm mutex is held by the core if we are loading topology 1470 * data during sound card init. */ 1471 if (card->instantiated) 1472 widget = snd_soc_dapm_new_control(dapm, &template); 1473 else 1474 widget = snd_soc_dapm_new_control_unlocked(dapm, &template); 1475 if (IS_ERR(widget)) { 1476 ret = PTR_ERR(widget); 1477 goto hdr_err; 1478 } 1479 1480 widget->dobj.type = SND_SOC_DOBJ_WIDGET; 1481 widget->dobj.widget.kcontrol_type = kcontrol_type; 1482 widget->dobj.ops = tplg->ops; 1483 widget->dobj.index = tplg->index; 1484 list_add(&widget->dobj.list, &tplg->comp->dobj_list); 1485 1486 ret = soc_tplg_widget_ready(tplg, widget, w); 1487 if (ret < 0) 1488 goto ready_err; 1489 1490 kfree(template.sname); 1491 kfree(template.name); 1492 1493 return 0; 1494 1495ready_err: 1496 remove_widget(widget->dapm->component, &widget->dobj, SOC_TPLG_PASS_WIDGET); 1497 snd_soc_dapm_free_widget(widget); 1498hdr_err: 1499 kfree(template.sname); 1500err: 1501 kfree(template.name); 1502 return ret; 1503} 1504 1505static int soc_tplg_dapm_widget_elems_load(struct soc_tplg *tplg, 1506 struct snd_soc_tplg_hdr *hdr) 1507{ 1508 int count, i; 1509 1510 count = le32_to_cpu(hdr->count); 1511 1512 dev_dbg(tplg->dev, "ASoC: adding %d DAPM widgets\n", count); 1513 1514 for (i = 0; i < count; i++) { 1515 struct snd_soc_tplg_dapm_widget *widget = (struct snd_soc_tplg_dapm_widget *) tplg->pos; 1516 int ret; 1517 1518 /* 1519 * check if widget itself fits within topology file 1520 * use sizeof instead of widget->size, as we can't be sure 1521 * it is set properly yet (file may end before it is present) 1522 */ 1523 if (soc_tplg_get_offset(tplg) + sizeof(*widget) >= tplg->fw->size) { 1524 dev_err(tplg->dev, "ASoC: invalid widget data size\n"); 1525 return -EINVAL; 1526 } 1527 1528 /* check if widget has proper size */ 1529 if (le32_to_cpu(widget->size) != sizeof(*widget)) { 1530 dev_err(tplg->dev, "ASoC: invalid widget size\n"); 1531 return -EINVAL; 1532 } 1533 1534 /* check if widget private data fits within topology file */ 1535 if (soc_tplg_get_offset(tplg) + le32_to_cpu(widget->priv.size) >= tplg->fw->size) { 1536 dev_err(tplg->dev, "ASoC: invalid widget private data size\n"); 1537 return -EINVAL; 1538 } 1539 1540 ret = soc_tplg_dapm_widget_create(tplg, widget); 1541 if (ret < 0) { 1542 dev_err(tplg->dev, "ASoC: failed to load widget %s\n", 1543 widget->name); 1544 return ret; 1545 } 1546 } 1547 1548 return 0; 1549} 1550 1551static int soc_tplg_dapm_complete(struct soc_tplg *tplg) 1552{ 1553 struct snd_soc_card *card = tplg->comp->card; 1554 int ret; 1555 1556 /* Card might not have been registered at this point. 1557 * If so, just return success. 1558 */ 1559 if (!card || !card->instantiated) { 1560 dev_warn(tplg->dev, "ASoC: Parent card not yet available," 1561 " widget card binding deferred\n"); 1562 return 0; 1563 } 1564 1565 ret = snd_soc_dapm_new_widgets(card); 1566 if (ret < 0) 1567 dev_err(tplg->dev, "ASoC: failed to create new widgets %d\n", 1568 ret); 1569 1570 return 0; 1571} 1572 1573static int set_stream_info(struct soc_tplg *tplg, struct snd_soc_pcm_stream *stream, 1574 struct snd_soc_tplg_stream_caps *caps) 1575{ 1576 stream->stream_name = devm_kstrdup(tplg->dev, caps->name, GFP_KERNEL); 1577 if (!stream->stream_name) 1578 return -ENOMEM; 1579 1580 stream->channels_min = le32_to_cpu(caps->channels_min); 1581 stream->channels_max = le32_to_cpu(caps->channels_max); 1582 stream->rates = le32_to_cpu(caps->rates); 1583 stream->rate_min = le32_to_cpu(caps->rate_min); 1584 stream->rate_max = le32_to_cpu(caps->rate_max); 1585 stream->formats = le64_to_cpu(caps->formats); 1586 stream->sig_bits = le32_to_cpu(caps->sig_bits); 1587 1588 return 0; 1589} 1590 1591static void set_dai_flags(struct snd_soc_dai_driver *dai_drv, 1592 unsigned int flag_mask, unsigned int flags) 1593{ 1594 if (flag_mask & SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_RATES) 1595 dai_drv->symmetric_rate = 1596 (flags & SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_RATES) ? 1 : 0; 1597 1598 if (flag_mask & SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_CHANNELS) 1599 dai_drv->symmetric_channels = 1600 (flags & SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_CHANNELS) ? 1601 1 : 0; 1602 1603 if (flag_mask & SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_SAMPLEBITS) 1604 dai_drv->symmetric_sample_bits = 1605 (flags & SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_SAMPLEBITS) ? 1606 1 : 0; 1607} 1608 1609static int soc_tplg_dai_create(struct soc_tplg *tplg, 1610 struct snd_soc_tplg_pcm *pcm) 1611{ 1612 struct snd_soc_dai_driver *dai_drv; 1613 struct snd_soc_pcm_stream *stream; 1614 struct snd_soc_tplg_stream_caps *caps; 1615 struct snd_soc_dai *dai; 1616 struct snd_soc_dapm_context *dapm = 1617 snd_soc_component_get_dapm(tplg->comp); 1618 int ret; 1619 1620 dai_drv = devm_kzalloc(tplg->dev, sizeof(struct snd_soc_dai_driver), GFP_KERNEL); 1621 if (dai_drv == NULL) 1622 return -ENOMEM; 1623 1624 if (strlen(pcm->dai_name)) { 1625 dai_drv->name = devm_kstrdup(tplg->dev, pcm->dai_name, GFP_KERNEL); 1626 if (!dai_drv->name) { 1627 ret = -ENOMEM; 1628 goto err; 1629 } 1630 } 1631 dai_drv->id = le32_to_cpu(pcm->dai_id); 1632 1633 if (pcm->playback) { 1634 stream = &dai_drv->playback; 1635 caps = &pcm->caps[SND_SOC_TPLG_STREAM_PLAYBACK]; 1636 ret = set_stream_info(tplg, stream, caps); 1637 if (ret < 0) 1638 goto err; 1639 } 1640 1641 if (pcm->capture) { 1642 stream = &dai_drv->capture; 1643 caps = &pcm->caps[SND_SOC_TPLG_STREAM_CAPTURE]; 1644 ret = set_stream_info(tplg, stream, caps); 1645 if (ret < 0) 1646 goto err; 1647 } 1648 1649 if (pcm->compress) 1650 dai_drv->compress_new = snd_soc_new_compress; 1651 1652 /* pass control to component driver for optional further init */ 1653 ret = soc_tplg_dai_load(tplg, dai_drv, pcm, NULL); 1654 if (ret < 0) { 1655 dev_err(tplg->dev, "ASoC: DAI loading failed\n"); 1656 goto err; 1657 } 1658 1659 dai_drv->dobj.index = tplg->index; 1660 dai_drv->dobj.ops = tplg->ops; 1661 dai_drv->dobj.type = SND_SOC_DOBJ_PCM; 1662 list_add(&dai_drv->dobj.list, &tplg->comp->dobj_list); 1663 1664 /* register the DAI to the component */ 1665 dai = snd_soc_register_dai(tplg->comp, dai_drv, false); 1666 if (!dai) 1667 return -ENOMEM; 1668 1669 /* Create the DAI widgets here */ 1670 ret = snd_soc_dapm_new_dai_widgets(dapm, dai); 1671 if (ret != 0) { 1672 dev_err(dai->dev, "Failed to create DAI widgets %d\n", ret); 1673 snd_soc_unregister_dai(dai); 1674 return ret; 1675 } 1676 1677 return 0; 1678 1679err: 1680 return ret; 1681} 1682 1683static void set_link_flags(struct snd_soc_dai_link *link, 1684 unsigned int flag_mask, unsigned int flags) 1685{ 1686 if (flag_mask & SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_RATES) 1687 link->symmetric_rate = 1688 (flags & SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_RATES) ? 1 : 0; 1689 1690 if (flag_mask & SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_CHANNELS) 1691 link->symmetric_channels = 1692 (flags & SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_CHANNELS) ? 1693 1 : 0; 1694 1695 if (flag_mask & SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_SAMPLEBITS) 1696 link->symmetric_sample_bits = 1697 (flags & SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_SAMPLEBITS) ? 1698 1 : 0; 1699 1700 if (flag_mask & SND_SOC_TPLG_LNK_FLGBIT_VOICE_WAKEUP) 1701 link->ignore_suspend = 1702 (flags & SND_SOC_TPLG_LNK_FLGBIT_VOICE_WAKEUP) ? 1703 1 : 0; 1704} 1705 1706/* create the FE DAI link */ 1707static int soc_tplg_fe_link_create(struct soc_tplg *tplg, 1708 struct snd_soc_tplg_pcm *pcm) 1709{ 1710 struct snd_soc_dai_link *link; 1711 struct snd_soc_dai_link_component *dlc; 1712 int ret; 1713 1714 /* link + cpu + codec + platform */ 1715 link = devm_kzalloc(tplg->dev, sizeof(*link) + (3 * sizeof(*dlc)), GFP_KERNEL); 1716 if (link == NULL) 1717 return -ENOMEM; 1718 1719 dlc = (struct snd_soc_dai_link_component *)(link + 1); 1720 1721 link->cpus = &dlc[0]; 1722 link->codecs = &dlc[1]; 1723 link->platforms = &dlc[2]; 1724 1725 link->num_cpus = 1; 1726 link->num_codecs = 1; 1727 link->num_platforms = 1; 1728 1729 link->dobj.index = tplg->index; 1730 link->dobj.ops = tplg->ops; 1731 link->dobj.type = SND_SOC_DOBJ_DAI_LINK; 1732 1733 if (strlen(pcm->pcm_name)) { 1734 link->name = devm_kstrdup(tplg->dev, pcm->pcm_name, GFP_KERNEL); 1735 link->stream_name = devm_kstrdup(tplg->dev, pcm->pcm_name, GFP_KERNEL); 1736 if (!link->name || !link->stream_name) { 1737 ret = -ENOMEM; 1738 goto err; 1739 } 1740 } 1741 link->id = le32_to_cpu(pcm->pcm_id); 1742 1743 if (strlen(pcm->dai_name)) { 1744 link->cpus->dai_name = devm_kstrdup(tplg->dev, pcm->dai_name, GFP_KERNEL); 1745 if (!link->cpus->dai_name) { 1746 ret = -ENOMEM; 1747 goto err; 1748 } 1749 } 1750 1751 link->codecs->name = "snd-soc-dummy"; 1752 link->codecs->dai_name = "snd-soc-dummy-dai"; 1753 1754 link->platforms->name = "snd-soc-dummy"; 1755 1756 /* enable DPCM */ 1757 link->dynamic = 1; 1758 link->dpcm_playback = le32_to_cpu(pcm->playback); 1759 link->dpcm_capture = le32_to_cpu(pcm->capture); 1760 if (pcm->flag_mask) 1761 set_link_flags(link, 1762 le32_to_cpu(pcm->flag_mask), 1763 le32_to_cpu(pcm->flags)); 1764 1765 /* pass control to component driver for optional further init */ 1766 ret = soc_tplg_dai_link_load(tplg, link, NULL); 1767 if (ret < 0) { 1768 dev_err(tplg->dev, "ASoC: FE link loading failed\n"); 1769 goto err; 1770 } 1771 1772 ret = snd_soc_add_pcm_runtime(tplg->comp->card, link); 1773 if (ret < 0) { 1774 dev_err(tplg->dev, "ASoC: adding FE link failed\n"); 1775 goto err; 1776 } 1777 1778 list_add(&link->dobj.list, &tplg->comp->dobj_list); 1779 1780 return 0; 1781err: 1782 return ret; 1783} 1784 1785/* create a FE DAI and DAI link from the PCM object */ 1786static int soc_tplg_pcm_create(struct soc_tplg *tplg, 1787 struct snd_soc_tplg_pcm *pcm) 1788{ 1789 int ret; 1790 1791 ret = soc_tplg_dai_create(tplg, pcm); 1792 if (ret < 0) 1793 return ret; 1794 1795 return soc_tplg_fe_link_create(tplg, pcm); 1796} 1797 1798/* copy stream caps from the old version 4 of source */ 1799static void stream_caps_new_ver(struct snd_soc_tplg_stream_caps *dest, 1800 struct snd_soc_tplg_stream_caps_v4 *src) 1801{ 1802 dest->size = cpu_to_le32(sizeof(*dest)); 1803 memcpy(dest->name, src->name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN); 1804 dest->formats = src->formats; 1805 dest->rates = src->rates; 1806 dest->rate_min = src->rate_min; 1807 dest->rate_max = src->rate_max; 1808 dest->channels_min = src->channels_min; 1809 dest->channels_max = src->channels_max; 1810 dest->periods_min = src->periods_min; 1811 dest->periods_max = src->periods_max; 1812 dest->period_size_min = src->period_size_min; 1813 dest->period_size_max = src->period_size_max; 1814 dest->buffer_size_min = src->buffer_size_min; 1815 dest->buffer_size_max = src->buffer_size_max; 1816} 1817 1818/** 1819 * pcm_new_ver - Create the new version of PCM from the old version. 1820 * @tplg: topology context 1821 * @src: older version of pcm as a source 1822 * @pcm: latest version of pcm created from the source 1823 * 1824 * Support from version 4. User should free the returned pcm manually. 1825 */ 1826static int pcm_new_ver(struct soc_tplg *tplg, 1827 struct snd_soc_tplg_pcm *src, 1828 struct snd_soc_tplg_pcm **pcm) 1829{ 1830 struct snd_soc_tplg_pcm *dest; 1831 struct snd_soc_tplg_pcm_v4 *src_v4; 1832 int i; 1833 1834 *pcm = NULL; 1835 1836 if (le32_to_cpu(src->size) != sizeof(*src_v4)) { 1837 dev_err(tplg->dev, "ASoC: invalid PCM size\n"); 1838 return -EINVAL; 1839 } 1840 1841 dev_warn(tplg->dev, "ASoC: old version of PCM\n"); 1842 src_v4 = (struct snd_soc_tplg_pcm_v4 *)src; 1843 dest = kzalloc(sizeof(*dest), GFP_KERNEL); 1844 if (!dest) 1845 return -ENOMEM; 1846 1847 dest->size = cpu_to_le32(sizeof(*dest)); /* size of latest abi version */ 1848 memcpy(dest->pcm_name, src_v4->pcm_name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN); 1849 memcpy(dest->dai_name, src_v4->dai_name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN); 1850 dest->pcm_id = src_v4->pcm_id; 1851 dest->dai_id = src_v4->dai_id; 1852 dest->playback = src_v4->playback; 1853 dest->capture = src_v4->capture; 1854 dest->compress = src_v4->compress; 1855 dest->num_streams = src_v4->num_streams; 1856 for (i = 0; i < le32_to_cpu(dest->num_streams); i++) 1857 memcpy(&dest->stream[i], &src_v4->stream[i], 1858 sizeof(struct snd_soc_tplg_stream)); 1859 1860 for (i = 0; i < 2; i++) 1861 stream_caps_new_ver(&dest->caps[i], &src_v4->caps[i]); 1862 1863 *pcm = dest; 1864 return 0; 1865} 1866 1867static int soc_tplg_pcm_elems_load(struct soc_tplg *tplg, 1868 struct snd_soc_tplg_hdr *hdr) 1869{ 1870 struct snd_soc_tplg_pcm *pcm, *_pcm; 1871 int count; 1872 int size; 1873 int i; 1874 bool abi_match; 1875 int ret; 1876 1877 count = le32_to_cpu(hdr->count); 1878 1879 /* check the element size and count */ 1880 pcm = (struct snd_soc_tplg_pcm *)tplg->pos; 1881 size = le32_to_cpu(pcm->size); 1882 if (size > sizeof(struct snd_soc_tplg_pcm) 1883 || size < sizeof(struct snd_soc_tplg_pcm_v4)) { 1884 dev_err(tplg->dev, "ASoC: invalid size %d for PCM elems\n", 1885 size); 1886 return -EINVAL; 1887 } 1888 1889 if (soc_tplg_check_elem_count(tplg, 1890 size, count, 1891 le32_to_cpu(hdr->payload_size), 1892 "PCM DAI")) 1893 return -EINVAL; 1894 1895 for (i = 0; i < count; i++) { 1896 pcm = (struct snd_soc_tplg_pcm *)tplg->pos; 1897 size = le32_to_cpu(pcm->size); 1898 1899 /* check ABI version by size, create a new version of pcm 1900 * if abi not match. 1901 */ 1902 if (size == sizeof(*pcm)) { 1903 abi_match = true; 1904 _pcm = pcm; 1905 } else { 1906 abi_match = false; 1907 ret = pcm_new_ver(tplg, pcm, &_pcm); 1908 if (ret < 0) 1909 return ret; 1910 } 1911 1912 /* create the FE DAIs and DAI links */ 1913 ret = soc_tplg_pcm_create(tplg, _pcm); 1914 if (ret < 0) { 1915 if (!abi_match) 1916 kfree(_pcm); 1917 return ret; 1918 } 1919 1920 /* offset by version-specific struct size and 1921 * real priv data size 1922 */ 1923 tplg->pos += size + le32_to_cpu(_pcm->priv.size); 1924 1925 if (!abi_match) 1926 kfree(_pcm); /* free the duplicated one */ 1927 } 1928 1929 dev_dbg(tplg->dev, "ASoC: adding %d PCM DAIs\n", count); 1930 1931 return 0; 1932} 1933 1934/** 1935 * set_link_hw_format - Set the HW audio format of the physical DAI link. 1936 * @link: &snd_soc_dai_link which should be updated 1937 * @cfg: physical link configs. 1938 * 1939 * Topology context contains a list of supported HW formats (configs) and 1940 * a default format ID for the physical link. This function will use this 1941 * default ID to choose the HW format to set the link's DAI format for init. 1942 */ 1943static void set_link_hw_format(struct snd_soc_dai_link *link, 1944 struct snd_soc_tplg_link_config *cfg) 1945{ 1946 struct snd_soc_tplg_hw_config *hw_config; 1947 unsigned char bclk_provider, fsync_provider; 1948 unsigned char invert_bclk, invert_fsync; 1949 int i; 1950 1951 for (i = 0; i < le32_to_cpu(cfg->num_hw_configs); i++) { 1952 hw_config = &cfg->hw_config[i]; 1953 if (hw_config->id != cfg->default_hw_config_id) 1954 continue; 1955 1956 link->dai_fmt = le32_to_cpu(hw_config->fmt) & 1957 SND_SOC_DAIFMT_FORMAT_MASK; 1958 1959 /* clock gating */ 1960 switch (hw_config->clock_gated) { 1961 case SND_SOC_TPLG_DAI_CLK_GATE_GATED: 1962 link->dai_fmt |= SND_SOC_DAIFMT_GATED; 1963 break; 1964 1965 case SND_SOC_TPLG_DAI_CLK_GATE_CONT: 1966 link->dai_fmt |= SND_SOC_DAIFMT_CONT; 1967 break; 1968 1969 default: 1970 /* ignore the value */ 1971 break; 1972 } 1973 1974 /* clock signal polarity */ 1975 invert_bclk = hw_config->invert_bclk; 1976 invert_fsync = hw_config->invert_fsync; 1977 if (!invert_bclk && !invert_fsync) 1978 link->dai_fmt |= SND_SOC_DAIFMT_NB_NF; 1979 else if (!invert_bclk && invert_fsync) 1980 link->dai_fmt |= SND_SOC_DAIFMT_NB_IF; 1981 else if (invert_bclk && !invert_fsync) 1982 link->dai_fmt |= SND_SOC_DAIFMT_IB_NF; 1983 else 1984 link->dai_fmt |= SND_SOC_DAIFMT_IB_IF; 1985 1986 /* clock masters */ 1987 bclk_provider = (hw_config->bclk_provider == 1988 SND_SOC_TPLG_BCLK_CP); 1989 fsync_provider = (hw_config->fsync_provider == 1990 SND_SOC_TPLG_FSYNC_CP); 1991 if (bclk_provider && fsync_provider) 1992 link->dai_fmt |= SND_SOC_DAIFMT_CBP_CFP; 1993 else if (!bclk_provider && fsync_provider) 1994 link->dai_fmt |= SND_SOC_DAIFMT_CBC_CFP; 1995 else if (bclk_provider && !fsync_provider) 1996 link->dai_fmt |= SND_SOC_DAIFMT_CBP_CFC; 1997 else 1998 link->dai_fmt |= SND_SOC_DAIFMT_CBC_CFC; 1999 } 2000} 2001 2002/** 2003 * link_new_ver - Create a new physical link config from the old 2004 * version of source. 2005 * @tplg: topology context 2006 * @src: old version of phyical link config as a source 2007 * @link: latest version of physical link config created from the source 2008 * 2009 * Support from version 4. User need free the returned link config manually. 2010 */ 2011static int link_new_ver(struct soc_tplg *tplg, 2012 struct snd_soc_tplg_link_config *src, 2013 struct snd_soc_tplg_link_config **link) 2014{ 2015 struct snd_soc_tplg_link_config *dest; 2016 struct snd_soc_tplg_link_config_v4 *src_v4; 2017 int i; 2018 2019 *link = NULL; 2020 2021 if (le32_to_cpu(src->size) != 2022 sizeof(struct snd_soc_tplg_link_config_v4)) { 2023 dev_err(tplg->dev, "ASoC: invalid physical link config size\n"); 2024 return -EINVAL; 2025 } 2026 2027 dev_warn(tplg->dev, "ASoC: old version of physical link config\n"); 2028 2029 src_v4 = (struct snd_soc_tplg_link_config_v4 *)src; 2030 dest = kzalloc(sizeof(*dest), GFP_KERNEL); 2031 if (!dest) 2032 return -ENOMEM; 2033 2034 dest->size = cpu_to_le32(sizeof(*dest)); 2035 dest->id = src_v4->id; 2036 dest->num_streams = src_v4->num_streams; 2037 for (i = 0; i < le32_to_cpu(dest->num_streams); i++) 2038 memcpy(&dest->stream[i], &src_v4->stream[i], 2039 sizeof(struct snd_soc_tplg_stream)); 2040 2041 *link = dest; 2042 return 0; 2043} 2044 2045/** 2046 * snd_soc_find_dai_link - Find a DAI link 2047 * 2048 * @card: soc card 2049 * @id: DAI link ID to match 2050 * @name: DAI link name to match, optional 2051 * @stream_name: DAI link stream name to match, optional 2052 * 2053 * This function will search all existing DAI links of the soc card to 2054 * find the link of the same ID. Since DAI links may not have their 2055 * unique ID, so name and stream name should also match if being 2056 * specified. 2057 * 2058 * Return: pointer of DAI link, or NULL if not found. 2059 */ 2060static struct snd_soc_dai_link *snd_soc_find_dai_link(struct snd_soc_card *card, 2061 int id, const char *name, 2062 const char *stream_name) 2063{ 2064 struct snd_soc_pcm_runtime *rtd; 2065 2066 for_each_card_rtds(card, rtd) { 2067 struct snd_soc_dai_link *link = rtd->dai_link; 2068 2069 if (link->id != id) 2070 continue; 2071 2072 if (name && (!link->name || strcmp(name, link->name))) 2073 continue; 2074 2075 if (stream_name && (!link->stream_name 2076 || strcmp(stream_name, link->stream_name))) 2077 continue; 2078 2079 return link; 2080 } 2081 2082 return NULL; 2083} 2084 2085/* Find and configure an existing physical DAI link */ 2086static int soc_tplg_link_config(struct soc_tplg *tplg, 2087 struct snd_soc_tplg_link_config *cfg) 2088{ 2089 struct snd_soc_dai_link *link; 2090 const char *name, *stream_name; 2091 size_t len; 2092 int ret; 2093 2094 len = strnlen(cfg->name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN); 2095 if (len == SNDRV_CTL_ELEM_ID_NAME_MAXLEN) 2096 return -EINVAL; 2097 else if (len) 2098 name = cfg->name; 2099 else 2100 name = NULL; 2101 2102 len = strnlen(cfg->stream_name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN); 2103 if (len == SNDRV_CTL_ELEM_ID_NAME_MAXLEN) 2104 return -EINVAL; 2105 else if (len) 2106 stream_name = cfg->stream_name; 2107 else 2108 stream_name = NULL; 2109 2110 link = snd_soc_find_dai_link(tplg->comp->card, le32_to_cpu(cfg->id), 2111 name, stream_name); 2112 if (!link) { 2113 dev_err(tplg->dev, "ASoC: physical link %s (id %d) not exist\n", 2114 name, cfg->id); 2115 return -EINVAL; 2116 } 2117 2118 /* hw format */ 2119 if (cfg->num_hw_configs) 2120 set_link_hw_format(link, cfg); 2121 2122 /* flags */ 2123 if (cfg->flag_mask) 2124 set_link_flags(link, 2125 le32_to_cpu(cfg->flag_mask), 2126 le32_to_cpu(cfg->flags)); 2127 2128 /* pass control to component driver for optional further init */ 2129 ret = soc_tplg_dai_link_load(tplg, link, cfg); 2130 if (ret < 0) { 2131 dev_err(tplg->dev, "ASoC: physical link loading failed\n"); 2132 return ret; 2133 } 2134 2135 /* for unloading it in snd_soc_tplg_component_remove */ 2136 link->dobj.index = tplg->index; 2137 link->dobj.ops = tplg->ops; 2138 link->dobj.type = SND_SOC_DOBJ_BACKEND_LINK; 2139 list_add(&link->dobj.list, &tplg->comp->dobj_list); 2140 2141 return 0; 2142} 2143 2144 2145/* Load physical link config elements from the topology context */ 2146static int soc_tplg_link_elems_load(struct soc_tplg *tplg, 2147 struct snd_soc_tplg_hdr *hdr) 2148{ 2149 struct snd_soc_tplg_link_config *link, *_link; 2150 int count; 2151 int size; 2152 int i, ret; 2153 bool abi_match; 2154 2155 count = le32_to_cpu(hdr->count); 2156 2157 /* check the element size and count */ 2158 link = (struct snd_soc_tplg_link_config *)tplg->pos; 2159 size = le32_to_cpu(link->size); 2160 if (size > sizeof(struct snd_soc_tplg_link_config) 2161 || size < sizeof(struct snd_soc_tplg_link_config_v4)) { 2162 dev_err(tplg->dev, "ASoC: invalid size %d for physical link elems\n", 2163 size); 2164 return -EINVAL; 2165 } 2166 2167 if (soc_tplg_check_elem_count(tplg, size, count, 2168 le32_to_cpu(hdr->payload_size), 2169 "physical link config")) 2170 return -EINVAL; 2171 2172 /* config physical DAI links */ 2173 for (i = 0; i < count; i++) { 2174 link = (struct snd_soc_tplg_link_config *)tplg->pos; 2175 size = le32_to_cpu(link->size); 2176 if (size == sizeof(*link)) { 2177 abi_match = true; 2178 _link = link; 2179 } else { 2180 abi_match = false; 2181 ret = link_new_ver(tplg, link, &_link); 2182 if (ret < 0) 2183 return ret; 2184 } 2185 2186 ret = soc_tplg_link_config(tplg, _link); 2187 if (ret < 0) { 2188 if (!abi_match) 2189 kfree(_link); 2190 return ret; 2191 } 2192 2193 /* offset by version-specific struct size and 2194 * real priv data size 2195 */ 2196 tplg->pos += size + le32_to_cpu(_link->priv.size); 2197 2198 if (!abi_match) 2199 kfree(_link); /* free the duplicated one */ 2200 } 2201 2202 return 0; 2203} 2204 2205/** 2206 * soc_tplg_dai_config - Find and configure an existing physical DAI. 2207 * @tplg: topology context 2208 * @d: physical DAI configs. 2209 * 2210 * The physical dai should already be registered by the platform driver. 2211 * The platform driver should specify the DAI name and ID for matching. 2212 */ 2213static int soc_tplg_dai_config(struct soc_tplg *tplg, 2214 struct snd_soc_tplg_dai *d) 2215{ 2216 struct snd_soc_dai_link_component dai_component; 2217 struct snd_soc_dai *dai; 2218 struct snd_soc_dai_driver *dai_drv; 2219 struct snd_soc_pcm_stream *stream; 2220 struct snd_soc_tplg_stream_caps *caps; 2221 int ret; 2222 2223 memset(&dai_component, 0, sizeof(dai_component)); 2224 2225 dai_component.dai_name = d->dai_name; 2226 dai = snd_soc_find_dai(&dai_component); 2227 if (!dai) { 2228 dev_err(tplg->dev, "ASoC: physical DAI %s not registered\n", 2229 d->dai_name); 2230 return -EINVAL; 2231 } 2232 2233 if (le32_to_cpu(d->dai_id) != dai->id) { 2234 dev_err(tplg->dev, "ASoC: physical DAI %s id mismatch\n", 2235 d->dai_name); 2236 return -EINVAL; 2237 } 2238 2239 dai_drv = dai->driver; 2240 if (!dai_drv) 2241 return -EINVAL; 2242 2243 if (d->playback) { 2244 stream = &dai_drv->playback; 2245 caps = &d->caps[SND_SOC_TPLG_STREAM_PLAYBACK]; 2246 ret = set_stream_info(tplg, stream, caps); 2247 if (ret < 0) 2248 goto err; 2249 } 2250 2251 if (d->capture) { 2252 stream = &dai_drv->capture; 2253 caps = &d->caps[SND_SOC_TPLG_STREAM_CAPTURE]; 2254 ret = set_stream_info(tplg, stream, caps); 2255 if (ret < 0) 2256 goto err; 2257 } 2258 2259 if (d->flag_mask) 2260 set_dai_flags(dai_drv, 2261 le32_to_cpu(d->flag_mask), 2262 le32_to_cpu(d->flags)); 2263 2264 /* pass control to component driver for optional further init */ 2265 ret = soc_tplg_dai_load(tplg, dai_drv, NULL, dai); 2266 if (ret < 0) { 2267 dev_err(tplg->dev, "ASoC: DAI loading failed\n"); 2268 goto err; 2269 } 2270 2271 return 0; 2272 2273err: 2274 return ret; 2275} 2276 2277/* load physical DAI elements */ 2278static int soc_tplg_dai_elems_load(struct soc_tplg *tplg, 2279 struct snd_soc_tplg_hdr *hdr) 2280{ 2281 int count; 2282 int i; 2283 2284 count = le32_to_cpu(hdr->count); 2285 2286 /* config the existing BE DAIs */ 2287 for (i = 0; i < count; i++) { 2288 struct snd_soc_tplg_dai *dai = (struct snd_soc_tplg_dai *)tplg->pos; 2289 int ret; 2290 2291 if (le32_to_cpu(dai->size) != sizeof(*dai)) { 2292 dev_err(tplg->dev, "ASoC: invalid physical DAI size\n"); 2293 return -EINVAL; 2294 } 2295 2296 ret = soc_tplg_dai_config(tplg, dai); 2297 if (ret < 0) { 2298 dev_err(tplg->dev, "ASoC: failed to configure DAI\n"); 2299 return ret; 2300 } 2301 2302 tplg->pos += (sizeof(*dai) + le32_to_cpu(dai->priv.size)); 2303 } 2304 2305 dev_dbg(tplg->dev, "ASoC: Configure %d BE DAIs\n", count); 2306 return 0; 2307} 2308 2309/** 2310 * manifest_new_ver - Create a new version of manifest from the old version 2311 * of source. 2312 * @tplg: topology context 2313 * @src: old version of manifest as a source 2314 * @manifest: latest version of manifest created from the source 2315 * 2316 * Support from version 4. Users need free the returned manifest manually. 2317 */ 2318static int manifest_new_ver(struct soc_tplg *tplg, 2319 struct snd_soc_tplg_manifest *src, 2320 struct snd_soc_tplg_manifest **manifest) 2321{ 2322 struct snd_soc_tplg_manifest *dest; 2323 struct snd_soc_tplg_manifest_v4 *src_v4; 2324 int size; 2325 2326 *manifest = NULL; 2327 2328 size = le32_to_cpu(src->size); 2329 if (size != sizeof(*src_v4)) { 2330 dev_warn(tplg->dev, "ASoC: invalid manifest size %d\n", 2331 size); 2332 if (size) 2333 return -EINVAL; 2334 src->size = cpu_to_le32(sizeof(*src_v4)); 2335 } 2336 2337 dev_warn(tplg->dev, "ASoC: old version of manifest\n"); 2338 2339 src_v4 = (struct snd_soc_tplg_manifest_v4 *)src; 2340 dest = kzalloc(sizeof(*dest) + le32_to_cpu(src_v4->priv.size), 2341 GFP_KERNEL); 2342 if (!dest) 2343 return -ENOMEM; 2344 2345 dest->size = cpu_to_le32(sizeof(*dest)); /* size of latest abi version */ 2346 dest->control_elems = src_v4->control_elems; 2347 dest->widget_elems = src_v4->widget_elems; 2348 dest->graph_elems = src_v4->graph_elems; 2349 dest->pcm_elems = src_v4->pcm_elems; 2350 dest->dai_link_elems = src_v4->dai_link_elems; 2351 dest->priv.size = src_v4->priv.size; 2352 if (dest->priv.size) 2353 memcpy(dest->priv.data, src_v4->priv.data, 2354 le32_to_cpu(src_v4->priv.size)); 2355 2356 *manifest = dest; 2357 return 0; 2358} 2359 2360static int soc_tplg_manifest_load(struct soc_tplg *tplg, 2361 struct snd_soc_tplg_hdr *hdr) 2362{ 2363 struct snd_soc_tplg_manifest *manifest, *_manifest; 2364 bool abi_match; 2365 int ret = 0; 2366 2367 manifest = (struct snd_soc_tplg_manifest *)tplg->pos; 2368 2369 /* check ABI version by size, create a new manifest if abi not match */ 2370 if (le32_to_cpu(manifest->size) == sizeof(*manifest)) { 2371 abi_match = true; 2372 _manifest = manifest; 2373 } else { 2374 abi_match = false; 2375 2376 ret = manifest_new_ver(tplg, manifest, &_manifest); 2377 if (ret < 0) 2378 return ret; 2379 } 2380 2381 /* pass control to component driver for optional further init */ 2382 if (tplg->ops && tplg->ops->manifest) 2383 ret = tplg->ops->manifest(tplg->comp, tplg->index, _manifest); 2384 2385 if (!abi_match) /* free the duplicated one */ 2386 kfree(_manifest); 2387 2388 return ret; 2389} 2390 2391/* validate header magic, size and type */ 2392static int soc_valid_header(struct soc_tplg *tplg, 2393 struct snd_soc_tplg_hdr *hdr) 2394{ 2395 if (soc_tplg_get_hdr_offset(tplg) >= tplg->fw->size) 2396 return 0; 2397 2398 if (le32_to_cpu(hdr->size) != sizeof(*hdr)) { 2399 dev_err(tplg->dev, 2400 "ASoC: invalid header size for type %d at offset 0x%lx size 0x%zx.\n", 2401 le32_to_cpu(hdr->type), soc_tplg_get_hdr_offset(tplg), 2402 tplg->fw->size); 2403 return -EINVAL; 2404 } 2405 2406 if (soc_tplg_get_hdr_offset(tplg) + hdr->payload_size >= tplg->fw->size) { 2407 dev_err(tplg->dev, 2408 "ASoC: invalid header of type %d at offset %ld payload_size %d\n", 2409 le32_to_cpu(hdr->type), soc_tplg_get_hdr_offset(tplg), 2410 hdr->payload_size); 2411 return -EINVAL; 2412 } 2413 2414 /* big endian firmware objects not supported atm */ 2415 if (le32_to_cpu(hdr->magic) == SOC_TPLG_MAGIC_BIG_ENDIAN) { 2416 dev_err(tplg->dev, 2417 "ASoC: pass %d big endian not supported header got %x at offset 0x%lx size 0x%zx.\n", 2418 tplg->pass, hdr->magic, 2419 soc_tplg_get_hdr_offset(tplg), tplg->fw->size); 2420 return -EINVAL; 2421 } 2422 2423 if (le32_to_cpu(hdr->magic) != SND_SOC_TPLG_MAGIC) { 2424 dev_err(tplg->dev, 2425 "ASoC: pass %d does not have a valid header got %x at offset 0x%lx size 0x%zx.\n", 2426 tplg->pass, hdr->magic, 2427 soc_tplg_get_hdr_offset(tplg), tplg->fw->size); 2428 return -EINVAL; 2429 } 2430 2431 /* Support ABI from version 4 */ 2432 if (le32_to_cpu(hdr->abi) > SND_SOC_TPLG_ABI_VERSION || 2433 le32_to_cpu(hdr->abi) < SND_SOC_TPLG_ABI_VERSION_MIN) { 2434 dev_err(tplg->dev, 2435 "ASoC: pass %d invalid ABI version got 0x%x need 0x%x at offset 0x%lx size 0x%zx.\n", 2436 tplg->pass, hdr->abi, 2437 SND_SOC_TPLG_ABI_VERSION, soc_tplg_get_hdr_offset(tplg), 2438 tplg->fw->size); 2439 return -EINVAL; 2440 } 2441 2442 if (hdr->payload_size == 0) { 2443 dev_err(tplg->dev, "ASoC: header has 0 size at offset 0x%lx.\n", 2444 soc_tplg_get_hdr_offset(tplg)); 2445 return -EINVAL; 2446 } 2447 2448 return 1; 2449} 2450 2451/* check header type and call appropriate handler */ 2452static int soc_tplg_load_header(struct soc_tplg *tplg, 2453 struct snd_soc_tplg_hdr *hdr) 2454{ 2455 int (*elem_load)(struct soc_tplg *tplg, 2456 struct snd_soc_tplg_hdr *hdr); 2457 unsigned int hdr_pass; 2458 2459 tplg->pos = tplg->hdr_pos + sizeof(struct snd_soc_tplg_hdr); 2460 2461 tplg->index = le32_to_cpu(hdr->index); 2462 2463 switch (le32_to_cpu(hdr->type)) { 2464 case SND_SOC_TPLG_TYPE_MIXER: 2465 case SND_SOC_TPLG_TYPE_ENUM: 2466 case SND_SOC_TPLG_TYPE_BYTES: 2467 hdr_pass = SOC_TPLG_PASS_CONTROL; 2468 elem_load = soc_tplg_kcontrol_elems_load; 2469 break; 2470 case SND_SOC_TPLG_TYPE_DAPM_GRAPH: 2471 hdr_pass = SOC_TPLG_PASS_GRAPH; 2472 elem_load = soc_tplg_dapm_graph_elems_load; 2473 break; 2474 case SND_SOC_TPLG_TYPE_DAPM_WIDGET: 2475 hdr_pass = SOC_TPLG_PASS_WIDGET; 2476 elem_load = soc_tplg_dapm_widget_elems_load; 2477 break; 2478 case SND_SOC_TPLG_TYPE_PCM: 2479 hdr_pass = SOC_TPLG_PASS_PCM_DAI; 2480 elem_load = soc_tplg_pcm_elems_load; 2481 break; 2482 case SND_SOC_TPLG_TYPE_DAI: 2483 hdr_pass = SOC_TPLG_PASS_BE_DAI; 2484 elem_load = soc_tplg_dai_elems_load; 2485 break; 2486 case SND_SOC_TPLG_TYPE_DAI_LINK: 2487 case SND_SOC_TPLG_TYPE_BACKEND_LINK: 2488 /* physical link configurations */ 2489 hdr_pass = SOC_TPLG_PASS_LINK; 2490 elem_load = soc_tplg_link_elems_load; 2491 break; 2492 case SND_SOC_TPLG_TYPE_MANIFEST: 2493 hdr_pass = SOC_TPLG_PASS_MANIFEST; 2494 elem_load = soc_tplg_manifest_load; 2495 break; 2496 default: 2497 /* bespoke vendor data object */ 2498 hdr_pass = SOC_TPLG_PASS_VENDOR; 2499 elem_load = soc_tplg_vendor_load; 2500 break; 2501 } 2502 2503 if (tplg->pass == hdr_pass) { 2504 dev_dbg(tplg->dev, 2505 "ASoC: Got 0x%x bytes of type %d version %d vendor %d at pass %d\n", 2506 hdr->payload_size, hdr->type, hdr->version, 2507 hdr->vendor_type, tplg->pass); 2508 return elem_load(tplg, hdr); 2509 } 2510 2511 return 0; 2512} 2513 2514/* process the topology file headers */ 2515static int soc_tplg_process_headers(struct soc_tplg *tplg) 2516{ 2517 int ret; 2518 2519 /* process the header types from start to end */ 2520 for (tplg->pass = SOC_TPLG_PASS_START; tplg->pass <= SOC_TPLG_PASS_END; tplg->pass++) { 2521 struct snd_soc_tplg_hdr *hdr; 2522 2523 tplg->hdr_pos = tplg->fw->data; 2524 hdr = (struct snd_soc_tplg_hdr *)tplg->hdr_pos; 2525 2526 while (!soc_tplg_is_eof(tplg)) { 2527 2528 /* make sure header is valid before loading */ 2529 ret = soc_valid_header(tplg, hdr); 2530 if (ret < 0) { 2531 dev_err(tplg->dev, 2532 "ASoC: topology: invalid header: %d\n", ret); 2533 return ret; 2534 } else if (ret == 0) { 2535 break; 2536 } 2537 2538 /* load the header object */ 2539 ret = soc_tplg_load_header(tplg, hdr); 2540 if (ret < 0) { 2541 dev_err(tplg->dev, 2542 "ASoC: topology: could not load header: %d\n", ret); 2543 return ret; 2544 } 2545 2546 /* goto next header */ 2547 tplg->hdr_pos += le32_to_cpu(hdr->payload_size) + 2548 sizeof(struct snd_soc_tplg_hdr); 2549 hdr = (struct snd_soc_tplg_hdr *)tplg->hdr_pos; 2550 } 2551 2552 } 2553 2554 /* signal DAPM we are complete */ 2555 ret = soc_tplg_dapm_complete(tplg); 2556 if (ret < 0) 2557 dev_err(tplg->dev, 2558 "ASoC: failed to initialise DAPM from Firmware\n"); 2559 2560 return ret; 2561} 2562 2563static int soc_tplg_load(struct soc_tplg *tplg) 2564{ 2565 int ret; 2566 2567 ret = soc_tplg_process_headers(tplg); 2568 if (ret == 0) 2569 return soc_tplg_complete(tplg); 2570 2571 return ret; 2572} 2573 2574/* load audio component topology from "firmware" file */ 2575int snd_soc_tplg_component_load(struct snd_soc_component *comp, 2576 struct snd_soc_tplg_ops *ops, const struct firmware *fw) 2577{ 2578 struct soc_tplg tplg; 2579 int ret; 2580 2581 /* 2582 * check if we have sane parameters: 2583 * comp - needs to exist to keep and reference data while parsing 2584 * comp->card - used for setting card related parameters 2585 * comp->card->dev - used for resource management and prints 2586 * fw - we need it, as it is the very thing we parse 2587 */ 2588 if (!comp || !comp->card || !comp->card->dev || !fw) 2589 return -EINVAL; 2590 2591 /* setup parsing context */ 2592 memset(&tplg, 0, sizeof(tplg)); 2593 tplg.fw = fw; 2594 tplg.dev = comp->card->dev; 2595 tplg.comp = comp; 2596 if (ops) { 2597 tplg.ops = ops; 2598 tplg.io_ops = ops->io_ops; 2599 tplg.io_ops_count = ops->io_ops_count; 2600 tplg.bytes_ext_ops = ops->bytes_ext_ops; 2601 tplg.bytes_ext_ops_count = ops->bytes_ext_ops_count; 2602 } 2603 2604 ret = soc_tplg_load(&tplg); 2605 /* free the created components if fail to load topology */ 2606 if (ret) 2607 snd_soc_tplg_component_remove(comp); 2608 2609 return ret; 2610} 2611EXPORT_SYMBOL_GPL(snd_soc_tplg_component_load); 2612 2613/* remove dynamic controls from the component driver */ 2614int snd_soc_tplg_component_remove(struct snd_soc_component *comp) 2615{ 2616 struct snd_card *card = comp->card->snd_card; 2617 struct snd_soc_dobj *dobj, *next_dobj; 2618 int pass; 2619 2620 /* process the header types from end to start */ 2621 for (pass = SOC_TPLG_PASS_END; pass >= SOC_TPLG_PASS_START; pass--) { 2622 2623 /* remove mixer controls */ 2624 down_write(&card->controls_rwsem); 2625 list_for_each_entry_safe(dobj, next_dobj, &comp->dobj_list, 2626 list) { 2627 2628 switch (dobj->type) { 2629 case SND_SOC_DOBJ_MIXER: 2630 remove_mixer(comp, dobj, pass); 2631 break; 2632 case SND_SOC_DOBJ_ENUM: 2633 remove_enum(comp, dobj, pass); 2634 break; 2635 case SND_SOC_DOBJ_BYTES: 2636 remove_bytes(comp, dobj, pass); 2637 break; 2638 case SND_SOC_DOBJ_GRAPH: 2639 remove_route(comp, dobj, pass); 2640 break; 2641 case SND_SOC_DOBJ_WIDGET: 2642 remove_widget(comp, dobj, pass); 2643 break; 2644 case SND_SOC_DOBJ_PCM: 2645 remove_dai(comp, dobj, pass); 2646 break; 2647 case SND_SOC_DOBJ_DAI_LINK: 2648 remove_link(comp, dobj, pass); 2649 break; 2650 case SND_SOC_DOBJ_BACKEND_LINK: 2651 /* 2652 * call link_unload ops if extra 2653 * deinitialization is needed. 2654 */ 2655 remove_backend_link(comp, dobj, pass); 2656 break; 2657 default: 2658 dev_err(comp->dev, "ASoC: invalid component type %d for removal\n", 2659 dobj->type); 2660 break; 2661 } 2662 } 2663 up_write(&card->controls_rwsem); 2664 } 2665 2666 /* let caller know if FW can be freed when no objects are left */ 2667 return !list_empty(&comp->dobj_list); 2668} 2669EXPORT_SYMBOL_GPL(snd_soc_tplg_component_remove);