aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/sound/soc.h11
-rw-r--r--sound/soc/soc-core.c45
2 files changed, 51 insertions, 5 deletions
diff --git a/include/sound/soc.h b/include/sound/soc.h
index fbf57ff75958..813cdb95e049 100644
--- a/include/sound/soc.h
+++ b/include/sound/soc.h
@@ -795,6 +795,10 @@ struct snd_soc_component_driver {
795 int (*suspend)(struct snd_soc_component *); 795 int (*suspend)(struct snd_soc_component *);
796 int (*resume)(struct snd_soc_component *); 796 int (*resume)(struct snd_soc_component *);
797 797
798 /* component wide operations */
799 int (*set_sysclk)(struct snd_soc_component *component,
800 int clk_id, int source, unsigned int freq, int dir);
801
798 /* DT */ 802 /* DT */
799 int (*of_xlate_dai_name)(struct snd_soc_component *component, 803 int (*of_xlate_dai_name)(struct snd_soc_component *component,
800 struct of_phandle_args *args, 804 struct of_phandle_args *args,
@@ -865,6 +869,9 @@ struct snd_soc_component {
865 int (*suspend)(struct snd_soc_component *); 869 int (*suspend)(struct snd_soc_component *);
866 int (*resume)(struct snd_soc_component *); 870 int (*resume)(struct snd_soc_component *);
867 871
872 int (*set_sysclk)(struct snd_soc_component *component,
873 int clk_id, int source, unsigned int freq, int dir);
874
868 /* machine specific init */ 875 /* machine specific init */
869 int (*init)(struct snd_soc_component *component); 876 int (*init)(struct snd_soc_component *component);
870 877
@@ -1459,6 +1466,10 @@ void snd_soc_component_async_complete(struct snd_soc_component *component);
1459int snd_soc_component_test_bits(struct snd_soc_component *component, 1466int snd_soc_component_test_bits(struct snd_soc_component *component,
1460 unsigned int reg, unsigned int mask, unsigned int value); 1467 unsigned int reg, unsigned int mask, unsigned int value);
1461 1468
1469/* component wide operations */
1470int snd_soc_component_set_sysclk(struct snd_soc_component *component,
1471 int clk_id, int source, unsigned int freq, int dir);
1472
1462#ifdef CONFIG_REGMAP 1473#ifdef CONFIG_REGMAP
1463 1474
1464void snd_soc_component_init_regmap(struct snd_soc_component *component, 1475void snd_soc_component_init_regmap(struct snd_soc_component *component,
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index 10efd15338fb..654db550039d 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -2590,11 +2590,9 @@ int snd_soc_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id,
2590{ 2590{
2591 if (dai->driver && dai->driver->ops->set_sysclk) 2591 if (dai->driver && dai->driver->ops->set_sysclk)
2592 return dai->driver->ops->set_sysclk(dai, clk_id, freq, dir); 2592 return dai->driver->ops->set_sysclk(dai, clk_id, freq, dir);
2593 else if (dai->codec && dai->codec->driver->set_sysclk) 2593
2594 return dai->codec->driver->set_sysclk(dai->codec, clk_id, 0, 2594 return snd_soc_component_set_sysclk(dai->component, clk_id, 0,
2595 freq, dir); 2595 freq, dir);
2596 else
2597 return -ENOTSUPP;
2598} 2596}
2599EXPORT_SYMBOL_GPL(snd_soc_dai_set_sysclk); 2597EXPORT_SYMBOL_GPL(snd_soc_dai_set_sysclk);
2600 2598
@@ -2620,6 +2618,32 @@ int snd_soc_codec_set_sysclk(struct snd_soc_codec *codec, int clk_id,
2620EXPORT_SYMBOL_GPL(snd_soc_codec_set_sysclk); 2618EXPORT_SYMBOL_GPL(snd_soc_codec_set_sysclk);
2621 2619
2622/** 2620/**
2621 * snd_soc_component_set_sysclk - configure COMPONENT system or master clock.
2622 * @component: COMPONENT
2623 * @clk_id: DAI specific clock ID
2624 * @source: Source for the clock
2625 * @freq: new clock frequency in Hz
2626 * @dir: new clock direction - input/output.
2627 *
2628 * Configures the CODEC master (MCLK) or system (SYSCLK) clocking.
2629 */
2630int snd_soc_component_set_sysclk(struct snd_soc_component *component, int clk_id,
2631 int source, unsigned int freq, int dir)
2632{
2633 /* will be removed */
2634 if (component->set_sysclk)
2635 return component->set_sysclk(component, clk_id, source,
2636 freq, dir);
2637
2638 if (component->driver->set_sysclk)
2639 return component->driver->set_sysclk(component, clk_id, source,
2640 freq, dir);
2641
2642 return -ENOTSUPP;
2643}
2644EXPORT_SYMBOL_GPL(snd_soc_component_set_sysclk);
2645
2646/**
2623 * snd_soc_dai_set_clkdiv - configure DAI clock dividers. 2647 * snd_soc_dai_set_clkdiv - configure DAI clock dividers.
2624 * @dai: DAI 2648 * @dai: DAI
2625 * @div_id: DAI specific clock divider ID 2649 * @div_id: DAI specific clock divider ID
@@ -3174,6 +3198,7 @@ static int snd_soc_component_initialize(struct snd_soc_component *component,
3174 component->remove = component->driver->remove; 3198 component->remove = component->driver->remove;
3175 component->suspend = component->driver->suspend; 3199 component->suspend = component->driver->suspend;
3176 component->resume = component->driver->resume; 3200 component->resume = component->driver->resume;
3201 component->set_sysclk = component->driver->set_sysclk;
3177 3202
3178 dapm = &component->dapm; 3203 dapm = &component->dapm;
3179 dapm->dev = dev; 3204 dapm->dev = dev;
@@ -3557,6 +3582,14 @@ static int snd_soc_codec_drv_read(struct snd_soc_component *component,
3557 return 0; 3582 return 0;
3558} 3583}
3559 3584
3585static int snd_soc_codec_set_sysclk_(struct snd_soc_component *component,
3586 int clk_id, int source, unsigned int freq, int dir)
3587{
3588 struct snd_soc_codec *codec = snd_soc_component_to_codec(component);
3589
3590 return snd_soc_codec_set_sysclk(codec, clk_id, source, freq, dir);
3591}
3592
3560static int snd_soc_codec_set_bias_level(struct snd_soc_dapm_context *dapm, 3593static int snd_soc_codec_set_bias_level(struct snd_soc_dapm_context *dapm,
3561 enum snd_soc_bias_level level) 3594 enum snd_soc_bias_level level)
3562{ 3595{
@@ -3608,6 +3641,8 @@ int snd_soc_register_codec(struct device *dev,
3608 codec->component.write = snd_soc_codec_drv_write; 3641 codec->component.write = snd_soc_codec_drv_write;
3609 if (codec_drv->read) 3642 if (codec_drv->read)
3610 codec->component.read = snd_soc_codec_drv_read; 3643 codec->component.read = snd_soc_codec_drv_read;
3644 if (codec_drv->set_sysclk)
3645 codec->component.set_sysclk = snd_soc_codec_set_sysclk_;
3611 codec->component.ignore_pmdown_time = codec_drv->ignore_pmdown_time; 3646 codec->component.ignore_pmdown_time = codec_drv->ignore_pmdown_time;
3612 3647
3613 dapm = snd_soc_codec_get_dapm(codec); 3648 dapm = snd_soc_codec_get_dapm(codec);