xref: /openbmc/linux/sound/pci/au88x0/au88x0_a3d.c (revision c2b0718f)
1005fdd53SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
21da177e4SLinus Torvalds /***************************************************************************
31da177e4SLinus Torvalds  *            au88x0_a3d.c
41da177e4SLinus Torvalds  *
51da177e4SLinus Torvalds  *  Fri Jul 18 14:16:22 2003
61da177e4SLinus Torvalds  *  Copyright  2003  mjander
71da177e4SLinus Torvalds  *  mjander@users.sourceforge.net
81da177e4SLinus Torvalds  *
91da177e4SLinus Torvalds  * A3D. You may think i'm crazy, but this may work someday. Who knows...
101da177e4SLinus Torvalds  ****************************************************************************/
111da177e4SLinus Torvalds 
121da177e4SLinus Torvalds /*
131da177e4SLinus Torvalds  */
141da177e4SLinus Torvalds 
151da177e4SLinus Torvalds #include "au88x0_a3d.h"
161da177e4SLinus Torvalds #include "au88x0_a3ddata.c"
171da177e4SLinus Torvalds #include "au88x0_xtalk.h"
181da177e4SLinus Torvalds #include "au88x0.h"
191da177e4SLinus Torvalds 
201da177e4SLinus Torvalds static void
a3dsrc_SetTimeConsts(a3dsrc_t * a,short HrtfTrack,short ItdTrack,short GTrack,short CTrack)211da177e4SLinus Torvalds a3dsrc_SetTimeConsts(a3dsrc_t * a, short HrtfTrack, short ItdTrack,
221da177e4SLinus Torvalds 		     short GTrack, short CTrack)
231da177e4SLinus Torvalds {
241da177e4SLinus Torvalds 	vortex_t *vortex = (vortex_t *) (a->vortex);
251da177e4SLinus Torvalds 	hwwrite(vortex->mmio,
261da177e4SLinus Torvalds 		a3d_addrA(a->slice, a->source, A3D_A_HrtfTrackTC), HrtfTrack);
271da177e4SLinus Torvalds 	hwwrite(vortex->mmio,
281da177e4SLinus Torvalds 		a3d_addrA(a->slice, a->source, A3D_A_ITDTrackTC), ItdTrack);
291da177e4SLinus Torvalds 	hwwrite(vortex->mmio,
301da177e4SLinus Torvalds 		a3d_addrA(a->slice, a->source, A3D_A_GainTrackTC), GTrack);
311da177e4SLinus Torvalds 	hwwrite(vortex->mmio,
321da177e4SLinus Torvalds 		a3d_addrA(a->slice, a->source, A3D_A_CoeffTrackTC), CTrack);
331da177e4SLinus Torvalds }
341da177e4SLinus Torvalds 
351da177e4SLinus Torvalds #if 0
361da177e4SLinus Torvalds static void
371da177e4SLinus Torvalds a3dsrc_GetTimeConsts(a3dsrc_t * a, short *HrtfTrack, short *ItdTrack,
381da177e4SLinus Torvalds 		     short *GTrack, short *CTrack)
391da177e4SLinus Torvalds {
401da177e4SLinus Torvalds 	// stub!
411da177e4SLinus Torvalds }
421da177e4SLinus Torvalds 
431da177e4SLinus Torvalds #endif
4425985edcSLucas De Marchi /* Atmospheric absorption. */
451da177e4SLinus Torvalds 
461da177e4SLinus Torvalds static void
a3dsrc_SetAtmosTarget(a3dsrc_t * a,short aa,short b,short c,short d,short e)471da177e4SLinus Torvalds a3dsrc_SetAtmosTarget(a3dsrc_t * a, short aa, short b, short c, short d,
481da177e4SLinus Torvalds 		      short e)
491da177e4SLinus Torvalds {
501da177e4SLinus Torvalds 	vortex_t *vortex = (vortex_t *) (a->vortex);
511da177e4SLinus Torvalds 	hwwrite(vortex->mmio,
521da177e4SLinus Torvalds 		a3d_addrB(a->slice, a->source, A3D_B_A21Target),
531da177e4SLinus Torvalds 		(e << 0x10) | d);
541da177e4SLinus Torvalds 	hwwrite(vortex->mmio,
551da177e4SLinus Torvalds 		a3d_addrB(a->slice, a->source, A3D_B_B10Target),
561da177e4SLinus Torvalds 		(b << 0x10) | aa);
571da177e4SLinus Torvalds 	hwwrite(vortex->mmio,
581da177e4SLinus Torvalds 		a3d_addrB(a->slice, a->source, A3D_B_B2Target), c);
591da177e4SLinus Torvalds }
601da177e4SLinus Torvalds 
611da177e4SLinus Torvalds static void
a3dsrc_SetAtmosCurrent(a3dsrc_t * a,short aa,short b,short c,short d,short e)621da177e4SLinus Torvalds a3dsrc_SetAtmosCurrent(a3dsrc_t * a, short aa, short b, short c, short d,
631da177e4SLinus Torvalds 		       short e)
641da177e4SLinus Torvalds {
651da177e4SLinus Torvalds 	vortex_t *vortex = (vortex_t *) (a->vortex);
661da177e4SLinus Torvalds 	hwwrite(vortex->mmio,
671da177e4SLinus Torvalds 		a3d_addrB(a->slice, a->source, A3D_B_A12Current),
681da177e4SLinus Torvalds 		(e << 0x10) | d);
691da177e4SLinus Torvalds 	hwwrite(vortex->mmio,
701da177e4SLinus Torvalds 		a3d_addrB(a->slice, a->source, A3D_B_B01Current),
711da177e4SLinus Torvalds 		(b << 0x10) | aa);
721da177e4SLinus Torvalds 	hwwrite(vortex->mmio,
731da177e4SLinus Torvalds 		a3d_addrB(a->slice, a->source, A3D_B_B2Current), c);
741da177e4SLinus Torvalds }
751da177e4SLinus Torvalds 
761da177e4SLinus Torvalds static void
a3dsrc_SetAtmosState(a3dsrc_t * a,short x1,short x2,short y1,short y2)771da177e4SLinus Torvalds a3dsrc_SetAtmosState(a3dsrc_t * a, short x1, short x2, short y1, short y2)
781da177e4SLinus Torvalds {
791da177e4SLinus Torvalds 	vortex_t *vortex = (vortex_t *) (a->vortex);
801da177e4SLinus Torvalds 	hwwrite(vortex->mmio, a3d_addrA(a->slice, a->source, A3D_A_x1), x1);
811da177e4SLinus Torvalds 	hwwrite(vortex->mmio, a3d_addrA(a->slice, a->source, A3D_A_x2), x2);
821da177e4SLinus Torvalds 	hwwrite(vortex->mmio, a3d_addrA(a->slice, a->source, A3D_A_y1), y1);
831da177e4SLinus Torvalds 	hwwrite(vortex->mmio, a3d_addrA(a->slice, a->source, A3D_A_y2), y2);
841da177e4SLinus Torvalds }
851da177e4SLinus Torvalds 
861da177e4SLinus Torvalds #if 0
871da177e4SLinus Torvalds static void
881da177e4SLinus Torvalds a3dsrc_GetAtmosTarget(a3dsrc_t * a, short *aa, short *b, short *c,
891da177e4SLinus Torvalds 		      short *d, short *e)
901da177e4SLinus Torvalds {
911da177e4SLinus Torvalds }
921da177e4SLinus Torvalds static void
931da177e4SLinus Torvalds a3dsrc_GetAtmosCurrent(a3dsrc_t * a, short *bb01, short *ab01, short *b2,
941da177e4SLinus Torvalds 		       short *aa12, short *ba12)
951da177e4SLinus Torvalds {
961da177e4SLinus Torvalds 	vortex_t *vortex = (vortex_t *) (a->vortex);
971da177e4SLinus Torvalds 	*aa12 =
981da177e4SLinus Torvalds 	    hwread(vortex->mmio,
991da177e4SLinus Torvalds 		   a3d_addrA(a->slice, a->source, A3D_A_A12Current));
1001da177e4SLinus Torvalds 	*ba12 =
1011da177e4SLinus Torvalds 	    hwread(vortex->mmio,
1021da177e4SLinus Torvalds 		   a3d_addrB(a->slice, a->source, A3D_B_A12Current));
1031da177e4SLinus Torvalds 	*ab01 =
1041da177e4SLinus Torvalds 	    hwread(vortex->mmio,
1051da177e4SLinus Torvalds 		   a3d_addrA(a->slice, a->source, A3D_A_B01Current));
1061da177e4SLinus Torvalds 	*bb01 =
1071da177e4SLinus Torvalds 	    hwread(vortex->mmio,
1081da177e4SLinus Torvalds 		   a3d_addrB(a->slice, a->source, A3D_B_B01Current));
1091da177e4SLinus Torvalds 	*b2 =
1101da177e4SLinus Torvalds 	    hwread(vortex->mmio,
1111da177e4SLinus Torvalds 		   a3d_addrA(a->slice, a->source, A3D_A_B2Current));
1121da177e4SLinus Torvalds }
1131da177e4SLinus Torvalds 
1141da177e4SLinus Torvalds static void
1151da177e4SLinus Torvalds a3dsrc_GetAtmosState(a3dsrc_t * a, short *x1, short *x2, short *y1, short *y2)
1161da177e4SLinus Torvalds {
1171da177e4SLinus Torvalds 
1181da177e4SLinus Torvalds }
1191da177e4SLinus Torvalds 
1201da177e4SLinus Torvalds #endif
1211da177e4SLinus Torvalds /* HRTF */
1221da177e4SLinus Torvalds 
1231da177e4SLinus Torvalds static void
a3dsrc_SetHrtfTarget(a3dsrc_t * a,a3d_Hrtf_t const aa,a3d_Hrtf_t const b)1241da177e4SLinus Torvalds a3dsrc_SetHrtfTarget(a3dsrc_t * a, a3d_Hrtf_t const aa, a3d_Hrtf_t const b)
1251da177e4SLinus Torvalds {
1261da177e4SLinus Torvalds 	vortex_t *vortex = (vortex_t *) (a->vortex);
1271da177e4SLinus Torvalds 	int i;
1281da177e4SLinus Torvalds 
1291da177e4SLinus Torvalds 	for (i = 0; i < HRTF_SZ; i++)
1301da177e4SLinus Torvalds 		hwwrite(vortex->mmio,
1311da177e4SLinus Torvalds 			a3d_addrB(a->slice, a->source,
1321da177e4SLinus Torvalds 				  A3D_B_HrtfTarget) + (i << 2),
1331da177e4SLinus Torvalds 			(b[i] << 0x10) | aa[i]);
1341da177e4SLinus Torvalds }
1351da177e4SLinus Torvalds 
1361da177e4SLinus Torvalds static void
a3dsrc_SetHrtfCurrent(a3dsrc_t * a,a3d_Hrtf_t const aa,a3d_Hrtf_t const b)1371da177e4SLinus Torvalds a3dsrc_SetHrtfCurrent(a3dsrc_t * a, a3d_Hrtf_t const aa, a3d_Hrtf_t const b)
1381da177e4SLinus Torvalds {
1391da177e4SLinus Torvalds 	vortex_t *vortex = (vortex_t *) (a->vortex);
1401da177e4SLinus Torvalds 	int i;
1411da177e4SLinus Torvalds 
1421da177e4SLinus Torvalds 	for (i = 0; i < HRTF_SZ; i++)
1431da177e4SLinus Torvalds 		hwwrite(vortex->mmio,
1441da177e4SLinus Torvalds 			a3d_addrB(a->slice, a->source,
1451da177e4SLinus Torvalds 				  A3D_B_HrtfCurrent) + (i << 2),
1461da177e4SLinus Torvalds 			(b[i] << 0x10) | aa[i]);
1471da177e4SLinus Torvalds }
1481da177e4SLinus Torvalds 
1491da177e4SLinus Torvalds static void
a3dsrc_SetHrtfState(a3dsrc_t * a,a3d_Hrtf_t const aa,a3d_Hrtf_t const b)1501da177e4SLinus Torvalds a3dsrc_SetHrtfState(a3dsrc_t * a, a3d_Hrtf_t const aa, a3d_Hrtf_t const b)
1511da177e4SLinus Torvalds {
1521da177e4SLinus Torvalds 	vortex_t *vortex = (vortex_t *) (a->vortex);
1531da177e4SLinus Torvalds 	int i;
1541da177e4SLinus Torvalds 
1551da177e4SLinus Torvalds 	for (i = 0; i < HRTF_SZ; i++)
1561da177e4SLinus Torvalds 		hwwrite(vortex->mmio,
1571da177e4SLinus Torvalds 			a3d_addrB(a->slice, a->source,
1581da177e4SLinus Torvalds 				  A3D_B_HrtfDelayLine) + (i << 2),
1591da177e4SLinus Torvalds 			(b[i] << 0x10) | aa[i]);
1601da177e4SLinus Torvalds }
1611da177e4SLinus Torvalds 
a3dsrc_SetHrtfOutput(a3dsrc_t * a,short left,short right)1621da177e4SLinus Torvalds static void a3dsrc_SetHrtfOutput(a3dsrc_t * a, short left, short right)
1631da177e4SLinus Torvalds {
1641da177e4SLinus Torvalds 	vortex_t *vortex = (vortex_t *) (a->vortex);
1651da177e4SLinus Torvalds 	hwwrite(vortex->mmio,
1661da177e4SLinus Torvalds 		a3d_addrA(a->slice, a->source, A3D_A_HrtfOutL), left);
1671da177e4SLinus Torvalds 	hwwrite(vortex->mmio,
1681da177e4SLinus Torvalds 		a3d_addrA(a->slice, a->source, A3D_A_HrtfOutR), right);
1691da177e4SLinus Torvalds }
1701da177e4SLinus Torvalds 
1711da177e4SLinus Torvalds #if 0
1721da177e4SLinus Torvalds static void a3dsrc_GetHrtfTarget(a3dsrc_t * a, a3d_Hrtf_t aa, a3d_Hrtf_t b)
1731da177e4SLinus Torvalds {
1741da177e4SLinus Torvalds 	vortex_t *vortex = (vortex_t *) (a->vortex);
1751da177e4SLinus Torvalds 	int i;
1761da177e4SLinus Torvalds 
1771da177e4SLinus Torvalds 	for (i = 0; i < HRTF_SZ; i++)
1781da177e4SLinus Torvalds 		aa[i] =
1791da177e4SLinus Torvalds 		    hwread(vortex->mmio,
1801da177e4SLinus Torvalds 			   a3d_addrA(a->slice, a->source,
1811da177e4SLinus Torvalds 				     A3D_A_HrtfTarget + (i << 2)));
1821da177e4SLinus Torvalds 	for (i = 0; i < HRTF_SZ; i++)
1831da177e4SLinus Torvalds 		b[i] =
1841da177e4SLinus Torvalds 		    hwread(vortex->mmio,
1851da177e4SLinus Torvalds 			   a3d_addrB(a->slice, a->source,
1861da177e4SLinus Torvalds 				     A3D_B_HrtfTarget + (i << 2)));
1871da177e4SLinus Torvalds }
1881da177e4SLinus Torvalds 
1891da177e4SLinus Torvalds static void a3dsrc_GetHrtfCurrent(a3dsrc_t * a, a3d_Hrtf_t aa, a3d_Hrtf_t b)
1901da177e4SLinus Torvalds {
1911da177e4SLinus Torvalds 	vortex_t *vortex = (vortex_t *) (a->vortex);
1921da177e4SLinus Torvalds 	int i;
1931da177e4SLinus Torvalds 
1941da177e4SLinus Torvalds 	for (i = 0; i < HRTF_SZ; i++)
1951da177e4SLinus Torvalds 		aa[i] =
1961da177e4SLinus Torvalds 		    hwread(vortex->mmio,
1971da177e4SLinus Torvalds 			   a3d_addrA(a->slice, a->source,
1981da177e4SLinus Torvalds 				     A3D_A_HrtfCurrent + (i << 2)));
1991da177e4SLinus Torvalds 	for (i = 0; i < HRTF_SZ; i++)
2001da177e4SLinus Torvalds 		b[i] =
2011da177e4SLinus Torvalds 		    hwread(vortex->mmio,
2021da177e4SLinus Torvalds 			   a3d_addrB(a->slice, a->source,
2031da177e4SLinus Torvalds 				     A3D_B_HrtfCurrent + (i << 2)));
2041da177e4SLinus Torvalds }
2051da177e4SLinus Torvalds 
2061da177e4SLinus Torvalds static void a3dsrc_GetHrtfState(a3dsrc_t * a, a3d_Hrtf_t aa, a3d_Hrtf_t b)
2071da177e4SLinus Torvalds {
2081da177e4SLinus Torvalds 	vortex_t *vortex = (vortex_t *) (a->vortex);
2091da177e4SLinus Torvalds 	int i;
2101da177e4SLinus Torvalds 	// FIXME: verify this!
2111da177e4SLinus Torvalds 	for (i = 0; i < HRTF_SZ; i++)
2121da177e4SLinus Torvalds 		aa[i] =
2131da177e4SLinus Torvalds 		    hwread(vortex->mmio,
2141da177e4SLinus Torvalds 			   a3d_addrA(a->slice, a->source,
2151da177e4SLinus Torvalds 				     A3D_A_HrtfDelayLine + (i << 2)));
2161da177e4SLinus Torvalds 	for (i = 0; i < HRTF_SZ; i++)
2171da177e4SLinus Torvalds 		b[i] =
2181da177e4SLinus Torvalds 		    hwread(vortex->mmio,
2191da177e4SLinus Torvalds 			   a3d_addrB(a->slice, a->source,
2201da177e4SLinus Torvalds 				     A3D_B_HrtfDelayLine + (i << 2)));
2211da177e4SLinus Torvalds }
2221da177e4SLinus Torvalds 
2231da177e4SLinus Torvalds static void a3dsrc_GetHrtfOutput(a3dsrc_t * a, short *left, short *right)
2241da177e4SLinus Torvalds {
2251da177e4SLinus Torvalds 	vortex_t *vortex = (vortex_t *) (a->vortex);
2261da177e4SLinus Torvalds 	*left =
2271da177e4SLinus Torvalds 	    hwread(vortex->mmio,
2281da177e4SLinus Torvalds 		   a3d_addrA(a->slice, a->source, A3D_A_HrtfOutL));
2291da177e4SLinus Torvalds 	*right =
2301da177e4SLinus Torvalds 	    hwread(vortex->mmio,
2311da177e4SLinus Torvalds 		   a3d_addrA(a->slice, a->source, A3D_A_HrtfOutR));
2321da177e4SLinus Torvalds }
2331da177e4SLinus Torvalds 
2341da177e4SLinus Torvalds #endif
2351da177e4SLinus Torvalds 
2361da177e4SLinus Torvalds /* Interaural Time Difference.
2371da177e4SLinus Torvalds  * "The other main clue that humans use to locate sounds, is called
2381da177e4SLinus Torvalds  * Interaural Time Difference (ITD). The differences in distance from
2391da177e4SLinus Torvalds  * the sound source to a listeners ears means  that the sound will
2401da177e4SLinus Torvalds  * reach one ear slightly before the other....", found somewhere with google.*/
a3dsrc_SetItdTarget(a3dsrc_t * a,short litd,short ritd)2411da177e4SLinus Torvalds static void a3dsrc_SetItdTarget(a3dsrc_t * a, short litd, short ritd)
2421da177e4SLinus Torvalds {
2431da177e4SLinus Torvalds 	vortex_t *vortex = (vortex_t *) (a->vortex);
2441da177e4SLinus Torvalds 
2451da177e4SLinus Torvalds 	if (litd < 0)
2461da177e4SLinus Torvalds 		litd = 0;
2471da177e4SLinus Torvalds 	if (litd > 0x57FF)
2481da177e4SLinus Torvalds 		litd = 0x57FF;
2491da177e4SLinus Torvalds 	if (ritd < 0)
2501da177e4SLinus Torvalds 		ritd = 0;
2511da177e4SLinus Torvalds 	if (ritd > 0x57FF)
2521da177e4SLinus Torvalds 		ritd = 0x57FF;
2531da177e4SLinus Torvalds 	hwwrite(vortex->mmio,
2541da177e4SLinus Torvalds 		a3d_addrB(a->slice, a->source, A3D_B_ITDTarget),
2551da177e4SLinus Torvalds 		(ritd << 0x10) | litd);
2561da177e4SLinus Torvalds 	//hwwrite(vortex->mmio, addr(0x191DF+5, this04, this08), (ritd<<0x10)|litd);
2571da177e4SLinus Torvalds }
2581da177e4SLinus Torvalds 
a3dsrc_SetItdCurrent(a3dsrc_t * a,short litd,short ritd)2591da177e4SLinus Torvalds static void a3dsrc_SetItdCurrent(a3dsrc_t * a, short litd, short ritd)
2601da177e4SLinus Torvalds {
2611da177e4SLinus Torvalds 	vortex_t *vortex = (vortex_t *) (a->vortex);
2621da177e4SLinus Torvalds 
2631da177e4SLinus Torvalds 	if (litd < 0)
2641da177e4SLinus Torvalds 		litd = 0;
2651da177e4SLinus Torvalds 	if (litd > 0x57FF)
2661da177e4SLinus Torvalds 		litd = 0x57FF;
2671da177e4SLinus Torvalds 	if (ritd < 0)
2681da177e4SLinus Torvalds 		ritd = 0;
2691da177e4SLinus Torvalds 	if (ritd > 0x57FF)
2701da177e4SLinus Torvalds 		ritd = 0x57FF;
2711da177e4SLinus Torvalds 	hwwrite(vortex->mmio,
2721da177e4SLinus Torvalds 		a3d_addrB(a->slice, a->source, A3D_B_ITDCurrent),
2731da177e4SLinus Torvalds 		(ritd << 0x10) | litd);
2741da177e4SLinus Torvalds 	//hwwrite(vortex->mmio, addr(0x191DF+1, this04, this08), (ritd<<0x10)|litd);
2751da177e4SLinus Torvalds }
2761da177e4SLinus Torvalds 
a3dsrc_SetItdDline(a3dsrc_t * a,a3d_ItdDline_t const dline)2771da177e4SLinus Torvalds static void a3dsrc_SetItdDline(a3dsrc_t * a, a3d_ItdDline_t const dline)
2781da177e4SLinus Torvalds {
2791da177e4SLinus Torvalds 	vortex_t *vortex = (vortex_t *) (a->vortex);
2801da177e4SLinus Torvalds 	int i;
2811da177e4SLinus Torvalds 	/* 45 != 40 -> Check this ! */
2821da177e4SLinus Torvalds 	for (i = 0; i < DLINE_SZ; i++)
2831da177e4SLinus Torvalds 		hwwrite(vortex->mmio,
2841da177e4SLinus Torvalds 			a3d_addrA(a->slice, a->source,
2851da177e4SLinus Torvalds 				  A3D_A_ITDDelayLine) + (i << 2), dline[i]);
2861da177e4SLinus Torvalds }
2871da177e4SLinus Torvalds 
2881da177e4SLinus Torvalds #if 0
2891da177e4SLinus Torvalds static void a3dsrc_GetItdTarget(a3dsrc_t * a, short *litd, short *ritd)
2901da177e4SLinus Torvalds {
2911da177e4SLinus Torvalds 	vortex_t *vortex = (vortex_t *) (a->vortex);
2921da177e4SLinus Torvalds 	*ritd =
2931da177e4SLinus Torvalds 	    hwread(vortex->mmio,
2941da177e4SLinus Torvalds 		   a3d_addrA(a->slice, a->source, A3D_A_ITDTarget));
2951da177e4SLinus Torvalds 	*litd =
2961da177e4SLinus Torvalds 	    hwread(vortex->mmio,
2971da177e4SLinus Torvalds 		   a3d_addrB(a->slice, a->source, A3D_B_ITDTarget));
2981da177e4SLinus Torvalds }
2991da177e4SLinus Torvalds 
3001da177e4SLinus Torvalds static void a3dsrc_GetItdCurrent(a3dsrc_t * a, short *litd, short *ritd)
3011da177e4SLinus Torvalds {
3021da177e4SLinus Torvalds 	vortex_t *vortex = (vortex_t *) (a->vortex);
3031da177e4SLinus Torvalds 
3041da177e4SLinus Torvalds 	*ritd =
3051da177e4SLinus Torvalds 	    hwread(vortex->mmio,
3061da177e4SLinus Torvalds 		   a3d_addrA(a->slice, a->source, A3D_A_ITDCurrent));
3071da177e4SLinus Torvalds 	*litd =
3081da177e4SLinus Torvalds 	    hwread(vortex->mmio,
3091da177e4SLinus Torvalds 		   a3d_addrB(a->slice, a->source, A3D_B_ITDCurrent));
3101da177e4SLinus Torvalds }
3111da177e4SLinus Torvalds 
3121da177e4SLinus Torvalds static void a3dsrc_GetItdDline(a3dsrc_t * a, a3d_ItdDline_t dline)
3131da177e4SLinus Torvalds {
3141da177e4SLinus Torvalds 	vortex_t *vortex = (vortex_t *) (a->vortex);
3151da177e4SLinus Torvalds 	int i;
3161da177e4SLinus Torvalds 
3171da177e4SLinus Torvalds 	for (i = 0; i < DLINE_SZ; i++)
3181da177e4SLinus Torvalds 		dline[i] =
3191da177e4SLinus Torvalds 		    hwread(vortex->mmio,
3201da177e4SLinus Torvalds 			   a3d_addrA(a->slice, a->source,
3211da177e4SLinus Torvalds 				     A3D_A_ITDDelayLine + (i << 2)));
3221da177e4SLinus Torvalds }
3231da177e4SLinus Torvalds 
3241da177e4SLinus Torvalds #endif
3251da177e4SLinus Torvalds /* This is may be used for ILD Interaural Level Difference. */
3261da177e4SLinus Torvalds 
a3dsrc_SetGainTarget(a3dsrc_t * a,short left,short right)3271da177e4SLinus Torvalds static void a3dsrc_SetGainTarget(a3dsrc_t * a, short left, short right)
3281da177e4SLinus Torvalds {
3291da177e4SLinus Torvalds 	vortex_t *vortex = (vortex_t *) (a->vortex);
3301da177e4SLinus Torvalds 	hwwrite(vortex->mmio,
3311da177e4SLinus Torvalds 		a3d_addrB(a->slice, a->source, A3D_B_GainTarget),
3321da177e4SLinus Torvalds 		(right << 0x10) | left);
3331da177e4SLinus Torvalds }
3341da177e4SLinus Torvalds 
a3dsrc_SetGainCurrent(a3dsrc_t * a,short left,short right)3351da177e4SLinus Torvalds static void a3dsrc_SetGainCurrent(a3dsrc_t * a, short left, short right)
3361da177e4SLinus Torvalds {
3371da177e4SLinus Torvalds 	vortex_t *vortex = (vortex_t *) (a->vortex);
3381da177e4SLinus Torvalds 	hwwrite(vortex->mmio,
3391da177e4SLinus Torvalds 		a3d_addrB(a->slice, a->source, A3D_B_GainCurrent),
3401da177e4SLinus Torvalds 		(right << 0x10) | left);
3411da177e4SLinus Torvalds }
3421da177e4SLinus Torvalds 
3431da177e4SLinus Torvalds #if 0
3441da177e4SLinus Torvalds static void a3dsrc_GetGainTarget(a3dsrc_t * a, short *left, short *right)
3451da177e4SLinus Torvalds {
3461da177e4SLinus Torvalds 	vortex_t *vortex = (vortex_t *) (a->vortex);
3471da177e4SLinus Torvalds 	*right =
3481da177e4SLinus Torvalds 	    hwread(vortex->mmio,
3491da177e4SLinus Torvalds 		   a3d_addrA(a->slice, a->source, A3D_A_GainTarget));
3501da177e4SLinus Torvalds 	*left =
3511da177e4SLinus Torvalds 	    hwread(vortex->mmio,
3521da177e4SLinus Torvalds 		   a3d_addrB(a->slice, a->source, A3D_B_GainTarget));
3531da177e4SLinus Torvalds }
3541da177e4SLinus Torvalds 
3551da177e4SLinus Torvalds static void a3dsrc_GetGainCurrent(a3dsrc_t * a, short *left, short *right)
3561da177e4SLinus Torvalds {
3571da177e4SLinus Torvalds 	vortex_t *vortex = (vortex_t *) (a->vortex);
3581da177e4SLinus Torvalds 	*right =
3591da177e4SLinus Torvalds 	    hwread(vortex->mmio,
3601da177e4SLinus Torvalds 		   a3d_addrA(a->slice, a->source, A3D_A_GainCurrent));
3611da177e4SLinus Torvalds 	*left =
3621da177e4SLinus Torvalds 	    hwread(vortex->mmio,
3631da177e4SLinus Torvalds 		   a3d_addrB(a->slice, a->source, A3D_B_GainCurrent));
3641da177e4SLinus Torvalds }
3651da177e4SLinus Torvalds 
3661da177e4SLinus Torvalds /* CA3dIO this func seems to be inlined all over this place. */
3671da177e4SLinus Torvalds static void CA3dIO_WriteReg(a3dsrc_t * a, unsigned long addr, short aa, short b)
3681da177e4SLinus Torvalds {
3691da177e4SLinus Torvalds 	vortex_t *vortex = (vortex_t *) (a->vortex);
3701da177e4SLinus Torvalds 	hwwrite(vortex->mmio, addr, (aa << 0x10) | b);
3711da177e4SLinus Torvalds }
3721da177e4SLinus Torvalds 
3731da177e4SLinus Torvalds #endif
3741da177e4SLinus Torvalds /* Generic A3D stuff */
3751da177e4SLinus Torvalds 
a3dsrc_SetA3DSampleRate(a3dsrc_t * a,int sr)3761da177e4SLinus Torvalds static void a3dsrc_SetA3DSampleRate(a3dsrc_t * a, int sr)
3771da177e4SLinus Torvalds {
3781da177e4SLinus Torvalds 	vortex_t *vortex = (vortex_t *) (a->vortex);
3791da177e4SLinus Torvalds 	int esp0 = 0;
3801da177e4SLinus Torvalds 
3811da177e4SLinus Torvalds 	esp0 = (((esp0 & 0x7fffffff) | 0xB8000000) & 0x7) | ((sr & 0x1f) << 3);
3821da177e4SLinus Torvalds 	hwwrite(vortex->mmio, A3D_SLICE_Control + ((a->slice) << 0xd), esp0);
3831da177e4SLinus Torvalds 	//hwwrite(vortex->mmio, 0x19C38 + (this08<<0xd), esp0);
3841da177e4SLinus Torvalds }
3851da177e4SLinus Torvalds 
a3dsrc_EnableA3D(a3dsrc_t * a)3861da177e4SLinus Torvalds static void a3dsrc_EnableA3D(a3dsrc_t * a)
3871da177e4SLinus Torvalds {
3881da177e4SLinus Torvalds 	vortex_t *vortex = (vortex_t *) (a->vortex);
3891da177e4SLinus Torvalds 	hwwrite(vortex->mmio, A3D_SLICE_Control + ((a->slice) << 0xd),
3901da177e4SLinus Torvalds 		0xF0000001);
3911da177e4SLinus Torvalds 	//hwwrite(vortex->mmio, 0x19C38 + (this08<<0xd), 0xF0000001);
3921da177e4SLinus Torvalds }
3931da177e4SLinus Torvalds 
a3dsrc_DisableA3D(a3dsrc_t * a)3941da177e4SLinus Torvalds static void a3dsrc_DisableA3D(a3dsrc_t * a)
3951da177e4SLinus Torvalds {
3961da177e4SLinus Torvalds 	vortex_t *vortex = (vortex_t *) (a->vortex);
3971da177e4SLinus Torvalds 	hwwrite(vortex->mmio, A3D_SLICE_Control + ((a->slice) << 0xd),
3981da177e4SLinus Torvalds 		0xF0000000);
3991da177e4SLinus Torvalds }
4001da177e4SLinus Torvalds 
a3dsrc_SetA3DControlReg(a3dsrc_t * a,unsigned long ctrl)4011da177e4SLinus Torvalds static void a3dsrc_SetA3DControlReg(a3dsrc_t * a, unsigned long ctrl)
4021da177e4SLinus Torvalds {
4031da177e4SLinus Torvalds 	vortex_t *vortex = (vortex_t *) (a->vortex);
4041da177e4SLinus Torvalds 	hwwrite(vortex->mmio, A3D_SLICE_Control + ((a->slice) << 0xd), ctrl);
4051da177e4SLinus Torvalds }
4061da177e4SLinus Torvalds 
a3dsrc_SetA3DPointerReg(a3dsrc_t * a,unsigned long ptr)4071da177e4SLinus Torvalds static void a3dsrc_SetA3DPointerReg(a3dsrc_t * a, unsigned long ptr)
4081da177e4SLinus Torvalds {
4091da177e4SLinus Torvalds 	vortex_t *vortex = (vortex_t *) (a->vortex);
4101da177e4SLinus Torvalds 	hwwrite(vortex->mmio, A3D_SLICE_Pointers + ((a->slice) << 0xd), ptr);
4111da177e4SLinus Torvalds }
4121da177e4SLinus Torvalds 
4131da177e4SLinus Torvalds #if 0
4141da177e4SLinus Torvalds static void a3dsrc_GetA3DSampleRate(a3dsrc_t * a, int *sr)
4151da177e4SLinus Torvalds {
4161da177e4SLinus Torvalds 	vortex_t *vortex = (vortex_t *) (a->vortex);
4171da177e4SLinus Torvalds 	*sr = ((hwread(vortex->mmio, A3D_SLICE_Control + (a->slice << 0xd))
4181da177e4SLinus Torvalds 		>> 3) & 0x1f);
4191da177e4SLinus Torvalds 	//*sr = ((hwread(vortex->mmio, 0x19C38 + (this08<<0xd))>>3)&0x1f);
4201da177e4SLinus Torvalds }
4211da177e4SLinus Torvalds 
4221da177e4SLinus Torvalds static void a3dsrc_GetA3DControlReg(a3dsrc_t * a, unsigned long *ctrl)
4231da177e4SLinus Torvalds {
4241da177e4SLinus Torvalds 	vortex_t *vortex = (vortex_t *) (a->vortex);
4251da177e4SLinus Torvalds 	*ctrl = hwread(vortex->mmio, A3D_SLICE_Control + ((a->slice) << 0xd));
4261da177e4SLinus Torvalds }
4271da177e4SLinus Torvalds 
4281da177e4SLinus Torvalds static void a3dsrc_GetA3DPointerReg(a3dsrc_t * a, unsigned long *ptr)
4291da177e4SLinus Torvalds {
4301da177e4SLinus Torvalds 	vortex_t *vortex = (vortex_t *) (a->vortex);
4311da177e4SLinus Torvalds 	*ptr = hwread(vortex->mmio, A3D_SLICE_Pointers + ((a->slice) << 0xd));
4321da177e4SLinus Torvalds }
4331da177e4SLinus Torvalds 
4341da177e4SLinus Torvalds #endif
a3dsrc_ZeroSliceIO(a3dsrc_t * a)4351da177e4SLinus Torvalds static void a3dsrc_ZeroSliceIO(a3dsrc_t * a)
4361da177e4SLinus Torvalds {
4371da177e4SLinus Torvalds 	vortex_t *vortex = (vortex_t *) (a->vortex);
4381da177e4SLinus Torvalds 	int i;
4391da177e4SLinus Torvalds 
4401da177e4SLinus Torvalds 	for (i = 0; i < 8; i++)
4411da177e4SLinus Torvalds 		hwwrite(vortex->mmio,
4421da177e4SLinus Torvalds 			A3D_SLICE_VDBDest +
4431da177e4SLinus Torvalds 			((((a->slice) << 0xb) + i) << 2), 0);
4441da177e4SLinus Torvalds 	for (i = 0; i < 4; i++)
4451da177e4SLinus Torvalds 		hwwrite(vortex->mmio,
4461da177e4SLinus Torvalds 			A3D_SLICE_VDBSource +
4471da177e4SLinus Torvalds 			((((a->slice) << 0xb) + i) << 2), 0);
4481da177e4SLinus Torvalds }
4491da177e4SLinus Torvalds 
4501da177e4SLinus Torvalds /* Reset Single A3D source. */
a3dsrc_ZeroState(a3dsrc_t * a)4511da177e4SLinus Torvalds static void a3dsrc_ZeroState(a3dsrc_t * a)
4521da177e4SLinus Torvalds {
453ee419653STakashi Iwai 	/*
454e7e69265SSudip Mukherjee 	pr_debug( "vortex: ZeroState slice: %d, source %d\n",
455ee419653STakashi Iwai 	       a->slice, a->source);
456ee419653STakashi Iwai 	*/
4571da177e4SLinus Torvalds 	a3dsrc_SetAtmosState(a, 0, 0, 0, 0);
4581da177e4SLinus Torvalds 	a3dsrc_SetHrtfState(a, A3dHrirZeros, A3dHrirZeros);
4591da177e4SLinus Torvalds 	a3dsrc_SetItdDline(a, A3dItdDlineZeros);
4601da177e4SLinus Torvalds 	a3dsrc_SetHrtfOutput(a, 0, 0);
4611da177e4SLinus Torvalds 	a3dsrc_SetTimeConsts(a, 0, 0, 0, 0);
4621da177e4SLinus Torvalds 
4631da177e4SLinus Torvalds 	a3dsrc_SetAtmosCurrent(a, 0, 0, 0, 0, 0);
4641da177e4SLinus Torvalds 	a3dsrc_SetAtmosTarget(a, 0, 0, 0, 0, 0);
4651da177e4SLinus Torvalds 	a3dsrc_SetItdCurrent(a, 0, 0);
4661da177e4SLinus Torvalds 	a3dsrc_SetItdTarget(a, 0, 0);
4671da177e4SLinus Torvalds 	a3dsrc_SetGainCurrent(a, 0, 0);
4681da177e4SLinus Torvalds 	a3dsrc_SetGainTarget(a, 0, 0);
4691da177e4SLinus Torvalds 
4701da177e4SLinus Torvalds 	a3dsrc_SetHrtfCurrent(a, A3dHrirZeros, A3dHrirZeros);
4711da177e4SLinus Torvalds 	a3dsrc_SetHrtfTarget(a, A3dHrirZeros, A3dHrirZeros);
4721da177e4SLinus Torvalds }
4731da177e4SLinus Torvalds 
4741da177e4SLinus Torvalds /* Reset entire A3D engine */
a3dsrc_ZeroStateA3D(a3dsrc_t * a,vortex_t * v)4756a40dc5aSSudip Mukherjee static void a3dsrc_ZeroStateA3D(a3dsrc_t *a, vortex_t *v)
4761da177e4SLinus Torvalds {
4771da177e4SLinus Torvalds 	int i, var, var2;
4781da177e4SLinus Torvalds 
4791da177e4SLinus Torvalds 	if ((a->vortex) == NULL) {
48070c84418SSudip Mukherjee 		dev_err(v->card->dev,
48170c84418SSudip Mukherjee 			"ZeroStateA3D: ERROR: a->vortex is NULL\n");
4821da177e4SLinus Torvalds 		return;
4831da177e4SLinus Torvalds 	}
4841da177e4SLinus Torvalds 
4851da177e4SLinus Torvalds 	a3dsrc_SetA3DControlReg(a, 0);
4861da177e4SLinus Torvalds 	a3dsrc_SetA3DPointerReg(a, 0);
4871da177e4SLinus Torvalds 
4881da177e4SLinus Torvalds 	var = a->slice;
4891da177e4SLinus Torvalds 	var2 = a->source;
4901da177e4SLinus Torvalds 	for (i = 0; i < 4; i++) {
4911da177e4SLinus Torvalds 		a->slice = i;
4921da177e4SLinus Torvalds 		a3dsrc_ZeroSliceIO(a);
4931da177e4SLinus Torvalds 		//a3dsrc_ZeroState(a);
4941da177e4SLinus Torvalds 	}
4951da177e4SLinus Torvalds 	a->source = var2;
4961da177e4SLinus Torvalds 	a->slice = var;
4971da177e4SLinus Torvalds }
4981da177e4SLinus Torvalds 
4991da177e4SLinus Torvalds /* Program A3D block as pass through */
a3dsrc_ProgramPipe(a3dsrc_t * a)5001da177e4SLinus Torvalds static void a3dsrc_ProgramPipe(a3dsrc_t * a)
5011da177e4SLinus Torvalds {
5021da177e4SLinus Torvalds 	a3dsrc_SetTimeConsts(a, 0, 0, 0, 0);
5031da177e4SLinus Torvalds 	a3dsrc_SetAtmosCurrent(a, 0, 0x4000, 0, 0, 0);
5041da177e4SLinus Torvalds 	a3dsrc_SetAtmosTarget(a, 0x4000, 0, 0, 0, 0);
5051da177e4SLinus Torvalds 	a3dsrc_SetItdCurrent(a, 0, 0);
5061da177e4SLinus Torvalds 	a3dsrc_SetItdTarget(a, 0, 0);
5071da177e4SLinus Torvalds 	a3dsrc_SetGainCurrent(a, 0x7fff, 0x7fff);
5081da177e4SLinus Torvalds 	a3dsrc_SetGainTarget(a, 0x7fff, 0x7fff);
5091da177e4SLinus Torvalds 
5101da177e4SLinus Torvalds 	/* SET HRTF HERE */
5111da177e4SLinus Torvalds 
5121da177e4SLinus Torvalds 	/* Single spike leads to identity transfer function. */
5131da177e4SLinus Torvalds 	a3dsrc_SetHrtfCurrent(a, A3dHrirImpulse, A3dHrirImpulse);
5141da177e4SLinus Torvalds 	a3dsrc_SetHrtfTarget(a, A3dHrirImpulse, A3dHrirImpulse);
5151da177e4SLinus Torvalds 
5161da177e4SLinus Torvalds 	/* Test: Sounds saturated. */
5171da177e4SLinus Torvalds 	//a3dsrc_SetHrtfCurrent(a, A3dHrirSatTest, A3dHrirSatTest);
5181da177e4SLinus Torvalds 	//a3dsrc_SetHrtfTarget(a, A3dHrirSatTest, A3dHrirSatTest);
5191da177e4SLinus Torvalds }
5201da177e4SLinus Torvalds 
5211da177e4SLinus Torvalds /* VDB = Vortex audio Dataflow Bus */
5221da177e4SLinus Torvalds #if 0
5231da177e4SLinus Torvalds static void a3dsrc_ClearVDBData(a3dsrc_t * a, unsigned long aa)
5241da177e4SLinus Torvalds {
5251da177e4SLinus Torvalds 	vortex_t *vortex = (vortex_t *) (a->vortex);
5261da177e4SLinus Torvalds 
5271da177e4SLinus Torvalds 	// ((aa >> 2) << 8) - (aa >> 2)
5281da177e4SLinus Torvalds 	hwwrite(vortex->mmio,
5291da177e4SLinus Torvalds 		a3d_addrS(a->slice, A3D_SLICE_VDBDest) + (a->source << 2), 0);
5301da177e4SLinus Torvalds 	hwwrite(vortex->mmio,
5311da177e4SLinus Torvalds 		a3d_addrS(a->slice,
5321da177e4SLinus Torvalds 			  A3D_SLICE_VDBDest + 4) + (a->source << 2), 0);
5331da177e4SLinus Torvalds 	/*
5341da177e4SLinus Torvalds 	   hwwrite(vortex->mmio, 0x19c00 + (((aa>>2)*255*4)+aa)*8, 0);
5351da177e4SLinus Torvalds 	   hwwrite(vortex->mmio, 0x19c04 + (((aa>>2)*255*4)+aa)*8, 0);
5361da177e4SLinus Torvalds 	 */
5371da177e4SLinus Torvalds }
5381da177e4SLinus Torvalds #endif
5391da177e4SLinus Torvalds 
5401da177e4SLinus Torvalds /* A3D HwSource stuff. */
5411da177e4SLinus Torvalds 
vortex_A3dSourceHw_Initialize(vortex_t * v,int source,int slice)5421da177e4SLinus Torvalds static void vortex_A3dSourceHw_Initialize(vortex_t * v, int source, int slice)
5431da177e4SLinus Torvalds {
5441da177e4SLinus Torvalds 	a3dsrc_t *a3dsrc = &(v->a3d[source + (slice * 4)]);
5451da177e4SLinus Torvalds 	//a3dsrc_t *a3dsrc = &(v->a3d[source + (slice*4)]);
5461da177e4SLinus Torvalds 
5471da177e4SLinus Torvalds 	a3dsrc->vortex = (void *)v;
5481da177e4SLinus Torvalds 	a3dsrc->source = source;	/* source */
5491da177e4SLinus Torvalds 	a3dsrc->slice = slice;	/* slice */
5501da177e4SLinus Torvalds 	a3dsrc_ZeroState(a3dsrc);
5511da177e4SLinus Torvalds 	/* Added by me. */
5521da177e4SLinus Torvalds 	a3dsrc_SetA3DSampleRate(a3dsrc, 0x11);
5531da177e4SLinus Torvalds }
5541da177e4SLinus Torvalds 
Vort3DRend_Initialize(vortex_t * v,unsigned short mode)5551da177e4SLinus Torvalds static int Vort3DRend_Initialize(vortex_t * v, unsigned short mode)
5561da177e4SLinus Torvalds {
5571da177e4SLinus Torvalds 	v->xt_mode = mode;	/* this_14 */
5581da177e4SLinus Torvalds 
5591da177e4SLinus Torvalds 	vortex_XtalkHw_init(v);
5601da177e4SLinus Torvalds 	vortex_XtalkHw_SetGainsAllChan(v);
5611da177e4SLinus Torvalds 	switch (v->xt_mode) {
5621da177e4SLinus Torvalds 	case XT_SPEAKER0:
5631da177e4SLinus Torvalds 		vortex_XtalkHw_ProgramXtalkNarrow(v);
5641da177e4SLinus Torvalds 		break;
5651da177e4SLinus Torvalds 	case XT_SPEAKER1:
5661da177e4SLinus Torvalds 		vortex_XtalkHw_ProgramXtalkWide(v);
5671da177e4SLinus Torvalds 		break;
5681da177e4SLinus Torvalds 	default:
5691da177e4SLinus Torvalds 	case XT_HEADPHONE:
5701da177e4SLinus Torvalds 		vortex_XtalkHw_ProgramPipe(v);
5711da177e4SLinus Torvalds 		break;
5721da177e4SLinus Torvalds 	case XT_DIAMOND:
5731da177e4SLinus Torvalds 		vortex_XtalkHw_ProgramDiamondXtalk(v);
5741da177e4SLinus Torvalds 		break;
5751da177e4SLinus Torvalds 	}
5761da177e4SLinus Torvalds 	vortex_XtalkHw_SetSampleRate(v, 0x11);
5771da177e4SLinus Torvalds 	vortex_XtalkHw_Enable(v);
5781da177e4SLinus Torvalds 	return 0;
5791da177e4SLinus Torvalds }
5801da177e4SLinus Torvalds 
5811da177e4SLinus Torvalds /* 3D Sound entry points. */
5821da177e4SLinus Torvalds 
5831da177e4SLinus Torvalds static int vortex_a3d_register_controls(vortex_t * vortex);
5841da177e4SLinus Torvalds static void vortex_a3d_unregister_controls(vortex_t * vortex);
5851da177e4SLinus Torvalds /* A3D base support init/shudown */
vortex_Vort3D_enable(vortex_t * v)586e23e7a14SBill Pemberton static void vortex_Vort3D_enable(vortex_t *v)
5871da177e4SLinus Torvalds {
5881da177e4SLinus Torvalds 	int i;
589f40b6890STakashi Iwai 
5901da177e4SLinus Torvalds 	Vort3DRend_Initialize(v, XT_HEADPHONE);
5911da177e4SLinus Torvalds 	for (i = 0; i < NR_A3D; i++) {
5921da177e4SLinus Torvalds 		vortex_A3dSourceHw_Initialize(v, i % 4, i >> 2);
5936a40dc5aSSudip Mukherjee 		a3dsrc_ZeroStateA3D(&v->a3d[0], v);
5941da177e4SLinus Torvalds 	}
5951da177e4SLinus Torvalds 	/* Register ALSA controls */
5961da177e4SLinus Torvalds 	vortex_a3d_register_controls(v);
5971da177e4SLinus Torvalds }
598f40b6890STakashi Iwai 
vortex_Vort3D_disable(vortex_t * v)599f40b6890STakashi Iwai static void vortex_Vort3D_disable(vortex_t * v)
600f40b6890STakashi Iwai {
601f40b6890STakashi Iwai 	vortex_XtalkHw_Disable(v);
602f40b6890STakashi Iwai 	vortex_a3d_unregister_controls(v);
6031da177e4SLinus Torvalds }
6041da177e4SLinus Torvalds 
6051da177e4SLinus Torvalds /* Make A3D subsystem connections. */
vortex_Vort3D_connect(vortex_t * v,int en)6061da177e4SLinus Torvalds static void vortex_Vort3D_connect(vortex_t * v, int en)
6071da177e4SLinus Torvalds {
6081da177e4SLinus Torvalds 	int i;
6091da177e4SLinus Torvalds 
6101da177e4SLinus Torvalds // Disable AU8810 routes, since they seem to be wrong (in au8810.h).
6111da177e4SLinus Torvalds #ifdef CHIP_AU8810
6121da177e4SLinus Torvalds 	return;
6131da177e4SLinus Torvalds #endif
6141da177e4SLinus Torvalds 
6151da177e4SLinus Torvalds #if 1
6161da177e4SLinus Torvalds 	/* Alloc Xtalk mixin resources */
6171da177e4SLinus Torvalds 	v->mixxtlk[0] =
6181da177e4SLinus Torvalds 	    vortex_adb_checkinout(v, v->fixed_res, en, VORTEX_RESOURCE_MIXIN);
6191da177e4SLinus Torvalds 	if (v->mixxtlk[0] < 0) {
62070c84418SSudip Mukherjee 		dev_warn(v->card->dev,
62170c84418SSudip Mukherjee 			 "vortex_Vort3D: ERROR: not enough free mixer resources.\n");
6221da177e4SLinus Torvalds 		return;
6231da177e4SLinus Torvalds 	}
6241da177e4SLinus Torvalds 	v->mixxtlk[1] =
6251da177e4SLinus Torvalds 	    vortex_adb_checkinout(v, v->fixed_res, en, VORTEX_RESOURCE_MIXIN);
6261da177e4SLinus Torvalds 	if (v->mixxtlk[1] < 0) {
62770c84418SSudip Mukherjee 		dev_warn(v->card->dev,
62870c84418SSudip Mukherjee 			 "vortex_Vort3D: ERROR: not enough free mixer resources.\n");
6291da177e4SLinus Torvalds 		return;
6301da177e4SLinus Torvalds 	}
6311da177e4SLinus Torvalds #endif
6321da177e4SLinus Torvalds 
6331da177e4SLinus Torvalds 	/* Connect A3D -> XTALK */
6341da177e4SLinus Torvalds 	for (i = 0; i < 4; i++) {
6351da177e4SLinus Torvalds 		// 2 outputs per each A3D slice.
6361da177e4SLinus Torvalds 		vortex_route(v, en, 0x11, ADB_A3DOUT(i * 2), ADB_XTALKIN(i));
6371da177e4SLinus Torvalds 		vortex_route(v, en, 0x11, ADB_A3DOUT(i * 2) + 1, ADB_XTALKIN(5 + i));
6381da177e4SLinus Torvalds 	}
6391da177e4SLinus Torvalds #if 0
6401da177e4SLinus Torvalds 	vortex_route(v, en, 0x11, ADB_XTALKOUT(0), ADB_EQIN(2));
6411da177e4SLinus Torvalds 	vortex_route(v, en, 0x11, ADB_XTALKOUT(1), ADB_EQIN(3));
6421da177e4SLinus Torvalds #else
6431da177e4SLinus Torvalds 	/* Connect XTalk -> mixer */
6441da177e4SLinus Torvalds 	vortex_route(v, en, 0x11, ADB_XTALKOUT(0), ADB_MIXIN(v->mixxtlk[0]));
6451da177e4SLinus Torvalds 	vortex_route(v, en, 0x11, ADB_XTALKOUT(1), ADB_MIXIN(v->mixxtlk[1]));
6461da177e4SLinus Torvalds 	vortex_connection_mixin_mix(v, en, v->mixxtlk[0], v->mixplayb[0], 0);
6471da177e4SLinus Torvalds 	vortex_connection_mixin_mix(v, en, v->mixxtlk[1], v->mixplayb[1], 0);
6481da177e4SLinus Torvalds 	vortex_mix_setinputvolumebyte(v, v->mixplayb[0], v->mixxtlk[0],
6491da177e4SLinus Torvalds 				      en ? MIX_DEFIGAIN : VOL_MIN);
6501da177e4SLinus Torvalds 	vortex_mix_setinputvolumebyte(v, v->mixplayb[1], v->mixxtlk[1],
6511da177e4SLinus Torvalds 				      en ? MIX_DEFIGAIN : VOL_MIN);
6521da177e4SLinus Torvalds 	if (VORTEX_IS_QUAD(v)) {
6531da177e4SLinus Torvalds 		vortex_connection_mixin_mix(v, en, v->mixxtlk[0],
6541da177e4SLinus Torvalds 					    v->mixplayb[2], 0);
6551da177e4SLinus Torvalds 		vortex_connection_mixin_mix(v, en, v->mixxtlk[1],
6561da177e4SLinus Torvalds 					    v->mixplayb[3], 0);
6571da177e4SLinus Torvalds 		vortex_mix_setinputvolumebyte(v, v->mixplayb[2],
6581da177e4SLinus Torvalds 					      v->mixxtlk[0],
6591da177e4SLinus Torvalds 					      en ? MIX_DEFIGAIN : VOL_MIN);
6601da177e4SLinus Torvalds 		vortex_mix_setinputvolumebyte(v, v->mixplayb[3],
6611da177e4SLinus Torvalds 					      v->mixxtlk[1],
6621da177e4SLinus Torvalds 					      en ? MIX_DEFIGAIN : VOL_MIN);
6631da177e4SLinus Torvalds 	}
6641da177e4SLinus Torvalds #endif
6651da177e4SLinus Torvalds }
6661da177e4SLinus Torvalds 
6671da177e4SLinus Torvalds /* Initialize one single A3D source. */
vortex_Vort3D_InitializeSource(a3dsrc_t * a,int en,vortex_t * v)6686a40dc5aSSudip Mukherjee static void vortex_Vort3D_InitializeSource(a3dsrc_t *a, int en, vortex_t *v)
6691da177e4SLinus Torvalds {
6701da177e4SLinus Torvalds 	if (a->vortex == NULL) {
67170c84418SSudip Mukherjee 		dev_warn(v->card->dev,
67270c84418SSudip Mukherjee 			 "Vort3D_InitializeSource: A3D source not initialized\n");
6731da177e4SLinus Torvalds 		return;
6741da177e4SLinus Torvalds 	}
6751da177e4SLinus Torvalds 	if (en) {
6761da177e4SLinus Torvalds 		a3dsrc_ProgramPipe(a);
6771da177e4SLinus Torvalds 		a3dsrc_SetA3DSampleRate(a, 0x11);
6781da177e4SLinus Torvalds 		a3dsrc_SetTimeConsts(a, HrtfTCDefault,
6791da177e4SLinus Torvalds 				     ItdTCDefault, GainTCDefault,
6801da177e4SLinus Torvalds 				     CoefTCDefault);
6811da177e4SLinus Torvalds 		/* Remark: zero gain is muted. */
6821da177e4SLinus Torvalds 		//a3dsrc_SetGainTarget(a,0,0);
6831da177e4SLinus Torvalds 		//a3dsrc_SetGainCurrent(a,0,0);
6841da177e4SLinus Torvalds 		a3dsrc_EnableA3D(a);
6851da177e4SLinus Torvalds 	} else {
6861da177e4SLinus Torvalds 		a3dsrc_DisableA3D(a);
6871da177e4SLinus Torvalds 		a3dsrc_ZeroState(a);
6881da177e4SLinus Torvalds 	}
6891da177e4SLinus Torvalds }
6901da177e4SLinus Torvalds 
6911da177e4SLinus Torvalds /* Conversion of coordinates into 3D parameters. */
6921da177e4SLinus Torvalds 
vortex_a3d_coord2hrtf(a3d_Hrtf_t hrtf,int * coord)6931da177e4SLinus Torvalds static void vortex_a3d_coord2hrtf(a3d_Hrtf_t hrtf, int *coord)
6941da177e4SLinus Torvalds {
6951da177e4SLinus Torvalds 	/* FIXME: implement this. */
6961da177e4SLinus Torvalds 
6971da177e4SLinus Torvalds }
vortex_a3d_coord2itd(a3d_Itd_t itd,int * coord)6981da177e4SLinus Torvalds static void vortex_a3d_coord2itd(a3d_Itd_t itd, int *coord)
6991da177e4SLinus Torvalds {
7001da177e4SLinus Torvalds 	/* FIXME: implement this. */
7011da177e4SLinus Torvalds 
7021da177e4SLinus Torvalds }
vortex_a3d_coord2ild(a3d_LRGains_t ild,int left,int right)7031da177e4SLinus Torvalds static void vortex_a3d_coord2ild(a3d_LRGains_t ild, int left, int right)
7041da177e4SLinus Torvalds {
7051da177e4SLinus Torvalds 	/* FIXME: implement this. */
7061da177e4SLinus Torvalds 
7071da177e4SLinus Torvalds }
vortex_a3d_translate_filter(a3d_atmos_t filter,int * params)7081da177e4SLinus Torvalds static void vortex_a3d_translate_filter(a3d_atmos_t filter, int *params)
7091da177e4SLinus Torvalds {
7101da177e4SLinus Torvalds 	/* FIXME: implement this. */
7111da177e4SLinus Torvalds 
7121da177e4SLinus Torvalds }
7131da177e4SLinus Torvalds 
7141da177e4SLinus Torvalds /* ALSA control interface.  */
7151da177e4SLinus Torvalds 
7161da177e4SLinus Torvalds static int
snd_vortex_a3d_hrtf_info(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_info * uinfo)7172fd16874STakashi Iwai snd_vortex_a3d_hrtf_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
7181da177e4SLinus Torvalds {
7191da177e4SLinus Torvalds 	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
7201da177e4SLinus Torvalds 	uinfo->count = 6;
7211da177e4SLinus Torvalds 	uinfo->value.integer.min = 0x00000000;
7221da177e4SLinus Torvalds 	uinfo->value.integer.max = 0xffffffff;
7231da177e4SLinus Torvalds 	return 0;
7241da177e4SLinus Torvalds }
7251da177e4SLinus Torvalds static int
snd_vortex_a3d_itd_info(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_info * uinfo)7262fd16874STakashi Iwai snd_vortex_a3d_itd_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
7271da177e4SLinus Torvalds {
7281da177e4SLinus Torvalds 	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
7291da177e4SLinus Torvalds 	uinfo->count = 2;
7301da177e4SLinus Torvalds 	uinfo->value.integer.min = 0x00000000;
7311da177e4SLinus Torvalds 	uinfo->value.integer.max = 0xffffffff;
7321da177e4SLinus Torvalds 	return 0;
7331da177e4SLinus Torvalds }
7341da177e4SLinus Torvalds static int
snd_vortex_a3d_ild_info(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_info * uinfo)7352fd16874STakashi Iwai snd_vortex_a3d_ild_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
7361da177e4SLinus Torvalds {
7371da177e4SLinus Torvalds 	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
7381da177e4SLinus Torvalds 	uinfo->count = 2;
7391da177e4SLinus Torvalds 	uinfo->value.integer.min = 0x00000000;
7401da177e4SLinus Torvalds 	uinfo->value.integer.max = 0xffffffff;
7411da177e4SLinus Torvalds 	return 0;
7421da177e4SLinus Torvalds }
7431da177e4SLinus Torvalds static int
snd_vortex_a3d_filter_info(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_info * uinfo)7442fd16874STakashi Iwai snd_vortex_a3d_filter_info(struct snd_kcontrol *kcontrol,
7452fd16874STakashi Iwai 			   struct snd_ctl_elem_info *uinfo)
7461da177e4SLinus Torvalds {
7471da177e4SLinus Torvalds 	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
7481da177e4SLinus Torvalds 	uinfo->count = 4;
7491da177e4SLinus Torvalds 	uinfo->value.integer.min = 0x00000000;
7501da177e4SLinus Torvalds 	uinfo->value.integer.max = 0xffffffff;
7511da177e4SLinus Torvalds 	return 0;
7521da177e4SLinus Torvalds }
7531da177e4SLinus Torvalds 
7541da177e4SLinus Torvalds static int
snd_vortex_a3d_get(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)7552fd16874STakashi Iwai snd_vortex_a3d_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
7561da177e4SLinus Torvalds {
7571da177e4SLinus Torvalds 	//a3dsrc_t *a = kcontrol->private_data;
7581da177e4SLinus Torvalds 	/* No read yet. Would this be really useable/needed ? */
7591da177e4SLinus Torvalds 
7601da177e4SLinus Torvalds 	return 0;
7611da177e4SLinus Torvalds }
7621da177e4SLinus Torvalds 
7631da177e4SLinus Torvalds static int
snd_vortex_a3d_hrtf_put(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)7642fd16874STakashi Iwai snd_vortex_a3d_hrtf_put(struct snd_kcontrol *kcontrol,
7652fd16874STakashi Iwai 			struct snd_ctl_elem_value *ucontrol)
7661da177e4SLinus Torvalds {
7671da177e4SLinus Torvalds 	a3dsrc_t *a = kcontrol->private_data;
7685e19cad5SHariprasad Kelam 	int i;
7691da177e4SLinus Torvalds 	int coord[6];
7701da177e4SLinus Torvalds 	for (i = 0; i < 6; i++)
7711da177e4SLinus Torvalds 		coord[i] = ucontrol->value.integer.value[i];
7721da177e4SLinus Torvalds 	/* Translate orientation coordinates to a3d params. */
7731da177e4SLinus Torvalds 	vortex_a3d_coord2hrtf(a->hrtf[0], coord);
7741da177e4SLinus Torvalds 	vortex_a3d_coord2hrtf(a->hrtf[1], coord);
7751da177e4SLinus Torvalds 	a3dsrc_SetHrtfTarget(a, a->hrtf[0], a->hrtf[1]);
7761da177e4SLinus Torvalds 	a3dsrc_SetHrtfCurrent(a, a->hrtf[0], a->hrtf[1]);
7775e19cad5SHariprasad Kelam 	return 1;
7781da177e4SLinus Torvalds }
7791da177e4SLinus Torvalds 
7801da177e4SLinus Torvalds static int
snd_vortex_a3d_itd_put(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)7812fd16874STakashi Iwai snd_vortex_a3d_itd_put(struct snd_kcontrol *kcontrol,
7822fd16874STakashi Iwai 		       struct snd_ctl_elem_value *ucontrol)
7831da177e4SLinus Torvalds {
7841da177e4SLinus Torvalds 	a3dsrc_t *a = kcontrol->private_data;
7851da177e4SLinus Torvalds 	int coord[6];
7865e19cad5SHariprasad Kelam 	int i;
7871da177e4SLinus Torvalds 	for (i = 0; i < 6; i++)
7881da177e4SLinus Torvalds 		coord[i] = ucontrol->value.integer.value[i];
7891da177e4SLinus Torvalds 	/* Translate orientation coordinates to a3d params. */
7901da177e4SLinus Torvalds 	vortex_a3d_coord2itd(a->hrtf[0], coord);
7911da177e4SLinus Torvalds 	vortex_a3d_coord2itd(a->hrtf[1], coord);
7921da177e4SLinus Torvalds 	/* Inter aural time difference. */
7931da177e4SLinus Torvalds 	a3dsrc_SetItdTarget(a, a->itd[0], a->itd[1]);
7941da177e4SLinus Torvalds 	a3dsrc_SetItdCurrent(a, a->itd[0], a->itd[1]);
7951da177e4SLinus Torvalds 	a3dsrc_SetItdDline(a, a->dline);
7965e19cad5SHariprasad Kelam 	return 1;
7971da177e4SLinus Torvalds }
7981da177e4SLinus Torvalds 
7991da177e4SLinus Torvalds static int
snd_vortex_a3d_ild_put(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)8002fd16874STakashi Iwai snd_vortex_a3d_ild_put(struct snd_kcontrol *kcontrol,
8012fd16874STakashi Iwai 		       struct snd_ctl_elem_value *ucontrol)
8021da177e4SLinus Torvalds {
8031da177e4SLinus Torvalds 	a3dsrc_t *a = kcontrol->private_data;
8041da177e4SLinus Torvalds 	int l, r;
8051da177e4SLinus Torvalds 	/* There may be some scale tranlation needed here. */
8061da177e4SLinus Torvalds 	l = ucontrol->value.integer.value[0];
8071da177e4SLinus Torvalds 	r = ucontrol->value.integer.value[1];
8081da177e4SLinus Torvalds 	vortex_a3d_coord2ild(a->ild, l, r);
8091da177e4SLinus Torvalds 	/* Left Right panning. */
8101da177e4SLinus Torvalds 	a3dsrc_SetGainTarget(a, l, r);
8111da177e4SLinus Torvalds 	a3dsrc_SetGainCurrent(a, l, r);
8125e19cad5SHariprasad Kelam 	return 1;
8131da177e4SLinus Torvalds }
8141da177e4SLinus Torvalds 
8151da177e4SLinus Torvalds static int
snd_vortex_a3d_filter_put(struct snd_kcontrol * kcontrol,struct snd_ctl_elem_value * ucontrol)8162fd16874STakashi Iwai snd_vortex_a3d_filter_put(struct snd_kcontrol *kcontrol,
8172fd16874STakashi Iwai 			  struct snd_ctl_elem_value *ucontrol)
8181da177e4SLinus Torvalds {
8191da177e4SLinus Torvalds 	a3dsrc_t *a = kcontrol->private_data;
8205e19cad5SHariprasad Kelam 	int i;
8211da177e4SLinus Torvalds 	int params[6];
8221da177e4SLinus Torvalds 	for (i = 0; i < 6; i++)
8231da177e4SLinus Torvalds 		params[i] = ucontrol->value.integer.value[i];
8241da177e4SLinus Torvalds 	/* Translate generic filter params to a3d filter params. */
8251da177e4SLinus Torvalds 	vortex_a3d_translate_filter(a->filter, params);
82625985edcSLucas De Marchi 	/* Atmospheric absorption and filtering. */
8271da177e4SLinus Torvalds 	a3dsrc_SetAtmosTarget(a, a->filter[0],
8281da177e4SLinus Torvalds 			      a->filter[1], a->filter[2],
8291da177e4SLinus Torvalds 			      a->filter[3], a->filter[4]);
8301da177e4SLinus Torvalds 	a3dsrc_SetAtmosCurrent(a, a->filter[0],
8311da177e4SLinus Torvalds 			       a->filter[1], a->filter[2],
8321da177e4SLinus Torvalds 			       a->filter[3], a->filter[4]);
8335e19cad5SHariprasad Kelam 	return 1;
8341da177e4SLinus Torvalds }
8351da177e4SLinus Torvalds 
836f3b827e0SBhumika Goyal static const struct snd_kcontrol_new vortex_a3d_kcontrol = {
8371da177e4SLinus Torvalds 	.iface = SNDRV_CTL_ELEM_IFACE_PCM,
8381da177e4SLinus Torvalds 	.name = "Playback PCM advanced processing",
8391da177e4SLinus Torvalds 	.access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
8401da177e4SLinus Torvalds 	.info = snd_vortex_a3d_hrtf_info,
8411da177e4SLinus Torvalds 	.get = snd_vortex_a3d_get,
8421da177e4SLinus Torvalds 	.put = snd_vortex_a3d_hrtf_put,
8431da177e4SLinus Torvalds };
8441da177e4SLinus Torvalds 
8451da177e4SLinus Torvalds /* Control (un)registration. */
vortex_a3d_register_controls(vortex_t * vortex)846e23e7a14SBill Pemberton static int vortex_a3d_register_controls(vortex_t *vortex)
8471da177e4SLinus Torvalds {
8482fd16874STakashi Iwai 	struct snd_kcontrol *kcontrol;
8491da177e4SLinus Torvalds 	int err, i;
8501da177e4SLinus Torvalds 	/* HRTF controls. */
8511da177e4SLinus Torvalds 	for (i = 0; i < NR_A3D; i++) {
852*c2b0718fSTakashi Iwai 		kcontrol = snd_ctl_new1(&vortex_a3d_kcontrol, &vortex->a3d[i]);
853*c2b0718fSTakashi Iwai 		if (!kcontrol)
8541da177e4SLinus Torvalds 			return -ENOMEM;
8551da177e4SLinus Torvalds 		kcontrol->id.numid = CTRLID_HRTF;
8561da177e4SLinus Torvalds 		kcontrol->info = snd_vortex_a3d_hrtf_info;
8571da177e4SLinus Torvalds 		kcontrol->put = snd_vortex_a3d_hrtf_put;
858*c2b0718fSTakashi Iwai 		err = snd_ctl_add(vortex->card, kcontrol);
859*c2b0718fSTakashi Iwai 		if (err < 0)
8601da177e4SLinus Torvalds 			return err;
8611da177e4SLinus Torvalds 	}
8621da177e4SLinus Torvalds 	/* ITD controls. */
8631da177e4SLinus Torvalds 	for (i = 0; i < NR_A3D; i++) {
864*c2b0718fSTakashi Iwai 		kcontrol = snd_ctl_new1(&vortex_a3d_kcontrol, &vortex->a3d[i]);
865*c2b0718fSTakashi Iwai 		if (!kcontrol)
8661da177e4SLinus Torvalds 			return -ENOMEM;
8671da177e4SLinus Torvalds 		kcontrol->id.numid = CTRLID_ITD;
8681da177e4SLinus Torvalds 		kcontrol->info = snd_vortex_a3d_itd_info;
8691da177e4SLinus Torvalds 		kcontrol->put = snd_vortex_a3d_itd_put;
870*c2b0718fSTakashi Iwai 		err = snd_ctl_add(vortex->card, kcontrol);
871*c2b0718fSTakashi Iwai 		if (err < 0)
8721da177e4SLinus Torvalds 			return err;
8731da177e4SLinus Torvalds 	}
8741da177e4SLinus Torvalds 	/* ILD (gains) controls. */
8751da177e4SLinus Torvalds 	for (i = 0; i < NR_A3D; i++) {
876*c2b0718fSTakashi Iwai 		kcontrol = snd_ctl_new1(&vortex_a3d_kcontrol, &vortex->a3d[i]);
877*c2b0718fSTakashi Iwai 		if (!kcontrol)
8781da177e4SLinus Torvalds 			return -ENOMEM;
8791da177e4SLinus Torvalds 		kcontrol->id.numid = CTRLID_GAINS;
8801da177e4SLinus Torvalds 		kcontrol->info = snd_vortex_a3d_ild_info;
8811da177e4SLinus Torvalds 		kcontrol->put = snd_vortex_a3d_ild_put;
882*c2b0718fSTakashi Iwai 		err = snd_ctl_add(vortex->card, kcontrol);
883*c2b0718fSTakashi Iwai 		if (err < 0)
8841da177e4SLinus Torvalds 			return err;
8851da177e4SLinus Torvalds 	}
8861da177e4SLinus Torvalds 	/* Filter controls. */
8871da177e4SLinus Torvalds 	for (i = 0; i < NR_A3D; i++) {
888*c2b0718fSTakashi Iwai 		kcontrol = snd_ctl_new1(&vortex_a3d_kcontrol, &vortex->a3d[i]);
889*c2b0718fSTakashi Iwai 		if (!kcontrol)
8901da177e4SLinus Torvalds 			return -ENOMEM;
8911da177e4SLinus Torvalds 		kcontrol->id.numid = CTRLID_FILTER;
8921da177e4SLinus Torvalds 		kcontrol->info = snd_vortex_a3d_filter_info;
8931da177e4SLinus Torvalds 		kcontrol->put = snd_vortex_a3d_filter_put;
894*c2b0718fSTakashi Iwai 		err = snd_ctl_add(vortex->card, kcontrol);
895*c2b0718fSTakashi Iwai 		if (err < 0)
8961da177e4SLinus Torvalds 			return err;
8971da177e4SLinus Torvalds 	}
8981da177e4SLinus Torvalds 	return 0;
8991da177e4SLinus Torvalds }
9001da177e4SLinus Torvalds 
vortex_a3d_unregister_controls(vortex_t * vortex)9011da177e4SLinus Torvalds static void vortex_a3d_unregister_controls(vortex_t * vortex)
9021da177e4SLinus Torvalds {
9031da177e4SLinus Torvalds 
9041da177e4SLinus Torvalds }
9051da177e4SLinus Torvalds 
9061da177e4SLinus Torvalds /* End of File*/
907