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