xref: /OK3568_Linux_fs/kernel/sound/pci/au88x0/au88x0_xtalk.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later
2*4882a593Smuzhiyun /***************************************************************************
3*4882a593Smuzhiyun  *            au88x0_cxtalk.c
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  *  Wed Nov 19 16:29:47 2003
6*4882a593Smuzhiyun  *  Copyright  2003  mjander
7*4882a593Smuzhiyun  *  mjander@users.sourceforge.org
8*4882a593Smuzhiyun  ****************************************************************************/
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun /*
11*4882a593Smuzhiyun  */
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #include "au88x0_xtalk.h"
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun /* Data (a whole lot of data.... ) */
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun static short const sXtalkWideKLeftEq = 0x269C;
18*4882a593Smuzhiyun static short const sXtalkWideKRightEq = 0x269C;
19*4882a593Smuzhiyun static short const sXtalkWideKLeftXt = 0xF25E;
20*4882a593Smuzhiyun static __maybe_unused short const sXtalkWideKRightXt = 0xF25E;
21*4882a593Smuzhiyun static short const sXtalkWideShiftLeftEq = 1;
22*4882a593Smuzhiyun static short const sXtalkWideShiftRightEq = 1;
23*4882a593Smuzhiyun static short const sXtalkWideShiftLeftXt = 0;
24*4882a593Smuzhiyun static __maybe_unused short const sXtalkWideShiftRightXt = 0;
25*4882a593Smuzhiyun static unsigned short const wXtalkWideLeftDelay = 0xd;
26*4882a593Smuzhiyun static unsigned short const wXtalkWideRightDelay = 0xd;
27*4882a593Smuzhiyun static short const sXtalkNarrowKLeftEq = 0x468D;
28*4882a593Smuzhiyun static short const sXtalkNarrowKRightEq = 0x468D;
29*4882a593Smuzhiyun static short const sXtalkNarrowKLeftXt = 0xF82E;
30*4882a593Smuzhiyun static __maybe_unused short const sXtalkNarrowKRightXt = 0xF82E;
31*4882a593Smuzhiyun static short const sXtalkNarrowShiftLeftEq = 0x3;
32*4882a593Smuzhiyun static short const sXtalkNarrowShiftRightEq = 0x3;
33*4882a593Smuzhiyun static short const sXtalkNarrowShiftLeftXt = 0;
34*4882a593Smuzhiyun static __maybe_unused short const sXtalkNarrowShiftRightXt = 0;
35*4882a593Smuzhiyun static unsigned short const wXtalkNarrowLeftDelay = 0x7;
36*4882a593Smuzhiyun static unsigned short const wXtalkNarrowRightDelay = 0x7;
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun static __maybe_unused xtalk_gains_t const asXtalkGainsDefault = {
39*4882a593Smuzhiyun 	0x4000, 0x4000, 0x4000, 0x4000, 0x4000,
40*4882a593Smuzhiyun 	0x4000, 0x4000, 0x4000, 0x4000,	0x4000
41*4882a593Smuzhiyun };
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun static __maybe_unused xtalk_gains_t const asXtalkGainsTest = {
44*4882a593Smuzhiyun 	0x7fff, 0x8000, 0x0000, 0x0000, 0x0001,
45*4882a593Smuzhiyun 	0xffff, 0x4000, 0xc000, 0x0002, 0xfffe
46*4882a593Smuzhiyun };
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun static __maybe_unused xtalk_gains_t const asXtalkGains1Chan = {
49*4882a593Smuzhiyun 	0x7FFF, 0, 0, 0, 0,
50*4882a593Smuzhiyun 	0x7FFF, 0, 0, 0, 0,
51*4882a593Smuzhiyun };
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun // Input gain for 4 A3D slices. One possible input pair is left zero.
54*4882a593Smuzhiyun static xtalk_gains_t const asXtalkGainsAllChan = {
55*4882a593Smuzhiyun 	0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF, 0,
56*4882a593Smuzhiyun 	0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF,	0
57*4882a593Smuzhiyun };
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun static xtalk_gains_t const asXtalkGainsZeros = {
60*4882a593Smuzhiyun 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0
61*4882a593Smuzhiyun };
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun static xtalk_dline_t const alXtalkDlineZeros = {
64*4882a593Smuzhiyun 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
65*4882a593Smuzhiyun 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
66*4882a593Smuzhiyun };
67*4882a593Smuzhiyun static __maybe_unused xtalk_dline_t const alXtalkDlineTest = {
68*4882a593Smuzhiyun 	0x0000fc18, 0xfff03e8, 0x000186a0, 0xfffe7960, 1, 0xffffffff, 0, 0,
69*4882a593Smuzhiyun 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
70*4882a593Smuzhiyun 	0, 0, 0, 0, 0, 0, 0, 0
71*4882a593Smuzhiyun };
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun static xtalk_instate_t const asXtalkInStateZeros = {
74*4882a593Smuzhiyun 	0, 0, 0, 0
75*4882a593Smuzhiyun };
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun static __maybe_unused xtalk_instate_t const asXtalkInStateTest = {
78*4882a593Smuzhiyun 	0x0080, 0xff80, 0x0001, 0xffff
79*4882a593Smuzhiyun };
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun static xtalk_state_t const asXtalkOutStateZeros = {
82*4882a593Smuzhiyun 	{0, 0, 0, 0},
83*4882a593Smuzhiyun 	{0, 0, 0, 0},
84*4882a593Smuzhiyun 	{0, 0, 0, 0},
85*4882a593Smuzhiyun 	{0, 0, 0, 0},
86*4882a593Smuzhiyun 	{0, 0, 0, 0}
87*4882a593Smuzhiyun };
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun static short const sDiamondKLeftEq = 0x401d;
90*4882a593Smuzhiyun static short const sDiamondKRightEq = 0x401d;
91*4882a593Smuzhiyun static short const sDiamondKLeftXt = 0xF90E;
92*4882a593Smuzhiyun static __maybe_unused short const sDiamondKRightXt = 0xF90E;
93*4882a593Smuzhiyun static short const sDiamondShiftLeftEq = 1;
94*4882a593Smuzhiyun static short const sDiamondShiftRightEq = 1;
95*4882a593Smuzhiyun static short const sDiamondShiftLeftXt = 0;
96*4882a593Smuzhiyun static __maybe_unused short const sDiamondShiftRightXt = 0;
97*4882a593Smuzhiyun static unsigned short const wDiamondLeftDelay = 0xb;
98*4882a593Smuzhiyun static unsigned short const wDiamondRightDelay = 0xb;
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun static xtalk_coefs_t const asXtalkWideCoefsLeftEq = {
101*4882a593Smuzhiyun 	{0xEC4C, 0xDCE9, 0xFDC2, 0xFEEC, 0},
102*4882a593Smuzhiyun 	{0x5F60, 0xCBCB, 0xFC26, 0x0305, 0},
103*4882a593Smuzhiyun 	{0x340B, 0xe8f5, 0x236c, 0xe40d, 0},
104*4882a593Smuzhiyun 	{0x76d5, 0xc78d, 0x05ac, 0xfa5b, 0},
105*4882a593Smuzhiyun 	{0x7F04, 0xC0FA, 0x0263, 0xFDA2, 0}
106*4882a593Smuzhiyun };
107*4882a593Smuzhiyun static xtalk_coefs_t const asXtalkWideCoefsRightEq = {
108*4882a593Smuzhiyun 	{0xEC4C, 0xDCE9, 0xFDC2, 0xFEEC, 0},
109*4882a593Smuzhiyun 	{0x5F60, 0xCBCB, 0xFC26, 0x0305, 0},
110*4882a593Smuzhiyun 	{0x340B, 0xe8f5, 0x236c, 0xe40d, 0},
111*4882a593Smuzhiyun 	{0x76d5, 0xc78d, 0x05ac, 0xfa5b, 0},
112*4882a593Smuzhiyun 	{0x7F04, 0xC0FA, 0x0263, 0xFDA2, 0}
113*4882a593Smuzhiyun };
114*4882a593Smuzhiyun static xtalk_coefs_t const asXtalkWideCoefsLeftXt = {
115*4882a593Smuzhiyun 	{0x55c6, 0xc97b, 0x005b, 0x0047, 0},
116*4882a593Smuzhiyun 	{0x6a60, 0xca20, 0xffc6, 0x0040, 0},
117*4882a593Smuzhiyun 	{0x6411, 0xd711, 0xfca1, 0x0190, 0},
118*4882a593Smuzhiyun 	{0x77dc, 0xc79e, 0xffb8, 0x000a, 0},
119*4882a593Smuzhiyun 	{0, 0, 0, 0, 0}
120*4882a593Smuzhiyun };
121*4882a593Smuzhiyun static __maybe_unused xtalk_coefs_t const asXtalkWideCoefsRightXt = {
122*4882a593Smuzhiyun 	{0x55c6, 0xc97b, 0x005b, 0x0047, 0},
123*4882a593Smuzhiyun 	{0x6a60, 0xca20, 0xffc6, 0x0040, 0},
124*4882a593Smuzhiyun 	{0x6411, 0xd711, 0xfca1, 0x0190, 0},
125*4882a593Smuzhiyun 	{0x77dc, 0xc79e, 0xffb8, 0x000a, 0},
126*4882a593Smuzhiyun 	{0, 0, 0, 0, 0}
127*4882a593Smuzhiyun };
128*4882a593Smuzhiyun static xtalk_coefs_t const asXtalkNarrowCoefsLeftEq = {
129*4882a593Smuzhiyun 	{0x50B5, 0xD07C, 0x026D, 0xFD21, 0},
130*4882a593Smuzhiyun 	{0x460F, 0xE44F, 0xF75E, 0xEFA6, 0},
131*4882a593Smuzhiyun 	{0x556D, 0xDCAB, 0x2098, 0xF0F2, 0},
132*4882a593Smuzhiyun 	{0x7E03, 0xC1F0, 0x007D, 0xFF89, 0},
133*4882a593Smuzhiyun 	{0x383E, 0xFD9D, 0xB278, 0x4547, 0}
134*4882a593Smuzhiyun };
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun static xtalk_coefs_t const asXtalkNarrowCoefsRightEq = {
137*4882a593Smuzhiyun 	{0x50B5, 0xD07C, 0x026D, 0xFD21, 0},
138*4882a593Smuzhiyun 	{0x460F, 0xE44F, 0xF75E, 0xEFA6, 0},
139*4882a593Smuzhiyun 	{0x556D, 0xDCAB, 0x2098, 0xF0F2, 0},
140*4882a593Smuzhiyun 	{0x7E03, 0xC1F0, 0x007D, 0xFF89, 0},
141*4882a593Smuzhiyun 	{0x383E, 0xFD9D, 0xB278, 0x4547, 0}
142*4882a593Smuzhiyun };
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun static xtalk_coefs_t const asXtalkNarrowCoefsLeftXt = {
145*4882a593Smuzhiyun 	{0x3CB2, 0xDF49, 0xF6EA, 0x095B, 0},
146*4882a593Smuzhiyun 	{0x6777, 0xC915, 0xFEAF, 0x00B1, 0},
147*4882a593Smuzhiyun 	{0x7762, 0xC7D9, 0x025B, 0xFDA6, 0},
148*4882a593Smuzhiyun 	{0x6B7A, 0xD2AA, 0xF2FB, 0x0B64, 0},
149*4882a593Smuzhiyun 	{0, 0, 0, 0, 0}
150*4882a593Smuzhiyun };
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun static __maybe_unused xtalk_coefs_t const asXtalkNarrowCoefsRightXt = {
153*4882a593Smuzhiyun 	{0x3CB2, 0xDF49, 0xF6EA, 0x095B, 0},
154*4882a593Smuzhiyun 	{0x6777, 0xC915, 0xFEAF, 0x00B1, 0},
155*4882a593Smuzhiyun 	{0x7762, 0xC7D9, 0x025B, 0xFDA6, 0},
156*4882a593Smuzhiyun 	{0x6B7A, 0xD2AA, 0xF2FB, 0x0B64, 0},
157*4882a593Smuzhiyun 	{0, 0, 0, 0, 0}
158*4882a593Smuzhiyun };
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun static xtalk_coefs_t const asXtalkCoefsZeros = {
161*4882a593Smuzhiyun 	{0, 0, 0, 0, 0},
162*4882a593Smuzhiyun 	{0, 0, 0, 0, 0},
163*4882a593Smuzhiyun 	{0, 0, 0, 0, 0},
164*4882a593Smuzhiyun 	{0, 0, 0, 0, 0},
165*4882a593Smuzhiyun 	{0, 0, 0, 0, 0}
166*4882a593Smuzhiyun };
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun static xtalk_coefs_t const asXtalkCoefsPipe = {
169*4882a593Smuzhiyun 	{0, 0, 0x0FA0, 0, 0},
170*4882a593Smuzhiyun 	{0, 0, 0x0FA0, 0, 0},
171*4882a593Smuzhiyun 	{0, 0, 0x0FA0, 0, 0},
172*4882a593Smuzhiyun 	{0, 0, 0x0FA0, 0, 0},
173*4882a593Smuzhiyun 	{0, 0, 0x1180, 0, 0},
174*4882a593Smuzhiyun };
175*4882a593Smuzhiyun static __maybe_unused xtalk_coefs_t const asXtalkCoefsNegPipe = {
176*4882a593Smuzhiyun 	{0, 0, 0xF380, 0, 0},
177*4882a593Smuzhiyun 	{0, 0, 0xF380, 0, 0},
178*4882a593Smuzhiyun 	{0, 0, 0xF380, 0, 0},
179*4882a593Smuzhiyun 	{0, 0, 0xF380, 0, 0},
180*4882a593Smuzhiyun 	{0, 0, 0xF200, 0, 0}
181*4882a593Smuzhiyun };
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun static __maybe_unused xtalk_coefs_t const asXtalkCoefsNumTest = {
184*4882a593Smuzhiyun 	{0, 0, 0xF380, 0x8000, 0x6D60},
185*4882a593Smuzhiyun 	{0, 0, 0, 0, 0},
186*4882a593Smuzhiyun 	{0, 0, 0, 0, 0},
187*4882a593Smuzhiyun 	{0, 0, 0, 0, 0},
188*4882a593Smuzhiyun 	{0, 0, 0, 0, 0}
189*4882a593Smuzhiyun };
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun static __maybe_unused xtalk_coefs_t const asXtalkCoefsDenTest = {
192*4882a593Smuzhiyun 	{0xC000, 0x2000, 0x4000, 0, 0},
193*4882a593Smuzhiyun 	{0, 0, 0, 0, 0},
194*4882a593Smuzhiyun 	{0, 0, 0, 0, 0},
195*4882a593Smuzhiyun 	{0, 0, 0, 0, 0},
196*4882a593Smuzhiyun 	{0, 0, 0, 0, 0}
197*4882a593Smuzhiyun };
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun static __maybe_unused xtalk_state_t const asXtalkOutStateTest = {
200*4882a593Smuzhiyun 	{0x7FFF, 0x0004, 0xFFFC, 0},
201*4882a593Smuzhiyun 	{0xFE00, 0x0008, 0xFFF8, 0x4000},
202*4882a593Smuzhiyun 	{0x0200, 0x0010, 0xFFF0, 0xC000},
203*4882a593Smuzhiyun 	{0x8000, 0x0020, 0xFFE0, 0},
204*4882a593Smuzhiyun 	{0, 0, 0, 0}
205*4882a593Smuzhiyun };
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun static xtalk_coefs_t const asDiamondCoefsLeftEq = {
208*4882a593Smuzhiyun 	{0x0F1E, 0x2D05, 0xF8E3, 0x07C8, 0},
209*4882a593Smuzhiyun 	{0x45E2, 0xCA51, 0x0448, 0xFCE7, 0},
210*4882a593Smuzhiyun 	{0xA93E, 0xDBD5, 0x022C, 0x028A, 0},
211*4882a593Smuzhiyun 	{0, 0, 0, 0, 0},
212*4882a593Smuzhiyun 	{0, 0, 0, 0, 0}
213*4882a593Smuzhiyun };
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun static xtalk_coefs_t const asDiamondCoefsRightEq = {
216*4882a593Smuzhiyun 	{0x0F1E, 0x2D05, 0xF8E3, 0x07C8, 0},
217*4882a593Smuzhiyun 	{0x45E2, 0xCA51, 0x0448, 0xFCE7, 0},
218*4882a593Smuzhiyun 	{0xA93E, 0xDBD5, 0x022C, 0x028A, 0},
219*4882a593Smuzhiyun 	{0, 0, 0, 0, 0},
220*4882a593Smuzhiyun 	{0, 0, 0, 0, 0}
221*4882a593Smuzhiyun };
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun static xtalk_coefs_t const asDiamondCoefsLeftXt = {
224*4882a593Smuzhiyun 	{0x3B50, 0xFE08, 0xF959, 0x0060, 0},
225*4882a593Smuzhiyun 	{0x9FCB, 0xD8F1, 0x00A2, 0x003A, 0},
226*4882a593Smuzhiyun 	{0, 0, 0, 0, 0},
227*4882a593Smuzhiyun 	{0, 0, 0, 0, 0},
228*4882a593Smuzhiyun 	{0, 0, 0, 0, 0}
229*4882a593Smuzhiyun };
230*4882a593Smuzhiyun 
231*4882a593Smuzhiyun static __maybe_unused xtalk_coefs_t const asDiamondCoefsRightXt = {
232*4882a593Smuzhiyun 	{0x3B50, 0xFE08, 0xF959, 0x0060, 0},
233*4882a593Smuzhiyun 	{0x9FCB, 0xD8F1, 0x00A2, 0x003A, 0},
234*4882a593Smuzhiyun 	{0, 0, 0, 0, 0},
235*4882a593Smuzhiyun 	{0, 0, 0, 0, 0},
236*4882a593Smuzhiyun 	{0, 0, 0, 0, 0}
237*4882a593Smuzhiyun };
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun  /**/
240*4882a593Smuzhiyun /* XTalk EQ and XT */
241*4882a593Smuzhiyun static void
vortex_XtalkHw_SetLeftEQ(vortex_t * vortex,short arg_0,short arg_4,xtalk_coefs_t const coefs)242*4882a593Smuzhiyun vortex_XtalkHw_SetLeftEQ(vortex_t * vortex, short arg_0, short arg_4,
243*4882a593Smuzhiyun 			 xtalk_coefs_t const coefs)
244*4882a593Smuzhiyun {
245*4882a593Smuzhiyun 	int i;
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun 	for (i = 0; i < 5; i++) {
248*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x24200 + i * 0x24, coefs[i][0]);
249*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x24204 + i * 0x24, coefs[i][1]);
250*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x24208 + i * 0x24, coefs[i][2]);
251*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x2420c + i * 0x24, coefs[i][3]);
252*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x24210 + i * 0x24, coefs[i][4]);
253*4882a593Smuzhiyun 	}
254*4882a593Smuzhiyun 	hwwrite(vortex->mmio, 0x24538, arg_0 & 0xffff);
255*4882a593Smuzhiyun 	hwwrite(vortex->mmio, 0x2453C, arg_4 & 0xffff);
256*4882a593Smuzhiyun }
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun static void
vortex_XtalkHw_SetRightEQ(vortex_t * vortex,short arg_0,short arg_4,xtalk_coefs_t const coefs)259*4882a593Smuzhiyun vortex_XtalkHw_SetRightEQ(vortex_t * vortex, short arg_0, short arg_4,
260*4882a593Smuzhiyun 			  xtalk_coefs_t const coefs)
261*4882a593Smuzhiyun {
262*4882a593Smuzhiyun 	int i;
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun 	for (i = 0; i < 5; i++) {
265*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x242b4 + i * 0x24, coefs[i][0]);
266*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x242b8 + i * 0x24, coefs[i][1]);
267*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x242bc + i * 0x24, coefs[i][2]);
268*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x242c0 + i * 0x24, coefs[i][3]);
269*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x242c4 + i * 0x24, coefs[i][4]);
270*4882a593Smuzhiyun 	}
271*4882a593Smuzhiyun 	hwwrite(vortex->mmio, 0x24540, arg_0 & 0xffff);
272*4882a593Smuzhiyun 	hwwrite(vortex->mmio, 0x24544, arg_4 & 0xffff);
273*4882a593Smuzhiyun }
274*4882a593Smuzhiyun 
275*4882a593Smuzhiyun static void
vortex_XtalkHw_SetLeftXT(vortex_t * vortex,short arg_0,short arg_4,xtalk_coefs_t const coefs)276*4882a593Smuzhiyun vortex_XtalkHw_SetLeftXT(vortex_t * vortex, short arg_0, short arg_4,
277*4882a593Smuzhiyun 			 xtalk_coefs_t const coefs)
278*4882a593Smuzhiyun {
279*4882a593Smuzhiyun 	int i;
280*4882a593Smuzhiyun 
281*4882a593Smuzhiyun 	for (i = 0; i < 5; i++) {
282*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x24368 + i * 0x24, coefs[i][0]);
283*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x2436c + i * 0x24, coefs[i][1]);
284*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x24370 + i * 0x24, coefs[i][2]);
285*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x24374 + i * 0x24, coefs[i][3]);
286*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x24378 + i * 0x24, coefs[i][4]);
287*4882a593Smuzhiyun 	}
288*4882a593Smuzhiyun 	hwwrite(vortex->mmio, 0x24548, arg_0 & 0xffff);
289*4882a593Smuzhiyun 	hwwrite(vortex->mmio, 0x2454C, arg_4 & 0xffff);
290*4882a593Smuzhiyun }
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun static void
vortex_XtalkHw_SetRightXT(vortex_t * vortex,short arg_0,short arg_4,xtalk_coefs_t const coefs)293*4882a593Smuzhiyun vortex_XtalkHw_SetRightXT(vortex_t * vortex, short arg_0, short arg_4,
294*4882a593Smuzhiyun 			  xtalk_coefs_t const coefs)
295*4882a593Smuzhiyun {
296*4882a593Smuzhiyun 	int i;
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun 	for (i = 0; i < 5; i++) {
299*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x2441C + i * 0x24, coefs[i][0]);
300*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x24420 + i * 0x24, coefs[i][1]);
301*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x24424 + i * 0x24, coefs[i][2]);
302*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x24428 + i * 0x24, coefs[i][3]);
303*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x2442C + i * 0x24, coefs[i][4]);
304*4882a593Smuzhiyun 	}
305*4882a593Smuzhiyun 	hwwrite(vortex->mmio, 0x24550, arg_0 & 0xffff);
306*4882a593Smuzhiyun 	hwwrite(vortex->mmio, 0x24554, arg_4 & 0xffff);
307*4882a593Smuzhiyun }
308*4882a593Smuzhiyun 
309*4882a593Smuzhiyun static void
vortex_XtalkHw_SetLeftEQStates(vortex_t * vortex,xtalk_instate_t const arg_0,xtalk_state_t const coefs)310*4882a593Smuzhiyun vortex_XtalkHw_SetLeftEQStates(vortex_t * vortex,
311*4882a593Smuzhiyun 			       xtalk_instate_t const arg_0,
312*4882a593Smuzhiyun 			       xtalk_state_t const coefs)
313*4882a593Smuzhiyun {
314*4882a593Smuzhiyun 	int i;
315*4882a593Smuzhiyun 
316*4882a593Smuzhiyun 	for (i = 0; i < 5; i++) {
317*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x24214 + i * 0x24, coefs[i][0]);
318*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x24218 + i * 0x24, coefs[i][1]);
319*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x2421C + i * 0x24, coefs[i][2]);
320*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x24220 + i * 0x24, coefs[i][3]);
321*4882a593Smuzhiyun 	}
322*4882a593Smuzhiyun 	hwwrite(vortex->mmio, 0x244F8, arg_0[0]);
323*4882a593Smuzhiyun 	hwwrite(vortex->mmio, 0x244FC, arg_0[1]);
324*4882a593Smuzhiyun 	hwwrite(vortex->mmio, 0x24500, arg_0[2]);
325*4882a593Smuzhiyun 	hwwrite(vortex->mmio, 0x24504, arg_0[3]);
326*4882a593Smuzhiyun }
327*4882a593Smuzhiyun 
328*4882a593Smuzhiyun static void
vortex_XtalkHw_SetRightEQStates(vortex_t * vortex,xtalk_instate_t const arg_0,xtalk_state_t const coefs)329*4882a593Smuzhiyun vortex_XtalkHw_SetRightEQStates(vortex_t * vortex,
330*4882a593Smuzhiyun 				xtalk_instate_t const arg_0,
331*4882a593Smuzhiyun 				xtalk_state_t const coefs)
332*4882a593Smuzhiyun {
333*4882a593Smuzhiyun 	int i;
334*4882a593Smuzhiyun 
335*4882a593Smuzhiyun 	for (i = 0; i < 5; i++) {
336*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x242C8 + i * 0x24, coefs[i][0]);
337*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x242CC + i * 0x24, coefs[i][1]);
338*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x242D0 + i * 0x24, coefs[i][2]);
339*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x244D4 + i * 0x24, coefs[i][3]);
340*4882a593Smuzhiyun 	}
341*4882a593Smuzhiyun 	hwwrite(vortex->mmio, 0x24508, arg_0[0]);
342*4882a593Smuzhiyun 	hwwrite(vortex->mmio, 0x2450C, arg_0[1]);
343*4882a593Smuzhiyun 	hwwrite(vortex->mmio, 0x24510, arg_0[2]);
344*4882a593Smuzhiyun 	hwwrite(vortex->mmio, 0x24514, arg_0[3]);
345*4882a593Smuzhiyun }
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun static void
vortex_XtalkHw_SetLeftXTStates(vortex_t * vortex,xtalk_instate_t const arg_0,xtalk_state_t const coefs)348*4882a593Smuzhiyun vortex_XtalkHw_SetLeftXTStates(vortex_t * vortex,
349*4882a593Smuzhiyun 			       xtalk_instate_t const arg_0,
350*4882a593Smuzhiyun 			       xtalk_state_t const coefs)
351*4882a593Smuzhiyun {
352*4882a593Smuzhiyun 	int i;
353*4882a593Smuzhiyun 
354*4882a593Smuzhiyun 	for (i = 0; i < 5; i++) {
355*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x2437C + i * 0x24, coefs[i][0]);
356*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x24380 + i * 0x24, coefs[i][1]);
357*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x24384 + i * 0x24, coefs[i][2]);
358*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x24388 + i * 0x24, coefs[i][3]);
359*4882a593Smuzhiyun 	}
360*4882a593Smuzhiyun 	hwwrite(vortex->mmio, 0x24518, arg_0[0]);
361*4882a593Smuzhiyun 	hwwrite(vortex->mmio, 0x2451C, arg_0[1]);
362*4882a593Smuzhiyun 	hwwrite(vortex->mmio, 0x24520, arg_0[2]);
363*4882a593Smuzhiyun 	hwwrite(vortex->mmio, 0x24524, arg_0[3]);
364*4882a593Smuzhiyun }
365*4882a593Smuzhiyun 
366*4882a593Smuzhiyun static void
vortex_XtalkHw_SetRightXTStates(vortex_t * vortex,xtalk_instate_t const arg_0,xtalk_state_t const coefs)367*4882a593Smuzhiyun vortex_XtalkHw_SetRightXTStates(vortex_t * vortex,
368*4882a593Smuzhiyun 				xtalk_instate_t const arg_0,
369*4882a593Smuzhiyun 				xtalk_state_t const coefs)
370*4882a593Smuzhiyun {
371*4882a593Smuzhiyun 	int i;
372*4882a593Smuzhiyun 
373*4882a593Smuzhiyun 	for (i = 0; i < 5; i++) {
374*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x24430 + i * 0x24, coefs[i][0]);
375*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x24434 + i * 0x24, coefs[i][1]);
376*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x24438 + i * 0x24, coefs[i][2]);
377*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x2443C + i * 0x24, coefs[i][3]);
378*4882a593Smuzhiyun 	}
379*4882a593Smuzhiyun 	hwwrite(vortex->mmio, 0x24528, arg_0[0]);
380*4882a593Smuzhiyun 	hwwrite(vortex->mmio, 0x2452C, arg_0[1]);
381*4882a593Smuzhiyun 	hwwrite(vortex->mmio, 0x24530, arg_0[2]);
382*4882a593Smuzhiyun 	hwwrite(vortex->mmio, 0x24534, arg_0[3]);
383*4882a593Smuzhiyun }
384*4882a593Smuzhiyun 
385*4882a593Smuzhiyun #if 0
386*4882a593Smuzhiyun static void
387*4882a593Smuzhiyun vortex_XtalkHw_GetLeftEQ(vortex_t * vortex, short *arg_0, short *arg_4,
388*4882a593Smuzhiyun 			 xtalk_coefs_t coefs)
389*4882a593Smuzhiyun {
390*4882a593Smuzhiyun 	int i;
391*4882a593Smuzhiyun 
392*4882a593Smuzhiyun 	for (i = 0; i < 5; i++) {
393*4882a593Smuzhiyun 		coefs[i][0] = hwread(vortex->mmio, 0x24200 + i * 0x24);
394*4882a593Smuzhiyun 		coefs[i][1] = hwread(vortex->mmio, 0x24204 + i * 0x24);
395*4882a593Smuzhiyun 		coefs[i][2] = hwread(vortex->mmio, 0x24208 + i * 0x24);
396*4882a593Smuzhiyun 		coefs[i][3] = hwread(vortex->mmio, 0x2420c + i * 0x24);
397*4882a593Smuzhiyun 		coefs[i][4] = hwread(vortex->mmio, 0x24210 + i * 0x24);
398*4882a593Smuzhiyun 	}
399*4882a593Smuzhiyun 	*arg_0 = hwread(vortex->mmio, 0x24538) & 0xffff;
400*4882a593Smuzhiyun 	*arg_4 = hwread(vortex->mmio, 0x2453c) & 0xffff;
401*4882a593Smuzhiyun }
402*4882a593Smuzhiyun 
403*4882a593Smuzhiyun static void
404*4882a593Smuzhiyun vortex_XtalkHw_GetRightEQ(vortex_t * vortex, short *arg_0, short *arg_4,
405*4882a593Smuzhiyun 			  xtalk_coefs_t coefs)
406*4882a593Smuzhiyun {
407*4882a593Smuzhiyun 	int i;
408*4882a593Smuzhiyun 
409*4882a593Smuzhiyun 	for (i = 0; i < 5; i++) {
410*4882a593Smuzhiyun 		coefs[i][0] = hwread(vortex->mmio, 0x242b4 + i * 0x24);
411*4882a593Smuzhiyun 		coefs[i][1] = hwread(vortex->mmio, 0x242b8 + i * 0x24);
412*4882a593Smuzhiyun 		coefs[i][2] = hwread(vortex->mmio, 0x242bc + i * 0x24);
413*4882a593Smuzhiyun 		coefs[i][3] = hwread(vortex->mmio, 0x242c0 + i * 0x24);
414*4882a593Smuzhiyun 		coefs[i][4] = hwread(vortex->mmio, 0x242c4 + i * 0x24);
415*4882a593Smuzhiyun 	}
416*4882a593Smuzhiyun 	*arg_0 = hwread(vortex->mmio, 0x24540) & 0xffff;
417*4882a593Smuzhiyun 	*arg_4 = hwread(vortex->mmio, 0x24544) & 0xffff;
418*4882a593Smuzhiyun }
419*4882a593Smuzhiyun 
420*4882a593Smuzhiyun static void
421*4882a593Smuzhiyun vortex_XtalkHw_GetLeftXT(vortex_t * vortex, short *arg_0, short *arg_4,
422*4882a593Smuzhiyun 			 xtalk_coefs_t coefs)
423*4882a593Smuzhiyun {
424*4882a593Smuzhiyun 	int i;
425*4882a593Smuzhiyun 
426*4882a593Smuzhiyun 	for (i = 0; i < 5; i++) {
427*4882a593Smuzhiyun 		coefs[i][0] = hwread(vortex->mmio, 0x24368 + i * 0x24);
428*4882a593Smuzhiyun 		coefs[i][1] = hwread(vortex->mmio, 0x2436C + i * 0x24);
429*4882a593Smuzhiyun 		coefs[i][2] = hwread(vortex->mmio, 0x24370 + i * 0x24);
430*4882a593Smuzhiyun 		coefs[i][3] = hwread(vortex->mmio, 0x24374 + i * 0x24);
431*4882a593Smuzhiyun 		coefs[i][4] = hwread(vortex->mmio, 0x24378 + i * 0x24);
432*4882a593Smuzhiyun 	}
433*4882a593Smuzhiyun 	*arg_0 = hwread(vortex->mmio, 0x24548) & 0xffff;
434*4882a593Smuzhiyun 	*arg_4 = hwread(vortex->mmio, 0x2454C) & 0xffff;
435*4882a593Smuzhiyun }
436*4882a593Smuzhiyun 
437*4882a593Smuzhiyun static void
438*4882a593Smuzhiyun vortex_XtalkHw_GetRightXT(vortex_t * vortex, short *arg_0, short *arg_4,
439*4882a593Smuzhiyun 			  xtalk_coefs_t coefs)
440*4882a593Smuzhiyun {
441*4882a593Smuzhiyun 	int i;
442*4882a593Smuzhiyun 
443*4882a593Smuzhiyun 	for (i = 0; i < 5; i++) {
444*4882a593Smuzhiyun 		coefs[i][0] = hwread(vortex->mmio, 0x2441C + i * 0x24);
445*4882a593Smuzhiyun 		coefs[i][1] = hwread(vortex->mmio, 0x24420 + i * 0x24);
446*4882a593Smuzhiyun 		coefs[i][2] = hwread(vortex->mmio, 0x24424 + i * 0x24);
447*4882a593Smuzhiyun 		coefs[i][3] = hwread(vortex->mmio, 0x24428 + i * 0x24);
448*4882a593Smuzhiyun 		coefs[i][4] = hwread(vortex->mmio, 0x2442C + i * 0x24);
449*4882a593Smuzhiyun 	}
450*4882a593Smuzhiyun 	*arg_0 = hwread(vortex->mmio, 0x24550) & 0xffff;
451*4882a593Smuzhiyun 	*arg_4 = hwread(vortex->mmio, 0x24554) & 0xffff;
452*4882a593Smuzhiyun }
453*4882a593Smuzhiyun 
454*4882a593Smuzhiyun static void
455*4882a593Smuzhiyun vortex_XtalkHw_GetLeftEQStates(vortex_t * vortex, xtalk_instate_t arg_0,
456*4882a593Smuzhiyun 			       xtalk_state_t coefs)
457*4882a593Smuzhiyun {
458*4882a593Smuzhiyun 	int i;
459*4882a593Smuzhiyun 
460*4882a593Smuzhiyun 	for (i = 0; i < 5; i++) {
461*4882a593Smuzhiyun 		coefs[i][0] = hwread(vortex->mmio, 0x24214 + i * 0x24);
462*4882a593Smuzhiyun 		coefs[i][1] = hwread(vortex->mmio, 0x24218 + i * 0x24);
463*4882a593Smuzhiyun 		coefs[i][2] = hwread(vortex->mmio, 0x2421C + i * 0x24);
464*4882a593Smuzhiyun 		coefs[i][3] = hwread(vortex->mmio, 0x24220 + i * 0x24);
465*4882a593Smuzhiyun 	}
466*4882a593Smuzhiyun 	arg_0[0] = hwread(vortex->mmio, 0x244F8);
467*4882a593Smuzhiyun 	arg_0[1] = hwread(vortex->mmio, 0x244FC);
468*4882a593Smuzhiyun 	arg_0[2] = hwread(vortex->mmio, 0x24500);
469*4882a593Smuzhiyun 	arg_0[3] = hwread(vortex->mmio, 0x24504);
470*4882a593Smuzhiyun }
471*4882a593Smuzhiyun 
472*4882a593Smuzhiyun static void
473*4882a593Smuzhiyun vortex_XtalkHw_GetRightEQStates(vortex_t * vortex, xtalk_instate_t arg_0,
474*4882a593Smuzhiyun 				xtalk_state_t coefs)
475*4882a593Smuzhiyun {
476*4882a593Smuzhiyun 	int i;
477*4882a593Smuzhiyun 
478*4882a593Smuzhiyun 	for (i = 0; i < 5; i++) {
479*4882a593Smuzhiyun 		coefs[i][0] = hwread(vortex->mmio, 0x242C8 + i * 0x24);
480*4882a593Smuzhiyun 		coefs[i][1] = hwread(vortex->mmio, 0x242CC + i * 0x24);
481*4882a593Smuzhiyun 		coefs[i][2] = hwread(vortex->mmio, 0x242D0 + i * 0x24);
482*4882a593Smuzhiyun 		coefs[i][3] = hwread(vortex->mmio, 0x242D4 + i * 0x24);
483*4882a593Smuzhiyun 	}
484*4882a593Smuzhiyun 	arg_0[0] = hwread(vortex->mmio, 0x24508);
485*4882a593Smuzhiyun 	arg_0[1] = hwread(vortex->mmio, 0x2450C);
486*4882a593Smuzhiyun 	arg_0[2] = hwread(vortex->mmio, 0x24510);
487*4882a593Smuzhiyun 	arg_0[3] = hwread(vortex->mmio, 0x24514);
488*4882a593Smuzhiyun }
489*4882a593Smuzhiyun 
490*4882a593Smuzhiyun static void
491*4882a593Smuzhiyun vortex_XtalkHw_GetLeftXTStates(vortex_t * vortex, xtalk_instate_t arg_0,
492*4882a593Smuzhiyun 			       xtalk_state_t coefs)
493*4882a593Smuzhiyun {
494*4882a593Smuzhiyun 	int i;
495*4882a593Smuzhiyun 
496*4882a593Smuzhiyun 	for (i = 0; i < 5; i++) {
497*4882a593Smuzhiyun 		coefs[i][0] = hwread(vortex->mmio, 0x2437C + i * 0x24);
498*4882a593Smuzhiyun 		coefs[i][1] = hwread(vortex->mmio, 0x24380 + i * 0x24);
499*4882a593Smuzhiyun 		coefs[i][2] = hwread(vortex->mmio, 0x24384 + i * 0x24);
500*4882a593Smuzhiyun 		coefs[i][3] = hwread(vortex->mmio, 0x24388 + i * 0x24);
501*4882a593Smuzhiyun 	}
502*4882a593Smuzhiyun 	arg_0[0] = hwread(vortex->mmio, 0x24518);
503*4882a593Smuzhiyun 	arg_0[1] = hwread(vortex->mmio, 0x2451C);
504*4882a593Smuzhiyun 	arg_0[2] = hwread(vortex->mmio, 0x24520);
505*4882a593Smuzhiyun 	arg_0[3] = hwread(vortex->mmio, 0x24524);
506*4882a593Smuzhiyun }
507*4882a593Smuzhiyun 
508*4882a593Smuzhiyun static void
509*4882a593Smuzhiyun vortex_XtalkHw_GetRightXTStates(vortex_t * vortex, xtalk_instate_t arg_0,
510*4882a593Smuzhiyun 				xtalk_state_t coefs)
511*4882a593Smuzhiyun {
512*4882a593Smuzhiyun 	int i;
513*4882a593Smuzhiyun 
514*4882a593Smuzhiyun 	for (i = 0; i < 5; i++) {
515*4882a593Smuzhiyun 		coefs[i][0] = hwread(vortex->mmio, 0x24430 + i * 0x24);
516*4882a593Smuzhiyun 		coefs[i][1] = hwread(vortex->mmio, 0x24434 + i * 0x24);
517*4882a593Smuzhiyun 		coefs[i][2] = hwread(vortex->mmio, 0x24438 + i * 0x24);
518*4882a593Smuzhiyun 		coefs[i][3] = hwread(vortex->mmio, 0x2443C + i * 0x24);
519*4882a593Smuzhiyun 	}
520*4882a593Smuzhiyun 	arg_0[0] = hwread(vortex->mmio, 0x24528);
521*4882a593Smuzhiyun 	arg_0[1] = hwread(vortex->mmio, 0x2452C);
522*4882a593Smuzhiyun 	arg_0[2] = hwread(vortex->mmio, 0x24530);
523*4882a593Smuzhiyun 	arg_0[3] = hwread(vortex->mmio, 0x24534);
524*4882a593Smuzhiyun }
525*4882a593Smuzhiyun 
526*4882a593Smuzhiyun #endif
527*4882a593Smuzhiyun /* Gains */
528*4882a593Smuzhiyun 
529*4882a593Smuzhiyun static void
vortex_XtalkHw_SetGains(vortex_t * vortex,xtalk_gains_t const gains)530*4882a593Smuzhiyun vortex_XtalkHw_SetGains(vortex_t * vortex, xtalk_gains_t const gains)
531*4882a593Smuzhiyun {
532*4882a593Smuzhiyun 	int i;
533*4882a593Smuzhiyun 
534*4882a593Smuzhiyun 	for (i = 0; i < XTGAINS_SZ; i++) {
535*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x244D0 + (i * 4), gains[i]);
536*4882a593Smuzhiyun 	}
537*4882a593Smuzhiyun }
538*4882a593Smuzhiyun 
539*4882a593Smuzhiyun static void
vortex_XtalkHw_SetGainsAllChan(vortex_t * vortex)540*4882a593Smuzhiyun vortex_XtalkHw_SetGainsAllChan(vortex_t * vortex)
541*4882a593Smuzhiyun {
542*4882a593Smuzhiyun 	vortex_XtalkHw_SetGains(vortex, asXtalkGainsAllChan);
543*4882a593Smuzhiyun }
544*4882a593Smuzhiyun 
545*4882a593Smuzhiyun #if 0
546*4882a593Smuzhiyun static void vortex_XtalkHw_GetGains(vortex_t * vortex, xtalk_gains_t gains)
547*4882a593Smuzhiyun {
548*4882a593Smuzhiyun 	int i;
549*4882a593Smuzhiyun 
550*4882a593Smuzhiyun 	for (i = 0; i < XTGAINS_SZ; i++)
551*4882a593Smuzhiyun 		gains[i] = hwread(vortex->mmio, 0x244D0 + i * 4);
552*4882a593Smuzhiyun }
553*4882a593Smuzhiyun 
554*4882a593Smuzhiyun #endif
555*4882a593Smuzhiyun /* Delay parameters */
556*4882a593Smuzhiyun 
557*4882a593Smuzhiyun static void
vortex_XtalkHw_SetDelay(vortex_t * vortex,unsigned short right,unsigned short left)558*4882a593Smuzhiyun vortex_XtalkHw_SetDelay(vortex_t * vortex, unsigned short right,
559*4882a593Smuzhiyun 			unsigned short left)
560*4882a593Smuzhiyun {
561*4882a593Smuzhiyun 	u32 esp0 = 0;
562*4882a593Smuzhiyun 
563*4882a593Smuzhiyun 	esp0 &= 0x1FFFFFFF;
564*4882a593Smuzhiyun 	esp0 |= 0xA0000000;
565*4882a593Smuzhiyun 	esp0 = (esp0 & 0xffffE0ff) | ((right & 0x1F) << 8);
566*4882a593Smuzhiyun 	esp0 = (esp0 & 0xfffc1fff) | ((left & 0x1F) << 0xd);
567*4882a593Smuzhiyun 
568*4882a593Smuzhiyun 	hwwrite(vortex->mmio, 0x24660, esp0);
569*4882a593Smuzhiyun }
570*4882a593Smuzhiyun 
571*4882a593Smuzhiyun static void
vortex_XtalkHw_SetLeftDline(vortex_t * vortex,xtalk_dline_t const dline)572*4882a593Smuzhiyun vortex_XtalkHw_SetLeftDline(vortex_t * vortex, xtalk_dline_t const dline)
573*4882a593Smuzhiyun {
574*4882a593Smuzhiyun 	int i;
575*4882a593Smuzhiyun 
576*4882a593Smuzhiyun 	for (i = 0; i < 0x20; i++) {
577*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x24000 + (i << 2), dline[i] & 0xffff);
578*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x24080 + (i << 2), dline[i] >> 0x10);
579*4882a593Smuzhiyun 	}
580*4882a593Smuzhiyun }
581*4882a593Smuzhiyun 
582*4882a593Smuzhiyun static void
vortex_XtalkHw_SetRightDline(vortex_t * vortex,xtalk_dline_t const dline)583*4882a593Smuzhiyun vortex_XtalkHw_SetRightDline(vortex_t * vortex, xtalk_dline_t const dline)
584*4882a593Smuzhiyun {
585*4882a593Smuzhiyun 	int i;
586*4882a593Smuzhiyun 
587*4882a593Smuzhiyun 	for (i = 0; i < 0x20; i++) {
588*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x24100 + (i << 2), dline[i] & 0xffff);
589*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x24180 + (i << 2), dline[i] >> 0x10);
590*4882a593Smuzhiyun 	}
591*4882a593Smuzhiyun }
592*4882a593Smuzhiyun 
593*4882a593Smuzhiyun #if 0
594*4882a593Smuzhiyun static void
595*4882a593Smuzhiyun vortex_XtalkHw_GetDelay(vortex_t * vortex, unsigned short *right,
596*4882a593Smuzhiyun 			unsigned short *left)
597*4882a593Smuzhiyun {
598*4882a593Smuzhiyun 	int esp0;
599*4882a593Smuzhiyun 
600*4882a593Smuzhiyun 	esp0 = hwread(vortex->mmio, 0x24660);
601*4882a593Smuzhiyun 	*right = (esp0 >> 8) & 0x1f;
602*4882a593Smuzhiyun 	*left = (esp0 >> 0xd) & 0x1f;
603*4882a593Smuzhiyun }
604*4882a593Smuzhiyun 
605*4882a593Smuzhiyun static void vortex_XtalkHw_GetLeftDline(vortex_t * vortex, xtalk_dline_t dline)
606*4882a593Smuzhiyun {
607*4882a593Smuzhiyun 	int i;
608*4882a593Smuzhiyun 
609*4882a593Smuzhiyun 	for (i = 0; i < 0x20; i++) {
610*4882a593Smuzhiyun 		dline[i] =
611*4882a593Smuzhiyun 		    (hwread(vortex->mmio, 0x24000 + (i << 2)) & 0xffff) |
612*4882a593Smuzhiyun 		    (hwread(vortex->mmio, 0x24080 + (i << 2)) << 0x10);
613*4882a593Smuzhiyun 	}
614*4882a593Smuzhiyun }
615*4882a593Smuzhiyun 
616*4882a593Smuzhiyun static void vortex_XtalkHw_GetRightDline(vortex_t * vortex, xtalk_dline_t dline)
617*4882a593Smuzhiyun {
618*4882a593Smuzhiyun 	int i;
619*4882a593Smuzhiyun 
620*4882a593Smuzhiyun 	for (i = 0; i < 0x20; i++) {
621*4882a593Smuzhiyun 		dline[i] =
622*4882a593Smuzhiyun 		    (hwread(vortex->mmio, 0x24100 + (i << 2)) & 0xffff) |
623*4882a593Smuzhiyun 		    (hwread(vortex->mmio, 0x24180 + (i << 2)) << 0x10);
624*4882a593Smuzhiyun 	}
625*4882a593Smuzhiyun }
626*4882a593Smuzhiyun 
627*4882a593Smuzhiyun #endif
628*4882a593Smuzhiyun /* Control/Global stuff */
629*4882a593Smuzhiyun 
630*4882a593Smuzhiyun #if 0
631*4882a593Smuzhiyun static void vortex_XtalkHw_SetControlReg(vortex_t * vortex, u32 ctrl)
632*4882a593Smuzhiyun {
633*4882a593Smuzhiyun 	hwwrite(vortex->mmio, 0x24660, ctrl);
634*4882a593Smuzhiyun }
635*4882a593Smuzhiyun static void vortex_XtalkHw_GetControlReg(vortex_t * vortex, u32 *ctrl)
636*4882a593Smuzhiyun {
637*4882a593Smuzhiyun 	*ctrl = hwread(vortex->mmio, 0x24660);
638*4882a593Smuzhiyun }
639*4882a593Smuzhiyun #endif
vortex_XtalkHw_SetSampleRate(vortex_t * vortex,u32 sr)640*4882a593Smuzhiyun static void vortex_XtalkHw_SetSampleRate(vortex_t * vortex, u32 sr)
641*4882a593Smuzhiyun {
642*4882a593Smuzhiyun 	u32 temp;
643*4882a593Smuzhiyun 
644*4882a593Smuzhiyun 	temp = (hwread(vortex->mmio, 0x24660) & 0x1FFFFFFF) | 0xC0000000;
645*4882a593Smuzhiyun 	temp = (temp & 0xffffff07) | ((sr & 0x1f) << 3);
646*4882a593Smuzhiyun 	hwwrite(vortex->mmio, 0x24660, temp);
647*4882a593Smuzhiyun }
648*4882a593Smuzhiyun 
649*4882a593Smuzhiyun #if 0
650*4882a593Smuzhiyun static void vortex_XtalkHw_GetSampleRate(vortex_t * vortex, u32 *sr)
651*4882a593Smuzhiyun {
652*4882a593Smuzhiyun 	*sr = (hwread(vortex->mmio, 0x24660) >> 3) & 0x1f;
653*4882a593Smuzhiyun }
654*4882a593Smuzhiyun 
655*4882a593Smuzhiyun #endif
vortex_XtalkHw_Enable(vortex_t * vortex)656*4882a593Smuzhiyun static void vortex_XtalkHw_Enable(vortex_t * vortex)
657*4882a593Smuzhiyun {
658*4882a593Smuzhiyun 	u32 temp;
659*4882a593Smuzhiyun 
660*4882a593Smuzhiyun 	temp = (hwread(vortex->mmio, 0x24660) & 0x1FFFFFFF) | 0xC0000000;
661*4882a593Smuzhiyun 	temp |= 1;
662*4882a593Smuzhiyun 	hwwrite(vortex->mmio, 0x24660, temp);
663*4882a593Smuzhiyun 
664*4882a593Smuzhiyun }
665*4882a593Smuzhiyun 
vortex_XtalkHw_Disable(vortex_t * vortex)666*4882a593Smuzhiyun static void vortex_XtalkHw_Disable(vortex_t * vortex)
667*4882a593Smuzhiyun {
668*4882a593Smuzhiyun 	u32 temp;
669*4882a593Smuzhiyun 
670*4882a593Smuzhiyun 	temp = (hwread(vortex->mmio, 0x24660) & 0x1FFFFFFF) | 0xC0000000;
671*4882a593Smuzhiyun 	temp &= 0xfffffffe;
672*4882a593Smuzhiyun 	hwwrite(vortex->mmio, 0x24660, temp);
673*4882a593Smuzhiyun 
674*4882a593Smuzhiyun }
675*4882a593Smuzhiyun 
vortex_XtalkHw_ZeroIO(vortex_t * vortex)676*4882a593Smuzhiyun static void vortex_XtalkHw_ZeroIO(vortex_t * vortex)
677*4882a593Smuzhiyun {
678*4882a593Smuzhiyun 	int i;
679*4882a593Smuzhiyun 
680*4882a593Smuzhiyun 	for (i = 0; i < 20; i++)
681*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x24600 + (i << 2), 0);
682*4882a593Smuzhiyun 	for (i = 0; i < 4; i++)
683*4882a593Smuzhiyun 		hwwrite(vortex->mmio, 0x24650 + (i << 2), 0);
684*4882a593Smuzhiyun }
685*4882a593Smuzhiyun 
vortex_XtalkHw_ZeroState(vortex_t * vortex)686*4882a593Smuzhiyun static void vortex_XtalkHw_ZeroState(vortex_t * vortex)
687*4882a593Smuzhiyun {
688*4882a593Smuzhiyun 	vortex_XtalkHw_ZeroIO(vortex);	// inlined
689*4882a593Smuzhiyun 
690*4882a593Smuzhiyun 	vortex_XtalkHw_SetLeftEQ(vortex, 0, 0, asXtalkCoefsZeros);
691*4882a593Smuzhiyun 	vortex_XtalkHw_SetRightEQ(vortex, 0, 0, asXtalkCoefsZeros);
692*4882a593Smuzhiyun 
693*4882a593Smuzhiyun 	vortex_XtalkHw_SetLeftXT(vortex, 0, 0, asXtalkCoefsZeros);
694*4882a593Smuzhiyun 	vortex_XtalkHw_SetRightXT(vortex, 0, 0, asXtalkCoefsZeros);
695*4882a593Smuzhiyun 
696*4882a593Smuzhiyun 	vortex_XtalkHw_SetGains(vortex, asXtalkGainsZeros);	// inlined
697*4882a593Smuzhiyun 
698*4882a593Smuzhiyun 	vortex_XtalkHw_SetDelay(vortex, 0, 0);	// inlined
699*4882a593Smuzhiyun 
700*4882a593Smuzhiyun 	vortex_XtalkHw_SetLeftDline(vortex, alXtalkDlineZeros);	// inlined
701*4882a593Smuzhiyun 	vortex_XtalkHw_SetRightDline(vortex, alXtalkDlineZeros);	// inlined
702*4882a593Smuzhiyun 	vortex_XtalkHw_SetLeftDline(vortex, alXtalkDlineZeros);	// inlined
703*4882a593Smuzhiyun 	vortex_XtalkHw_SetRightDline(vortex, alXtalkDlineZeros);	// inlined
704*4882a593Smuzhiyun 
705*4882a593Smuzhiyun 	vortex_XtalkHw_SetLeftEQStates(vortex, asXtalkInStateZeros,
706*4882a593Smuzhiyun 				       asXtalkOutStateZeros);
707*4882a593Smuzhiyun 	vortex_XtalkHw_SetRightEQStates(vortex, asXtalkInStateZeros,
708*4882a593Smuzhiyun 					asXtalkOutStateZeros);
709*4882a593Smuzhiyun 	vortex_XtalkHw_SetLeftXTStates(vortex, asXtalkInStateZeros,
710*4882a593Smuzhiyun 				       asXtalkOutStateZeros);
711*4882a593Smuzhiyun 	vortex_XtalkHw_SetRightXTStates(vortex, asXtalkInStateZeros,
712*4882a593Smuzhiyun 					asXtalkOutStateZeros);
713*4882a593Smuzhiyun }
714*4882a593Smuzhiyun 
vortex_XtalkHw_ProgramPipe(vortex_t * vortex)715*4882a593Smuzhiyun static void vortex_XtalkHw_ProgramPipe(vortex_t * vortex)
716*4882a593Smuzhiyun {
717*4882a593Smuzhiyun 
718*4882a593Smuzhiyun 	vortex_XtalkHw_SetLeftEQ(vortex, 0, 1, asXtalkCoefsPipe);
719*4882a593Smuzhiyun 	vortex_XtalkHw_SetRightEQ(vortex, 0, 1, asXtalkCoefsPipe);
720*4882a593Smuzhiyun 	vortex_XtalkHw_SetLeftXT(vortex, 0, 0, asXtalkCoefsZeros);
721*4882a593Smuzhiyun 	vortex_XtalkHw_SetRightXT(vortex, 0, 0, asXtalkCoefsZeros);
722*4882a593Smuzhiyun 
723*4882a593Smuzhiyun 	vortex_XtalkHw_SetDelay(vortex, 0, 0);	// inlined
724*4882a593Smuzhiyun }
725*4882a593Smuzhiyun 
vortex_XtalkHw_ProgramXtalkWide(vortex_t * vortex)726*4882a593Smuzhiyun static void vortex_XtalkHw_ProgramXtalkWide(vortex_t * vortex)
727*4882a593Smuzhiyun {
728*4882a593Smuzhiyun 
729*4882a593Smuzhiyun 	vortex_XtalkHw_SetLeftEQ(vortex, sXtalkWideKLeftEq,
730*4882a593Smuzhiyun 				 sXtalkWideShiftLeftEq, asXtalkWideCoefsLeftEq);
731*4882a593Smuzhiyun 	vortex_XtalkHw_SetRightEQ(vortex, sXtalkWideKRightEq,
732*4882a593Smuzhiyun 				  sXtalkWideShiftRightEq,
733*4882a593Smuzhiyun 				  asXtalkWideCoefsRightEq);
734*4882a593Smuzhiyun 	vortex_XtalkHw_SetLeftXT(vortex, sXtalkWideKLeftXt,
735*4882a593Smuzhiyun 				 sXtalkWideShiftLeftXt, asXtalkWideCoefsLeftXt);
736*4882a593Smuzhiyun 	vortex_XtalkHw_SetRightXT(vortex, sXtalkWideKLeftXt,
737*4882a593Smuzhiyun 				  sXtalkWideShiftLeftXt,
738*4882a593Smuzhiyun 				  asXtalkWideCoefsLeftXt);
739*4882a593Smuzhiyun 
740*4882a593Smuzhiyun 	vortex_XtalkHw_SetDelay(vortex, wXtalkWideRightDelay, wXtalkWideLeftDelay);	// inlined
741*4882a593Smuzhiyun }
742*4882a593Smuzhiyun 
vortex_XtalkHw_ProgramXtalkNarrow(vortex_t * vortex)743*4882a593Smuzhiyun static void vortex_XtalkHw_ProgramXtalkNarrow(vortex_t * vortex)
744*4882a593Smuzhiyun {
745*4882a593Smuzhiyun 
746*4882a593Smuzhiyun 	vortex_XtalkHw_SetLeftEQ(vortex, sXtalkNarrowKLeftEq,
747*4882a593Smuzhiyun 				 sXtalkNarrowShiftLeftEq,
748*4882a593Smuzhiyun 				 asXtalkNarrowCoefsLeftEq);
749*4882a593Smuzhiyun 	vortex_XtalkHw_SetRightEQ(vortex, sXtalkNarrowKRightEq,
750*4882a593Smuzhiyun 				  sXtalkNarrowShiftRightEq,
751*4882a593Smuzhiyun 				  asXtalkNarrowCoefsRightEq);
752*4882a593Smuzhiyun 	vortex_XtalkHw_SetLeftXT(vortex, sXtalkNarrowKLeftXt,
753*4882a593Smuzhiyun 				 sXtalkNarrowShiftLeftXt,
754*4882a593Smuzhiyun 				 asXtalkNarrowCoefsLeftXt);
755*4882a593Smuzhiyun 	vortex_XtalkHw_SetRightXT(vortex, sXtalkNarrowKLeftXt,
756*4882a593Smuzhiyun 				  sXtalkNarrowShiftLeftXt,
757*4882a593Smuzhiyun 				  asXtalkNarrowCoefsLeftXt);
758*4882a593Smuzhiyun 
759*4882a593Smuzhiyun 	vortex_XtalkHw_SetDelay(vortex, wXtalkNarrowRightDelay, wXtalkNarrowLeftDelay);	// inlined
760*4882a593Smuzhiyun }
761*4882a593Smuzhiyun 
vortex_XtalkHw_ProgramDiamondXtalk(vortex_t * vortex)762*4882a593Smuzhiyun static void vortex_XtalkHw_ProgramDiamondXtalk(vortex_t * vortex)
763*4882a593Smuzhiyun {
764*4882a593Smuzhiyun 
765*4882a593Smuzhiyun 	//sDiamondKLeftEq,sDiamondKRightXt,asDiamondCoefsLeftEq
766*4882a593Smuzhiyun 	vortex_XtalkHw_SetLeftEQ(vortex, sDiamondKLeftEq,
767*4882a593Smuzhiyun 				 sDiamondShiftLeftEq, asDiamondCoefsLeftEq);
768*4882a593Smuzhiyun 	vortex_XtalkHw_SetRightEQ(vortex, sDiamondKRightEq,
769*4882a593Smuzhiyun 				  sDiamondShiftRightEq, asDiamondCoefsRightEq);
770*4882a593Smuzhiyun 	vortex_XtalkHw_SetLeftXT(vortex, sDiamondKLeftXt,
771*4882a593Smuzhiyun 				 sDiamondShiftLeftXt, asDiamondCoefsLeftXt);
772*4882a593Smuzhiyun 	vortex_XtalkHw_SetRightXT(vortex, sDiamondKLeftXt,
773*4882a593Smuzhiyun 				  sDiamondShiftLeftXt, asDiamondCoefsLeftXt);
774*4882a593Smuzhiyun 
775*4882a593Smuzhiyun 	vortex_XtalkHw_SetDelay(vortex, wDiamondRightDelay, wDiamondLeftDelay);	// inlined
776*4882a593Smuzhiyun }
777*4882a593Smuzhiyun 
vortex_XtalkHw_init(vortex_t * vortex)778*4882a593Smuzhiyun static void vortex_XtalkHw_init(vortex_t * vortex)
779*4882a593Smuzhiyun {
780*4882a593Smuzhiyun 	vortex_XtalkHw_ZeroState(vortex);
781*4882a593Smuzhiyun }
782*4882a593Smuzhiyun 
783*4882a593Smuzhiyun /* End of file */
784