Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4b6316b4 authored by Kuninori Morimoto's avatar Kuninori Morimoto Committed by Mark Brown
Browse files

ASoC: ak4642: Add pll select support



Current ak4642 was not able to select pll.
This patch add support it.
It still expect PLL base input pin is MCKI.
see Table 5 "setting of PLL Mode" of datasheet

Signed-off-by: default avatarKuninori Morimoto <morimoto.kuninori@renesas.com>
Acked-by: default avatarLiam Girdwood <lrg@slimlogic.co.uk>
Signed-off-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
parent 778a76e2
Loading
Loading
Loading
Loading
+33 −7
Original line number Original line Diff line number Diff line
@@ -80,12 +80,18 @@


#define AK4642_CACHEREGNUM 	0x25
#define AK4642_CACHEREGNUM 	0x25


/* MD_CTL1 */
#define PLL3		(1 << 7)
#define PLL2		(1 << 6)
#define PLL1		(1 << 5)
#define PLL0		(1 << 4)
#define PLL_MASK	(PLL3 | PLL2 | PLL1 | PLL0)

struct snd_soc_codec_device soc_codec_dev_ak4642;
struct snd_soc_codec_device soc_codec_dev_ak4642;


/* codec private data */
/* codec private data */
struct ak4642_priv {
struct ak4642_priv {
	struct snd_soc_codec codec;
	struct snd_soc_codec codec;
	unsigned int sysclk;
};
};


static struct snd_soc_codec *ak4642_codec;
static struct snd_soc_codec *ak4642_codec;
@@ -249,9 +255,32 @@ static int ak4642_dai_set_sysclk(struct snd_soc_dai *codec_dai,
	int clk_id, unsigned int freq, int dir)
	int clk_id, unsigned int freq, int dir)
{
{
	struct snd_soc_codec *codec = codec_dai->codec;
	struct snd_soc_codec *codec = codec_dai->codec;
	struct ak4642_priv *ak4642 = codec->private_data;
	u8 pll;

	switch (freq) {
	case 11289600:
		pll = PLL2;
		break;
	case 12288000:
		pll = PLL2 | PLL0;
		break;
	case 12000000:
		pll = PLL2 | PLL1;
		break;
	case 24000000:
		pll = PLL2 | PLL1 | PLL0;
		break;
	case 13500000:
		pll = PLL3 | PLL2;
		break;
	case 27000000:
		pll = PLL3 | PLL2 | PLL0;
		break;
	default:
		return -EINVAL;
	}
	snd_soc_update_bits(codec, MD_CTL1, PLL_MASK, pll);


	ak4642->sysclk = freq;
	return 0;
	return 0;
}
}


@@ -342,7 +371,6 @@ static int ak4642_init(struct ak4642_priv *ak4642)
	 *
	 *
	 * Audio I/F Format: MSB justified (ADC & DAC)
	 * Audio I/F Format: MSB justified (ADC & DAC)
	 * BICK frequency at Master Mode: 64fs
	 * BICK frequency at Master Mode: 64fs
	 * Input Master Clock Select at PLL Mode: 11.2896MHz
	 * MCKO: Enable
	 * MCKO: Enable
	 * Sampling Frequency: 44.1kHz
	 * Sampling Frequency: 44.1kHz
	 *
	 *
@@ -352,10 +380,8 @@ static int ak4642_init(struct ak4642_priv *ak4642)
	 * please fix-me
	 * please fix-me
	 */
	 */
	ak4642_write(codec, 0x01, 0x08);
	ak4642_write(codec, 0x01, 0x08);
	ak4642_write(codec, 0x04, 0x4a);
	ak4642_write(codec, 0x05, 0x27);
	ak4642_write(codec, 0x05, 0x27);
	ak4642_write(codec, 0x00, 0x40);
	ak4642_write(codec, 0x04, 0x0a);
	ak4642_write(codec, 0x01, 0x0b);


	return ret;
	return ret;


+10 −0
Original line number Original line Diff line number Diff line
@@ -22,11 +22,21 @@
#include <sound/sh_fsi.h>
#include <sound/sh_fsi.h>
#include <../sound/soc/codecs/ak4642.h>
#include <../sound/soc/codecs/ak4642.h>


static int fsi_ak4642_dai_init(struct snd_soc_codec *codec)
{
	int ret;

	ret = snd_soc_dai_set_sysclk(&ak4642_dai, 0, 11289600, 0);

	return ret;
}

static struct snd_soc_dai_link fsi_dai_link = {
static struct snd_soc_dai_link fsi_dai_link = {
	.name		= "AK4642",
	.name		= "AK4642",
	.stream_name	= "AK4642",
	.stream_name	= "AK4642",
	.cpu_dai	= &fsi_soc_dai[0], /* fsi */
	.cpu_dai	= &fsi_soc_dai[0], /* fsi */
	.codec_dai	= &ak4642_dai,
	.codec_dai	= &ak4642_dai,
	.init		= fsi_ak4642_dai_init,
	.ops		= NULL,
	.ops		= NULL,
};
};