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

Commit 54c1e27d authored by Mark Brown's avatar Mark Brown
Browse files

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

parents e6ddd861 e4065f3f
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -108,8 +108,8 @@ static void __init dove_clk_init(void)
	orion_clkdev_add(NULL, "sdhci-dove.1", sdio1);
	orion_clkdev_add(NULL, "sdhci-dove.1", sdio1);
	orion_clkdev_add(NULL, "orion_nand", nand);
	orion_clkdev_add(NULL, "orion_nand", nand);
	orion_clkdev_add(NULL, "cafe1000-ccic.0", camera);
	orion_clkdev_add(NULL, "cafe1000-ccic.0", camera);
	orion_clkdev_add(NULL, "kirkwood-i2s.0", i2s0);
	orion_clkdev_add(NULL, "mvebu-audio.0", i2s0);
	orion_clkdev_add(NULL, "kirkwood-i2s.1", i2s1);
	orion_clkdev_add(NULL, "mvebu-audio.1", i2s1);
	orion_clkdev_add(NULL, "mv_crypto", crypto);
	orion_clkdev_add(NULL, "mv_crypto", crypto);
	orion_clkdev_add(NULL, "dove-ac97", ac97);
	orion_clkdev_add(NULL, "dove-ac97", ac97);
	orion_clkdev_add(NULL, "dove-pdma", pdma);
	orion_clkdev_add(NULL, "dove-pdma", pdma);
+9 −15
Original line number Original line Diff line number Diff line
@@ -264,7 +264,7 @@ void __init kirkwood_clk_init(void)
	orion_clkdev_add(NULL, MV_XOR_NAME ".1", xor1);
	orion_clkdev_add(NULL, MV_XOR_NAME ".1", xor1);
	orion_clkdev_add("0", "pcie", pex0);
	orion_clkdev_add("0", "pcie", pex0);
	orion_clkdev_add("1", "pcie", pex1);
	orion_clkdev_add("1", "pcie", pex1);
	orion_clkdev_add(NULL, "kirkwood-i2s", audio);
	orion_clkdev_add(NULL, "mvebu-audio", audio);
	orion_clkdev_add(NULL, MV64XXX_I2C_CTLR_NAME ".0", runit);
	orion_clkdev_add(NULL, MV64XXX_I2C_CTLR_NAME ".0", runit);
	orion_clkdev_add(NULL, MV64XXX_I2C_CTLR_NAME ".1", runit);
	orion_clkdev_add(NULL, MV64XXX_I2C_CTLR_NAME ".1", runit);


@@ -560,7 +560,7 @@ void __init kirkwood_timer_init(void)
/*****************************************************************************
/*****************************************************************************
 * Audio
 * Audio
 ****************************************************************************/
 ****************************************************************************/
static struct resource kirkwood_i2s_resources[] = {
static struct resource kirkwood_audio_resources[] = {
	[0] = {
	[0] = {
		.start  = AUDIO_PHYS_BASE,
		.start  = AUDIO_PHYS_BASE,
		.end    = AUDIO_PHYS_BASE + SZ_16K - 1,
		.end    = AUDIO_PHYS_BASE + SZ_16K - 1,
@@ -573,29 +573,23 @@ static struct resource kirkwood_i2s_resources[] = {
	},
	},
};
};


static struct kirkwood_asoc_platform_data kirkwood_i2s_data = {
static struct kirkwood_asoc_platform_data kirkwood_audio_data = {
	.burst       = 128,
	.burst       = 128,
};
};


static struct platform_device kirkwood_i2s_device = {
static struct platform_device kirkwood_audio_device = {
	.name		= "kirkwood-i2s",
	.name		= "mvebu-audio",
	.id		= -1,
	.id		= -1,
	.num_resources	= ARRAY_SIZE(kirkwood_i2s_resources),
	.num_resources	= ARRAY_SIZE(kirkwood_audio_resources),
	.resource	= kirkwood_i2s_resources,
	.resource	= kirkwood_audio_resources,
	.dev		= {
	.dev		= {
		.platform_data	= &kirkwood_i2s_data,
		.platform_data	= &kirkwood_audio_data,
	},
	},
};
};


static struct platform_device kirkwood_pcm_device = {
	.name		= "kirkwood-pcm-audio",
	.id		= -1,
};

void __init kirkwood_audio_init(void)
void __init kirkwood_audio_init(void)
{
{
	platform_device_register(&kirkwood_i2s_device);
	platform_device_register(&kirkwood_audio_device);
	platform_device_register(&kirkwood_pcm_device);
}
}


/*****************************************************************************
/*****************************************************************************
+3 −8
Original line number Original line Diff line number Diff line
config SND_KIRKWOOD_SOC
config SND_KIRKWOOD_SOC
	tristate "SoC Audio for the Marvell Kirkwood chip"
	tristate "SoC Audio for the Marvell Kirkwood chip"
	depends on ARCH_KIRKWOOD
	depends on ARCH_KIRKWOOD || COMPILE_TEST
	help
	help
	  Say Y or M if you want to add support for codecs attached to
	  Say Y or M if you want to add support for codecs attached to
	  the Kirkwood I2S interface. You will also need to select the
	  the Kirkwood I2S interface. You will also need to select the
	  audio interfaces to support below.
	  audio interfaces to support below.


config SND_KIRKWOOD_SOC_I2S
	tristate

config SND_KIRKWOOD_SOC_OPENRD
config SND_KIRKWOOD_SOC_OPENRD
	tristate "SoC Audio support for Kirkwood Openrd Client"
	tristate "SoC Audio support for Kirkwood Openrd Client"
	depends on SND_KIRKWOOD_SOC && (MACH_OPENRD_CLIENT || MACH_OPENRD_ULTIMATE)
	depends on SND_KIRKWOOD_SOC && (MACH_OPENRD_CLIENT || MACH_OPENRD_ULTIMATE || COMPILE_TEST)
	depends on I2C
	depends on I2C
	select SND_KIRKWOOD_SOC_I2S
	select SND_SOC_CS42L51
	select SND_SOC_CS42L51
	help
	help
	  Say Y if you want to add support for SoC audio on
	  Say Y if you want to add support for SoC audio on
@@ -21,8 +17,7 @@ config SND_KIRKWOOD_SOC_OPENRD


config SND_KIRKWOOD_SOC_T5325
config SND_KIRKWOOD_SOC_T5325
	tristate "SoC Audio support for HP t5325"
	tristate "SoC Audio support for HP t5325"
	depends on SND_KIRKWOOD_SOC && MACH_T5325 && I2C
	depends on SND_KIRKWOOD_SOC && (MACH_T5325 || COMPILE_TEST) && I2C
	select SND_KIRKWOOD_SOC_I2S
	select SND_SOC_ALC5623
	select SND_SOC_ALC5623
	help
	help
	  Say Y if you want to add support for SoC audio on
	  Say Y if you want to add support for SoC audio on
+1 −3
Original line number Original line Diff line number Diff line
snd-soc-kirkwood-objs := kirkwood-dma.o
snd-soc-kirkwood-objs := kirkwood-dma.o kirkwood-i2s.o
snd-soc-kirkwood-i2s-objs := kirkwood-i2s.o


obj-$(CONFIG_SND_KIRKWOOD_SOC) += snd-soc-kirkwood.o
obj-$(CONFIG_SND_KIRKWOOD_SOC) += snd-soc-kirkwood.o
obj-$(CONFIG_SND_KIRKWOOD_SOC_I2S) += snd-soc-kirkwood-i2s.o


snd-soc-openrd-objs := kirkwood-openrd.o
snd-soc-openrd-objs := kirkwood-openrd.o
snd-soc-t5325-objs := kirkwood-t5325.o
snd-soc-t5325-objs := kirkwood-t5325.o
+24 −84
Original line number Original line Diff line number Diff line
@@ -33,11 +33,11 @@
	 SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE | \
	 SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE | \
	 SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_BE)
	 SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_BE)


struct kirkwood_dma_priv {
static struct kirkwood_dma_data *kirkwood_priv(struct snd_pcm_substream *subs)
	struct snd_pcm_substream *play_stream;
{
	struct snd_pcm_substream *rec_stream;
	struct snd_soc_pcm_runtime *soc_runtime = subs->private_data;
	struct kirkwood_dma_data *data;
	return snd_soc_dai_get_drvdata(soc_runtime->cpu_dai);
};
}


static struct snd_pcm_hardware kirkwood_dma_snd_hw = {
static struct snd_pcm_hardware kirkwood_dma_snd_hw = {
	.info = (SNDRV_PCM_INFO_INTERLEAVED |
	.info = (SNDRV_PCM_INFO_INTERLEAVED |
@@ -51,7 +51,7 @@ static struct snd_pcm_hardware kirkwood_dma_snd_hw = {
	.rate_max		= 384000,
	.rate_max		= 384000,
	.channels_min		= 1,
	.channels_min		= 1,
	.channels_max		= 8,
	.channels_max		= 8,
	.buffer_bytes_max	= KIRKWOOD_SND_MAX_PERIOD_BYTES * KIRKWOOD_SND_MAX_PERIODS,
	.buffer_bytes_max	= KIRKWOOD_SND_MAX_BUFFER_BYTES,
	.period_bytes_min	= KIRKWOOD_SND_MIN_PERIOD_BYTES,
	.period_bytes_min	= KIRKWOOD_SND_MIN_PERIOD_BYTES,
	.period_bytes_max	= KIRKWOOD_SND_MAX_PERIOD_BYTES,
	.period_bytes_max	= KIRKWOOD_SND_MAX_PERIOD_BYTES,
	.periods_min		= KIRKWOOD_SND_MIN_PERIODS,
	.periods_min		= KIRKWOOD_SND_MIN_PERIODS,
@@ -63,8 +63,7 @@ static u64 kirkwood_dma_dmamask = DMA_BIT_MASK(32);


static irqreturn_t kirkwood_dma_irq(int irq, void *dev_id)
static irqreturn_t kirkwood_dma_irq(int irq, void *dev_id)
{
{
	struct kirkwood_dma_priv *prdata = dev_id;
	struct kirkwood_dma_data *priv = dev_id;
	struct kirkwood_dma_data *priv = prdata->data;
	unsigned long mask, status, cause;
	unsigned long mask, status, cause;


	mask = readl(priv->io + KIRKWOOD_INT_MASK);
	mask = readl(priv->io + KIRKWOOD_INT_MASK);
@@ -89,10 +88,10 @@ static irqreturn_t kirkwood_dma_irq(int irq, void *dev_id)
	writel(status, priv->io + KIRKWOOD_INT_CAUSE);
	writel(status, priv->io + KIRKWOOD_INT_CAUSE);


	if (status & KIRKWOOD_INT_CAUSE_PLAY_BYTES)
	if (status & KIRKWOOD_INT_CAUSE_PLAY_BYTES)
		snd_pcm_period_elapsed(prdata->play_stream);
		snd_pcm_period_elapsed(priv->substream_play);


	if (status & KIRKWOOD_INT_CAUSE_REC_BYTES)
	if (status & KIRKWOOD_INT_CAUSE_REC_BYTES)
		snd_pcm_period_elapsed(prdata->rec_stream);
		snd_pcm_period_elapsed(priv->substream_rec);


	return IRQ_HANDLED;
	return IRQ_HANDLED;
}
}
@@ -126,15 +125,10 @@ static int kirkwood_dma_open(struct snd_pcm_substream *substream)
{
{
	int err;
	int err;
	struct snd_pcm_runtime *runtime = substream->runtime;
	struct snd_pcm_runtime *runtime = substream->runtime;
	struct snd_soc_pcm_runtime *soc_runtime = substream->private_data;
	struct kirkwood_dma_data *priv = kirkwood_priv(substream);
	struct snd_soc_platform *platform = soc_runtime->platform;
	struct snd_soc_dai *cpu_dai = soc_runtime->cpu_dai;
	struct kirkwood_dma_data *priv;
	struct kirkwood_dma_priv *prdata = snd_soc_platform_get_drvdata(platform);
	const struct mbus_dram_target_info *dram;
	const struct mbus_dram_target_info *dram;
	unsigned long addr;
	unsigned long addr;


	priv = snd_soc_dai_get_dma_data(cpu_dai, substream);
	snd_soc_set_runtime_hwparams(substream, &kirkwood_dma_snd_hw);
	snd_soc_set_runtime_hwparams(substream, &kirkwood_dma_snd_hw);


	/* Ensure that all constraints linked to dma burst are fulfilled */
	/* Ensure that all constraints linked to dma burst are fulfilled */
@@ -157,21 +151,11 @@ static int kirkwood_dma_open(struct snd_pcm_substream *substream)
	if (err < 0)
	if (err < 0)
		return err;
		return err;


	if (prdata == NULL) {
	if (!priv->substream_play && !priv->substream_rec) {
		prdata = kzalloc(sizeof(struct kirkwood_dma_priv), GFP_KERNEL);
		if (prdata == NULL)
			return -ENOMEM;

		prdata->data = priv;

		err = request_irq(priv->irq, kirkwood_dma_irq, IRQF_SHARED,
		err = request_irq(priv->irq, kirkwood_dma_irq, IRQF_SHARED,
				  "kirkwood-i2s", prdata);
				  "kirkwood-i2s", priv);
		if (err) {
		if (err)
			kfree(prdata);
			return -EBUSY;
			return -EBUSY;
		}

		snd_soc_platform_set_drvdata(platform, prdata);


		/*
		/*
		 * Enable Error interrupts. We're only ack'ing them but
		 * Enable Error interrupts. We're only ack'ing them but
@@ -183,11 +167,11 @@ static int kirkwood_dma_open(struct snd_pcm_substream *substream)
	dram = mv_mbus_dram_info();
	dram = mv_mbus_dram_info();
	addr = substream->dma_buffer.addr;
	addr = substream->dma_buffer.addr;
	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
		prdata->play_stream = substream;
		priv->substream_play = substream;
		kirkwood_dma_conf_mbus_windows(priv->io,
		kirkwood_dma_conf_mbus_windows(priv->io,
			KIRKWOOD_PLAYBACK_WIN, addr, dram);
			KIRKWOOD_PLAYBACK_WIN, addr, dram);
	} else {
	} else {
		prdata->rec_stream = substream;
		priv->substream_rec = substream;
		kirkwood_dma_conf_mbus_windows(priv->io,
		kirkwood_dma_conf_mbus_windows(priv->io,
			KIRKWOOD_RECORD_WIN, addr, dram);
			KIRKWOOD_RECORD_WIN, addr, dram);
	}
	}
@@ -197,27 +181,19 @@ static int kirkwood_dma_open(struct snd_pcm_substream *substream)


static int kirkwood_dma_close(struct snd_pcm_substream *substream)
static int kirkwood_dma_close(struct snd_pcm_substream *substream)
{
{
	struct snd_soc_pcm_runtime *soc_runtime = substream->private_data;
	struct kirkwood_dma_data *priv = kirkwood_priv(substream);
	struct snd_soc_dai *cpu_dai = soc_runtime->cpu_dai;
	struct snd_soc_platform *platform = soc_runtime->platform;
	struct kirkwood_dma_priv *prdata = snd_soc_platform_get_drvdata(platform);
	struct kirkwood_dma_data *priv;

	priv = snd_soc_dai_get_dma_data(cpu_dai, substream);


	if (!prdata || !priv)
	if (!priv)
		return 0;
		return 0;


	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
		prdata->play_stream = NULL;
		priv->substream_play = NULL;
	else
	else
		prdata->rec_stream = NULL;
		priv->substream_rec = NULL;


	if (!prdata->play_stream && !prdata->rec_stream) {
	if (!priv->substream_play && !priv->substream_rec) {
		writel(0, priv->io + KIRKWOOD_ERR_MASK);
		writel(0, priv->io + KIRKWOOD_ERR_MASK);
		free_irq(priv->irq, prdata);
		free_irq(priv->irq, priv);
		kfree(prdata);
		snd_soc_platform_set_drvdata(platform, NULL);
	}
	}


	return 0;
	return 0;
@@ -243,13 +219,9 @@ static int kirkwood_dma_hw_free(struct snd_pcm_substream *substream)
static int kirkwood_dma_prepare(struct snd_pcm_substream *substream)
static int kirkwood_dma_prepare(struct snd_pcm_substream *substream)
{
{
	struct snd_pcm_runtime *runtime = substream->runtime;
	struct snd_pcm_runtime *runtime = substream->runtime;
	struct snd_soc_pcm_runtime *soc_runtime = substream->private_data;
	struct kirkwood_dma_data *priv = kirkwood_priv(substream);
	struct snd_soc_dai *cpu_dai = soc_runtime->cpu_dai;
	struct kirkwood_dma_data *priv;
	unsigned long size, count;
	unsigned long size, count;


	priv = snd_soc_dai_get_dma_data(cpu_dai, substream);

	/* compute buffer size in term of "words" as requested in specs */
	/* compute buffer size in term of "words" as requested in specs */
	size = frames_to_bytes(runtime, runtime->buffer_size);
	size = frames_to_bytes(runtime, runtime->buffer_size);
	size = (size>>2)-1;
	size = (size>>2)-1;
@@ -272,13 +244,9 @@ static int kirkwood_dma_prepare(struct snd_pcm_substream *substream)
static snd_pcm_uframes_t kirkwood_dma_pointer(struct snd_pcm_substream
static snd_pcm_uframes_t kirkwood_dma_pointer(struct snd_pcm_substream
						*substream)
						*substream)
{
{
	struct snd_soc_pcm_runtime *soc_runtime = substream->private_data;
	struct kirkwood_dma_data *priv = kirkwood_priv(substream);
	struct snd_soc_dai *cpu_dai = soc_runtime->cpu_dai;
	struct kirkwood_dma_data *priv;
	snd_pcm_uframes_t count;
	snd_pcm_uframes_t count;


	priv = snd_soc_dai_get_dma_data(cpu_dai, substream);

	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
		count = bytes_to_frames(substream->runtime,
		count = bytes_to_frames(substream->runtime,
			readl(priv->io + KIRKWOOD_PLAY_BYTE_COUNT));
			readl(priv->io + KIRKWOOD_PLAY_BYTE_COUNT));
@@ -366,36 +334,8 @@ static void kirkwood_dma_free_dma_buffers(struct snd_pcm *pcm)
	}
	}
}
}


static struct snd_soc_platform_driver kirkwood_soc_platform = {
struct snd_soc_platform_driver kirkwood_soc_platform = {
	.ops		= &kirkwood_dma_ops,
	.ops		= &kirkwood_dma_ops,
	.pcm_new	= kirkwood_dma_new,
	.pcm_new	= kirkwood_dma_new,
	.pcm_free	= kirkwood_dma_free_dma_buffers,
	.pcm_free	= kirkwood_dma_free_dma_buffers,
};
};

static int kirkwood_soc_platform_probe(struct platform_device *pdev)
{
	return snd_soc_register_platform(&pdev->dev, &kirkwood_soc_platform);
}

static int kirkwood_soc_platform_remove(struct platform_device *pdev)
{
	snd_soc_unregister_platform(&pdev->dev);
	return 0;
}

static struct platform_driver kirkwood_pcm_driver = {
	.driver = {
			.name = "kirkwood-pcm-audio",
			.owner = THIS_MODULE,
	},

	.probe = kirkwood_soc_platform_probe,
	.remove = kirkwood_soc_platform_remove,
};

module_platform_driver(kirkwood_pcm_driver);

MODULE_AUTHOR("Arnaud Patard <arnaud.patard@rtp-net.org>");
MODULE_DESCRIPTION("Marvell Kirkwood Audio DMA module");
MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:kirkwood-pcm-audio");
Loading