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

Commit 62e951ea authored by Mark Brown's avatar Mark Brown
Browse files

Merge remote-tracking branches 'asoc/topic/atmel', 'asoc/topic/cirrus' and...

Merge remote-tracking branches 'asoc/topic/atmel', 'asoc/topic/cirrus' and 'asoc/topic/cleanup' into asoc-next
Loading
Loading
Loading
Loading
+13 −0
Original line number Original line Diff line number Diff line
@@ -83,16 +83,26 @@ EXPORT_SYMBOL(ssc_free);


static struct atmel_ssc_platform_data at91rm9200_config = {
static struct atmel_ssc_platform_data at91rm9200_config = {
	.use_dma = 0,
	.use_dma = 0,
	.has_fslen_ext = 0,
};

static struct atmel_ssc_platform_data at91sam9rl_config = {
	.use_dma = 0,
	.has_fslen_ext = 1,
};
};


static struct atmel_ssc_platform_data at91sam9g45_config = {
static struct atmel_ssc_platform_data at91sam9g45_config = {
	.use_dma = 1,
	.use_dma = 1,
	.has_fslen_ext = 1,
};
};


static const struct platform_device_id atmel_ssc_devtypes[] = {
static const struct platform_device_id atmel_ssc_devtypes[] = {
	{
	{
		.name = "at91rm9200_ssc",
		.name = "at91rm9200_ssc",
		.driver_data = (unsigned long) &at91rm9200_config,
		.driver_data = (unsigned long) &at91rm9200_config,
	}, {
		.name = "at91sam9rl_ssc",
		.driver_data = (unsigned long) &at91sam9rl_config,
	}, {
	}, {
		.name = "at91sam9g45_ssc",
		.name = "at91sam9g45_ssc",
		.driver_data = (unsigned long) &at91sam9g45_config,
		.driver_data = (unsigned long) &at91sam9g45_config,
@@ -106,6 +116,9 @@ static const struct of_device_id atmel_ssc_dt_ids[] = {
	{
	{
		.compatible = "atmel,at91rm9200-ssc",
		.compatible = "atmel,at91rm9200-ssc",
		.data = &at91rm9200_config,
		.data = &at91rm9200_config,
	}, {
		.compatible = "atmel,at91sam9rl-ssc",
		.data = &at91sam9rl_config,
	}, {
	}, {
		.compatible = "atmel,at91sam9g45-ssc",
		.compatible = "atmel,at91sam9g45-ssc",
		.data = &at91sam9g45_config,
		.data = &at91sam9g45_config,
+13 −0
Original line number Original line Diff line number Diff line
@@ -7,6 +7,7 @@


struct atmel_ssc_platform_data {
struct atmel_ssc_platform_data {
	int			use_dma;
	int			use_dma;
	int			has_fslen_ext;
};
};


struct ssc_device {
struct ssc_device {
@@ -71,6 +72,12 @@ void ssc_free(struct ssc_device *ssc);
#define SSC_RFMR_DATNB_OFFSET			 8
#define SSC_RFMR_DATNB_OFFSET			 8
#define SSC_RFMR_FSEDGE_SIZE			 1
#define SSC_RFMR_FSEDGE_SIZE			 1
#define SSC_RFMR_FSEDGE_OFFSET			24
#define SSC_RFMR_FSEDGE_OFFSET			24
/*
 * The FSLEN_EXT exist on at91sam9rl, at91sam9g10,
 * at91sam9g20, and at91sam9g45 and newer SoCs
 */
#define SSC_RFMR_FSLEN_EXT_SIZE			 4
#define SSC_RFMR_FSLEN_EXT_OFFSET		28
#define SSC_RFMR_FSLEN_SIZE			 4
#define SSC_RFMR_FSLEN_SIZE			 4
#define SSC_RFMR_FSLEN_OFFSET			16
#define SSC_RFMR_FSLEN_OFFSET			16
#define SSC_RFMR_FSOS_SIZE			 4
#define SSC_RFMR_FSOS_SIZE			 4
@@ -109,6 +116,12 @@ void ssc_free(struct ssc_device *ssc);
#define SSC_TFMR_FSDEN_OFFSET			23
#define SSC_TFMR_FSDEN_OFFSET			23
#define SSC_TFMR_FSEDGE_SIZE			 1
#define SSC_TFMR_FSEDGE_SIZE			 1
#define SSC_TFMR_FSEDGE_OFFSET			24
#define SSC_TFMR_FSEDGE_OFFSET			24
/*
 * The FSLEN_EXT exist on at91sam9rl, at91sam9g10,
 * at91sam9g20, and at91sam9g45 and newer SoCs
 */
#define SSC_TFMR_FSLEN_EXT_SIZE			 4
#define SSC_TFMR_FSLEN_EXT_OFFSET		28
#define SSC_TFMR_FSLEN_SIZE			 4
#define SSC_TFMR_FSLEN_SIZE			 4
#define SSC_TFMR_FSLEN_OFFSET			16
#define SSC_TFMR_FSLEN_OFFSET			16
#define SSC_TFMR_FSOS_SIZE			 3
#define SSC_TFMR_FSOS_SIZE			 3
+18 −16
Original line number Original line Diff line number Diff line
@@ -347,6 +347,7 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,
	u32 tfmr, rfmr, tcmr, rcmr;
	u32 tfmr, rfmr, tcmr, rcmr;
	int start_event;
	int start_event;
	int ret;
	int ret;
	int fslen, fslen_ext;


	/*
	/*
	 * Currently, there is only one set of dma params for
	 * Currently, there is only one set of dma params for
@@ -387,18 +388,6 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,
		return -EINVAL;
		return -EINVAL;
	}
	}


	/*
	 * The SSC only supports up to 16-bit samples in I2S format, due
	 * to the size of the Frame Mode Register FSLEN field.
	 */
	if ((ssc_p->daifmt & SND_SOC_DAIFMT_FORMAT_MASK) == SND_SOC_DAIFMT_I2S
		&& bits > 16) {
		printk(KERN_WARNING
				"atmel_ssc_dai: sample size %d "
				"is too large for I2S\n", bits);
		return -EINVAL;
	}

	/*
	/*
	 * Compute SSC register settings.
	 * Compute SSC register settings.
	 */
	 */
@@ -413,6 +402,17 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,
		 * from the MCK divider, and the BCLK signal
		 * from the MCK divider, and the BCLK signal
		 * is output on the SSC TK line.
		 * is output on the SSC TK line.
		 */
		 */

		if (bits > 16 && !ssc->pdata->has_fslen_ext) {
			dev_err(dai->dev,
				"sample size %d is too large for SSC device\n",
				bits);
			return -EINVAL;
		}

		fslen_ext = (bits - 1) / 16;
		fslen = (bits - 1) % 16;

		rcmr =	  SSC_BF(RCMR_PERIOD, ssc_p->rcmr_period)
		rcmr =	  SSC_BF(RCMR_PERIOD, ssc_p->rcmr_period)
			| SSC_BF(RCMR_STTDLY, START_DELAY)
			| SSC_BF(RCMR_STTDLY, START_DELAY)
			| SSC_BF(RCMR_START, SSC_START_FALLING_RF)
			| SSC_BF(RCMR_START, SSC_START_FALLING_RF)
@@ -420,9 +420,10 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,
			| SSC_BF(RCMR_CKO, SSC_CKO_NONE)
			| SSC_BF(RCMR_CKO, SSC_CKO_NONE)
			| SSC_BF(RCMR_CKS, SSC_CKS_DIV);
			| SSC_BF(RCMR_CKS, SSC_CKS_DIV);


		rfmr =	  SSC_BF(RFMR_FSEDGE, SSC_FSEDGE_POSITIVE)
		rfmr =    SSC_BF(RFMR_FSLEN_EXT, fslen_ext)
			| SSC_BF(RFMR_FSEDGE, SSC_FSEDGE_POSITIVE)
			| SSC_BF(RFMR_FSOS, SSC_FSOS_NEGATIVE)
			| SSC_BF(RFMR_FSOS, SSC_FSOS_NEGATIVE)
			| SSC_BF(RFMR_FSLEN, (bits - 1))
			| SSC_BF(RFMR_FSLEN, fslen)
			| SSC_BF(RFMR_DATNB, (channels - 1))
			| SSC_BF(RFMR_DATNB, (channels - 1))
			| SSC_BIT(RFMR_MSBF)
			| SSC_BIT(RFMR_MSBF)
			| SSC_BF(RFMR_LOOP, 0)
			| SSC_BF(RFMR_LOOP, 0)
@@ -435,10 +436,11 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,
			| SSC_BF(TCMR_CKO, SSC_CKO_CONTINUOUS)
			| SSC_BF(TCMR_CKO, SSC_CKO_CONTINUOUS)
			| SSC_BF(TCMR_CKS, SSC_CKS_DIV);
			| SSC_BF(TCMR_CKS, SSC_CKS_DIV);


		tfmr =	  SSC_BF(TFMR_FSEDGE, SSC_FSEDGE_POSITIVE)
		tfmr =    SSC_BF(TFMR_FSLEN_EXT, fslen_ext)
			| SSC_BF(TFMR_FSEDGE, SSC_FSEDGE_POSITIVE)
			| SSC_BF(TFMR_FSDEN, 0)
			| SSC_BF(TFMR_FSDEN, 0)
			| SSC_BF(TFMR_FSOS, SSC_FSOS_NEGATIVE)
			| SSC_BF(TFMR_FSOS, SSC_FSOS_NEGATIVE)
			| SSC_BF(TFMR_FSLEN, (bits - 1))
			| SSC_BF(TFMR_FSLEN, fslen)
			| SSC_BF(TFMR_DATNB, (channels - 1))
			| SSC_BF(TFMR_DATNB, (channels - 1))
			| SSC_BIT(TFMR_MSBF)
			| SSC_BIT(TFMR_MSBF)
			| SSC_BF(TFMR_DATDEF, 0)
			| SSC_BF(TFMR_DATDEF, 0)
+0 −50
Original line number Original line Diff line number Diff line
@@ -18,10 +18,6 @@
#include "../codecs/wm8904.h"
#include "../codecs/wm8904.h"
#include "atmel_ssc_dai.h"
#include "atmel_ssc_dai.h"


#define MCLK_RATE 32768

static struct clk *mclk;

static const struct snd_soc_dapm_widget atmel_asoc_wm8904_dapm_widgets[] = {
static const struct snd_soc_dapm_widget atmel_asoc_wm8904_dapm_widgets[] = {
	SND_SOC_DAPM_HP("Headphone Jack", NULL),
	SND_SOC_DAPM_HP("Headphone Jack", NULL),
	SND_SOC_DAPM_MIC("Mic", NULL),
	SND_SOC_DAPM_MIC("Mic", NULL),
@@ -61,26 +57,6 @@ static struct snd_soc_ops atmel_asoc_wm8904_ops = {
	.hw_params = atmel_asoc_wm8904_hw_params,
	.hw_params = atmel_asoc_wm8904_hw_params,
};
};


static int atmel_set_bias_level(struct snd_soc_card *card,
		struct snd_soc_dapm_context *dapm,
		enum snd_soc_bias_level level)
{
	if (dapm->bias_level == SND_SOC_BIAS_STANDBY) {
		switch (level) {
		case SND_SOC_BIAS_PREPARE:
			clk_prepare_enable(mclk);
			break;
		case SND_SOC_BIAS_OFF:
			clk_disable_unprepare(mclk);
			break;
		default:
			break;
		}
	}

	return 0;
};

static struct snd_soc_dai_link atmel_asoc_wm8904_dailink = {
static struct snd_soc_dai_link atmel_asoc_wm8904_dailink = {
	.name = "WM8904",
	.name = "WM8904",
	.stream_name = "WM8904 PCM",
	.stream_name = "WM8904 PCM",
@@ -94,7 +70,6 @@ static struct snd_soc_dai_link atmel_asoc_wm8904_dailink = {
static struct snd_soc_card atmel_asoc_wm8904_card = {
static struct snd_soc_card atmel_asoc_wm8904_card = {
	.name = "atmel_asoc_wm8904",
	.name = "atmel_asoc_wm8904",
	.owner = THIS_MODULE,
	.owner = THIS_MODULE,
	.set_bias_level = atmel_set_bias_level,
	.dai_link = &atmel_asoc_wm8904_dailink,
	.dai_link = &atmel_asoc_wm8904_dailink,
	.num_links = 1,
	.num_links = 1,
	.dapm_widgets = atmel_asoc_wm8904_dapm_widgets,
	.dapm_widgets = atmel_asoc_wm8904_dapm_widgets,
@@ -153,7 +128,6 @@ static int atmel_asoc_wm8904_probe(struct platform_device *pdev)
{
{
	struct snd_soc_card *card = &atmel_asoc_wm8904_card;
	struct snd_soc_card *card = &atmel_asoc_wm8904_card;
	struct snd_soc_dai_link *dailink = &atmel_asoc_wm8904_dailink;
	struct snd_soc_dai_link *dailink = &atmel_asoc_wm8904_dailink;
	struct clk *clk_src;
	int id, ret;
	int id, ret;


	card->dev = &pdev->dev;
	card->dev = &pdev->dev;
@@ -170,30 +144,6 @@ static int atmel_asoc_wm8904_probe(struct platform_device *pdev)
		return ret;
		return ret;
	}
	}


	mclk = clk_get(NULL, "pck0");
	if (IS_ERR(mclk)) {
		dev_err(&pdev->dev, "failed to get pck0\n");
		ret = PTR_ERR(mclk);
		goto err_set_audio;
	}

	clk_src = clk_get(NULL, "clk32k");
	if (IS_ERR(clk_src)) {
		dev_err(&pdev->dev, "failed to get clk32k\n");
		ret = PTR_ERR(clk_src);
		goto err_set_audio;
	}

	ret = clk_set_parent(mclk, clk_src);
	clk_put(clk_src);
	if (ret != 0) {
		dev_err(&pdev->dev, "failed to set MCLK parent\n");
		goto err_set_audio;
	}

	dev_info(&pdev->dev, "setting pck0 to %dHz\n", MCLK_RATE);
	clk_set_rate(mclk, MCLK_RATE);

	ret = snd_soc_register_card(card);
	ret = snd_soc_register_card(card);
	if (ret) {
	if (ret) {
		dev_err(&pdev->dev, "snd_soc_register_card failed\n");
		dev_err(&pdev->dev, "snd_soc_register_card failed\n");
+7 −7
Original line number Original line Diff line number Diff line
@@ -399,15 +399,15 @@ static const struct snd_kcontrol_new cs42l52_snd_controls[] = {
			      CS42L52_MASTERB_VOL, 0, 0x34, 0xE4, hl_tlv),
			      CS42L52_MASTERB_VOL, 0, 0x34, 0xE4, hl_tlv),


	SOC_DOUBLE_R_SX_TLV("Headphone Volume", CS42L52_HPA_VOL,
	SOC_DOUBLE_R_SX_TLV("Headphone Volume", CS42L52_HPA_VOL,
			      CS42L52_HPB_VOL, 0, 0x34, 0xCC, hpd_tlv),
			      CS42L52_HPB_VOL, 0, 0x34, 0xC0, hpd_tlv),


	SOC_ENUM("Headphone Analog Gain", hp_gain_enum),
	SOC_ENUM("Headphone Analog Gain", hp_gain_enum),


	SOC_DOUBLE_R_SX_TLV("Speaker Volume", CS42L52_SPKA_VOL,
	SOC_DOUBLE_R_SX_TLV("Speaker Volume", CS42L52_SPKA_VOL,
			      CS42L52_SPKB_VOL, 0, 0x1, 0xff, hl_tlv),
			      CS42L52_SPKB_VOL, 0, 0x40, 0xC0, hl_tlv),


	SOC_DOUBLE_R_SX_TLV("Bypass Volume", CS42L52_PASSTHRUA_VOL,
	SOC_DOUBLE_R_SX_TLV("Bypass Volume", CS42L52_PASSTHRUA_VOL,
			      CS42L52_PASSTHRUB_VOL, 6, 0x18, 0x90, pga_tlv),
			      CS42L52_PASSTHRUB_VOL, 0, 0x88, 0x90, pga_tlv),


	SOC_DOUBLE("Bypass Mute", CS42L52_MISC_CTL, 4, 5, 1, 0),
	SOC_DOUBLE("Bypass Mute", CS42L52_MISC_CTL, 4, 5, 1, 0),


@@ -417,10 +417,10 @@ static const struct snd_kcontrol_new cs42l52_snd_controls[] = {
	SOC_ENUM("MIC Bias Level", mic_bias_level_enum),
	SOC_ENUM("MIC Bias Level", mic_bias_level_enum),


	SOC_DOUBLE_R_SX_TLV("ADC Volume", CS42L52_ADCA_VOL,
	SOC_DOUBLE_R_SX_TLV("ADC Volume", CS42L52_ADCA_VOL,
			      CS42L52_ADCB_VOL, 7, 0x80, 0xA0, ipd_tlv),
			      CS42L52_ADCB_VOL, 0, 0xA0, 0x78, ipd_tlv),
	SOC_DOUBLE_R_SX_TLV("ADC Mixer Volume",
	SOC_DOUBLE_R_SX_TLV("ADC Mixer Volume",
			     CS42L52_ADCA_MIXER_VOL, CS42L52_ADCB_MIXER_VOL,
			     CS42L52_ADCA_MIXER_VOL, CS42L52_ADCB_MIXER_VOL,
				6, 0x7f, 0x19, ipd_tlv),
				0, 0x19, 0x7F, ipd_tlv),


	SOC_DOUBLE("ADC Switch", CS42L52_ADC_MISC_CTL, 0, 1, 1, 0),
	SOC_DOUBLE("ADC Switch", CS42L52_ADC_MISC_CTL, 0, 1, 1, 0),


@@ -428,11 +428,11 @@ static const struct snd_kcontrol_new cs42l52_snd_controls[] = {
		     CS42L52_ADCB_MIXER_VOL, 7, 1, 1),
		     CS42L52_ADCB_MIXER_VOL, 7, 1, 1),


	SOC_DOUBLE_R_SX_TLV("PGA Volume", CS42L52_PGAA_CTL,
	SOC_DOUBLE_R_SX_TLV("PGA Volume", CS42L52_PGAA_CTL,
			    CS42L52_PGAB_CTL, 0, 0x28, 0x30, pga_tlv),
			    CS42L52_PGAB_CTL, 0, 0x28, 0x24, pga_tlv),


	SOC_DOUBLE_R_SX_TLV("PCM Mixer Volume",
	SOC_DOUBLE_R_SX_TLV("PCM Mixer Volume",
			    CS42L52_PCMA_MIXER_VOL, CS42L52_PCMB_MIXER_VOL,
			    CS42L52_PCMA_MIXER_VOL, CS42L52_PCMB_MIXER_VOL,
				0, 0x7f, 0x19, mix_tlv),
				0, 0x19, 0x7f, mix_tlv),
	SOC_DOUBLE_R("PCM Mixer Switch",
	SOC_DOUBLE_R("PCM Mixer Switch",
		     CS42L52_PCMA_MIXER_VOL, CS42L52_PCMB_MIXER_VOL, 7, 1, 1),
		     CS42L52_PCMA_MIXER_VOL, CS42L52_PCMB_MIXER_VOL, 7, 1, 1),


Loading