diff options
Diffstat (limited to 'sound/soc/intel/boards/sof_realtek_common.c')
| -rw-r--r-- | sound/soc/intel/boards/sof_realtek_common.c | 119 | 
1 files changed, 116 insertions, 3 deletions
| diff --git a/sound/soc/intel/boards/sof_realtek_common.c b/sound/soc/intel/boards/sof_realtek_common.c index 2ec34f8df9e1..4cf131310ad3 100644 --- a/sound/soc/intel/boards/sof_realtek_common.c +++ b/sound/soc/intel/boards/sof_realtek_common.c @@ -12,12 +12,13 @@  #include <sound/soc-dapm.h>  #include <uapi/sound/asound.h>  #include "../../codecs/rt1011.h" +#include "../../codecs/rt1015.h"  #include "sof_realtek_common.h"  /*   * Current only 2-amp configuration is supported for rt1011   */ -static const struct snd_soc_dapm_route rt1011_dapm_routes[] = { +static const struct snd_soc_dapm_route speaker_map_lr[] = {  	/* speaker */  	{ "Left Spk", NULL, "Left SPO" },  	{ "Right Spk", NULL, "Right SPO" }, @@ -117,8 +118,8 @@ static int rt1011_init(struct snd_soc_pcm_runtime *rtd)  	struct snd_soc_card *card = rtd->card;  	int ret; -	ret = snd_soc_dapm_add_routes(&card->dapm, rt1011_dapm_routes, -				      ARRAY_SIZE(rt1011_dapm_routes)); +	ret = snd_soc_dapm_add_routes(&card->dapm, speaker_map_lr, +				      ARRAY_SIZE(speaker_map_lr));  	if (ret)  		dev_err(rtd->dev, "Speaker map addition failed: %d\n", ret);  	return ret; @@ -241,3 +242,115 @@ void sof_rt1015p_codec_conf(struct snd_soc_card *card)  	card->codec_conf = rt1015p_codec_confs;  	card->num_configs = ARRAY_SIZE(rt1015p_codec_confs);  } + +/* + * RT1015 audio amplifier + */ + +static int rt1015_hw_params(struct snd_pcm_substream *substream, +			    struct snd_pcm_hw_params *params) +{ +	struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); +	struct snd_soc_dai *codec_dai; +	int i, fs = 64, ret; + +	for_each_rtd_codec_dais(rtd, i, codec_dai) { +		ret = snd_soc_dai_set_pll(codec_dai, 0, RT1015_PLL_S_BCLK, +					  params_rate(params) * fs, +					  params_rate(params) * 256); +		if (ret) +			return ret; + +		ret = snd_soc_dai_set_sysclk(codec_dai, RT1015_SCLK_S_PLL, +					     params_rate(params) * 256, +					     SND_SOC_CLOCK_IN); +		if (ret) +			return ret; +	} + +	return 0; +} + +static int rt1015_hw_params_pll_and_tdm(struct snd_pcm_substream *substream, +					 struct snd_pcm_hw_params *params) +{ +	struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); +	struct snd_soc_dai *codec_dai; +	int i, fs = 100, ret; + +	for_each_rtd_codec_dais(rtd, i, codec_dai) { +		ret = snd_soc_dai_set_pll(codec_dai, 0, RT1015_PLL_S_BCLK, +					  params_rate(params) * fs, +					  params_rate(params) * 256); +		if (ret) +			return ret; + +		ret = snd_soc_dai_set_sysclk(codec_dai, RT1015_SCLK_S_PLL, +					     params_rate(params) * 256, +					     SND_SOC_CLOCK_IN); +		if (ret) +			return ret; +	} +	/* rx slot 1 for RT1015_DEV0_NAME */ +	ret = snd_soc_dai_set_tdm_slot(asoc_rtd_to_codec(rtd, 0), +				       0x0, 0x1, 4, 24); +	if (ret) +		return ret; + +	/* rx slot 2 for RT1015_DEV1_NAME */ +	ret = snd_soc_dai_set_tdm_slot(asoc_rtd_to_codec(rtd, 1), +				       0x0, 0x2, 4, 24); +	if (ret) +		return ret; + +	return 0; +} + +static struct snd_soc_ops rt1015_ops = { +	.hw_params = rt1015_hw_params, +}; + +static struct snd_soc_codec_conf rt1015_amp_conf[] = { +	{ +		.dlc = COMP_CODEC_CONF(RT1015_DEV0_NAME), +		.name_prefix = "Left", +	}, +	{ +		.dlc = COMP_CODEC_CONF(RT1015_DEV1_NAME), +		.name_prefix = "Right", +	}, +}; + +static struct snd_soc_dai_link_component rt1015_components[] = { +	{ +		.name = RT1015_DEV0_NAME, +		.dai_name = RT1015_CODEC_DAI, +	}, +	{ +		.name = RT1015_DEV1_NAME, +		.dai_name = RT1015_CODEC_DAI, +	}, +}; + +static int speaker_codec_init_lr(struct snd_soc_pcm_runtime *rtd) +{ +	return snd_soc_dapm_add_routes(&rtd->card->dapm, speaker_map_lr, +					ARRAY_SIZE(speaker_map_lr)); +} + +void sof_rt1015_codec_conf(struct snd_soc_card *card) +{ +	card->codec_conf = rt1015_amp_conf; +	card->num_configs = ARRAY_SIZE(rt1015_amp_conf); +} + +void sof_rt1015_dai_link(struct snd_soc_dai_link *link, unsigned int fs) +{ +	link->codecs = rt1015_components; +	link->num_codecs = ARRAY_SIZE(rt1015_components); +	link->init = speaker_codec_init_lr; +	link->ops = &rt1015_ops; + +	if (fs == 100) +		rt1015_ops.hw_params = rt1015_hw_params_pll_and_tdm; +} |