2019-05-24 13:03:50 +03:00
// SPDX-License-Identifier: GPL-2.0-or-later
2005-04-17 02:20:36 +04:00
/***************************************************************************
* au88x0_cxtalk . c
*
* Wed Nov 19 16 : 29 : 47 2003
* Copyright 2003 mjander
* mjander @ users . sourceforge . org
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
*/
# include "au88x0_xtalk.h"
/* Data (a whole lot of data.... ) */
static short const sXtalkWideKLeftEq = 0x269C ;
static short const sXtalkWideKRightEq = 0x269C ;
static short const sXtalkWideKLeftXt = 0xF25E ;
static short const sXtalkWideKRightXt = 0xF25E ;
static short const sXtalkWideShiftLeftEq = 1 ;
static short const sXtalkWideShiftRightEq = 1 ;
static short const sXtalkWideShiftLeftXt = 0 ;
static short const sXtalkWideShiftRightXt = 0 ;
static unsigned short const wXtalkWideLeftDelay = 0xd ;
static unsigned short const wXtalkWideRightDelay = 0xd ;
static short const sXtalkNarrowKLeftEq = 0x468D ;
static short const sXtalkNarrowKRightEq = 0x468D ;
static short const sXtalkNarrowKLeftXt = 0xF82E ;
static short const sXtalkNarrowKRightXt = 0xF82E ;
static short const sXtalkNarrowShiftLeftEq = 0x3 ;
static short const sXtalkNarrowShiftRightEq = 0x3 ;
static short const sXtalkNarrowShiftLeftXt = 0 ;
static short const sXtalkNarrowShiftRightXt = 0 ;
static unsigned short const wXtalkNarrowLeftDelay = 0x7 ;
static unsigned short const wXtalkNarrowRightDelay = 0x7 ;
static xtalk_gains_t const asXtalkGainsDefault = {
2012-01-04 12:16:26 +04:00
0x4000 , 0x4000 , 0x4000 , 0x4000 , 0x4000 ,
0x4000 , 0x4000 , 0x4000 , 0x4000 , 0x4000
2005-04-17 02:20:36 +04:00
} ;
static xtalk_gains_t const asXtalkGainsTest = {
2012-01-04 12:16:26 +04:00
0x7fff , 0x8000 , 0x0000 , 0x0000 , 0x0001 ,
0xffff , 0x4000 , 0xc000 , 0x0002 , 0xfffe
2005-04-17 02:20:36 +04:00
} ;
2012-01-04 12:16:26 +04:00
2005-04-17 02:20:36 +04:00
static xtalk_gains_t const asXtalkGains1Chan = {
2012-01-04 12:16:26 +04:00
0x7FFF , 0 , 0 , 0 , 0 ,
0x7FFF , 0 , 0 , 0 , 0 ,
2005-04-17 02:20:36 +04:00
} ;
// Input gain for 4 A3D slices. One possible input pair is left zero.
static xtalk_gains_t const asXtalkGainsAllChan = {
2012-01-04 12:16:26 +04:00
0x7FFF , 0x7FFF , 0x7FFF , 0x7FFF , 0 ,
0x7FFF , 0x7FFF , 0x7FFF , 0x7FFF , 0
} ;
static xtalk_gains_t const asXtalkGainsZeros = {
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
2005-04-17 02:20:36 +04:00
} ;
2012-01-04 12:16:26 +04:00
static xtalk_dline_t const alXtalkDlineZeros = {
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
} ;
2005-04-17 02:20:36 +04:00
static xtalk_dline_t const alXtalkDlineTest = {
2012-01-04 12:16:26 +04:00
0x0000fc18 , 0xfff03e8 , 0x000186a0 , 0xfffe7960 , 1 , 0xffffffff , 0 , 0 ,
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
} ;
static xtalk_instate_t const asXtalkInStateZeros = {
2005-04-17 02:20:36 +04:00
0 , 0 , 0 , 0
} ;
2012-01-04 12:16:26 +04:00
static xtalk_instate_t const asXtalkInStateTest = {
0x0080 , 0xff80 , 0x0001 , 0xffff
} ;
static xtalk_state_t const asXtalkOutStateZeros = {
{ 0 , 0 , 0 , 0 } ,
{ 0 , 0 , 0 , 0 } ,
{ 0 , 0 , 0 , 0 } ,
{ 0 , 0 , 0 , 0 } ,
{ 0 , 0 , 0 , 0 }
} ;
2006-05-17 19:14:51 +04:00
2005-04-17 02:20:36 +04:00
static short const sDiamondKLeftEq = 0x401d ;
static short const sDiamondKRightEq = 0x401d ;
static short const sDiamondKLeftXt = 0xF90E ;
static short const sDiamondKRightXt = 0xF90E ;
2012-01-04 12:16:26 +04:00
static short const sDiamondShiftLeftEq = 1 ;
2005-04-17 02:20:36 +04:00
static short const sDiamondShiftRightEq = 1 ;
static short const sDiamondShiftLeftXt = 0 ;
static short const sDiamondShiftRightXt = 0 ;
static unsigned short const wDiamondLeftDelay = 0xb ;
static unsigned short const wDiamondRightDelay = 0xb ;
static xtalk_coefs_t const asXtalkWideCoefsLeftEq = {
{ 0xEC4C , 0xDCE9 , 0xFDC2 , 0xFEEC , 0 } ,
{ 0x5F60 , 0xCBCB , 0xFC26 , 0x0305 , 0 } ,
2012-01-04 12:16:26 +04:00
{ 0x340B , 0xe8f5 , 0x236c , 0xe40d , 0 } ,
{ 0x76d5 , 0xc78d , 0x05ac , 0xfa5b , 0 } ,
2005-04-17 02:20:36 +04:00
{ 0x7F04 , 0xC0FA , 0x0263 , 0xFDA2 , 0 }
} ;
static xtalk_coefs_t const asXtalkWideCoefsRightEq = {
{ 0xEC4C , 0xDCE9 , 0xFDC2 , 0xFEEC , 0 } ,
{ 0x5F60 , 0xCBCB , 0xFC26 , 0x0305 , 0 } ,
2012-01-04 12:16:26 +04:00
{ 0x340B , 0xe8f5 , 0x236c , 0xe40d , 0 } ,
{ 0x76d5 , 0xc78d , 0x05ac , 0xfa5b , 0 } ,
2005-04-17 02:20:36 +04:00
{ 0x7F04 , 0xC0FA , 0x0263 , 0xFDA2 , 0 }
} ;
static xtalk_coefs_t const asXtalkWideCoefsLeftXt = {
2012-01-04 12:16:26 +04:00
{ 0x55c6 , 0xc97b , 0x005b , 0x0047 , 0 } ,
{ 0x6a60 , 0xca20 , 0xffc6 , 0x0040 , 0 } ,
{ 0x6411 , 0xd711 , 0xfca1 , 0x0190 , 0 } ,
{ 0x77dc , 0xc79e , 0xffb8 , 0x000a , 0 } ,
2005-04-17 02:20:36 +04:00
{ 0 , 0 , 0 , 0 , 0 }
} ;
static xtalk_coefs_t const asXtalkWideCoefsRightXt = {
2012-01-04 12:16:26 +04:00
{ 0x55c6 , 0xc97b , 0x005b , 0x0047 , 0 } ,
{ 0x6a60 , 0xca20 , 0xffc6 , 0x0040 , 0 } ,
{ 0x6411 , 0xd711 , 0xfca1 , 0x0190 , 0 } ,
{ 0x77dc , 0xc79e , 0xffb8 , 0x000a , 0 } ,
2005-04-17 02:20:36 +04:00
{ 0 , 0 , 0 , 0 , 0 }
} ;
static xtalk_coefs_t const asXtalkNarrowCoefsLeftEq = {
{ 0x50B5 , 0xD07C , 0x026D , 0xFD21 , 0 } ,
{ 0x460F , 0xE44F , 0xF75E , 0xEFA6 , 0 } ,
{ 0x556D , 0xDCAB , 0x2098 , 0xF0F2 , 0 } ,
{ 0x7E03 , 0xC1F0 , 0x007D , 0xFF89 , 0 } ,
{ 0x383E , 0xFD9D , 0xB278 , 0x4547 , 0 }
} ;
static xtalk_coefs_t const asXtalkNarrowCoefsRightEq = {
{ 0x50B5 , 0xD07C , 0x026D , 0xFD21 , 0 } ,
{ 0x460F , 0xE44F , 0xF75E , 0xEFA6 , 0 } ,
{ 0x556D , 0xDCAB , 0x2098 , 0xF0F2 , 0 } ,
{ 0x7E03 , 0xC1F0 , 0x007D , 0xFF89 , 0 } ,
{ 0x383E , 0xFD9D , 0xB278 , 0x4547 , 0 }
} ;
static xtalk_coefs_t const asXtalkNarrowCoefsLeftXt = {
{ 0x3CB2 , 0xDF49 , 0xF6EA , 0x095B , 0 } ,
{ 0x6777 , 0xC915 , 0xFEAF , 0x00B1 , 0 } ,
{ 0x7762 , 0xC7D9 , 0x025B , 0xFDA6 , 0 } ,
{ 0x6B7A , 0xD2AA , 0xF2FB , 0x0B64 , 0 } ,
{ 0 , 0 , 0 , 0 , 0 }
} ;
static xtalk_coefs_t const asXtalkNarrowCoefsRightXt = {
{ 0x3CB2 , 0xDF49 , 0xF6EA , 0x095B , 0 } ,
{ 0x6777 , 0xC915 , 0xFEAF , 0x00B1 , 0 } ,
{ 0x7762 , 0xC7D9 , 0x025B , 0xFDA6 , 0 } ,
{ 0x6B7A , 0xD2AA , 0xF2FB , 0x0B64 , 0 } ,
{ 0 , 0 , 0 , 0 , 0 }
} ;
2012-01-04 12:16:26 +04:00
static xtalk_coefs_t const asXtalkCoefsZeros = {
{ 0 , 0 , 0 , 0 , 0 } ,
{ 0 , 0 , 0 , 0 , 0 } ,
{ 0 , 0 , 0 , 0 , 0 } ,
{ 0 , 0 , 0 , 0 , 0 } ,
{ 0 , 0 , 0 , 0 , 0 }
} ;
2005-04-17 02:20:36 +04:00
static xtalk_coefs_t const asXtalkCoefsPipe = {
{ 0 , 0 , 0x0FA0 , 0 , 0 } ,
{ 0 , 0 , 0x0FA0 , 0 , 0 } ,
{ 0 , 0 , 0x0FA0 , 0 , 0 } ,
{ 0 , 0 , 0x0FA0 , 0 , 0 } ,
{ 0 , 0 , 0x1180 , 0 , 0 } ,
} ;
static xtalk_coefs_t const asXtalkCoefsNegPipe = {
{ 0 , 0 , 0xF380 , 0 , 0 } ,
{ 0 , 0 , 0xF380 , 0 , 0 } ,
{ 0 , 0 , 0xF380 , 0 , 0 } ,
{ 0 , 0 , 0xF380 , 0 , 0 } ,
{ 0 , 0 , 0xF200 , 0 , 0 }
} ;
static xtalk_coefs_t const asXtalkCoefsNumTest = {
{ 0 , 0 , 0xF380 , 0x8000 , 0x6D60 } ,
{ 0 , 0 , 0 , 0 , 0 } ,
{ 0 , 0 , 0 , 0 , 0 } ,
{ 0 , 0 , 0 , 0 , 0 } ,
{ 0 , 0 , 0 , 0 , 0 }
} ;
static xtalk_coefs_t const asXtalkCoefsDenTest = {
{ 0xC000 , 0x2000 , 0x4000 , 0 , 0 } ,
{ 0 , 0 , 0 , 0 , 0 } ,
{ 0 , 0 , 0 , 0 , 0 } ,
{ 0 , 0 , 0 , 0 , 0 } ,
{ 0 , 0 , 0 , 0 , 0 }
} ;
static xtalk_state_t const asXtalkOutStateTest = {
{ 0x7FFF , 0x0004 , 0xFFFC , 0 } ,
{ 0xFE00 , 0x0008 , 0xFFF8 , 0x4000 } ,
2012-01-04 12:16:26 +04:00
{ 0x0200 , 0x0010 , 0xFFF0 , 0xC000 } ,
2005-04-17 02:20:36 +04:00
{ 0x8000 , 0x0020 , 0xFFE0 , 0 } ,
{ 0 , 0 , 0 , 0 }
} ;
static xtalk_coefs_t const asDiamondCoefsLeftEq = {
{ 0x0F1E , 0x2D05 , 0xF8E3 , 0x07C8 , 0 } ,
{ 0x45E2 , 0xCA51 , 0x0448 , 0xFCE7 , 0 } ,
{ 0xA93E , 0xDBD5 , 0x022C , 0x028A , 0 } ,
{ 0 , 0 , 0 , 0 , 0 } ,
{ 0 , 0 , 0 , 0 , 0 }
} ;
static xtalk_coefs_t const asDiamondCoefsRightEq = {
{ 0x0F1E , 0x2D05 , 0xF8E3 , 0x07C8 , 0 } ,
{ 0x45E2 , 0xCA51 , 0x0448 , 0xFCE7 , 0 } ,
{ 0xA93E , 0xDBD5 , 0x022C , 0x028A , 0 } ,
{ 0 , 0 , 0 , 0 , 0 } ,
{ 0 , 0 , 0 , 0 , 0 }
} ;
static xtalk_coefs_t const asDiamondCoefsLeftXt = {
{ 0x3B50 , 0xFE08 , 0xF959 , 0x0060 , 0 } ,
{ 0x9FCB , 0xD8F1 , 0x00A2 , 0x003A , 0 } ,
{ 0 , 0 , 0 , 0 , 0 } ,
{ 0 , 0 , 0 , 0 , 0 } ,
{ 0 , 0 , 0 , 0 , 0 }
} ;
static xtalk_coefs_t const asDiamondCoefsRightXt = {
{ 0x3B50 , 0xFE08 , 0xF959 , 0x0060 , 0 } ,
{ 0x9FCB , 0xD8F1 , 0x00A2 , 0x003A , 0 } ,
{ 0 , 0 , 0 , 0 , 0 } ,
{ 0 , 0 , 0 , 0 , 0 } ,
{ 0 , 0 , 0 , 0 , 0 }
} ;
/**/
/* XTalk EQ and XT */
static void
vortex_XtalkHw_SetLeftEQ ( vortex_t * vortex , short arg_0 , short arg_4 ,
xtalk_coefs_t const coefs )
{
int i ;
for ( i = 0 ; i < 5 ; i + + ) {
hwwrite ( vortex - > mmio , 0x24200 + i * 0x24 , coefs [ i ] [ 0 ] ) ;
hwwrite ( vortex - > mmio , 0x24204 + i * 0x24 , coefs [ i ] [ 1 ] ) ;
hwwrite ( vortex - > mmio , 0x24208 + i * 0x24 , coefs [ i ] [ 2 ] ) ;
hwwrite ( vortex - > mmio , 0x2420c + i * 0x24 , coefs [ i ] [ 3 ] ) ;
hwwrite ( vortex - > mmio , 0x24210 + i * 0x24 , coefs [ i ] [ 4 ] ) ;
}
hwwrite ( vortex - > mmio , 0x24538 , arg_0 & 0xffff ) ;
hwwrite ( vortex - > mmio , 0x2453C , arg_4 & 0xffff ) ;
}
static void
vortex_XtalkHw_SetRightEQ ( vortex_t * vortex , short arg_0 , short arg_4 ,
xtalk_coefs_t const coefs )
{
int i ;
for ( i = 0 ; i < 5 ; i + + ) {
hwwrite ( vortex - > mmio , 0x242b4 + i * 0x24 , coefs [ i ] [ 0 ] ) ;
hwwrite ( vortex - > mmio , 0x242b8 + i * 0x24 , coefs [ i ] [ 1 ] ) ;
hwwrite ( vortex - > mmio , 0x242bc + i * 0x24 , coefs [ i ] [ 2 ] ) ;
hwwrite ( vortex - > mmio , 0x242c0 + i * 0x24 , coefs [ i ] [ 3 ] ) ;
hwwrite ( vortex - > mmio , 0x242c4 + i * 0x24 , coefs [ i ] [ 4 ] ) ;
}
hwwrite ( vortex - > mmio , 0x24540 , arg_0 & 0xffff ) ;
hwwrite ( vortex - > mmio , 0x24544 , arg_4 & 0xffff ) ;
}
static void
vortex_XtalkHw_SetLeftXT ( vortex_t * vortex , short arg_0 , short arg_4 ,
xtalk_coefs_t const coefs )
{
int i ;
for ( i = 0 ; i < 5 ; i + + ) {
hwwrite ( vortex - > mmio , 0x24368 + i * 0x24 , coefs [ i ] [ 0 ] ) ;
hwwrite ( vortex - > mmio , 0x2436c + i * 0x24 , coefs [ i ] [ 1 ] ) ;
hwwrite ( vortex - > mmio , 0x24370 + i * 0x24 , coefs [ i ] [ 2 ] ) ;
hwwrite ( vortex - > mmio , 0x24374 + i * 0x24 , coefs [ i ] [ 3 ] ) ;
hwwrite ( vortex - > mmio , 0x24378 + i * 0x24 , coefs [ i ] [ 4 ] ) ;
}
hwwrite ( vortex - > mmio , 0x24548 , arg_0 & 0xffff ) ;
hwwrite ( vortex - > mmio , 0x2454C , arg_4 & 0xffff ) ;
}
static void
vortex_XtalkHw_SetRightXT ( vortex_t * vortex , short arg_0 , short arg_4 ,
xtalk_coefs_t const coefs )
{
int i ;
for ( i = 0 ; i < 5 ; i + + ) {
hwwrite ( vortex - > mmio , 0x2441C + i * 0x24 , coefs [ i ] [ 0 ] ) ;
hwwrite ( vortex - > mmio , 0x24420 + i * 0x24 , coefs [ i ] [ 1 ] ) ;
hwwrite ( vortex - > mmio , 0x24424 + i * 0x24 , coefs [ i ] [ 2 ] ) ;
hwwrite ( vortex - > mmio , 0x24428 + i * 0x24 , coefs [ i ] [ 3 ] ) ;
hwwrite ( vortex - > mmio , 0x2442C + i * 0x24 , coefs [ i ] [ 4 ] ) ;
}
hwwrite ( vortex - > mmio , 0x24550 , arg_0 & 0xffff ) ;
hwwrite ( vortex - > mmio , 0x24554 , arg_4 & 0xffff ) ;
}
static void
vortex_XtalkHw_SetLeftEQStates ( vortex_t * vortex ,
xtalk_instate_t const arg_0 ,
xtalk_state_t const coefs )
{
int i ;
for ( i = 0 ; i < 5 ; i + + ) {
hwwrite ( vortex - > mmio , 0x24214 + i * 0x24 , coefs [ i ] [ 0 ] ) ;
hwwrite ( vortex - > mmio , 0x24218 + i * 0x24 , coefs [ i ] [ 1 ] ) ;
hwwrite ( vortex - > mmio , 0x2421C + i * 0x24 , coefs [ i ] [ 2 ] ) ;
hwwrite ( vortex - > mmio , 0x24220 + i * 0x24 , coefs [ i ] [ 3 ] ) ;
}
2012-01-04 11:42:44 +04:00
hwwrite ( vortex - > mmio , 0x244F8 , arg_0 [ 0 ] ) ;
hwwrite ( vortex - > mmio , 0x244FC , arg_0 [ 1 ] ) ;
hwwrite ( vortex - > mmio , 0x24500 , arg_0 [ 2 ] ) ;
hwwrite ( vortex - > mmio , 0x24504 , arg_0 [ 3 ] ) ;
2005-04-17 02:20:36 +04:00
}
static void
vortex_XtalkHw_SetRightEQStates ( vortex_t * vortex ,
xtalk_instate_t const arg_0 ,
xtalk_state_t const coefs )
{
int i ;
for ( i = 0 ; i < 5 ; i + + ) {
hwwrite ( vortex - > mmio , 0x242C8 + i * 0x24 , coefs [ i ] [ 0 ] ) ;
hwwrite ( vortex - > mmio , 0x242CC + i * 0x24 , coefs [ i ] [ 1 ] ) ;
hwwrite ( vortex - > mmio , 0x242D0 + i * 0x24 , coefs [ i ] [ 2 ] ) ;
hwwrite ( vortex - > mmio , 0x244D4 + i * 0x24 , coefs [ i ] [ 3 ] ) ;
}
2012-01-04 11:42:44 +04:00
hwwrite ( vortex - > mmio , 0x24508 , arg_0 [ 0 ] ) ;
hwwrite ( vortex - > mmio , 0x2450C , arg_0 [ 1 ] ) ;
hwwrite ( vortex - > mmio , 0x24510 , arg_0 [ 2 ] ) ;
hwwrite ( vortex - > mmio , 0x24514 , arg_0 [ 3 ] ) ;
2005-04-17 02:20:36 +04:00
}
static void
vortex_XtalkHw_SetLeftXTStates ( vortex_t * vortex ,
xtalk_instate_t const arg_0 ,
xtalk_state_t const coefs )
{
int i ;
for ( i = 0 ; i < 5 ; i + + ) {
hwwrite ( vortex - > mmio , 0x2437C + i * 0x24 , coefs [ i ] [ 0 ] ) ;
hwwrite ( vortex - > mmio , 0x24380 + i * 0x24 , coefs [ i ] [ 1 ] ) ;
hwwrite ( vortex - > mmio , 0x24384 + i * 0x24 , coefs [ i ] [ 2 ] ) ;
hwwrite ( vortex - > mmio , 0x24388 + i * 0x24 , coefs [ i ] [ 3 ] ) ;
}
2012-01-04 11:42:44 +04:00
hwwrite ( vortex - > mmio , 0x24518 , arg_0 [ 0 ] ) ;
hwwrite ( vortex - > mmio , 0x2451C , arg_0 [ 1 ] ) ;
hwwrite ( vortex - > mmio , 0x24520 , arg_0 [ 2 ] ) ;
hwwrite ( vortex - > mmio , 0x24524 , arg_0 [ 3 ] ) ;
2005-04-17 02:20:36 +04:00
}
static void
vortex_XtalkHw_SetRightXTStates ( vortex_t * vortex ,
xtalk_instate_t const arg_0 ,
xtalk_state_t const coefs )
{
int i ;
for ( i = 0 ; i < 5 ; i + + ) {
hwwrite ( vortex - > mmio , 0x24430 + i * 0x24 , coefs [ i ] [ 0 ] ) ;
hwwrite ( vortex - > mmio , 0x24434 + i * 0x24 , coefs [ i ] [ 1 ] ) ;
hwwrite ( vortex - > mmio , 0x24438 + i * 0x24 , coefs [ i ] [ 2 ] ) ;
hwwrite ( vortex - > mmio , 0x2443C + i * 0x24 , coefs [ i ] [ 3 ] ) ;
}
2012-01-04 11:42:44 +04:00
hwwrite ( vortex - > mmio , 0x24528 , arg_0 [ 0 ] ) ;
hwwrite ( vortex - > mmio , 0x2452C , arg_0 [ 1 ] ) ;
hwwrite ( vortex - > mmio , 0x24530 , arg_0 [ 2 ] ) ;
hwwrite ( vortex - > mmio , 0x24534 , arg_0 [ 3 ] ) ;
2005-04-17 02:20:36 +04:00
}
#if 0
static void
vortex_XtalkHw_GetLeftEQ ( vortex_t * vortex , short * arg_0 , short * arg_4 ,
xtalk_coefs_t coefs )
{
int i ;
for ( i = 0 ; i < 5 ; i + + ) {
coefs [ i ] [ 0 ] = hwread ( vortex - > mmio , 0x24200 + i * 0x24 ) ;
coefs [ i ] [ 1 ] = hwread ( vortex - > mmio , 0x24204 + i * 0x24 ) ;
coefs [ i ] [ 2 ] = hwread ( vortex - > mmio , 0x24208 + i * 0x24 ) ;
coefs [ i ] [ 3 ] = hwread ( vortex - > mmio , 0x2420c + i * 0x24 ) ;
coefs [ i ] [ 4 ] = hwread ( vortex - > mmio , 0x24210 + i * 0x24 ) ;
}
* arg_0 = hwread ( vortex - > mmio , 0x24538 ) & 0xffff ;
* arg_4 = hwread ( vortex - > mmio , 0x2453c ) & 0xffff ;
}
static void
vortex_XtalkHw_GetRightEQ ( vortex_t * vortex , short * arg_0 , short * arg_4 ,
xtalk_coefs_t coefs )
{
int i ;
for ( i = 0 ; i < 5 ; i + + ) {
coefs [ i ] [ 0 ] = hwread ( vortex - > mmio , 0x242b4 + i * 0x24 ) ;
coefs [ i ] [ 1 ] = hwread ( vortex - > mmio , 0x242b8 + i * 0x24 ) ;
coefs [ i ] [ 2 ] = hwread ( vortex - > mmio , 0x242bc + i * 0x24 ) ;
coefs [ i ] [ 3 ] = hwread ( vortex - > mmio , 0x242c0 + i * 0x24 ) ;
coefs [ i ] [ 4 ] = hwread ( vortex - > mmio , 0x242c4 + i * 0x24 ) ;
}
* arg_0 = hwread ( vortex - > mmio , 0x24540 ) & 0xffff ;
* arg_4 = hwread ( vortex - > mmio , 0x24544 ) & 0xffff ;
}
static void
vortex_XtalkHw_GetLeftXT ( vortex_t * vortex , short * arg_0 , short * arg_4 ,
xtalk_coefs_t coefs )
{
int i ;
for ( i = 0 ; i < 5 ; i + + ) {
coefs [ i ] [ 0 ] = hwread ( vortex - > mmio , 0x24368 + i * 0x24 ) ;
coefs [ i ] [ 1 ] = hwread ( vortex - > mmio , 0x2436C + i * 0x24 ) ;
coefs [ i ] [ 2 ] = hwread ( vortex - > mmio , 0x24370 + i * 0x24 ) ;
coefs [ i ] [ 3 ] = hwread ( vortex - > mmio , 0x24374 + i * 0x24 ) ;
coefs [ i ] [ 4 ] = hwread ( vortex - > mmio , 0x24378 + i * 0x24 ) ;
}
* arg_0 = hwread ( vortex - > mmio , 0x24548 ) & 0xffff ;
* arg_4 = hwread ( vortex - > mmio , 0x2454C ) & 0xffff ;
}
static void
vortex_XtalkHw_GetRightXT ( vortex_t * vortex , short * arg_0 , short * arg_4 ,
xtalk_coefs_t coefs )
{
int i ;
for ( i = 0 ; i < 5 ; i + + ) {
coefs [ i ] [ 0 ] = hwread ( vortex - > mmio , 0x2441C + i * 0x24 ) ;
coefs [ i ] [ 1 ] = hwread ( vortex - > mmio , 0x24420 + i * 0x24 ) ;
coefs [ i ] [ 2 ] = hwread ( vortex - > mmio , 0x24424 + i * 0x24 ) ;
coefs [ i ] [ 3 ] = hwread ( vortex - > mmio , 0x24428 + i * 0x24 ) ;
coefs [ i ] [ 4 ] = hwread ( vortex - > mmio , 0x2442C + i * 0x24 ) ;
}
* arg_0 = hwread ( vortex - > mmio , 0x24550 ) & 0xffff ;
* arg_4 = hwread ( vortex - > mmio , 0x24554 ) & 0xffff ;
}
static void
vortex_XtalkHw_GetLeftEQStates ( vortex_t * vortex , xtalk_instate_t arg_0 ,
xtalk_state_t coefs )
{
int i ;
for ( i = 0 ; i < 5 ; i + + ) {
coefs [ i ] [ 0 ] = hwread ( vortex - > mmio , 0x24214 + i * 0x24 ) ;
coefs [ i ] [ 1 ] = hwread ( vortex - > mmio , 0x24218 + i * 0x24 ) ;
coefs [ i ] [ 2 ] = hwread ( vortex - > mmio , 0x2421C + i * 0x24 ) ;
coefs [ i ] [ 3 ] = hwread ( vortex - > mmio , 0x24220 + i * 0x24 ) ;
}
2012-01-04 11:42:44 +04:00
arg_0 [ 0 ] = hwread ( vortex - > mmio , 0x244F8 ) ;
arg_0 [ 1 ] = hwread ( vortex - > mmio , 0x244FC ) ;
arg_0 [ 2 ] = hwread ( vortex - > mmio , 0x24500 ) ;
arg_0 [ 3 ] = hwread ( vortex - > mmio , 0x24504 ) ;
2005-04-17 02:20:36 +04:00
}
static void
vortex_XtalkHw_GetRightEQStates ( vortex_t * vortex , xtalk_instate_t arg_0 ,
xtalk_state_t coefs )
{
int i ;
for ( i = 0 ; i < 5 ; i + + ) {
coefs [ i ] [ 0 ] = hwread ( vortex - > mmio , 0x242C8 + i * 0x24 ) ;
coefs [ i ] [ 1 ] = hwread ( vortex - > mmio , 0x242CC + i * 0x24 ) ;
coefs [ i ] [ 2 ] = hwread ( vortex - > mmio , 0x242D0 + i * 0x24 ) ;
coefs [ i ] [ 3 ] = hwread ( vortex - > mmio , 0x242D4 + i * 0x24 ) ;
}
2012-01-04 11:42:44 +04:00
arg_0 [ 0 ] = hwread ( vortex - > mmio , 0x24508 ) ;
arg_0 [ 1 ] = hwread ( vortex - > mmio , 0x2450C ) ;
arg_0 [ 2 ] = hwread ( vortex - > mmio , 0x24510 ) ;
arg_0 [ 3 ] = hwread ( vortex - > mmio , 0x24514 ) ;
2005-04-17 02:20:36 +04:00
}
static void
vortex_XtalkHw_GetLeftXTStates ( vortex_t * vortex , xtalk_instate_t arg_0 ,
xtalk_state_t coefs )
{
int i ;
for ( i = 0 ; i < 5 ; i + + ) {
coefs [ i ] [ 0 ] = hwread ( vortex - > mmio , 0x2437C + i * 0x24 ) ;
coefs [ i ] [ 1 ] = hwread ( vortex - > mmio , 0x24380 + i * 0x24 ) ;
coefs [ i ] [ 2 ] = hwread ( vortex - > mmio , 0x24384 + i * 0x24 ) ;
coefs [ i ] [ 3 ] = hwread ( vortex - > mmio , 0x24388 + i * 0x24 ) ;
}
2012-01-04 11:42:44 +04:00
arg_0 [ 0 ] = hwread ( vortex - > mmio , 0x24518 ) ;
arg_0 [ 1 ] = hwread ( vortex - > mmio , 0x2451C ) ;
arg_0 [ 2 ] = hwread ( vortex - > mmio , 0x24520 ) ;
arg_0 [ 3 ] = hwread ( vortex - > mmio , 0x24524 ) ;
2005-04-17 02:20:36 +04:00
}
static void
vortex_XtalkHw_GetRightXTStates ( vortex_t * vortex , xtalk_instate_t arg_0 ,
xtalk_state_t coefs )
{
int i ;
for ( i = 0 ; i < 5 ; i + + ) {
coefs [ i ] [ 0 ] = hwread ( vortex - > mmio , 0x24430 + i * 0x24 ) ;
coefs [ i ] [ 1 ] = hwread ( vortex - > mmio , 0x24434 + i * 0x24 ) ;
coefs [ i ] [ 2 ] = hwread ( vortex - > mmio , 0x24438 + i * 0x24 ) ;
coefs [ i ] [ 3 ] = hwread ( vortex - > mmio , 0x2443C + i * 0x24 ) ;
}
2012-01-04 11:42:44 +04:00
arg_0 [ 0 ] = hwread ( vortex - > mmio , 0x24528 ) ;
arg_0 [ 1 ] = hwread ( vortex - > mmio , 0x2452C ) ;
arg_0 [ 2 ] = hwread ( vortex - > mmio , 0x24530 ) ;
arg_0 [ 3 ] = hwread ( vortex - > mmio , 0x24534 ) ;
2005-04-17 02:20:36 +04:00
}
# endif
/* Gains */
static void
vortex_XtalkHw_SetGains ( vortex_t * vortex , xtalk_gains_t const gains )
{
int i ;
for ( i = 0 ; i < XTGAINS_SZ ; i + + ) {
hwwrite ( vortex - > mmio , 0x244D0 + ( i * 4 ) , gains [ i ] ) ;
}
}
static void
vortex_XtalkHw_SetGainsAllChan ( vortex_t * vortex )
{
vortex_XtalkHw_SetGains ( vortex , asXtalkGainsAllChan ) ;
}
#if 0
static void vortex_XtalkHw_GetGains ( vortex_t * vortex , xtalk_gains_t gains )
{
int i ;
for ( i = 0 ; i < XTGAINS_SZ ; i + + )
gains [ i ] = hwread ( vortex - > mmio , 0x244D0 + i * 4 ) ;
}
# endif
/* Delay parameters */
static void
vortex_XtalkHw_SetDelay ( vortex_t * vortex , unsigned short right ,
unsigned short left )
{
2006-01-13 19:16:29 +03:00
u32 esp0 = 0 ;
2005-04-17 02:20:36 +04:00
esp0 & = 0x1FFFFFFF ;
esp0 | = 0xA0000000 ;
esp0 = ( esp0 & 0xffffE0ff ) | ( ( right & 0x1F ) < < 8 ) ;
esp0 = ( esp0 & 0xfffc1fff ) | ( ( left & 0x1F ) < < 0xd ) ;
hwwrite ( vortex - > mmio , 0x24660 , esp0 ) ;
}
static void
vortex_XtalkHw_SetLeftDline ( vortex_t * vortex , xtalk_dline_t const dline )
{
int i ;
for ( i = 0 ; i < 0x20 ; i + + ) {
hwwrite ( vortex - > mmio , 0x24000 + ( i < < 2 ) , dline [ i ] & 0xffff ) ;
hwwrite ( vortex - > mmio , 0x24080 + ( i < < 2 ) , dline [ i ] > > 0x10 ) ;
}
}
static void
vortex_XtalkHw_SetRightDline ( vortex_t * vortex , xtalk_dline_t const dline )
{
int i ;
for ( i = 0 ; i < 0x20 ; i + + ) {
hwwrite ( vortex - > mmio , 0x24100 + ( i < < 2 ) , dline [ i ] & 0xffff ) ;
hwwrite ( vortex - > mmio , 0x24180 + ( i < < 2 ) , dline [ i ] > > 0x10 ) ;
}
}
#if 0
static void
vortex_XtalkHw_GetDelay ( vortex_t * vortex , unsigned short * right ,
unsigned short * left )
{
int esp0 ;
esp0 = hwread ( vortex - > mmio , 0x24660 ) ;
* right = ( esp0 > > 8 ) & 0x1f ;
* left = ( esp0 > > 0xd ) & 0x1f ;
}
static void vortex_XtalkHw_GetLeftDline ( vortex_t * vortex , xtalk_dline_t dline )
{
int i ;
for ( i = 0 ; i < 0x20 ; i + + ) {
dline [ i ] =
( hwread ( vortex - > mmio , 0x24000 + ( i < < 2 ) ) & 0xffff ) |
( hwread ( vortex - > mmio , 0x24080 + ( i < < 2 ) ) < < 0x10 ) ;
}
}
static void vortex_XtalkHw_GetRightDline ( vortex_t * vortex , xtalk_dline_t dline )
{
int i ;
for ( i = 0 ; i < 0x20 ; i + + ) {
dline [ i ] =
( hwread ( vortex - > mmio , 0x24100 + ( i < < 2 ) ) & 0xffff ) |
( hwread ( vortex - > mmio , 0x24180 + ( i < < 2 ) ) < < 0x10 ) ;
}
}
# endif
/* Control/Global stuff */
#if 0
2006-01-13 19:16:29 +03:00
static void vortex_XtalkHw_SetControlReg ( vortex_t * vortex , u32 ctrl )
2005-04-17 02:20:36 +04:00
{
hwwrite ( vortex - > mmio , 0x24660 , ctrl ) ;
}
2006-01-13 19:16:29 +03:00
static void vortex_XtalkHw_GetControlReg ( vortex_t * vortex , u32 * ctrl )
2005-04-17 02:20:36 +04:00
{
* ctrl = hwread ( vortex - > mmio , 0x24660 ) ;
}
# endif
2006-01-13 19:16:29 +03:00
static void vortex_XtalkHw_SetSampleRate ( vortex_t * vortex , u32 sr )
2005-04-17 02:20:36 +04:00
{
2006-01-13 19:16:29 +03:00
u32 temp ;
2005-04-17 02:20:36 +04:00
temp = ( hwread ( vortex - > mmio , 0x24660 ) & 0x1FFFFFFF ) | 0xC0000000 ;
temp = ( temp & 0xffffff07 ) | ( ( sr & 0x1f ) < < 3 ) ;
hwwrite ( vortex - > mmio , 0x24660 , temp ) ;
}
#if 0
2006-01-13 19:16:29 +03:00
static void vortex_XtalkHw_GetSampleRate ( vortex_t * vortex , u32 * sr )
2005-04-17 02:20:36 +04:00
{
* sr = ( hwread ( vortex - > mmio , 0x24660 ) > > 3 ) & 0x1f ;
}
# endif
static void vortex_XtalkHw_Enable ( vortex_t * vortex )
{
2006-01-13 19:16:29 +03:00
u32 temp ;
2005-04-17 02:20:36 +04:00
temp = ( hwread ( vortex - > mmio , 0x24660 ) & 0x1FFFFFFF ) | 0xC0000000 ;
temp | = 1 ;
hwwrite ( vortex - > mmio , 0x24660 , temp ) ;
}
static void vortex_XtalkHw_Disable ( vortex_t * vortex )
{
2006-01-13 19:16:29 +03:00
u32 temp ;
2005-04-17 02:20:36 +04:00
temp = ( hwread ( vortex - > mmio , 0x24660 ) & 0x1FFFFFFF ) | 0xC0000000 ;
temp & = 0xfffffffe ;
hwwrite ( vortex - > mmio , 0x24660 , temp ) ;
}
static void vortex_XtalkHw_ZeroIO ( vortex_t * vortex )
{
int i ;
for ( i = 0 ; i < 20 ; i + + )
hwwrite ( vortex - > mmio , 0x24600 + ( i < < 2 ) , 0 ) ;
for ( i = 0 ; i < 4 ; i + + )
hwwrite ( vortex - > mmio , 0x24650 + ( i < < 2 ) , 0 ) ;
}
static void vortex_XtalkHw_ZeroState ( vortex_t * vortex )
{
vortex_XtalkHw_ZeroIO ( vortex ) ; // inlined
vortex_XtalkHw_SetLeftEQ ( vortex , 0 , 0 , asXtalkCoefsZeros ) ;
vortex_XtalkHw_SetRightEQ ( vortex , 0 , 0 , asXtalkCoefsZeros ) ;
vortex_XtalkHw_SetLeftXT ( vortex , 0 , 0 , asXtalkCoefsZeros ) ;
vortex_XtalkHw_SetRightXT ( vortex , 0 , 0 , asXtalkCoefsZeros ) ;
vortex_XtalkHw_SetGains ( vortex , asXtalkGainsZeros ) ; // inlined
vortex_XtalkHw_SetDelay ( vortex , 0 , 0 ) ; // inlined
vortex_XtalkHw_SetLeftDline ( vortex , alXtalkDlineZeros ) ; // inlined
vortex_XtalkHw_SetRightDline ( vortex , alXtalkDlineZeros ) ; // inlined
vortex_XtalkHw_SetLeftDline ( vortex , alXtalkDlineZeros ) ; // inlined
vortex_XtalkHw_SetRightDline ( vortex , alXtalkDlineZeros ) ; // inlined
vortex_XtalkHw_SetLeftEQStates ( vortex , asXtalkInStateZeros ,
asXtalkOutStateZeros ) ;
vortex_XtalkHw_SetRightEQStates ( vortex , asXtalkInStateZeros ,
asXtalkOutStateZeros ) ;
vortex_XtalkHw_SetLeftXTStates ( vortex , asXtalkInStateZeros ,
asXtalkOutStateZeros ) ;
vortex_XtalkHw_SetRightXTStates ( vortex , asXtalkInStateZeros ,
asXtalkOutStateZeros ) ;
}
static void vortex_XtalkHw_ProgramPipe ( vortex_t * vortex )
{
vortex_XtalkHw_SetLeftEQ ( vortex , 0 , 1 , asXtalkCoefsPipe ) ;
vortex_XtalkHw_SetRightEQ ( vortex , 0 , 1 , asXtalkCoefsPipe ) ;
vortex_XtalkHw_SetLeftXT ( vortex , 0 , 0 , asXtalkCoefsZeros ) ;
vortex_XtalkHw_SetRightXT ( vortex , 0 , 0 , asXtalkCoefsZeros ) ;
vortex_XtalkHw_SetDelay ( vortex , 0 , 0 ) ; // inlined
}
static void vortex_XtalkHw_ProgramXtalkWide ( vortex_t * vortex )
{
vortex_XtalkHw_SetLeftEQ ( vortex , sXtalkWideKLeftEq ,
sXtalkWideShiftLeftEq , asXtalkWideCoefsLeftEq ) ;
vortex_XtalkHw_SetRightEQ ( vortex , sXtalkWideKRightEq ,
sXtalkWideShiftRightEq ,
asXtalkWideCoefsRightEq ) ;
vortex_XtalkHw_SetLeftXT ( vortex , sXtalkWideKLeftXt ,
sXtalkWideShiftLeftXt , asXtalkWideCoefsLeftXt ) ;
vortex_XtalkHw_SetRightXT ( vortex , sXtalkWideKLeftXt ,
sXtalkWideShiftLeftXt ,
asXtalkWideCoefsLeftXt ) ;
vortex_XtalkHw_SetDelay ( vortex , wXtalkWideRightDelay , wXtalkWideLeftDelay ) ; // inlined
}
static void vortex_XtalkHw_ProgramXtalkNarrow ( vortex_t * vortex )
{
vortex_XtalkHw_SetLeftEQ ( vortex , sXtalkNarrowKLeftEq ,
sXtalkNarrowShiftLeftEq ,
asXtalkNarrowCoefsLeftEq ) ;
vortex_XtalkHw_SetRightEQ ( vortex , sXtalkNarrowKRightEq ,
sXtalkNarrowShiftRightEq ,
asXtalkNarrowCoefsRightEq ) ;
vortex_XtalkHw_SetLeftXT ( vortex , sXtalkNarrowKLeftXt ,
sXtalkNarrowShiftLeftXt ,
asXtalkNarrowCoefsLeftXt ) ;
vortex_XtalkHw_SetRightXT ( vortex , sXtalkNarrowKLeftXt ,
sXtalkNarrowShiftLeftXt ,
asXtalkNarrowCoefsLeftXt ) ;
vortex_XtalkHw_SetDelay ( vortex , wXtalkNarrowRightDelay , wXtalkNarrowLeftDelay ) ; // inlined
}
static void vortex_XtalkHw_ProgramDiamondXtalk ( vortex_t * vortex )
{
//sDiamondKLeftEq,sDiamondKRightXt,asDiamondCoefsLeftEq
vortex_XtalkHw_SetLeftEQ ( vortex , sDiamondKLeftEq ,
sDiamondShiftLeftEq , asDiamondCoefsLeftEq ) ;
vortex_XtalkHw_SetRightEQ ( vortex , sDiamondKRightEq ,
sDiamondShiftRightEq , asDiamondCoefsRightEq ) ;
vortex_XtalkHw_SetLeftXT ( vortex , sDiamondKLeftXt ,
sDiamondShiftLeftXt , asDiamondCoefsLeftXt ) ;
vortex_XtalkHw_SetRightXT ( vortex , sDiamondKLeftXt ,
sDiamondShiftLeftXt , asDiamondCoefsLeftXt ) ;
vortex_XtalkHw_SetDelay ( vortex , wDiamondRightDelay , wDiamondLeftDelay ) ; // inlined
}
static void vortex_XtalkHw_init ( vortex_t * vortex )
{
vortex_XtalkHw_ZeroState ( vortex ) ;
}
/* End of file */