diff options
author | Rafael Ignacio Zurita <rizurita@yahoo.com> | 2009-11-03 15:16:27 -0500 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2009-11-04 03:17:40 -0500 |
commit | 9dcaa7b25f2c8f6a0485854cd3641f585a154072 (patch) | |
tree | 1f3453a235682f5ba4b4357633f3546a4dbf4e2b /arch | |
parent | bcc2c6b7cb320d10c7fcccd87dce87f4384b4332 (diff) |
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>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/sh/boards/mach-hp6xx/setup.c | 55 | ||||
-rw-r--r-- | arch/sh/include/mach-common/mach/hp6xx.h | 4 |
2 files changed, 59 insertions, 0 deletions
diff --git a/arch/sh/boards/mach-hp6xx/setup.c b/arch/sh/boards/mach-hp6xx/setup.c index 8f305b36358b..e6dd5e96321e 100644 --- a/arch/sh/boards/mach-hp6xx/setup.c +++ b/arch/sh/boards/mach-hp6xx/setup.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/init.h> | 13 | #include <linux/init.h> |
14 | #include <linux/platform_device.h> | 14 | #include <linux/platform_device.h> |
15 | #include <linux/irq.h> | 15 | #include <linux/irq.h> |
16 | #include <sound/sh_dac_audio.h> | ||
16 | #include <asm/hd64461.h> | 17 | #include <asm/hd64461.h> |
17 | #include <asm/io.h> | 18 | #include <asm/io.h> |
18 | #include <mach/hp6xx.h> | 19 | #include <mach/hp6xx.h> |
@@ -51,9 +52,63 @@ static struct platform_device jornadakbd_device = { | |||
51 | .id = -1, | 52 | .id = -1, |
52 | }; | 53 | }; |
53 | 54 | ||
55 | static void dac_audio_start(struct dac_audio_pdata *pdata) | ||
56 | { | ||
57 | u16 v; | ||
58 | u8 v8; | ||
59 | |||
60 | /* HP Jornada 680/690 speaker on */ | ||
61 | v = inw(HD64461_GPADR); | ||
62 | v &= ~HD64461_GPADR_SPEAKER; | ||
63 | outw(v, HD64461_GPADR); | ||
64 | |||
65 | /* HP Palmtop 620lx/660lx speaker on */ | ||
66 | v8 = inb(PKDR); | ||
67 | v8 &= ~PKDR_SPEAKER; | ||
68 | outb(v8, PKDR); | ||
69 | |||
70 | sh_dac_enable(pdata->channel); | ||
71 | } | ||
72 | |||
73 | static void dac_audio_stop(struct dac_audio_pdata *pdata) | ||
74 | { | ||
75 | u16 v; | ||
76 | u8 v8; | ||
77 | |||
78 | /* HP Jornada 680/690 speaker off */ | ||
79 | v = inw(HD64461_GPADR); | ||
80 | v |= HD64461_GPADR_SPEAKER; | ||
81 | outw(v, HD64461_GPADR); | ||
82 | |||
83 | /* HP Palmtop 620lx/660lx speaker off */ | ||
84 | v8 = inb(PKDR); | ||
85 | v8 |= PKDR_SPEAKER; | ||
86 | outb(v8, PKDR); | ||
87 | |||
88 | sh_dac_output(0, pdata->channel); | ||
89 | sh_dac_disable(pdata->channel); | ||
90 | } | ||
91 | |||
92 | static struct dac_audio_pdata dac_audio_platform_data = { | ||
93 | .buffer_size = 64000, | ||
94 | .channel = 1, | ||
95 | .start = dac_audio_start, | ||
96 | .stop = dac_audio_stop, | ||
97 | }; | ||
98 | |||
99 | static struct platform_device dac_audio_device = { | ||
100 | .name = "dac_audio", | ||
101 | .id = -1, | ||
102 | .dev = { | ||
103 | .platform_data = &dac_audio_platform_data, | ||
104 | } | ||
105 | |||
106 | }; | ||
107 | |||
54 | static struct platform_device *hp6xx_devices[] __initdata = { | 108 | static struct platform_device *hp6xx_devices[] __initdata = { |
55 | &cf_ide_device, | 109 | &cf_ide_device, |
56 | &jornadakbd_device, | 110 | &jornadakbd_device, |
111 | &dac_audio_device, | ||
57 | }; | 112 | }; |
58 | 113 | ||
59 | static void __init hp6xx_init_irq(void) | 114 | static void __init hp6xx_init_irq(void) |
diff --git a/arch/sh/include/mach-common/mach/hp6xx.h b/arch/sh/include/mach-common/mach/hp6xx.h index 0d4165a32dcd..bcc301ac12f4 100644 --- a/arch/sh/include/mach-common/mach/hp6xx.h +++ b/arch/sh/include/mach-common/mach/hp6xx.h | |||
@@ -29,6 +29,9 @@ | |||
29 | 29 | ||
30 | #define PKDR_LED_GREEN 0x10 | 30 | #define PKDR_LED_GREEN 0x10 |
31 | 31 | ||
32 | /* HP Palmtop 620lx/660lx speaker on/off */ | ||
33 | #define PKDR_SPEAKER 0x20 | ||
34 | |||
32 | #define SCPDR_TS_SCAN_ENABLE 0x20 | 35 | #define SCPDR_TS_SCAN_ENABLE 0x20 |
33 | #define SCPDR_TS_SCAN_Y 0x02 | 36 | #define SCPDR_TS_SCAN_Y 0x02 |
34 | #define SCPDR_TS_SCAN_X 0x01 | 37 | #define SCPDR_TS_SCAN_X 0x01 |
@@ -42,6 +45,7 @@ | |||
42 | #define ADC_CHANNEL_BACKUP 4 | 45 | #define ADC_CHANNEL_BACKUP 4 |
43 | #define ADC_CHANNEL_CHARGE 5 | 46 | #define ADC_CHANNEL_CHARGE 5 |
44 | 47 | ||
48 | /* HP Jornada 680/690 speaker on/off */ | ||
45 | #define HD64461_GPADR_SPEAKER 0x01 | 49 | #define HD64461_GPADR_SPEAKER 0x01 |
46 | #define HD64461_GPADR_PCMCIA0 (0x02|0x08) | 50 | #define HD64461_GPADR_PCMCIA0 (0x02|0x08) |
47 | 51 | ||