Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/sound/oss/pss.c
10814 views
1
/*
2
* sound/oss/pss.c
3
*
4
* The low level driver for the Personal Sound System (ECHO ESC614).
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
* Thomas Sailer ioctl code reworked (vmalloc/vfree removed)
15
* Alan Cox modularisation, clean up.
16
*
17
* 98-02-21: Vladimir Michl <[email protected]>
18
* Added mixer device for Beethoven ADSP-16 (master volume,
19
* bass, treble, synth), only for speakers.
20
* Fixed bug in pss_write (exchange parameters)
21
* Fixed config port of SB
22
* Requested two regions for PSS (PSS mixer, PSS config)
23
* Modified pss_download_boot
24
* To probe_pss_mss added test for initialize AD1848
25
* 98-05-28: Vladimir Michl <[email protected]>
26
* Fixed computation of mixer volumes
27
* 04-05-1999: Anthony Barbachan <[email protected]>
28
* Added code that allows the user to enable his cdrom and/or
29
* joystick through the module parameters pss_cdrom_port and
30
* pss_enable_joystick. pss_cdrom_port takes a port address as its
31
* argument. pss_enable_joystick takes either a 0 or a non-0 as its
32
* argument.
33
* 04-06-1999: Anthony Barbachan <[email protected]>
34
* Separated some code into new functions for easier reuse.
35
* Cleaned up and streamlined new code. Added code to allow a user
36
* to only use this driver for enabling non-sound components
37
* through the new module parameter pss_no_sound (flag). Added
38
* code that would allow a user to decide whether the driver should
39
* reset the configured hardware settings for the PSS board through
40
* the module parameter pss_keep_settings (flag). This flag will
41
* allow a user to free up resources in use by this card if needbe,
42
* furthermore it allows him to use this driver to just enable the
43
* emulations and then be unloaded as it is no longer needed. Both
44
* new settings are only available to this driver if compiled as a
45
* module. The default settings of all new parameters are set to
46
* load the driver as it did in previous versions.
47
* 04-07-1999: Anthony Barbachan <[email protected]>
48
* Added module parameter pss_firmware to allow the user to tell
49
* the driver where the firmware file is located. The default
50
* setting is the previous hardcoded setting "/etc/sound/pss_synth".
51
* 00-03-03: Christoph Hellwig <[email protected]>
52
* Adapted to module_init/module_exit
53
* 11-10-2000: Bartlomiej Zolnierkiewicz <[email protected]>
54
* Added __init to probe_pss(), attach_pss() and probe_pss_mpu()
55
* 02-Jan-2001: Chris Rankin
56
* Specify that this module owns the coprocessor
57
*/
58
59
60
#include <linux/init.h>
61
#include <linux/module.h>
62
#include <linux/spinlock.h>
63
64
#include "sound_config.h"
65
#include "sound_firmware.h"
66
67
#include "ad1848.h"
68
#include "mpu401.h"
69
70
/*
71
* PSS registers.
72
*/
73
#define REG(x) (devc->base+x)
74
#define PSS_DATA 0
75
#define PSS_STATUS 2
76
#define PSS_CONTROL 2
77
#define PSS_ID 4
78
#define PSS_IRQACK 4
79
#define PSS_PIO 0x1a
80
81
/*
82
* Config registers
83
*/
84
#define CONF_PSS 0x10
85
#define CONF_WSS 0x12
86
#define CONF_SB 0x14
87
#define CONF_CDROM 0x16
88
#define CONF_MIDI 0x18
89
90
/*
91
* Status bits.
92
*/
93
#define PSS_FLAG3 0x0800
94
#define PSS_FLAG2 0x0400
95
#define PSS_FLAG1 0x1000
96
#define PSS_FLAG0 0x0800
97
#define PSS_WRITE_EMPTY 0x8000
98
#define PSS_READ_FULL 0x4000
99
100
/*
101
* WSS registers
102
*/
103
#define WSS_INDEX 4
104
#define WSS_DATA 5
105
106
/*
107
* WSS status bits
108
*/
109
#define WSS_INITIALIZING 0x80
110
#define WSS_AUTOCALIBRATION 0x20
111
112
#define NO_WSS_MIXER -1
113
114
#include "coproc.h"
115
116
#include "pss_boot.h"
117
118
/* If compiled into kernel, it enable or disable pss mixer */
119
#ifdef CONFIG_PSS_MIXER
120
static int pss_mixer = 1;
121
#else
122
static int pss_mixer;
123
#endif
124
125
126
typedef struct pss_mixerdata {
127
unsigned int volume_l;
128
unsigned int volume_r;
129
unsigned int bass;
130
unsigned int treble;
131
unsigned int synth;
132
} pss_mixerdata;
133
134
typedef struct pss_confdata {
135
int base;
136
int irq;
137
int dma;
138
int *osp;
139
pss_mixerdata mixer;
140
int ad_mixer_dev;
141
} pss_confdata;
142
143
static pss_confdata pss_data;
144
static pss_confdata *devc = &pss_data;
145
static DEFINE_SPINLOCK(lock);
146
147
static int pss_initialized;
148
static int nonstandard_microcode;
149
static int pss_cdrom_port = -1; /* Parameter for the PSS cdrom port */
150
static int pss_enable_joystick; /* Parameter for enabling the joystick */
151
static coproc_operations pss_coproc_operations;
152
153
static void pss_write(pss_confdata *devc, int data)
154
{
155
unsigned long i, limit;
156
157
limit = jiffies + HZ/10; /* The timeout is 0.1 seconds */
158
/*
159
* Note! the i<5000000 is an emergency exit. The dsp_command() is sometimes
160
* called while interrupts are disabled. This means that the timer is
161
* disabled also. However the timeout situation is a abnormal condition.
162
* Normally the DSP should be ready to accept commands after just couple of
163
* loops.
164
*/
165
166
for (i = 0; i < 5000000 && time_before(jiffies, limit); i++)
167
{
168
if (inw(REG(PSS_STATUS)) & PSS_WRITE_EMPTY)
169
{
170
outw(data, REG(PSS_DATA));
171
return;
172
}
173
}
174
printk(KERN_WARNING "PSS: DSP Command (%04x) Timeout.\n", data);
175
}
176
177
static int __init probe_pss(struct address_info *hw_config)
178
{
179
unsigned short id;
180
int irq, dma;
181
182
devc->base = hw_config->io_base;
183
irq = devc->irq = hw_config->irq;
184
dma = devc->dma = hw_config->dma;
185
devc->osp = hw_config->osp;
186
187
if (devc->base != 0x220 && devc->base != 0x240)
188
if (devc->base != 0x230 && devc->base != 0x250) /* Some cards use these */
189
return 0;
190
191
if (!request_region(devc->base, 0x10, "PSS mixer, SB emulation")) {
192
printk(KERN_ERR "PSS: I/O port conflict\n");
193
return 0;
194
}
195
id = inw(REG(PSS_ID));
196
if ((id >> 8) != 'E') {
197
printk(KERN_ERR "No PSS signature detected at 0x%x (0x%x)\n", devc->base, id);
198
release_region(devc->base, 0x10);
199
return 0;
200
}
201
if (!request_region(devc->base + 0x10, 0x9, "PSS config")) {
202
printk(KERN_ERR "PSS: I/O port conflict\n");
203
release_region(devc->base, 0x10);
204
return 0;
205
}
206
return 1;
207
}
208
209
static int set_irq(pss_confdata * devc, int dev, int irq)
210
{
211
static unsigned short irq_bits[16] =
212
{
213
0x0000, 0x0000, 0x0000, 0x0008,
214
0x0000, 0x0010, 0x0000, 0x0018,
215
0x0000, 0x0020, 0x0028, 0x0030,
216
0x0038, 0x0000, 0x0000, 0x0000
217
};
218
219
unsigned short tmp, bits;
220
221
if (irq < 0 || irq > 15)
222
return 0;
223
224
tmp = inw(REG(dev)) & ~0x38; /* Load confreg, mask IRQ bits out */
225
226
if ((bits = irq_bits[irq]) == 0 && irq != 0)
227
{
228
printk(KERN_ERR "PSS: Invalid IRQ %d\n", irq);
229
return 0;
230
}
231
outw(tmp | bits, REG(dev));
232
return 1;
233
}
234
235
static void set_io_base(pss_confdata * devc, int dev, int base)
236
{
237
unsigned short tmp = inw(REG(dev)) & 0x003f;
238
unsigned short bits = (base & 0x0ffc) << 4;
239
240
outw(bits | tmp, REG(dev));
241
}
242
243
static int set_dma(pss_confdata * devc, int dev, int dma)
244
{
245
static unsigned short dma_bits[8] =
246
{
247
0x0001, 0x0002, 0x0000, 0x0003,
248
0x0000, 0x0005, 0x0006, 0x0007
249
};
250
251
unsigned short tmp, bits;
252
253
if (dma < 0 || dma > 7)
254
return 0;
255
256
tmp = inw(REG(dev)) & ~0x07; /* Load confreg, mask DMA bits out */
257
258
if ((bits = dma_bits[dma]) == 0 && dma != 4)
259
{
260
printk(KERN_ERR "PSS: Invalid DMA %d\n", dma);
261
return 0;
262
}
263
outw(tmp | bits, REG(dev));
264
return 1;
265
}
266
267
static int pss_reset_dsp(pss_confdata * devc)
268
{
269
unsigned long i, limit = jiffies + HZ/10;
270
271
outw(0x2000, REG(PSS_CONTROL));
272
for (i = 0; i < 32768 && time_after_eq(limit, jiffies); i++)
273
inw(REG(PSS_CONTROL));
274
outw(0x0000, REG(PSS_CONTROL));
275
return 1;
276
}
277
278
static int pss_put_dspword(pss_confdata * devc, unsigned short word)
279
{
280
int i, val;
281
282
for (i = 0; i < 327680; i++)
283
{
284
val = inw(REG(PSS_STATUS));
285
if (val & PSS_WRITE_EMPTY)
286
{
287
outw(word, REG(PSS_DATA));
288
return 1;
289
}
290
}
291
return 0;
292
}
293
294
static int pss_get_dspword(pss_confdata * devc, unsigned short *word)
295
{
296
int i, val;
297
298
for (i = 0; i < 327680; i++)
299
{
300
val = inw(REG(PSS_STATUS));
301
if (val & PSS_READ_FULL)
302
{
303
*word = inw(REG(PSS_DATA));
304
return 1;
305
}
306
}
307
return 0;
308
}
309
310
static int pss_download_boot(pss_confdata * devc, unsigned char *block, int size, int flags)
311
{
312
int i, val, count;
313
unsigned long limit;
314
315
if (flags & CPF_FIRST)
316
{
317
/*_____ Warn DSP software that a boot is coming */
318
outw(0x00fe, REG(PSS_DATA));
319
320
limit = jiffies + HZ/10;
321
for (i = 0; i < 32768 && time_before(jiffies, limit); i++)
322
if (inw(REG(PSS_DATA)) == 0x5500)
323
break;
324
325
outw(*block++, REG(PSS_DATA));
326
pss_reset_dsp(devc);
327
}
328
count = 1;
329
while ((flags&CPF_LAST) || count<size )
330
{
331
int j;
332
333
for (j = 0; j < 327670; j++)
334
{
335
/*_____ Wait for BG to appear */
336
if (inw(REG(PSS_STATUS)) & PSS_FLAG3)
337
break;
338
}
339
340
if (j == 327670)
341
{
342
/* It's ok we timed out when the file was empty */
343
if (count >= size && flags & CPF_LAST)
344
break;
345
else
346
{
347
printk("\n");
348
printk(KERN_ERR "PSS: Download timeout problems, byte %d=%d\n", count, size);
349
return 0;
350
}
351
}
352
/*_____ Send the next byte */
353
if (count >= size)
354
{
355
/* If not data in block send 0xffff */
356
outw (0xffff, REG (PSS_DATA));
357
}
358
else
359
{
360
/*_____ Send the next byte */
361
outw (*block++, REG (PSS_DATA));
362
};
363
count++;
364
}
365
366
if (flags & CPF_LAST)
367
{
368
/*_____ Why */
369
outw(0, REG(PSS_DATA));
370
371
limit = jiffies + HZ/10;
372
for (i = 0; i < 32768 && time_after_eq(limit, jiffies); i++)
373
val = inw(REG(PSS_STATUS));
374
375
limit = jiffies + HZ/10;
376
for (i = 0; i < 32768 && time_after_eq(limit, jiffies); i++)
377
{
378
val = inw(REG(PSS_STATUS));
379
if (val & 0x4000)
380
break;
381
}
382
383
/* now read the version */
384
for (i = 0; i < 32000; i++)
385
{
386
val = inw(REG(PSS_STATUS));
387
if (val & PSS_READ_FULL)
388
break;
389
}
390
if (i == 32000)
391
return 0;
392
393
val = inw(REG(PSS_DATA));
394
/* printk( "<PSS: microcode version %d.%d loaded>", val/16, val % 16); */
395
}
396
return 1;
397
}
398
399
/* Mixer */
400
static void set_master_volume(pss_confdata *devc, int left, int right)
401
{
402
static unsigned char log_scale[101] = {
403
0xdb, 0xe0, 0xe3, 0xe5, 0xe7, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xed, 0xee,
404
0xef, 0xef, 0xf0, 0xf0, 0xf1, 0xf1, 0xf2, 0xf2, 0xf2, 0xf3, 0xf3, 0xf3,
405
0xf4, 0xf4, 0xf4, 0xf5, 0xf5, 0xf5, 0xf5, 0xf6, 0xf6, 0xf6, 0xf6, 0xf7,
406
0xf7, 0xf7, 0xf7, 0xf7, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf9, 0xf9, 0xf9,
407
0xf9, 0xf9, 0xf9, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfb, 0xfb,
408
0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc,
409
0xfc, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd,
410
0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
411
0xfe, 0xfe, 0xff, 0xff, 0xff
412
};
413
pss_write(devc, 0x0010);
414
pss_write(devc, log_scale[left] | 0x0000);
415
pss_write(devc, 0x0010);
416
pss_write(devc, log_scale[right] | 0x0100);
417
}
418
419
static void set_synth_volume(pss_confdata *devc, int volume)
420
{
421
int vol = ((0x8000*volume)/100L);
422
pss_write(devc, 0x0080);
423
pss_write(devc, vol);
424
pss_write(devc, 0x0081);
425
pss_write(devc, vol);
426
}
427
428
static void set_bass(pss_confdata *devc, int level)
429
{
430
int vol = (int)(((0xfd - 0xf0) * level)/100L) + 0xf0;
431
pss_write(devc, 0x0010);
432
pss_write(devc, vol | 0x0200);
433
};
434
435
static void set_treble(pss_confdata *devc, int level)
436
{
437
int vol = (((0xfd - 0xf0) * level)/100L) + 0xf0;
438
pss_write(devc, 0x0010);
439
pss_write(devc, vol | 0x0300);
440
};
441
442
static void pss_mixer_reset(pss_confdata *devc)
443
{
444
set_master_volume(devc, 33, 33);
445
set_bass(devc, 50);
446
set_treble(devc, 50);
447
set_synth_volume(devc, 30);
448
pss_write (devc, 0x0010);
449
pss_write (devc, 0x0800 | 0xce); /* Stereo */
450
451
if(pss_mixer)
452
{
453
devc->mixer.volume_l = devc->mixer.volume_r = 33;
454
devc->mixer.bass = 50;
455
devc->mixer.treble = 50;
456
devc->mixer.synth = 30;
457
}
458
}
459
460
static int set_volume_mono(unsigned __user *p, unsigned int *aleft)
461
{
462
unsigned int left, volume;
463
if (get_user(volume, p))
464
return -EFAULT;
465
466
left = volume & 0xff;
467
if (left > 100)
468
left = 100;
469
*aleft = left;
470
return 0;
471
}
472
473
static int set_volume_stereo(unsigned __user *p,
474
unsigned int *aleft,
475
unsigned int *aright)
476
{
477
unsigned int left, right, volume;
478
if (get_user(volume, p))
479
return -EFAULT;
480
481
left = volume & 0xff;
482
if (left > 100)
483
left = 100;
484
right = (volume >> 8) & 0xff;
485
if (right > 100)
486
right = 100;
487
*aleft = left;
488
*aright = right;
489
return 0;
490
}
491
492
static int ret_vol_mono(int left)
493
{
494
return ((left << 8) | left);
495
}
496
497
static int ret_vol_stereo(int left, int right)
498
{
499
return ((right << 8) | left);
500
}
501
502
static int call_ad_mixer(pss_confdata *devc,unsigned int cmd, void __user *arg)
503
{
504
if (devc->ad_mixer_dev != NO_WSS_MIXER)
505
return mixer_devs[devc->ad_mixer_dev]->ioctl(devc->ad_mixer_dev, cmd, arg);
506
else
507
return -EINVAL;
508
}
509
510
static int pss_mixer_ioctl (int dev, unsigned int cmd, void __user *arg)
511
{
512
pss_confdata *devc = mixer_devs[dev]->devc;
513
int cmdf = cmd & 0xff;
514
515
if ((cmdf != SOUND_MIXER_VOLUME) && (cmdf != SOUND_MIXER_BASS) &&
516
(cmdf != SOUND_MIXER_TREBLE) && (cmdf != SOUND_MIXER_SYNTH) &&
517
(cmdf != SOUND_MIXER_DEVMASK) && (cmdf != SOUND_MIXER_STEREODEVS) &&
518
(cmdf != SOUND_MIXER_RECMASK) && (cmdf != SOUND_MIXER_CAPS) &&
519
(cmdf != SOUND_MIXER_RECSRC))
520
{
521
return call_ad_mixer(devc, cmd, arg);
522
}
523
524
if (((cmd >> 8) & 0xff) != 'M')
525
return -EINVAL;
526
527
if (_SIOC_DIR (cmd) & _SIOC_WRITE)
528
{
529
switch (cmdf)
530
{
531
case SOUND_MIXER_RECSRC:
532
if (devc->ad_mixer_dev != NO_WSS_MIXER)
533
return call_ad_mixer(devc, cmd, arg);
534
else
535
{
536
int v;
537
if (get_user(v, (int __user *)arg))
538
return -EFAULT;
539
if (v != 0)
540
return -EINVAL;
541
return 0;
542
}
543
case SOUND_MIXER_VOLUME:
544
if (set_volume_stereo(arg,
545
&devc->mixer.volume_l,
546
&devc->mixer.volume_r))
547
return -EFAULT;
548
set_master_volume(devc, devc->mixer.volume_l,
549
devc->mixer.volume_r);
550
return ret_vol_stereo(devc->mixer.volume_l,
551
devc->mixer.volume_r);
552
553
case SOUND_MIXER_BASS:
554
if (set_volume_mono(arg, &devc->mixer.bass))
555
return -EFAULT;
556
set_bass(devc, devc->mixer.bass);
557
return ret_vol_mono(devc->mixer.bass);
558
559
case SOUND_MIXER_TREBLE:
560
if (set_volume_mono(arg, &devc->mixer.treble))
561
return -EFAULT;
562
set_treble(devc, devc->mixer.treble);
563
return ret_vol_mono(devc->mixer.treble);
564
565
case SOUND_MIXER_SYNTH:
566
if (set_volume_mono(arg, &devc->mixer.synth))
567
return -EFAULT;
568
set_synth_volume(devc, devc->mixer.synth);
569
return ret_vol_mono(devc->mixer.synth);
570
571
default:
572
return -EINVAL;
573
}
574
}
575
else
576
{
577
int val, and_mask = 0, or_mask = 0;
578
/*
579
* Return parameters
580
*/
581
switch (cmdf)
582
{
583
case SOUND_MIXER_DEVMASK:
584
if (call_ad_mixer(devc, cmd, arg) == -EINVAL)
585
break;
586
and_mask = ~0;
587
or_mask = SOUND_MASK_VOLUME | SOUND_MASK_BASS | SOUND_MASK_TREBLE | SOUND_MASK_SYNTH;
588
break;
589
590
case SOUND_MIXER_STEREODEVS:
591
if (call_ad_mixer(devc, cmd, arg) == -EINVAL)
592
break;
593
and_mask = ~0;
594
or_mask = SOUND_MASK_VOLUME;
595
break;
596
597
case SOUND_MIXER_RECMASK:
598
if (devc->ad_mixer_dev != NO_WSS_MIXER)
599
return call_ad_mixer(devc, cmd, arg);
600
break;
601
602
case SOUND_MIXER_CAPS:
603
if (devc->ad_mixer_dev != NO_WSS_MIXER)
604
return call_ad_mixer(devc, cmd, arg);
605
or_mask = SOUND_CAP_EXCL_INPUT;
606
break;
607
608
case SOUND_MIXER_RECSRC:
609
if (devc->ad_mixer_dev != NO_WSS_MIXER)
610
return call_ad_mixer(devc, cmd, arg);
611
break;
612
613
case SOUND_MIXER_VOLUME:
614
or_mask = ret_vol_stereo(devc->mixer.volume_l, devc->mixer.volume_r);
615
break;
616
617
case SOUND_MIXER_BASS:
618
or_mask = ret_vol_mono(devc->mixer.bass);
619
break;
620
621
case SOUND_MIXER_TREBLE:
622
or_mask = ret_vol_mono(devc->mixer.treble);
623
break;
624
625
case SOUND_MIXER_SYNTH:
626
or_mask = ret_vol_mono(devc->mixer.synth);
627
break;
628
default:
629
return -EINVAL;
630
}
631
if (get_user(val, (int __user *)arg))
632
return -EFAULT;
633
val &= and_mask;
634
val |= or_mask;
635
if (put_user(val, (int __user *)arg))
636
return -EFAULT;
637
return val;
638
}
639
}
640
641
static struct mixer_operations pss_mixer_operations =
642
{
643
.owner = THIS_MODULE,
644
.id = "SOUNDPORT",
645
.name = "PSS-AD1848",
646
.ioctl = pss_mixer_ioctl
647
};
648
649
static void disable_all_emulations(void)
650
{
651
outw(0x0000, REG(CONF_PSS)); /* 0x0400 enables joystick */
652
outw(0x0000, REG(CONF_WSS));
653
outw(0x0000, REG(CONF_SB));
654
outw(0x0000, REG(CONF_MIDI));
655
outw(0x0000, REG(CONF_CDROM));
656
}
657
658
static void configure_nonsound_components(void)
659
{
660
/* Configure Joystick port */
661
662
if(pss_enable_joystick)
663
{
664
outw(0x0400, REG(CONF_PSS)); /* 0x0400 enables joystick */
665
printk(KERN_INFO "PSS: joystick enabled.\n");
666
}
667
else
668
{
669
printk(KERN_INFO "PSS: joystick port not enabled.\n");
670
}
671
672
/* Configure CDROM port */
673
674
if (pss_cdrom_port == -1) { /* If cdrom port enablation wasn't requested */
675
printk(KERN_INFO "PSS: CDROM port not enabled.\n");
676
} else if (check_region(pss_cdrom_port, 2)) {
677
printk(KERN_ERR "PSS: CDROM I/O port conflict.\n");
678
} else {
679
set_io_base(devc, CONF_CDROM, pss_cdrom_port);
680
printk(KERN_INFO "PSS: CDROM I/O port set to 0x%x.\n", pss_cdrom_port);
681
}
682
}
683
684
static int __init attach_pss(struct address_info *hw_config)
685
{
686
unsigned short id;
687
char tmp[100];
688
689
devc->base = hw_config->io_base;
690
devc->irq = hw_config->irq;
691
devc->dma = hw_config->dma;
692
devc->osp = hw_config->osp;
693
devc->ad_mixer_dev = NO_WSS_MIXER;
694
695
if (!probe_pss(hw_config))
696
return 0;
697
698
id = inw(REG(PSS_ID)) & 0x00ff;
699
700
/*
701
* Disable all emulations. Will be enabled later (if required).
702
*/
703
704
disable_all_emulations();
705
706
#ifdef YOU_REALLY_WANT_TO_ALLOCATE_THESE_RESOURCES
707
if (sound_alloc_dma(hw_config->dma, "PSS"))
708
{
709
printk("pss.c: Can't allocate DMA channel.\n");
710
release_region(hw_config->io_base, 0x10);
711
release_region(hw_config->io_base+0x10, 0x9);
712
return 0;
713
}
714
if (!set_irq(devc, CONF_PSS, devc->irq))
715
{
716
printk("PSS: IRQ allocation error.\n");
717
release_region(hw_config->io_base, 0x10);
718
release_region(hw_config->io_base+0x10, 0x9);
719
return 0;
720
}
721
if (!set_dma(devc, CONF_PSS, devc->dma))
722
{
723
printk(KERN_ERR "PSS: DMA allocation error\n");
724
release_region(hw_config->io_base, 0x10);
725
release_region(hw_config->io_base+0x10, 0x9);
726
return 0;
727
}
728
#endif
729
730
configure_nonsound_components();
731
pss_initialized = 1;
732
sprintf(tmp, "ECHO-PSS Rev. %d", id);
733
conf_printf(tmp, hw_config);
734
return 1;
735
}
736
737
static int __init probe_pss_mpu(struct address_info *hw_config)
738
{
739
struct resource *ports;
740
int timeout;
741
742
if (!pss_initialized)
743
return 0;
744
745
ports = request_region(hw_config->io_base, 2, "mpu401");
746
747
if (!ports) {
748
printk(KERN_ERR "PSS: MPU I/O port conflict\n");
749
return 0;
750
}
751
set_io_base(devc, CONF_MIDI, hw_config->io_base);
752
if (!set_irq(devc, CONF_MIDI, hw_config->irq)) {
753
printk(KERN_ERR "PSS: MIDI IRQ allocation error.\n");
754
goto fail;
755
}
756
if (!pss_synthLen) {
757
printk(KERN_ERR "PSS: Can't enable MPU. MIDI synth microcode not available.\n");
758
goto fail;
759
}
760
if (!pss_download_boot(devc, pss_synth, pss_synthLen, CPF_FIRST | CPF_LAST)) {
761
printk(KERN_ERR "PSS: Unable to load MIDI synth microcode to DSP.\n");
762
goto fail;
763
}
764
765
/*
766
* Finally wait until the DSP algorithm has initialized itself and
767
* deactivates receive interrupt.
768
*/
769
770
for (timeout = 900000; timeout > 0; timeout--)
771
{
772
if ((inb(hw_config->io_base + 1) & 0x80) == 0) /* Input data avail */
773
inb(hw_config->io_base); /* Discard it */
774
else
775
break; /* No more input */
776
}
777
778
if (!probe_mpu401(hw_config, ports))
779
goto fail;
780
781
attach_mpu401(hw_config, THIS_MODULE); /* Slot 1 */
782
if (hw_config->slots[1] != -1) /* The MPU driver installed itself */
783
midi_devs[hw_config->slots[1]]->coproc = &pss_coproc_operations;
784
return 1;
785
fail:
786
release_region(hw_config->io_base, 2);
787
return 0;
788
}
789
790
static int pss_coproc_open(void *dev_info, int sub_device)
791
{
792
switch (sub_device)
793
{
794
case COPR_MIDI:
795
if (pss_synthLen == 0)
796
{
797
printk(KERN_ERR "PSS: MIDI synth microcode not available.\n");
798
return -EIO;
799
}
800
if (nonstandard_microcode)
801
if (!pss_download_boot(devc, pss_synth, pss_synthLen, CPF_FIRST | CPF_LAST))
802
{
803
printk(KERN_ERR "PSS: Unable to load MIDI synth microcode to DSP.\n");
804
return -EIO;
805
}
806
nonstandard_microcode = 0;
807
break;
808
809
default:
810
break;
811
}
812
return 0;
813
}
814
815
static void pss_coproc_close(void *dev_info, int sub_device)
816
{
817
return;
818
}
819
820
static void pss_coproc_reset(void *dev_info)
821
{
822
if (pss_synthLen)
823
if (!pss_download_boot(devc, pss_synth, pss_synthLen, CPF_FIRST | CPF_LAST))
824
{
825
printk(KERN_ERR "PSS: Unable to load MIDI synth microcode to DSP.\n");
826
}
827
nonstandard_microcode = 0;
828
}
829
830
static int download_boot_block(void *dev_info, copr_buffer * buf)
831
{
832
if (buf->len <= 0 || buf->len > sizeof(buf->data))
833
return -EINVAL;
834
835
if (!pss_download_boot(devc, buf->data, buf->len, buf->flags))
836
{
837
printk(KERN_ERR "PSS: Unable to load microcode block to DSP.\n");
838
return -EIO;
839
}
840
nonstandard_microcode = 1; /* The MIDI microcode has been overwritten */
841
return 0;
842
}
843
844
static int pss_coproc_ioctl(void *dev_info, unsigned int cmd, void __user *arg, int local)
845
{
846
copr_buffer *buf;
847
copr_msg *mbuf;
848
copr_debug_buf dbuf;
849
unsigned short tmp;
850
unsigned long flags;
851
unsigned short *data;
852
int i, err;
853
/* printk( "PSS coproc ioctl %x %x %d\n", cmd, arg, local); */
854
855
switch (cmd)
856
{
857
case SNDCTL_COPR_RESET:
858
pss_coproc_reset(dev_info);
859
return 0;
860
861
case SNDCTL_COPR_LOAD:
862
buf = vmalloc(sizeof(copr_buffer));
863
if (buf == NULL)
864
return -ENOSPC;
865
if (copy_from_user(buf, arg, sizeof(copr_buffer))) {
866
vfree(buf);
867
return -EFAULT;
868
}
869
err = download_boot_block(dev_info, buf);
870
vfree(buf);
871
return err;
872
873
case SNDCTL_COPR_SENDMSG:
874
mbuf = vmalloc(sizeof(copr_msg));
875
if (mbuf == NULL)
876
return -ENOSPC;
877
if (copy_from_user(mbuf, arg, sizeof(copr_msg))) {
878
vfree(mbuf);
879
return -EFAULT;
880
}
881
data = (unsigned short *)(mbuf->data);
882
spin_lock_irqsave(&lock, flags);
883
for (i = 0; i < mbuf->len; i++) {
884
if (!pss_put_dspword(devc, *data++)) {
885
spin_unlock_irqrestore(&lock,flags);
886
mbuf->len = i; /* feed back number of WORDs sent */
887
err = copy_to_user(arg, mbuf, sizeof(copr_msg));
888
vfree(mbuf);
889
return err ? -EFAULT : -EIO;
890
}
891
}
892
spin_unlock_irqrestore(&lock,flags);
893
vfree(mbuf);
894
return 0;
895
896
case SNDCTL_COPR_RCVMSG:
897
err = 0;
898
mbuf = vmalloc(sizeof(copr_msg));
899
if (mbuf == NULL)
900
return -ENOSPC;
901
data = (unsigned short *)mbuf->data;
902
spin_lock_irqsave(&lock, flags);
903
for (i = 0; i < sizeof(mbuf->data)/sizeof(unsigned short); i++) {
904
mbuf->len = i; /* feed back number of WORDs read */
905
if (!pss_get_dspword(devc, data++)) {
906
if (i == 0)
907
err = -EIO;
908
break;
909
}
910
}
911
spin_unlock_irqrestore(&lock,flags);
912
if (copy_to_user(arg, mbuf, sizeof(copr_msg)))
913
err = -EFAULT;
914
vfree(mbuf);
915
return err;
916
917
case SNDCTL_COPR_RDATA:
918
if (copy_from_user(&dbuf, arg, sizeof(dbuf)))
919
return -EFAULT;
920
spin_lock_irqsave(&lock, flags);
921
if (!pss_put_dspword(devc, 0x00d0)) {
922
spin_unlock_irqrestore(&lock,flags);
923
return -EIO;
924
}
925
if (!pss_put_dspword(devc, (unsigned short)(dbuf.parm1 & 0xffff))) {
926
spin_unlock_irqrestore(&lock,flags);
927
return -EIO;
928
}
929
if (!pss_get_dspword(devc, &tmp)) {
930
spin_unlock_irqrestore(&lock,flags);
931
return -EIO;
932
}
933
dbuf.parm1 = tmp;
934
spin_unlock_irqrestore(&lock,flags);
935
if (copy_to_user(arg, &dbuf, sizeof(dbuf)))
936
return -EFAULT;
937
return 0;
938
939
case SNDCTL_COPR_WDATA:
940
if (copy_from_user(&dbuf, arg, sizeof(dbuf)))
941
return -EFAULT;
942
spin_lock_irqsave(&lock, flags);
943
if (!pss_put_dspword(devc, 0x00d1)) {
944
spin_unlock_irqrestore(&lock,flags);
945
return -EIO;
946
}
947
if (!pss_put_dspword(devc, (unsigned short) (dbuf.parm1 & 0xffff))) {
948
spin_unlock_irqrestore(&lock,flags);
949
return -EIO;
950
}
951
tmp = (unsigned int)dbuf.parm2 & 0xffff;
952
if (!pss_put_dspword(devc, tmp)) {
953
spin_unlock_irqrestore(&lock,flags);
954
return -EIO;
955
}
956
spin_unlock_irqrestore(&lock,flags);
957
return 0;
958
959
case SNDCTL_COPR_WCODE:
960
if (copy_from_user(&dbuf, arg, sizeof(dbuf)))
961
return -EFAULT;
962
spin_lock_irqsave(&lock, flags);
963
if (!pss_put_dspword(devc, 0x00d3)) {
964
spin_unlock_irqrestore(&lock,flags);
965
return -EIO;
966
}
967
if (!pss_put_dspword(devc, (unsigned short)(dbuf.parm1 & 0xffff))) {
968
spin_unlock_irqrestore(&lock,flags);
969
return -EIO;
970
}
971
tmp = (unsigned int)dbuf.parm2 & 0x00ff;
972
if (!pss_put_dspword(devc, tmp)) {
973
spin_unlock_irqrestore(&lock,flags);
974
return -EIO;
975
}
976
tmp = ((unsigned int)dbuf.parm2 >> 8) & 0xffff;
977
if (!pss_put_dspword(devc, tmp)) {
978
spin_unlock_irqrestore(&lock,flags);
979
return -EIO;
980
}
981
spin_unlock_irqrestore(&lock,flags);
982
return 0;
983
984
case SNDCTL_COPR_RCODE:
985
if (copy_from_user(&dbuf, arg, sizeof(dbuf)))
986
return -EFAULT;
987
spin_lock_irqsave(&lock, flags);
988
if (!pss_put_dspword(devc, 0x00d2)) {
989
spin_unlock_irqrestore(&lock,flags);
990
return -EIO;
991
}
992
if (!pss_put_dspword(devc, (unsigned short)(dbuf.parm1 & 0xffff))) {
993
spin_unlock_irqrestore(&lock,flags);
994
return -EIO;
995
}
996
if (!pss_get_dspword(devc, &tmp)) { /* Read MSB */
997
spin_unlock_irqrestore(&lock,flags);
998
return -EIO;
999
}
1000
dbuf.parm1 = tmp << 8;
1001
if (!pss_get_dspword(devc, &tmp)) { /* Read LSB */
1002
spin_unlock_irqrestore(&lock,flags);
1003
return -EIO;
1004
}
1005
dbuf.parm1 |= tmp & 0x00ff;
1006
spin_unlock_irqrestore(&lock,flags);
1007
if (copy_to_user(arg, &dbuf, sizeof(dbuf)))
1008
return -EFAULT;
1009
return 0;
1010
1011
default:
1012
return -EINVAL;
1013
}
1014
return -EINVAL;
1015
}
1016
1017
static coproc_operations pss_coproc_operations =
1018
{
1019
"ADSP-2115",
1020
THIS_MODULE,
1021
pss_coproc_open,
1022
pss_coproc_close,
1023
pss_coproc_ioctl,
1024
pss_coproc_reset,
1025
&pss_data
1026
};
1027
1028
static int __init probe_pss_mss(struct address_info *hw_config)
1029
{
1030
volatile int timeout;
1031
struct resource *ports;
1032
int my_mix = -999; /* gcc shut up */
1033
1034
if (!pss_initialized)
1035
return 0;
1036
1037
if (!request_region(hw_config->io_base, 4, "WSS config")) {
1038
printk(KERN_ERR "PSS: WSS I/O port conflicts.\n");
1039
return 0;
1040
}
1041
ports = request_region(hw_config->io_base + 4, 4, "ad1848");
1042
if (!ports) {
1043
printk(KERN_ERR "PSS: WSS I/O port conflicts.\n");
1044
release_region(hw_config->io_base, 4);
1045
return 0;
1046
}
1047
set_io_base(devc, CONF_WSS, hw_config->io_base);
1048
if (!set_irq(devc, CONF_WSS, hw_config->irq)) {
1049
printk("PSS: WSS IRQ allocation error.\n");
1050
goto fail;
1051
}
1052
if (!set_dma(devc, CONF_WSS, hw_config->dma)) {
1053
printk(KERN_ERR "PSS: WSS DMA allocation error\n");
1054
goto fail;
1055
}
1056
/*
1057
* For some reason the card returns 0xff in the WSS status register
1058
* immediately after boot. Probably MIDI+SB emulation algorithm
1059
* downloaded to the ADSP2115 spends some time initializing the card.
1060
* Let's try to wait until it finishes this task.
1061
*/
1062
for (timeout = 0; timeout < 100000 && (inb(hw_config->io_base + WSS_INDEX) &
1063
WSS_INITIALIZING); timeout++)
1064
;
1065
1066
outb((0x0b), hw_config->io_base + WSS_INDEX); /* Required by some cards */
1067
1068
for (timeout = 0; (inb(hw_config->io_base + WSS_DATA) & WSS_AUTOCALIBRATION) &&
1069
(timeout < 100000); timeout++)
1070
;
1071
1072
if (!probe_ms_sound(hw_config, ports))
1073
goto fail;
1074
1075
devc->ad_mixer_dev = NO_WSS_MIXER;
1076
if (pss_mixer)
1077
{
1078
if ((my_mix = sound_install_mixer (MIXER_DRIVER_VERSION,
1079
"PSS-SPEAKERS and AD1848 (through MSS audio codec)",
1080
&pss_mixer_operations,
1081
sizeof (struct mixer_operations),
1082
devc)) < 0)
1083
{
1084
printk(KERN_ERR "Could not install PSS mixer\n");
1085
goto fail;
1086
}
1087
}
1088
pss_mixer_reset(devc);
1089
attach_ms_sound(hw_config, ports, THIS_MODULE); /* Slot 0 */
1090
1091
if (hw_config->slots[0] != -1)
1092
{
1093
/* The MSS driver installed itself */
1094
audio_devs[hw_config->slots[0]]->coproc = &pss_coproc_operations;
1095
if (pss_mixer && (num_mixers == (my_mix + 2)))
1096
{
1097
/* The MSS mixer installed */
1098
devc->ad_mixer_dev = audio_devs[hw_config->slots[0]]->mixer_dev;
1099
}
1100
}
1101
return 1;
1102
fail:
1103
release_region(hw_config->io_base + 4, 4);
1104
release_region(hw_config->io_base, 4);
1105
return 0;
1106
}
1107
1108
static inline void __exit unload_pss(struct address_info *hw_config)
1109
{
1110
release_region(hw_config->io_base, 0x10);
1111
release_region(hw_config->io_base+0x10, 0x9);
1112
}
1113
1114
static inline void __exit unload_pss_mpu(struct address_info *hw_config)
1115
{
1116
unload_mpu401(hw_config);
1117
}
1118
1119
static inline void __exit unload_pss_mss(struct address_info *hw_config)
1120
{
1121
unload_ms_sound(hw_config);
1122
}
1123
1124
1125
static struct address_info cfg;
1126
static struct address_info cfg2;
1127
static struct address_info cfg_mpu;
1128
1129
static int pss_io __initdata = -1;
1130
static int mss_io __initdata = -1;
1131
static int mss_irq __initdata = -1;
1132
static int mss_dma __initdata = -1;
1133
static int mpu_io __initdata = -1;
1134
static int mpu_irq __initdata = -1;
1135
static int pss_no_sound = 0; /* Just configure non-sound components */
1136
static int pss_keep_settings = 1; /* Keep hardware settings at module exit */
1137
static char *pss_firmware = "/etc/sound/pss_synth";
1138
1139
module_param(pss_io, int, 0);
1140
MODULE_PARM_DESC(pss_io, "Set i/o base of PSS card (probably 0x220 or 0x240)");
1141
module_param(mss_io, int, 0);
1142
MODULE_PARM_DESC(mss_io, "Set WSS (audio) i/o base (0x530, 0x604, 0xE80, 0xF40, or other. Address must end in 0 or 4 and must be from 0x100 to 0xFF4)");
1143
module_param(mss_irq, int, 0);
1144
MODULE_PARM_DESC(mss_irq, "Set WSS (audio) IRQ (3, 5, 7, 9, 10, 11, 12)");
1145
module_param(mss_dma, int, 0);
1146
MODULE_PARM_DESC(mss_dma, "Set WSS (audio) DMA (0, 1, 3)");
1147
module_param(mpu_io, int, 0);
1148
MODULE_PARM_DESC(mpu_io, "Set MIDI i/o base (0x330 or other. Address must be on 4 location boundaries and must be from 0x100 to 0xFFC)");
1149
module_param(mpu_irq, int, 0);
1150
MODULE_PARM_DESC(mpu_irq, "Set MIDI IRQ (3, 5, 7, 9, 10, 11, 12)");
1151
module_param(pss_cdrom_port, int, 0);
1152
MODULE_PARM_DESC(pss_cdrom_port, "Set the PSS CDROM port i/o base (0x340 or other)");
1153
module_param(pss_enable_joystick, bool, 0);
1154
MODULE_PARM_DESC(pss_enable_joystick, "Enables the PSS joystick port (1 to enable, 0 to disable)");
1155
module_param(pss_no_sound, bool, 0);
1156
MODULE_PARM_DESC(pss_no_sound, "Configure sound compoents (0 - no, 1 - yes)");
1157
module_param(pss_keep_settings, bool, 0);
1158
MODULE_PARM_DESC(pss_keep_settings, "Keep hardware setting at driver unloading (0 - no, 1 - yes)");
1159
module_param(pss_firmware, charp, 0);
1160
MODULE_PARM_DESC(pss_firmware, "Location of the firmware file (default - /etc/sound/pss_synth)");
1161
module_param(pss_mixer, bool, 0);
1162
MODULE_PARM_DESC(pss_mixer, "Enable (1) or disable (0) PSS mixer (controlling of output volume, bass, treble, synth volume). The mixer is not available on all PSS cards.");
1163
MODULE_AUTHOR("Hannu Savolainen, Vladimir Michl");
1164
MODULE_DESCRIPTION("Module for PSS sound cards (based on AD1848, ADSP-2115 and ESC614). This module includes control of output amplifier and synth volume of the Beethoven ADSP-16 card (this may work with other PSS cards).");
1165
MODULE_LICENSE("GPL");
1166
1167
1168
static int fw_load = 0;
1169
static int pssmpu = 0, pssmss = 0;
1170
1171
/*
1172
* Load a PSS sound card module
1173
*/
1174
1175
static int __init init_pss(void)
1176
{
1177
1178
if(pss_no_sound) /* If configuring only nonsound components */
1179
{
1180
cfg.io_base = pss_io;
1181
if(!probe_pss(&cfg))
1182
return -ENODEV;
1183
printk(KERN_INFO "ECHO-PSS Rev. %d\n", inw(REG(PSS_ID)) & 0x00ff);
1184
printk(KERN_INFO "PSS: loading in no sound mode.\n");
1185
disable_all_emulations();
1186
configure_nonsound_components();
1187
release_region(pss_io, 0x10);
1188
release_region(pss_io + 0x10, 0x9);
1189
return 0;
1190
}
1191
1192
cfg.io_base = pss_io;
1193
1194
cfg2.io_base = mss_io;
1195
cfg2.irq = mss_irq;
1196
cfg2.dma = mss_dma;
1197
1198
cfg_mpu.io_base = mpu_io;
1199
cfg_mpu.irq = mpu_irq;
1200
1201
if (cfg.io_base == -1 || cfg2.io_base == -1 || cfg2.irq == -1 || cfg.dma == -1) {
1202
printk(KERN_INFO "pss: mss_io, mss_dma, mss_irq and pss_io must be set.\n");
1203
return -EINVAL;
1204
}
1205
1206
if (!pss_synth) {
1207
fw_load = 1;
1208
pss_synthLen = mod_firmware_load(pss_firmware, (void *) &pss_synth);
1209
}
1210
if (!attach_pss(&cfg))
1211
return -ENODEV;
1212
/*
1213
* Attach stuff
1214
*/
1215
if (probe_pss_mpu(&cfg_mpu))
1216
pssmpu = 1;
1217
1218
if (probe_pss_mss(&cfg2))
1219
pssmss = 1;
1220
1221
return 0;
1222
}
1223
1224
static void __exit cleanup_pss(void)
1225
{
1226
if(!pss_no_sound)
1227
{
1228
if(fw_load && pss_synth)
1229
vfree(pss_synth);
1230
if(pssmss)
1231
unload_pss_mss(&cfg2);
1232
if(pssmpu)
1233
unload_pss_mpu(&cfg_mpu);
1234
unload_pss(&cfg);
1235
}
1236
1237
if(!pss_keep_settings) /* Keep hardware settings if asked */
1238
{
1239
disable_all_emulations();
1240
printk(KERN_INFO "Resetting PSS sound card configurations.\n");
1241
}
1242
}
1243
1244
module_init(init_pss);
1245
module_exit(cleanup_pss);
1246
1247
#ifndef MODULE
1248
static int __init setup_pss(char *str)
1249
{
1250
/* io, mss_io, mss_irq, mss_dma, mpu_io, mpu_irq */
1251
int ints[7];
1252
1253
str = get_options(str, ARRAY_SIZE(ints), ints);
1254
1255
pss_io = ints[1];
1256
mss_io = ints[2];
1257
mss_irq = ints[3];
1258
mss_dma = ints[4];
1259
mpu_io = ints[5];
1260
mpu_irq = ints[6];
1261
1262
return 1;
1263
}
1264
1265
__setup("pss=", setup_pss);
1266
#endif
1267
1268