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