From: Mengdong Lin Date: Tue, 18 Aug 2015 10:11:51 +0000 (+0800) Subject: ASoC: topology: Bind vendor specific kcontrol handlers before standard ones X-Git-Tag: firefly_0821_release~176^2~1082^2~13^2~4^6~2 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=88a17d8fb7c4a156ec13e6668b46dbbedf670ff7;p=firefly-linux-kernel-4.4.55.git ASoC: topology: Bind vendor specific kcontrol handlers before standard ones Vendor specific handlers should override standard handlers. So we can handle things in the order from specific to generic. Signed-off-by: Mengdong Lin Signed-off-by: Mark Brown --- diff --git a/include/sound/soc-topology.h b/include/sound/soc-topology.h index 865a141b118b..a6541a1bc709 100644 --- a/include/sound/soc-topology.h +++ b/include/sound/soc-topology.h @@ -136,7 +136,7 @@ struct snd_soc_tplg_ops { int (*manifest)(struct snd_soc_component *, struct snd_soc_tplg_manifest *); - /* bespoke kcontrol handlers available for binding */ + /* vendor specific kcontrol handlers available for binding */ const struct snd_soc_tplg_kcontrol_ops *io_ops; int io_ops_count; }; diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c index 73e959c105f0..ca551b9fd100 100644 --- a/sound/soc/soc-topology.c +++ b/sound/soc/soc-topology.c @@ -66,7 +66,7 @@ struct soc_tplg { u32 index; /* current block index */ u32 req_index; /* required index, only loaded/free matching blocks */ - /* kcontrol operations */ + /* vendor specific kcontrol operations */ const struct snd_soc_tplg_kcontrol_ops *io_ops; int io_ops_count; @@ -513,22 +513,7 @@ static int soc_tplg_kcontrol_bind_io(struct snd_soc_tplg_ctl_hdr *hdr, { int i; - /* try and map standard kcontrols handler first */ - for (i = 0; i < num_ops; i++) { - - if (ops[i].id == hdr->ops.put) - k->put = ops[i].put; - if (ops[i].id == hdr->ops.get) - k->get = ops[i].get; - if (ops[i].id == hdr->ops.info) - k->info = ops[i].info; - } - - /* standard handlers found ? */ - if (k->put && k->get && k->info) - return 0; - - /* none found so try bespoke handlers */ + /* try and map vendor specific kcontrol handlers first */ for (i = 0; i < num_bops; i++) { if (k->put == NULL && bops[i].id == hdr->ops.put) @@ -539,7 +524,22 @@ static int soc_tplg_kcontrol_bind_io(struct snd_soc_tplg_ctl_hdr *hdr, k->info = bops[i].info; } - /* bespoke handlers found ? */ + /* vendor specific handlers found ? */ + if (k->put && k->get && k->info) + return 0; + + /* none found so try standard kcontrol handlers */ + for (i = 0; i < num_ops; i++) { + + if (k->put == NULL && ops[i].id == hdr->ops.put) + k->put = ops[i].put; + if (k->get == NULL && ops[i].id == hdr->ops.get) + k->get = ops[i].get; + if (k->info == NULL && ops[i].id == hdr->ops.info) + k->info = ops[i].info; + } + + /* standard handlers found ? */ if (k->put && k->get && k->info) return 0;