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: Kuninori Morimoto <morimoto.kuninori@renesas.com> Acked-by: Liam Girdwood <lrg@slimlogic.co.uk> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
This commit is contained in:
committed by
Mark Brown
parent
778a76e2db
commit
4b6316b4b1
@@ -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;
|
||||||
|
|
||||||
|
@@ -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,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user