summaryrefslogtreecommitdiffstats
path: root/sys/i386/isa/sound/mad16.h
blob: 0370973667a40150841e814a31d68e5a81f73fbd (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
82
83
84
85
86
87
88
89
90
91

/*
 *	Initialization code for OPTI MAD16 interface chip by
 *	Davor Jadrijevic <davor@emard.pub.hr>
 *	(Included by ad1848.c when MAD16 support is enabled)
 *
 * It looks like MAD16 is similar than the Mozart chip (OAK OTI-601).
 * It could be even possible that these chips are exactly the same. Can
 * anybody confirm this?
 */

static void wr_a_mad16(int base, int v, int a)
{
 OUTB(a, base + 0xf);
 OUTB(v, base + 0x11);
}

static void wr_b_mad16(int base, int v, int a)
{
 OUTB(a, base + 0xf);
 OUTB(v, base + 0xd);
}

/*
static int rd_a_mad16(int base, int a)
{
 OUTB(a, base + 0xf);
 return INB(base + 0x11);
}
*/

static int rd_b_mad16(int base, int a)
{
 OUTB(a, base + 0xf);
 return INB(base + 0xd);
}

/*
static int rd_0_mad16(int base, int a)
{
 OUTB(a, base + 0xf);
 return INB(base + 0xf);
}

static void wr_ad(int base, int v, int a)
{
 OUTB(a, base + 4);
 OUTB(v, base + 5);
}

static int rd_ad(int base, int a)
{
 OUTB(a, base + 4);
 return INB(base + 5);
}
*/

static int mad16init(int adr)
{
 int j;
 long i;

 static int ad1848_bases[] = 
{ 0x220, -1, -1, 0x240, -1, -1, -1, -1, 0x530, 0xE80, 0xF40, 0x604, 0 };

 int mad16_base = 0xf80, ad1848_base;


 for(j = 0; (j < 16) && (ad1848_bases[j] != 0); j++)
  if(adr == ad1848_bases[j])
   break;

 if( (ad1848_base = ad1848_bases[j]) < 0x530)
 {
  printk("Unknown MAD16 setting 0x%3X\n", adr);
  return -1;
 }

 /* printk("OPTi MAD16 WSS at 0x%3X\n", ad1848_base); */

 rd_b_mad16(mad16_base, 0xe2);
 wr_a_mad16(mad16_base, 0x1a, 0xe2);
 wr_b_mad16(mad16_base, j * 16 + 1, 0xe2);
 wr_a_mad16(mad16_base, 0x1a, 0xe2);
 for( i = 0; i < 10000; i++)
  if( (INB(ad1848_base+4) & 0x80) == 0 )
   break;

 return 0;
};

OpenPOWER on IntegriCloud