Commit 38e8c895 authored by Mark Brown's avatar Mark Brown
Browse files

Merge remote-tracking branch 'asoc/topic/dma' into asoc-next

parents d66e065c 69b6f196
Loading
Loading
Loading
Loading
+24 −3
Original line number Diff line number Diff line
@@ -32,9 +32,6 @@ snd_pcm_substream_to_dma_direction(const struct snd_pcm_substream *substream)
		return DMA_DEV_TO_MEM;
}

void snd_dmaengine_pcm_set_data(struct snd_pcm_substream *substream, void *data);
void *snd_dmaengine_pcm_get_data(struct snd_pcm_substream *substream);

int snd_hwparams_to_dma_slave_config(const struct snd_pcm_substream *substream,
	const struct snd_pcm_hw_params *params, struct dma_slave_config *slave_config);
int snd_dmaengine_pcm_trigger(struct snd_pcm_substream *substream, int cmd);
@@ -47,4 +44,28 @@ int snd_dmaengine_pcm_close(struct snd_pcm_substream *substream);

struct dma_chan *snd_dmaengine_pcm_get_chan(struct snd_pcm_substream *substream);

/**
 * struct snd_dmaengine_dai_dma_data - DAI DMA configuration data
 * @addr: Address of the DAI data source or destination register.
 * @addr_width: Width of the DAI data source or destination register.
 * @maxburst: Maximum number of words(note: words, as in units of the
 * src_addr_width member, not bytes) that can be send to or received from the
 * DAI in one burst.
 * @slave_id: Slave requester id for the DMA channel.
 * @filter_data: Custom DMA channel filter data, this will usually be used when
 * requesting the DMA channel.
 */
struct snd_dmaengine_dai_dma_data {
	dma_addr_t addr;
	enum dma_slave_buswidth addr_width;
	u32 maxburst;
	unsigned int slave_id;
	void *filter_data;
};

void snd_dmaengine_pcm_set_config_from_dai_data(
	const struct snd_pcm_substream *substream,
	const struct snd_dmaengine_dai_dma_data *dma_data,
	struct dma_slave_config *config);

#endif
+7 −18
Original line number Diff line number Diff line
@@ -67,9 +67,10 @@ static const struct snd_pcm_hardware atmel_pcm_dma_hardware = {
static void atmel_pcm_dma_irq(u32 ssc_sr,
	struct snd_pcm_substream *substream)
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
	struct atmel_pcm_dma_params *prtd;

	prtd = snd_dmaengine_pcm_get_data(substream);
	prtd = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream);

	if (ssc_sr & prtd->mask->ssc_error) {
		if (snd_pcm_running(substream))
@@ -104,15 +105,13 @@ static bool filter(struct dma_chan *chan, void *slave)
}

static int atmel_pcm_configure_dma(struct snd_pcm_substream *substream,
	struct snd_pcm_hw_params *params)
	struct snd_pcm_hw_params *params, struct atmel_pcm_dma_params *prtd)
{
	struct atmel_pcm_dma_params *prtd;
	struct ssc_device *ssc;
	struct dma_chan *dma_chan;
	struct dma_slave_config slave_config;
	int ret;

	prtd = snd_dmaengine_pcm_get_data(substream);
	ssc = prtd->ssc;

	ret = snd_hwparams_to_dma_slave_config(substream, params,
@@ -130,8 +129,6 @@ static int atmel_pcm_configure_dma(struct snd_pcm_substream *substream,
		slave_config.src_maxburst = 1;
	}

	slave_config.device_fc = false;

	dma_chan = snd_dmaengine_pcm_get_chan(substream);
	if (dmaengine_slave_config(dma_chan, &slave_config)) {
		pr_err("atmel-pcm: failed to configure dma channel\n");
@@ -164,9 +161,7 @@ static int atmel_pcm_hw_params(struct snd_pcm_substream *substream,
		return -EINVAL;
	}

	snd_dmaengine_pcm_set_data(substream, prtd);

	ret = atmel_pcm_configure_dma(substream, params);
	ret = atmel_pcm_configure_dma(substream, params, prtd);
	if (ret) {
		pr_err("atmel-pcm: failed to configure dmai\n");
		goto err;
@@ -182,9 +177,10 @@ err:

static int atmel_pcm_dma_prepare(struct snd_pcm_substream *substream)
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
	struct atmel_pcm_dma_params *prtd;

	prtd = snd_dmaengine_pcm_get_data(substream);
	prtd = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream);

	ssc_writex(prtd->ssc->regs, SSC_IER, prtd->mask->ssc_error);
	ssc_writex(prtd->ssc->regs, SSC_CR, prtd->mask->ssc_enable);
@@ -199,16 +195,9 @@ static int atmel_pcm_open(struct snd_pcm_substream *substream)
	return 0;
}

static int atmel_pcm_close(struct snd_pcm_substream *substream)
{
	snd_dmaengine_pcm_close(substream);

	return 0;
}

static struct snd_pcm_ops atmel_pcm_ops = {
	.open		= atmel_pcm_open,
	.close		= atmel_pcm_close,
	.close		= snd_dmaengine_pcm_close,
	.ioctl		= snd_pcm_lib_ioctl,
	.hw_params	= atmel_pcm_hw_params,
	.prepare	= atmel_pcm_dma_prepare,
+0 −1
Original line number Diff line number Diff line
@@ -27,7 +27,6 @@
#include <sound/soc.h>
#include <asm/mach-types.h>
#include <mach/hardware.h>
#include "ep93xx-pcm.h"

static int edb93xx_hw_params(struct snd_pcm_substream *substream,
			     struct snd_pcm_hw_params *params)
+5 −4
Original line number Diff line number Diff line
@@ -23,7 +23,6 @@
#include <sound/soc.h>

#include <linux/platform_data/dma-ep93xx.h>
#include "ep93xx-pcm.h"

/*
 * Per channel (1-4) registers.
@@ -101,14 +100,16 @@ struct ep93xx_ac97_info {
/* currently ALSA only supports a single AC97 device */
static struct ep93xx_ac97_info *ep93xx_ac97_info;

static struct ep93xx_pcm_dma_params ep93xx_ac97_pcm_out = {
static struct ep93xx_dma_data ep93xx_ac97_pcm_out = {
	.name		= "ac97-pcm-out",
	.dma_port	= EP93XX_DMA_AAC1,
	.direction	= DMA_MEM_TO_DEV,
};

static struct ep93xx_pcm_dma_params ep93xx_ac97_pcm_in = {
static struct ep93xx_dma_data ep93xx_ac97_pcm_in = {
	.name		= "ac97-pcm-in",
	.dma_port	= EP93XX_DMA_AAC1,
	.direction	= DMA_DEV_TO_MEM,
};

static inline unsigned ep93xx_ac97_read_reg(struct ep93xx_ac97_info *info,
@@ -316,7 +317,7 @@ static int ep93xx_ac97_trigger(struct snd_pcm_substream *substream,
static int ep93xx_ac97_startup(struct snd_pcm_substream *substream,
			       struct snd_soc_dai *dai)
{
	struct ep93xx_pcm_dma_params *dma_data;
	struct ep93xx_dma_data *dma_data;

	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
		dma_data = &ep93xx_ac97_pcm_out;
+8 −8
Original line number Diff line number Diff line
@@ -30,8 +30,6 @@
#include <mach/ep93xx-regs.h>
#include <linux/platform_data/dma-ep93xx.h>

#include "ep93xx-pcm.h"

#define EP93XX_I2S_TXCLKCFG		0x00
#define EP93XX_I2S_RXCLKCFG		0x04
#define EP93XX_I2S_GLCTRL		0x0C
@@ -62,18 +60,20 @@ struct ep93xx_i2s_info {
	struct clk			*mclk;
	struct clk			*sclk;
	struct clk			*lrclk;
	struct ep93xx_pcm_dma_params	*dma_params;
	struct ep93xx_dma_data		*dma_data;
	void __iomem			*regs;
};

struct ep93xx_pcm_dma_params ep93xx_i2s_dma_params[] = {
struct ep93xx_dma_data ep93xx_i2s_dma_data[] = {
	[SNDRV_PCM_STREAM_PLAYBACK] = {
		.name		= "i2s-pcm-out",
		.dma_port	= EP93XX_DMA_I2S1,
		.port		= EP93XX_DMA_I2S1,
		.direction	= DMA_MEM_TO_DEV,
	},
	[SNDRV_PCM_STREAM_CAPTURE] = {
		.name		= "i2s-pcm-in",
		.dma_port	= EP93XX_DMA_I2S1,
		.port		= EP93XX_DMA_I2S1,
		.direction	= DMA_DEV_TO_MEM,
	},
};

@@ -147,7 +147,7 @@ static int ep93xx_i2s_startup(struct snd_pcm_substream *substream,
	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;

	snd_soc_dai_set_dma_data(cpu_dai, substream,
				 &info->dma_params[substream->stream]);
				 &info->dma_data[substream->stream]);
	return 0;
}

@@ -407,7 +407,7 @@ static int ep93xx_i2s_probe(struct platform_device *pdev)
	}

	dev_set_drvdata(&pdev->dev, info);
	info->dma_params = ep93xx_i2s_dma_params;
	info->dma_data = ep93xx_i2s_dma_data;

	err = snd_soc_register_component(&pdev->dev, &ep93xx_i2s_component,
					 &ep93xx_i2s_dai, 1);
Loading