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