1 // SPDX-License-Identifier: GPL-2.0+
3 // soc-topology.c -- ALSA SoC Topology
5 // Copyright (C) 2012 Texas Instruments Inc.
6 // Copyright (C) 2015 Intel Corporation.
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>
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.
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.
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>
33 #define SOC_TPLG_MAGIC_BIG_ENDIAN 0x436F5341 /* ASoC in reverse */
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).
41 #define SOC_TPLG_PASS_MANIFEST 0
42 #define SOC_TPLG_PASS_VENDOR 1
43 #define SOC_TPLG_PASS_CONTROL 2
44 #define SOC_TPLG_PASS_WIDGET 3
45 #define SOC_TPLG_PASS_PCM_DAI 4
46 #define SOC_TPLG_PASS_GRAPH 5
47 #define SOC_TPLG_PASS_BE_DAI 6
48 #define SOC_TPLG_PASS_LINK 7
50 #define SOC_TPLG_PASS_START SOC_TPLG_PASS_MANIFEST
51 #define SOC_TPLG_PASS_END SOC_TPLG_PASS_LINK
53 /* topology context */
55 const struct firmware
*fw
;
57 /* runtime FW parsing */
58 const u8
*pos
; /* read position */
59 const u8
*hdr_pos
; /* header position */
60 unsigned int pass
; /* pass number */
62 /* component caller */
64 struct snd_soc_component
*comp
;
65 u32 index
; /* current block index */
67 /* vendor specific kcontrol operations */
68 const struct snd_soc_tplg_kcontrol_ops
*io_ops
;
71 /* vendor specific bytes ext handlers, for TLV bytes controls */
72 const struct snd_soc_tplg_bytes_ext_ops
*bytes_ext_ops
;
73 int bytes_ext_ops_count
;
75 /* optional fw loading callbacks to component drivers */
76 const struct snd_soc_tplg_ops
*ops
;
79 /* check we dont overflow the data for this control chunk */
80 static int soc_tplg_check_elem_count(struct soc_tplg
*tplg
, size_t elem_size
,
81 unsigned int count
, size_t bytes
, const char *elem_type
)
83 const u8
*end
= tplg
->pos
+ elem_size
* count
;
85 if (end
> tplg
->fw
->data
+ tplg
->fw
->size
) {
86 dev_err(tplg
->dev
, "ASoC: %s overflow end of data\n",
91 /* check there is enough room in chunk for control.
92 extra bytes at the end of control are for vendor data here */
93 if (elem_size
* count
> bytes
) {
95 "ASoC: %s count %d of size %zu is bigger than chunk %zu\n",
96 elem_type
, count
, elem_size
, bytes
);
103 static inline bool soc_tplg_is_eof(struct soc_tplg
*tplg
)
105 const u8
*end
= tplg
->hdr_pos
;
107 if (end
>= tplg
->fw
->data
+ tplg
->fw
->size
)
112 static inline unsigned long soc_tplg_get_hdr_offset(struct soc_tplg
*tplg
)
114 return (unsigned long)(tplg
->hdr_pos
- tplg
->fw
->data
);
117 static inline unsigned long soc_tplg_get_offset(struct soc_tplg
*tplg
)
119 return (unsigned long)(tplg
->pos
- tplg
->fw
->data
);
122 /* mapping of Kcontrol types and associated operations. */
123 static const struct snd_soc_tplg_kcontrol_ops io_ops
[] = {
124 {SND_SOC_TPLG_CTL_VOLSW
, snd_soc_get_volsw
,
125 snd_soc_put_volsw
, snd_soc_info_volsw
},
126 {SND_SOC_TPLG_CTL_VOLSW_SX
, snd_soc_get_volsw_sx
,
127 snd_soc_put_volsw_sx
, NULL
},
128 {SND_SOC_TPLG_CTL_ENUM
, snd_soc_get_enum_double
,
129 snd_soc_put_enum_double
, snd_soc_info_enum_double
},
130 {SND_SOC_TPLG_CTL_ENUM_VALUE
, snd_soc_get_enum_double
,
131 snd_soc_put_enum_double
, NULL
},
132 {SND_SOC_TPLG_CTL_BYTES
, snd_soc_bytes_get
,
133 snd_soc_bytes_put
, snd_soc_bytes_info
},
134 {SND_SOC_TPLG_CTL_RANGE
, snd_soc_get_volsw_range
,
135 snd_soc_put_volsw_range
, snd_soc_info_volsw_range
},
136 {SND_SOC_TPLG_CTL_VOLSW_XR_SX
, snd_soc_get_xr_sx
,
137 snd_soc_put_xr_sx
, snd_soc_info_xr_sx
},
138 {SND_SOC_TPLG_CTL_STROBE
, snd_soc_get_strobe
,
139 snd_soc_put_strobe
, NULL
},
140 {SND_SOC_TPLG_DAPM_CTL_VOLSW
, snd_soc_dapm_get_volsw
,
141 snd_soc_dapm_put_volsw
, snd_soc_info_volsw
},
142 {SND_SOC_TPLG_DAPM_CTL_ENUM_DOUBLE
, snd_soc_dapm_get_enum_double
,
143 snd_soc_dapm_put_enum_double
, snd_soc_info_enum_double
},
144 {SND_SOC_TPLG_DAPM_CTL_ENUM_VIRT
, snd_soc_dapm_get_enum_double
,
145 snd_soc_dapm_put_enum_double
, NULL
},
146 {SND_SOC_TPLG_DAPM_CTL_ENUM_VALUE
, snd_soc_dapm_get_enum_double
,
147 snd_soc_dapm_put_enum_double
, NULL
},
148 {SND_SOC_TPLG_DAPM_CTL_PIN
, snd_soc_dapm_get_pin_switch
,
149 snd_soc_dapm_put_pin_switch
, snd_soc_dapm_info_pin_switch
},
152 struct soc_tplg_map
{
157 /* mapping of widget types from UAPI IDs to kernel IDs */
158 static const struct soc_tplg_map dapm_map
[] = {
159 {SND_SOC_TPLG_DAPM_INPUT
, snd_soc_dapm_input
},
160 {SND_SOC_TPLG_DAPM_OUTPUT
, snd_soc_dapm_output
},
161 {SND_SOC_TPLG_DAPM_MUX
, snd_soc_dapm_mux
},
162 {SND_SOC_TPLG_DAPM_MIXER
, snd_soc_dapm_mixer
},
163 {SND_SOC_TPLG_DAPM_PGA
, snd_soc_dapm_pga
},
164 {SND_SOC_TPLG_DAPM_OUT_DRV
, snd_soc_dapm_out_drv
},
165 {SND_SOC_TPLG_DAPM_ADC
, snd_soc_dapm_adc
},
166 {SND_SOC_TPLG_DAPM_DAC
, snd_soc_dapm_dac
},
167 {SND_SOC_TPLG_DAPM_SWITCH
, snd_soc_dapm_switch
},
168 {SND_SOC_TPLG_DAPM_PRE
, snd_soc_dapm_pre
},
169 {SND_SOC_TPLG_DAPM_POST
, snd_soc_dapm_post
},
170 {SND_SOC_TPLG_DAPM_AIF_IN
, snd_soc_dapm_aif_in
},
171 {SND_SOC_TPLG_DAPM_AIF_OUT
, snd_soc_dapm_aif_out
},
172 {SND_SOC_TPLG_DAPM_DAI_IN
, snd_soc_dapm_dai_in
},
173 {SND_SOC_TPLG_DAPM_DAI_OUT
, snd_soc_dapm_dai_out
},
174 {SND_SOC_TPLG_DAPM_DAI_LINK
, snd_soc_dapm_dai_link
},
175 {SND_SOC_TPLG_DAPM_BUFFER
, snd_soc_dapm_buffer
},
176 {SND_SOC_TPLG_DAPM_SCHEDULER
, snd_soc_dapm_scheduler
},
177 {SND_SOC_TPLG_DAPM_EFFECT
, snd_soc_dapm_effect
},
178 {SND_SOC_TPLG_DAPM_SIGGEN
, snd_soc_dapm_siggen
},
179 {SND_SOC_TPLG_DAPM_SRC
, snd_soc_dapm_src
},
180 {SND_SOC_TPLG_DAPM_ASRC
, snd_soc_dapm_asrc
},
181 {SND_SOC_TPLG_DAPM_ENCODER
, snd_soc_dapm_encoder
},
182 {SND_SOC_TPLG_DAPM_DECODER
, snd_soc_dapm_decoder
},
185 static int tplg_chan_get_reg(struct soc_tplg
*tplg
,
186 struct snd_soc_tplg_channel
*chan
, int map
)
190 for (i
= 0; i
< SND_SOC_TPLG_MAX_CHAN
; i
++) {
191 if (le32_to_cpu(chan
[i
].id
) == map
)
192 return le32_to_cpu(chan
[i
].reg
);
198 static int tplg_chan_get_shift(struct soc_tplg
*tplg
,
199 struct snd_soc_tplg_channel
*chan
, int map
)
203 for (i
= 0; i
< SND_SOC_TPLG_MAX_CHAN
; i
++) {
204 if (le32_to_cpu(chan
[i
].id
) == map
)
205 return le32_to_cpu(chan
[i
].shift
);
211 static int get_widget_id(int tplg_type
)
215 for (i
= 0; i
< ARRAY_SIZE(dapm_map
); i
++) {
216 if (tplg_type
== dapm_map
[i
].uid
)
217 return dapm_map
[i
].kid
;
223 static inline void soc_bind_err(struct soc_tplg
*tplg
,
224 struct snd_soc_tplg_ctl_hdr
*hdr
, int index
)
227 "ASoC: invalid control type (g,p,i) %d:%d:%d index %d at 0x%lx\n",
228 hdr
->ops
.get
, hdr
->ops
.put
, hdr
->ops
.info
, index
,
229 soc_tplg_get_offset(tplg
));
232 static inline void soc_control_err(struct soc_tplg
*tplg
,
233 struct snd_soc_tplg_ctl_hdr
*hdr
, const char *name
)
236 "ASoC: no complete control IO handler for %s type (g,p,i) %d:%d:%d at 0x%lx\n",
237 name
, hdr
->ops
.get
, hdr
->ops
.put
, hdr
->ops
.info
,
238 soc_tplg_get_offset(tplg
));
241 /* pass vendor data to component driver for processing */
242 static int soc_tplg_vendor_load(struct soc_tplg
*tplg
,
243 struct snd_soc_tplg_hdr
*hdr
)
247 if (tplg
->ops
&& tplg
->ops
->vendor_load
)
248 ret
= tplg
->ops
->vendor_load(tplg
->comp
, tplg
->index
, hdr
);
250 dev_err(tplg
->dev
, "ASoC: no vendor load callback for ID %d\n",
257 "ASoC: vendor load failed at hdr offset %ld/0x%lx for type %d:%d\n",
258 soc_tplg_get_hdr_offset(tplg
),
259 soc_tplg_get_hdr_offset(tplg
),
260 hdr
->type
, hdr
->vendor_type
);
264 /* optionally pass new dynamic widget to component driver. This is mainly for
265 * external widgets where we can assign private data/ops */
266 static int soc_tplg_widget_load(struct soc_tplg
*tplg
,
267 struct snd_soc_dapm_widget
*w
, struct snd_soc_tplg_dapm_widget
*tplg_w
)
269 if (tplg
->ops
&& tplg
->ops
->widget_load
)
270 return tplg
->ops
->widget_load(tplg
->comp
, tplg
->index
, w
,
276 /* optionally pass new dynamic widget to component driver. This is mainly for
277 * external widgets where we can assign private data/ops */
278 static int soc_tplg_widget_ready(struct soc_tplg
*tplg
,
279 struct snd_soc_dapm_widget
*w
, struct snd_soc_tplg_dapm_widget
*tplg_w
)
281 if (tplg
->ops
&& tplg
->ops
->widget_ready
)
282 return tplg
->ops
->widget_ready(tplg
->comp
, tplg
->index
, w
,
288 /* pass DAI configurations to component driver for extra initialization */
289 static int soc_tplg_dai_load(struct soc_tplg
*tplg
,
290 struct snd_soc_dai_driver
*dai_drv
,
291 struct snd_soc_tplg_pcm
*pcm
, struct snd_soc_dai
*dai
)
293 if (tplg
->ops
&& tplg
->ops
->dai_load
)
294 return tplg
->ops
->dai_load(tplg
->comp
, tplg
->index
, dai_drv
,
300 /* pass link configurations to component driver for extra initialization */
301 static int soc_tplg_dai_link_load(struct soc_tplg
*tplg
,
302 struct snd_soc_dai_link
*link
, struct snd_soc_tplg_link_config
*cfg
)
304 if (tplg
->ops
&& tplg
->ops
->link_load
)
305 return tplg
->ops
->link_load(tplg
->comp
, tplg
->index
, link
, cfg
);
310 /* tell the component driver that all firmware has been loaded in this request */
311 static int soc_tplg_complete(struct soc_tplg
*tplg
)
313 if (tplg
->ops
&& tplg
->ops
->complete
)
314 return tplg
->ops
->complete(tplg
->comp
);
319 /* add a dynamic kcontrol */
320 static int soc_tplg_add_dcontrol(struct snd_card
*card
, struct device
*dev
,
321 const struct snd_kcontrol_new
*control_new
, const char *prefix
,
322 void *data
, struct snd_kcontrol
**kcontrol
)
326 *kcontrol
= snd_soc_cnew(control_new
, data
, control_new
->name
, prefix
);
327 if (*kcontrol
== NULL
) {
328 dev_err(dev
, "ASoC: Failed to create new kcontrol %s\n",
333 err
= snd_ctl_add(card
, *kcontrol
);
335 dev_err(dev
, "ASoC: Failed to add %s: %d\n",
336 control_new
->name
, err
);
343 /* add a dynamic kcontrol for component driver */
344 static int soc_tplg_add_kcontrol(struct soc_tplg
*tplg
,
345 struct snd_kcontrol_new
*k
, struct snd_kcontrol
**kcontrol
)
347 struct snd_soc_component
*comp
= tplg
->comp
;
349 return soc_tplg_add_dcontrol(comp
->card
->snd_card
,
350 tplg
->dev
, k
, comp
->name_prefix
, comp
, kcontrol
);
353 /* remove kcontrol */
354 static void soc_tplg_remove_kcontrol(struct snd_soc_component
*comp
, struct snd_soc_dobj
*dobj
,
357 struct snd_card
*card
= comp
->card
->snd_card
;
359 if (pass
!= SOC_TPLG_PASS_CONTROL
)
363 dobj
->unload(comp
, dobj
);
365 snd_ctl_remove(card
, dobj
->control
.kcontrol
);
366 list_del(&dobj
->list
);
370 static void soc_tplg_remove_route(struct snd_soc_component
*comp
,
371 struct snd_soc_dobj
*dobj
, int pass
)
373 if (pass
!= SOC_TPLG_PASS_GRAPH
)
377 dobj
->unload(comp
, dobj
);
379 list_del(&dobj
->list
);
382 /* remove a widget and it's kcontrols - routes must be removed first */
383 static void soc_tplg_remove_widget(struct snd_soc_component
*comp
,
384 struct snd_soc_dobj
*dobj
, int pass
)
386 struct snd_card
*card
= comp
->card
->snd_card
;
387 struct snd_soc_dapm_widget
*w
=
388 container_of(dobj
, struct snd_soc_dapm_widget
, dobj
);
391 if (pass
!= SOC_TPLG_PASS_WIDGET
)
395 dobj
->unload(comp
, dobj
);
398 for (i
= 0; i
< w
->num_kcontrols
; i
++)
399 snd_ctl_remove(card
, w
->kcontrols
[i
]);
401 list_del(&dobj
->list
);
403 /* widget w is freed by soc-dapm.c */
406 /* remove DAI configurations */
407 static void soc_tplg_remove_dai(struct snd_soc_component
*comp
,
408 struct snd_soc_dobj
*dobj
, int pass
)
410 struct snd_soc_dai_driver
*dai_drv
=
411 container_of(dobj
, struct snd_soc_dai_driver
, dobj
);
412 struct snd_soc_dai
*dai
, *_dai
;
414 if (pass
!= SOC_TPLG_PASS_PCM_DAI
)
418 dobj
->unload(comp
, dobj
);
420 for_each_component_dais_safe(comp
, dai
, _dai
)
421 if (dai
->driver
== dai_drv
)
422 snd_soc_unregister_dai(dai
);
424 list_del(&dobj
->list
);
427 /* remove link configurations */
428 static void soc_tplg_remove_link(struct snd_soc_component
*comp
,
429 struct snd_soc_dobj
*dobj
, int pass
)
431 struct snd_soc_dai_link
*link
=
432 container_of(dobj
, struct snd_soc_dai_link
, dobj
);
434 if (pass
!= SOC_TPLG_PASS_PCM_DAI
)
438 dobj
->unload(comp
, dobj
);
440 list_del(&dobj
->list
);
441 snd_soc_remove_pcm_runtime(comp
->card
,
442 snd_soc_get_pcm_runtime(comp
->card
, link
));
445 /* unload dai link */
446 static void remove_backend_link(struct snd_soc_component
*comp
,
447 struct snd_soc_dobj
*dobj
, int pass
)
449 if (pass
!= SOC_TPLG_PASS_LINK
)
453 dobj
->unload(comp
, dobj
);
456 * We don't free the link here as what soc_tplg_remove_link() do since BE
457 * links are not allocated by topology.
458 * We however need to reset the dobj type to its initial values
460 dobj
->type
= SND_SOC_DOBJ_NONE
;
461 list_del(&dobj
->list
);
464 /* bind a kcontrol to it's IO handlers */
465 static int soc_tplg_kcontrol_bind_io(struct snd_soc_tplg_ctl_hdr
*hdr
,
466 struct snd_kcontrol_new
*k
,
467 const struct soc_tplg
*tplg
)
469 const struct snd_soc_tplg_kcontrol_ops
*ops
;
470 const struct snd_soc_tplg_bytes_ext_ops
*ext_ops
;
473 if (le32_to_cpu(hdr
->ops
.info
) == SND_SOC_TPLG_CTL_BYTES
474 && k
->iface
& SNDRV_CTL_ELEM_IFACE_MIXER
475 && (k
->access
& SNDRV_CTL_ELEM_ACCESS_TLV_READ
476 || k
->access
& SNDRV_CTL_ELEM_ACCESS_TLV_WRITE
)
477 && k
->access
& SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK
) {
478 struct soc_bytes_ext
*sbe
;
479 struct snd_soc_tplg_bytes_control
*be
;
481 sbe
= (struct soc_bytes_ext
*)k
->private_value
;
482 be
= container_of(hdr
, struct snd_soc_tplg_bytes_control
, hdr
);
484 /* TLV bytes controls need standard kcontrol info handler,
485 * TLV callback and extended put/get handlers.
487 k
->info
= snd_soc_bytes_info_ext
;
488 k
->tlv
.c
= snd_soc_bytes_tlv_callback
;
491 * When a topology-based implementation abuses the
492 * control interface and uses bytes_ext controls of
493 * more than 512 bytes, we need to disable the size
494 * checks, otherwise accesses to such controls will
495 * return an -EINVAL error and prevent the card from
499 k
->access
|= SNDRV_CTL_ELEM_ACCESS_SKIP_CHECK
;
501 ext_ops
= tplg
->bytes_ext_ops
;
502 num_ops
= tplg
->bytes_ext_ops_count
;
503 for (i
= 0; i
< num_ops
; i
++) {
505 ext_ops
[i
].id
== le32_to_cpu(be
->ext_ops
.put
))
506 sbe
->put
= ext_ops
[i
].put
;
508 ext_ops
[i
].id
== le32_to_cpu(be
->ext_ops
.get
))
509 sbe
->get
= ext_ops
[i
].get
;
512 if ((k
->access
& SNDRV_CTL_ELEM_ACCESS_TLV_READ
) && !sbe
->get
)
514 if ((k
->access
& SNDRV_CTL_ELEM_ACCESS_TLV_WRITE
) && !sbe
->put
)
519 /* try and map vendor specific kcontrol handlers first */
521 num_ops
= tplg
->io_ops_count
;
522 for (i
= 0; i
< num_ops
; i
++) {
524 if (k
->put
== NULL
&& ops
[i
].id
== le32_to_cpu(hdr
->ops
.put
))
526 if (k
->get
== NULL
&& ops
[i
].id
== le32_to_cpu(hdr
->ops
.get
))
528 if (k
->info
== NULL
&& ops
[i
].id
== le32_to_cpu(hdr
->ops
.info
))
529 k
->info
= ops
[i
].info
;
532 /* vendor specific handlers found ? */
533 if (k
->put
&& k
->get
&& k
->info
)
536 /* none found so try standard kcontrol handlers */
538 num_ops
= ARRAY_SIZE(io_ops
);
539 for (i
= 0; i
< num_ops
; i
++) {
541 if (k
->put
== NULL
&& ops
[i
].id
== le32_to_cpu(hdr
->ops
.put
))
543 if (k
->get
== NULL
&& ops
[i
].id
== le32_to_cpu(hdr
->ops
.get
))
545 if (k
->info
== NULL
&& ops
[i
].id
== le32_to_cpu(hdr
->ops
.info
))
546 k
->info
= ops
[i
].info
;
549 /* standard handlers found ? */
550 if (k
->put
&& k
->get
&& k
->info
)
553 /* nothing to bind */
557 /* bind a widgets to it's evnt handlers */
558 int snd_soc_tplg_widget_bind_event(struct snd_soc_dapm_widget
*w
,
559 const struct snd_soc_tplg_widget_events
*events
,
560 int num_events
, u16 event_type
)
566 for (i
= 0; i
< num_events
; i
++) {
567 if (event_type
== events
[i
].type
) {
569 /* found - so assign event */
570 w
->event
= events
[i
].event_handler
;
578 EXPORT_SYMBOL_GPL(snd_soc_tplg_widget_bind_event
);
580 /* optionally pass new dynamic kcontrol to component driver. */
581 static int soc_tplg_control_load(struct soc_tplg
*tplg
,
582 struct snd_kcontrol_new
*k
, struct snd_soc_tplg_ctl_hdr
*hdr
)
586 if (tplg
->ops
&& tplg
->ops
->control_load
)
587 ret
= tplg
->ops
->control_load(tplg
->comp
, tplg
->index
, k
, hdr
);
590 dev_err(tplg
->dev
, "ASoC: failed to init %s\n", hdr
->name
);
596 static int soc_tplg_create_tlv_db_scale(struct soc_tplg
*tplg
,
597 struct snd_kcontrol_new
*kc
, struct snd_soc_tplg_tlv_dbscale
*scale
)
599 unsigned int item_len
= 2 * sizeof(unsigned int);
602 p
= devm_kzalloc(tplg
->dev
, item_len
+ 2 * sizeof(unsigned int), GFP_KERNEL
);
606 p
[0] = SNDRV_CTL_TLVT_DB_SCALE
;
608 p
[2] = le32_to_cpu(scale
->min
);
609 p
[3] = (le32_to_cpu(scale
->step
) & TLV_DB_SCALE_MASK
)
610 | (le32_to_cpu(scale
->mute
) ? TLV_DB_SCALE_MUTE
: 0);
612 kc
->tlv
.p
= (void *)p
;
616 static int soc_tplg_create_tlv(struct soc_tplg
*tplg
,
617 struct snd_kcontrol_new
*kc
, struct snd_soc_tplg_ctl_hdr
*tc
)
619 struct snd_soc_tplg_ctl_tlv
*tplg_tlv
;
620 u32 access
= le32_to_cpu(tc
->access
);
622 if (!(access
& SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE
))
625 if (!(access
& SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK
)) {
627 switch (le32_to_cpu(tplg_tlv
->type
)) {
628 case SNDRV_CTL_TLVT_DB_SCALE
:
629 return soc_tplg_create_tlv_db_scale(tplg
, kc
,
632 /* TODO: add support for other TLV types */
634 dev_dbg(tplg
->dev
, "Unsupported TLV type %d\n",
643 static int soc_tplg_control_dmixer_create(struct soc_tplg
*tplg
, struct snd_kcontrol_new
*kc
)
645 struct snd_soc_tplg_mixer_control
*mc
;
646 struct soc_mixer_control
*sm
;
649 mc
= (struct snd_soc_tplg_mixer_control
*)tplg
->pos
;
651 /* validate kcontrol */
652 if (strnlen(mc
->hdr
.name
, SNDRV_CTL_ELEM_ID_NAME_MAXLEN
) == SNDRV_CTL_ELEM_ID_NAME_MAXLEN
)
655 sm
= devm_kzalloc(tplg
->dev
, sizeof(*sm
), GFP_KERNEL
);
659 tplg
->pos
+= sizeof(struct snd_soc_tplg_mixer_control
) + le32_to_cpu(mc
->priv
.size
);
661 dev_dbg(tplg
->dev
, "ASoC: adding mixer kcontrol %s with access 0x%x\n",
662 mc
->hdr
.name
, mc
->hdr
.access
);
664 kc
->name
= devm_kstrdup(tplg
->dev
, mc
->hdr
.name
, GFP_KERNEL
);
667 kc
->private_value
= (long)sm
;
668 kc
->iface
= SNDRV_CTL_ELEM_IFACE_MIXER
;
669 kc
->access
= le32_to_cpu(mc
->hdr
.access
);
671 /* we only support FL/FR channel mapping atm */
672 sm
->reg
= tplg_chan_get_reg(tplg
, mc
->channel
, SNDRV_CHMAP_FL
);
673 sm
->rreg
= tplg_chan_get_reg(tplg
, mc
->channel
, SNDRV_CHMAP_FR
);
674 sm
->shift
= tplg_chan_get_shift(tplg
, mc
->channel
, SNDRV_CHMAP_FL
);
675 sm
->rshift
= tplg_chan_get_shift(tplg
, mc
->channel
, SNDRV_CHMAP_FR
);
677 sm
->max
= le32_to_cpu(mc
->max
);
678 sm
->min
= le32_to_cpu(mc
->min
);
679 sm
->invert
= le32_to_cpu(mc
->invert
);
680 sm
->platform_max
= le32_to_cpu(mc
->platform_max
);
682 /* map io handlers */
683 err
= soc_tplg_kcontrol_bind_io(&mc
->hdr
, kc
, tplg
);
685 soc_control_err(tplg
, &mc
->hdr
, mc
->hdr
.name
);
689 /* create any TLV data */
690 err
= soc_tplg_create_tlv(tplg
, kc
, &mc
->hdr
);
692 dev_err(tplg
->dev
, "ASoC: failed to create TLV %s\n", mc
->hdr
.name
);
696 /* pass control to driver for optional further init */
697 return soc_tplg_control_load(tplg
, kc
, &mc
->hdr
);
700 static int soc_tplg_denum_create_texts(struct soc_tplg
*tplg
, struct soc_enum
*se
,
701 struct snd_soc_tplg_enum_control
*ec
)
705 if (le32_to_cpu(ec
->items
) > ARRAY_SIZE(ec
->texts
))
708 se
->dobj
.control
.dtexts
=
709 devm_kcalloc(tplg
->dev
, le32_to_cpu(ec
->items
), sizeof(char *), GFP_KERNEL
);
710 if (se
->dobj
.control
.dtexts
== NULL
)
713 for (i
= 0; i
< le32_to_cpu(ec
->items
); i
++) {
715 if (strnlen(ec
->texts
[i
], SNDRV_CTL_ELEM_ID_NAME_MAXLEN
) ==
716 SNDRV_CTL_ELEM_ID_NAME_MAXLEN
) {
721 se
->dobj
.control
.dtexts
[i
] = devm_kstrdup(tplg
->dev
, ec
->texts
[i
], GFP_KERNEL
);
722 if (!se
->dobj
.control
.dtexts
[i
]) {
728 se
->items
= le32_to_cpu(ec
->items
);
729 se
->texts
= (const char * const *)se
->dobj
.control
.dtexts
;
736 static int soc_tplg_denum_create_values(struct soc_tplg
*tplg
, struct soc_enum
*se
,
737 struct snd_soc_tplg_enum_control
*ec
)
742 * Following "if" checks if we have at most SND_SOC_TPLG_NUM_TEXTS
743 * values instead of using ARRAY_SIZE(ec->values) due to the fact that
744 * it is oversized for its purpose. Additionally it is done so because
745 * it is defined in UAPI header where it can't be easily changed.
747 if (le32_to_cpu(ec
->items
) > SND_SOC_TPLG_NUM_TEXTS
)
750 se
->dobj
.control
.dvalues
= devm_kcalloc(tplg
->dev
, le32_to_cpu(ec
->items
),
751 sizeof(*se
->dobj
.control
.dvalues
),
753 if (!se
->dobj
.control
.dvalues
)
756 /* convert from little-endian */
757 for (i
= 0; i
< le32_to_cpu(ec
->items
); i
++) {
758 se
->dobj
.control
.dvalues
[i
] = le32_to_cpu(ec
->values
[i
]);
761 se
->items
= le32_to_cpu(ec
->items
);
762 se
->values
= (const unsigned int *)se
->dobj
.control
.dvalues
;
766 static int soc_tplg_control_denum_create(struct soc_tplg
*tplg
, struct snd_kcontrol_new
*kc
)
768 struct snd_soc_tplg_enum_control
*ec
;
772 ec
= (struct snd_soc_tplg_enum_control
*)tplg
->pos
;
774 /* validate kcontrol */
775 if (strnlen(ec
->hdr
.name
, SNDRV_CTL_ELEM_ID_NAME_MAXLEN
) == SNDRV_CTL_ELEM_ID_NAME_MAXLEN
)
778 se
= devm_kzalloc(tplg
->dev
, sizeof(*se
), GFP_KERNEL
);
782 tplg
->pos
+= (sizeof(struct snd_soc_tplg_enum_control
) + le32_to_cpu(ec
->priv
.size
));
784 dev_dbg(tplg
->dev
, "ASoC: adding enum kcontrol %s size %d\n", ec
->hdr
.name
, ec
->items
);
786 kc
->name
= devm_kstrdup(tplg
->dev
, ec
->hdr
.name
, GFP_KERNEL
);
789 kc
->private_value
= (long)se
;
790 kc
->iface
= SNDRV_CTL_ELEM_IFACE_MIXER
;
791 kc
->access
= le32_to_cpu(ec
->hdr
.access
);
793 /* we only support FL/FR channel mapping atm */
794 se
->reg
= tplg_chan_get_reg(tplg
, ec
->channel
, SNDRV_CHMAP_FL
);
795 se
->shift_l
= tplg_chan_get_shift(tplg
, ec
->channel
, SNDRV_CHMAP_FL
);
796 se
->shift_r
= tplg_chan_get_shift(tplg
, ec
->channel
, SNDRV_CHMAP_FR
);
798 se
->mask
= le32_to_cpu(ec
->mask
);
800 switch (le32_to_cpu(ec
->hdr
.ops
.info
)) {
801 case SND_SOC_TPLG_CTL_ENUM_VALUE
:
802 case SND_SOC_TPLG_DAPM_CTL_ENUM_VALUE
:
803 err
= soc_tplg_denum_create_values(tplg
, se
, ec
);
805 dev_err(tplg
->dev
, "ASoC: could not create values for %s\n", ec
->hdr
.name
);
809 case SND_SOC_TPLG_CTL_ENUM
:
810 case SND_SOC_TPLG_DAPM_CTL_ENUM_DOUBLE
:
811 case SND_SOC_TPLG_DAPM_CTL_ENUM_VIRT
:
812 err
= soc_tplg_denum_create_texts(tplg
, se
, ec
);
814 dev_err(tplg
->dev
, "ASoC: could not create texts for %s\n", ec
->hdr
.name
);
819 dev_err(tplg
->dev
, "ASoC: invalid enum control type %d for %s\n",
820 ec
->hdr
.ops
.info
, ec
->hdr
.name
);
824 /* map io handlers */
825 err
= soc_tplg_kcontrol_bind_io(&ec
->hdr
, kc
, tplg
);
827 soc_control_err(tplg
, &ec
->hdr
, ec
->hdr
.name
);
831 /* pass control to driver for optional further init */
832 return soc_tplg_control_load(tplg
, kc
, &ec
->hdr
);
835 static int soc_tplg_control_dbytes_create(struct soc_tplg
*tplg
, struct snd_kcontrol_new
*kc
)
837 struct snd_soc_tplg_bytes_control
*be
;
838 struct soc_bytes_ext
*sbe
;
841 be
= (struct snd_soc_tplg_bytes_control
*)tplg
->pos
;
843 /* validate kcontrol */
844 if (strnlen(be
->hdr
.name
, SNDRV_CTL_ELEM_ID_NAME_MAXLEN
) == SNDRV_CTL_ELEM_ID_NAME_MAXLEN
)
847 sbe
= devm_kzalloc(tplg
->dev
, sizeof(*sbe
), GFP_KERNEL
);
851 tplg
->pos
+= (sizeof(struct snd_soc_tplg_bytes_control
) + le32_to_cpu(be
->priv
.size
));
853 dev_dbg(tplg
->dev
, "ASoC: adding bytes kcontrol %s with access 0x%x\n",
854 be
->hdr
.name
, be
->hdr
.access
);
856 kc
->name
= devm_kstrdup(tplg
->dev
, be
->hdr
.name
, GFP_KERNEL
);
859 kc
->private_value
= (long)sbe
;
860 kc
->iface
= SNDRV_CTL_ELEM_IFACE_MIXER
;
861 kc
->access
= le32_to_cpu(be
->hdr
.access
);
863 sbe
->max
= le32_to_cpu(be
->max
);
865 /* map standard io handlers and check for external handlers */
866 err
= soc_tplg_kcontrol_bind_io(&be
->hdr
, kc
, tplg
);
868 soc_control_err(tplg
, &be
->hdr
, be
->hdr
.name
);
872 /* pass control to driver for optional further init */
873 return soc_tplg_control_load(tplg
, kc
, &be
->hdr
);
876 static int soc_tplg_dbytes_create(struct soc_tplg
*tplg
, size_t size
)
878 struct snd_kcontrol_new kc
= {0};
879 struct soc_bytes_ext
*sbe
;
882 if (soc_tplg_check_elem_count(tplg
,
883 sizeof(struct snd_soc_tplg_bytes_control
),
884 1, size
, "mixer bytes"))
887 ret
= soc_tplg_control_dbytes_create(tplg
, &kc
);
891 /* register dynamic object */
892 sbe
= (struct soc_bytes_ext
*)kc
.private_value
;
894 INIT_LIST_HEAD(&sbe
->dobj
.list
);
895 sbe
->dobj
.type
= SND_SOC_DOBJ_BYTES
;
896 sbe
->dobj
.index
= tplg
->index
;
898 sbe
->dobj
.unload
= tplg
->ops
->control_unload
;
900 /* create control directly */
901 ret
= soc_tplg_add_kcontrol(tplg
, &kc
, &sbe
->dobj
.control
.kcontrol
);
905 list_add(&sbe
->dobj
.list
, &tplg
->comp
->dobj_list
);
910 static int soc_tplg_dmixer_create(struct soc_tplg
*tplg
, size_t size
)
912 struct snd_kcontrol_new kc
= {0};
913 struct soc_mixer_control
*sm
;
916 if (soc_tplg_check_elem_count(tplg
,
917 sizeof(struct snd_soc_tplg_mixer_control
),
921 ret
= soc_tplg_control_dmixer_create(tplg
, &kc
);
925 /* register dynamic object */
926 sm
= (struct soc_mixer_control
*)kc
.private_value
;
928 INIT_LIST_HEAD(&sm
->dobj
.list
);
929 sm
->dobj
.type
= SND_SOC_DOBJ_MIXER
;
930 sm
->dobj
.index
= tplg
->index
;
932 sm
->dobj
.unload
= tplg
->ops
->control_unload
;
934 /* create control directly */
935 ret
= soc_tplg_add_kcontrol(tplg
, &kc
, &sm
->dobj
.control
.kcontrol
);
939 list_add(&sm
->dobj
.list
, &tplg
->comp
->dobj_list
);
944 static int soc_tplg_denum_create(struct soc_tplg
*tplg
, size_t size
)
946 struct snd_kcontrol_new kc
= {0};
950 if (soc_tplg_check_elem_count(tplg
,
951 sizeof(struct snd_soc_tplg_enum_control
),
955 ret
= soc_tplg_control_denum_create(tplg
, &kc
);
959 /* register dynamic object */
960 se
= (struct soc_enum
*)kc
.private_value
;
962 INIT_LIST_HEAD(&se
->dobj
.list
);
963 se
->dobj
.type
= SND_SOC_DOBJ_ENUM
;
964 se
->dobj
.index
= tplg
->index
;
966 se
->dobj
.unload
= tplg
->ops
->control_unload
;
968 /* create control directly */
969 ret
= soc_tplg_add_kcontrol(tplg
, &kc
, &se
->dobj
.control
.kcontrol
);
973 list_add(&se
->dobj
.list
, &tplg
->comp
->dobj_list
);
978 static int soc_tplg_kcontrol_elems_load(struct soc_tplg
*tplg
,
979 struct snd_soc_tplg_hdr
*hdr
)
984 dev_dbg(tplg
->dev
, "ASoC: adding %d kcontrols at 0x%lx\n", hdr
->count
,
985 soc_tplg_get_offset(tplg
));
987 for (i
= 0; i
< le32_to_cpu(hdr
->count
); i
++) {
988 struct snd_soc_tplg_ctl_hdr
*control_hdr
= (struct snd_soc_tplg_ctl_hdr
*)tplg
->pos
;
990 if (le32_to_cpu(control_hdr
->size
) != sizeof(*control_hdr
)) {
991 dev_err(tplg
->dev
, "ASoC: invalid control size\n");
995 switch (le32_to_cpu(control_hdr
->ops
.info
)) {
996 case SND_SOC_TPLG_CTL_VOLSW
:
997 case SND_SOC_TPLG_CTL_STROBE
:
998 case SND_SOC_TPLG_CTL_VOLSW_SX
:
999 case SND_SOC_TPLG_CTL_VOLSW_XR_SX
:
1000 case SND_SOC_TPLG_CTL_RANGE
:
1001 case SND_SOC_TPLG_DAPM_CTL_VOLSW
:
1002 case SND_SOC_TPLG_DAPM_CTL_PIN
:
1003 ret
= soc_tplg_dmixer_create(tplg
, le32_to_cpu(hdr
->payload_size
));
1005 case SND_SOC_TPLG_CTL_ENUM
:
1006 case SND_SOC_TPLG_CTL_ENUM_VALUE
:
1007 case SND_SOC_TPLG_DAPM_CTL_ENUM_DOUBLE
:
1008 case SND_SOC_TPLG_DAPM_CTL_ENUM_VIRT
:
1009 case SND_SOC_TPLG_DAPM_CTL_ENUM_VALUE
:
1010 ret
= soc_tplg_denum_create(tplg
, le32_to_cpu(hdr
->payload_size
));
1012 case SND_SOC_TPLG_CTL_BYTES
:
1013 ret
= soc_tplg_dbytes_create(tplg
, le32_to_cpu(hdr
->payload_size
));
1016 soc_bind_err(tplg
, control_hdr
, i
);
1020 dev_err(tplg
->dev
, "ASoC: invalid control\n");
1029 /* optionally pass new dynamic kcontrol to component driver. */
1030 static int soc_tplg_add_route(struct soc_tplg
*tplg
,
1031 struct snd_soc_dapm_route
*route
)
1033 if (tplg
->ops
&& tplg
->ops
->dapm_route_load
)
1034 return tplg
->ops
->dapm_route_load(tplg
->comp
, tplg
->index
,
1040 static int soc_tplg_dapm_graph_elems_load(struct soc_tplg
*tplg
,
1041 struct snd_soc_tplg_hdr
*hdr
)
1043 struct snd_soc_dapm_context
*dapm
= &tplg
->comp
->dapm
;
1044 const size_t maxlen
= SNDRV_CTL_ELEM_ID_NAME_MAXLEN
;
1045 struct snd_soc_tplg_dapm_graph_elem
*elem
;
1046 struct snd_soc_dapm_route
*route
;
1050 count
= le32_to_cpu(hdr
->count
);
1052 if (soc_tplg_check_elem_count(tplg
,
1053 sizeof(struct snd_soc_tplg_dapm_graph_elem
),
1054 count
, le32_to_cpu(hdr
->payload_size
), "graph"))
1057 dev_dbg(tplg
->dev
, "ASoC: adding %d DAPM routes for index %d\n", count
,
1060 for (i
= 0; i
< count
; i
++) {
1061 route
= devm_kzalloc(tplg
->dev
, sizeof(*route
), GFP_KERNEL
);
1064 elem
= (struct snd_soc_tplg_dapm_graph_elem
*)tplg
->pos
;
1065 tplg
->pos
+= sizeof(struct snd_soc_tplg_dapm_graph_elem
);
1067 /* validate routes */
1068 if ((strnlen(elem
->source
, maxlen
) == maxlen
) ||
1069 (strnlen(elem
->sink
, maxlen
) == maxlen
) ||
1070 (strnlen(elem
->control
, maxlen
) == maxlen
)) {
1075 route
->source
= devm_kstrdup(tplg
->dev
, elem
->source
, GFP_KERNEL
);
1076 route
->sink
= devm_kstrdup(tplg
->dev
, elem
->sink
, GFP_KERNEL
);
1077 if (!route
->source
|| !route
->sink
) {
1082 if (strnlen(elem
->control
, maxlen
) != 0) {
1083 route
->control
= devm_kstrdup(tplg
->dev
, elem
->control
, GFP_KERNEL
);
1084 if (!route
->control
) {
1090 /* add route dobj to dobj_list */
1091 route
->dobj
.type
= SND_SOC_DOBJ_GRAPH
;
1093 route
->dobj
.unload
= tplg
->ops
->dapm_route_unload
;
1094 route
->dobj
.index
= tplg
->index
;
1095 list_add(&route
->dobj
.list
, &tplg
->comp
->dobj_list
);
1097 ret
= soc_tplg_add_route(tplg
, route
);
1099 dev_err(tplg
->dev
, "ASoC: topology: add_route failed: %d\n", ret
);
1103 ret
= snd_soc_dapm_add_routes(dapm
, route
, 1);
1105 if (!dapm
->card
->disable_route_checks
) {
1106 dev_err(tplg
->dev
, "ASoC: dapm_add_routes failed: %d\n", ret
);
1110 "ASoC: disable_route_checks set, ignoring dapm_add_routes errors\n");
1117 static int soc_tplg_dapm_widget_create(struct soc_tplg
*tplg
,
1118 struct snd_soc_tplg_dapm_widget
*w
)
1120 struct snd_soc_dapm_context
*dapm
= &tplg
->comp
->dapm
;
1121 struct snd_soc_dapm_widget
template, *widget
;
1122 struct snd_soc_tplg_ctl_hdr
*control_hdr
;
1123 struct snd_soc_card
*card
= tplg
->comp
->card
;
1124 unsigned int *kcontrol_type
= NULL
;
1125 struct snd_kcontrol_new
*kc
;
1126 int mixer_count
= 0;
1127 int bytes_count
= 0;
1132 if (strnlen(w
->name
, SNDRV_CTL_ELEM_ID_NAME_MAXLEN
) ==
1133 SNDRV_CTL_ELEM_ID_NAME_MAXLEN
)
1135 if (strnlen(w
->sname
, SNDRV_CTL_ELEM_ID_NAME_MAXLEN
) ==
1136 SNDRV_CTL_ELEM_ID_NAME_MAXLEN
)
1139 dev_dbg(tplg
->dev
, "ASoC: creating DAPM widget %s id %d\n",
1142 memset(&template, 0, sizeof(template));
1144 /* map user to kernel widget ID */
1145 template.id
= get_widget_id(le32_to_cpu(w
->id
));
1146 if ((int)template.id
< 0)
1149 /* strings are allocated here, but used and freed by the widget */
1150 template.name
= kstrdup(w
->name
, GFP_KERNEL
);
1153 template.sname
= kstrdup(w
->sname
, GFP_KERNEL
);
1154 if (!template.sname
) {
1158 template.reg
= le32_to_cpu(w
->reg
);
1159 template.shift
= le32_to_cpu(w
->shift
);
1160 template.mask
= le32_to_cpu(w
->mask
);
1161 template.subseq
= le32_to_cpu(w
->subseq
);
1162 template.on_val
= w
->invert
? 0 : 1;
1163 template.off_val
= w
->invert
? 1 : 0;
1164 template.ignore_suspend
= le32_to_cpu(w
->ignore_suspend
);
1165 template.event_flags
= le16_to_cpu(w
->event_flags
);
1166 template.dobj
.index
= tplg
->index
;
1169 (sizeof(struct snd_soc_tplg_dapm_widget
) +
1170 le32_to_cpu(w
->priv
.size
));
1172 if (w
->num_kcontrols
== 0) {
1173 template.num_kcontrols
= 0;
1177 template.num_kcontrols
= le32_to_cpu(w
->num_kcontrols
);
1178 kc
= devm_kcalloc(tplg
->dev
, le32_to_cpu(w
->num_kcontrols
), sizeof(*kc
), GFP_KERNEL
);
1184 kcontrol_type
= devm_kcalloc(tplg
->dev
, le32_to_cpu(w
->num_kcontrols
), sizeof(unsigned int),
1186 if (!kcontrol_type
) {
1191 for (i
= 0; i
< le32_to_cpu(w
->num_kcontrols
); i
++) {
1192 control_hdr
= (struct snd_soc_tplg_ctl_hdr
*)tplg
->pos
;
1193 switch (le32_to_cpu(control_hdr
->ops
.info
)) {
1194 case SND_SOC_TPLG_CTL_VOLSW
:
1195 case SND_SOC_TPLG_CTL_STROBE
:
1196 case SND_SOC_TPLG_CTL_VOLSW_SX
:
1197 case SND_SOC_TPLG_CTL_VOLSW_XR_SX
:
1198 case SND_SOC_TPLG_CTL_RANGE
:
1199 case SND_SOC_TPLG_DAPM_CTL_VOLSW
:
1201 kc
[i
].index
= mixer_count
;
1202 kcontrol_type
[i
] = SND_SOC_TPLG_TYPE_MIXER
;
1204 ret
= soc_tplg_control_dmixer_create(tplg
, &kc
[i
]);
1208 case SND_SOC_TPLG_CTL_ENUM
:
1209 case SND_SOC_TPLG_CTL_ENUM_VALUE
:
1210 case SND_SOC_TPLG_DAPM_CTL_ENUM_DOUBLE
:
1211 case SND_SOC_TPLG_DAPM_CTL_ENUM_VIRT
:
1212 case SND_SOC_TPLG_DAPM_CTL_ENUM_VALUE
:
1213 /* enumerated mixer */
1214 kc
[i
].index
= enum_count
;
1215 kcontrol_type
[i
] = SND_SOC_TPLG_TYPE_ENUM
;
1217 ret
= soc_tplg_control_denum_create(tplg
, &kc
[i
]);
1221 case SND_SOC_TPLG_CTL_BYTES
:
1223 kc
[i
].index
= bytes_count
;
1224 kcontrol_type
[i
] = SND_SOC_TPLG_TYPE_BYTES
;
1226 ret
= soc_tplg_control_dbytes_create(tplg
, &kc
[i
]);
1231 dev_err(tplg
->dev
, "ASoC: invalid widget control type %d:%d:%d\n",
1232 control_hdr
->ops
.get
, control_hdr
->ops
.put
,
1233 le32_to_cpu(control_hdr
->ops
.info
));
1239 template.kcontrol_news
= kc
;
1240 dev_dbg(tplg
->dev
, "ASoC: template %s with %d/%d/%d (mixer/enum/bytes) control\n",
1241 w
->name
, mixer_count
, enum_count
, bytes_count
);
1244 ret
= soc_tplg_widget_load(tplg
, &template, w
);
1248 /* card dapm mutex is held by the core if we are loading topology
1249 * data during sound card init. */
1250 if (snd_soc_card_is_instantiated(card
))
1251 widget
= snd_soc_dapm_new_control(dapm
, &template);
1253 widget
= snd_soc_dapm_new_control_unlocked(dapm
, &template);
1254 if (IS_ERR(widget
)) {
1255 ret
= PTR_ERR(widget
);
1259 widget
->dobj
.type
= SND_SOC_DOBJ_WIDGET
;
1260 widget
->dobj
.widget
.kcontrol_type
= kcontrol_type
;
1262 widget
->dobj
.unload
= tplg
->ops
->widget_unload
;
1263 widget
->dobj
.index
= tplg
->index
;
1264 list_add(&widget
->dobj
.list
, &tplg
->comp
->dobj_list
);
1266 ret
= soc_tplg_widget_ready(tplg
, widget
, w
);
1270 kfree(template.sname
);
1271 kfree(template.name
);
1276 soc_tplg_remove_widget(widget
->dapm
->component
, &widget
->dobj
, SOC_TPLG_PASS_WIDGET
);
1277 snd_soc_dapm_free_widget(widget
);
1279 kfree(template.sname
);
1281 kfree(template.name
);
1285 static int soc_tplg_dapm_widget_elems_load(struct soc_tplg
*tplg
,
1286 struct snd_soc_tplg_hdr
*hdr
)
1290 count
= le32_to_cpu(hdr
->count
);
1292 dev_dbg(tplg
->dev
, "ASoC: adding %d DAPM widgets\n", count
);
1294 for (i
= 0; i
< count
; i
++) {
1295 struct snd_soc_tplg_dapm_widget
*widget
= (struct snd_soc_tplg_dapm_widget
*) tplg
->pos
;
1299 * check if widget itself fits within topology file
1300 * use sizeof instead of widget->size, as we can't be sure
1301 * it is set properly yet (file may end before it is present)
1303 if (soc_tplg_get_offset(tplg
) + sizeof(*widget
) >= tplg
->fw
->size
) {
1304 dev_err(tplg
->dev
, "ASoC: invalid widget data size\n");
1308 /* check if widget has proper size */
1309 if (le32_to_cpu(widget
->size
) != sizeof(*widget
)) {
1310 dev_err(tplg
->dev
, "ASoC: invalid widget size\n");
1314 /* check if widget private data fits within topology file */
1315 if (soc_tplg_get_offset(tplg
) + le32_to_cpu(widget
->priv
.size
) >= tplg
->fw
->size
) {
1316 dev_err(tplg
->dev
, "ASoC: invalid widget private data size\n");
1320 ret
= soc_tplg_dapm_widget_create(tplg
, widget
);
1322 dev_err(tplg
->dev
, "ASoC: failed to load widget %s\n",
1331 static int soc_tplg_dapm_complete(struct soc_tplg
*tplg
)
1333 struct snd_soc_card
*card
= tplg
->comp
->card
;
1336 /* Card might not have been registered at this point.
1337 * If so, just return success.
1339 if (!snd_soc_card_is_instantiated(card
)) {
1340 dev_warn(tplg
->dev
, "ASoC: Parent card not yet available, widget card binding deferred\n");
1344 ret
= snd_soc_dapm_new_widgets(card
);
1346 dev_err(tplg
->dev
, "ASoC: failed to create new widgets %d\n", ret
);
1351 static int set_stream_info(struct soc_tplg
*tplg
, struct snd_soc_pcm_stream
*stream
,
1352 struct snd_soc_tplg_stream_caps
*caps
)
1354 stream
->stream_name
= devm_kstrdup(tplg
->dev
, caps
->name
, GFP_KERNEL
);
1355 if (!stream
->stream_name
)
1358 stream
->channels_min
= le32_to_cpu(caps
->channels_min
);
1359 stream
->channels_max
= le32_to_cpu(caps
->channels_max
);
1360 stream
->rates
= le32_to_cpu(caps
->rates
);
1361 stream
->rate_min
= le32_to_cpu(caps
->rate_min
);
1362 stream
->rate_max
= le32_to_cpu(caps
->rate_max
);
1363 stream
->formats
= le64_to_cpu(caps
->formats
);
1364 stream
->sig_bits
= le32_to_cpu(caps
->sig_bits
);
1369 static void set_dai_flags(struct snd_soc_dai_driver
*dai_drv
,
1370 unsigned int flag_mask
, unsigned int flags
)
1372 if (flag_mask
& SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_RATES
)
1373 dai_drv
->symmetric_rate
=
1374 (flags
& SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_RATES
) ? 1 : 0;
1376 if (flag_mask
& SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_CHANNELS
)
1377 dai_drv
->symmetric_channels
=
1378 (flags
& SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_CHANNELS
) ?
1381 if (flag_mask
& SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_SAMPLEBITS
)
1382 dai_drv
->symmetric_sample_bits
=
1383 (flags
& SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_SAMPLEBITS
) ?
1387 static const struct snd_soc_dai_ops tplg_dai_ops
= {
1388 .compress_new
= snd_soc_new_compress
,
1391 static int soc_tplg_dai_create(struct soc_tplg
*tplg
,
1392 struct snd_soc_tplg_pcm
*pcm
)
1394 struct snd_soc_dai_driver
*dai_drv
;
1395 struct snd_soc_pcm_stream
*stream
;
1396 struct snd_soc_tplg_stream_caps
*caps
;
1397 struct snd_soc_dai
*dai
;
1398 struct snd_soc_dapm_context
*dapm
=
1399 snd_soc_component_get_dapm(tplg
->comp
);
1402 dai_drv
= devm_kzalloc(tplg
->dev
, sizeof(struct snd_soc_dai_driver
), GFP_KERNEL
);
1403 if (dai_drv
== NULL
)
1406 if (strlen(pcm
->dai_name
)) {
1407 dai_drv
->name
= devm_kstrdup(tplg
->dev
, pcm
->dai_name
, GFP_KERNEL
);
1408 if (!dai_drv
->name
) {
1413 dai_drv
->id
= le32_to_cpu(pcm
->dai_id
);
1415 if (pcm
->playback
) {
1416 stream
= &dai_drv
->playback
;
1417 caps
= &pcm
->caps
[SND_SOC_TPLG_STREAM_PLAYBACK
];
1418 ret
= set_stream_info(tplg
, stream
, caps
);
1424 stream
= &dai_drv
->capture
;
1425 caps
= &pcm
->caps
[SND_SOC_TPLG_STREAM_CAPTURE
];
1426 ret
= set_stream_info(tplg
, stream
, caps
);
1432 dai_drv
->ops
= &tplg_dai_ops
;
1434 /* pass control to component driver for optional further init */
1435 ret
= soc_tplg_dai_load(tplg
, dai_drv
, pcm
, NULL
);
1437 dev_err(tplg
->dev
, "ASoC: DAI loading failed\n");
1441 dai_drv
->dobj
.index
= tplg
->index
;
1442 dai_drv
->dobj
.type
= SND_SOC_DOBJ_PCM
;
1444 dai_drv
->dobj
.unload
= tplg
->ops
->dai_unload
;
1445 list_add(&dai_drv
->dobj
.list
, &tplg
->comp
->dobj_list
);
1447 /* register the DAI to the component */
1448 dai
= snd_soc_register_dai(tplg
->comp
, dai_drv
, false);
1452 /* Create the DAI widgets here */
1453 ret
= snd_soc_dapm_new_dai_widgets(dapm
, dai
);
1455 dev_err(dai
->dev
, "Failed to create DAI widgets %d\n", ret
);
1456 snd_soc_unregister_dai(dai
);
1466 static void set_link_flags(struct snd_soc_dai_link
*link
,
1467 unsigned int flag_mask
, unsigned int flags
)
1469 if (flag_mask
& SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_RATES
)
1470 link
->symmetric_rate
=
1471 (flags
& SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_RATES
) ? 1 : 0;
1473 if (flag_mask
& SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_CHANNELS
)
1474 link
->symmetric_channels
=
1475 (flags
& SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_CHANNELS
) ?
1478 if (flag_mask
& SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_SAMPLEBITS
)
1479 link
->symmetric_sample_bits
=
1480 (flags
& SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_SAMPLEBITS
) ?
1483 if (flag_mask
& SND_SOC_TPLG_LNK_FLGBIT_VOICE_WAKEUP
)
1484 link
->ignore_suspend
=
1485 (flags
& SND_SOC_TPLG_LNK_FLGBIT_VOICE_WAKEUP
) ?
1489 /* create the FE DAI link */
1490 static int soc_tplg_fe_link_create(struct soc_tplg
*tplg
,
1491 struct snd_soc_tplg_pcm
*pcm
)
1493 struct snd_soc_dai_link
*link
;
1494 struct snd_soc_dai_link_component
*dlc
;
1497 /* link + cpu + codec + platform */
1498 link
= devm_kzalloc(tplg
->dev
, sizeof(*link
) + (3 * sizeof(*dlc
)), GFP_KERNEL
);
1502 dlc
= (struct snd_soc_dai_link_component
*)(link
+ 1);
1504 link
->cpus
= &dlc
[0];
1507 link
->dobj
.index
= tplg
->index
;
1508 link
->dobj
.type
= SND_SOC_DOBJ_DAI_LINK
;
1510 link
->dobj
.unload
= tplg
->ops
->link_unload
;
1512 if (strlen(pcm
->pcm_name
)) {
1513 link
->name
= devm_kstrdup(tplg
->dev
, pcm
->pcm_name
, GFP_KERNEL
);
1514 link
->stream_name
= devm_kstrdup(tplg
->dev
, pcm
->pcm_name
, GFP_KERNEL
);
1515 if (!link
->name
|| !link
->stream_name
) {
1520 link
->id
= le32_to_cpu(pcm
->pcm_id
);
1522 if (strlen(pcm
->dai_name
)) {
1523 link
->cpus
->dai_name
= devm_kstrdup(tplg
->dev
, pcm
->dai_name
, GFP_KERNEL
);
1524 if (!link
->cpus
->dai_name
) {
1531 * Many topology are assuming link has Codec / Platform, and
1532 * these might be overwritten at soc_tplg_dai_link_load().
1533 * Don't use &snd_soc_dummy_dlc here.
1535 link
->codecs
= &dlc
[1]; /* Don't use &snd_soc_dummy_dlc here */
1536 link
->codecs
->name
= "snd-soc-dummy";
1537 link
->codecs
->dai_name
= "snd-soc-dummy-dai";
1538 link
->num_codecs
= 1;
1540 link
->platforms
= &dlc
[2]; /* Don't use &snd_soc_dummy_dlc here */
1541 link
->platforms
->name
= "snd-soc-dummy";
1542 link
->num_platforms
= 1;
1546 link
->ignore_pmdown_time
= 1;
1547 link
->playback_only
= le32_to_cpu(pcm
->playback
) && !le32_to_cpu(pcm
->capture
);
1548 link
->capture_only
= !le32_to_cpu(pcm
->playback
) && le32_to_cpu(pcm
->capture
);
1550 set_link_flags(link
,
1551 le32_to_cpu(pcm
->flag_mask
),
1552 le32_to_cpu(pcm
->flags
));
1554 /* pass control to component driver for optional further init */
1555 ret
= soc_tplg_dai_link_load(tplg
, link
, NULL
);
1557 dev_err(tplg
->dev
, "ASoC: FE link loading failed\n");
1561 ret
= snd_soc_add_pcm_runtimes(tplg
->comp
->card
, link
, 1);
1563 if (ret
!= -EPROBE_DEFER
)
1564 dev_err(tplg
->dev
, "ASoC: adding FE link failed\n");
1568 list_add(&link
->dobj
.list
, &tplg
->comp
->dobj_list
);
1575 /* create a FE DAI and DAI link from the PCM object */
1576 static int soc_tplg_pcm_create(struct soc_tplg
*tplg
,
1577 struct snd_soc_tplg_pcm
*pcm
)
1581 ret
= soc_tplg_dai_create(tplg
, pcm
);
1585 return soc_tplg_fe_link_create(tplg
, pcm
);
1588 static int soc_tplg_pcm_elems_load(struct soc_tplg
*tplg
,
1589 struct snd_soc_tplg_hdr
*hdr
)
1591 struct snd_soc_tplg_pcm
*pcm
;
1597 count
= le32_to_cpu(hdr
->count
);
1599 /* check the element size and count */
1600 pcm
= (struct snd_soc_tplg_pcm
*)tplg
->pos
;
1601 size
= le32_to_cpu(pcm
->size
);
1602 if (size
> sizeof(struct snd_soc_tplg_pcm
)) {
1603 dev_err(tplg
->dev
, "ASoC: invalid size %d for PCM elems\n",
1608 if (soc_tplg_check_elem_count(tplg
,
1610 le32_to_cpu(hdr
->payload_size
),
1614 for (i
= 0; i
< count
; i
++) {
1615 pcm
= (struct snd_soc_tplg_pcm
*)tplg
->pos
;
1616 size
= le32_to_cpu(pcm
->size
);
1618 /* check ABI version by size, create a new version of pcm
1621 if (size
!= sizeof(*pcm
))
1624 /* create the FE DAIs and DAI links */
1625 ret
= soc_tplg_pcm_create(tplg
, pcm
);
1629 /* offset by version-specific struct size and
1630 * real priv data size
1632 tplg
->pos
+= size
+ le32_to_cpu(pcm
->priv
.size
);
1635 dev_dbg(tplg
->dev
, "ASoC: adding %d PCM DAIs\n", count
);
1641 * set_link_hw_format - Set the HW audio format of the physical DAI link.
1642 * @link: &snd_soc_dai_link which should be updated
1643 * @cfg: physical link configs.
1645 * Topology context contains a list of supported HW formats (configs) and
1646 * a default format ID for the physical link. This function will use this
1647 * default ID to choose the HW format to set the link's DAI format for init.
1649 static void set_link_hw_format(struct snd_soc_dai_link
*link
,
1650 struct snd_soc_tplg_link_config
*cfg
)
1652 struct snd_soc_tplg_hw_config
*hw_config
;
1653 unsigned char bclk_provider
, fsync_provider
;
1654 unsigned char invert_bclk
, invert_fsync
;
1657 for (i
= 0; i
< le32_to_cpu(cfg
->num_hw_configs
); i
++) {
1658 hw_config
= &cfg
->hw_config
[i
];
1659 if (hw_config
->id
!= cfg
->default_hw_config_id
)
1662 link
->dai_fmt
= le32_to_cpu(hw_config
->fmt
) &
1663 SND_SOC_DAIFMT_FORMAT_MASK
;
1666 switch (hw_config
->clock_gated
) {
1667 case SND_SOC_TPLG_DAI_CLK_GATE_GATED
:
1668 link
->dai_fmt
|= SND_SOC_DAIFMT_GATED
;
1671 case SND_SOC_TPLG_DAI_CLK_GATE_CONT
:
1672 link
->dai_fmt
|= SND_SOC_DAIFMT_CONT
;
1676 /* ignore the value */
1680 /* clock signal polarity */
1681 invert_bclk
= hw_config
->invert_bclk
;
1682 invert_fsync
= hw_config
->invert_fsync
;
1683 if (!invert_bclk
&& !invert_fsync
)
1684 link
->dai_fmt
|= SND_SOC_DAIFMT_NB_NF
;
1685 else if (!invert_bclk
&& invert_fsync
)
1686 link
->dai_fmt
|= SND_SOC_DAIFMT_NB_IF
;
1687 else if (invert_bclk
&& !invert_fsync
)
1688 link
->dai_fmt
|= SND_SOC_DAIFMT_IB_NF
;
1690 link
->dai_fmt
|= SND_SOC_DAIFMT_IB_IF
;
1693 bclk_provider
= (hw_config
->bclk_provider
==
1694 SND_SOC_TPLG_BCLK_CP
);
1695 fsync_provider
= (hw_config
->fsync_provider
==
1696 SND_SOC_TPLG_FSYNC_CP
);
1697 if (bclk_provider
&& fsync_provider
)
1698 link
->dai_fmt
|= SND_SOC_DAIFMT_CBP_CFP
;
1699 else if (!bclk_provider
&& fsync_provider
)
1700 link
->dai_fmt
|= SND_SOC_DAIFMT_CBC_CFP
;
1701 else if (bclk_provider
&& !fsync_provider
)
1702 link
->dai_fmt
|= SND_SOC_DAIFMT_CBP_CFC
;
1704 link
->dai_fmt
|= SND_SOC_DAIFMT_CBC_CFC
;
1709 * snd_soc_find_dai_link - Find a DAI link
1712 * @id: DAI link ID to match
1713 * @name: DAI link name to match, optional
1714 * @stream_name: DAI link stream name to match, optional
1716 * This function will search all existing DAI links of the soc card to
1717 * find the link of the same ID. Since DAI links may not have their
1718 * unique ID, so name and stream name should also match if being
1721 * Return: pointer of DAI link, or NULL if not found.
1723 static struct snd_soc_dai_link
*snd_soc_find_dai_link(struct snd_soc_card
*card
,
1724 int id
, const char *name
,
1725 const char *stream_name
)
1727 struct snd_soc_pcm_runtime
*rtd
;
1729 for_each_card_rtds(card
, rtd
) {
1730 struct snd_soc_dai_link
*link
= rtd
->dai_link
;
1735 if (name
&& (!link
->name
|| !strstr(link
->name
, name
)))
1738 if (stream_name
&& (!link
->stream_name
||
1739 !strstr(link
->stream_name
, stream_name
)))
1748 /* Find and configure an existing physical DAI link */
1749 static int soc_tplg_link_config(struct soc_tplg
*tplg
,
1750 struct snd_soc_tplg_link_config
*cfg
)
1752 struct snd_soc_dai_link
*link
;
1753 const char *name
, *stream_name
;
1757 len
= strnlen(cfg
->name
, SNDRV_CTL_ELEM_ID_NAME_MAXLEN
);
1758 if (len
== SNDRV_CTL_ELEM_ID_NAME_MAXLEN
)
1765 len
= strnlen(cfg
->stream_name
, SNDRV_CTL_ELEM_ID_NAME_MAXLEN
);
1766 if (len
== SNDRV_CTL_ELEM_ID_NAME_MAXLEN
)
1769 stream_name
= cfg
->stream_name
;
1773 link
= snd_soc_find_dai_link(tplg
->comp
->card
, le32_to_cpu(cfg
->id
),
1776 dev_err(tplg
->dev
, "ASoC: physical link %s (id %d) not exist\n",
1782 if (cfg
->num_hw_configs
)
1783 set_link_hw_format(link
, cfg
);
1787 set_link_flags(link
,
1788 le32_to_cpu(cfg
->flag_mask
),
1789 le32_to_cpu(cfg
->flags
));
1791 /* pass control to component driver for optional further init */
1792 ret
= soc_tplg_dai_link_load(tplg
, link
, cfg
);
1794 dev_err(tplg
->dev
, "ASoC: physical link loading failed\n");
1798 /* for unloading it in snd_soc_tplg_component_remove */
1799 link
->dobj
.index
= tplg
->index
;
1800 link
->dobj
.type
= SND_SOC_DOBJ_BACKEND_LINK
;
1802 link
->dobj
.unload
= tplg
->ops
->link_unload
;
1803 list_add(&link
->dobj
.list
, &tplg
->comp
->dobj_list
);
1809 /* Load physical link config elements from the topology context */
1810 static int soc_tplg_link_elems_load(struct soc_tplg
*tplg
,
1811 struct snd_soc_tplg_hdr
*hdr
)
1813 struct snd_soc_tplg_link_config
*link
;
1818 count
= le32_to_cpu(hdr
->count
);
1820 /* check the element size and count */
1821 link
= (struct snd_soc_tplg_link_config
*)tplg
->pos
;
1822 size
= le32_to_cpu(link
->size
);
1823 if (size
> sizeof(struct snd_soc_tplg_link_config
)) {
1824 dev_err(tplg
->dev
, "ASoC: invalid size %d for physical link elems\n",
1829 if (soc_tplg_check_elem_count(tplg
, size
, count
,
1830 le32_to_cpu(hdr
->payload_size
),
1831 "physical link config"))
1834 /* config physical DAI links */
1835 for (i
= 0; i
< count
; i
++) {
1836 link
= (struct snd_soc_tplg_link_config
*)tplg
->pos
;
1837 size
= le32_to_cpu(link
->size
);
1838 if (size
!= sizeof(*link
))
1841 ret
= soc_tplg_link_config(tplg
, link
);
1845 /* offset by version-specific struct size and
1846 * real priv data size
1848 tplg
->pos
+= size
+ le32_to_cpu(link
->priv
.size
);
1855 * soc_tplg_dai_config - Find and configure an existing physical DAI.
1856 * @tplg: topology context
1857 * @d: physical DAI configs.
1859 * The physical dai should already be registered by the platform driver.
1860 * The platform driver should specify the DAI name and ID for matching.
1862 static int soc_tplg_dai_config(struct soc_tplg
*tplg
,
1863 struct snd_soc_tplg_dai
*d
)
1865 struct snd_soc_dai_link_component dai_component
;
1866 struct snd_soc_dai
*dai
;
1867 struct snd_soc_dai_driver
*dai_drv
;
1868 struct snd_soc_pcm_stream
*stream
;
1869 struct snd_soc_tplg_stream_caps
*caps
;
1872 memset(&dai_component
, 0, sizeof(dai_component
));
1874 dai_component
.dai_name
= d
->dai_name
;
1875 dai
= snd_soc_find_dai(&dai_component
);
1877 dev_err(tplg
->dev
, "ASoC: physical DAI %s not registered\n",
1882 if (le32_to_cpu(d
->dai_id
) != dai
->id
) {
1883 dev_err(tplg
->dev
, "ASoC: physical DAI %s id mismatch\n",
1888 dai_drv
= dai
->driver
;
1893 stream
= &dai_drv
->playback
;
1894 caps
= &d
->caps
[SND_SOC_TPLG_STREAM_PLAYBACK
];
1895 ret
= set_stream_info(tplg
, stream
, caps
);
1901 stream
= &dai_drv
->capture
;
1902 caps
= &d
->caps
[SND_SOC_TPLG_STREAM_CAPTURE
];
1903 ret
= set_stream_info(tplg
, stream
, caps
);
1909 set_dai_flags(dai_drv
,
1910 le32_to_cpu(d
->flag_mask
),
1911 le32_to_cpu(d
->flags
));
1913 /* pass control to component driver for optional further init */
1914 ret
= soc_tplg_dai_load(tplg
, dai_drv
, NULL
, dai
);
1916 dev_err(tplg
->dev
, "ASoC: DAI loading failed\n");
1923 /* load physical DAI elements */
1924 static int soc_tplg_dai_elems_load(struct soc_tplg
*tplg
,
1925 struct snd_soc_tplg_hdr
*hdr
)
1930 count
= le32_to_cpu(hdr
->count
);
1932 /* config the existing BE DAIs */
1933 for (i
= 0; i
< count
; i
++) {
1934 struct snd_soc_tplg_dai
*dai
= (struct snd_soc_tplg_dai
*)tplg
->pos
;
1937 if (le32_to_cpu(dai
->size
) != sizeof(*dai
)) {
1938 dev_err(tplg
->dev
, "ASoC: invalid physical DAI size\n");
1942 ret
= soc_tplg_dai_config(tplg
, dai
);
1944 dev_err(tplg
->dev
, "ASoC: failed to configure DAI\n");
1948 tplg
->pos
+= (sizeof(*dai
) + le32_to_cpu(dai
->priv
.size
));
1951 dev_dbg(tplg
->dev
, "ASoC: Configure %d BE DAIs\n", count
);
1955 static int soc_tplg_manifest_load(struct soc_tplg
*tplg
,
1956 struct snd_soc_tplg_hdr
*hdr
)
1958 struct snd_soc_tplg_manifest
*manifest
;
1961 manifest
= (struct snd_soc_tplg_manifest
*)tplg
->pos
;
1963 /* check ABI version by size, create a new manifest if abi not match */
1964 if (le32_to_cpu(manifest
->size
) != sizeof(*manifest
))
1967 /* pass control to component driver for optional further init */
1968 if (tplg
->ops
&& tplg
->ops
->manifest
)
1969 ret
= tplg
->ops
->manifest(tplg
->comp
, tplg
->index
, manifest
);
1974 /* validate header magic, size and type */
1975 static int soc_tplg_valid_header(struct soc_tplg
*tplg
,
1976 struct snd_soc_tplg_hdr
*hdr
)
1978 if (le32_to_cpu(hdr
->size
) != sizeof(*hdr
)) {
1980 "ASoC: invalid header size for type %d at offset 0x%lx size 0x%zx.\n",
1981 le32_to_cpu(hdr
->type
), soc_tplg_get_hdr_offset(tplg
),
1986 if (soc_tplg_get_hdr_offset(tplg
) + le32_to_cpu(hdr
->payload_size
) >= tplg
->fw
->size
) {
1988 "ASoC: invalid header of type %d at offset %ld payload_size %d\n",
1989 le32_to_cpu(hdr
->type
), soc_tplg_get_hdr_offset(tplg
),
1994 /* big endian firmware objects not supported atm */
1995 if (le32_to_cpu(hdr
->magic
) == SOC_TPLG_MAGIC_BIG_ENDIAN
) {
1997 "ASoC: pass %d big endian not supported header got %x at offset 0x%lx size 0x%zx.\n",
1998 tplg
->pass
, hdr
->magic
,
1999 soc_tplg_get_hdr_offset(tplg
), tplg
->fw
->size
);
2003 if (le32_to_cpu(hdr
->magic
) != SND_SOC_TPLG_MAGIC
) {
2005 "ASoC: pass %d does not have a valid header got %x at offset 0x%lx size 0x%zx.\n",
2006 tplg
->pass
, hdr
->magic
,
2007 soc_tplg_get_hdr_offset(tplg
), tplg
->fw
->size
);
2011 /* Support ABI from version 4 */
2012 if (le32_to_cpu(hdr
->abi
) > SND_SOC_TPLG_ABI_VERSION
||
2013 le32_to_cpu(hdr
->abi
) < SND_SOC_TPLG_ABI_VERSION_MIN
) {
2015 "ASoC: pass %d invalid ABI version got 0x%x need 0x%x at offset 0x%lx size 0x%zx.\n",
2016 tplg
->pass
, hdr
->abi
,
2017 SND_SOC_TPLG_ABI_VERSION
, soc_tplg_get_hdr_offset(tplg
),
2022 if (hdr
->payload_size
== 0) {
2023 dev_err(tplg
->dev
, "ASoC: header has 0 size at offset 0x%lx.\n",
2024 soc_tplg_get_hdr_offset(tplg
));
2031 /* check header type and call appropriate handler */
2032 static int soc_tplg_load_header(struct soc_tplg
*tplg
,
2033 struct snd_soc_tplg_hdr
*hdr
)
2035 int (*elem_load
)(struct soc_tplg
*tplg
,
2036 struct snd_soc_tplg_hdr
*hdr
);
2037 unsigned int hdr_pass
;
2039 tplg
->pos
= tplg
->hdr_pos
+ sizeof(struct snd_soc_tplg_hdr
);
2041 tplg
->index
= le32_to_cpu(hdr
->index
);
2043 switch (le32_to_cpu(hdr
->type
)) {
2044 case SND_SOC_TPLG_TYPE_MIXER
:
2045 case SND_SOC_TPLG_TYPE_ENUM
:
2046 case SND_SOC_TPLG_TYPE_BYTES
:
2047 hdr_pass
= SOC_TPLG_PASS_CONTROL
;
2048 elem_load
= soc_tplg_kcontrol_elems_load
;
2050 case SND_SOC_TPLG_TYPE_DAPM_GRAPH
:
2051 hdr_pass
= SOC_TPLG_PASS_GRAPH
;
2052 elem_load
= soc_tplg_dapm_graph_elems_load
;
2054 case SND_SOC_TPLG_TYPE_DAPM_WIDGET
:
2055 hdr_pass
= SOC_TPLG_PASS_WIDGET
;
2056 elem_load
= soc_tplg_dapm_widget_elems_load
;
2058 case SND_SOC_TPLG_TYPE_PCM
:
2059 hdr_pass
= SOC_TPLG_PASS_PCM_DAI
;
2060 elem_load
= soc_tplg_pcm_elems_load
;
2062 case SND_SOC_TPLG_TYPE_DAI
:
2063 hdr_pass
= SOC_TPLG_PASS_BE_DAI
;
2064 elem_load
= soc_tplg_dai_elems_load
;
2066 case SND_SOC_TPLG_TYPE_DAI_LINK
:
2067 case SND_SOC_TPLG_TYPE_BACKEND_LINK
:
2068 /* physical link configurations */
2069 hdr_pass
= SOC_TPLG_PASS_LINK
;
2070 elem_load
= soc_tplg_link_elems_load
;
2072 case SND_SOC_TPLG_TYPE_MANIFEST
:
2073 hdr_pass
= SOC_TPLG_PASS_MANIFEST
;
2074 elem_load
= soc_tplg_manifest_load
;
2077 /* bespoke vendor data object */
2078 hdr_pass
= SOC_TPLG_PASS_VENDOR
;
2079 elem_load
= soc_tplg_vendor_load
;
2083 if (tplg
->pass
== hdr_pass
) {
2085 "ASoC: Got 0x%x bytes of type %d version %d vendor %d at pass %d\n",
2086 hdr
->payload_size
, hdr
->type
, hdr
->version
,
2087 hdr
->vendor_type
, tplg
->pass
);
2088 return elem_load(tplg
, hdr
);
2094 /* process the topology file headers */
2095 static int soc_tplg_process_headers(struct soc_tplg
*tplg
)
2099 /* process the header types from start to end */
2100 for (tplg
->pass
= SOC_TPLG_PASS_START
; tplg
->pass
<= SOC_TPLG_PASS_END
; tplg
->pass
++) {
2101 struct snd_soc_tplg_hdr
*hdr
;
2103 tplg
->hdr_pos
= tplg
->fw
->data
;
2104 hdr
= (struct snd_soc_tplg_hdr
*)tplg
->hdr_pos
;
2106 while (!soc_tplg_is_eof(tplg
)) {
2108 /* make sure header is valid before loading */
2109 ret
= soc_tplg_valid_header(tplg
, hdr
);
2113 /* load the header object */
2114 ret
= soc_tplg_load_header(tplg
, hdr
);
2116 if (ret
!= -EPROBE_DEFER
) {
2118 "ASoC: topology: could not load header: %d\n",
2124 /* goto next header */
2125 tplg
->hdr_pos
+= le32_to_cpu(hdr
->payload_size
) +
2126 sizeof(struct snd_soc_tplg_hdr
);
2127 hdr
= (struct snd_soc_tplg_hdr
*)tplg
->hdr_pos
;
2132 /* signal DAPM we are complete */
2133 ret
= soc_tplg_dapm_complete(tplg
);
2138 static int soc_tplg_load(struct soc_tplg
*tplg
)
2142 ret
= soc_tplg_process_headers(tplg
);
2144 return soc_tplg_complete(tplg
);
2149 /* load audio component topology from "firmware" file */
2150 int snd_soc_tplg_component_load(struct snd_soc_component
*comp
,
2151 const struct snd_soc_tplg_ops
*ops
, const struct firmware
*fw
)
2153 struct soc_tplg tplg
;
2157 * check if we have sane parameters:
2158 * comp - needs to exist to keep and reference data while parsing
2159 * comp->card - used for setting card related parameters
2160 * comp->card->dev - used for resource management and prints
2161 * fw - we need it, as it is the very thing we parse
2163 if (!comp
|| !comp
->card
|| !comp
->card
->dev
|| !fw
)
2166 /* setup parsing context */
2167 memset(&tplg
, 0, sizeof(tplg
));
2169 tplg
.dev
= comp
->card
->dev
;
2173 tplg
.io_ops
= ops
->io_ops
;
2174 tplg
.io_ops_count
= ops
->io_ops_count
;
2175 tplg
.bytes_ext_ops
= ops
->bytes_ext_ops
;
2176 tplg
.bytes_ext_ops_count
= ops
->bytes_ext_ops_count
;
2179 ret
= soc_tplg_load(&tplg
);
2180 /* free the created components if fail to load topology */
2182 snd_soc_tplg_component_remove(comp
);
2186 EXPORT_SYMBOL_GPL(snd_soc_tplg_component_load
);
2188 /* remove dynamic controls from the component driver */
2189 int snd_soc_tplg_component_remove(struct snd_soc_component
*comp
)
2191 struct snd_soc_dobj
*dobj
, *next_dobj
;
2194 /* process the header types from end to start */
2195 for (pass
= SOC_TPLG_PASS_END
; pass
>= SOC_TPLG_PASS_START
; pass
--) {
2197 /* remove mixer controls */
2198 list_for_each_entry_safe(dobj
, next_dobj
, &comp
->dobj_list
,
2201 switch (dobj
->type
) {
2202 case SND_SOC_DOBJ_BYTES
:
2203 case SND_SOC_DOBJ_ENUM
:
2204 case SND_SOC_DOBJ_MIXER
:
2205 soc_tplg_remove_kcontrol(comp
, dobj
, pass
);
2207 case SND_SOC_DOBJ_GRAPH
:
2208 soc_tplg_remove_route(comp
, dobj
, pass
);
2210 case SND_SOC_DOBJ_WIDGET
:
2211 soc_tplg_remove_widget(comp
, dobj
, pass
);
2213 case SND_SOC_DOBJ_PCM
:
2214 soc_tplg_remove_dai(comp
, dobj
, pass
);
2216 case SND_SOC_DOBJ_DAI_LINK
:
2217 soc_tplg_remove_link(comp
, dobj
, pass
);
2219 case SND_SOC_DOBJ_BACKEND_LINK
:
2221 * call link_unload ops if extra
2222 * deinitialization is needed.
2224 remove_backend_link(comp
, dobj
, pass
);
2227 dev_err(comp
->dev
, "ASoC: invalid component type %d for removal\n",
2234 /* let caller know if FW can be freed when no objects are left */
2235 return !list_empty(&comp
->dobj_list
);
2237 EXPORT_SYMBOL_GPL(snd_soc_tplg_component_remove
);