[alsa-devel] [PATCH v6, 2/2] ASoC: AMD: Enable/Disable auxiliary clock via common clock framework

Adam Thomson Adam.Thomson.Opensource at diasemi.com
Mon Apr 9 14:28:02 CEST 2018


On 09 April 2018 10:20, Akshu Agrawal wrote:

> This enables/disables and sets auxiliary clock at 25Mhz. It uses
> common clock framework for proper ref counting. This approach will
> save power in comparison to keeping it always On in firmware.
> 
> TEST= aplay -vv <file>
> check register to see clock enabled
> kill aplay
> check register to see clock disabled
> 
> Signed-off-by: Akshu Agrawal <akshu.agrawal at amd.com>
> Acked-by: Alex Deucher <alexander.deucher at amd.com>
> ---
> V2: Correcting the pin to OSCOUT1 from OSCOUT2
> V3: Fix error/warnings from kbuild test
> V4: Fix build errors for platform which do not support CONFIG_COMMON_CLK
> V5: Review comments by Dan and Sriram
> V6: Adding COMMON_CLK to Kconfig, moving clk_get to register, var name changes
> 
>  sound/soc/amd/Kconfig                |   2 +-
>  sound/soc/amd/acp-da7219-max98357a.c | 150
> +++++++++++++++++++++++++++++++++--
>  2 files changed, 146 insertions(+), 6 deletions(-)
> 
> diff --git a/sound/soc/amd/Kconfig b/sound/soc/amd/Kconfig
> index 6cbf9cf..8104f8f 100644
> --- a/sound/soc/amd/Kconfig
> +++ b/sound/soc/amd/Kconfig
> @@ -8,7 +8,7 @@ config SND_SOC_AMD_CZ_DA7219MX98357_MACH
>  	select SND_SOC_DA7219
>  	select SND_SOC_MAX98357A
>  	select SND_SOC_ADAU7002
> -	depends on SND_SOC_AMD_ACP && I2C
> +	depends on SND_SOC_AMD_ACP && I2C && COMMON_CLK
>  	help
>  	 This option enables machine driver for DA7219 and MAX9835.
> 
> diff --git a/sound/soc/amd/acp-da7219-max98357a.c b/sound/soc/amd/acp-
> da7219-max98357a.c
> index 1012a80..29847f7 100644
> --- a/sound/soc/amd/acp-da7219-max98357a.c
> +++ b/sound/soc/amd/acp-da7219-max98357a.c
> @@ -30,21 +30,42 @@
>  #include <sound/soc-dapm.h>
>  #include <sound/jack.h>
>  #include <linux/clk.h>
> +#include <linux/clkdev.h>
> +#include <linux/clk-provider.h>
>  #include <linux/gpio.h>
>  #include <linux/module.h>
>  #include <linux/i2c.h>
>  #include <linux/input.h>
>  #include <linux/acpi.h>
> +#include <linux/types.h>
> 
>  #include "../codecs/da7219.h"
>  #include "../codecs/da7219-aad.h"
> 
> -#define CZ_PLAT_CLK 24000000
> -#define MCLK_RATE 24576000
> +#define CZ_PLAT_CLK 25000000
> +#define DA7219_PLL_OUT 24576000
>  #define DUAL_CHANNEL		2
> 
> +/* Clock Driving Strength 2 register */
> +#define CLKDRVSTR2	0x28
> +/* Clock Control 1 register */
> +#define MISCCLKCNTL1	0x40
> +/* Auxiliary clock1 enable bit */
> +#define OSCCLKENB	2
> +/* 25Mhz auxiliary output clock freq bit */
> +#define OSCOUT1CLK25MHZ	16
> +
> +struct cz_clock {
> +	const char* acp_clk_name;
> +	struct clk_hw acp_clk_hw;
> +	struct clk_lookup *acp_clk_lookup;
> +	struct clk *acp_clk;
> +	void __iomem *res_base;
> +};
> +
>  static struct snd_soc_jack cz_jack;
> -struct clk *da7219_dai_clk;
> +static struct clk *da7219_dai_clk;
> +static struct clk *acpd7219_clk;
> 
>  static int cz_da7219_init(struct snd_soc_pcm_runtime *rtd)
>  {
> @@ -64,13 +85,18 @@ static int cz_da7219_init(struct snd_soc_pcm_runtime *rtd)
>  	}
> 
>  	ret = snd_soc_dai_set_pll(codec_dai, 0, DA7219_SYSCLK_PLL,
> -				  CZ_PLAT_CLK, MCLK_RATE);
> +				  CZ_PLAT_CLK, DA7219_PLL_OUT);

For the PLL_OUT value you should use one of the following:

 - For 48KHz family of SRs:	'DA7219_PLL_FREQ_OUT_98304'
 - For 44.1KHz family of SRs:	'DA7219_PLL_FREQ_OUT_90316'

These will ensure correct calculations in the codec's set_pll() function for the
sampling rate family you require.


More information about the Alsa-devel mailing list