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