/***************************************************************************
 *            au88x0_cxtalk.c
 *
 *  Wed Nov 19 16:29:47 2003
 *  Copyright  2003  mjander
 *  mjander@users.sourceforge.org
 ****************************************************************************/

/*
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Library General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */

#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 = {
	0x4000, 0x4000, 0x4000, 0x4000, 0x4000,
	0x4000, 0x4000, 0x4000, 0x4000,	0x4000
};

static xtalk_gains_t const asXtalkGainsTest = {
	0x7fff, 0x8000, 0x0000, 0x0000, 0x0001,
	0xffff, 0x4000, 0xc000, 0x0002, 0xfffe
};

static xtalk_gains_t const asXtalkGains1Chan = {
	0x7FFF, 0, 0, 0, 0,
	0x7FFF, 0, 0, 0, 0,
};

// Input gain for 4 A3D slices. One possible input pair is left zero.
static xtalk_gains_t const asXtalkGainsAllChan = {
	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
};

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
};
static xtalk_dline_t const alXtalkDlineTest = {
	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 = {
	0, 0, 0, 0
};

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}
};

static short const sDiamondKLeftEq = 0x401d;
static short const sDiamondKRightEq = 0x401d;
static short const sDiamondKLeftXt = 0xF90E;
static short const sDiamondKRightXt = 0xF90E;
static short const sDiamondShiftLeftEq = 1;
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},
	{0x340B, 0xe8f5, 0x236c, 0xe40d, 0},
	{0x76d5, 0xc78d, 0x05ac, 0xfa5b, 0},
	{0x7F04, 0xC0FA, 0x0263, 0xFDA2, 0}
};
static xtalk_coefs_t const asXtalkWideCoefsRightEq = {
	{0xEC4C, 0xDCE9, 0xFDC2, 0xFEEC, 0},
	{0x5F60, 0xCBCB, 0xFC26, 0x0305, 0},
	{0x340B, 0xe8f5, 0x236c, 0xe40d, 0},
	{0x76d5, 0xc78d, 0x05ac, 0xfa5b, 0},
	{0x7F04, 0xC0FA, 0x0263, 0xFDA2, 0}
};
static xtalk_coefs_t const asXtalkWideCoefsLeftXt = {
	{0x55c6, 0xc97b, 0x005b, 0x0047, 0},
	{0x6a60, 0xca20, 0xffc6, 0x0040, 0},
	{0x6411, 0xd711, 0xfca1, 0x0190, 0},
	{0x77dc, 0xc79e, 0xffb8, 0x000a, 0},
	{0, 0, 0, 0, 0}
};
static xtalk_coefs_t const asXtalkWideCoefsRightXt = {
	{0x55c6, 0xc97b, 0x005b, 0x0047, 0},
	{0x6a60, 0xca20, 0xffc6, 0x0040, 0},
	{0x6411, 0xd711, 0xfca1, 0x0190, 0},
	{0x77dc, 0xc79e, 0xffb8, 0x000a, 0},
	{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}
};

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}
};

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},
	{0x0200, 0x0010, 0xFFF0, 0xC000},
	{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]);
	}
	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]);
}

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]);
	}
	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]);
}

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]);
	}
	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]);
}

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]);
	}
	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]);
}

#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);
	}
	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);
}

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);
	}
	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);
}

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);
	}
	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);
}

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);
	}
	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);
}

#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)
{
	u32 esp0 = 0;

	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
static void vortex_XtalkHw_SetControlReg(vortex_t * vortex, u32 ctrl)
{
	hwwrite(vortex->mmio, 0x24660, ctrl);
}
static void vortex_XtalkHw_GetControlReg(vortex_t * vortex, u32 *ctrl)
{
	*ctrl = hwread(vortex->mmio, 0x24660);
}
#endif
static void vortex_XtalkHw_SetSampleRate(vortex_t * vortex, u32 sr)
{
	u32 temp;

	temp = (hwread(vortex->mmio, 0x24660) & 0x1FFFFFFF) | 0xC0000000;
	temp = (temp & 0xffffff07) | ((sr & 0x1f) << 3);
	hwwrite(vortex->mmio, 0x24660, temp);
}

#if 0
static void vortex_XtalkHw_GetSampleRate(vortex_t * vortex, u32 *sr)
{
	*sr = (hwread(vortex->mmio, 0x24660) >> 3) & 0x1f;
}

#endif
static void vortex_XtalkHw_Enable(vortex_t * vortex)
{
	u32 temp;

	temp = (hwread(vortex->mmio, 0x24660) & 0x1FFFFFFF) | 0xC0000000;
	temp |= 1;
	hwwrite(vortex->mmio, 0x24660, temp);

}

static void vortex_XtalkHw_Disable(vortex_t * vortex)
{
	u32 temp;

	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 */
