* [PATCH v3 0/3] ASoC AC97 audio support for ep93xx
@ 2010-10-14 14:49 Mika Westerberg
2010-10-14 14:49 ` [PATCH v3 1/3] ASoC: add ep93xx AC97 audio driver Mika Westerberg
` (4 more replies)
0 siblings, 5 replies; 10+ messages in thread
From: Mika Westerberg @ 2010-10-14 14:49 UTC (permalink / raw)
To: linux-arm-kernel
Hi,
This series adds AC97 audio support for Cirrus Logic EP93xx family SoCs. Example
machine driver is for Simplemachines Sim.One (which is the only hardware that I
have which has AC97 codec).
Changes the previous version:
- rebased against latest ASoC tree (added support for
multicomponent ASoC)
- fixed according comments by Mark Brown
- patch 1/4 (DMA fix) is now in ARM tree so dropped from
this series.
Thanks,
MW
Mika Westerberg (3):
ASoC: add ep93xx AC97 audio driver
ARM: ep93xx: add AC97 platform support
ASoC: ep93xx: add Simplemachines Sim.One AC97 audio support
arch/arm/mach-ep93xx/core.c | 34 ++
arch/arm/mach-ep93xx/include/mach/ep93xx-regs.h | 1 +
arch/arm/mach-ep93xx/include/mach/platform.h | 1 +
arch/arm/mach-ep93xx/simone.c | 1 +
sound/soc/ep93xx/Kconfig | 16 +-
sound/soc/ep93xx/Makefile | 4 +
sound/soc/ep93xx/ep93xx-ac97.c | 468 +++++++++++++++++++++++
sound/soc/ep93xx/simone.c | 89 +++++
8 files changed, 613 insertions(+), 1 deletions(-)
create mode 100644 sound/soc/ep93xx/ep93xx-ac97.c
create mode 100644 sound/soc/ep93xx/simone.c
^ permalink raw reply [flat|nested] 10+ messages in thread* [PATCH v3 1/3] ASoC: add ep93xx AC97 audio driver 2010-10-14 14:49 [PATCH v3 0/3] ASoC AC97 audio support for ep93xx Mika Westerberg @ 2010-10-14 14:49 ` Mika Westerberg 2010-10-14 14:49 ` [PATCH v3 2/3] ARM: ep93xx: add AC97 platform support Mika Westerberg ` (3 subsequent siblings) 4 siblings, 0 replies; 10+ messages in thread From: Mika Westerberg @ 2010-10-14 14:49 UTC (permalink / raw) To: linux-arm-kernel Add support for AC97 controllers found in Cirrus Logic EP93xx family SoCs. Signed-off-by: Mika Westerberg <mika.westerberg@iki.fi> --- sound/soc/ep93xx/Kconfig | 7 +- sound/soc/ep93xx/Makefile | 2 + sound/soc/ep93xx/ep93xx-ac97.c | 468 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 476 insertions(+), 1 deletions(-) create mode 100644 sound/soc/ep93xx/ep93xx-ac97.c diff --git a/sound/soc/ep93xx/Kconfig b/sound/soc/ep93xx/Kconfig index f617f56..108e5ff 100644 --- a/sound/soc/ep93xx/Kconfig +++ b/sound/soc/ep93xx/Kconfig @@ -3,11 +3,16 @@ config SND_EP93XX_SOC depends on ARCH_EP93XX && SND_SOC help Say Y or M if you want to add support for codecs attached to - the EP93xx I2S interface. + the EP93xx I2S or AC97 interfaces. config SND_EP93XX_SOC_I2S tristate +config SND_EP93XX_SOC_AC97 + tristate + select AC97_BUS + select SND_SOC_AC97_BUS + config SND_EP93XX_SOC_SNAPPERCL15 tristate "SoC Audio support for Bluewater Systems Snapper CL15 module" depends on SND_EP93XX_SOC && MACH_SNAPPER_CL15 diff --git a/sound/soc/ep93xx/Makefile b/sound/soc/ep93xx/Makefile index 272e60f..ac06e00 100644 --- a/sound/soc/ep93xx/Makefile +++ b/sound/soc/ep93xx/Makefile @@ -1,9 +1,11 @@ # EP93xx Platform Support snd-soc-ep93xx-objs := ep93xx-pcm.o snd-soc-ep93xx-i2s-objs := ep93xx-i2s.o +snd-soc-ep93xx-ac97-objs := ep93xx-ac97.o obj-$(CONFIG_SND_EP93XX_SOC) += snd-soc-ep93xx.o obj-$(CONFIG_SND_EP93XX_SOC_I2S) += snd-soc-ep93xx-i2s.o +obj-$(CONFIG_SND_EP93XX_SOC_AC97) += snd-soc-ep93xx-ac97.o # EP93XX Machine Support snd-soc-snappercl15-objs := snappercl15.o diff --git a/sound/soc/ep93xx/ep93xx-ac97.c b/sound/soc/ep93xx/ep93xx-ac97.c new file mode 100644 index 0000000..68a0bae --- /dev/null +++ b/sound/soc/ep93xx/ep93xx-ac97.c @@ -0,0 +1,468 @@ +/* + * ASoC driver for Cirrus Logic EP93xx AC97 controller. + * + * Copyright (c) 2010 Mika Westerberg + * + * Based on s3c-ac97 ASoC driver by Jaswinder Singh. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include <linux/delay.h> +#include <linux/io.h> +#include <linux/init.h> +#include <linux/module.h> +#include <linux/platform_device.h> +#include <linux/slab.h> + +#include <sound/core.h> +#include <sound/ac97_codec.h> +#include <sound/soc.h> + +#include <mach/dma.h> +#include "ep93xx-pcm.h" + +/* + * Per channel (1-4) registers. + */ +#define AC97CH(n) (((n) - 1) * 0x20) + +#define AC97DR(n) (AC97CH(n) + 0x0000) + +#define AC97RXCR(n) (AC97CH(n) + 0x0004) +#define AC97RXCR_REN BIT(0) +#define AC97RXCR_RX3 BIT(3) +#define AC97RXCR_RX4 BIT(4) +#define AC97RXCR_CM BIT(15) + +#define AC97TXCR(n) (AC97CH(n) + 0x0008) +#define AC97TXCR_TEN BIT(0) +#define AC97TXCR_TX3 BIT(3) +#define AC97TXCR_TX4 BIT(4) +#define AC97TXCR_CM BIT(15) + +#define AC97SR(n) (AC97CH(n) + 0x000c) +#define AC97SR_TXFE BIT(1) +#define AC97SR_TXUE BIT(6) + +#define AC97RISR(n) (AC97CH(n) + 0x0010) +#define AC97ISR(n) (AC97CH(n) + 0x0014) +#define AC97IE(n) (AC97CH(n) + 0x0018) + +/* + * Global AC97 controller registers. + */ +#define AC97S1DATA 0x0080 +#define AC97S2DATA 0x0084 +#define AC97S12DATA 0x0088 + +#define AC97RGIS 0x008c +#define AC97GIS 0x0090 +#define AC97IM 0x0094 +/* + * Common bits for RGIS, GIS and IM registers. + */ +#define AC97_SLOT2RXVALID BIT(1) +#define AC97_CODECREADY BIT(5) +#define AC97_SLOT2TXCOMPLETE BIT(6) + +#define AC97EOI 0x0098 +#define AC97EOI_WINT BIT(0) +#define AC97EOI_CODECREADY BIT(1) + +#define AC97GCR 0x009c +#define AC97GCR_AC97IFE BIT(0) + +#define AC97RESET 0x00a0 +#define AC97RESET_TIMEDRESET BIT(0) + +#define AC97SYNC 0x00a4 +#define AC97SYNC_TIMEDSYNC BIT(0) + +#define AC97_TIMEOUT msecs_to_jiffies(5) + +/** + * struct ep93xx_ac97_info - EP93xx AC97 controller info structure + * @lock: mutex serializing access to the bus (slot 1 & 2 ops) + * @dev: pointer to the platform device dev structure + * @mem: physical memory resource for the registers + * @regs: mapped AC97 controller registers + * @irq: AC97 interrupt number + * @done: bus ops wait here for an interrupt + */ +struct ep93xx_ac97_info { + struct mutex lock; + struct device *dev; + struct resource *mem; + void __iomem *regs; + int irq; + struct completion done; +}; + +/* 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 = { + .name = "ac97-pcm-out", + .dma_port = EP93XX_DMA_M2P_PORT_AAC1, +}; + +static struct ep93xx_pcm_dma_params ep93xx_ac97_pcm_in = { + .name = "ac97-pcm-in", + .dma_port = EP93XX_DMA_M2P_PORT_AAC1, +}; + +static inline unsigned ep93xx_ac97_read_reg(struct ep93xx_ac97_info *info, + unsigned reg) +{ + return __raw_readl(info->regs + reg); +} + +static inline void ep93xx_ac97_write_reg(struct ep93xx_ac97_info *info, + unsigned reg, unsigned val) +{ + __raw_writel(val, info->regs + reg); +} + +static unsigned short ep93xx_ac97_read(struct snd_ac97 *ac97, + unsigned short reg) +{ + struct ep93xx_ac97_info *info = ep93xx_ac97_info; + unsigned short val; + + mutex_lock(&info->lock); + + ep93xx_ac97_write_reg(info, AC97S1DATA, reg); + ep93xx_ac97_write_reg(info, AC97IM, AC97_SLOT2RXVALID); + if (!wait_for_completion_timeout(&info->done, AC97_TIMEOUT)) { + dev_warn(info->dev, "timeout reading register %x\n", reg); + mutex_unlock(&info->lock); + return -ETIMEDOUT; + } + val = (unsigned short)ep93xx_ac97_read_reg(info, AC97S2DATA); + + mutex_unlock(&info->lock); + return val; +} + +static void ep93xx_ac97_write(struct snd_ac97 *ac97, + unsigned short reg, + unsigned short val) +{ + struct ep93xx_ac97_info *info = ep93xx_ac97_info; + + mutex_lock(&info->lock); + + /* + * Writes to the codec need to be done so that slot 2 is filled in + * before slot 1. + */ + ep93xx_ac97_write_reg(info, AC97S2DATA, val); + ep93xx_ac97_write_reg(info, AC97S1DATA, reg); + + ep93xx_ac97_write_reg(info, AC97IM, AC97_SLOT2TXCOMPLETE); + if (!wait_for_completion_timeout(&info->done, AC97_TIMEOUT)) + dev_warn(info->dev, "timeout writing register %x\n", reg); + + mutex_unlock(&info->lock); +} + +static void ep93xx_ac97_warm_reset(struct snd_ac97 *ac97) +{ + struct ep93xx_ac97_info *info = ep93xx_ac97_info; + + mutex_lock(&info->lock); + + /* + * We are assuming that before this functions gets called, the codec + * BIT_CLK is stopped by forcing the codec into powerdown mode. We can + * control the SYNC signal directly via AC97SYNC register. Using + * TIMEDSYNC the controller will keep the SYNC high > 1us. + */ + ep93xx_ac97_write_reg(info, AC97SYNC, AC97SYNC_TIMEDSYNC); + ep93xx_ac97_write_reg(info, AC97IM, AC97_CODECREADY); + if (!wait_for_completion_timeout(&info->done, AC97_TIMEOUT)) + dev_warn(info->dev, "codec warm reset timeout\n"); + + mutex_unlock(&info->lock); +} + +static void ep93xx_ac97_cold_reset(struct snd_ac97 *ac97) +{ + struct ep93xx_ac97_info *info = ep93xx_ac97_info; + + mutex_lock(&info->lock); + + /* + * For doing cold reset, we disable the AC97 controller interface, clear + * WINT and CODECREADY bits, and finally enable the interface again. + */ + ep93xx_ac97_write_reg(info, AC97GCR, 0); + ep93xx_ac97_write_reg(info, AC97EOI, AC97EOI_CODECREADY | AC97EOI_WINT); + ep93xx_ac97_write_reg(info, AC97GCR, AC97GCR_AC97IFE); + + /* + * Now, assert the reset and wait for the codec to become ready. + */ + ep93xx_ac97_write_reg(info, AC97RESET, AC97RESET_TIMEDRESET); + ep93xx_ac97_write_reg(info, AC97IM, AC97_CODECREADY); + if (!wait_for_completion_timeout(&info->done, AC97_TIMEOUT)) + dev_warn(info->dev, "codec cold reset timeout\n"); + + /* + * Give the codec some time to come fully out from the reset. This way + * we ensure that the subsequent reads/writes will work. + */ + usleep_range(15000, 20000); + + mutex_unlock(&info->lock); +} + +static irqreturn_t ep93xx_ac97_interrupt(int irq, void *dev_id) +{ + struct ep93xx_ac97_info *info = dev_id; + unsigned status, mask; + + /* + * Just mask out the interrupt and wake up the waiting thread. + * Interrupts are cleared via reading/writing to slot 1 & 2 registers by + * the waiting thread. + */ + status = ep93xx_ac97_read_reg(info, AC97GIS); + mask = ep93xx_ac97_read_reg(info, AC97IM); + mask &= ~status; + ep93xx_ac97_write_reg(info, AC97IM, mask); + + complete(&info->done); + return IRQ_HANDLED; +} + +struct snd_ac97_bus_ops soc_ac97_ops = { + .read = ep93xx_ac97_read, + .write = ep93xx_ac97_write, + .reset = ep93xx_ac97_cold_reset, + .warm_reset = ep93xx_ac97_warm_reset, +}; +EXPORT_SYMBOL_GPL(soc_ac97_ops); + +static int ep93xx_ac97_trigger(struct snd_pcm_substream *substream, + int cmd, struct snd_soc_dai *dai) +{ + struct ep93xx_ac97_info *info = snd_soc_dai_get_drvdata(dai); + unsigned v = 0; + + + switch (cmd) { + case SNDRV_PCM_TRIGGER_START: + case SNDRV_PCM_TRIGGER_RESUME: + case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { + /* + * Enable compact mode, TX slots 3 & 4, and the TX FIFO + * itself. + */ + v |= AC97TXCR_CM; + v |= AC97TXCR_TX3 | AC97TXCR_TX4; + v |= AC97TXCR_TEN; + ep93xx_ac97_write_reg(info, AC97TXCR(1), v); + } else { + /* + * Enable compact mode, RX slots 3 & 4, and the RX FIFO + * itself. + */ + v |= AC97RXCR_CM; + v |= AC97RXCR_RX3 | AC97RXCR_RX4; + v |= AC97RXCR_REN; + ep93xx_ac97_write_reg(info, AC97RXCR(1), v); + } + break; + + case SNDRV_PCM_TRIGGER_STOP: + case SNDRV_PCM_TRIGGER_SUSPEND: + case SNDRV_PCM_TRIGGER_PAUSE_PUSH: + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { + /* + * As per Cirrus EP93xx errata described below: + * + * http://www.cirrus.com/en/pubs/errata/ER667E2B.pdf + * + * we will wait for the TX FIFO to be empty before + * clearing the TEN bit. + */ + unsigned long timeout = jiffies + AC97_TIMEOUT; + + do { + v = ep93xx_ac97_read_reg(info, AC97SR(1)); + if (time_after(jiffies, timeout)) { + dev_warn(info->dev, "TX timeout\n"); + break; + } + } while (!(v & (AC97SR_TXFE | AC97SR_TXUE))); + + /* disable the TX FIFO */ + ep93xx_ac97_write_reg(info, AC97TXCR(1), 0); + } else { + /* disable the RX FIFO */ + ep93xx_ac97_write_reg(info, AC97RXCR(1), 0); + } + break; + + default: + dev_warn(info->dev, "unknown command %d\n", cmd); + return -EINVAL; + } + + return 0; +} + +static int ep93xx_ac97_startup(struct snd_pcm_substream *substream, + struct snd_soc_dai *dai) +{ + struct ep93xx_pcm_dma_params *dma_data; + + if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) + dma_data = &ep93xx_ac97_pcm_out; + else + dma_data = &ep93xx_ac97_pcm_in; + + snd_soc_dai_set_dma_data(dai, substream, dma_data); + return 0; +} + +static struct snd_soc_dai_ops ep93xx_ac97_dai_ops = { + .startup = ep93xx_ac97_startup, + .trigger = ep93xx_ac97_trigger, +}; + +struct snd_soc_dai_driver ep93xx_ac97_dai = { + .name = "ep93xx-ac97", + .id = 0, + .ac97_control = 1, + .playback = { + .stream_name = "AC97 Playback", + .channels_min = 2, + .channels_max = 2, + .rates = SNDRV_PCM_RATE_8000_48000, + .formats = SNDRV_PCM_FMTBIT_S16_LE, + }, + .capture = { + .stream_name = "AC97 Capture", + .channels_min = 2, + .channels_max = 2, + .rates = SNDRV_PCM_RATE_8000_48000, + .formats = SNDRV_PCM_FMTBIT_S16_LE, + }, + .ops = &ep93xx_ac97_dai_ops, +}; + +static int __devinit ep93xx_ac97_probe(struct platform_device *pdev) +{ + struct ep93xx_ac97_info *info; + int ret; + + info = kzalloc(sizeof(struct ep93xx_ac97_info), GFP_KERNEL); + if (!info) + return -ENOMEM; + + dev_set_drvdata(&pdev->dev, info); + + mutex_init(&info->lock); + init_completion(&info->done); + info->dev = &pdev->dev; + + info->mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!info->mem) { + ret = -ENXIO; + goto fail_free_info; + } + + info->irq = platform_get_irq(pdev, 0); + if (!info->irq) { + ret = -ENXIO; + goto fail_free_info; + } + + if (!request_mem_region(info->mem->start, resource_size(info->mem), + pdev->name)) { + ret = -EBUSY; + goto fail_free_info; + } + + info->regs = ioremap(info->mem->start, resource_size(info->mem)); + if (!info->regs) { + ret = -ENOMEM; + goto fail_release_mem; + } + + ret = request_irq(info->irq, ep93xx_ac97_interrupt, IRQF_TRIGGER_HIGH, + pdev->name, info); + if (ret) + goto fail_unmap_mem; + + ep93xx_ac97_info = info; + platform_set_drvdata(pdev, info); + + ret = snd_soc_register_dai(&pdev->dev, &ep93xx_ac97_dai); + if (ret) + goto fail_free_irq; + + return 0; + +fail_free_irq: + platform_set_drvdata(pdev, NULL); + free_irq(info->irq, info); +fail_unmap_mem: + iounmap(info->regs); +fail_release_mem: + release_mem_region(info->mem->start, resource_size(info->mem)); +fail_free_info: + kfree(info); + + return ret; +} + +static int __devexit ep93xx_ac97_remove(struct platform_device *pdev) +{ + struct ep93xx_ac97_info *info = platform_get_drvdata(pdev); + + snd_soc_unregister_dai(&pdev->dev); + + /* disable the AC97 controller */ + ep93xx_ac97_write_reg(info, AC97GCR, 0); + + free_irq(info->irq, info); + iounmap(info->regs); + release_mem_region(info->mem->start, resource_size(info->mem)); + platform_set_drvdata(pdev, NULL); + kfree(info); + + return 0; +} + +static struct platform_driver ep93xx_ac97_driver = { + .probe = ep93xx_ac97_probe, + .remove = __devexit_p(ep93xx_ac97_remove), + .driver = { + .name = "ep93xx-ac97", + .owner = THIS_MODULE, + }, +}; + +static int __init ep93xx_ac97_init(void) +{ + return platform_driver_register(&ep93xx_ac97_driver); +} +module_init(ep93xx_ac97_init); + +static void __exit ep93xx_ac97_exit(void) +{ + platform_driver_unregister(&ep93xx_ac97_driver); +} +module_exit(ep93xx_ac97_exit); + +MODULE_DESCRIPTION("EP93xx AC97 ASoC Driver"); +MODULE_AUTHOR("Mika Westerberg <mika.westerberg@iki.fi>"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:ep93xx-ac97"); -- 1.5.6.5 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v3 2/3] ARM: ep93xx: add AC97 platform support 2010-10-14 14:49 [PATCH v3 0/3] ASoC AC97 audio support for ep93xx Mika Westerberg 2010-10-14 14:49 ` [PATCH v3 1/3] ASoC: add ep93xx AC97 audio driver Mika Westerberg @ 2010-10-14 14:49 ` Mika Westerberg 2010-10-14 19:56 ` Ryan Mallon 2010-10-14 21:46 ` H Hartley Sweeten 2010-10-14 14:49 ` [PATCH v3 3/3] ASoC: ep93xx: add Simplemachines Sim.One AC97 audio support Mika Westerberg ` (2 subsequent siblings) 4 siblings, 2 replies; 10+ messages in thread From: Mika Westerberg @ 2010-10-14 14:49 UTC (permalink / raw) To: linux-arm-kernel Add platform support for the EP93xx AC97 controller driver. Signed-off-by: Mika Westerberg <mika.westerberg@iki.fi> --- arch/arm/mach-ep93xx/core.c | 34 +++++++++++++++++++++++ arch/arm/mach-ep93xx/include/mach/ep93xx-regs.h | 1 + arch/arm/mach-ep93xx/include/mach/platform.h | 1 + 3 files changed, 36 insertions(+), 0 deletions(-) diff --git a/arch/arm/mach-ep93xx/core.c b/arch/arm/mach-ep93xx/core.c index 1990e22..ffdf87b 100644 --- a/arch/arm/mach-ep93xx/core.c +++ b/arch/arm/mach-ep93xx/core.c @@ -832,6 +832,40 @@ void ep93xx_i2s_release(void) } EXPORT_SYMBOL(ep93xx_i2s_release); +/************************************************************************* + * EP93xx AC97 audio peripheral handling + *************************************************************************/ +static struct resource ep93xx_ac97_resources[] = { + { + .start = EP93XX_AAC_PHYS_BASE, + .end = EP93XX_AAC_PHYS_BASE + 0xb0 - 1, + .flags = IORESOURCE_MEM, + }, + { + .start = IRQ_EP93XX_AACINTR, + .end = IRQ_EP93XX_AACINTR, + .flags = IORESOURCE_IRQ, + }, +}; + +static struct platform_device ep93xx_ac97_device = { + .name = "ep93xx-ac97", + .id = -1, + .num_resources = ARRAY_SIZE(ep93xx_ac97_resources), + .resource = ep93xx_ac97_resources, +}; + +void __init ep93xx_register_ac97(void) +{ + /* + * Make sure that the AC97 pins are not used by I2S. + */ + ep93xx_devcfg_clear_bits(EP93XX_SYSCON_DEVCFG_I2SONAC97); + + platform_device_register(&ep93xx_ac97_device); + platform_device_register(&ep93xx_pcm_device); +} + extern void ep93xx_gpio_init(void); void __init ep93xx_init_devices(void) diff --git a/arch/arm/mach-ep93xx/include/mach/ep93xx-regs.h b/arch/arm/mach-ep93xx/include/mach/ep93xx-regs.h index c54b3e5..9ac4d10 100644 --- a/arch/arm/mach-ep93xx/include/mach/ep93xx-regs.h +++ b/arch/arm/mach-ep93xx/include/mach/ep93xx-regs.h @@ -105,6 +105,7 @@ #define EP93XX_GPIO_B_INT_STATUS EP93XX_GPIO_REG(0xbc) #define EP93XX_GPIO_EEDRIVE EP93XX_GPIO_REG(0xc8) +#define EP93XX_AAC_PHYS_BASE EP93XX_APB_PHYS(0x00080000) #define EP93XX_AAC_BASE EP93XX_APB_IOMEM(0x00080000) #define EP93XX_SPI_PHYS_BASE EP93XX_APB_PHYS(0x000a0000) diff --git a/arch/arm/mach-ep93xx/include/mach/platform.h b/arch/arm/mach-ep93xx/include/mach/platform.h index 3330b36..5066045 100644 --- a/arch/arm/mach-ep93xx/include/mach/platform.h +++ b/arch/arm/mach-ep93xx/include/mach/platform.h @@ -61,6 +61,7 @@ void ep93xx_keypad_release_gpio(struct platform_device *pdev); void ep93xx_register_i2s(void); int ep93xx_i2s_acquire(unsigned i2s_pins, unsigned i2s_config); void ep93xx_i2s_release(void); +void ep93xx_register_ac97(void); void ep93xx_init_devices(void); extern struct sys_timer ep93xx_timer; -- 1.5.6.5 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v3 2/3] ARM: ep93xx: add AC97 platform support 2010-10-14 14:49 ` [PATCH v3 2/3] ARM: ep93xx: add AC97 platform support Mika Westerberg @ 2010-10-14 19:56 ` Ryan Mallon 2010-10-14 21:46 ` H Hartley Sweeten 1 sibling, 0 replies; 10+ messages in thread From: Ryan Mallon @ 2010-10-14 19:56 UTC (permalink / raw) To: linux-arm-kernel On 10/15/2010 03:49 AM, Mika Westerberg wrote: > Add platform support for the EP93xx AC97 controller driver. > > Signed-off-by: Mika Westerberg <mika.westerberg@iki.fi> > --- > arch/arm/mach-ep93xx/core.c | 34 +++++++++++++++++++++++ > arch/arm/mach-ep93xx/include/mach/ep93xx-regs.h | 1 + > arch/arm/mach-ep93xx/include/mach/platform.h | 1 + > 3 files changed, 36 insertions(+), 0 deletions(-) Looks good. Acked-by: Ryan Mallon <ryan@bluewatersys.com> > diff --git a/arch/arm/mach-ep93xx/core.c b/arch/arm/mach-ep93xx/core.c > index 1990e22..ffdf87b 100644 > --- a/arch/arm/mach-ep93xx/core.c > +++ b/arch/arm/mach-ep93xx/core.c > @@ -832,6 +832,40 @@ void ep93xx_i2s_release(void) > } > EXPORT_SYMBOL(ep93xx_i2s_release); > > +/************************************************************************* > + * EP93xx AC97 audio peripheral handling > + *************************************************************************/ > +static struct resource ep93xx_ac97_resources[] = { > + { > + .start = EP93XX_AAC_PHYS_BASE, > + .end = EP93XX_AAC_PHYS_BASE + 0xb0 - 1, > + .flags = IORESOURCE_MEM, > + }, > + { > + .start = IRQ_EP93XX_AACINTR, > + .end = IRQ_EP93XX_AACINTR, > + .flags = IORESOURCE_IRQ, > + }, > +}; > + > +static struct platform_device ep93xx_ac97_device = { > + .name = "ep93xx-ac97", > + .id = -1, > + .num_resources = ARRAY_SIZE(ep93xx_ac97_resources), > + .resource = ep93xx_ac97_resources, > +}; > + > +void __init ep93xx_register_ac97(void) > +{ > + /* > + * Make sure that the AC97 pins are not used by I2S. > + */ > + ep93xx_devcfg_clear_bits(EP93XX_SYSCON_DEVCFG_I2SONAC97); > + > + platform_device_register(&ep93xx_ac97_device); > + platform_device_register(&ep93xx_pcm_device); > +} > + > extern void ep93xx_gpio_init(void); > > void __init ep93xx_init_devices(void) > diff --git a/arch/arm/mach-ep93xx/include/mach/ep93xx-regs.h b/arch/arm/mach-ep93xx/include/mach/ep93xx-regs.h > index c54b3e5..9ac4d10 100644 > --- a/arch/arm/mach-ep93xx/include/mach/ep93xx-regs.h > +++ b/arch/arm/mach-ep93xx/include/mach/ep93xx-regs.h > @@ -105,6 +105,7 @@ > #define EP93XX_GPIO_B_INT_STATUS EP93XX_GPIO_REG(0xbc) > #define EP93XX_GPIO_EEDRIVE EP93XX_GPIO_REG(0xc8) > > +#define EP93XX_AAC_PHYS_BASE EP93XX_APB_PHYS(0x00080000) > #define EP93XX_AAC_BASE EP93XX_APB_IOMEM(0x00080000) > > #define EP93XX_SPI_PHYS_BASE EP93XX_APB_PHYS(0x000a0000) > diff --git a/arch/arm/mach-ep93xx/include/mach/platform.h b/arch/arm/mach-ep93xx/include/mach/platform.h > index 3330b36..5066045 100644 > --- a/arch/arm/mach-ep93xx/include/mach/platform.h > +++ b/arch/arm/mach-ep93xx/include/mach/platform.h > @@ -61,6 +61,7 @@ void ep93xx_keypad_release_gpio(struct platform_device *pdev); > void ep93xx_register_i2s(void); > int ep93xx_i2s_acquire(unsigned i2s_pins, unsigned i2s_config); > void ep93xx_i2s_release(void); > +void ep93xx_register_ac97(void); > > void ep93xx_init_devices(void); > extern struct sys_timer ep93xx_timer; -- Bluewater Systems Ltd - ARM Technology Solution Centre Ryan Mallon 5 Amuri Park, 404 Barbadoes St ryan at bluewatersys.com PO Box 13 889, Christchurch 8013 http://www.bluewatersys.com New Zealand Phone: +64 3 3779127 Freecall: Australia 1800 148 751 Fax: +64 3 3779135 USA 1800 261 2934 ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v3 2/3] ARM: ep93xx: add AC97 platform support 2010-10-14 14:49 ` [PATCH v3 2/3] ARM: ep93xx: add AC97 platform support Mika Westerberg 2010-10-14 19:56 ` Ryan Mallon @ 2010-10-14 21:46 ` H Hartley Sweeten 2010-10-14 21:57 ` Ryan Mallon 1 sibling, 1 reply; 10+ messages in thread From: H Hartley Sweeten @ 2010-10-14 21:46 UTC (permalink / raw) To: linux-arm-kernel On Thursday, October 14, 2010 7:49 AM, Mika Westerberg wrote: > > Add platform support for the EP93xx AC97 controller driver. > > Signed-off-by: Mika Westerberg <mika.westerberg@iki.fi> > --- > arch/arm/mach-ep93xx/core.c | 34 +++++++++++++++++++++++ > arch/arm/mach-ep93xx/include/mach/ep93xx-regs.h | 1 + > arch/arm/mach-ep93xx/include/mach/platform.h | 1 + > 3 files changed, 36 insertions(+), 0 deletions(-) > > diff --git a/arch/arm/mach-ep93xx/core.c b/arch/arm/mach-ep93xx/core.c > index 1990e22..ffdf87b 100644 > --- a/arch/arm/mach-ep93xx/core.c > +++ b/arch/arm/mach-ep93xx/core.c > @@ -832,6 +832,40 @@ void ep93xx_i2s_release(void) > } > EXPORT_SYMBOL(ep93xx_i2s_release); > > +/************************************************************************* > + * EP93xx AC97 audio peripheral handling > + *************************************************************************/ > +static struct resource ep93xx_ac97_resources[] = { > + { > + .start = EP93XX_AAC_PHYS_BASE, > + .end = EP93XX_AAC_PHYS_BASE + 0xb0 - 1, The last register in the AC97 peripheral is AC97GCIS at offset 0xa8. So the end address should be: .end = EP93XX_AAC_PHYS_BASE + 0xac - 1, > + .flags = IORESOURCE_MEM, > + }, > + { > + .start = IRQ_EP93XX_AACINTR, > + .end = IRQ_EP93XX_AACINTR, > + .flags = IORESOURCE_IRQ, > + }, > +}; > + > +static struct platform_device ep93xx_ac97_device = { > + .name = "ep93xx-ac97", > + .id = -1, > + .num_resources = ARRAY_SIZE(ep93xx_ac97_resources), > + .resource = ep93xx_ac97_resources, > +}; > + > +void __init ep93xx_register_ac97(void) > +{ > + /* > + * Make sure that the AC97 pins are not used by I2S. > + */ > + ep93xx_devcfg_clear_bits(EP93XX_SYSCON_DEVCFG_I2SONAC97); This is fine for now. Eventually some thought should go into a proper iomux to prevent loading drivers with conflicting pin requirements. Currently, depending on the configuration, this could break if a user should try to use the ac97 and i2s audio at the same time (I2SONAC97 mode). But, the same problem already exists if a user tries using spi and i2s audio (I2SONSSP mode). > + > + platform_device_register(&ep93xx_ac97_device); > + platform_device_register(&ep93xx_pcm_device); > +} > + > extern void ep93xx_gpio_init(void); > > void __init ep93xx_init_devices(void) > diff --git a/arch/arm/mach-ep93xx/include/mach/ep93xx-regs.h b/arch/arm/mach-ep93xx/include/mach/ep93xx-regs.h > index c54b3e5..9ac4d10 100644 > --- a/arch/arm/mach-ep93xx/include/mach/ep93xx-regs.h > +++ b/arch/arm/mach-ep93xx/include/mach/ep93xx-regs.h > @@ -105,6 +105,7 @@ > #define EP93XX_GPIO_B_INT_STATUS EP93XX_GPIO_REG(0xbc) > #define EP93XX_GPIO_EEDRIVE EP93XX_GPIO_REG(0xc8) > > +#define EP93XX_AAC_PHYS_BASE EP93XX_APB_PHYS(0x00080000) > #define EP93XX_AAC_BASE EP93XX_APB_IOMEM(0x00080000) > > #define EP93XX_SPI_PHYS_BASE EP93XX_APB_PHYS(0x000a0000) > diff --git a/arch/arm/mach-ep93xx/include/mach/platform.h b/arch/arm/mach-ep93xx/include/mach/platform.h > index 3330b36..5066045 100644 > --- a/arch/arm/mach-ep93xx/include/mach/platform.h > +++ b/arch/arm/mach-ep93xx/include/mach/platform.h > @@ -61,6 +61,7 @@ void ep93xx_keypad_release_gpio(struct platform_device *pdev); > void ep93xx_register_i2s(void); > int ep93xx_i2s_acquire(unsigned i2s_pins, unsigned i2s_config); > void ep93xx_i2s_release(void); > +void ep93xx_register_ac97(void); > > void ep93xx_init_devices(void); > extern struct sys_timer ep93xx_timer; Other than the end resource this all looks fine. Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com> ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v3 2/3] ARM: ep93xx: add AC97 platform support 2010-10-14 21:46 ` H Hartley Sweeten @ 2010-10-14 21:57 ` Ryan Mallon 2010-10-14 22:07 ` H Hartley Sweeten 0 siblings, 1 reply; 10+ messages in thread From: Ryan Mallon @ 2010-10-14 21:57 UTC (permalink / raw) To: linux-arm-kernel On 10/15/2010 10:46 AM, H Hartley Sweeten wrote: > On Thursday, October 14, 2010 7:49 AM, Mika Westerberg wrote: >> +void __init ep93xx_register_ac97(void) >> +{ >> + /* >> + * Make sure that the AC97 pins are not used by I2S. >> + */ >> + ep93xx_devcfg_clear_bits(EP93XX_SYSCON_DEVCFG_I2SONAC97); > > This is fine for now. > > Eventually some thought should go into a proper iomux to prevent > loading drivers with conflicting pin requirements. Currently, depending > on the configuration, this could break if a user should try to use the > ac97 and i2s audio at the same time (I2SONAC97 mode). But, the same > problem already exists if a user tries using spi and i2s audio (I2SONSSP > mode). I initially suggested this also, since we have acquire/release functions for some other drivers, but I now think this is fine as is. It's highly unlikely that a board is going to have both I2S and AC97 audio. We can change this later if such a board shows up, no need to make the code more complicated for hypothetical boards :-). ~Ryan -- Bluewater Systems Ltd - ARM Technology Solution Centre Ryan Mallon 5 Amuri Park, 404 Barbadoes St ryan at bluewatersys.com PO Box 13 889, Christchurch 8013 http://www.bluewatersys.com New Zealand Phone: +64 3 3779127 Freecall: Australia 1800 148 751 Fax: +64 3 3779135 USA 1800 261 2934 ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v3 2/3] ARM: ep93xx: add AC97 platform support 2010-10-14 21:57 ` Ryan Mallon @ 2010-10-14 22:07 ` H Hartley Sweeten 0 siblings, 0 replies; 10+ messages in thread From: H Hartley Sweeten @ 2010-10-14 22:07 UTC (permalink / raw) To: linux-arm-kernel On Thursday, October 14, 2010 2:58 PM, Ryan Mallon wrote: > On 10/15/2010 10:46 AM, H Hartley Sweeten wrote: >> On Thursday, October 14, 2010 7:49 AM, Mika Westerberg wrote: >>> >>> +void __init ep93xx_register_ac97(void) >>> +{ >>> + /* >>> + * Make sure that the AC97 pins are not used by I2S. >>> + */ >>> + ep93xx_devcfg_clear_bits(EP93XX_SYSCON_DEVCFG_I2SONAC97); >> >> This is fine for now. >> >> Eventually some thought should go into a proper iomux to prevent >> loading drivers with conflicting pin requirements. Currently, depending >> on the configuration, this could break if a user should try to use the >> ac97 and i2s audio at the same time (I2SONAC97 mode). But, the same >> problem already exists if a user tries using spi and i2s audio (I2SONSSP >> mode). > > I initially suggested this also, since we have acquire/release functions > for some other drivers, but I now think this is fine as is. It's highly > unlikely that a board is going to have both I2S and AC97 audio. We can > change this later if such a board shows up, no need to make the code > more complicated for hypothetical boards :-). Agree. That's why I said eventually.... ;-) The only platforms I know of that have both audio systems are the EDB9307, EDB9312, and EDB9315 boards from Cirrus. I don't have any of these so, unless someone steps up with one to test, Mika's implementation is fine. Regards, Hartley ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v3 3/3] ASoC: ep93xx: add Simplemachines Sim.One AC97 audio support 2010-10-14 14:49 [PATCH v3 0/3] ASoC AC97 audio support for ep93xx Mika Westerberg 2010-10-14 14:49 ` [PATCH v3 1/3] ASoC: add ep93xx AC97 audio driver Mika Westerberg 2010-10-14 14:49 ` [PATCH v3 2/3] ARM: ep93xx: add AC97 platform support Mika Westerberg @ 2010-10-14 14:49 ` Mika Westerberg 2010-10-15 9:57 ` [alsa-devel] [PATCH v3 0/3] ASoC AC97 audio support for ep93xx Liam Girdwood 2010-10-15 10:39 ` Mark Brown 4 siblings, 0 replies; 10+ messages in thread From: Mika Westerberg @ 2010-10-14 14:49 UTC (permalink / raw) To: linux-arm-kernel Add AC97 audio support for Simplemachines Sim.One board. Signed-off-by: Mika Westerberg <mika.westerberg@iki.fi> --- arch/arm/mach-ep93xx/simone.c | 1 + sound/soc/ep93xx/Kconfig | 9 ++++ sound/soc/ep93xx/Makefile | 2 + sound/soc/ep93xx/simone.c | 89 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 101 insertions(+), 0 deletions(-) create mode 100644 sound/soc/ep93xx/simone.c diff --git a/arch/arm/mach-ep93xx/simone.c b/arch/arm/mach-ep93xx/simone.c index 5dded58..f5f81f9 100644 --- a/arch/arm/mach-ep93xx/simone.c +++ b/arch/arm/mach-ep93xx/simone.c @@ -61,6 +61,7 @@ static void __init simone_init_machine(void) ep93xx_register_fb(&simone_fb_info); ep93xx_register_i2c(&simone_i2c_gpio_data, simone_i2c_board_info, ARRAY_SIZE(simone_i2c_board_info)); + ep93xx_register_ac97(); } MACHINE_START(SIM_ONE, "Simplemachines Sim.One Board") diff --git a/sound/soc/ep93xx/Kconfig b/sound/soc/ep93xx/Kconfig index 108e5ff..5742904 100644 --- a/sound/soc/ep93xx/Kconfig +++ b/sound/soc/ep93xx/Kconfig @@ -21,3 +21,12 @@ config SND_EP93XX_SOC_SNAPPERCL15 help Say Y or M here if you want to add support for I2S audio on the Bluewater Systems Snapper CL15 module. + +config SND_EP93XX_SOC_SIMONE + tristate "SoC Audio support for Simplemachines Sim.One board" + depends on SND_EP93XX_SOC && MACH_SIM_ONE + select SND_EP93XX_SOC_AC97 + select SND_SOC_AC97_CODEC + help + Say Y or M here if you want to add support for AC97 audio on the + Simplemachines Sim.One board. diff --git a/sound/soc/ep93xx/Makefile b/sound/soc/ep93xx/Makefile index ac06e00..8e7977f 100644 --- a/sound/soc/ep93xx/Makefile +++ b/sound/soc/ep93xx/Makefile @@ -9,5 +9,7 @@ obj-$(CONFIG_SND_EP93XX_SOC_AC97) += snd-soc-ep93xx-ac97.o # EP93XX Machine Support snd-soc-snappercl15-objs := snappercl15.o +snd-soc-simone-objs := simone.o obj-$(CONFIG_SND_EP93XX_SOC_SNAPPERCL15) += snd-soc-snappercl15.o +obj-$(CONFIG_SND_EP93XX_SOC_SIMONE) += snd-soc-simone.o diff --git a/sound/soc/ep93xx/simone.c b/sound/soc/ep93xx/simone.c new file mode 100644 index 0000000..4b0d199 --- /dev/null +++ b/sound/soc/ep93xx/simone.c @@ -0,0 +1,89 @@ +/* + * simone.c -- ASoC audio for Simplemachines Sim.One board + * + * Copyright (c) 2010 Mika Westerberg + * + * Based on snappercl15 machine driver by Ryan Mallon. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include <linux/init.h> +#include <linux/module.h> +#include <linux/platform_device.h> + +#include <sound/core.h> +#include <sound/pcm.h> +#include <sound/soc.h> + +#include <asm/mach-types.h> +#include <mach/hardware.h> + +#include "ep93xx-pcm.h" + +static struct snd_soc_dai_link simone_dai = { + .name = "AC97", + .stream_name = "AC97 HiFi", + .cpu_dai_name = "ep93xx-ac97", + .codec_dai_name = "ac97-hifi", + .codec_name = "ac97-codec", + .platform_name = "ep93xx-pcm-audio", +}; + +static struct snd_soc_card snd_soc_simone = { + .name = "Sim.One", + .dai_link = &simone_dai, + .num_links = 1, +}; + +static struct platform_device *simone_snd_ac97_device; +static struct platform_device *simone_snd_device; + +static int __init simone_init(void) +{ + int ret; + + if (!machine_is_sim_one()) + return -ENODEV; + + simone_snd_ac97_device = platform_device_alloc("ac97-codec", -1); + if (!simone_snd_ac97_device) + return -ENOMEM; + + ret = platform_device_add(simone_snd_ac97_device); + if (ret) + goto fail; + + simone_snd_device = platform_device_alloc("soc-audio", -1); + if (!simone_snd_device) { + ret = -ENOMEM; + goto fail; + } + + platform_set_drvdata(simone_snd_device, &snd_soc_simone); + ret = platform_device_add(simone_snd_device); + if (ret) { + platform_device_put(simone_snd_device); + goto fail; + } + + return ret; + +fail: + platform_device_put(simone_snd_ac97_device); + return ret; +} +module_init(simone_init); + +static void __exit simone_exit(void) +{ + platform_device_unregister(simone_snd_device); + platform_device_unregister(simone_snd_ac97_device); +} +module_exit(simone_exit); + +MODULE_DESCRIPTION("ALSA SoC Simplemachines Sim.One"); +MODULE_AUTHOR("Mika Westerberg <mika.westerberg@iki.fi>"); +MODULE_LICENSE("GPL"); -- 1.5.6.5 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* [alsa-devel] [PATCH v3 0/3] ASoC AC97 audio support for ep93xx 2010-10-14 14:49 [PATCH v3 0/3] ASoC AC97 audio support for ep93xx Mika Westerberg ` (2 preceding siblings ...) 2010-10-14 14:49 ` [PATCH v3 3/3] ASoC: ep93xx: add Simplemachines Sim.One AC97 audio support Mika Westerberg @ 2010-10-15 9:57 ` Liam Girdwood 2010-10-15 10:39 ` Mark Brown 4 siblings, 0 replies; 10+ messages in thread From: Liam Girdwood @ 2010-10-15 9:57 UTC (permalink / raw) To: linux-arm-kernel On Thu, 2010-10-14 at 17:49 +0300, Mika Westerberg wrote: > Hi, > > This series adds AC97 audio support for Cirrus Logic EP93xx family SoCs. Example > machine driver is for Simplemachines Sim.One (which is the only hardware that I > have which has AC97 codec). > > Changes the previous version: > - rebased against latest ASoC tree (added support for > multicomponent ASoC) > - fixed according comments by Mark Brown > - patch 1/4 (DMA fix) is now in ARM tree so dropped from > this series. > > Thanks, > MW > > Mika Westerberg (3): > ASoC: add ep93xx AC97 audio driver > ARM: ep93xx: add AC97 platform support > ASoC: ep93xx: add Simplemachines Sim.One AC97 audio support > > arch/arm/mach-ep93xx/core.c | 34 ++ > arch/arm/mach-ep93xx/include/mach/ep93xx-regs.h | 1 + > arch/arm/mach-ep93xx/include/mach/platform.h | 1 + > arch/arm/mach-ep93xx/simone.c | 1 + > sound/soc/ep93xx/Kconfig | 16 +- > sound/soc/ep93xx/Makefile | 4 + > sound/soc/ep93xx/ep93xx-ac97.c | 468 +++++++++++++++++++++++ > sound/soc/ep93xx/simone.c | 89 +++++ > 8 files changed, 613 insertions(+), 1 deletions(-) > create mode 100644 sound/soc/ep93xx/ep93xx-ac97.c > create mode 100644 sound/soc/ep93xx/simone.c All Acked-by: Liam Girdwood <lrg@slimlogic.co.uk> -- Freelance Developer, SlimLogic Ltd ASoC and Voltage Regulator Maintainer. http://www.slimlogic.co.uk ^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v3 0/3] ASoC AC97 audio support for ep93xx 2010-10-14 14:49 [PATCH v3 0/3] ASoC AC97 audio support for ep93xx Mika Westerberg ` (3 preceding siblings ...) 2010-10-15 9:57 ` [alsa-devel] [PATCH v3 0/3] ASoC AC97 audio support for ep93xx Liam Girdwood @ 2010-10-15 10:39 ` Mark Brown 4 siblings, 0 replies; 10+ messages in thread From: Mark Brown @ 2010-10-15 10:39 UTC (permalink / raw) To: linux-arm-kernel On Thu, Oct 14, 2010 at 05:49:05PM +0300, Mika Westerberg wrote: > This series adds AC97 audio support for Cirrus Logic EP93xx family SoCs. Example > machine driver is for Simplemachines Sim.One (which is the only hardware that I > have which has AC97 codec). Applied all, thanks. ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2010-10-15 10:39 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2010-10-14 14:49 [PATCH v3 0/3] ASoC AC97 audio support for ep93xx Mika Westerberg 2010-10-14 14:49 ` [PATCH v3 1/3] ASoC: add ep93xx AC97 audio driver Mika Westerberg 2010-10-14 14:49 ` [PATCH v3 2/3] ARM: ep93xx: add AC97 platform support Mika Westerberg 2010-10-14 19:56 ` Ryan Mallon 2010-10-14 21:46 ` H Hartley Sweeten 2010-10-14 21:57 ` Ryan Mallon 2010-10-14 22:07 ` H Hartley Sweeten 2010-10-14 14:49 ` [PATCH v3 3/3] ASoC: ep93xx: add Simplemachines Sim.One AC97 audio support Mika Westerberg 2010-10-15 9:57 ` [alsa-devel] [PATCH v3 0/3] ASoC AC97 audio support for ep93xx Liam Girdwood 2010-10-15 10:39 ` Mark Brown
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).