File: /usr/src/linux/drivers/sound/opl3.c

1     /*
2      * sound/opl3.c
3      *
4      * A low level driver for Yamaha YM3812 and OPL-3 -chips
5      *
6      *
7      * Copyright (C) by Hannu Savolainen 1993-1997
8      *
9      * OSS/Free for Linux is distributed under the GNU GENERAL PUBLIC LICENSE (GPL)
10      * Version 2 (June 1991). See the "COPYING" file distributed with this software
11      * for more info.
12      *
13      *
14      * Changes
15      *	Thomas Sailer   	ioctl code reworked (vmalloc/vfree removed)
16      *	Alan Cox		modularisation, fixed sound_mem allocs.
17      *	Christoph Hellwig	Adapted to module_init/module_exit
18      *	Arnaldo C. de Melo	get rid of check_region, use request_region for
19      *				OPL4, release it on exit, some cleanups.
20      *
21      * Status
22      *	Believed to work. Badly needs rewriting a bit to support multiple
23      *	OPL3 devices.
24      */
25     
26     #include <linux/init.h>
27     #include <linux/module.h>
28     #include <linux/delay.h>
29     
30     /*
31      * Major improvements to the FM handling 30AUG92 by Rob Hooft,
32      * hooft@chem.ruu.nl
33      */
34     
35     #include "sound_config.h"
36     
37     #include "opl3.h"
38     #include "opl3_hw.h"
39     
40     #define MAX_VOICE	18
41     #define OFFS_4OP	11
42     
43     struct voice_info
44     {
45     	unsigned char   keyon_byte;
46     	long            bender;
47     	long            bender_range;
48     	unsigned long   orig_freq;
49     	unsigned long   current_freq;
50     	int             volume;
51     	int             mode;
52     	int             panning;	/* 0xffff means not set */
53     };
54     
55     typedef struct opl_devinfo
56     {
57     	int             base;
58     	int             left_io, right_io;
59     	int             nr_voice;
60     	int             lv_map[MAX_VOICE];
61     
62     	struct voice_info voc[MAX_VOICE];
63     	struct voice_alloc_info *v_alloc;
64     	struct channel_info *chn_info;
65     
66     	struct sbi_instrument i_map[SBFM_MAXINSTR];
67     	struct sbi_instrument *act_i[MAX_VOICE];
68     
69     	struct synth_info fm_info;
70     
71     	int             busy;
72     	int             model;
73     	unsigned char   cmask;
74     
75     	int             is_opl4;
76     	int            *osp;
77     } opl_devinfo;
78     
79     static struct opl_devinfo *devc = NULL;
80     
81     static int      detected_model;
82     
83     static int      store_instr(int instr_no, struct sbi_instrument *instr);
84     static void     freq_to_fnum(int freq, int *block, int *fnum);
85     static void     opl3_command(int io_addr, unsigned int addr, unsigned int val);
86     static int      opl3_kill_note(int dev, int voice, int note, int velocity);
87     
88     static void enter_4op_mode(void)
89     {
90     	int i;
91     	static int v4op[MAX_VOICE] = {
92     		0, 1, 2, 9, 10, 11, 6, 7, 8, 15, 16, 17
93     	};
94     
95     	devc->cmask = 0x3f;	/* Connect all possible 4 OP voice operators */
96     	opl3_command(devc->right_io, CONNECTION_SELECT_REGISTER, 0x3f);
97     
98     	for (i = 0; i < 3; i++)
99     		pv_map[i].voice_mode = 4;
100     	for (i = 3; i < 6; i++)
101     		pv_map[i].voice_mode = 0;
102     
103     	for (i = 9; i < 12; i++)
104     		pv_map[i].voice_mode = 4;
105     	for (i = 12; i < 15; i++)
106     		pv_map[i].voice_mode = 0;
107     
108     	for (i = 0; i < 12; i++)
109     		devc->lv_map[i] = v4op[i];
110     	devc->v_alloc->max_voice = devc->nr_voice = 12;
111     }
112     
113     static int opl3_ioctl(int dev, unsigned int cmd, caddr_t arg)
114     {
115     	struct sbi_instrument ins;
116     	
117     	switch (cmd) {
118     		case SNDCTL_FM_LOAD_INSTR:
119     			printk(KERN_WARNING "Warning: Obsolete ioctl(SNDCTL_FM_LOAD_INSTR) used. Fix the program.\n");
120     			if (copy_from_user(&ins, arg, sizeof(ins)))
121     				return -EFAULT;
122     			if (ins.channel < 0 || ins.channel >= SBFM_MAXINSTR) {
123     				printk(KERN_WARNING "FM Error: Invalid instrument number %d\n", ins.channel);
124     				return -EINVAL;
125     			}
126     			return store_instr(ins.channel, &ins);
127     
128     		case SNDCTL_SYNTH_INFO:
129     			devc->fm_info.nr_voices = (devc->nr_voice == 12) ? 6 : devc->nr_voice;
130     			if (copy_to_user(arg, &devc->fm_info, sizeof(devc->fm_info)))
131     				return -EFAULT;
132     			return 0;
133     
134     		case SNDCTL_SYNTH_MEMAVL:
135     			return 0x7fffffff;
136     
137     		case SNDCTL_FM_4OP_ENABLE:
138     			if (devc->model == 2)
139     				enter_4op_mode();
140     			return 0;
141     
142     		default:
143     			return -EINVAL;
144     	}
145     }
146     
147     int opl3_detect(int ioaddr, int *osp)
148     {
149     	/*
150     	 * This function returns 1 if the FM chip is present at the given I/O port
151     	 * The detection algorithm plays with the timer built in the FM chip and
152     	 * looks for a change in the status register.
153     	 *
154     	 * Note! The timers of the FM chip are not connected to AdLib (and compatible)
155     	 * boards.
156     	 *
157     	 * Note2! The chip is initialized if detected.
158     	 */
159     
160     	unsigned char stat1, signature;
161     	int i;
162     
163     	if (devc != NULL)
164     	{
165     		printk(KERN_ERR "opl3: Only one OPL3 supported.\n");
166     		return 0;
167     	}
168     
169     	devc = (struct opl_devinfo *)kmalloc(sizeof(*devc), GFP_KERNEL);
170     
171     	if (devc == NULL)
172     	{
173     		printk(KERN_ERR "opl3: Can't allocate memory for the device control "
174     			"structure \n ");
175     		return 0;
176     	}
177     
178     	memset(devc, 0, sizeof(*devc));
179     	strcpy(devc->fm_info.name, "OPL2");
180     
181     	if (!request_region(ioaddr, 4, devc->fm_info.name)) {
182     		printk(KERN_WARNING "opl3: I/O port 0x%x already in use\n", ioaddr);
183     		goto cleanup_devc;
184     	}
185     
186     	devc->osp = osp;
187     	devc->base = ioaddr;
188     
189     	/* Reset timers 1 and 2 */
190     	opl3_command(ioaddr, TIMER_CONTROL_REGISTER, TIMER1_MASK | TIMER2_MASK);
191     
192     	/* Reset the IRQ of the FM chip */
193     	opl3_command(ioaddr, TIMER_CONTROL_REGISTER, IRQ_RESET);
194     
195     	signature = stat1 = inb(ioaddr);	/* Status register */
196     
197     	if (signature != 0x00 && signature != 0x06 && signature != 0x02 &&
198     		signature != 0x0f)
199     	{
200     		MDB(printk(KERN_INFO "OPL3 not detected %x\n", signature));
201     		goto cleanup_region;
202     	}
203     
204     	if (signature == 0x06)		/* OPL2 */
205     	{
206     		detected_model = 2;
207     	}
208     	else if (signature == 0x00 || signature == 0x0f)	/* OPL3 or OPL4 */
209     	{
210     		unsigned char tmp;
211     
212     		detected_model = 3;
213     
214     		/*
215     		 * Detect availability of OPL4 (_experimental_). Works probably
216     		 * only after a cold boot. In addition the OPL4 port
217     		 * of the chip may not be connected to the PC bus at all.
218     		 */
219     
220     		opl3_command(ioaddr + 2, OPL3_MODE_REGISTER, 0x00);
221     		opl3_command(ioaddr + 2, OPL3_MODE_REGISTER, OPL3_ENABLE | OPL4_ENABLE);
222     
223     		if ((tmp = inb(ioaddr)) == 0x02)	/* Have a OPL4 */
224     		{
225     			detected_model = 4;
226     		}
227     
228     		if (request_region(ioaddr - 8, 2, "OPL4"))	/* OPL4 port was free */
229     		{
230     			int tmp;
231     
232     			outb((0x02), ioaddr - 8);	/* Select OPL4 ID register */
233     			udelay(10);
234     			tmp = inb(ioaddr - 7);		/* Read it */
235     			udelay(10);
236     
237     			if (tmp == 0x20)	/* OPL4 should return 0x20 here */
238     			{
239     				detected_model = 4;
240     				outb((0xF8), ioaddr - 8);	/* Select OPL4 FM mixer control */
241     				udelay(10);
242     				outb((0x1B), ioaddr - 7);	/* Write value */
243     				udelay(10);
244     			}
245     			else
246     			{ /* release OPL4 port */
247     				release_region(ioaddr - 8, 2);
248     				detected_model = 3;
249     			}
250     		}
251     		opl3_command(ioaddr + 2, OPL3_MODE_REGISTER, 0);
252     	}
253     	for (i = 0; i < 9; i++)
254     		opl3_command(ioaddr, KEYON_BLOCK + i, 0);	/*
255     								 * Note off
256     								 */
257     
258     	opl3_command(ioaddr, TEST_REGISTER, ENABLE_WAVE_SELECT);
259     	opl3_command(ioaddr, PERCOSSION_REGISTER, 0x00);	/*
260     								 * Melodic mode.
261     								 */
262     	return 1;
263     cleanup_region:
264     	release_region(ioaddr, 4);
265     cleanup_devc:
266     	kfree(devc);
267     	devc = NULL;
268     	return 0;
269     }
270     
271     static int opl3_kill_note  (int devno, int voice, int note, int velocity)
272     {
273     	 struct physical_voice_info *map;
274     
275     	 if (voice < 0 || voice >= devc->nr_voice)
276     		 return 0;
277     
278     	 devc->v_alloc->map[voice] = 0;
279     
280     	 map = &pv_map[devc->lv_map[voice]];
281     	 DEB(printk("Kill note %d\n", voice));
282     
283     	 if (map->voice_mode == 0)
284     		 return 0;
285     
286     	 opl3_command(map->ioaddr, KEYON_BLOCK + map->voice_num, devc->voc[voice].keyon_byte & ~0x20);
287     	 devc->voc[voice].keyon_byte = 0;
288     	 devc->voc[voice].bender = 0;
289     	 devc->voc[voice].volume = 64;
290     	 devc->voc[voice].panning = 0xffff;	/* Not set */
291     	 devc->voc[voice].bender_range = 200;
292     	 devc->voc[voice].orig_freq = 0;
293     	 devc->voc[voice].current_freq = 0;
294     	 devc->voc[voice].mode = 0;
295     	 return 0;
296     }
297     
298     #define HIHAT			0
299     #define CYMBAL			1
300     #define TOMTOM			2
301     #define SNARE			3
302     #define BDRUM			4
303     #define UNDEFINED		TOMTOM
304     #define DEFAULT			TOMTOM
305     
306     static int store_instr(int instr_no, struct sbi_instrument *instr)
307     {
308     	if (instr->key != FM_PATCH && (instr->key != OPL3_PATCH || devc->model != 2))
309     		printk(KERN_WARNING "FM warning: Invalid patch format field (key) 0x%x\n", instr->key);
310     	memcpy((char *) &(devc->i_map[instr_no]), (char *) instr, sizeof(*instr));
311     	return 0;
312     }
313     
314     static int opl3_set_instr  (int dev, int voice, int instr_no)
315     {
316     	if (voice < 0 || voice >= devc->nr_voice)
317     		return 0;
318     	if (instr_no < 0 || instr_no >= SBFM_MAXINSTR)
319     		instr_no = 0;	/* Acoustic piano (usually) */
320     
321     	devc->act_i[voice] = &devc->i_map[instr_no];
322     	return 0;
323     }
324     
325     /*
326      * The next table looks magical, but it certainly is not. Its values have
327      * been calculated as table[i]=8*log(i/64)/log(2) with an obvious exception
328      * for i=0. This log-table converts a linear volume-scaling (0..127) to a
329      * logarithmic scaling as present in the FM-synthesizer chips. so :    Volume
330      * 64 =  0 db = relative volume  0 and:    Volume 32 = -6 db = relative
331      * volume -8 it was implemented as a table because it is only 128 bytes and
332      * it saves a lot of log() calculations. (RH)
333      */
334     
335     static char fm_volume_table[128] =
336     {
337     	-64, -48, -40, -35, -32, -29, -27, -26,
338     	-24, -23, -21, -20, -19, -18, -18, -17,
339     	-16, -15, -15, -14, -13, -13, -12, -12,
340     	-11, -11, -10, -10, -10, -9, -9, -8,
341     	-8, -8, -7, -7, -7, -6, -6, -6,
342     	-5, -5, -5, -5, -4, -4, -4, -4,
343     	-3, -3, -3, -3, -2, -2, -2, -2,
344     	-2, -1, -1, -1, -1, 0, 0, 0,
345     	0, 0, 0, 1, 1, 1, 1, 1,
346     	1, 2, 2, 2, 2, 2, 2, 2,
347     	3, 3, 3, 3, 3, 3, 3, 4,
348     	4, 4, 4, 4, 4, 4, 4, 5,
349     	5, 5, 5, 5, 5, 5, 5, 5,
350     	6, 6, 6, 6, 6, 6, 6, 6,
351     	6, 7, 7, 7, 7, 7, 7, 7,
352     	7, 7, 7, 8, 8, 8, 8, 8
353     };
354     
355     static void calc_vol(unsigned char *regbyte, int volume, int main_vol)
356     {
357     	int level = (~*regbyte & 0x3f);
358     
359     	if (main_vol > 127)
360     		main_vol = 127;
361     	volume = (volume * main_vol) / 127;
362     
363     	if (level)
364     		level += fm_volume_table[volume];
365     
366     	if (level > 0x3f)
367     		level = 0x3f;
368     	if (level < 0)
369     		level = 0;
370     
371     	*regbyte = (*regbyte & 0xc0) | (~level & 0x3f);
372     }
373     
374     static void set_voice_volume(int voice, int volume, int main_vol)
375     {
376     	unsigned char vol1, vol2, vol3, vol4;
377     	struct sbi_instrument *instr;
378     	struct physical_voice_info *map;
379     
380     	if (voice < 0 || voice >= devc->nr_voice)
381     		return;
382     
383     	map = &pv_map[devc->lv_map[voice]];
384     	instr = devc->act_i[voice];
385     
386     	if (!instr)
387     		instr = &devc->i_map[0];
388     
389     	if (instr->channel < 0)
390     		return;
391     
392     	if (devc->voc[voice].mode == 0)
393     		return;
394     
395     	if (devc->voc[voice].mode == 2)
396     	{
397     		vol1 = instr->operators[2];
398     		vol2 = instr->operators[3];
399     		if ((instr->operators[10] & 0x01))
400     		{
401     			calc_vol(&vol1, volume, main_vol);
402     			calc_vol(&vol2, volume, main_vol);
403     		}
404     		else
405     		{
406     			calc_vol(&vol2, volume, main_vol);
407     		}
408     		opl3_command(map->ioaddr, KSL_LEVEL + map->op[0], vol1);
409     		opl3_command(map->ioaddr, KSL_LEVEL + map->op[1], vol2);
410     	}
411     	else
412     	{	/*
413     		 * 4 OP voice
414     		 */
415     		int connection;
416     
417     		vol1 = instr->operators[2];
418     		vol2 = instr->operators[3];
419     		vol3 = instr->operators[OFFS_4OP + 2];
420     		vol4 = instr->operators[OFFS_4OP + 3];
421     
422     		/*
423     		 * The connection method for 4 OP devc->voc is defined by the rightmost
424     		 * bits at the offsets 10 and 10+OFFS_4OP
425     		 */
426     
427     		connection = ((instr->operators[10] & 0x01) << 1) | (instr->operators[10 + OFFS_4OP] & 0x01);
428     
429     		switch (connection)
430     		{
431     			case 0:
432     				calc_vol(&vol4, volume, main_vol);
433     				break;
434     
435     			case 1:
436     				calc_vol(&vol2, volume, main_vol);
437     				calc_vol(&vol4, volume, main_vol);
438     				break;
439     
440     			case 2:
441     				calc_vol(&vol1, volume, main_vol);
442     				calc_vol(&vol4, volume, main_vol);
443     				break;
444     
445     			case 3:
446     				calc_vol(&vol1, volume, main_vol);
447     				calc_vol(&vol3, volume, main_vol);
448     				calc_vol(&vol4, volume, main_vol);
449     				break;
450     
451     			default:
452     				;
453     		}
454     		opl3_command(map->ioaddr, KSL_LEVEL + map->op[0], vol1);
455     		opl3_command(map->ioaddr, KSL_LEVEL + map->op[1], vol2);
456     		opl3_command(map->ioaddr, KSL_LEVEL + map->op[2], vol3);
457     		opl3_command(map->ioaddr, KSL_LEVEL + map->op[3], vol4);
458     	}
459     }
460     
461     static int opl3_start_note (int dev, int voice, int note, int volume)
462     {
463     	unsigned char data, fpc;
464     	int block, fnum, freq, voice_mode, pan;
465     	struct sbi_instrument *instr;
466     	struct physical_voice_info *map;
467     
468     	if (voice < 0 || voice >= devc->nr_voice)
469     		return 0;
470     
471     	map = &pv_map[devc->lv_map[voice]];
472     	pan = devc->voc[voice].panning;
473     
474     	if (map->voice_mode == 0)
475     		return 0;
476     
477     	if (note == 255)	/*
478     				 * Just change the volume
479     				 */
480     	{
481     		set_voice_volume(voice, volume, devc->voc[voice].volume);
482     		return 0;
483     	}
484     
485     	/*
486     	 * Kill previous note before playing
487     	 */
488     	
489     	opl3_command(map->ioaddr, KSL_LEVEL + map->op[1], 0xff);	/*
490     									 * Carrier
491     									 * volume to
492     									 * min
493     									 */
494     	opl3_command(map->ioaddr, KSL_LEVEL + map->op[0], 0xff);	/*
495     									 * Modulator
496     									 * volume to
497     									 */
498     
499     	if (map->voice_mode == 4)
500     	{
501     		opl3_command(map->ioaddr, KSL_LEVEL + map->op[2], 0xff);
502     		opl3_command(map->ioaddr, KSL_LEVEL + map->op[3], 0xff);
503     	}
504     
505     	opl3_command(map->ioaddr, KEYON_BLOCK + map->voice_num, 0x00);	/*
506     									 * Note
507     									 * off
508     									 */
509     
510     	instr = devc->act_i[voice];
511     	
512     	if (!instr)
513     		instr = &devc->i_map[0];
514     
515     	if (instr->channel < 0)
516     	{
517     		printk(KERN_WARNING "opl3: Initializing voice %d with undefined instrument\n", voice);
518     		return 0;
519     	}
520     
521     	if (map->voice_mode == 2 && instr->key == OPL3_PATCH)
522     		return 0;	/*
523     				 * Cannot play
524     				 */
525     
526     	voice_mode = map->voice_mode;
527     
528     	if (voice_mode == 4)
529     	{
530     		int voice_shift;
531     
532     		voice_shift = (map->ioaddr == devc->left_io) ? 0 : 3;
533     		voice_shift += map->voice_num;
534     
535     		if (instr->key != OPL3_PATCH)	/*
536     						 * Just 2 OP patch
537     						 */
538     		{
539     			voice_mode = 2;
540     			devc->cmask &= ~(1 << voice_shift);
541     		}
542     		else
543     		{
544     			devc->cmask |= (1 << voice_shift);
545     		}
546     
547     		opl3_command(devc->right_io, CONNECTION_SELECT_REGISTER, devc->cmask);
548     	}
549     
550     	/*
551     	 * Set Sound Characteristics
552     	 */
553     	
554     	opl3_command(map->ioaddr, AM_VIB + map->op[0], instr->operators[0]);
555     	opl3_command(map->ioaddr, AM_VIB + map->op[1], instr->operators[1]);
556     
557     	/*
558     	 * Set Attack/Decay
559     	 */
560     	
561     	opl3_command(map->ioaddr, ATTACK_DECAY + map->op[0], instr->operators[4]);
562     	opl3_command(map->ioaddr, ATTACK_DECAY + map->op[1], instr->operators[5]);
563     
564     	/*
565     	 * Set Sustain/Release
566     	 */
567     	
568     	opl3_command(map->ioaddr, SUSTAIN_RELEASE + map->op[0], instr->operators[6]);
569     	opl3_command(map->ioaddr, SUSTAIN_RELEASE + map->op[1], instr->operators[7]);
570     
571     	/*
572     	 * Set Wave Select
573     	 */
574     
575     	opl3_command(map->ioaddr, WAVE_SELECT + map->op[0], instr->operators[8]);
576     	opl3_command(map->ioaddr, WAVE_SELECT + map->op[1], instr->operators[9]);
577     
578     	/*
579     	 * Set Feedback/Connection
580     	 */
581     	
582     	fpc = instr->operators[10];
583     
584     	if (pan != 0xffff)
585     	{
586     		fpc &= ~STEREO_BITS;
587     		if (pan < -64)
588     			fpc |= VOICE_TO_LEFT;
589     		else
590     			if (pan > 64)
591     				fpc |= VOICE_TO_RIGHT;
592     			else
593     				fpc |= (VOICE_TO_LEFT | VOICE_TO_RIGHT);
594     	}
595     
596     	if (!(fpc & 0x30))
597     		fpc |= 0x30;	/*
598     				 * Ensure that at least one chn is enabled
599     				 */
600     	opl3_command(map->ioaddr, FEEDBACK_CONNECTION + map->voice_num, fpc);
601     
602     	/*
603     	 * If the voice is a 4 OP one, initialize the operators 3 and 4 also
604     	 */
605     
606     	if (voice_mode == 4)
607     	{
608     		/*
609     		 * Set Sound Characteristics
610     		 */
611     	
612     		opl3_command(map->ioaddr, AM_VIB + map->op[2], instr->operators[OFFS_4OP + 0]);
613     		opl3_command(map->ioaddr, AM_VIB + map->op[3], instr->operators[OFFS_4OP + 1]);
614     
615     		/*
616     		 * Set Attack/Decay
617     		 */
618     		
619     		opl3_command(map->ioaddr, ATTACK_DECAY + map->op[2], instr->operators[OFFS_4OP + 4]);
620     		opl3_command(map->ioaddr, ATTACK_DECAY + map->op[3], instr->operators[OFFS_4OP + 5]);
621     
622     		/*
623     		 * Set Sustain/Release
624     		 */
625     		
626     		opl3_command(map->ioaddr, SUSTAIN_RELEASE + map->op[2], instr->operators[OFFS_4OP + 6]);
627     		opl3_command(map->ioaddr, SUSTAIN_RELEASE + map->op[3], instr->operators[OFFS_4OP + 7]);
628     
629     		/*
630     		 * Set Wave Select
631     		 */
632     		
633     		opl3_command(map->ioaddr, WAVE_SELECT + map->op[2], instr->operators[OFFS_4OP + 8]);
634     		opl3_command(map->ioaddr, WAVE_SELECT + map->op[3], instr->operators[OFFS_4OP + 9]);
635     
636     		/*
637     		 * Set Feedback/Connection
638     		 */
639     		
640     		fpc = instr->operators[OFFS_4OP + 10];
641     		if (!(fpc & 0x30))
642     			 fpc |= 0x30;	/*
643     					 * Ensure that at least one chn is enabled
644     					 */
645     		opl3_command(map->ioaddr, FEEDBACK_CONNECTION + map->voice_num + 3, fpc);
646     	}
647     
648     	devc->voc[voice].mode = voice_mode;
649     	set_voice_volume(voice, volume, devc->voc[voice].volume);
650     
651     	freq = devc->voc[voice].orig_freq = note_to_freq(note) / 1000;
652     
653     	/*
654     	 * Since the pitch bender may have been set before playing the note, we
655     	 * have to calculate the bending now.
656     	 */
657     
658     	freq = compute_finetune(devc->voc[voice].orig_freq, devc->voc[voice].bender, devc->voc[voice].bender_range, 0);
659     	devc->voc[voice].current_freq = freq;
660     
661     	freq_to_fnum(freq, &block, &fnum);
662     
663     	/*
664     	 * Play note
665     	 */
666     
667     	data = fnum & 0xff;	/*
668     				 * Least significant bits of fnumber
669     				 */
670     	opl3_command(map->ioaddr, FNUM_LOW + map->voice_num, data);
671     
672     	data = 0x20 | ((block & 0x7) << 2) | ((fnum >> 8) & 0x3);
673     		 devc->voc[voice].keyon_byte = data;
674     	opl3_command(map->ioaddr, KEYON_BLOCK + map->voice_num, data);
675     	if (voice_mode == 4)
676     		opl3_command(map->ioaddr, KEYON_BLOCK + map->voice_num + 3, data);
677     
678     	return 0;
679     }
680     
681     static void freq_to_fnum    (int freq, int *block, int *fnum)
682     {
683     	int f, octave;
684     
685     	/*
686     	 * Converts the note frequency to block and fnum values for the FM chip
687     	 */
688     	/*
689     	 * First try to compute the block -value (octave) where the note belongs
690     	 */
691     
692     	f = freq;
693     
694     	octave = 5;
695     
696     	if (f == 0)
697     		octave = 0;
698     	else if (f < 261)
699     	{
700     		while (f < 261)
701     		{
702     			octave--;
703     			f <<= 1;
704     		}
705     	}
706     	else if (f > 493)
707     	{
708     		while (f > 493)
709     		{
710     			 octave++;
711     			 f >>= 1;
712     		}
713     	}
714     
715     	if (octave > 7)
716     		octave = 7;
717     
718     	*fnum = freq * (1 << (20 - octave)) / 49716;
719     	*block = octave;
720     }
721     
722     static void opl3_command    (int io_addr, unsigned int addr, unsigned int val)
723     {
724     	 int i;
725     
726     	/*
727     	 * The original 2-OP synth requires a quite long delay after writing to a
728     	 * register. The OPL-3 survives with just two INBs
729     	 */
730     
731     	outb(((unsigned char) (addr & 0xff)), io_addr);
732     
733     	if (devc->model != 2)
734     		udelay(10);
735     	else
736     		for (i = 0; i < 2; i++)
737     			inb(io_addr);
738     
739     	outb(((unsigned char) (val & 0xff)), io_addr + 1);
740     
741     	if (devc->model != 2)
742     		udelay(30);
743     	else
744     		for (i = 0; i < 2; i++)
745     			inb(io_addr);
746     }
747     
748     static void opl3_reset(int devno)
749     {
750     	int i;
751     
752     	for (i = 0; i < 18; i++)
753     		devc->lv_map[i] = i;
754     
755     	for (i = 0; i < devc->nr_voice; i++)
756     	{
757     		opl3_command(pv_map[devc->lv_map[i]].ioaddr,
758     			KSL_LEVEL + pv_map[devc->lv_map[i]].op[0], 0xff);
759     
760     		opl3_command(pv_map[devc->lv_map[i]].ioaddr,
761     			KSL_LEVEL + pv_map[devc->lv_map[i]].op[1], 0xff);
762     
763     		if (pv_map[devc->lv_map[i]].voice_mode == 4)
764     		{
765     			opl3_command(pv_map[devc->lv_map[i]].ioaddr,
766     				KSL_LEVEL + pv_map[devc->lv_map[i]].op[2], 0xff);
767     
768     			opl3_command(pv_map[devc->lv_map[i]].ioaddr,
769     				KSL_LEVEL + pv_map[devc->lv_map[i]].op[3], 0xff);
770     		}
771     
772     		opl3_kill_note(devno, i, 0, 64);
773     	}
774     
775     	if (devc->model == 2)
776     	{
777     		devc->v_alloc->max_voice = devc->nr_voice = 18;
778     
779     		for (i = 0; i < 18; i++)
780     			pv_map[i].voice_mode = 2;
781     
782     	}
783     }
784     
785     static int opl3_open(int dev, int mode)
786     {
787     	int i;
788     
789     	if (devc->busy)
790     		return -EBUSY;
791     	devc->busy = 1;
792     
793     	devc->v_alloc->max_voice = devc->nr_voice = (devc->model == 2) ? 18 : 9;
794     	devc->v_alloc->timestamp = 0;
795     
796     	for (i = 0; i < 18; i++)
797     	{
798     		devc->v_alloc->map[i] = 0;
799     		devc->v_alloc->alloc_times[i] = 0;
800     	}
801     
802     	devc->cmask = 0x00;	/*
803     				 * Just 2 OP mode
804     				 */
805     	if (devc->model == 2)
806     		opl3_command(devc->right_io, CONNECTION_SELECT_REGISTER, devc->cmask);
807     	return 0;
808     }
809     
810     static void opl3_close(int dev)
811     {
812     	devc->busy = 0;
813     	devc->v_alloc->max_voice = devc->nr_voice = (devc->model == 2) ? 18 : 9;
814     
815     	devc->fm_info.nr_drums = 0;
816     	devc->fm_info.perc_mode = 0;
817     
818     	opl3_reset(dev);
819     }
820     
821     static void opl3_hw_control(int dev, unsigned char *event)
822     {
823     }
824     
825     static int opl3_load_patch(int dev, int format, const char *addr,
826     		int offs, int count, int pmgr_flag)
827     {
828     	struct sbi_instrument ins;
829     
830     	if (count <sizeof(ins))
831     	{
832     		printk(KERN_WARNING "FM Error: Patch record too short\n");
833     		return -EINVAL;
834     	}
835     
836     	if(copy_from_user(&((char *) &ins)[offs], &(addr)[offs], sizeof(ins) - offs))
837     		return -EFAULT;
838     
839     	if (ins.channel < 0 || ins.channel >= SBFM_MAXINSTR)
840     	{
841     		printk(KERN_WARNING "FM Error: Invalid instrument number %d\n", ins.channel);
842     		return -EINVAL;
843     	}
844     	ins.key = format;
845     
846     	return store_instr(ins.channel, &ins);
847     }
848     
849     static void opl3_panning(int dev, int voice, int value)
850     {
851     	devc->voc[voice].panning = value;
852     }
853     
854     static void opl3_volume_method(int dev, int mode)
855     {
856     }
857     
858     #define SET_VIBRATO(cell) { \
859     	tmp = instr->operators[(cell-1)+(((cell-1)/2)*OFFS_4OP)]; \
860     	if (pressure > 110) \
861     		tmp |= 0x40;		/* Vibrato on */ \
862     	opl3_command (map->ioaddr, AM_VIB + map->op[cell-1], tmp);}
863     
864     static void opl3_aftertouch(int dev, int voice, int pressure)
865     {
866     	int tmp;
867     	struct sbi_instrument *instr;
868     	struct physical_voice_info *map;
869     
870     	if (voice < 0 || voice >= devc->nr_voice)
871     		return;
872     
873     	map = &pv_map[devc->lv_map[voice]];
874     
875     	DEB(printk("Aftertouch %d\n", voice));
876     
877     	if (map->voice_mode == 0)
878     		return;
879     
880     	/*
881     	 * Adjust the amount of vibrato depending the pressure
882     	 */
883     
884     	instr = devc->act_i[voice];
885     
886     	if (!instr)
887     		instr = &devc->i_map[0];
888     
889     	if (devc->voc[voice].mode == 4)
890     	{
891     		int connection = ((instr->operators[10] & 0x01) << 1) | (instr->operators[10 + OFFS_4OP] & 0x01);
892     
893     		switch (connection)
894     		{
895     			case 0:
896     				SET_VIBRATO(4);
897     				break;
898     
899     			case 1:
900     				SET_VIBRATO(2);
901     				SET_VIBRATO(4);
902     				break;
903     
904     			case 2:
905     				SET_VIBRATO(1);
906     				SET_VIBRATO(4);
907     				break;
908     
909     			case 3:
910     				SET_VIBRATO(1);
911     				SET_VIBRATO(3);
912     				SET_VIBRATO(4);
913     				break;
914     
915     		}
916     		/*
917     		 * Not implemented yet
918     		 */
919     	}
920     	else
921     	{
922     		SET_VIBRATO(1);
923     
924     		if ((instr->operators[10] & 0x01))	/*
925     							 * Additive synthesis
926     							 */
927     			SET_VIBRATO(2);
928     	}
929     }
930     
931     #undef SET_VIBRATO
932     
933     static void bend_pitch(int dev, int voice, int value)
934     {
935     	unsigned char data;
936     	int block, fnum, freq;
937     	struct physical_voice_info *map;
938     
939     	map = &pv_map[devc->lv_map[voice]];
940     
941     	if (map->voice_mode == 0)
942     		return;
943     
944     	devc->voc[voice].bender = value;
945     	if (!value)
946     		return;
947     	if (!(devc->voc[voice].keyon_byte & 0x20))
948     		return;	/*
949     			 * Not keyed on
950     			 */
951     
952     	freq = compute_finetune(devc->voc[voice].orig_freq, devc->voc[voice].bender, devc->voc[voice].bender_range, 0);
953     	devc->voc[voice].current_freq = freq;
954     
955     	freq_to_fnum(freq, &block, &fnum);
956     
957     	data = fnum & 0xff;	/*
958     				 * Least significant bits of fnumber
959     				 */
960     	opl3_command(map->ioaddr, FNUM_LOW + map->voice_num, data);
961     
962     	data = 0x20 | ((block & 0x7) << 2) | ((fnum >> 8) & 0x3);
963     	devc->voc[voice].keyon_byte = data;
964     	opl3_command(map->ioaddr, KEYON_BLOCK + map->voice_num, data);
965     }
966     
967     static void opl3_controller (int dev, int voice, int ctrl_num, int value)
968     {
969     	if (voice < 0 || voice >= devc->nr_voice)
970     		return;
971     
972     	switch (ctrl_num)
973     	{
974     		case CTRL_PITCH_BENDER:
975     			bend_pitch(dev, voice, value);
976     			break;
977     
978     		case CTRL_PITCH_BENDER_RANGE:
979     			devc->voc[voice].bender_range = value;
980     			break;
981     
982     		case CTL_MAIN_VOLUME:
983     			devc->voc[voice].volume = value / 128;
984     			break;
985     
986     		case CTL_PAN:
987     			devc->voc[voice].panning = (value * 2) - 128;
988     			break;
989     	}
990     }
991     
992     static void opl3_bender(int dev, int voice, int value)
993     {
994     	if (voice < 0 || voice >= devc->nr_voice)
995     		return;
996     
997     	bend_pitch(dev, voice, value - 8192);
998     }
999     
1000     static int opl3_alloc_voice(int dev, int chn, int note, struct voice_alloc_info *alloc)
1001     {
1002     	int i, p, best, first, avail, best_time = 0x7fffffff;
1003     	struct sbi_instrument *instr;
1004     	int is4op;
1005     	int instr_no;
1006     
1007     	if (chn < 0 || chn > 15)
1008     		instr_no = 0;
1009     	else
1010     		instr_no = devc->chn_info[chn].pgm_num;
1011     
1012     	instr = &devc->i_map[instr_no];
1013     	if (instr->channel < 0 ||	/* Instrument not loaded */
1014     		devc->nr_voice != 12)	/* Not in 4 OP mode */
1015     		is4op = 0;
1016     	else if (devc->nr_voice == 12)	/* 4 OP mode */
1017     		is4op = (instr->key == OPL3_PATCH);
1018     	else
1019     		is4op = 0;
1020     
1021     	if (is4op)
1022     	{
1023     		first = p = 0;
1024     		avail = 6;
1025     	}
1026     	else
1027     	{
1028     		if (devc->nr_voice == 12)	/* 4 OP mode. Use the '2 OP only' operators first */
1029     			first = p = 6;
1030     		else
1031     			first = p = 0;
1032     		avail = devc->nr_voice;
1033     	}
1034     
1035     	/*
1036     	 *    Now try to find a free voice
1037     	 */
1038     	best = first;
1039     
1040     	for (i = 0; i < avail; i++)
1041     	{
1042     		if (alloc->map[p] == 0)
1043     		{
1044     			return p;
1045     		}
1046     		if (alloc->alloc_times[p] < best_time)		/* Find oldest playing note */
1047     		{
1048     			best_time = alloc->alloc_times[p];
1049     			best = p;
1050     		}
1051     		p = (p + 1) % avail;
1052     	}
1053     
1054     	/*
1055     	 *    Insert some kind of priority mechanism here.
1056     	 */
1057     
1058     	if (best < 0)
1059     		best = 0;
1060     	if (best > devc->nr_voice)
1061     		best -= devc->nr_voice;
1062     
1063     	return best;	/* All devc->voc in use. Select the first one. */
1064     }
1065     
1066     static void opl3_setup_voice(int dev, int voice, int chn)
1067     {
1068     	struct channel_info *info =
1069     	&synth_devs[dev]->chn_info[chn];
1070     
1071     	opl3_set_instr(dev, voice, info->pgm_num);
1072     
1073     	devc->voc[voice].bender = 0;
1074     	devc->voc[voice].bender_range = info->bender_range;
1075     	devc->voc[voice].volume = info->controllers[CTL_MAIN_VOLUME];
1076     	devc->voc[voice].panning = (info->controllers[CTL_PAN] * 2) - 128;
1077     }
1078     
1079     static struct synth_operations opl3_operations =
1080     {
1081     	owner:		THIS_MODULE,
1082     	id:		"OPL",
1083     	info:		NULL,
1084     	midi_dev:	0,
1085     	synth_type:	SYNTH_TYPE_FM,
1086     	synth_subtype:	FM_TYPE_ADLIB,
1087     	open:		opl3_open,
1088     	close:		opl3_close,
1089     	ioctl:		opl3_ioctl,
1090     	kill_note:	opl3_kill_note,
1091     	start_note:	opl3_start_note,
1092     	set_instr:	opl3_set_instr,
1093     	reset:		opl3_reset,
1094     	hw_control:	opl3_hw_control,
1095     	load_patch:	opl3_load_patch,
1096     	aftertouch:	opl3_aftertouch,
1097     	controller:	opl3_controller,
1098     	panning:	opl3_panning,
1099     	volume_method:	opl3_volume_method,
1100     	bender:		opl3_bender,
1101     	alloc_voice:	opl3_alloc_voice,
1102     	setup_voice:	opl3_setup_voice
1103     };
1104     
1105     int opl3_init(int ioaddr, int *osp, struct module *owner)
1106     {
1107     	int i;
1108     	int me;
1109     
1110     	if (devc == NULL)
1111     	{
1112     		printk(KERN_ERR "opl3: Device control structure not initialized.\n");
1113     		return -1;
1114     	}
1115     
1116     	if ((me = sound_alloc_synthdev()) == -1)
1117     	{
1118     		printk(KERN_WARNING "opl3: Too many synthesizers\n");
1119     		return -1;
1120     	}
1121     
1122     	devc->nr_voice = 9;
1123     
1124     	devc->fm_info.device = 0;
1125     	devc->fm_info.synth_type = SYNTH_TYPE_FM;
1126     	devc->fm_info.synth_subtype = FM_TYPE_ADLIB;
1127     	devc->fm_info.perc_mode = 0;
1128     	devc->fm_info.nr_voices = 9;
1129     	devc->fm_info.nr_drums = 0;
1130     	devc->fm_info.instr_bank_size = SBFM_MAXINSTR;
1131     	devc->fm_info.capabilities = 0;
1132     	devc->left_io = ioaddr;
1133     	devc->right_io = ioaddr + 2;
1134     
1135     	if (detected_model <= 2)
1136     		devc->model = 1;
1137     	else
1138     	{
1139     		devc->model = 2;
1140     		if (detected_model == 4)
1141     			devc->is_opl4 = 1;
1142     	}
1143     
1144     	opl3_operations.info = &devc->fm_info;
1145     
1146     	synth_devs[me] = &opl3_operations;
1147     
1148     	if (owner)
1149     		synth_devs[me]->owner = owner;
1150     	
1151     	sequencer_init();
1152     	devc->v_alloc = &opl3_operations.alloc;
1153     	devc->chn_info = &opl3_operations.chn_info[0];
1154     
1155     	if (devc->model == 2)
1156     	{
1157     		if (devc->is_opl4) 
1158     			strcpy(devc->fm_info.name, "Yamaha OPL4/OPL3 FM");
1159     		else 
1160     			strcpy(devc->fm_info.name, "Yamaha OPL3");
1161     
1162     		devc->v_alloc->max_voice = devc->nr_voice = 18;
1163     		devc->fm_info.nr_drums = 0;
1164     		devc->fm_info.synth_subtype = FM_TYPE_OPL3;
1165     		devc->fm_info.capabilities |= SYNTH_CAP_OPL3;
1166     
1167     		for (i = 0; i < 18; i++)
1168     		{
1169     			if (pv_map[i].ioaddr == USE_LEFT)
1170     				pv_map[i].ioaddr = devc->left_io;
1171     			else
1172     				pv_map[i].ioaddr = devc->right_io;
1173     		}
1174     		opl3_command(devc->right_io, OPL3_MODE_REGISTER, OPL3_ENABLE);
1175     		opl3_command(devc->right_io, CONNECTION_SELECT_REGISTER, 0x00);
1176     	}
1177     	else
1178     	{
1179     		strcpy(devc->fm_info.name, "Yamaha OPL2");
1180     		devc->v_alloc->max_voice = devc->nr_voice = 9;
1181     		devc->fm_info.nr_drums = 0;
1182     
1183     		for (i = 0; i < 18; i++)
1184     			pv_map[i].ioaddr = devc->left_io;
1185     	};
1186     	conf_printf2(devc->fm_info.name, ioaddr, 0, -1, -1);
1187     
1188     	for (i = 0; i < SBFM_MAXINSTR; i++)
1189     		devc->i_map[i].channel = -1;
1190     
1191     	return me;
1192     }
1193     
1194     EXPORT_SYMBOL(opl3_init);
1195     EXPORT_SYMBOL(opl3_detect);
1196     
1197     static int me;
1198     
1199     static int io = -1;
1200     
1201     MODULE_PARM(io, "i");
1202     
1203     static int __init init_opl3 (void)
1204     {
1205     	printk(KERN_INFO "YM3812 and OPL-3 driver Copyright (C) by Hannu Savolainen, Rob Hooft 1993-1996\n");
1206     
1207     	if (io != -1)	/* User loading pure OPL3 module */
1208     	{
1209     		if (!opl3_detect(io, NULL))
1210     		{
1211     			return -ENODEV;
1212     		}
1213     
1214     		me = opl3_init(io, NULL, THIS_MODULE);
1215     	}
1216     
1217     	return 0;
1218     }
1219     
1220     static void __exit cleanup_opl3(void)
1221     {
1222     	if (devc && io != -1)
1223     	{
1224     		if (devc->base) {
1225     			release_region(devc->base,4);
1226     			if (devc->is_opl4)
1227     				release_region(devc->base - 8, 2);
1228     		}
1229     		kfree(devc);
1230     		devc = NULL;
1231     		sound_unload_synthdev(me);
1232     	}
1233     }
1234     
1235     module_init(init_opl3);
1236     module_exit(cleanup_opl3);
1237     
1238     #ifndef MODULE
1239     static int __init setup_opl3(char *str)
1240     {
1241             /* io  */
1242     	int ints[2];
1243     	
1244     	str = get_options(str, ARRAY_SIZE(ints), ints);
1245     	
1246     	io = ints[1];
1247     
1248     	return 1;
1249     }
1250     
1251     __setup("opl3=", setup_opl3);
1252     #endif
1253