diff options
Diffstat (limited to 'sound/soc/atmel')
| -rw-r--r-- | sound/soc/atmel/Kconfig | 6 | ||||
| -rw-r--r-- | sound/soc/atmel/atmel-pcm-dma.c | 1 | ||||
| -rw-r--r-- | sound/soc/atmel/atmel-pcm-pdc.c | 64 | ||||
| -rw-r--r-- | sound/soc/atmel/atmel-pcm.c | 13 | ||||
| -rw-r--r-- | sound/soc/atmel/atmel_ssc_dai.c | 45 | ||||
| -rw-r--r-- | sound/soc/atmel/atmel_wm8904.c | 8 | ||||
| -rw-r--r-- | sound/soc/atmel/sam9g20_wm8731.c | 22 | ||||
| -rw-r--r-- | sound/soc/atmel/sam9x5_wm8731.c | 6 | ||||
| -rw-r--r-- | sound/soc/atmel/snd-soc-afeb9260.c | 12 | 
9 files changed, 58 insertions, 119 deletions
diff --git a/sound/soc/atmel/Kconfig b/sound/soc/atmel/Kconfig index e48d38a1b95..27e3fc4a536 100644 --- a/sound/soc/atmel/Kconfig +++ b/sound/soc/atmel/Kconfig @@ -25,7 +25,7 @@ config SND_ATMEL_SOC_SSC  config SND_AT91_SOC_SAM9G20_WM8731  	tristate "SoC Audio support for WM8731-based At91sam9g20 evaluation board" -	depends on ARCH_AT91 && ATMEL_SSC && SND_ATMEL_SOC && AT91_PROGRAMMABLE_CLOCKS +	depends on ARCH_AT91 && ATMEL_SSC && SND_ATMEL_SOC  	select SND_ATMEL_SOC_PDC  	select SND_ATMEL_SOC_SSC  	select SND_SOC_WM8731 @@ -35,7 +35,7 @@ config SND_AT91_SOC_SAM9G20_WM8731  config SND_ATMEL_SOC_WM8904  	tristate "Atmel ASoC driver for boards using WM8904 codec" -	depends on ARCH_AT91 && ATMEL_SSC && SND_ATMEL_SOC +	depends on ARCH_AT91 && ATMEL_SSC && SND_ATMEL_SOC && I2C  	select SND_ATMEL_SOC_SSC  	select SND_ATMEL_SOC_DMA  	select SND_SOC_WM8904 @@ -58,6 +58,6 @@ config SND_AT91_SOC_AFEB9260  	depends on ARCH_AT91 && ATMEL_SSC && ARCH_AT91 && MACH_AFEB9260 && SND_ATMEL_SOC  	select SND_ATMEL_SOC_PDC  	select SND_ATMEL_SOC_SSC -	select SND_SOC_TLV320AIC23 +	select SND_SOC_TLV320AIC23_I2C  	help  	  Say Y here to support sound on AFEB9260 board. diff --git a/sound/soc/atmel/atmel-pcm-dma.c b/sound/soc/atmel/atmel-pcm-dma.c index 06082e5e5dc..b79a2a86451 100644 --- a/sound/soc/atmel/atmel-pcm-dma.c +++ b/sound/soc/atmel/atmel-pcm-dma.c @@ -50,7 +50,6 @@ static const struct snd_pcm_hardware atmel_pcm_dma_hardware = {  				  SNDRV_PCM_INFO_INTERLEAVED |  				  SNDRV_PCM_INFO_RESUME |  				  SNDRV_PCM_INFO_PAUSE, -	.formats		= SNDRV_PCM_FMTBIT_S16_LE,  	.period_bytes_min	= 256,		/* lighting DMA overhead */  	.period_bytes_max	= 2 * 0xffff,	/* if 2 bytes format */  	.periods_min		= 8, diff --git a/sound/soc/atmel/atmel-pcm-pdc.c b/sound/soc/atmel/atmel-pcm-pdc.c index 054ea4d9326..a366b3503c2 100644 --- a/sound/soc/atmel/atmel-pcm-pdc.c +++ b/sound/soc/atmel/atmel-pcm-pdc.c @@ -58,7 +58,6 @@ static const struct snd_pcm_hardware atmel_pcm_hardware = {  				  SNDRV_PCM_INFO_MMAP_VALID |  				  SNDRV_PCM_INFO_INTERLEAVED |  				  SNDRV_PCM_INFO_PAUSE, -	.formats		= SNDRV_PCM_FMTBIT_S16_LE,  	.period_bytes_min	= 32,  	.period_bytes_max	= 8192,  	.periods_min		= 2, @@ -77,12 +76,6 @@ struct atmel_runtime_data {  	size_t period_size;  	dma_addr_t period_ptr;		/* physical address of next period */ - -	/* PDC register save */ -	u32 pdc_xpr_save; -	u32 pdc_xcr_save; -	u32 pdc_xnpr_save; -	u32 pdc_xncr_save;  };  /*--------------------------------------------------------------------------*\ @@ -321,67 +314,10 @@ static struct snd_pcm_ops atmel_pcm_ops = {  	.mmap		= atmel_pcm_mmap,  }; - -/*--------------------------------------------------------------------------*\ - * ASoC platform driver -\*--------------------------------------------------------------------------*/ -#ifdef CONFIG_PM -static int atmel_pcm_suspend(struct snd_soc_dai *dai) -{ -	struct snd_pcm_runtime *runtime = dai->runtime; -	struct atmel_runtime_data *prtd; -	struct atmel_pcm_dma_params *params; - -	if (!runtime) -		return 0; - -	prtd = runtime->private_data; -	params = prtd->params; - -	/* disable the PDC and save the PDC registers */ - -	ssc_writel(params->ssc->regs, PDC_PTCR, params->mask->pdc_disable); - -	prtd->pdc_xpr_save = ssc_readx(params->ssc->regs, params->pdc->xpr); -	prtd->pdc_xcr_save = ssc_readx(params->ssc->regs, params->pdc->xcr); -	prtd->pdc_xnpr_save = ssc_readx(params->ssc->regs, params->pdc->xnpr); -	prtd->pdc_xncr_save = ssc_readx(params->ssc->regs, params->pdc->xncr); - -	return 0; -} - -static int atmel_pcm_resume(struct snd_soc_dai *dai) -{ -	struct snd_pcm_runtime *runtime = dai->runtime; -	struct atmel_runtime_data *prtd; -	struct atmel_pcm_dma_params *params; - -	if (!runtime) -		return 0; - -	prtd = runtime->private_data; -	params = prtd->params; - -	/* restore the PDC registers and enable the PDC */ -	ssc_writex(params->ssc->regs, params->pdc->xpr, prtd->pdc_xpr_save); -	ssc_writex(params->ssc->regs, params->pdc->xcr, prtd->pdc_xcr_save); -	ssc_writex(params->ssc->regs, params->pdc->xnpr, prtd->pdc_xnpr_save); -	ssc_writex(params->ssc->regs, params->pdc->xncr, prtd->pdc_xncr_save); - -	ssc_writel(params->ssc->regs, PDC_PTCR, params->mask->pdc_enable); -	return 0; -} -#else -#define atmel_pcm_suspend	NULL -#define atmel_pcm_resume	NULL -#endif -  static struct snd_soc_platform_driver atmel_soc_platform = {  	.ops		= &atmel_pcm_ops,  	.pcm_new	= atmel_pcm_new,  	.pcm_free	= atmel_pcm_free, -	.suspend	= atmel_pcm_suspend, -	.resume		= atmel_pcm_resume,  };  int atmel_pcm_pdc_platform_register(struct device *dev) diff --git a/sound/soc/atmel/atmel-pcm.c b/sound/soc/atmel/atmel-pcm.c index 3109db7b901..8ae3fa5ac60 100644 --- a/sound/soc/atmel/atmel-pcm.c +++ b/sound/soc/atmel/atmel-pcm.c @@ -50,7 +50,7 @@ static int atmel_pcm_preallocate_dma_buffer(struct snd_pcm *pcm,  	buf->area = dma_alloc_coherent(pcm->card->dev, size,  			&buf->addr, GFP_KERNEL);  	pr_debug("atmel-pcm: alloc dma buffer: area=%p, addr=%p, size=%zu\n", -			(void *)buf->area, (void *)buf->addr, size); +			(void *)buf->area, (void *)(long)buf->addr, size);  	if (!buf->area)  		return -ENOMEM; @@ -68,18 +68,15 @@ int atmel_pcm_mmap(struct snd_pcm_substream *substream,  }  EXPORT_SYMBOL_GPL(atmel_pcm_mmap); -static u64 atmel_pcm_dmamask = DMA_BIT_MASK(32); -  int atmel_pcm_new(struct snd_soc_pcm_runtime *rtd)  {  	struct snd_card *card = rtd->card->snd_card;  	struct snd_pcm *pcm = rtd->pcm; -	int ret = 0; +	int ret; -	if (!card->dev->dma_mask) -		card->dev->dma_mask = &atmel_pcm_dmamask; -	if (!card->dev->coherent_dma_mask) -		card->dev->coherent_dma_mask = DMA_BIT_MASK(32); +	ret = dma_coerce_mask_and_coherent(card->dev, DMA_BIT_MASK(32)); +	if (ret) +		return ret;  	if (pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream) {  		pr_debug("atmel-pcm: allocating PCM playback DMA buffer\n"); diff --git a/sound/soc/atmel/atmel_ssc_dai.c b/sound/soc/atmel/atmel_ssc_dai.c index bb53dea85b1..de433cfd044 100644 --- a/sound/soc/atmel/atmel_ssc_dai.c +++ b/sound/soc/atmel/atmel_ssc_dai.c @@ -341,6 +341,7 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,  {  	int id = dai->id;  	struct atmel_ssc_info *ssc_p = &ssc_info[id]; +	struct ssc_device *ssc = ssc_p->ssc;  	struct atmel_pcm_dma_params *dma_params;  	int dir, channels, bits;  	u32 tfmr, rfmr, tcmr, rcmr; @@ -466,7 +467,8 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,  			| SSC_BF(RCMR_START, start_event)  			| SSC_BF(RCMR_CKI, SSC_CKI_RISING)  			| SSC_BF(RCMR_CKO, SSC_CKO_NONE) -			| SSC_BF(RCMR_CKS, SSC_CKS_CLOCK); +			| SSC_BF(RCMR_CKS, ssc->clk_from_rk_pin ? +					   SSC_CKS_PIN : SSC_CKS_CLOCK);  		rfmr =	  SSC_BF(RFMR_FSEDGE, SSC_FSEDGE_POSITIVE)  			| SSC_BF(RFMR_FSOS, SSC_FSOS_NONE) @@ -481,7 +483,8 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,  			| SSC_BF(TCMR_START, start_event)  			| SSC_BF(TCMR_CKI, SSC_CKI_FALLING)  			| SSC_BF(TCMR_CKO, SSC_CKO_NONE) -			| SSC_BF(TCMR_CKS, SSC_CKS_PIN); +			| SSC_BF(TCMR_CKS, ssc->clk_from_rk_pin ? +					   SSC_CKS_CLOCK : SSC_CKS_PIN);  		tfmr =	  SSC_BF(TFMR_FSEDGE, SSC_FSEDGE_POSITIVE)  			| SSC_BF(TFMR_FSDEN, 0) @@ -550,7 +553,8 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,  			| SSC_BF(RCMR_START, SSC_START_RISING_RF)  			| SSC_BF(RCMR_CKI, SSC_CKI_RISING)  			| SSC_BF(RCMR_CKO, SSC_CKO_NONE) -			| SSC_BF(RCMR_CKS, SSC_CKS_PIN); +			| SSC_BF(RCMR_CKS, ssc->clk_from_rk_pin ? +					   SSC_CKS_PIN : SSC_CKS_CLOCK);  		rfmr =	  SSC_BF(RFMR_FSEDGE, SSC_FSEDGE_POSITIVE)  			| SSC_BF(RFMR_FSOS, SSC_FSOS_NONE) @@ -565,7 +569,8 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,  			| SSC_BF(TCMR_START, SSC_START_RISING_RF)  			| SSC_BF(TCMR_CKI, SSC_CKI_FALLING)  			| SSC_BF(TCMR_CKO, SSC_CKO_NONE) -			| SSC_BF(TCMR_CKS, SSC_CKS_PIN); +			| SSC_BF(RCMR_CKS, ssc->clk_from_rk_pin ? +					   SSC_CKS_CLOCK : SSC_CKS_PIN);  		tfmr =	  SSC_BF(TFMR_FSEDGE, SSC_FSEDGE_POSITIVE)  			| SSC_BF(TFMR_FSDEN, 0) @@ -648,7 +653,7 @@ static int atmel_ssc_prepare(struct snd_pcm_substream *substream,  	dma_params = ssc_p->dma_params[dir]; -	ssc_writel(ssc_p->ssc->regs, CR, dma_params->mask->ssc_enable); +	ssc_writel(ssc_p->ssc->regs, CR, dma_params->mask->ssc_disable);  	ssc_writel(ssc_p->ssc->regs, IDR, dma_params->mask->ssc_error);  	pr_debug("%s enabled SSC_SR=0x%08x\n", @@ -657,6 +662,33 @@ static int atmel_ssc_prepare(struct snd_pcm_substream *substream,  	return 0;  } +static int atmel_ssc_trigger(struct snd_pcm_substream *substream, +			     int cmd, struct snd_soc_dai *dai) +{ +	struct atmel_ssc_info *ssc_p = &ssc_info[dai->id]; +	struct atmel_pcm_dma_params *dma_params; +	int dir; + +	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) +		dir = 0; +	else +		dir = 1; + +	dma_params = ssc_p->dma_params[dir]; + +	switch (cmd) { +	case SNDRV_PCM_TRIGGER_START: +	case SNDRV_PCM_TRIGGER_RESUME: +	case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: +		ssc_writel(ssc_p->ssc->regs, CR, dma_params->mask->ssc_enable); +		break; +	default: +		ssc_writel(ssc_p->ssc->regs, CR, dma_params->mask->ssc_disable); +		break; +	} + +	return 0; +}  #ifdef CONFIG_PM  static int atmel_ssc_suspend(struct snd_soc_dai *cpu_dai) @@ -731,6 +763,7 @@ static const struct snd_soc_dai_ops atmel_ssc_dai_ops = {  	.startup	= atmel_ssc_startup,  	.shutdown	= atmel_ssc_shutdown,  	.prepare	= atmel_ssc_prepare, +	.trigger	= atmel_ssc_trigger,  	.hw_params	= atmel_ssc_hw_params,  	.set_fmt	= atmel_ssc_set_dai_fmt,  	.set_clkdiv	= atmel_ssc_set_dai_clkdiv, @@ -777,7 +810,7 @@ static int asoc_ssc_init(struct device *dev)  	if (ret) {  		dev_err(dev, "Could not register PCM: %d\n", ret);  		goto err_unregister_dai; -	}; +	}  	return 0; diff --git a/sound/soc/atmel/atmel_wm8904.c b/sound/soc/atmel/atmel_wm8904.c index 7222380131e..b4e36901a40 100644 --- a/sound/soc/atmel/atmel_wm8904.c +++ b/sound/soc/atmel/atmel_wm8904.c @@ -12,7 +12,6 @@  #include <linux/module.h>  #include <linux/of.h>  #include <linux/of_device.h> -#include <linux/pinctrl/consumer.h>  #include <sound/soc.h> @@ -155,15 +154,8 @@ static int atmel_asoc_wm8904_probe(struct platform_device *pdev)  	struct snd_soc_card *card = &atmel_asoc_wm8904_card;  	struct snd_soc_dai_link *dailink = &atmel_asoc_wm8904_dailink;  	struct clk *clk_src; -	struct pinctrl *pinctrl;  	int id, ret; -	pinctrl = devm_pinctrl_get_select_default(&pdev->dev); -	if (IS_ERR(pinctrl)) { -		dev_err(&pdev->dev, "failed to request pinctrl\n"); -		return PTR_ERR(pinctrl); -	} -  	card->dev = &pdev->dev;  	ret = atmel_asoc_wm8904_dt_init(pdev);  	if (ret) { diff --git a/sound/soc/atmel/sam9g20_wm8731.c b/sound/soc/atmel/sam9g20_wm8731.c index 802717eccbd..bb1149126c5 100644 --- a/sound/soc/atmel/sam9g20_wm8731.c +++ b/sound/soc/atmel/sam9g20_wm8731.c @@ -37,6 +37,7 @@  #include <linux/interrupt.h>  #include <linux/platform_device.h>  #include <linux/i2c.h> +#include <linux/of.h>  #include <linux/atmel-ssc.h> @@ -47,7 +48,6 @@  #include <asm/mach-types.h>  #include <mach/hardware.h> -#include <mach/gpio.h>  #include "../codecs/wm8731.h"  #include "atmel-pcm.h" @@ -154,25 +154,14 @@ static int at91sam9g20ek_wm8731_init(struct snd_soc_pcm_runtime *rtd)  		return ret;  	} -	/* Add specific widgets */ -	snd_soc_dapm_new_controls(dapm, at91sam9g20ek_dapm_widgets, -				  ARRAY_SIZE(at91sam9g20ek_dapm_widgets)); -	/* Set up specific audio path interconnects */ -	snd_soc_dapm_add_routes(dapm, intercon, ARRAY_SIZE(intercon)); -  	/* not connected */  	snd_soc_dapm_nc_pin(dapm, "RLINEIN");  	snd_soc_dapm_nc_pin(dapm, "LLINEIN"); -#ifdef ENABLE_MIC_INPUT -	snd_soc_dapm_enable_pin(dapm, "Int Mic"); -#else -	snd_soc_dapm_nc_pin(dapm, "Int Mic"); +#ifndef ENABLE_MIC_INPUT +	snd_soc_dapm_nc_pin(&rtd->card->dapm, "Int Mic");  #endif -	/* always connected */ -	snd_soc_dapm_enable_pin(dapm, "Ext Spk"); -  	return 0;  } @@ -193,6 +182,11 @@ static struct snd_soc_card snd_soc_at91sam9g20ek = {  	.dai_link = &at91sam9g20ek_dai,  	.num_links = 1,  	.set_bias_level = at91sam9g20ek_set_bias_level, + +	.dapm_widgets = at91sam9g20ek_dapm_widgets, +	.num_dapm_widgets = ARRAY_SIZE(at91sam9g20ek_dapm_widgets), +	.dapm_routes = intercon, +	.num_dapm_routes = ARRAY_SIZE(intercon),  };  static int at91sam9g20ek_audio_probe(struct platform_device *pdev) diff --git a/sound/soc/atmel/sam9x5_wm8731.c b/sound/soc/atmel/sam9x5_wm8731.c index 992ae38d5a1..3188036a18f 100644 --- a/sound/soc/atmel/sam9x5_wm8731.c +++ b/sound/soc/atmel/sam9x5_wm8731.c @@ -97,6 +97,8 @@ static int sam9x5_wm8731_driver_probe(struct platform_device *pdev)  		goto out;  	} +	snd_soc_card_set_drvdata(card, priv); +  	card->dev = &pdev->dev;  	card->owner = THIS_MODULE;  	card->dai_link = dai; @@ -107,7 +109,7 @@ static int sam9x5_wm8731_driver_probe(struct platform_device *pdev)  	dai->stream_name = "WM8731 PCM";  	dai->codec_dai_name = "wm8731-hifi";  	dai->init = sam9x5_wm8731_init; -	dai->dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF +	dai->dai_fmt = SND_SOC_DAIFMT_DSP_A | SND_SOC_DAIFMT_NB_NF  		| SND_SOC_DAIFMT_CBM_CFM;  	ret = snd_soc_of_parse_card_name(card, "atmel,model"); @@ -153,8 +155,6 @@ static int sam9x5_wm8731_driver_probe(struct platform_device *pdev)  	of_node_put(codec_np);  	of_node_put(cpu_np); -	platform_set_drvdata(pdev, card); -  	ret = snd_soc_register_card(card);  	if (ret) {  		dev_err(&pdev->dev, diff --git a/sound/soc/atmel/snd-soc-afeb9260.c b/sound/soc/atmel/snd-soc-afeb9260.c index f65f08beac3..9579799ace5 100644 --- a/sound/soc/atmel/snd-soc-afeb9260.c +++ b/sound/soc/atmel/snd-soc-afeb9260.c @@ -80,17 +80,6 @@ static const struct snd_soc_dapm_route afeb9260_audio_map[] = {  	{"MICIN", NULL, "Mic Jack"},  }; -static int afeb9260_tlv320aic23_init(struct snd_soc_pcm_runtime *rtd) -{ -	struct snd_soc_codec *codec = rtd->codec; -	struct snd_soc_dapm_context *dapm = &codec->dapm; - -	snd_soc_dapm_enable_pin(dapm, "Headphone Jack"); -	snd_soc_dapm_enable_pin(dapm, "Line In"); -	snd_soc_dapm_enable_pin(dapm, "Mic Jack"); - -	return 0; -}  /* Digital audio interface glue - connects codec <--> CPU */  static struct snd_soc_dai_link afeb9260_dai = { @@ -100,7 +89,6 @@ static struct snd_soc_dai_link afeb9260_dai = {  	.codec_dai_name = "tlv320aic23-hifi",  	.platform_name = "atmel_pcm-audio",  	.codec_name = "tlv320aic23-codec.0-001a", -	.init = afeb9260_tlv320aic23_init,  	.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_IF |  		   SND_SOC_DAIFMT_CBM_CFM,  	.ops = &afeb9260_ops,  | 
