[ALSA] soc - ln2440sbc ac97 support
This patch adds ac97 support for ln2440sbc board from LittleChips. This board is based on s3c2440 SoC + AC97 Realtek ALC650 codec. Existing s3c2443 implementation is slightly modified because s3c2440 and s3c2443 have different AC97 interrupts. Signed-off-by: Ivan Kuten <ivan.kuten@promwad.com> Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
This commit is contained in:
parent
f651b50b9d
commit
040956fabb
|
@ -34,4 +34,12 @@ config SND_S3C24XX_SOC_SMDK2443_WM9710
|
|||
Say Y if you want to add support for SoC audio on smdk2443
|
||||
with the WM9710.
|
||||
|
||||
config SND_S3C24XX_SOC_LN2440SBC_ALC650
|
||||
tristate "SoC AC97 Audio support for LN2440SBC - ALC650"
|
||||
depends on SND_S3C24XX_SOC
|
||||
select SND_S3C2443_SOC_AC97
|
||||
select SND_SOC_AC97_CODEC
|
||||
help
|
||||
Say Y if you want to add support for SoC audio on ln2440sbc
|
||||
with the ALC650.
|
||||
|
||||
|
|
|
@ -10,6 +10,8 @@ obj-$(CONFIG_SND_S3C2443_SOC_AC97) += snd-soc-s3c2443-ac97.o
|
|||
# S3C24XX Machine Support
|
||||
snd-soc-neo1973-wm8753-objs := neo1973_wm8753.o
|
||||
snd-soc-smdk2443-wm9710-objs := smdk2443_wm9710.o
|
||||
snd-soc-ln2440sbc-alc650-objs := ln2440sbc_alc650.o
|
||||
|
||||
obj-$(CONFIG_SND_S3C24XX_SOC_NEO1973_WM8753) += snd-soc-neo1973-wm8753.o
|
||||
obj-$(CONFIG_SND_S3C24XX_SOC_SMDK2443_WM9710) += snd-soc-smdk2443-wm9710.o
|
||||
obj-$(CONFIG_SND_S3C24XX_SOC_LN2440SBC_ALC650) += snd-soc-ln2440sbc-alc650.o
|
||||
|
|
|
@ -0,0 +1,86 @@
|
|||
/*
|
||||
* SoC audio for ln2440sbc
|
||||
*
|
||||
* Copyright 2007 KonekTel, a.s.
|
||||
* Author: Ivan Kuten
|
||||
* ivan.kuten@promwad.com
|
||||
*
|
||||
* Heavily based on smdk2443_wm9710.c
|
||||
* Copyright 2007 Wolfson Microelectronics PLC.
|
||||
* Author: Graeme Gregory
|
||||
* graeme.gregory@wolfsonmicro.com or linux@wolfsonmicro.com
|
||||
*
|
||||
* 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/module.h>
|
||||
#include <linux/device.h>
|
||||
#include <sound/driver.h>
|
||||
#include <sound/core.h>
|
||||
#include <sound/pcm.h>
|
||||
#include <sound/soc.h>
|
||||
#include <sound/soc-dapm.h>
|
||||
|
||||
#include "../codecs/ac97.h"
|
||||
#include "s3c24xx-pcm.h"
|
||||
#include "s3c24xx-ac97.h"
|
||||
|
||||
static struct snd_soc_machine ln2440sbc;
|
||||
|
||||
static struct snd_soc_dai_link ln2440sbc_dai[] = {
|
||||
{
|
||||
.name = "AC97",
|
||||
.stream_name = "AC97 HiFi",
|
||||
.cpu_dai = &s3c2443_ac97_dai[0],
|
||||
.codec_dai = &ac97_dai,
|
||||
},
|
||||
};
|
||||
|
||||
static struct snd_soc_machine ln2440sbc = {
|
||||
.name = "LN2440SBC",
|
||||
.dai_link = ln2440sbc_dai,
|
||||
.num_links = ARRAY_SIZE(ln2440sbc_dai),
|
||||
};
|
||||
|
||||
static struct snd_soc_device ln2440sbc_snd_ac97_devdata = {
|
||||
.machine = &ln2440sbc,
|
||||
.platform = &s3c24xx_soc_platform,
|
||||
.codec_dev = &soc_codec_dev_ac97,
|
||||
};
|
||||
|
||||
static struct platform_device *ln2440sbc_snd_ac97_device;
|
||||
|
||||
static int __init ln2440sbc_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ln2440sbc_snd_ac97_device = platform_device_alloc("soc-audio", -1);
|
||||
if (!ln2440sbc_snd_ac97_device)
|
||||
return -ENOMEM;
|
||||
|
||||
platform_set_drvdata(ln2440sbc_snd_ac97_device,
|
||||
&ln2440sbc_snd_ac97_devdata);
|
||||
ln2440sbc_snd_ac97_devdata.dev = &ln2440sbc_snd_ac97_device->dev;
|
||||
ret = platform_device_add(ln2440sbc_snd_ac97_device);
|
||||
|
||||
if (ret)
|
||||
platform_device_put(ln2440sbc_snd_ac97_device);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __exit ln2440sbc_exit(void)
|
||||
{
|
||||
platform_device_unregister(ln2440sbc_snd_ac97_device);
|
||||
}
|
||||
|
||||
module_init(ln2440sbc_init);
|
||||
module_exit(ln2440sbc_exit);
|
||||
|
||||
/* Module information */
|
||||
MODULE_AUTHOR("Ivan Kuten");
|
||||
MODULE_DESCRIPTION("ALSA SoC ALC650 LN2440SBC");
|
||||
MODULE_LICENSE("GPL");
|
|
@ -253,7 +253,7 @@ static int s3c2443_ac97_probe(struct platform_device *pdev)
|
|||
ac_glbctrl |= S3C_AC97_GLBCTRL_TRANSFERDATAENABLE;
|
||||
writel(ac_glbctrl, s3c24xx_ac97.regs + S3C_AC97_GLBCTRL);
|
||||
|
||||
ret = request_irq(IRQ_S3C2443_AC97, s3c2443_ac97_irq,
|
||||
ret = request_irq(IRQ_S3C244x_AC97, s3c2443_ac97_irq,
|
||||
IRQF_DISABLED, "AC97", NULL);
|
||||
if (ret < 0) {
|
||||
printk(KERN_ERR "s3c24xx-ac97: interrupt request failed.\n");
|
||||
|
@ -266,7 +266,7 @@ static int s3c2443_ac97_probe(struct platform_device *pdev)
|
|||
|
||||
static void s3c2443_ac97_remove(struct platform_device *pdev)
|
||||
{
|
||||
free_irq(IRQ_S3C2443_AC97, NULL);
|
||||
free_irq(IRQ_S3C244x_AC97, NULL);
|
||||
clk_disable(s3c24xx_ac97.ac97_clk);
|
||||
clk_put(s3c24xx_ac97.ac97_clk);
|
||||
iounmap(s3c24xx_ac97.regs);
|
||||
|
|
|
@ -20,6 +20,12 @@
|
|||
#define AC_CMD_ADDR(x) (x << 16)
|
||||
#define AC_CMD_DATA(x) (x & 0xffff)
|
||||
|
||||
#ifdef CONFIG_CPU_S3C2440
|
||||
#define IRQ_S3C244x_AC97 IRQ_S3C2440_AC97
|
||||
#else
|
||||
#define IRQ_S3C244x_AC97 IRQ_S3C2443_AC97
|
||||
#endif
|
||||
|
||||
extern struct snd_soc_cpu_dai s3c2443_ac97_dai[];
|
||||
|
||||
#endif /*S3C24XXAC97_H_*/
|
||||
|
|
Loading…
Reference in New Issue