Linux Audio

Check our new training course

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