]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - sound/soc/soc-compress.c
Merge tag 'armsoc-soc' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
[linux.git] / sound / soc / soc-compress.c
index 82402688bd8ed33799a95f7ed4786cb5d840be72..e095115fa9f9b24825a8818d00e453cf227bb556 100644 (file)
 #include <sound/initval.h>
 #include <sound/soc-dpcm.h>
 
-static int soc_compr_open(struct snd_compr_stream *cstream)
+static int soc_compr_components_open(struct snd_compr_stream *cstream,
+                                    struct snd_soc_component **last)
 {
        struct snd_soc_pcm_runtime *rtd = cstream->private_data;
-       struct snd_soc_platform *platform = rtd->platform;
        struct snd_soc_component *component;
        struct snd_soc_rtdcom_list *rtdcom;
-       struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
-       int ret = 0, __ret;
+       int ret;
 
-       mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
+       for_each_rtdcom(rtd, rtdcom) {
+               component = rtdcom->component;
 
-       if (cpu_dai->driver->cops && cpu_dai->driver->cops->startup) {
-               ret = cpu_dai->driver->cops->startup(cstream, cpu_dai);
-               if (ret < 0) {
-                       dev_err(cpu_dai->dev,
-                               "Compress ASoC: can't open interface %s: %d\n",
-                               cpu_dai->name, ret);
-                       goto out;
-               }
-       }
+               if (!component->driver->compr_ops ||
+                   !component->driver->compr_ops->open)
+                       continue;
 
-       if (platform && platform->driver->compr_ops && platform->driver->compr_ops->open) {
-               ret = platform->driver->compr_ops->open(cstream);
+               ret = component->driver->compr_ops->open(cstream);
                if (ret < 0) {
-                       dev_err(platform->dev,
+                       dev_err(component->dev,
                                "Compress ASoC: can't open platform %s: %d\n",
-                               platform->component.name, ret);
-                       goto plat_err;
+                               component->name, ret);
+
+                       *last = component;
+                       return ret;
                }
        }
 
+       *last = NULL;
+       return 0;
+}
+
+static int soc_compr_components_free(struct snd_compr_stream *cstream,
+                                    struct snd_soc_component *last)
+{
+       struct snd_soc_pcm_runtime *rtd = cstream->private_data;
+       struct snd_soc_component *component;
+       struct snd_soc_rtdcom_list *rtdcom;
+
        for_each_rtdcom(rtd, rtdcom) {
                component = rtdcom->component;
 
-               /* ignore duplication for now */
-               if (platform && (component == &platform->component))
-                       continue;
+               if (component == last)
+                       break;
 
                if (!component->driver->compr_ops ||
-                   !component->driver->compr_ops->open)
+                   !component->driver->compr_ops->free)
                        continue;
 
-               __ret = component->driver->compr_ops->open(cstream);
-               if (__ret < 0) {
-                       dev_err(component->dev,
-                               "Compress ASoC: can't open platform %s: %d\n",
-                               component->name, __ret);
-                       ret = __ret;
+               component->driver->compr_ops->free(cstream);
+       }
+
+       return 0;
+}
+
+static int soc_compr_open(struct snd_compr_stream *cstream)
+{
+       struct snd_soc_pcm_runtime *rtd = cstream->private_data;
+       struct snd_soc_component *component;
+       struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+       int ret;
+
+       mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
+
+       if (cpu_dai->driver->cops && cpu_dai->driver->cops->startup) {
+               ret = cpu_dai->driver->cops->startup(cstream, cpu_dai);
+               if (ret < 0) {
+                       dev_err(cpu_dai->dev,
+                               "Compress ASoC: can't open interface %s: %d\n",
+                               cpu_dai->name, ret);
+                       goto out;
                }
        }
+
+       ret = soc_compr_components_open(cstream, &component);
        if (ret < 0)
                goto machine_err;
 
@@ -96,23 +119,8 @@ static int soc_compr_open(struct snd_compr_stream *cstream)
        return 0;
 
 machine_err:
-       for_each_rtdcom(rtd, rtdcom) {
-               component = rtdcom->component;
-
-               /* ignore duplication for now */
-               if (platform && (component == &platform->component))
-                       continue;
-
-               if (!component->driver->compr_ops ||
-                   !component->driver->compr_ops->free)
-                       continue;
+       soc_compr_components_free(cstream, component);
 
-               component->driver->compr_ops->free(cstream);
-       }
-
-       if (platform && platform->driver->compr_ops && platform->driver->compr_ops->free)
-               platform->driver->compr_ops->free(cstream);
-plat_err:
        if (cpu_dai->driver->cops && cpu_dai->driver->cops->shutdown)
                cpu_dai->driver->cops->shutdown(cstream, cpu_dai);
 out:
@@ -125,14 +133,12 @@ static int soc_compr_open_fe(struct snd_compr_stream *cstream)
        struct snd_soc_pcm_runtime *fe = cstream->private_data;
        struct snd_pcm_substream *fe_substream =
                 fe->pcm->streams[cstream->direction].substream;
-       struct snd_soc_platform *platform = fe->platform;
        struct snd_soc_component *component;
-       struct snd_soc_rtdcom_list *rtdcom;
        struct snd_soc_dai *cpu_dai = fe->cpu_dai;
        struct snd_soc_dpcm *dpcm;
        struct snd_soc_dapm_widget_list *list;
        int stream;
-       int ret = 0, __ret;
+       int ret;
 
        if (cstream->direction == SND_COMPRESS_PLAYBACK)
                stream = SNDRV_PCM_STREAM_PLAYBACK;
@@ -151,35 +157,7 @@ static int soc_compr_open_fe(struct snd_compr_stream *cstream)
                }
        }
 
-       if (platform && platform->driver->compr_ops && platform->driver->compr_ops->open) {
-               ret = platform->driver->compr_ops->open(cstream);
-               if (ret < 0) {
-                       dev_err(platform->dev,
-                               "Compress ASoC: can't open platform %s: %d\n",
-                               platform->component.name, ret);
-                       goto plat_err;
-               }
-       }
-
-       for_each_rtdcom(fe, rtdcom) {
-               component = rtdcom->component;
-
-               /* ignore duplication for now */
-               if (platform && (component == &platform->component))
-                       continue;
-
-               if (!component->driver->compr_ops ||
-                   !component->driver->compr_ops->open)
-                       continue;
-
-               __ret = component->driver->compr_ops->open(cstream);
-               if (__ret < 0) {
-                       dev_err(component->dev,
-                               "Compress ASoC: can't open platform %s: %d\n",
-                               component->name, __ret);
-                       ret = __ret;
-               }
-       }
+       ret = soc_compr_components_open(cstream, &component);
        if (ret < 0)
                goto machine_err;
 
@@ -235,23 +213,8 @@ static int soc_compr_open_fe(struct snd_compr_stream *cstream)
        if (fe->dai_link->compr_ops && fe->dai_link->compr_ops->shutdown)
                fe->dai_link->compr_ops->shutdown(cstream);
 machine_err:
-       for_each_rtdcom(fe, rtdcom) {
-               component = rtdcom->component;
-
-               /* ignore duplication for now */
-               if (platform && (component == &platform->component))
-                       continue;
+       soc_compr_components_free(cstream, component);
 
-               if (!component->driver->compr_ops ||
-                   !component->driver->compr_ops->free)
-                       continue;
-
-               component->driver->compr_ops->free(cstream);
-       }
-
-       if (platform && platform->driver->compr_ops && platform->driver->compr_ops->free)
-               platform->driver->compr_ops->free(cstream);
-plat_err:
        if (cpu_dai->driver->cops && cpu_dai->driver->cops->shutdown)
                cpu_dai->driver->cops->shutdown(cstream, cpu_dai);
 out:
@@ -292,9 +255,6 @@ static void close_delayed_work(struct work_struct *work)
 static int soc_compr_free(struct snd_compr_stream *cstream)
 {
        struct snd_soc_pcm_runtime *rtd = cstream->private_data;
-       struct snd_soc_platform *platform = rtd->platform;
-       struct snd_soc_component *component;
-       struct snd_soc_rtdcom_list *rtdcom;
        struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
        struct snd_soc_dai *codec_dai = rtd->codec_dai;
        int stream;
@@ -319,22 +279,7 @@ static int soc_compr_free(struct snd_compr_stream *cstream)
        if (rtd->dai_link->compr_ops && rtd->dai_link->compr_ops->shutdown)
                rtd->dai_link->compr_ops->shutdown(cstream);
 
-       for_each_rtdcom(rtd, rtdcom) {
-               component = rtdcom->component;
-
-               /* ignore duplication for now */
-               if (platform && (component == &platform->component))
-                       continue;
-
-               if (!component->driver->compr_ops ||
-                   !component->driver->compr_ops->free)
-                       continue;
-
-               component->driver->compr_ops->free(cstream);
-       }
-
-       if (platform && platform->driver->compr_ops && platform->driver->compr_ops->free)
-               platform->driver->compr_ops->free(cstream);
+       soc_compr_components_free(cstream, NULL);
 
        if (cpu_dai->driver->cops && cpu_dai->driver->cops->shutdown)
                cpu_dai->driver->cops->shutdown(cstream, cpu_dai);
@@ -342,8 +287,8 @@ static int soc_compr_free(struct snd_compr_stream *cstream)
        if (cstream->direction == SND_COMPRESS_PLAYBACK) {
                if (snd_soc_runtime_ignore_pmdown_time(rtd)) {
                        snd_soc_dapm_stream_event(rtd,
-                                       SNDRV_PCM_STREAM_PLAYBACK,
-                                       SND_SOC_DAPM_STREAM_STOP);
+                                                 SNDRV_PCM_STREAM_PLAYBACK,
+                                                 SND_SOC_DAPM_STREAM_STOP);
                } else {
                        rtd->pop_wait = 1;
                        queue_delayed_work(system_power_efficient_wq,
@@ -353,8 +298,8 @@ static int soc_compr_free(struct snd_compr_stream *cstream)
        } else {
                /* capture streams can be powered down now */
                snd_soc_dapm_stream_event(rtd,
-                       SNDRV_PCM_STREAM_CAPTURE,
-                       SND_SOC_DAPM_STREAM_STOP);
+                                         SNDRV_PCM_STREAM_CAPTURE,
+                                         SND_SOC_DAPM_STREAM_STOP);
        }
 
        mutex_unlock(&rtd->pcm_mutex);
@@ -364,9 +309,6 @@ static int soc_compr_free(struct snd_compr_stream *cstream)
 static int soc_compr_free_fe(struct snd_compr_stream *cstream)
 {
        struct snd_soc_pcm_runtime *fe = cstream->private_data;
-       struct snd_soc_platform *platform = fe->platform;
-       struct snd_soc_component *component;
-       struct snd_soc_rtdcom_list *rtdcom;
        struct snd_soc_dai *cpu_dai = fe->cpu_dai;
        struct snd_soc_dpcm *dpcm;
        int stream, ret;
@@ -404,22 +346,7 @@ static int soc_compr_free_fe(struct snd_compr_stream *cstream)
        if (fe->dai_link->compr_ops && fe->dai_link->compr_ops->shutdown)
                fe->dai_link->compr_ops->shutdown(cstream);
 
-       if (platform && platform->driver->compr_ops && platform->driver->compr_ops->free)
-               platform->driver->compr_ops->free(cstream);
-
-       for_each_rtdcom(fe, rtdcom) {
-               component = rtdcom->component;
-
-               /* ignore duplication for now */
-               if (platform && (component == &platform->component))
-                       continue;
-
-               if (!component->driver->compr_ops ||
-                   !component->driver->compr_ops->free)
-                       continue;
-
-               component->driver->compr_ops->free(cstream);
-       }
+       soc_compr_components_free(cstream, NULL);
 
        if (cpu_dai->driver->cops && cpu_dai->driver->cops->shutdown)
                cpu_dai->driver->cops->shutdown(cstream, cpu_dai);
@@ -432,7 +359,6 @@ static int soc_compr_trigger(struct snd_compr_stream *cstream, int cmd)
 {
 
        struct snd_soc_pcm_runtime *rtd = cstream->private_data;
-       struct snd_soc_platform *platform = rtd->platform;
        struct snd_soc_component *component;
        struct snd_soc_rtdcom_list *rtdcom;
        struct snd_soc_dai *codec_dai = rtd->codec_dai;
@@ -441,19 +367,9 @@ static int soc_compr_trigger(struct snd_compr_stream *cstream, int cmd)
 
        mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
 
-       if (platform && platform->driver->compr_ops && platform->driver->compr_ops->trigger) {
-               ret = platform->driver->compr_ops->trigger(cstream, cmd);
-               if (ret < 0)
-                       goto out;
-       }
-
        for_each_rtdcom(rtd, rtdcom) {
                component = rtdcom->component;
 
-               /* ignore duplication for now */
-               if (platform && (component == &platform->component))
-                       continue;
-
                if (!component->driver->compr_ops ||
                    !component->driver->compr_ops->trigger)
                        continue;
@@ -485,7 +401,6 @@ static int soc_compr_trigger(struct snd_compr_stream *cstream, int cmd)
 static int soc_compr_trigger_fe(struct snd_compr_stream *cstream, int cmd)
 {
        struct snd_soc_pcm_runtime *fe = cstream->private_data;
-       struct snd_soc_platform *platform = fe->platform;
        struct snd_soc_component *component;
        struct snd_soc_rtdcom_list *rtdcom;
        struct snd_soc_dai *cpu_dai = fe->cpu_dai;
@@ -494,19 +409,9 @@ static int soc_compr_trigger_fe(struct snd_compr_stream *cstream, int cmd)
        if (cmd == SND_COMPR_TRIGGER_PARTIAL_DRAIN ||
                cmd == SND_COMPR_TRIGGER_DRAIN) {
 
-               if (platform &&
-                   platform->driver->compr_ops &&
-                   platform->driver->compr_ops->trigger)
-                       return platform->driver->compr_ops->trigger(cstream,
-                                                                   cmd);
-
                for_each_rtdcom(fe, rtdcom) {
                        component = rtdcom->component;
 
-                       /* ignore duplication for now */
-                       if (platform && (component == &platform->component))
-                               continue;
-
                        if (!component->driver->compr_ops ||
                            !component->driver->compr_ops->trigger)
                                continue;
@@ -523,7 +428,6 @@ static int soc_compr_trigger_fe(struct snd_compr_stream *cstream, int cmd)
        else
                stream = SNDRV_PCM_STREAM_CAPTURE;
 
-
        mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
 
        if (cpu_dai->driver->cops && cpu_dai->driver->cops->trigger) {
@@ -532,19 +436,9 @@ static int soc_compr_trigger_fe(struct snd_compr_stream *cstream, int cmd)
                        goto out;
        }
 
-       if (platform && platform->driver->compr_ops && platform->driver->compr_ops->trigger) {
-               ret = platform->driver->compr_ops->trigger(cstream, cmd);
-               if (ret < 0)
-                       goto out;
-       }
-
        for_each_rtdcom(fe, rtdcom) {
                component = rtdcom->component;
 
-               /* ignore duplication for now */
-               if (platform && (component == &platform->component))
-                       continue;
-
                if (!component->driver->compr_ops ||
                    !component->driver->compr_ops->trigger)
                        continue;
@@ -585,7 +479,6 @@ static int soc_compr_set_params(struct snd_compr_stream *cstream,
                                        struct snd_compr_params *params)
 {
        struct snd_soc_pcm_runtime *rtd = cstream->private_data;
-       struct snd_soc_platform *platform = rtd->platform;
        struct snd_soc_component *component;
        struct snd_soc_rtdcom_list *rtdcom;
        struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
@@ -593,11 +486,12 @@ static int soc_compr_set_params(struct snd_compr_stream *cstream,
 
        mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
 
-       /* first we call set_params for the platform driver
-        * this should configure the soc side
-        * if the machine has compressed ops then we call that as well
-        * expectation is that platform and machine will configure everything
-        * for this compress path, like configuring pcm port for codec
+       /*
+        * First we call set_params for the CPU DAI, then the component
+        * driver this should configure the SoC side. If the machine has
+        * compressed ops then we call that as well. The expectation is
+        * that these callbacks will configure everything for this compress
+        * path, like configuring a PCM port for a CODEC.
         */
        if (cpu_dai->driver->cops && cpu_dai->driver->cops->set_params) {
                ret = cpu_dai->driver->cops->set_params(cstream, params, cpu_dai);
@@ -605,19 +499,9 @@ static int soc_compr_set_params(struct snd_compr_stream *cstream,
                        goto err;
        }
 
-       if (platform && platform->driver->compr_ops && platform->driver->compr_ops->set_params) {
-               ret = platform->driver->compr_ops->set_params(cstream, params);
-               if (ret < 0)
-                       goto err;
-       }
-
        for_each_rtdcom(rtd, rtdcom) {
                component = rtdcom->component;
 
-               /* ignore duplication for now */
-               if (platform && (component == &platform->component))
-                       continue;
-
                if (!component->driver->compr_ops ||
                    !component->driver->compr_ops->set_params)
                        continue;
@@ -637,10 +521,10 @@ static int soc_compr_set_params(struct snd_compr_stream *cstream,
 
        if (cstream->direction == SND_COMPRESS_PLAYBACK)
                snd_soc_dapm_stream_event(rtd, SNDRV_PCM_STREAM_PLAYBACK,
-                                       SND_SOC_DAPM_STREAM_START);
+                                         SND_SOC_DAPM_STREAM_START);
        else
                snd_soc_dapm_stream_event(rtd, SNDRV_PCM_STREAM_CAPTURE,
-                                       SND_SOC_DAPM_STREAM_START);
+                                         SND_SOC_DAPM_STREAM_START);
 
        /* cancel any delayed stream shutdown that is pending */
        rtd->pop_wait = 0;
@@ -656,12 +540,11 @@ static int soc_compr_set_params(struct snd_compr_stream *cstream,
 }
 
 static int soc_compr_set_params_fe(struct snd_compr_stream *cstream,
-                                       struct snd_compr_params *params)
+                                  struct snd_compr_params *params)
 {
        struct snd_soc_pcm_runtime *fe = cstream->private_data;
        struct snd_pcm_substream *fe_substream =
                 fe->pcm->streams[cstream->direction].substream;
-       struct snd_soc_platform *platform = fe->platform;
        struct snd_soc_component *component;
        struct snd_soc_rtdcom_list *rtdcom;
        struct snd_soc_dai *cpu_dai = fe->cpu_dai;
@@ -680,19 +563,9 @@ static int soc_compr_set_params_fe(struct snd_compr_stream *cstream,
                        goto out;
        }
 
-       if (platform && platform->driver->compr_ops && platform->driver->compr_ops->set_params) {
-               ret = platform->driver->compr_ops->set_params(cstream, params);
-               if (ret < 0)
-                       goto out;
-       }
-
        for_each_rtdcom(fe, rtdcom) {
                component = rtdcom->component;
 
-               /* ignore duplication for now */
-               if (platform && (component == &platform->component))
-                       continue;
-
                if (!component->driver->compr_ops ||
                    !component->driver->compr_ops->set_params)
                        continue;
@@ -738,10 +611,9 @@ static int soc_compr_set_params_fe(struct snd_compr_stream *cstream,
 }
 
 static int soc_compr_get_params(struct snd_compr_stream *cstream,
-                                       struct snd_codec *params)
+                               struct snd_codec *params)
 {
        struct snd_soc_pcm_runtime *rtd = cstream->private_data;
-       struct snd_soc_platform *platform = rtd->platform;
        struct snd_soc_component *component;
        struct snd_soc_rtdcom_list *rtdcom;
        struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
@@ -755,19 +627,9 @@ static int soc_compr_get_params(struct snd_compr_stream *cstream,
                        goto err;
        }
 
-       if (platform && platform->driver->compr_ops && platform->driver->compr_ops->get_params) {
-               ret = platform->driver->compr_ops->get_params(cstream, params);
-               if (ret < 0)
-                       goto err;
-       }
-
        for_each_rtdcom(rtd, rtdcom) {
                component = rtdcom->component;
 
-               /* ignore duplication for now */
-               if (platform && (component == &platform->component))
-                       continue;
-
                if (!component->driver->compr_ops ||
                    !component->driver->compr_ops->get_params)
                        continue;
@@ -783,29 +645,18 @@ static int soc_compr_get_params(struct snd_compr_stream *cstream,
 }
 
 static int soc_compr_get_caps(struct snd_compr_stream *cstream,
-                               struct snd_compr_caps *caps)
+                             struct snd_compr_caps *caps)
 {
        struct snd_soc_pcm_runtime *rtd = cstream->private_data;
-       struct snd_soc_platform *platform = rtd->platform;
        struct snd_soc_component *component;
        struct snd_soc_rtdcom_list *rtdcom;
        int ret = 0, __ret;
 
        mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
 
-       if (platform && platform->driver->compr_ops && platform->driver->compr_ops->get_caps) {
-               ret = platform->driver->compr_ops->get_caps(cstream, caps);
-               if (ret < 0)
-                       goto err;
-       }
-
        for_each_rtdcom(rtd, rtdcom) {
                component = rtdcom->component;
 
-               /* ignore duplication for now */
-               if (platform && (component == &platform->component))
-                       continue;
-
                if (!component->driver->compr_ops ||
                    !component->driver->compr_ops->get_caps)
                        continue;
@@ -815,35 +666,23 @@ static int soc_compr_get_caps(struct snd_compr_stream *cstream,
                        ret = __ret;
        }
 
-err:
        mutex_unlock(&rtd->pcm_mutex);
        return ret;
 }
 
 static int soc_compr_get_codec_caps(struct snd_compr_stream *cstream,
-                               struct snd_compr_codec_caps *codec)
+                                   struct snd_compr_codec_caps *codec)
 {
        struct snd_soc_pcm_runtime *rtd = cstream->private_data;
-       struct snd_soc_platform *platform = rtd->platform;
        struct snd_soc_component *component;
        struct snd_soc_rtdcom_list *rtdcom;
        int ret = 0, __ret;
 
        mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
 
-       if (platform && platform->driver->compr_ops && platform->driver->compr_ops->get_codec_caps) {
-               ret = platform->driver->compr_ops->get_codec_caps(cstream, codec);
-               if (ret < 0)
-                       goto err;
-       }
-
        for_each_rtdcom(rtd, rtdcom) {
                component = rtdcom->component;
 
-               /* ignore duplication for now */
-               if (platform && (component == &platform->component))
-                       continue;
-
                if (!component->driver->compr_ops ||
                    !component->driver->compr_ops->get_codec_caps)
                        continue;
@@ -853,7 +692,6 @@ static int soc_compr_get_codec_caps(struct snd_compr_stream *cstream,
                        ret = __ret;
        }
 
-err:
        mutex_unlock(&rtd->pcm_mutex);
        return ret;
 }
@@ -861,7 +699,6 @@ static int soc_compr_get_codec_caps(struct snd_compr_stream *cstream,
 static int soc_compr_ack(struct snd_compr_stream *cstream, size_t bytes)
 {
        struct snd_soc_pcm_runtime *rtd = cstream->private_data;
-       struct snd_soc_platform *platform = rtd->platform;
        struct snd_soc_component *component;
        struct snd_soc_rtdcom_list *rtdcom;
        struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
@@ -875,19 +712,9 @@ static int soc_compr_ack(struct snd_compr_stream *cstream, size_t bytes)
                        goto err;
        }
 
-       if (platform && platform->driver->compr_ops && platform->driver->compr_ops->ack) {
-               ret = platform->driver->compr_ops->ack(cstream, bytes);
-               if (ret < 0)
-                       goto err;
-       }
-
        for_each_rtdcom(rtd, rtdcom) {
                component = rtdcom->component;
 
-               /* ignore duplication for now */
-               if (platform && (component == &platform->component))
-                       continue;
-
                if (!component->driver->compr_ops ||
                    !component->driver->compr_ops->ack)
                        continue;
@@ -903,10 +730,9 @@ static int soc_compr_ack(struct snd_compr_stream *cstream, size_t bytes)
 }
 
 static int soc_compr_pointer(struct snd_compr_stream *cstream,
-                       struct snd_compr_tstamp *tstamp)
+                            struct snd_compr_tstamp *tstamp)
 {
        struct snd_soc_pcm_runtime *rtd = cstream->private_data;
-       struct snd_soc_platform *platform = rtd->platform;
        struct snd_soc_component *component;
        struct snd_soc_rtdcom_list *rtdcom;
        int ret = 0, __ret;
@@ -917,19 +743,9 @@ static int soc_compr_pointer(struct snd_compr_stream *cstream,
        if (cpu_dai->driver->cops && cpu_dai->driver->cops->pointer)
                cpu_dai->driver->cops->pointer(cstream, tstamp, cpu_dai);
 
-       if (platform && platform->driver->compr_ops && platform->driver->compr_ops->pointer) {
-               ret = platform->driver->compr_ops->pointer(cstream, tstamp);
-               if (ret < 0)
-                       goto err;
-       }
-
        for_each_rtdcom(rtd, rtdcom) {
                component = rtdcom->component;
 
-               /* ignore duplication for now */
-               if (platform && (component == &platform->component))
-                       continue;
-
                if (!component->driver->compr_ops ||
                    !component->driver->compr_ops->pointer)
                        continue;
@@ -939,7 +755,6 @@ static int soc_compr_pointer(struct snd_compr_stream *cstream,
                        ret = __ret;
        }
 
-err:
        mutex_unlock(&rtd->pcm_mutex);
        return ret;
 }
@@ -948,26 +763,15 @@ static int soc_compr_copy(struct snd_compr_stream *cstream,
                          char __user *buf, size_t count)
 {
        struct snd_soc_pcm_runtime *rtd = cstream->private_data;
-       struct snd_soc_platform *platform = rtd->platform;
        struct snd_soc_component *component;
        struct snd_soc_rtdcom_list *rtdcom;
        int ret = 0;
 
        mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
 
-       if (platform && platform->driver->compr_ops && platform->driver->compr_ops->copy) {
-               ret = platform->driver->compr_ops->copy(cstream, buf, count);
-               if (ret < 0)
-                       goto err;
-       }
-
        for_each_rtdcom(rtd, rtdcom) {
                component = rtdcom->component;
 
-               /* ignore duplication for now */
-               if (platform && (component == &platform->component))
-                       continue;
-
                if (!component->driver->compr_ops ||
                    !component->driver->compr_ops->copy)
                        continue;
@@ -976,16 +780,14 @@ static int soc_compr_copy(struct snd_compr_stream *cstream,
                break;
        }
 
-err:
        mutex_unlock(&rtd->pcm_mutex);
        return ret;
 }
 
 static int soc_compr_set_metadata(struct snd_compr_stream *cstream,
-                               struct snd_compr_metadata *metadata)
+                                 struct snd_compr_metadata *metadata)
 {
        struct snd_soc_pcm_runtime *rtd = cstream->private_data;
-       struct snd_soc_platform *platform = rtd->platform;
        struct snd_soc_component *component;
        struct snd_soc_rtdcom_list *rtdcom;
        struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
@@ -997,19 +799,9 @@ static int soc_compr_set_metadata(struct snd_compr_stream *cstream,
                        return ret;
        }
 
-       if (platform && platform->driver->compr_ops && platform->driver->compr_ops->set_metadata) {
-               ret = platform->driver->compr_ops->set_metadata(cstream, metadata);
-               if (ret < 0)
-                       return ret;
-       }
-
        for_each_rtdcom(rtd, rtdcom) {
                component = rtdcom->component;
 
-               /* ignore duplication for now */
-               if (platform && (component == &platform->component))
-                       continue;
-
                if (!component->driver->compr_ops ||
                    !component->driver->compr_ops->set_metadata)
                        continue;
@@ -1023,10 +815,9 @@ static int soc_compr_set_metadata(struct snd_compr_stream *cstream,
 }
 
 static int soc_compr_get_metadata(struct snd_compr_stream *cstream,
-                               struct snd_compr_metadata *metadata)
+                                 struct snd_compr_metadata *metadata)
 {
        struct snd_soc_pcm_runtime *rtd = cstream->private_data;
-       struct snd_soc_platform *platform = rtd->platform;
        struct snd_soc_component *component;
        struct snd_soc_rtdcom_list *rtdcom;
        struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
@@ -1038,19 +829,9 @@ static int soc_compr_get_metadata(struct snd_compr_stream *cstream,
                        return ret;
        }
 
-       if (platform && platform->driver->compr_ops && platform->driver->compr_ops->get_metadata) {
-               ret = platform->driver->compr_ops->get_metadata(cstream, metadata);
-               if (ret < 0)
-                       return ret;
-       }
-
        for_each_rtdcom(rtd, rtdcom) {
                component = rtdcom->component;
 
-               /* ignore duplication for now */
-               if (platform && (component == &platform->component))
-                       continue;
-
                if (!component->driver->compr_ops ||
                    !component->driver->compr_ops->get_metadata)
                        continue;
@@ -1103,7 +884,6 @@ static struct snd_compr_ops soc_compr_dyn_ops = {
  */
 int snd_soc_new_compress(struct snd_soc_pcm_runtime *rtd, int num)
 {
-       struct snd_soc_platform *platform = rtd->platform;
        struct snd_soc_component *component;
        struct snd_soc_rtdcom_list *rtdcom;
        struct snd_soc_dai *codec_dai = rtd->codec_dai;
@@ -1184,26 +964,17 @@ int snd_soc_new_compress(struct snd_soc_pcm_runtime *rtd, int num)
                memcpy(compr->ops, &soc_compr_ops, sizeof(soc_compr_ops));
        }
 
-
-       /* Add copy callback for not memory mapped DSPs */
-       if (platform && platform->driver->compr_ops && platform->driver->compr_ops->copy)
-               compr->ops->copy = soc_compr_copy;
-
        for_each_rtdcom(rtd, rtdcom) {
                component = rtdcom->component;
 
-               /* ignore duplication for now */
-               if (platform && (component == &platform->component))
-                       continue;
-
                if (!component->driver->compr_ops ||
                    !component->driver->compr_ops->copy)
                        continue;
 
                compr->ops->copy = soc_compr_copy;
+               break;
        }
 
-
        mutex_init(&compr->lock);
        ret = snd_compress_new(rtd->card->snd_card, num, direction,
                                new_name, compr);