Loading arch/arm/mach-dove/common.c +2 −2 Original line number Original line Diff line number Diff line Loading @@ -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); Loading arch/arm/mach-kirkwood/common.c +9 −15 Original line number Original line Diff line number Diff line Loading @@ -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); Loading Loading @@ -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, Loading @@ -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); } } /***************************************************************************** /***************************************************************************** Loading sound/soc/kirkwood/Kconfig +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 Loading @@ -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 Loading sound/soc/kirkwood/Makefile +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 Loading sound/soc/kirkwood/kirkwood-dma.c +24 −84 Original line number Original line Diff line number Diff line Loading @@ -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 | Loading @@ -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, Loading @@ -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); Loading @@ -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; } } Loading Loading @@ -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 */ Loading @@ -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 Loading @@ -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); } } Loading @@ -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; Loading @@ -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; Loading @@ -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)); Loading Loading @@ -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
arch/arm/mach-dove/common.c +2 −2 Original line number Original line Diff line number Diff line Loading @@ -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); Loading
arch/arm/mach-kirkwood/common.c +9 −15 Original line number Original line Diff line number Diff line Loading @@ -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); Loading Loading @@ -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, Loading @@ -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); } } /***************************************************************************** /***************************************************************************** Loading
sound/soc/kirkwood/Kconfig +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 Loading @@ -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 Loading
sound/soc/kirkwood/Makefile +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 Loading
sound/soc/kirkwood/kirkwood-dma.c +24 −84 Original line number Original line Diff line number Diff line Loading @@ -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 | Loading @@ -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, Loading @@ -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); Loading @@ -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; } } Loading Loading @@ -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 */ Loading @@ -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 Loading @@ -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); } } Loading @@ -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; Loading @@ -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; Loading @@ -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)); Loading Loading @@ -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");