diff options
| -rw-r--r-- | include/sound/soc.h | 11 | ||||
| -rw-r--r-- | sound/soc/soc-core.c | 45 |
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); | |||
| 1459 | int snd_soc_component_test_bits(struct snd_soc_component *component, | 1466 | int 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 */ | ||
| 1470 | int 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 | ||
| 1464 | void snd_soc_component_init_regmap(struct snd_soc_component *component, | 1475 | void 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 | } |
| 2599 | EXPORT_SYMBOL_GPL(snd_soc_dai_set_sysclk); | 2597 | EXPORT_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, | |||
| 2620 | EXPORT_SYMBOL_GPL(snd_soc_codec_set_sysclk); | 2618 | EXPORT_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 | */ | ||
| 2630 | int 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 | } | ||
| 2644 | EXPORT_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 | ||
| 3585 | static 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 | |||
| 3560 | static int snd_soc_codec_set_bias_level(struct snd_soc_dapm_context *dapm, | 3593 | static 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); |
