ALSA: sh: add SuperH DAC audio driver for ALSA V4
This is a port of the sound/oss/sh_dac_audio.c driver. The driver uses an on-chip 8-bit D/A converter, which has a speaker connected to one of its channels, found in several ancient HP machines. For interrupts it uses a high-resolution timer (hrtimer). Tested on SH7709 based hp6xx (HP Jornada 680/690 and HP Palmtop 620lx/660lx). Also, since OSS Emulation works, the old OSS sound/oss/sh_dac_audio.c driver would be obsolete soon, and it could be removed. Signed-off-by: Rafael Ignacio Zurita <rizurita@yahoo.com> Acked-by: Paul Mundt <lethal@linux-sh.org> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:

committed by
Takashi Iwai

parent
bcc2c6b7cb
commit
9dcaa7b25f
@@ -13,6 +13,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/irq.h>
|
||||
#include <sound/sh_dac_audio.h>
|
||||
#include <asm/hd64461.h>
|
||||
#include <asm/io.h>
|
||||
#include <mach/hp6xx.h>
|
||||
@@ -51,9 +52,63 @@ static struct platform_device jornadakbd_device = {
|
||||
.id = -1,
|
||||
};
|
||||
|
||||
static void dac_audio_start(struct dac_audio_pdata *pdata)
|
||||
{
|
||||
u16 v;
|
||||
u8 v8;
|
||||
|
||||
/* HP Jornada 680/690 speaker on */
|
||||
v = inw(HD64461_GPADR);
|
||||
v &= ~HD64461_GPADR_SPEAKER;
|
||||
outw(v, HD64461_GPADR);
|
||||
|
||||
/* HP Palmtop 620lx/660lx speaker on */
|
||||
v8 = inb(PKDR);
|
||||
v8 &= ~PKDR_SPEAKER;
|
||||
outb(v8, PKDR);
|
||||
|
||||
sh_dac_enable(pdata->channel);
|
||||
}
|
||||
|
||||
static void dac_audio_stop(struct dac_audio_pdata *pdata)
|
||||
{
|
||||
u16 v;
|
||||
u8 v8;
|
||||
|
||||
/* HP Jornada 680/690 speaker off */
|
||||
v = inw(HD64461_GPADR);
|
||||
v |= HD64461_GPADR_SPEAKER;
|
||||
outw(v, HD64461_GPADR);
|
||||
|
||||
/* HP Palmtop 620lx/660lx speaker off */
|
||||
v8 = inb(PKDR);
|
||||
v8 |= PKDR_SPEAKER;
|
||||
outb(v8, PKDR);
|
||||
|
||||
sh_dac_output(0, pdata->channel);
|
||||
sh_dac_disable(pdata->channel);
|
||||
}
|
||||
|
||||
static struct dac_audio_pdata dac_audio_platform_data = {
|
||||
.buffer_size = 64000,
|
||||
.channel = 1,
|
||||
.start = dac_audio_start,
|
||||
.stop = dac_audio_stop,
|
||||
};
|
||||
|
||||
static struct platform_device dac_audio_device = {
|
||||
.name = "dac_audio",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &dac_audio_platform_data,
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
static struct platform_device *hp6xx_devices[] __initdata = {
|
||||
&cf_ide_device,
|
||||
&jornadakbd_device,
|
||||
&dac_audio_device,
|
||||
};
|
||||
|
||||
static void __init hp6xx_init_irq(void)
|
||||
|
Reference in New Issue
Block a user