From 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Sat, 16 Apr 2005 15:20:36 -0700 Subject: Linux-2.6.12-rc2 Initial git repository build. I'm not bothering with the full history, even though we have it. We can create a separate "historical" git archive of that later if we want to, and in the meantime it's about 3.2GB when imported into git - space that would just make the early git days unnecessarily complicated, when we don't have a lot of good infrastructure for it. Let it rip! --- arch/m68k/amiga/amisound.c | 113 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 arch/m68k/amiga/amisound.c (limited to 'arch/m68k/amiga/amisound.c') diff --git a/arch/m68k/amiga/amisound.c b/arch/m68k/amiga/amisound.c new file mode 100644 index 00000000000..cb5d9363046 --- /dev/null +++ b/arch/m68k/amiga/amisound.c @@ -0,0 +1,113 @@ +/* + * linux/arch/m68k/amiga/amisound.c + * + * amiga sound driver for Linux/m68k + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file COPYING in the main directory of this archive + * for more details. + */ + +#include +#include +#include +#include +#include + +#include +#include + +static unsigned short *snd_data; +static const signed char sine_data[] = { + 0, 39, 75, 103, 121, 127, 121, 103, 75, 39, + 0, -39, -75, -103, -121, -127, -121, -103, -75, -39 +}; +#define DATA_SIZE (sizeof(sine_data)/sizeof(sine_data[0])) + + /* + * The minimum period for audio may be modified by the frame buffer + * device since it depends on htotal (for OCS/ECS/AGA) + */ + +volatile unsigned short amiga_audio_min_period = 124; /* Default for pre-OCS */ + +#define MAX_PERIOD (65535) + + + /* + * Current period (set by dmasound.c) + */ + +unsigned short amiga_audio_period = MAX_PERIOD; + +static unsigned long clock_constant; + +void __init amiga_init_sound(void) +{ + static struct resource beep_res = { .name = "Beep" }; + + snd_data = amiga_chip_alloc_res(sizeof(sine_data), &beep_res); + if (!snd_data) { + printk (KERN_CRIT "amiga init_sound: failed to allocate chipmem\n"); + return; + } + memcpy (snd_data, sine_data, sizeof(sine_data)); + + /* setup divisor */ + clock_constant = (amiga_colorclock+DATA_SIZE/2)/DATA_SIZE; + + /* without amifb, turn video off and enable high quality sound */ +#ifndef CONFIG_FB_AMIGA + amifb_video_off(); +#endif +} + +static void nosound( unsigned long ignored ); +static struct timer_list sound_timer = TIMER_INITIALIZER(nosound, 0, 0); + +void amiga_mksound( unsigned int hz, unsigned int ticks ) +{ + unsigned long flags; + + if (!snd_data) + return; + + local_irq_save(flags); + del_timer( &sound_timer ); + + if (hz > 20 && hz < 32767) { + unsigned long period = (clock_constant / hz); + + if (period < amiga_audio_min_period) + period = amiga_audio_min_period; + if (period > MAX_PERIOD) + period = MAX_PERIOD; + + /* setup pointer to data, period, length and volume */ + custom.aud[2].audlc = snd_data; + custom.aud[2].audlen = sizeof(sine_data)/2; + custom.aud[2].audper = (unsigned short)period; + custom.aud[2].audvol = 32; /* 50% of maxvol */ + + if (ticks) { + sound_timer.expires = jiffies + ticks; + add_timer( &sound_timer ); + } + + /* turn on DMA for audio channel 2 */ + custom.dmacon = DMAF_SETCLR | DMAF_AUD2; + + } else + nosound( 0 ); + + local_irq_restore(flags); +} + + +static void nosound( unsigned long ignored ) +{ + /* turn off DMA for audio channel 2 */ + custom.dmacon = DMAF_AUD2; + /* restore period to previous value after beeping */ + custom.aud[2].audper = amiga_audio_period; +} -- cgit v1.2.3