2 drivers/sound/harmony.c
4 This is a sound driver for ASP's and Lasi's Harmony sound chip
5 and is unlikely to be used for anything other than on a HP PA-RISC.
7 Harmony is found in HP 712s, 715/new and many other GSC based machines.
8 On older 715 machines you'll find the technically identical chip
9 called 'Vivace'. Both Harmony and Vicace are supported by this driver.
11 Copyright 2000 (c) Linuxcare Canada, Alex deVries <alex@onefishtwo.ca>
12 Copyright 2000-2003 (c) Helge Deller <deller@gmx.de>
13 Copyright 2001 (c) Matthieu Delahaye <delahaym@esiee.fr>
14 Copyright 2001 (c) Jean-Christophe Vaugeois <vaugeoij@esiee.fr>
15 Copyright 2004 (c) Stuart Brady <sdbrady@ntlworld.com>
19 - fix SNDCTL_DSP_GETOSPACE and SNDCTL_DSP_GETISPACE ioctls to
20 return the real values
21 - add private ioctl for selecting line- or microphone input
22 (only one of them is available at the same time)
23 - add module parameters
24 - implement mmap functionality
25 - implement gain meter ?
29 #include <linux/delay.h>
30 #include <linux/errno.h>
31 #include <linux/init.h>
32 #include <linux/interrupt.h>
33 #include <linux/ioport.h>
34 #include <linux/types.h>
36 #include <linux/pci.h>
38 #include <asm/parisc-device.h>
41 #include "sound_config.h"
44 #define PFX "harmony: "
45 #define HARMONY_VERSION "V0.9a"
49 # define DPRINTK printk
51 # define DPRINTK(x,...)
55 #define MAX_BUFS 10 /* maximum number of rotating buffers */
56 #define HARMONY_BUF_SIZE 4096 /* needs to be a multiple of PAGE_SIZE (4096)! */
58 #define CNTL_C 0x80000000
59 #define CNTL_ST 0x00000020
60 #define CNTL_44100 0x00000015 /* HARMONY_SR_44KHZ */
61 #define CNTL_8000 0x00000008 /* HARMONY_SR_8KHZ */
63 #define GAINCTL_HE 0x08000000
64 #define GAINCTL_LE 0x04000000
65 #define GAINCTL_SE 0x02000000
67 #define DSTATUS_PN 0x00000200
68 #define DSTATUS_RN 0x00000002
70 #define DSTATUS_IE 0x80000000
72 #define HARMONY_DF_16BIT_LINEAR 0
73 #define HARMONY_DF_8BIT_ULAW 1
74 #define HARMONY_DF_8BIT_ALAW 2
76 #define HARMONY_SS_MONO 0
77 #define HARMONY_SS_STEREO 1
79 #define HARMONY_SR_8KHZ 0x08
80 #define HARMONY_SR_16KHZ 0x09
81 #define HARMONY_SR_27KHZ 0x0A
82 #define HARMONY_SR_32KHZ 0x0B
83 #define HARMONY_SR_48KHZ 0x0E
84 #define HARMONY_SR_9KHZ 0x0F
85 #define HARMONY_SR_5KHZ 0x10
86 #define HARMONY_SR_11KHZ 0x11
87 #define HARMONY_SR_18KHZ 0x12
88 #define HARMONY_SR_22KHZ 0x13
89 #define HARMONY_SR_37KHZ 0x14
90 #define HARMONY_SR_44KHZ 0x15
91 #define HARMONY_SR_33KHZ 0x16
92 #define HARMONY_SR_6KHZ 0x17
95 * Some magics numbers used to auto-detect file formats
98 #define HARMONY_MAGIC_8B_ULAW 1
99 #define HARMONY_MAGIC_8B_ALAW 27
100 #define HARMONY_MAGIC_16B_LINEAR 3
101 #define HARMONY_MAGIC_MONO 1
102 #define HARMONY_MAGIC_STEREO 2
105 * Channels Positions in mixer register
108 #define GAIN_HE_SHIFT 27
109 #define GAIN_HE_MASK ( 1 << GAIN_HE_SHIFT)
110 #define GAIN_LE_SHIFT 26
111 #define GAIN_LE_MASK ( 1 << GAIN_LE_SHIFT)
112 #define GAIN_SE_SHIFT 25
113 #define GAIN_SE_MASK ( 1 << GAIN_SE_SHIFT)
114 #define GAIN_IS_SHIFT 24
115 #define GAIN_IS_MASK ( 1 << GAIN_IS_SHIFT)
116 #define GAIN_MA_SHIFT 20
117 #define GAIN_MA_MASK ( 0x0f << GAIN_MA_SHIFT)
118 #define GAIN_LI_SHIFT 16
119 #define GAIN_LI_MASK ( 0x0f << GAIN_LI_SHIFT)
120 #define GAIN_RI_SHIFT 12
121 #define GAIN_RI_MASK ( 0x0f << GAIN_RI_SHIFT)
122 #define GAIN_LO_SHIFT 6
123 #define GAIN_LO_MASK ( 0x3f << GAIN_LO_SHIFT)
124 #define GAIN_RO_SHIFT 0
125 #define GAIN_RO_MASK ( 0x3f << GAIN_RO_SHIFT)
128 #define MAX_OUTPUT_LEVEL (GAIN_RO_MASK >> GAIN_RO_SHIFT)
129 #define MAX_INPUT_LEVEL (GAIN_RI_MASK >> GAIN_RI_SHIFT)
130 #define MAX_MONITOR_LEVEL (GAIN_MA_MASK >> GAIN_MA_SHIFT)
132 #define MIXER_INTERNAL SOUND_MIXER_LINE1
133 #define MIXER_LINEOUT SOUND_MIXER_LINE2
134 #define MIXER_HEADPHONES SOUND_MIXER_LINE3
136 #define MASK_INTERNAL SOUND_MASK_LINE1
137 #define MASK_LINEOUT SOUND_MASK_LINE2
138 #define MASK_HEADPHONES SOUND_MASK_LINE3
141 * Channels Mask in mixer register
144 #define GAIN_TOTAL_SILENCE 0x00F00FFF
145 #define GAIN_DEFAULT 0x0FF00000
169 struct harmony_hpa *hpa;
170 struct parisc_device *dev;
172 u32 dac_rate; /* 8000 ... 48000 (Hz) */
173 u8 data_format; /* HARMONY_DF_xx_BIT_xxx */
174 u8 sample_rate; /* HARMONY_SR_xx_KHZ */
175 u8 stereo_select; /* HARMONY_SS_MONO or HARMONY_SS_STEREO */
176 int format_initialized :1;
177 int suspended_playing :1;
178 int suspended_recording :1;
180 int blocked_playing :1;
181 int blocked_recording :1;
185 wait_queue_head_t wq_play, wq_record;
186 int first_filled_play; /* first buffer containing data (next to play) */
189 int first_filled_record;
190 int nb_filled_record;
192 int dsp_unit, mixer_unit;
196 static struct harmony_dev harmony;
200 * Dynamic sound buffer allocation and DMA memory
203 struct harmony_buffer {
205 dma_addr_t dma_handle;
206 int dma_coherent; /* Zero if dma_alloc_coherent() fails */
211 * Harmony memory buffers
214 static struct harmony_buffer played_buf, recorded_buf, silent, graveyard;
217 #define CHECK_WBACK_INV_OFFSET(b,offset,len) \
218 do { if (!b.dma_coherent) \
219 dma_cache_wback_inv((unsigned long)b.addr+offset,len); \
223 static int __init harmony_alloc_buffer(struct harmony_buffer *b,
224 unsigned int buffer_count)
226 b->len = buffer_count * HARMONY_BUF_SIZE;
227 b->addr = dma_alloc_coherent(&harmony.dev->dev,
228 b->len, &b->dma_handle, GFP_KERNEL|GFP_DMA);
229 if (b->addr && b->dma_handle) {
231 DPRINTK(KERN_INFO PFX "coherent memory: 0x%lx, played_buf: 0x%lx\n",
232 (unsigned long)b->dma_handle, (unsigned long)b->addr);
235 /* kmalloc()ed memory will HPMC on ccio machines ! */
236 b->addr = kmalloc(b->len, GFP_KERNEL);
238 printk(KERN_ERR PFX "couldn't allocate memory\n");
241 b->dma_handle = __pa(b->addr);
246 static void __exit harmony_free_buffer(struct harmony_buffer *b)
252 dma_free_coherent(&harmony.dev->dev,
253 b->len, b->addr, b->dma_handle);
257 memset(b, 0, sizeof(*b));
263 * Low-Level sound-chip programming
266 static void __inline__ harmony_wait_CNTL(void)
268 /* Wait until we're out of control mode */
269 while (gsc_readl(&harmony.hpa->cntl) & CNTL_C)
274 static void harmony_update_control(void)
279 default_cntl = (CNTL_C | /* The C bit */
280 (harmony.data_format << 6) | /* Set the data format */
281 (harmony.stereo_select << 5) | /* Stereo select */
282 (harmony.sample_rate)); /* Set sample rate */
283 harmony.format_initialized = 1;
285 /* initialize CNTL */
286 gsc_writel(default_cntl, &harmony.hpa->cntl);
289 static void harmony_set_control(u8 data_format, u8 sample_rate, u8 stereo_select)
291 harmony.sample_rate = sample_rate;
292 harmony.data_format = data_format;
293 harmony.stereo_select = stereo_select;
294 harmony_update_control();
297 static void harmony_set_rate(u8 data_rate)
299 harmony.sample_rate = data_rate;
300 harmony_update_control();
303 static int harmony_detect_rate(int *freq)
307 case 8000: newrate = HARMONY_SR_8KHZ; break;
308 case 16000: newrate = HARMONY_SR_16KHZ; break;
309 case 27428: newrate = HARMONY_SR_27KHZ; break;
310 case 32000: newrate = HARMONY_SR_32KHZ; break;
311 case 48000: newrate = HARMONY_SR_48KHZ; break;
312 case 9600: newrate = HARMONY_SR_9KHZ; break;
313 case 5512: newrate = HARMONY_SR_5KHZ; break;
314 case 11025: newrate = HARMONY_SR_11KHZ; break;
315 case 18900: newrate = HARMONY_SR_18KHZ; break;
316 case 22050: newrate = HARMONY_SR_22KHZ; break;
317 case 37800: newrate = HARMONY_SR_37KHZ; break;
318 case 44100: newrate = HARMONY_SR_44KHZ; break;
319 case 33075: newrate = HARMONY_SR_33KHZ; break;
320 case 6615: newrate = HARMONY_SR_6KHZ; break;
321 default: newrate = HARMONY_SR_8KHZ;
327 static void harmony_set_format(u8 data_format)
329 harmony.data_format = data_format;
330 harmony_update_control();
333 static void harmony_set_stereo(u8 stereo_select)
335 harmony.stereo_select = stereo_select;
336 harmony_update_control();
339 static void harmony_disable_interrupts(void)
342 gsc_writel(0, &harmony.hpa->dstatus);
345 static void harmony_enable_interrupts(void)
348 gsc_writel(DSTATUS_IE, &harmony.hpa->dstatus);
354 * This subroutine fills in a buffer starting at location start and
355 * silences for length bytes. This references the current
356 * configuration of the audio format.
360 static void harmony_silence(struct harmony_buffer *buffer, int start, int length)
364 /* Despite what you hear, silence is different in
365 different audio formats. */
366 switch (harmony.data_format) {
367 case HARMONY_DF_8BIT_ULAW: silence_char = 0x55; break;
368 case HARMONY_DF_8BIT_ALAW: silence_char = 0xff; break;
369 case HARMONY_DF_16BIT_LINEAR: /* fall through */
370 default: silence_char = 0;
373 memset(buffer->addr+start, silence_char, length);
377 static int harmony_audio_open(struct inode *inode, struct file *file)
379 if (harmony.audio_open)
382 harmony.audio_open = 1;
383 harmony.suspended_playing = harmony.suspended_recording = 1;
384 harmony.blocked_playing = harmony.blocked_recording = 0;
385 harmony.first_filled_play = harmony.first_filled_record = 0;
386 harmony.nb_filled_play = harmony.nb_filled_record = 0;
387 harmony.play_offset = 0;
388 init_waitqueue_head(&harmony.wq_play);
389 init_waitqueue_head(&harmony.wq_record);
391 /* Start off in a balanced mode. */
392 harmony_set_control(HARMONY_DF_8BIT_ULAW, HARMONY_SR_8KHZ, HARMONY_SS_MONO);
393 harmony_update_control();
394 harmony.format_initialized = 0;
396 /* Clear out all the buffers and flush to cache */
397 harmony_silence(&played_buf, 0, HARMONY_BUF_SIZE*MAX_BUFS);
398 CHECK_WBACK_INV_OFFSET(played_buf, 0, HARMONY_BUF_SIZE*MAX_BUFS);
404 * Release (close) the audio device.
407 static int harmony_audio_release(struct inode *inode, struct file *file)
409 if (!harmony.audio_open)
412 harmony.audio_open = 0;
418 * Read recorded data off the audio device.
421 static ssize_t harmony_audio_read(struct file *file,
426 int total_count = (int) size_count;
430 while (count<total_count) {
431 /* Wait until we're out of control mode */
434 /* Figure out which buffer to fill in */
435 if (harmony.nb_filled_record <= 2) {
436 harmony.blocked_recording = 1;
437 if (harmony.suspended_recording) {
438 harmony.suspended_recording = 0;
439 harmony_enable_interrupts();
442 interruptible_sleep_on(&harmony.wq_record);
443 harmony.blocked_recording = 0;
446 if (harmony.nb_filled_record < 2)
449 buf_to_read = harmony.first_filled_record;
451 /* Copy the page to an aligned buffer */
452 if (copy_to_user(buffer+count, recorded_buf.addr +
453 (HARMONY_BUF_SIZE*buf_to_read),
459 harmony.nb_filled_record--;
460 harmony.first_filled_record++;
461 harmony.first_filled_record %= MAX_BUFS;
463 count += HARMONY_BUF_SIZE;
472 * Here is the place where we try to recognize file format.
473 * Sun/NeXT .au files begin with the string .snd
474 * At offset 12 is specified the encoding.
475 * At offset 16 is specified speed rate
476 * At Offset 20 is specified the numbers of voices
479 #define four_bytes_to_u32(start) (file_header[start] << 24)|\
480 (file_header[start+1] << 16)|\
481 (file_header[start+2] << 8)|\
482 (file_header[start+3]);
484 #define test_rate(tested,real_value,harmony_value) if ((tested)<=(real_value))\
487 static int harmony_format_auto_detect(const char *buffer, int block_size)
494 if (copy_from_user(file_header, buffer, sizeof(file_header)))
497 start_string = four_bytes_to_u32(0);
499 if ((file_header[4]==0) && (start_string==0x2E736E64)) {
504 format = four_bytes_to_u32(12);
505 nb_voices = four_bytes_to_u32(20);
506 speed = four_bytes_to_u32(16);
509 case HARMONY_MAGIC_8B_ULAW:
510 harmony.data_format = HARMONY_DF_8BIT_ULAW;
512 case HARMONY_MAGIC_8B_ALAW:
513 harmony.data_format = HARMONY_DF_8BIT_ALAW;
515 case HARMONY_MAGIC_16B_LINEAR:
516 harmony.data_format = HARMONY_DF_16BIT_LINEAR;
519 harmony_set_control(HARMONY_DF_16BIT_LINEAR,
520 HARMONY_SR_44KHZ, HARMONY_SS_STEREO);
524 case HARMONY_MAGIC_MONO:
525 harmony.stereo_select = HARMONY_SS_MONO;
527 case HARMONY_MAGIC_STEREO:
528 harmony.stereo_select = HARMONY_SS_STEREO;
531 harmony.stereo_select = HARMONY_SS_MONO;
534 harmony_set_rate(harmony_detect_rate(&speed));
535 harmony.dac_rate = speed;
539 harmony_set_control(HARMONY_DF_8BIT_ULAW, HARMONY_SR_8KHZ, HARMONY_SS_MONO);
543 #undef four_bytes_to_u32
546 static ssize_t harmony_audio_write(struct file *file,
551 int total_count = (int) size_count;
557 if (!harmony.format_initialized) {
558 if (harmony_format_auto_detect(buffer, total_count))
562 while (count<total_count) {
563 /* Wait until we're out of control mode */
566 /* Figure out which buffer to fill in */
567 if (harmony.nb_filled_play+2 >= MAX_BUFS && !harmony.play_offset) {
568 harmony.blocked_playing = 1;
569 interruptible_sleep_on(&harmony.wq_play);
570 harmony.blocked_playing = 0;
572 if (harmony.nb_filled_play+2 >= MAX_BUFS && !harmony.play_offset)
576 buf_to_fill = (harmony.first_filled_play+harmony.nb_filled_play);
577 if (harmony.play_offset) {
579 buf_to_fill += MAX_BUFS;
581 buf_to_fill %= MAX_BUFS;
583 fresh_buffer = (harmony.play_offset == 0);
585 /* Figure out the size of the frame */
586 if ((total_count-count) >= HARMONY_BUF_SIZE - harmony.play_offset) {
587 frame_size = HARMONY_BUF_SIZE - harmony.play_offset;
589 frame_size = total_count - count;
590 /* Clear out the buffer, since there we'll only be
591 overlaying part of the old buffer with the new one */
592 harmony_silence(&played_buf,
593 HARMONY_BUF_SIZE*buf_to_fill+frame_size+harmony.play_offset,
594 HARMONY_BUF_SIZE-frame_size-harmony.play_offset);
597 /* Copy the page to an aligned buffer */
598 if (copy_from_user(played_buf.addr +(HARMONY_BUF_SIZE*buf_to_fill) + harmony.play_offset,
599 buffer+count, frame_size))
601 CHECK_WBACK_INV_OFFSET(played_buf, (HARMONY_BUF_SIZE*buf_to_fill + harmony.play_offset),
605 harmony.nb_filled_play++;
608 harmony.play_offset += frame_size;
609 harmony.play_offset %= HARMONY_BUF_SIZE;
610 if (harmony.suspended_playing && (harmony.nb_filled_play>=4))
611 harmony_enable_interrupts();
617 static unsigned int harmony_audio_poll(struct file *file,
618 struct poll_table_struct *wait)
620 unsigned int mask = 0;
622 if (file->f_mode & FMODE_READ) {
623 if (!harmony.suspended_recording)
624 poll_wait(file, &harmony.wq_record, wait);
625 if (harmony.nb_filled_record)
626 mask |= POLLIN | POLLRDNORM;
629 if (file->f_mode & FMODE_WRITE) {
630 if (!harmony.suspended_playing)
631 poll_wait(file, &harmony.wq_play, wait);
632 if (harmony.nb_filled_play)
633 mask |= POLLOUT | POLLWRNORM;
639 static int harmony_audio_ioctl(struct inode *inode,
644 int ival, new_format;
645 int frag_size, frag_buf;
646 struct audio_buf_info info;
650 return put_user(SOUND_VERSION, (int *) arg);
652 case SNDCTL_DSP_GETCAPS:
653 ival = DSP_CAP_DUPLEX;
654 return put_user(ival, (int *) arg);
656 case SNDCTL_DSP_GETFMTS:
657 ival = (AFMT_S16_BE | AFMT_MU_LAW | AFMT_A_LAW );
658 return put_user(ival, (int *) arg);
660 case SNDCTL_DSP_SETFMT:
661 if (get_user(ival, (int *) arg))
663 if (ival != AFMT_QUERY) {
665 case AFMT_MU_LAW: new_format = HARMONY_DF_8BIT_ULAW; break;
666 case AFMT_A_LAW: new_format = HARMONY_DF_8BIT_ALAW; break;
667 case AFMT_S16_BE: new_format = HARMONY_DF_16BIT_LINEAR; break;
669 DPRINTK(KERN_WARNING PFX
670 "unsupported sound format 0x%04x requested.\n",
673 return put_user(ival, (int *) arg);
676 harmony_set_format(new_format);
679 switch (harmony.data_format) {
680 case HARMONY_DF_8BIT_ULAW: ival = AFMT_MU_LAW; break;
681 case HARMONY_DF_8BIT_ALAW: ival = AFMT_A_LAW; break;
682 case HARMONY_DF_16BIT_LINEAR: ival = AFMT_U16_BE; break;
685 return put_user(ival, (int *) arg);
688 case SOUND_PCM_READ_RATE:
689 ival = harmony.dac_rate;
690 return put_user(ival, (int *) arg);
692 case SNDCTL_DSP_SPEED:
693 if (get_user(ival, (int *) arg))
695 harmony_set_rate(harmony_detect_rate(&ival));
696 harmony.dac_rate = ival;
697 return put_user(ival, (int*) arg);
699 case SNDCTL_DSP_STEREO:
700 if (get_user(ival, (int *) arg))
702 if (ival != 0 && ival != 1)
704 harmony_set_stereo(ival);
707 case SNDCTL_DSP_CHANNELS:
708 if (get_user(ival, (int *) arg))
710 if (ival != 1 && ival != 2) {
711 ival = harmony.stereo_select == HARMONY_SS_MONO ? 1 : 2;
712 return put_user(ival, (int *) arg);
714 harmony_set_stereo(ival-1);
717 case SNDCTL_DSP_GETBLKSIZE:
718 ival = HARMONY_BUF_SIZE;
719 return put_user(ival, (int *) arg);
721 case SNDCTL_DSP_NONBLOCK:
722 file->f_flags |= O_NONBLOCK;
725 case SNDCTL_DSP_RESET:
726 if (!harmony.suspended_recording) {
727 /* TODO: stop_recording() */
731 case SNDCTL_DSP_SETFRAGMENT:
732 if (get_user(ival, (int *)arg))
734 frag_size = ival & 0xffff;
735 frag_buf = (ival>>16) & 0xffff;
736 /* TODO: We use hardcoded fragment sizes and numbers for now */
737 frag_size = 12; /* 4096 == 2^12 */
739 ival = (frag_buf << 16) + frag_size;
740 return put_user(ival, (int *) arg);
742 case SNDCTL_DSP_GETOSPACE:
743 if (!(file->f_mode & FMODE_WRITE))
745 info.fragstotal = MAX_BUFS;
746 info.fragments = MAX_BUFS - harmony.nb_filled_play;
747 info.fragsize = HARMONY_BUF_SIZE;
748 info.bytes = info.fragments * info.fragsize;
749 return copy_to_user((void *)arg, &info, sizeof(info)) ? -EFAULT : 0;
751 case SNDCTL_DSP_GETISPACE:
752 if (!(file->f_mode & FMODE_READ))
754 info.fragstotal = MAX_BUFS;
755 info.fragments = /*MAX_BUFS-*/ harmony.nb_filled_record;
756 info.fragsize = HARMONY_BUF_SIZE;
757 info.bytes = info.fragments * info.fragsize;
758 return copy_to_user((void *)arg, &info, sizeof(info)) ? -EFAULT : 0;
760 case SNDCTL_DSP_SYNC:
769 * harmony_interrupt()
771 * harmony interruption service routine
775 static irqreturn_t harmony_interrupt(int irq, void *dev, struct pt_regs *regs)
778 struct harmony_hpa *hpa;
781 hpa = ((struct harmony_dev *)dev)->hpa;
784 /* Read dstatus and pcuradd (the current address) */
785 dstatus = gsc_readl(&hpa->dstatus);
787 /* Turn off interrupts */
788 harmony_disable_interrupts();
790 /* Check if this is a request to get the next play buffer */
791 if (dstatus & DSTATUS_PN) {
792 if (!harmony.nb_filled_play) {
793 harmony.suspended_playing = 1;
794 gsc_writel((unsigned long)silent.dma_handle, &hpa->pnxtadd);
796 if (!harmony.suspended_recording)
797 harmony_enable_interrupts();
799 harmony.suspended_playing = 0;
800 gsc_writel((unsigned long)played_buf.dma_handle +
801 (HARMONY_BUF_SIZE*harmony.first_filled_play),
803 harmony.first_filled_play++;
804 harmony.first_filled_play %= MAX_BUFS;
805 harmony.nb_filled_play--;
807 harmony_enable_interrupts();
810 if (harmony.blocked_playing)
811 wake_up_interruptible(&harmony.wq_play);
814 /* Check if we're being asked to fill in a recording buffer */
815 if (dstatus & DSTATUS_RN) {
816 if((harmony.nb_filled_record+2>=MAX_BUFS) || harmony.suspended_recording)
818 harmony.nb_filled_record = 0;
819 harmony.first_filled_record = 0;
820 harmony.suspended_recording = 1;
821 gsc_writel((unsigned long)graveyard.dma_handle, &hpa->rnxtadd);
822 if (!harmony.suspended_playing)
823 harmony_enable_interrupts();
826 buf_to_fill = (harmony.first_filled_record+harmony.nb_filled_record) % MAX_BUFS;
827 CHECK_WBACK_INV_OFFSET(recorded_buf, HARMONY_BUF_SIZE*buf_to_fill, HARMONY_BUF_SIZE);
828 gsc_writel((unsigned long)recorded_buf.dma_handle +
829 HARMONY_BUF_SIZE*buf_to_fill,
831 harmony.nb_filled_record++;
832 harmony_enable_interrupts();
835 if (harmony.blocked_recording && harmony.nb_filled_record>3)
836 wake_up_interruptible(&harmony.wq_record);
842 * Sound playing functions
845 static struct file_operations harmony_audio_fops = {
846 .owner = THIS_MODULE,
848 .read = harmony_audio_read,
849 .write = harmony_audio_write,
850 .poll = harmony_audio_poll,
851 .ioctl = harmony_audio_ioctl,
852 .open = harmony_audio_open,
853 .release = harmony_audio_release,
856 static int harmony_audio_init(void)
858 /* Request that IRQ */
859 if (request_irq(harmony.dev->irq, harmony_interrupt, 0 ,"harmony", &harmony)) {
860 printk(KERN_ERR PFX "Error requesting irq %d.\n", harmony.dev->irq);
864 harmony.dsp_unit = register_sound_dsp(&harmony_audio_fops, -1);
865 if (harmony.dsp_unit < 0) {
866 printk(KERN_ERR PFX "Error registering dsp\n");
867 free_irq(harmony.dev->irq, &harmony);
871 /* Clear the buffers so you don't end up with crap in the buffers. */
872 harmony_silence(&played_buf, 0, HARMONY_BUF_SIZE*MAX_BUFS);
874 /* Make sure this makes it to cache */
875 CHECK_WBACK_INV_OFFSET(played_buf, 0, HARMONY_BUF_SIZE*MAX_BUFS);
877 /* Clear out the silent buffer and flush to cache */
878 harmony_silence(&silent, 0, HARMONY_BUF_SIZE);
879 CHECK_WBACK_INV_OFFSET(silent, 0, HARMONY_BUF_SIZE);
881 harmony.audio_open = 0;
891 static void harmony_mixer_set_gain(void)
894 gsc_writel(harmony.current_gain, &harmony.hpa->gainctl);
898 * Read gain of selected channel.
899 * The OSS rate is from 0 (silent) to 100 -> need some conversions
901 * The harmony gain are attenuation for output and monitor gain.
902 * is amplifaction for input gain
904 #define to_harmony_level(level,max) ((level)*max/100)
905 #define to_oss_level(level,max) ((level)*100/max)
907 static int harmony_mixer_get_level(int channel)
913 case SOUND_MIXER_VOLUME:
914 left_level = (harmony.current_gain & GAIN_LO_MASK) >> GAIN_LO_SHIFT;
915 right_level = (harmony.current_gain & GAIN_RO_MASK) >> GAIN_RO_SHIFT;
916 left_level = to_oss_level(MAX_OUTPUT_LEVEL - left_level, MAX_OUTPUT_LEVEL);
917 right_level = to_oss_level(MAX_OUTPUT_LEVEL - right_level, MAX_OUTPUT_LEVEL);
918 return (right_level << 8)+left_level;
920 case SOUND_MIXER_IGAIN:
921 left_level = (harmony.current_gain & GAIN_LI_MASK) >> GAIN_LI_SHIFT;
922 right_level= (harmony.current_gain & GAIN_RI_MASK) >> GAIN_RI_SHIFT;
923 left_level = to_oss_level(left_level, MAX_INPUT_LEVEL);
924 right_level= to_oss_level(right_level, MAX_INPUT_LEVEL);
925 return (right_level << 8)+left_level;
927 case SOUND_MIXER_MONITOR:
928 left_level = (harmony.current_gain & GAIN_MA_MASK) >> GAIN_MA_SHIFT;
929 left_level = to_oss_level(MAX_MONITOR_LEVEL-left_level, MAX_MONITOR_LEVEL);
930 return (left_level << 8)+left_level;
938 * Some conversions for the same reasons.
939 * We give back the new real value(s) due to
943 static int harmony_mixer_set_level(int channel, int value)
950 right_level = (value & 0x0000ff00) >> 8;
951 left_level = value & 0x000000ff;
952 if (right_level > 100) right_level = 100;
953 if (left_level > 100) left_level = 100;
956 case SOUND_MIXER_VOLUME:
957 right_level = to_harmony_level(100-right_level, MAX_OUTPUT_LEVEL);
958 left_level = to_harmony_level(100-left_level, MAX_OUTPUT_LEVEL);
959 new_right_level = to_oss_level(MAX_OUTPUT_LEVEL - right_level, MAX_OUTPUT_LEVEL);
960 new_left_level = to_oss_level(MAX_OUTPUT_LEVEL - left_level, MAX_OUTPUT_LEVEL);
961 harmony.current_gain = (harmony.current_gain & ~(GAIN_LO_MASK | GAIN_RO_MASK))
962 | (left_level << GAIN_LO_SHIFT) | (right_level << GAIN_RO_SHIFT);
963 harmony_mixer_set_gain();
964 return (new_right_level << 8) + new_left_level;
966 case SOUND_MIXER_IGAIN:
967 right_level = to_harmony_level(right_level, MAX_INPUT_LEVEL);
968 left_level = to_harmony_level(left_level, MAX_INPUT_LEVEL);
969 new_right_level = to_oss_level(right_level, MAX_INPUT_LEVEL);
970 new_left_level = to_oss_level(left_level, MAX_INPUT_LEVEL);
971 harmony.current_gain = (harmony.current_gain & ~(GAIN_LI_MASK | GAIN_RI_MASK))
972 | (left_level << GAIN_LI_SHIFT) | (right_level << GAIN_RI_SHIFT);
973 harmony_mixer_set_gain();
974 return (new_right_level << 8) + new_left_level;
976 case SOUND_MIXER_MONITOR:
977 left_level = to_harmony_level(100-left_level, MAX_MONITOR_LEVEL);
978 new_left_level = to_oss_level(MAX_MONITOR_LEVEL-left_level, MAX_MONITOR_LEVEL);
979 harmony.current_gain = (harmony.current_gain & ~GAIN_MA_MASK) | (left_level << GAIN_MA_SHIFT);
980 harmony_mixer_set_gain();
981 return (new_left_level << 8) + new_left_level;
987 #undef to_harmony_level
991 * Return the selected input device (mic or line)
994 static int harmony_mixer_get_recmask(void)
996 int current_input_line;
998 current_input_line = (harmony.current_gain & GAIN_IS_MASK)
1000 if (current_input_line)
1001 return SOUND_MASK_MIC;
1003 return SOUND_MASK_LINE;
1007 * Set the input (only one at time, arbitrary priority to line in)
1010 static int harmony_mixer_set_recmask(int recmask)
1014 int current_input_line;
1016 current_input_line = (harmony.current_gain & GAIN_IS_MASK)
1018 if ((current_input_line && ((recmask & SOUND_MASK_LINE) || !(recmask & SOUND_MASK_MIC))) ||
1019 (!current_input_line && ((recmask & SOUND_MASK_LINE) && !(recmask & SOUND_MASK_MIC)))) {
1021 new_input_mask = SOUND_MASK_LINE;
1024 new_input_mask = SOUND_MASK_MIC;
1026 harmony.current_gain = ((harmony.current_gain & ~GAIN_IS_MASK) |
1027 (new_input_line << GAIN_IS_SHIFT ));
1028 harmony_mixer_set_gain();
1029 return new_input_mask;
1034 * give the active outlines
1037 static int harmony_mixer_get_outmask(void)
1041 if (harmony.current_gain & GAIN_SE_MASK) outmask |= MASK_INTERNAL;
1042 if (harmony.current_gain & GAIN_LE_MASK) outmask |= MASK_LINEOUT;
1043 if (harmony.current_gain & GAIN_HE_MASK) outmask |= MASK_HEADPHONES;
1049 static int harmony_mixer_set_outmask(int outmask)
1051 if (outmask & MASK_INTERNAL)
1052 harmony.current_gain |= GAIN_SE_MASK;
1054 harmony.current_gain &= ~GAIN_SE_MASK;
1056 if (outmask & MASK_LINEOUT)
1057 harmony.current_gain |= GAIN_LE_MASK;
1059 harmony.current_gain &= ~GAIN_LE_MASK;
1061 if (outmask & MASK_HEADPHONES)
1062 harmony.current_gain |= GAIN_HE_MASK;
1064 harmony.current_gain &= ~GAIN_HE_MASK;
1066 harmony_mixer_set_gain();
1068 return (outmask & (MASK_INTERNAL | MASK_LINEOUT | MASK_HEADPHONES));
1072 * This code is inspired from sb_mixer.c
1075 static int harmony_mixer_ioctl(struct inode * inode, struct file * file,
1076 unsigned int cmd, unsigned long arg)
1081 if (cmd == SOUND_MIXER_INFO) {
1083 memset(&info, 0, sizeof(info));
1084 strncpy(info.id, "harmony", sizeof(info.id)-1);
1085 strncpy(info.name, "Harmony audio", sizeof(info.name)-1);
1086 info.modify_counter = 1; /* ? */
1087 if (copy_to_user((void *)arg, &info, sizeof(info)))
1092 if (cmd == OSS_GETVERSION)
1093 return put_user(SOUND_VERSION, (int *)arg);
1097 if (_SIOC_DIR(cmd) & _SIOC_WRITE)
1098 if (get_user(val, (int *)arg))
1102 case MIXER_READ(SOUND_MIXER_CAPS):
1103 ret = SOUND_CAP_EXCL_INPUT;
1105 case MIXER_READ(SOUND_MIXER_STEREODEVS):
1106 ret = SOUND_MASK_VOLUME | SOUND_MASK_IGAIN;
1109 case MIXER_READ(SOUND_MIXER_RECMASK):
1110 ret = SOUND_MASK_MIC | SOUND_MASK_LINE;
1112 case MIXER_READ(SOUND_MIXER_DEVMASK):
1113 ret = SOUND_MASK_VOLUME | SOUND_MASK_IGAIN |
1116 case MIXER_READ(SOUND_MIXER_OUTMASK):
1117 ret = MASK_INTERNAL | MASK_LINEOUT |
1121 case MIXER_WRITE(SOUND_MIXER_RECSRC):
1122 ret = harmony_mixer_set_recmask(val);
1124 case MIXER_READ(SOUND_MIXER_RECSRC):
1125 ret = harmony_mixer_get_recmask();
1128 case MIXER_WRITE(SOUND_MIXER_OUTSRC):
1129 ret = harmony_mixer_set_outmask(val);
1131 case MIXER_READ(SOUND_MIXER_OUTSRC):
1132 ret = harmony_mixer_get_outmask();
1135 case MIXER_WRITE(SOUND_MIXER_VOLUME):
1136 case MIXER_WRITE(SOUND_MIXER_IGAIN):
1137 case MIXER_WRITE(SOUND_MIXER_MONITOR):
1138 ret = harmony_mixer_set_level(cmd & 0xff, val);
1141 case MIXER_READ(SOUND_MIXER_VOLUME):
1142 case MIXER_READ(SOUND_MIXER_IGAIN):
1143 case MIXER_READ(SOUND_MIXER_MONITOR):
1144 ret = harmony_mixer_get_level(cmd & 0xff);
1151 if (put_user(ret, (int *)arg))
1157 static int harmony_mixer_open(struct inode *inode, struct file *file)
1159 if (harmony.mixer_open)
1161 harmony.mixer_open = 1;
1165 static int harmony_mixer_release(struct inode *inode, struct file *file)
1167 if (!harmony.mixer_open)
1169 harmony.mixer_open = 0;
1173 static struct file_operations harmony_mixer_fops = {
1174 .owner = THIS_MODULE,
1175 .llseek = no_llseek,
1176 .open = harmony_mixer_open,
1177 .release = harmony_mixer_release,
1178 .ioctl = harmony_mixer_ioctl,
1183 * Mute all the output and reset Harmony.
1186 static void __init harmony_mixer_reset(void)
1188 harmony.current_gain = GAIN_TOTAL_SILENCE;
1189 harmony_mixer_set_gain();
1190 harmony_wait_CNTL();
1191 gsc_writel(1, &harmony.hpa->reset);
1192 mdelay(50); /* wait 50 ms */
1193 gsc_writel(0, &harmony.hpa->reset);
1194 harmony.current_gain = GAIN_DEFAULT;
1195 harmony_mixer_set_gain();
1198 static int __init harmony_mixer_init(void)
1200 /* Register the device file operations */
1201 harmony.mixer_unit = register_sound_mixer(&harmony_mixer_fops, -1);
1202 if (harmony.mixer_unit < 0) {
1203 printk(KERN_WARNING PFX "Error Registering Mixer Driver\n");
1207 harmony_mixer_reset();
1208 harmony.mixer_open = 0;
1216 * This is the callback that's called by the inventory hardware code
1217 * if it finds a match to the registered driver.
1219 static int __devinit
1220 harmony_driver_probe(struct parisc_device *dev)
1228 /* We only support one Harmony at this time */
1229 printk(KERN_ERR PFX "driver already registered\n");
1234 printk(KERN_ERR PFX "no irq found\n");
1238 /* Set the HPA of harmony */
1239 harmony.hpa = (struct harmony_hpa *)dev->hpa;
1242 /* Grab the ID and revision from the device */
1243 id = gsc_readb(&harmony.hpa->id);
1244 if ((id | 1) != 0x15) {
1245 printk(KERN_WARNING PFX "wrong harmony id 0x%02x\n", id);
1248 cntl = gsc_readl(&harmony.hpa->cntl);
1249 rev = (cntl>>20) & 0xff;
1251 printk(KERN_INFO "Lasi Harmony Audio driver " HARMONY_VERSION ", "
1252 "h/w id %i, rev. %i at 0x%lx, IRQ %i\n",
1253 id, rev, dev->hpa, harmony.dev->irq);
1255 /* Make sure the control bit isn't set, although I don't think it
1257 if (cntl & CNTL_C) {
1258 printk(KERN_WARNING PFX "CNTL busy\n");
1263 /* Initialize the memory buffers */
1264 if (harmony_alloc_buffer(&played_buf, MAX_BUFS) ||
1265 harmony_alloc_buffer(&recorded_buf, MAX_BUFS) ||
1266 harmony_alloc_buffer(&graveyard, 1) ||
1267 harmony_alloc_buffer(&silent, 1)) {
1272 /* Initialize /dev/mixer and /dev/audio */
1273 if ((ret=harmony_mixer_init()))
1275 if ((ret=harmony_audio_init()))
1282 harmony_free_buffer(&played_buf);
1283 harmony_free_buffer(&recorded_buf);
1284 harmony_free_buffer(&graveyard);
1285 harmony_free_buffer(&silent);
1290 static struct parisc_device_id harmony_tbl[] = {
1291 /* { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0007A }, Bushmaster/Flounder */
1292 { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0007B }, /* 712/715 Audio */
1293 { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0007E }, /* Pace Audio */
1294 { HPHW_FIO, HVERSION_REV_ANY_ID, HVERSION_ANY_ID, 0x0007F }, /* Outfield / Coral II */
1298 MODULE_DEVICE_TABLE(parisc, harmony_tbl);
1300 static struct parisc_driver harmony_driver = {
1301 .name = "Lasi Harmony",
1302 .id_table = harmony_tbl,
1303 .probe = harmony_driver_probe,
1306 static int __init init_harmony(void)
1308 return register_parisc_driver(&harmony_driver);
1311 static void __exit cleanup_harmony(void)
1313 free_irq(harmony.dev->irq, &harmony);
1314 unregister_sound_mixer(harmony.mixer_unit);
1315 unregister_sound_dsp(harmony.dsp_unit);
1316 harmony_free_buffer(&played_buf);
1317 harmony_free_buffer(&recorded_buf);
1318 harmony_free_buffer(&graveyard);
1319 harmony_free_buffer(&silent);
1320 unregister_parisc_driver(&harmony_driver);
1324 MODULE_AUTHOR("Alex DeVries <alex@onefishtwo.ca>");
1325 MODULE_DESCRIPTION("Harmony sound driver");
1326 MODULE_LICENSE("GPL");
1328 module_init(init_harmony);
1329 module_exit(cleanup_harmony);