ASoC: add Component level set_sysclk
[sfrench/cifs-2.6.git] / sound / soc / soc-core.c
index 10efd15338fba0c1ccc431e4642ae119160458f4..654db550039d88be43e569d7c6c08651af030cb1 100644 (file)
@@ -2590,11 +2590,9 @@ int snd_soc_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id,
 {
        if (dai->driver && dai->driver->ops->set_sysclk)
                return dai->driver->ops->set_sysclk(dai, clk_id, freq, dir);
-       else if (dai->codec && dai->codec->driver->set_sysclk)
-               return dai->codec->driver->set_sysclk(dai->codec, clk_id, 0,
-                                                     freq, dir);
-       else
-               return -ENOTSUPP;
+
+       return snd_soc_component_set_sysclk(dai->component, clk_id, 0,
+                                           freq, dir);
 }
 EXPORT_SYMBOL_GPL(snd_soc_dai_set_sysclk);
 
@@ -2619,6 +2617,32 @@ int snd_soc_codec_set_sysclk(struct snd_soc_codec *codec, int clk_id,
 }
 EXPORT_SYMBOL_GPL(snd_soc_codec_set_sysclk);
 
+/**
+ * snd_soc_component_set_sysclk - configure COMPONENT system or master clock.
+ * @component: COMPONENT
+ * @clk_id: DAI specific clock ID
+ * @source: Source for the clock
+ * @freq: new clock frequency in Hz
+ * @dir: new clock direction - input/output.
+ *
+ * Configures the CODEC master (MCLK) or system (SYSCLK) clocking.
+ */
+int snd_soc_component_set_sysclk(struct snd_soc_component *component, int clk_id,
+                            int source, unsigned int freq, int dir)
+{
+       /* will be removed */
+       if (component->set_sysclk)
+               return component->set_sysclk(component, clk_id, source,
+                                            freq, dir);
+
+       if (component->driver->set_sysclk)
+               return component->driver->set_sysclk(component, clk_id, source,
+                                                freq, dir);
+
+       return -ENOTSUPP;
+}
+EXPORT_SYMBOL_GPL(snd_soc_component_set_sysclk);
+
 /**
  * snd_soc_dai_set_clkdiv - configure DAI clock dividers.
  * @dai: DAI
@@ -3174,6 +3198,7 @@ static int snd_soc_component_initialize(struct snd_soc_component *component,
        component->remove = component->driver->remove;
        component->suspend = component->driver->suspend;
        component->resume = component->driver->resume;
+       component->set_sysclk = component->driver->set_sysclk;
 
        dapm = &component->dapm;
        dapm->dev = dev;
@@ -3557,6 +3582,14 @@ static int snd_soc_codec_drv_read(struct snd_soc_component *component,
        return 0;
 }
 
+static int snd_soc_codec_set_sysclk_(struct snd_soc_component *component,
+                         int clk_id, int source, unsigned int freq, int dir)
+{
+       struct snd_soc_codec *codec = snd_soc_component_to_codec(component);
+
+       return snd_soc_codec_set_sysclk(codec, clk_id, source, freq, dir);
+}
+
 static int snd_soc_codec_set_bias_level(struct snd_soc_dapm_context *dapm,
        enum snd_soc_bias_level level)
 {
@@ -3608,6 +3641,8 @@ int snd_soc_register_codec(struct device *dev,
                codec->component.write = snd_soc_codec_drv_write;
        if (codec_drv->read)
                codec->component.read = snd_soc_codec_drv_read;
+       if (codec_drv->set_sysclk)
+               codec->component.set_sysclk = snd_soc_codec_set_sysclk_;
        codec->component.ignore_pmdown_time = codec_drv->ignore_pmdown_time;
 
        dapm = snd_soc_codec_get_dapm(codec);