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 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, "orion_nand", nand);
	orion_clkdev_add(NULL, "cafe1000-ccic.0", camera);
	orion_clkdev_add(NULL, "kirkwood-i2s.0", i2s0);
	orion_clkdev_add(NULL, "kirkwood-i2s.1", i2s1);
	orion_clkdev_add(NULL, "mvebu-audio.0", i2s0);
	orion_clkdev_add(NULL, "mvebu-audio.1", i2s1);
	orion_clkdev_add(NULL, "mv_crypto", crypto);
	orion_clkdev_add(NULL, "dove-ac97", ac97);
	orion_clkdev_add(NULL, "dove-pdma", pdma);
+9 −15
Original line number 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("0", "pcie", pex0);
	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 ".1", runit);

@@ -560,7 +560,7 @@ void __init kirkwood_timer_init(void)
/*****************************************************************************
 * Audio
 ****************************************************************************/
static struct resource kirkwood_i2s_resources[] = {
static struct resource kirkwood_audio_resources[] = {
	[0] = {
		.start  = AUDIO_PHYS_BASE,
		.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,
};

static struct platform_device kirkwood_i2s_device = {
	.name		= "kirkwood-i2s",
static struct platform_device kirkwood_audio_device = {
	.name		= "mvebu-audio",
	.id		= -1,
	.num_resources	= ARRAY_SIZE(kirkwood_i2s_resources),
	.resource	= kirkwood_i2s_resources,
	.num_resources	= ARRAY_SIZE(kirkwood_audio_resources),
	.resource	= kirkwood_audio_resources,
	.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)
{
	platform_device_register(&kirkwood_i2s_device);
	platform_device_register(&kirkwood_pcm_device);
	platform_device_register(&kirkwood_audio_device);
}

/*****************************************************************************
+3 −8
Original line number Diff line number Diff line
config SND_KIRKWOOD_SOC
	tristate "SoC Audio for the Marvell Kirkwood chip"
	depends on ARCH_KIRKWOOD
	depends on ARCH_KIRKWOOD || COMPILE_TEST
	help
	  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
	  audio interfaces to support below.

config SND_KIRKWOOD_SOC_I2S
	tristate

config SND_KIRKWOOD_SOC_OPENRD
	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
	select SND_KIRKWOOD_SOC_I2S
	select SND_SOC_CS42L51
	help
	  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
	tristate "SoC Audio support for HP t5325"
	depends on SND_KIRKWOOD_SOC && MACH_T5325 && I2C
	select SND_KIRKWOOD_SOC_I2S
	depends on SND_KIRKWOOD_SOC && (MACH_T5325 || COMPILE_TEST) && I2C
	select SND_SOC_ALC5623
	help
	  Say Y if you want to add support for SoC audio on
+1 −3
Original line number Diff line number Diff line
snd-soc-kirkwood-objs := kirkwood-dma.o
snd-soc-kirkwood-i2s-objs := kirkwood-i2s.o
snd-soc-kirkwood-objs := kirkwood-dma.o kirkwood-i2s.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-t5325-objs := kirkwood-t5325.o
+24 −84
Original line number Diff line number Diff line
@@ -33,11 +33,11 @@
	 SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE | \
	 SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_BE)

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

static struct snd_pcm_hardware kirkwood_dma_snd_hw = {
	.info = (SNDRV_PCM_INFO_INTERLEAVED |
@@ -51,7 +51,7 @@ static struct snd_pcm_hardware kirkwood_dma_snd_hw = {
	.rate_max		= 384000,
	.channels_min		= 1,
	.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_max	= KIRKWOOD_SND_MAX_PERIOD_BYTES,
	.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)
{
	struct kirkwood_dma_priv *prdata = dev_id;
	struct kirkwood_dma_data *priv = prdata->data;
	struct kirkwood_dma_data *priv = dev_id;
	unsigned long mask, status, cause;

	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);

	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)
		snd_pcm_period_elapsed(prdata->rec_stream);
		snd_pcm_period_elapsed(priv->substream_rec);

	return IRQ_HANDLED;
}
@@ -126,15 +125,10 @@ static int kirkwood_dma_open(struct snd_pcm_substream *substream)
{
	int err;
	struct snd_pcm_runtime *runtime = substream->runtime;
	struct snd_soc_pcm_runtime *soc_runtime = substream->private_data;
	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);
	struct kirkwood_dma_data *priv = kirkwood_priv(substream);
	const struct mbus_dram_target_info *dram;
	unsigned long addr;

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

	/* 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)
		return err;

	if (prdata == NULL) {
		prdata = kzalloc(sizeof(struct kirkwood_dma_priv), GFP_KERNEL);
		if (prdata == NULL)
			return -ENOMEM;

		prdata->data = priv;

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

		snd_soc_platform_set_drvdata(platform, prdata);

		/*
		 * 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();
	addr = substream->dma_buffer.addr;
	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
		prdata->play_stream = substream;
		priv->substream_play = substream;
		kirkwood_dma_conf_mbus_windows(priv->io,
			KIRKWOOD_PLAYBACK_WIN, addr, dram);
	} else {
		prdata->rec_stream = substream;
		priv->substream_rec = substream;
		kirkwood_dma_conf_mbus_windows(priv->io,
			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)
{
	struct snd_soc_pcm_runtime *soc_runtime = substream->private_data;
	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);
	struct kirkwood_dma_data *priv = kirkwood_priv(substream);

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

	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
		prdata->play_stream = NULL;
		priv->substream_play = NULL;
	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);
		free_irq(priv->irq, prdata);
		kfree(prdata);
		snd_soc_platform_set_drvdata(platform, NULL);
		free_irq(priv->irq, priv);
	}

	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)
{
	struct snd_pcm_runtime *runtime = substream->runtime;
	struct snd_soc_pcm_runtime *soc_runtime = substream->private_data;
	struct snd_soc_dai *cpu_dai = soc_runtime->cpu_dai;
	struct kirkwood_dma_data *priv;
	struct kirkwood_dma_data *priv = kirkwood_priv(substream);
	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 */
	size = frames_to_bytes(runtime, runtime->buffer_size);
	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
						*substream)
{
	struct snd_soc_pcm_runtime *soc_runtime = substream->private_data;
	struct snd_soc_dai *cpu_dai = soc_runtime->cpu_dai;
	struct kirkwood_dma_data *priv;
	struct kirkwood_dma_data *priv = kirkwood_priv(substream);
	snd_pcm_uframes_t count;

	priv = snd_soc_dai_get_dma_data(cpu_dai, substream);

	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
		count = bytes_to_frames(substream->runtime,
			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,
	.pcm_new	= kirkwood_dma_new,
	.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