Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9dcaa7b2 authored by Rafael Ignacio Zurita's avatar Rafael Ignacio Zurita Committed by Takashi Iwai
Browse files

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: default avatarRafael Ignacio Zurita <rizurita@yahoo.com>
Acked-by: default avatarPaul Mundt <lethal@linux-sh.org>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent bcc2c6b7
Loading
Loading
Loading
Loading
+55 −0
Original line number Original line Diff line number Diff line
@@ -13,6 +13,7 @@
#include <linux/init.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/platform_device.h>
#include <linux/irq.h>
#include <linux/irq.h>
#include <sound/sh_dac_audio.h>
#include <asm/hd64461.h>
#include <asm/hd64461.h>
#include <asm/io.h>
#include <asm/io.h>
#include <mach/hp6xx.h>
#include <mach/hp6xx.h>
@@ -51,9 +52,63 @@ static struct platform_device jornadakbd_device = {
	.id		= -1,
	.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 = {
static struct platform_device *hp6xx_devices[] __initdata = {
	&cf_ide_device,
	&cf_ide_device,
	&jornadakbd_device,
	&jornadakbd_device,
	&dac_audio_device,
};
};


static void __init hp6xx_init_irq(void)
static void __init hp6xx_init_irq(void)
+4 −0
Original line number Original line Diff line number Diff line
@@ -29,6 +29,9 @@


#define PKDR_LED_GREEN		0x10
#define PKDR_LED_GREEN		0x10


/* HP Palmtop 620lx/660lx speaker on/off */
#define PKDR_SPEAKER		0x20

#define SCPDR_TS_SCAN_ENABLE	0x20
#define SCPDR_TS_SCAN_ENABLE	0x20
#define SCPDR_TS_SCAN_Y		0x02
#define SCPDR_TS_SCAN_Y		0x02
#define SCPDR_TS_SCAN_X		0x01
#define SCPDR_TS_SCAN_X		0x01
@@ -42,6 +45,7 @@
#define ADC_CHANNEL_BACKUP	4
#define ADC_CHANNEL_BACKUP	4
#define ADC_CHANNEL_CHARGE	5
#define ADC_CHANNEL_CHARGE	5


/* HP Jornada 680/690 speaker on/off */
#define HD64461_GPADR_SPEAKER	0x01
#define HD64461_GPADR_SPEAKER	0x01
#define HD64461_GPADR_PCMCIA0	(0x02|0x08)
#define HD64461_GPADR_PCMCIA0	(0x02|0x08)


+21 −0
Original line number Original line Diff line number Diff line
/*
 * SH_DAC specific configuration, for the dac_audio platform_device
 *
 * Copyright (C) 2009 Rafael Ignacio Zurita <rizurita@yahoo.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.
 */

#ifndef __INCLUDE_SH_DAC_AUDIO_H
#define __INCLUDE_SH_DAC_AUDIO_H

struct dac_audio_pdata {
	int buffer_size;
	int channel;
	void (*start)(struct dac_audio_pdata *pd);
	void (*stop)(struct dac_audio_pdata *pd);
};

#endif /* __INCLUDE_SH_DAC_AUDIO_H */
+8 −0
Original line number Original line Diff line number Diff line
@@ -19,5 +19,13 @@ config SND_AICA
	help
	help
	  ALSA Sound driver for the SEGA Dreamcast console.
	  ALSA Sound driver for the SEGA Dreamcast console.


config SND_SH_DAC_AUDIO
	tristate "SuperH DAC audio support"
	depends on SND
	depends on CPU_SH3 && HIGH_RES_TIMERS
	select SND_PCM
	help
	  Say Y here to include support for the on-chip DAC.

endif	# SND_SUPERH
endif	# SND_SUPERH
+2 −0
Original line number Original line Diff line number Diff line
@@ -3,6 +3,8 @@
#
#


snd-aica-objs := aica.o
snd-aica-objs := aica.o
snd-sh_dac_audio-objs := sh_dac_audio.o


# Toplevel Module Dependency
# Toplevel Module Dependency
obj-$(CONFIG_SND_AICA) += snd-aica.o
obj-$(CONFIG_SND_AICA) += snd-aica.o
obj-$(CONFIG_SND_SH_DAC_AUDIO) += snd-sh_dac_audio.o
Loading