blob: c33ed9beb7c9d0a2f30ba7b69906b187aa3bd611 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
/*
* drivers/sound/vidc.c
*
* Detection routine for the VIDC.
*
* Copyright (C) 1997 by Russell King <rmk@arm.uk.linux.org>
*/
#include <asm/io.h>
#include <asm/dma.h>
#include "sound_config.h"
#include "vidc.h"
int vidc_busy;
void vidc_update_filler(int bits, int channels)
{
int filltype;
filltype = bits + channels;
switch (filltype)
{
default:
case 9:
vidc_filler = vidc_fill_1x8;
break;
case 10:
vidc_filler = vidc_fill_2x8;
break;
case 17:
vidc_filler = vidc_fill_1x16;
break;
case 18:
vidc_filler = vidc_fill_2x16;
break;
}
}
void attach_vidc(struct address_info *hw_config)
{
char name[32];
int i;
sprintf(name, "VIDC %d-bit sound", hw_config->card_subtype);
conf_printf(name, hw_config);
for (i = 0; i < 2; i++)
{
dma_buf[i] = get_free_page(GFP_KERNEL);
dma_pbuf[i] = virt_to_phys(dma_buf[i]);
}
if (sound_alloc_dma(hw_config->dma, "VIDCsound"))
{
printk(KERN_ERR "VIDCsound: can't allocate virtual DMA channel\n");
return;
}
if (request_irq(hw_config->irq, vidc_sound_dma_irq, 0, "VIDCsound", NULL))
{
printk(KERN_ERR "VIDCsound: can't allocate DMA interrupt\n");
return;
}
vidc_synth_init(hw_config);
vidc_audio_init(hw_config);
vidc_mixer_init(hw_config);
}
int probe_vidc(struct address_info *hw_config)
{
hw_config->irq = IRQ_DMAS0;
hw_config->dma = DMA_VIRTUAL_SOUND;
hw_config->dma2 = -1;
hw_config->card_subtype = 16;
return 1;
}
void unload_vidc(struct address_info *hw_config)
{
free_irq(hw_config->irq, NULL);
sound_free_dma(hw_config->dma);
}
|