11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/****************************************************************************
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    ixj.c
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Device Driver for Quicknet Technologies, Inc.'s Telephony cards
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * including the Internet PhoneJACK, Internet PhoneJACK Lite,
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Internet PhoneJACK PCI, Internet LineJACK, Internet PhoneCARD and
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * SmartCABLE
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    (c) Copyright 1999-2001  Quicknet Technologies, Inc.
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    This program is free software; you can redistribute it and/or
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    modify it under the terms of the GNU General Public License
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    as published by the Free Software Foundation; either version
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    2 of the License, or (at your option) any later version.
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Author:          Ed Okerson, <eokerson@quicknet.net>
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Contributors:    Greg Herlein, <gherlein@quicknet.net>
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *                  David W. Erhart, <derhart@quicknet.net>
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *                  John Sellers, <jsellers@quicknet.net>
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *                  Mike Preston, <mpreston@quicknet.net>
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Fixes:           David Huggins-Daines, <dhd@cepstral.com>
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *                  Fabio Ferrari, <fabio.ferrari@digitro.com.br>
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *                  Artis Kugevics, <artis@mt.lv>
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *                  Daniele Bellucci, <bellucda@tiscali.it>
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * More information about the hardware related to this driver can be found
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * at our website:    http://www.quicknet.net
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * IN NO EVENT SHALL QUICKNET TECHNOLOGIES, INC. BE LIABLE TO ANY PARTY FOR
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF QUICKNET
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * TECHNOLOGIES, INC. HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * QUICKNET TECHNOLOGIES, INC. SPECIFICALLY DISCLAIMS ANY WARRANTIES,
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * ON AN "AS IS" BASIS, AND QUICKNET TECHNOLOGIES, INC. HAS NO OBLIGATION
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ***************************************************************************/
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 4.8  2003/07/09 19:39:00  Daniele Bellucci
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Audit some copy_*_user and minor cleanup.
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 4.7  2001/08/13 06:19:33  craigs
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Added additional changes from Alan Cox and John Anderson for
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2.2 to 2.4 cleanup and bounds checking
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 4.6  2001/08/13 01:05:05  craigs
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Really fixed PHONE_QUERY_CODEC problem this time
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 4.5  2001/08/13 00:11:03  craigs
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Fixed problem in handling of PHONE_QUERY_CODEC, thanks to Shane Anderson
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 4.4  2001/08/07 07:58:12  craigs
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Changed back to three digit version numbers
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Added tagbuild target to allow automatic and easy tagging of versions
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 4.3  2001/08/07 07:24:47  craigs
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Added ixj-ver.h to allow easy configuration management of driver
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Added display of version number in /prox/ixj
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 4.2  2001/08/06 07:07:19  craigs
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Reverted IXJCTL_DSP_TYPE and IXJCTL_DSP_VERSION files to original
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * behaviour of returning int rather than short *
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 4.1  2001/08/05 00:17:37  craigs
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * More changes for correct PCMCIA installation
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Start of changes for backward Linux compatibility
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 4.0  2001/08/04 12:33:12  craigs
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * New version using GNU autoconf
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.105  2001/07/20 23:14:32  eokerson
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * More work on CallerID generation when using ring cadences.
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.104  2001/07/06 01:33:55  eokerson
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Some bugfixes from Robert Vojta <vojta@ipex.cz> and a few mods to the Makefile.
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.103  2001/07/05 19:20:16  eokerson
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Updated HOWTO
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Changed mic gain to 30dB on Internet LineJACK mic/speaker port.
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.102  2001/07/03 23:51:21  eokerson
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Un-mute mic on Internet LineJACK when in speakerphone mode.
891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.101  2001/07/02 19:26:56  eokerson
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Removed initialiazation of ixjdebug and ixj_convert_loaded so they will go in the .bss instead of the .data
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.100  2001/07/02 19:18:27  eokerson
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Changed driver to make dynamic allocation possible.  We now pass IXJ * between functions instead of array indexes.
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Fixed the way the POTS and PSTN ports interact during a PSTN call to allow local answering.
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Fixed speaker mode on Internet LineJACK.
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.99  2001/05/09 14:11:16  eokerson
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Fixed kmalloc error in ixj_build_filter_cadence.  Thanks David Chan <cat@waulogy.stanford.edu>.
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.98  2001/05/08 19:55:33  eokerson
1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Fixed POTS hookstate detection while it is connected to PSTN port.
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.97  2001/05/08 00:01:04  eokerson
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Fixed kernel oops when sending caller ID data.
1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.96  2001/05/04 23:09:30  eokerson
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Now uses one kernel timer for each card, instead of one for the entire driver.
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.95  2001/04/25 22:06:47  eokerson
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Fixed squawking at beginning of some G.723.1 calls.
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.94  2001/04/03 23:42:00  eokerson
1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Added linear volume ioctls
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Added raw filter load ioctl
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.93  2001/02/27 01:00:06  eokerson
1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Fixed blocking in CallerID.
1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Reduced size of ixj structure for smaller driver footprint.
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.92  2001/02/20 22:02:59  eokerson
1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Fixed isapnp and pcmcia module compatibility for 2.4.x kernels.
1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Improved PSTN ring detection.
1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Fixed wink generation on POTS ports.
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.91  2001/02/13 00:55:44  eokerson
1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Turn AEC back on after changing frame sizes.
1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.90  2001/02/12 16:42:00  eokerson
1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Added ALAW codec, thanks to Fabio Ferrari for the table based converters to make ALAW from ULAW.
1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.89  2001/02/12 15:41:16  eokerson
1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Fix from Artis Kugevics - Tone gains were not being set correctly.
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.88  2001/02/05 23:25:42  eokerson
1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Fixed lockup bugs with deregister.
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.87  2001/01/29 21:00:39  eokerson
1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Fix from Fabio Ferrari <fabio.ferrari@digitro.com.br> to properly handle EAGAIN and EINTR during non-blocking write.
1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Updated copyright date.
1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.86  2001/01/23 23:53:46  eokerson
1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Fixes to G.729 compatibility.
1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.85  2001/01/23 21:30:36  eokerson
1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Added verbage about cards supported.
1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Removed commands that put the card in low power mode at some times that it should not be in low power mode.
1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.84  2001/01/22 23:32:10  eokerson
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Some bugfixes from David Huggins-Daines, <dhd@cepstral.com> and other cleanups.
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.83  2001/01/19 14:51:41  eokerson
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Fixed ixj_WriteDSPCommand to decrement usage counter when command fails.
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.82  2001/01/19 00:34:49  eokerson
1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Added verbosity to write overlap errors.
1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.81  2001/01/18 23:56:54  eokerson
1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Fixed PSTN line test functions.
1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.80  2001/01/18 22:29:27  eokerson
1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Updated AEC/AGC values for different cards.
1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.79  2001/01/17 02:58:54  eokerson
1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Fixed AEC reset after Caller ID.
1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Fixed Codec lockup after Caller ID on Call Waiting when not using 30ms frames.
1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.78  2001/01/16 19:43:09  eokerson
1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Added support for Linux 2.4.x kernels.
1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.77  2001/01/09 04:00:52  eokerson
17225985edcedea6396277003854657b5f3cb31a628Lucas De Marchi * Linetest will now test the line, even if it has previously succeeded.
1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.76  2001/01/08 19:27:00  eokerson
1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Fixed problem with standard cable on Internet PhoneCARD.
1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.75  2000/12/22 16:52:14  eokerson
1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Modified to allow hookstate detection on the POTS port when the PSTN port is selected.
1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.74  2000/12/08 22:41:50  eokerson
1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Added capability for G729B.
1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.73  2000/12/07 23:35:16  eokerson
1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Added capability to have different ring pattern before CallerID data.
1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Added hookstate checks in CallerID routines to stop FSK.
1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.72  2000/12/06 19:31:31  eokerson
1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Modified signal behavior to only send one signal per event.
1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.71  2000/12/06 03:23:08  eokerson
1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Fixed CallerID on Call Waiting.
1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.70  2000/12/04 21:29:37  eokerson
1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Added checking to Smart Cable gain functions.
1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.69  2000/12/04 21:05:20  eokerson
1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Changed ixjdebug levels.
1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Added ioctls to change gains in Internet Phone CARD Smart Cable.
1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.68  2000/12/04 00:17:21  craigs
2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Changed mixer voice gain to +6dB rather than 0dB
2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.67  2000/11/30 21:25:51  eokerson
2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Fixed write signal errors.
2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.66  2000/11/29 22:42:44  eokerson
2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Fixed PSTN ring detect problems.
2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.65  2000/11/29 07:31:55  craigs
2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Added new 425Hz filter co-efficients
2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Added card-specific DTMF prescaler initialisation
2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.64  2000/11/28 14:03:32  craigs
2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Changed certain mixer initialisations to be 0dB rather than 12dB
2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Added additional information to /proc/ixj
2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.63  2000/11/28 11:38:41  craigs
2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Added display of AEC modes in AUTO and AGC mode
2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.62  2000/11/28 04:05:44  eokerson
2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Improved PSTN ring detection routine.
2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.61  2000/11/27 21:53:12  eokerson
2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Fixed flash detection.
2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.60  2000/11/27 15:57:29  eokerson
2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * More work on G.729 load routines.
2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.59  2000/11/25 21:55:12  eokerson
2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Fixed errors in G.729 load routine.
2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.58  2000/11/25 04:08:29  eokerson
2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Added board locks around G.729 and TS85 load routines.
2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.57  2000/11/24 05:35:17  craigs
2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Added ability to retrieve mixer values on LineJACK
2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Added complete initialisation of all mixer values at startup
2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Fixed spelling mistake
2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Revision 3.56  2000/11/23 02:52:11  robertj
2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Added cvs change log keyword.
2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Fixed bug in capabilities list when using G.729 module.
2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "ixj-ver.h"
2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PERFMON_STATS
2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IXJDEBUG 0
2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MAXRINGS 5
2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/module.h>
2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/init.h>
2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/sched.h>
2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/kernel.h>	/* printk() */
2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/fs.h>		/* everything... */
2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/errno.h>	/* error codes */
2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/slab.h>
260613655fa39ff6957754fa8ceb8559980920eb8eeArnd Bergmann#include <linux/mutex.h>
2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/mm.h>
2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/ioport.h>
2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/interrupt.h>
2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/proc_fs.h>
2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/poll.h>
2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/timer.h>
2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/delay.h>
2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/pci.h>
2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/io.h>
2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/uaccess.h>
2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/isapnp.h>
2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "ixj.h"
2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TYPE(inode) (iminor(inode) >> 4)
2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define NUM(inode) (iminor(inode) & 0xf)
2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
280613655fa39ff6957754fa8ceb8559980920eb8eeArnd Bergmannstatic DEFINE_MUTEX(ixj_mutex);
2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixjdebug;
2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int hertz = HZ;
2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int samplerate = 100;
2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_param(ixjdebug, int, 0);
2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
28725f959d63d39c83fda09d93a052835ed35669b1aAndrew Mortonstatic DEFINE_PCI_DEVICE_TABLE(ixj_pci_tbl) = {
288d77f09e51f5793583ede9733a93bd31a324d051cBen Collins	{ PCI_VENDOR_ID_QUICKNET, PCI_DEVICE_ID_QUICKNET_XJ,
289d77f09e51f5793583ede9733a93bd31a324d051cBen Collins	  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0},
290d77f09e51f5793583ede9733a93bd31a324d051cBen Collins	{ }
291d77f09e51f5793583ede9733a93bd31a324d051cBen Collins};
292d77f09e51f5793583ede9733a93bd31a324d051cBen CollinsMODULE_DEVICE_TABLE(pci, ixj_pci_tbl);
293d77f09e51f5793583ede9733a93bd31a324d051cBen Collins
2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/************************************************************************
2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds*
2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds* ixjdebug meanings are now bit mapped instead of level based
2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds* Values can be or'ed together to turn on multiple messages
2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds*
2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds* bit  0 (0x0001) = any failure
3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds* bit  1 (0x0002) = general messages
3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds* bit  2 (0x0004) = POTS ringing related
3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds* bit  3 (0x0008) = PSTN events
3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds* bit  4 (0x0010) = PSTN Cadence state details
3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds* bit  5 (0x0020) = Tone detection triggers
3051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds* bit  6 (0x0040) = Tone detection cadence details
3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds* bit  7 (0x0080) = ioctl tracking
3071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds* bit  8 (0x0100) = signal tracking
3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds* bit  9 (0x0200) = CallerID generation details
3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds*
3101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds************************************************************************/
3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef IXJ_DYN_ALLOC
3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic IXJ *ixj[IXJMAX];
3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define	get_ixj(b)	ixj[(b)]
3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *	Allocate a free IXJ device
3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic IXJ *ixj_alloc()
3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for(cnt=0; cnt<IXJMAX; cnt++)
3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(ixj[cnt] == NULL || !ixj[cnt]->DSPbase)
3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{
3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j = kmalloc(sizeof(IXJ), GFP_KERNEL);
3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (j == NULL)
3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return NULL;
3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj[cnt] = j;
3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return j;
3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
3331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return NULL;
3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_fsk_free(IXJ *j)
3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3390159f76d9f5839c3c92bc3a91c865e94d5e489a8Jesper Juhl	kfree(j->fskdata);
3400159f76d9f5839c3c92bc3a91c865e94d5e489a8Jesper Juhl	j->fskdata = NULL;
3411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_fsk_alloc(IXJ *j)
3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if(!j->fskdata) {
3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->fskdata = kmalloc(8000, GFP_KERNEL);
3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!j->fskdata) {
3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if(ixjdebug & 0x0200) {
3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				printk("IXJ phone%d - allocate failed\n", j->board);
3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return;
3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->fsksize = 8000;
3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if(ixjdebug & 0x0200) {
35525985edcedea6396277003854657b5f3cb31a628Lucas De Marchi				printk("IXJ phone%d - allocate succeeded\n", j->board);
3561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
3581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
3591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic IXJ ixj[IXJMAX];
3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define	get_ixj(b)	(&ixj[(b)])
3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
3671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *	Allocate a free IXJ device
3681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic IXJ *ixj_alloc(void)
3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int cnt;
3731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for(cnt=0; cnt<IXJMAX; cnt++) {
3741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(!ixj[cnt].DSPbase)
3751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return &ixj[cnt];
3761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
3771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return NULL;
3781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void ixj_fsk_free(IXJ *j) {;}
3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void ixj_fsk_alloc(IXJ *j)
3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->fsksize = 8000;
3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef PERFMON_STATS
3901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ixj_perfmon(x)	((x)++)
3911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
3921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ixj_perfmon(x)	do { } while(0)
3931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
3941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_convert_loaded;
3961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_WriteDSPCommand(unsigned short, IXJ *j);
3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/************************************************************************
4001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds*
4011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds* These are function definitions to allow external modules to register
4021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds* enhanced functionality call backs.
4031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds*
4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds************************************************************************/
4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int Stub(IXJ * J, unsigned long arg)
4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
4101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic IXJ_REGFUNC ixj_PreRead = &Stub;
4121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic IXJ_REGFUNC ixj_PostRead = &Stub;
4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic IXJ_REGFUNC ixj_PreWrite = &Stub;
4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic IXJ_REGFUNC ixj_PostWrite = &Stub;
4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_read_frame(IXJ *j);
4171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_write_frame(IXJ *j);
4181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_init_timer(IXJ *j);
4191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_add_timer(IXJ *	j);
4201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_timeout(unsigned long ptr);
4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int read_filters(IXJ *j);
4221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int LineMonitor(IXJ *j);
4231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_fasync(int fd, struct file *, int mode);
4241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_set_port(IXJ *j, int arg);
4251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_set_pots(IXJ *j, int arg);
4261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_hookstate(IXJ *j);
4271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_record_start(IXJ *j);
4281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_record_stop(IXJ *j);
4291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void set_rec_volume(IXJ *j, int volume);
4301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int get_rec_volume(IXJ *j);
4311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int set_rec_codec(IXJ *j, int rate);
4321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_vad(IXJ *j, int arg);
4331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_play_start(IXJ *j);
4341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_play_stop(IXJ *j);
4351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_set_tone_on(unsigned short arg, IXJ *j);
4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_set_tone_off(unsigned short, IXJ *j);
4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_play_tone(IXJ *j, char tone);
4381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_aec_start(IXJ *j, int level);
4391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int idle(IXJ *j);
4401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_ring_on(IXJ *j);
4411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_ring_off(IXJ *j);
4421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void aec_stop(IXJ *j);
4431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_ringback(IXJ *j);
4441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_busytone(IXJ *j);
4451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_dialtone(IXJ *j);
4461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_cpt_stop(IXJ *j);
4471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic char daa_int_read(IXJ *j);
4481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic char daa_CR_read(IXJ *j, int cr);
4491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int daa_set_mode(IXJ *j, int mode);
4501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_linetest(IXJ *j);
4511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_daa_write(IXJ *j);
4521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_daa_cid_read(IXJ *j);
4531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void DAA_Coeff_US(IXJ *j);
4541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void DAA_Coeff_UK(IXJ *j);
4551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void DAA_Coeff_France(IXJ *j);
4561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void DAA_Coeff_Germany(IXJ *j);
4571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void DAA_Coeff_Australia(IXJ *j);
4581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void DAA_Coeff_Japan(IXJ *j);
4591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_init_filter(IXJ *j, IXJ_FILTER * jf);
4601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr);
4611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_init_tone(IXJ *j, IXJ_TONE * ti);
4621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_build_cadence(IXJ *j, IXJ_CADENCE __user * cp);
4631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE __user * cp);
4641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Serial Control Interface funtions */
4651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int SCI_Control(IXJ *j, int control);
4661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int SCI_Prepare(IXJ *j);
4671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int SCI_WaitHighSCI(IXJ *j);
4681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int SCI_WaitLowSCI(IXJ *j);
4691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic DWORD PCIEE_GetSerialNumber(WORD wAddress);
4701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_PCcontrol_wait(IXJ *j);
4711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_pre_cid(IXJ *j);
4721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_write_cid(IXJ *j);
4731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_write_cid_bit(IXJ *j, int bit);
4741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int set_base_frame(IXJ *j, int size);
4751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int set_play_codec(IXJ *j, int rate);
4761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void set_rec_depth(IXJ *j, int depth);
4771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_mixer(long val, IXJ *j);
4781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/************************************************************************
4801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsCT8020/CT8021 Host Programmers Model
4811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsHost address	Function					Access
4821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsDSPbase +
4831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds0-1		Aux Software Status Register (reserved)		Read Only
4841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds2-3		Software Status Register			Read Only
4851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds4-5		Aux Software Control Register (reserved)	Read Write
4861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds6-7		Software Control Register			Read Write
4871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds8-9		Hardware Status Register			Read Only
4881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsA-B		Hardware Control Register			Read Write
4891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsC-D Host Transmit (Write) Data Buffer Access Port (buffer input)Write Only
49025985edcedea6396277003854657b5f3cb31a628Lucas De MarchiE-F Host Receive (Read) Data Buffer Access Port (buffer input)	Read Only
4911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds************************************************************************/
4921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void ixj_read_HSR(IXJ *j)
4941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
4951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->hsr.bytes.low = inb_p(j->DSPbase + 8);
4961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->hsr.bytes.high = inb_p(j->DSPbase + 9);
4971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
4981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline int IsControlReady(IXJ *j)
5001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
5011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_read_HSR(j);
5021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return j->hsr.bits.controlrdy ? 1 : 0;
5031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
5041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline int IsPCControlReady(IXJ *j)
5061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
5071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->pccr1.byte = inb_p(j->XILINXbase + 3);
5081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return j->pccr1.bits.crr ? 1 : 0;
5091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
5101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline int IsStatusReady(IXJ *j)
5121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
5131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_read_HSR(j);
5141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return j->hsr.bits.statusrdy ? 1 : 0;
5151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
5161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline int IsRxReady(IXJ *j)
5181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
5191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_read_HSR(j);
5201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_perfmon(j->rxreadycheck);
5211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return j->hsr.bits.rxrdy ? 1 : 0;
5221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
5231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline int IsTxReady(IXJ *j)
5251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
5261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_read_HSR(j);
5271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_perfmon(j->txreadycheck);
5281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return j->hsr.bits.txrdy ? 1 : 0;
5291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
5301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void set_play_volume(IXJ *j, int volume)
5321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
5331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixjdebug & 0x0002)
5341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk(KERN_INFO "IXJ: /dev/phone%d Setting Play Volume to 0x%4.4x\n", j->board, volume);
5351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_WriteDSPCommand(0xCF02, j);
5361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_WriteDSPCommand(volume, j);
5371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
5381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int set_play_volume_linear(IXJ *j, int volume)
5401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
5411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int newvolume, dspplaymax;
5421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixjdebug & 0x0002)
5441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Play Volume to 0x%4.4x\n", j->board, volume);
5451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if(volume > 100 || volume < 0) {
5461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
5471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
5481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
5501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (j->cardtype) {
5511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case QTI_PHONEJACK:
5521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		dspplaymax = 0x380;
5531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
5541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case QTI_LINEJACK:
5551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(j->port == PORT_PSTN) {
5561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			dspplaymax = 0x48;
5571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
5581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			dspplaymax = 0x100;
5591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
5601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
5611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case QTI_PHONEJACK_LITE:
5621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		dspplaymax = 0x380;
5631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
5641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case QTI_PHONEJACK_PCI:
5651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		dspplaymax = 0x6C;
5661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
5671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case QTI_PHONECARD:
5681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		dspplaymax = 0x50;
5691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
5701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
5711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
5721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
5731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	newvolume = (dspplaymax * volume) / 100;
5741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	set_play_volume(j, newvolume);
5751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
5761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
5771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void set_play_depth(IXJ *j, int depth)
5791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
5801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (depth > 60)
5811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		depth = 60;
5821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (depth < 0)
5831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		depth = 0;
5841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_WriteDSPCommand(0x5280 + depth, j);
5851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
5861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline int get_play_volume(IXJ *j)
5881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
5891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_WriteDSPCommand(0xCF00, j);
5901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return j->ssr.high << 8 | j->ssr.low;
5911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
5921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int get_play_volume_linear(IXJ *j)
5941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
5951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int volume, newvolume, dspplaymax;
5961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
5981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (j->cardtype) {
5991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case QTI_PHONEJACK:
6001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		dspplaymax = 0x380;
6011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
6021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case QTI_LINEJACK:
6031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(j->port == PORT_PSTN) {
6041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			dspplaymax = 0x48;
6051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
6061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			dspplaymax = 0x100;
6071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
6081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
6091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case QTI_PHONEJACK_LITE:
6101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		dspplaymax = 0x380;
6111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
6121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case QTI_PHONEJACK_PCI:
6131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		dspplaymax = 0x6C;
6141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
6151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case QTI_PHONECARD:
6161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		dspplaymax = 100;
6171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
6181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
6191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
6201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
6211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	volume = get_play_volume(j);
6221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	newvolume = (volume * 100) / dspplaymax;
6231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if(newvolume > 100)
6241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		newvolume = 100;
6251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return newvolume;
6261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
6271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline BYTE SLIC_GetState(IXJ *j)
6291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
6301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->cardtype == QTI_PHONECARD) {
6311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pccr1.byte = 0;
6321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->psccr.bits.dev = 3;
6331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->psccr.bits.rw = 1;
6341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00);
6351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_PCcontrol_wait(j);
6361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF;
6371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_PCcontrol_wait(j);
6381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->pslic.bits.powerdown)
6391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return PLD_SLIC_STATE_OC;
6401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		else if (!j->pslic.bits.ring0 && !j->pslic.bits.ring1)
6411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return PLD_SLIC_STATE_ACTIVE;
6421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		else
6431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return PLD_SLIC_STATE_RINGING;
6441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
6451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01);
6461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
6471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return j->pld_slicr.bits.state;
6481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
6491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
650e13df2c58f8e8c72278b61e8f59de9a1403f9426Richard Knutssonstatic bool SLIC_SetState(BYTE byState, IXJ *j)
6511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
652e13df2c58f8e8c72278b61e8f59de9a1403f9426Richard Knutsson	bool fRetVal = false;
6531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->cardtype == QTI_PHONECARD) {
6551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->flags.pcmciasct) {
6561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			switch (byState) {
6571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case PLD_SLIC_STATE_TIPOPEN:
6581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case PLD_SLIC_STATE_OC:
6591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->pslic.bits.powerdown = 1;
6601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0;
661e13df2c58f8e8c72278b61e8f59de9a1403f9426Richard Knutsson				fRetVal = true;
6621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
6631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case PLD_SLIC_STATE_RINGING:
6641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (j->readers || j->writers) {
6651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->pslic.bits.powerdown = 0;
6661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->pslic.bits.ring0 = 1;
6671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->pslic.bits.ring1 = 0;
668e13df2c58f8e8c72278b61e8f59de9a1403f9426Richard Knutsson					fRetVal = true;
6691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
6701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
6711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case PLD_SLIC_STATE_OHT:	/* On-hook transmit */
6721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case PLD_SLIC_STATE_STANDBY:
6741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case PLD_SLIC_STATE_ACTIVE:
6751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (j->readers || j->writers) {
6761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->pslic.bits.powerdown = 0;
6771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				} else {
6781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->pslic.bits.powerdown = 1;
6791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
6801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->pslic.bits.ring0 = j->pslic.bits.ring1 = 0;
681e13df2c58f8e8c72278b61e8f59de9a1403f9426Richard Knutsson				fRetVal = true;
6821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
6831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case PLD_SLIC_STATE_APR:	/* Active polarity reversal */
6841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case PLD_SLIC_STATE_OHTPR:	/* OHT polarity reversal */
6861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			default:
688e13df2c58f8e8c72278b61e8f59de9a1403f9426Richard Knutsson				fRetVal = false;
6891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
6901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
6911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->psccr.bits.dev = 3;
6921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->psccr.bits.rw = 0;
6931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
6941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_PCcontrol_wait(j);
6951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
6961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
6971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* Set the C1, C2, C3 & B2EN signals. */
6981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (byState) {
6991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case PLD_SLIC_STATE_OC:
7001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.c1 = 0;
7011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.c2 = 0;
7021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.c3 = 0;
7031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.b2en = 0;
7041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
705e13df2c58f8e8c72278b61e8f59de9a1403f9426Richard Knutsson			fRetVal = true;
7061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
7071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case PLD_SLIC_STATE_RINGING:
7081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.c1 = 1;
7091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.c2 = 0;
7101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.c3 = 0;
7111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.b2en = 1;
7121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
713e13df2c58f8e8c72278b61e8f59de9a1403f9426Richard Knutsson			fRetVal = true;
7141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
7151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case PLD_SLIC_STATE_ACTIVE:
7161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.c1 = 0;
7171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.c2 = 1;
7181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.c3 = 0;
7191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.b2en = 0;
7201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
721e13df2c58f8e8c72278b61e8f59de9a1403f9426Richard Knutsson			fRetVal = true;
7221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
7231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case PLD_SLIC_STATE_OHT:	/* On-hook transmit */
7241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.c1 = 1;
7261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.c2 = 1;
7271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.c3 = 0;
7281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.b2en = 0;
7291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
730e13df2c58f8e8c72278b61e8f59de9a1403f9426Richard Knutsson			fRetVal = true;
7311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
7321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case PLD_SLIC_STATE_TIPOPEN:
7331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.c1 = 0;
7341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.c2 = 0;
7351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.c3 = 1;
7361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.b2en = 0;
7371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
738e13df2c58f8e8c72278b61e8f59de9a1403f9426Richard Knutsson			fRetVal = true;
7391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
7401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case PLD_SLIC_STATE_STANDBY:
7411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.c1 = 1;
7421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.c2 = 0;
7431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.c3 = 1;
7441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.b2en = 1;
7451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
746e13df2c58f8e8c72278b61e8f59de9a1403f9426Richard Knutsson			fRetVal = true;
7471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
7481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case PLD_SLIC_STATE_APR:	/* Active polarity reversal */
7491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.c1 = 0;
7511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.c2 = 1;
7521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.c3 = 1;
7531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.b2en = 0;
7541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
755e13df2c58f8e8c72278b61e8f59de9a1403f9426Richard Knutsson			fRetVal = true;
7561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
7571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case PLD_SLIC_STATE_OHTPR:	/* OHT polarity reversal */
7581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.c1 = 1;
7601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.c2 = 1;
7611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.c3 = 1;
7621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.b2en = 0;
7631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
764e13df2c58f8e8c72278b61e8f59de9a1403f9426Richard Knutsson			fRetVal = true;
7651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
7661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		default:
767e13df2c58f8e8c72278b61e8f59de9a1403f9426Richard Knutsson			fRetVal = false;
7681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
7691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
7701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
7711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return fRetVal;
7731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
7741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_wink(IXJ *j)
7761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
7771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	BYTE slicnow;
7781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	slicnow = SLIC_GetState(j);
7801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->pots_winkstart = jiffies;
7821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	SLIC_SetState(PLD_SLIC_STATE_OC, j);
7831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
784f4c9925ccc185da68c2d42230711d017f222e420Nishanth Aravamudan	msleep(jiffies_to_msecs(j->winktime));
7851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	SLIC_SetState(slicnow, j);
7871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
7881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
7891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_init_timer(IXJ *j)
7911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
7921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	init_timer(&j->timer);
7931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->timer.function = ixj_timeout;
7941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->timer.data = (unsigned long)j;
7951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
7961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_add_timer(IXJ *j)
7981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
7991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->timer.expires = jiffies + (hertz / samplerate);
8001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	add_timer(&j->timer);
8011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
8021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_tone_timeout(IXJ *j)
8041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
8051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IXJ_TONE ti;
8061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->tone_state++;
8081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->tone_state == 3) {
8091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->tone_state = 0;
8101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->cadence_t) {
8111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->tone_cadence_state++;
8121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (j->tone_cadence_state >= j->cadence_t->elements_used) {
8131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				switch (j->cadence_t->termination) {
8141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				case PLAY_ONCE:
8151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					ixj_cpt_stop(j);
8161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					break;
8171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				case REPEAT_LAST_ELEMENT:
8181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->tone_cadence_state--;
8191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index);
8201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					break;
8211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				case REPEAT_ALL:
8221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->tone_cadence_state = 0;
8231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					if (j->cadence_t->ce[j->tone_cadence_state].freq0) {
8241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
8251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
8261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
8271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
8281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
8291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						ixj_init_tone(j, &ti);
8301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					}
8311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					ixj_set_tone_on(j->cadence_t->ce[0].tone_on_time, j);
8321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					ixj_set_tone_off(j->cadence_t->ce[0].tone_off_time, j);
8331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					ixj_play_tone(j, j->cadence_t->ce[0].index);
8341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					break;
8351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
8361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			} else {
8371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (j->cadence_t->ce[j->tone_cadence_state].gain0) {
8381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
8391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
8401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
8411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
8421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
8431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					ixj_init_tone(j, &ti);
8441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
8451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ixj_set_tone_on(j->cadence_t->ce[j->tone_cadence_state].tone_on_time, j);
8461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ixj_set_tone_off(j->cadence_t->ce[j->tone_cadence_state].tone_off_time, j);
8471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ixj_play_tone(j, j->cadence_t->ce[j->tone_cadence_state].index);
8481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
8491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
8501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
8511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
8521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void ixj_kill_fasync(IXJ *j, IXJ_SIGEVENT event, int dir)
8541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
8551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if(j->ixj_signals[event]) {
8561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(ixjdebug & 0x0100)
8571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk("Sending signal for event %d\n", event);
8581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			/* Send apps notice of change */
8591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* see config.h for macro definition */
8601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		kill_fasync(&(j->async_queue), j->ixj_signals[event], dir);
8611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
8621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
8631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_pstn_state(IXJ *j)
8651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
8661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int var;
8671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	union XOPXR0 XR0, daaint;
8681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	var = 10;
8701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	XR0.reg = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg;
8721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	daaint.reg = 0;
8731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	XR0.bitreg.RMR = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR;
8741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
8751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->pld_scrr.byte = inb_p(j->XILINXbase);
8761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->pld_scrr.bits.daaflag) {
8771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		daa_int_read(j);
8781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.RING) {
8791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if(time_after(jiffies, j->pstn_sleeptil) && !(j->flags.pots_pstn && j->hookstate)) {
8801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				daaint.bitreg.RING = 1;
8811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if(ixjdebug & 0x0008) {
8821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					printk(KERN_INFO "IXJ DAA Ring Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
8831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
8841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			} else {
8851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				daa_set_mode(j, SOP_PU_RESET);
8861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
8871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
8881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Caller_ID) {
8891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			daaint.bitreg.Caller_ID = 1;
8901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pstn_cid_intr = 1;
8911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pstn_cid_received = jiffies;
8921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if(ixjdebug & 0x0008) {
8931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				printk(KERN_INFO "IXJ DAA Caller_ID Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
8941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
8951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
8961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.Cadence) {
8971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			daaint.bitreg.Cadence = 1;
8981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if(ixjdebug & 0x0008) {
8991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				printk(KERN_INFO "IXJ DAA Cadence Interrupt /dev/phone%d at %ld\n", j->board, jiffies);
9001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
9011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
9021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK != XR0.bitreg.VDD_OK) {
9031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			daaint.bitreg.VDD_OK = 1;
9041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			daaint.bitreg.SI_0 = j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK;
9051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
9061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
9071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	daa_CR_read(j, 1);
9081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if(j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR != XR0.bitreg.RMR && time_after(jiffies, j->pstn_sleeptil) && !(j->flags.pots_pstn && j->hookstate)) {
9091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		daaint.bitreg.RMR = 1;
9101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		daaint.bitreg.SI_1 = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR;
9111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(ixjdebug & 0x0008) {
9121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                        printk(KERN_INFO "IXJ DAA RMR /dev/phone%d was %s for %ld\n", j->board, XR0.bitreg.RMR?"on":"off", jiffies - j->pstn_last_rmr);
9131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
9141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pstn_prev_rmr = j->pstn_last_rmr;
9151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pstn_last_rmr = jiffies;
9161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
9171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch(j->daa_mode) {
9181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case SOP_PU_SLEEP:
9191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (daaint.bitreg.RING) {
9201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (!j->flags.pstn_ringing) {
9211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					if (j->daa_mode != SOP_PU_RINGING) {
9221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						j->pstn_ring_int = jiffies;
9231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						daa_set_mode(j, SOP_PU_RINGING);
9241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					}
9251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
9261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
9271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
9281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case SOP_PU_RINGING:
9291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (daaint.bitreg.RMR) {
9301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (ixjdebug & 0x0008) {
9311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					printk(KERN_INFO "IXJ Ring Cadence a state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies);
9321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
9331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (daaint.bitreg.SI_1) {                /* Rising edge of RMR */
9341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->flags.pstn_rmr = 1;
9351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->pstn_ring_start = jiffies;
9361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->pstn_ring_stop = 0;
9371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->ex.bits.pstn_ring = 0;
9381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					if (j->cadence_f[4].state == 0) {
9391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						j->cadence_f[4].state = 1;
9401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						j->cadence_f[4].on1min = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 - var)) / 10000);
9411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						j->cadence_f[4].on1dot = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100)) / 10000);
9421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						j->cadence_f[4].on1max = jiffies + (long)((j->cadence_f[4].on1 * hertz * (100 + var)) / 10000);
9431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					} else if (j->cadence_f[4].state == 2) {
9441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						if((time_after(jiffies, j->cadence_f[4].off1min) &&
9451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						    time_before(jiffies, j->cadence_f[4].off1max))) {
9461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							if (j->cadence_f[4].on2) {
9471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								j->cadence_f[4].state = 3;
9481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								j->cadence_f[4].on2min = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 - var)) / 10000));
9491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								j->cadence_f[4].on2dot = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100)) / 10000));
9501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								j->cadence_f[4].on2max = jiffies + (long)((j->cadence_f[4].on2 * (hertz * (100 + var)) / 10000));
9511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							} else {
9521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								j->cadence_f[4].state = 7;
9531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							}
9541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						} else {
9551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							if (ixjdebug & 0x0008) {
9561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
9571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds										j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
9581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds										j->cadence_f[4].off1);
9591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							}
9601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							j->cadence_f[4].state = 0;
9611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						}
9621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					} else if (j->cadence_f[4].state == 4) {
9631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						if((time_after(jiffies, j->cadence_f[4].off2min) &&
9641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						    time_before(jiffies, j->cadence_f[4].off2max))) {
9651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							if (j->cadence_f[4].on3) {
9661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								j->cadence_f[4].state = 5;
9671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								j->cadence_f[4].on3min = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 - var)) / 10000));
9681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								j->cadence_f[4].on3dot = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100)) / 10000));
9691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								j->cadence_f[4].on3max = jiffies + (long)((j->cadence_f[4].on3 * (hertz * (100 + var)) / 10000));
9701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							} else {
9711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								j->cadence_f[4].state = 7;
9721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							}
9731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						} else {
9741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							if (ixjdebug & 0x0008) {
9751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
9761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds										j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
9771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds										j->cadence_f[4].off2);
9781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							}
9791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							j->cadence_f[4].state = 0;
9801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						}
9811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					} else if (j->cadence_f[4].state == 6) {
9821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						if((time_after(jiffies, j->cadence_f[4].off3min) &&
9831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						    time_before(jiffies, j->cadence_f[4].off3max))) {
9841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							j->cadence_f[4].state = 7;
9851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						} else {
9861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							if (ixjdebug & 0x0008) {
9871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
9881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds										j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
9891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds										j->cadence_f[4].off3);
9901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							}
9911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							j->cadence_f[4].state = 0;
9921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						}
9931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					} else {
9941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						j->cadence_f[4].state = 0;
9951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					}
9961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				} else {                                /* Falling edge of RMR */
9971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->pstn_ring_start = 0;
9981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->pstn_ring_stop = jiffies;
9991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					if (j->cadence_f[4].state == 1) {
10001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						if(!j->cadence_f[4].on1) {
10011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							j->cadence_f[4].state = 7;
10021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						} else if((time_after(jiffies, j->cadence_f[4].on1min) &&
10031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					          time_before(jiffies, j->cadence_f[4].on1max))) {
10041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							if (j->cadence_f[4].off1) {
10051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								j->cadence_f[4].state = 2;
10061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								j->cadence_f[4].off1min = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 - var)) / 10000));
10071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								j->cadence_f[4].off1dot = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100)) / 10000));
10081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								j->cadence_f[4].off1max = jiffies + (long)((j->cadence_f[4].off1 * (hertz * (100 + var)) / 10000));
10091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							} else {
10101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								j->cadence_f[4].state = 7;
10111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							}
10121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						} else {
10131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							if (ixjdebug & 0x0008) {
10141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
10151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds										j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
10161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds										j->cadence_f[4].on1);
10171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							}
10181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							j->cadence_f[4].state = 0;
10191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						}
10201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					} else if (j->cadence_f[4].state == 3) {
10211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						if((time_after(jiffies, j->cadence_f[4].on2min) &&
10221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						    time_before(jiffies, j->cadence_f[4].on2max))) {
10231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							if (j->cadence_f[4].off2) {
10241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								j->cadence_f[4].state = 4;
10251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								j->cadence_f[4].off2min = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 - var)) / 10000));
10261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								j->cadence_f[4].off2dot = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100)) / 10000));
10271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								j->cadence_f[4].off2max = jiffies + (long)((j->cadence_f[4].off2 * (hertz * (100 + var)) / 10000));
10281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							} else {
10291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								j->cadence_f[4].state = 7;
10301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							}
10311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						} else {
10321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							if (ixjdebug & 0x0008) {
10331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
10341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds										j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
10351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds										j->cadence_f[4].on2);
10361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							}
10371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							j->cadence_f[4].state = 0;
10381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						}
10391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					} else if (j->cadence_f[4].state == 5) {
10401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						if((time_after(jiffies, j->cadence_f[4].on3min) &&
10411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						    time_before(jiffies, j->cadence_f[4].on3max))) {
10421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							if (j->cadence_f[4].off3) {
10431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								j->cadence_f[4].state = 6;
10441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								j->cadence_f[4].off3min = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 - var)) / 10000));
10451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								j->cadence_f[4].off3dot = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100)) / 10000));
10461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								j->cadence_f[4].off3max = jiffies + (long)((j->cadence_f[4].off3 * (hertz * (100 + var)) / 10000));
10471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							} else {
10481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								j->cadence_f[4].state = 7;
10491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							}
10501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						} else {
10511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							j->cadence_f[4].state = 0;
10521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						}
10531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					} else {
10541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						if (ixjdebug & 0x0008) {
10551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							printk(KERN_INFO "IXJ Ring Cadence fail state = %d /dev/phone%d at %ld should be %d\n",
10561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds									j->cadence_f[4].state, j->board, jiffies - j->pstn_prev_rmr,
10571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds									j->cadence_f[4].on3);
10581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						}
10591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						j->cadence_f[4].state = 0;
10601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					}
10611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
10621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (ixjdebug & 0x0010) {
10631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					printk(KERN_INFO "IXJ Ring Cadence b state = %d /dev/phone%d at %ld\n", j->cadence_f[4].state, j->board, jiffies);
10641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
10651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (ixjdebug & 0x0010) {
10661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					switch(j->cadence_f[4].state) {
10671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						case 1:
10681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
10691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						j->cadence_f[4].on1, j->cadence_f[4].on1min, j->cadence_f[4].on1dot, j->cadence_f[4].on1max);
10701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							break;
10711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						case 2:
10721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
10731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						j->cadence_f[4].off1, j->cadence_f[4].off1min, j->cadence_f[4].off1dot, j->cadence_f[4].off1max);
10741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							break;
10751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						case 3:
10761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
10771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						j->cadence_f[4].on2, j->cadence_f[4].on2min, j->cadence_f[4].on2dot, j->cadence_f[4].on2max);
10781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							break;
10791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						case 4:
10801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
10811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						j->cadence_f[4].off2, j->cadence_f[4].off2min, j->cadence_f[4].off2dot, j->cadence_f[4].off2max);
10821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							break;
10831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						case 5:
10841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
10851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						j->cadence_f[4].on3, j->cadence_f[4].on3min, j->cadence_f[4].on3dot, j->cadence_f[4].on3max);
10861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							break;
10871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						case 6:
10881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							printk(KERN_INFO "IXJ /dev/phone%d Next Ring Cadence state at %u min %ld - %ld - max %ld\n", j->board,
10891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						j->cadence_f[4].off3, j->cadence_f[4].off3min, j->cadence_f[4].off3dot, j->cadence_f[4].off3max);
10901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							break;
10911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					}
10921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
10931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
10941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (j->cadence_f[4].state == 7) {
10951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->cadence_f[4].state = 0;
10961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->pstn_ring_stop = jiffies;
10971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->ex.bits.pstn_ring = 1;
10981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ixj_kill_fasync(j, SIG_PSTN_RING, POLL_IN);
10991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if(ixjdebug & 0x0008) {
11001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					printk(KERN_INFO "IXJ Ring int set /dev/phone%d at %ld\n", j->board, jiffies);
11011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
11021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
11031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if((j->pstn_ring_int != 0 && time_after(jiffies, j->pstn_ring_int + (hertz * 5)) && !j->flags.pstn_rmr) ||
11041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			   (j->pstn_ring_stop != 0 && time_after(jiffies, j->pstn_ring_stop + (hertz * 5)))) {
11051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if(ixjdebug & 0x0008) {
11061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					printk("IXJ DAA no ring in 5 seconds /dev/phone%d at %ld\n", j->board, jiffies);
11071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					printk("IXJ DAA pstn ring int /dev/phone%d at %ld\n", j->board, j->pstn_ring_int);
11081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					printk("IXJ DAA pstn ring stop /dev/phone%d at %ld\n", j->board, j->pstn_ring_stop);
11091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
11101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->pstn_ring_stop = j->pstn_ring_int = 0;
11111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				daa_set_mode(j, SOP_PU_SLEEP);
11121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
11131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb_p(j->pld_scrw.byte, j->XILINXbase);
11141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (j->pstn_cid_intr && time_after(jiffies, j->pstn_cid_received + hertz)) {
11151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ixj_daa_cid_read(j);
11161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->ex.bits.caller_id = 1;
11171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ixj_kill_fasync(j, SIG_CALLER_ID, POLL_IN);
11181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->pstn_cid_intr = 0;
11191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
11201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (daaint.bitreg.Cadence) {
11211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if(ixjdebug & 0x0008) {
11221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					printk("IXJ DAA Cadence interrupt going to sleep /dev/phone%d\n", j->board);
11231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
11241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				daa_set_mode(j, SOP_PU_SLEEP);
11251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->ex.bits.pstn_ring = 0;
11261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
11271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
11281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case SOP_PU_CONVERSATION:
11291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (daaint.bitreg.VDD_OK) {
11301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if(!daaint.bitreg.SI_0) {
11311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					if (!j->pstn_winkstart) {
11321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						if(ixjdebug & 0x0008) {
11331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							printk("IXJ DAA possible wink /dev/phone%d %ld\n", j->board, jiffies);
11341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						}
11351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						j->pstn_winkstart = jiffies;
11361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					}
11371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				} else {
11381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					if (j->pstn_winkstart) {
11391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						if(ixjdebug & 0x0008) {
11401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							printk("IXJ DAA possible wink end /dev/phone%d %ld\n", j->board, jiffies);
11411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						}
11421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						j->pstn_winkstart = 0;
11431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					}
11441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
11451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
11461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (j->pstn_winkstart && time_after(jiffies, j->pstn_winkstart + ((hertz * j->winktime) / 1000))) {
11471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if(ixjdebug & 0x0008) {
11481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					printk("IXJ DAA wink detected going to sleep /dev/phone%d %ld\n", j->board, jiffies);
11491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
11501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				daa_set_mode(j, SOP_PU_SLEEP);
11511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->pstn_winkstart = 0;
11521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->ex.bits.pstn_wink = 1;
11531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ixj_kill_fasync(j, SIG_PSTN_WINK, POLL_IN);
11541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
11551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
11561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
11571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
11581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_timeout(unsigned long ptr)
11601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
11611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int board;
11621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long jifon;
11631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IXJ *j = (IXJ *)ptr;
11641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	board = j->board;
11651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
11661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->DSPbase && atomic_read(&j->DSPWrite) == 0 && test_and_set_bit(board, (void *)&j->busyflags) == 0) {
11671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_perfmon(j->timerchecks);
11681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->hookstate = ixj_hookstate(j);
11691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->tone_state) {
11701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!(j->hookstate)) {
11711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ixj_cpt_stop(j);
11721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (j->m_hook) {
11731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->m_hook = 0;
11741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->ex.bits.hookstate = 1;
11751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
11761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
11771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				clear_bit(board, &j->busyflags);
11781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ixj_add_timer(j);
11791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return;
11801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
11811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (j->tone_state == 1)
11821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				jifon = ((hertz * j->tone_on_time) * 25 / 100000);
11831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			else
11841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				jifon = ((hertz * j->tone_on_time) * 25 / 100000) + ((hertz * j->tone_off_time) * 25 / 100000);
11851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (time_before(jiffies, j->tone_start_jif + jifon)) {
11861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (j->tone_state == 1) {
11871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					ixj_play_tone(j, j->tone_index);
11881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					if (j->dsp.low == 0x20) {
11891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						clear_bit(board, &j->busyflags);
11901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						ixj_add_timer(j);
11911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						return;
11921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					}
11931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				} else {
11941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					ixj_play_tone(j, 0);
11951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					if (j->dsp.low == 0x20) {
11961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						clear_bit(board, &j->busyflags);
11971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						ixj_add_timer(j);
11981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						return;
11991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					}
12001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
12011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			} else {
12021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ixj_tone_timeout(j);
12031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (j->flags.dialtone) {
12041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					ixj_dialtone(j);
12051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
12061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (j->flags.busytone) {
12071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					ixj_busytone(j);
12081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					if (j->dsp.low == 0x20) {
12091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						clear_bit(board, &j->busyflags);
12101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						ixj_add_timer(j);
12111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						return;
12121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					}
12131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
12141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (j->flags.ringback) {
12151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					ixj_ringback(j);
12161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					if (j->dsp.low == 0x20) {
12171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						clear_bit(board, &j->busyflags);
12181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						ixj_add_timer(j);
12191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						return;
12201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					}
12211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
12221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (!j->tone_state) {
12231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					ixj_cpt_stop(j);
12241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
12251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
12261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
12271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!(j->tone_state && j->dsp.low == 0x20)) {
12281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (IsRxReady(j)) {
12291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ixj_read_frame(j);
12301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
12311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (IsTxReady(j)) {
12321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ixj_write_frame(j);
12331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
12341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
12351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->flags.cringing) {
12361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (j->hookstate & 1) {
12371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->flags.cringing = 0;
12381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ixj_ring_off(j);
12391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			} else if(j->cadence_f[5].enable && ((!j->cadence_f[5].en_filter) || (j->cadence_f[5].en_filter && j->flags.firstring))) {
12401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				switch(j->cadence_f[5].state) {
12411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					case 0:
12421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						j->cadence_f[5].on1dot = jiffies + (long)((j->cadence_f[5].on1 * (hertz * 100) / 10000));
12431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						if (time_before(jiffies, j->cadence_f[5].on1dot)) {
12441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							if(ixjdebug & 0x0004) {
12451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
12461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							}
12471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							ixj_ring_on(j);
12481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						}
12491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						j->cadence_f[5].state = 1;
12501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						break;
12511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					case 1:
12521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						if (time_after(jiffies, j->cadence_f[5].on1dot)) {
12531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							j->cadence_f[5].off1dot = jiffies + (long)((j->cadence_f[5].off1 * (hertz * 100) / 10000));
12541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							if(ixjdebug & 0x0004) {
12551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
12561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							}
12571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							ixj_ring_off(j);
12581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							j->cadence_f[5].state = 2;
12591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						}
12601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						break;
12611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					case 2:
12621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						if (time_after(jiffies, j->cadence_f[5].off1dot)) {
12631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							if(ixjdebug & 0x0004) {
12641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
12651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							}
12661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							ixj_ring_on(j);
12671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							if (j->cadence_f[5].on2) {
12681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								j->cadence_f[5].on2dot = jiffies + (long)((j->cadence_f[5].on2 * (hertz * 100) / 10000));
12691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								j->cadence_f[5].state = 3;
12701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							} else {
12711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								j->cadence_f[5].state = 7;
12721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							}
12731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						}
12741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						break;
12751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					case 3:
12761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						if (time_after(jiffies, j->cadence_f[5].on2dot)) {
12771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							if(ixjdebug & 0x0004) {
12781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
12791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							}
12801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							ixj_ring_off(j);
12811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							if (j->cadence_f[5].off2) {
12821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								j->cadence_f[5].off2dot = jiffies + (long)((j->cadence_f[5].off2 * (hertz * 100) / 10000));
12831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								j->cadence_f[5].state = 4;
12841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							} else {
12851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								j->cadence_f[5].state = 7;
12861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							}
12871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						}
12881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						break;
12891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					case 4:
12901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						if (time_after(jiffies, j->cadence_f[5].off2dot)) {
12911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							if(ixjdebug & 0x0004) {
12921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
12931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							}
12941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							ixj_ring_on(j);
12951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							if (j->cadence_f[5].on3) {
12961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								j->cadence_f[5].on3dot = jiffies + (long)((j->cadence_f[5].on3 * (hertz * 100) / 10000));
12971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								j->cadence_f[5].state = 5;
12981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							} else {
12991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								j->cadence_f[5].state = 7;
13001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							}
13011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						}
13021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						break;
13031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					case 5:
13041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						if (time_after(jiffies, j->cadence_f[5].on3dot)) {
13051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							if(ixjdebug & 0x0004) {
13061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
13071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							}
13081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							ixj_ring_off(j);
13091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							if (j->cadence_f[5].off3) {
13101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								j->cadence_f[5].off3dot = jiffies + (long)((j->cadence_f[5].off3 * (hertz * 100) / 10000));
13111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								j->cadence_f[5].state = 6;
13121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							} else {
13131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								j->cadence_f[5].state = 7;
13141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							}
13151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						}
13161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						break;
13171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					case 6:
13181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						if (time_after(jiffies, j->cadence_f[5].off3dot)) {
13191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							if(ixjdebug & 0x0004) {
13201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
13211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							}
13221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							j->cadence_f[5].state = 7;
13231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						}
13241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						break;
13251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					case 7:
13261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						if(ixjdebug & 0x0004) {
13271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							printk("Ringing cadence state = %d - %ld\n", j->cadence_f[5].state, jiffies);
13281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						}
13291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						j->flags.cidring = 1;
13301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						j->cadence_f[5].state = 0;
13311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						break;
13321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
13331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (j->flags.cidring && !j->flags.cidsent) {
13341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->flags.cidsent = 1;
13351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					if(j->fskdcnt) {
13361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						SLIC_SetState(PLD_SLIC_STATE_OHT, j);
13371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						ixj_pre_cid(j);
13381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					}
13391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->flags.cidring = 0;
13401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
13411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				clear_bit(board, &j->busyflags);
13421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ixj_add_timer(j);
13431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return;
13441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			} else {
13451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (time_after(jiffies, j->ring_cadence_jif + (hertz / 2))) {
13461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					if (j->flags.cidring && !j->flags.cidsent) {
13471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						j->flags.cidsent = 1;
13481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						if(j->fskdcnt) {
13491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							SLIC_SetState(PLD_SLIC_STATE_OHT, j);
13501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							ixj_pre_cid(j);
13511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						}
13521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						j->flags.cidring = 0;
13531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					}
13541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->ring_cadence_t--;
13551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					if (j->ring_cadence_t == -1)
13561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						j->ring_cadence_t = 15;
13571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->ring_cadence_jif = jiffies;
13581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
13591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					if (j->ring_cadence & 1 << j->ring_cadence_t) {
13601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						if(j->flags.cidsent && j->cadence_f[5].en_filter)
13611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							j->flags.firstring = 1;
13621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						else
13631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							ixj_ring_on(j);
13641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					} else {
13651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						ixj_ring_off(j);
13661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						if(!j->flags.cidsent)
13671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							j->flags.cidring = 1;
13681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					}
13691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
13701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				clear_bit(board, &j->busyflags);
13711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ixj_add_timer(j);
13721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return;
13731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
13741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
13751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!j->flags.ringing) {
13761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (j->hookstate) { /* & 1) { */
13771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (j->dsp.low != 0x20 &&
13781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				    SLIC_GetState(j) != PLD_SLIC_STATE_ACTIVE) {
13791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j);
13801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
13811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				LineMonitor(j);
13821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				read_filters(j);
13831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ixj_WriteDSPCommand(0x511B, j);
13841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->proc_load = j->ssr.high << 8 | j->ssr.low;
13851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (!j->m_hook && (j->hookstate & 1)) {
13861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->m_hook = j->ex.bits.hookstate = 1;
13871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
13881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
13891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			} else {
13901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (j->ex.bits.dtmf_ready) {
13911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->dtmf_wp = j->dtmf_rp = j->ex.bits.dtmf_ready = 0;
13921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
13931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (j->m_hook) {
13941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->m_hook = 0;
13951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->ex.bits.hookstate = 1;
13961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
13971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
13981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
13991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
14001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->cardtype == QTI_LINEJACK && !j->flags.pstncheck && j->flags.pstn_present) {
14011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_pstn_state(j);
14021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
14031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->ex.bytes) {
14041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			wake_up_interruptible(&j->poll_q);	/* Wake any blocked selects */
14051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
14061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		clear_bit(board, &j->busyflags);
14071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
14081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_add_timer(j);
14091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
14101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
14111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_status_wait(IXJ *j)
14121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
14131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long jif;
14141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
14151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	jif = jiffies + ((60 * hertz) / 100);
14161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while (!IsStatusReady(j)) {
14171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_perfmon(j->statuswait);
14181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (time_after(jiffies, jif)) {
14191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_perfmon(j->statuswaitfail);
14201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -1;
14211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
14221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
14231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
14241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
14251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
14261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_PCcontrol_wait(IXJ *j)
14271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
14281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long jif;
14291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
14301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	jif = jiffies + ((60 * hertz) / 100);
14311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while (!IsPCControlReady(j)) {
14321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_perfmon(j->pcontrolwait);
14331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (time_after(jiffies, jif)) {
14341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_perfmon(j->pcontrolwaitfail);
14351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -1;
14361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
14371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
14381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
14391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
14401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
14411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_WriteDSPCommand(unsigned short cmd, IXJ *j)
14421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
14431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	BYTES bytes;
14441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long jif;
14451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
14461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	atomic_inc(&j->DSPWrite);
14471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if(atomic_read(&j->DSPWrite) > 1) {
14481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk("IXJ %d DSP write overlap attempting command 0x%4.4x\n", j->board, cmd);
14491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
14501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
14511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = (cmd & 0xFF00) >> 8;
14521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = cmd & 0x00FF;
14531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	jif = jiffies + ((60 * hertz) / 100);
14541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while (!IsControlReady(j)) {
14551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_perfmon(j->iscontrolready);
14561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (time_after(jiffies, jif)) {
14571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_perfmon(j->iscontrolreadyfail);
14581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			atomic_dec(&j->DSPWrite);
14591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if(atomic_read(&j->DSPWrite) > 0) {
14601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				printk("IXJ %d DSP overlaped command 0x%4.4x during control ready failure.\n", j->board, cmd);
14611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				while(atomic_read(&j->DSPWrite) > 0) {
14621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					atomic_dec(&j->DSPWrite);
14631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
14641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
14651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -1;
14661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
14671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
14681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	outb(bytes.low, j->DSPbase + 6);
14691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	outb(bytes.high, j->DSPbase + 7);
14701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
14711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixj_status_wait(j)) {
14721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->ssr.low = 0xFF;
14731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->ssr.high = 0xFF;
14741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		atomic_dec(&j->DSPWrite);
14751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(atomic_read(&j->DSPWrite) > 0) {
14761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk("IXJ %d DSP overlaped command 0x%4.4x during status wait failure.\n", j->board, cmd);
14771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			while(atomic_read(&j->DSPWrite) > 0) {
14781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				atomic_dec(&j->DSPWrite);
14791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
14801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
14811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
14821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
14831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Read Software Status Register */
14841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->ssr.low = inb_p(j->DSPbase + 2);
14851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->ssr.high = inb_p(j->DSPbase + 3);
14861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	atomic_dec(&j->DSPWrite);
14871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if(atomic_read(&j->DSPWrite) > 0) {
14881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk("IXJ %d DSP overlaped command 0x%4.4x\n", j->board, cmd);
14891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		while(atomic_read(&j->DSPWrite) > 0) {
14901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			atomic_dec(&j->DSPWrite);
14911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
14921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
14931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
14941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
14951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
14961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/***************************************************************************
14971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds*
14981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds*  General Purpose IO Register read routine
14991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds*
15001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds***************************************************************************/
15011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline int ixj_gpio_read(IXJ *j)
15021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
15031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixj_WriteDSPCommand(0x5143, j))
15041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
15051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
15061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->gpio.bytes.low = j->ssr.low;
15071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->gpio.bytes.high = j->ssr.high;
15081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
15091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
15101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
15111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
15121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline void LED_SetState(int state, IXJ *j)
15131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
15141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->cardtype == QTI_LINEJACK) {
15151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pld_scrw.bits.led1 = state & 0x1 ? 1 : 0;
15161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pld_scrw.bits.led2 = state & 0x2 ? 1 : 0;
15171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pld_scrw.bits.led3 = state & 0x4 ? 1 : 0;
15181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pld_scrw.bits.led4 = state & 0x8 ? 1 : 0;
15191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
15201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb(j->pld_scrw.byte, j->XILINXbase);
15211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
15221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
15231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
15241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*********************************************************************
15251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds*  GPIO Pins are configured as follows on the Quicknet Internet
15261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds*  PhoneJACK Telephony Cards
15271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds*
15281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds* POTS Select        GPIO_6=0 GPIO_7=0
15291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds* Mic/Speaker Select GPIO_6=0 GPIO_7=1
15301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds* Handset Select     GPIO_6=1 GPIO_7=0
15311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds*
15321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds* SLIC Active        GPIO_1=0 GPIO_2=1 GPIO_5=0
15331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds* SLIC Ringing       GPIO_1=1 GPIO_2=1 GPIO_5=0
15341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds* SLIC Open Circuit  GPIO_1=0 GPIO_2=0 GPIO_5=0
15351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds*
15361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds* Hook Switch changes reported on GPIO_3
15371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds*********************************************************************/
15381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_set_port(IXJ *j, int arg)
15391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
15401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->cardtype == QTI_PHONEJACK_LITE) {
15411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (arg != PORT_POTS)
15421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 10;
15431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		else
15441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 0;
15451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
15461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (arg) {
15471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PORT_POTS:
15481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->port = PORT_POTS;
15491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (j->cardtype) {
15501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case QTI_PHONECARD:
15511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (j->flags.pcmciasct == 1)
15521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j);
15531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			else
15541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return 11;
15551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
15561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case QTI_PHONEJACK_PCI:
15571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.pcib.mic = 0;
15581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.pcib.spk = 0;
15591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
15601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
15611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case QTI_LINEJACK:
15621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_set_pots(j, 0);			/* Disconnect POTS/PSTN relay */
15631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (ixj_WriteDSPCommand(0xC528, j))		/* Write CODEC config to
15641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds									   Software Control Register */
15651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return 2;
15661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */
15671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
15681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb(j->pld_scrw.byte, j->XILINXbase);
15691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_clock.byte = 0;
15701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb(j->pld_clock.byte, j->XILINXbase + 0x04);
15711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.rly1 = 1;
15721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.spken = 0;
15731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
15741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x1200, j);	/* Turn Off MIC switch on mixer left */
15751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x1401, j);	/* Turn On Mono1 switch on mixer left */
15761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x1300, j);       /* Turn Off MIC switch on mixer right */
15771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x1501, j);       /* Turn On Mono1 switch on mixer right */
15781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x0E80, j);	/*Mic mute */
15791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x0F00, j);	/* Set mono out (SLIC) to 0dB */
15801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x0080, j);	/* Mute Master Left volume */
15811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x0180, j);	/* Mute Master Right volume */
15821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
15831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*			SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
15841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
15851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case QTI_PHONEJACK:
15861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->gpio.bytes.high = 0x0B;
15871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->gpio.bits.gpio6 = 0;
15881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->gpio.bits.gpio7 = 0;
15891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(j->gpio.word, j);
15901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
15911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
15921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
15931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PORT_PSTN:
15941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->cardtype == QTI_LINEJACK) {
15951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0xC534, j);	/* Write CODEC config to Software Control Register */
15961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
15971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.rly3 = 0;
15981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.rly1 = 1;
15991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.spken = 0;
16001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
16011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->port = PORT_PSTN;
16021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
16031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 4;
16041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
16051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
16061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PORT_SPEAKER:
16071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->port = PORT_SPEAKER;
16081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (j->cardtype) {
16091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case QTI_PHONECARD:
16101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (j->flags.pcmciasct) {
16111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				SLIC_SetState(PLD_SLIC_STATE_OC, j);
16121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
16131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
16141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case QTI_PHONEJACK_PCI:
16151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.pcib.mic = 1;
16161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.pcib.spk = 1;
16171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
16181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
16191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case QTI_LINEJACK:
16201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_set_pots(j, 0);			/* Disconnect POTS/PSTN relay */
16211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (ixj_WriteDSPCommand(0xC528, j))		/* Write CODEC config to
16221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds									   Software Control Register */
16231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return 2;
16241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */
16251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
16261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb(j->pld_scrw.byte, j->XILINXbase);
16271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_clock.byte = 0;
16281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb(j->pld_clock.byte, j->XILINXbase + 0x04);
16291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.rly1 = 1;
16301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.spken = 1;
16311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
16321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x1201, j);	/* Turn On MIC switch on mixer left */
16331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x1400, j);	/* Turn Off Mono1 switch on mixer left */
16341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x1301, j);       /* Turn On MIC switch on mixer right */
16351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x1500, j);       /* Turn Off Mono1 switch on mixer right */
16361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x0E06, j);	/*Mic un-mute 0dB */
16371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x0F80, j);	/* Mute mono out (SLIC) */
16381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x0000, j);	/* Set Master Left volume to 0dB */
16391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x0100, j);	/* Set Master Right volume to 0dB */
16401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
16411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case QTI_PHONEJACK:
16421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->gpio.bytes.high = 0x0B;
16431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->gpio.bits.gpio6 = 0;
16441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->gpio.bits.gpio7 = 1;
16451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(j->gpio.word, j);
16461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
16471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
16481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
16491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PORT_HANDSET:
16501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->cardtype != QTI_PHONEJACK) {
16511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 5;
16521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
16531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->gpio.bytes.high = 0x0B;
16541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->gpio.bits.gpio6 = 1;
16551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->gpio.bits.gpio7 = 0;
16561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(j->gpio.word, j);
16571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->port = PORT_HANDSET;
16581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
16591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
16601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
16611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 6;
16621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
16631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
16641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
16651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
16661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
16671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_set_pots(IXJ *j, int arg)
16681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
16691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->cardtype == QTI_LINEJACK) {
16701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (arg) {
16711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (j->port == PORT_PSTN) {
16721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->pld_slicw.bits.rly1 = 0;
16731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
16741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->flags.pots_pstn = 1;
16751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return 1;
16761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			} else {
16771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->flags.pots_pstn = 0;
16781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return 0;
16791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
16801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
16811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.rly1 = 1;
16821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb(j->pld_slicw.byte, j->XILINXbase + 0x01);
16831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->flags.pots_pstn = 0;
16841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 1;
16851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
16861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
16871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
16881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
16891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
16901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
16911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_ring_on(IXJ *j)
16921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
16931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->dsp.low == 0x20)	/* Internet PhoneJACK */
16941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 {
16951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixjdebug & 0x0004)
16961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk(KERN_INFO "IXJ Ring On /dev/phone%d\n", 	j->board);
16971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
16981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->gpio.bytes.high = 0x0B;
16991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->gpio.bytes.low = 0x00;
17001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->gpio.bits.gpio1 = 1;
17011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->gpio.bits.gpio2 = 1;
17021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->gpio.bits.gpio5 = 0;
17031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_WriteDSPCommand(j->gpio.word, j);	/* send the ring signal */
17041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else			/* Internet LineJACK, Internet PhoneJACK Lite or Internet PhoneJACK PCI */
17051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
17061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixjdebug & 0x0004)
17071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk(KERN_INFO "IXJ Ring On /dev/phone%d\n", j->board);
17081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
17091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		SLIC_SetState(PLD_SLIC_STATE_RINGING, j);
17101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
17111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
17121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
17131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_siadc(IXJ *j, int val)
17141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
17151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if(j->cardtype == QTI_PHONECARD){
17161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(j->flags.pcmciascp){
17171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if(val == -1)
17181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return j->siadc.bits.rxg;
17191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
17201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if(val < 0 || val > 0x1F)
17211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return -1;
17221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
17231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->siadc.bits.hom = 0;				/* Handset Out Mute */
17241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->siadc.bits.lom = 0;				/* Line Out Mute */
17251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->siadc.bits.rxg = val;			/*(0xC000 - 0x41C8) / 0x4EF;    RX PGA Gain */
17261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->psccr.bits.addr = 6;				/* R/W Smart Cable Register Address */
17271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->psccr.bits.rw = 0;				/* Read / Write flag */
17281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->psccr.bits.dev = 0;
17291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb(j->siadc.byte, j->XILINXbase + 0x00);
17301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb(j->psccr.byte, j->XILINXbase + 0x01);
17311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_PCcontrol_wait(j);
17321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return j->siadc.bits.rxg;
17331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
17341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
17351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return -1;
17361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
17371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
17381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_sidac(IXJ *j, int val)
17391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
17401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if(j->cardtype == QTI_PHONECARD){
17411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(j->flags.pcmciascp){
17421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if(val == -1)
17431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return j->sidac.bits.txg;
17441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
17451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if(val < 0 || val > 0x1F)
17461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return -1;
17471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
17481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->sidac.bits.srm = 1;				/* Speaker Right Mute */
17491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->sidac.bits.slm = 1;				/* Speaker Left Mute */
17501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->sidac.bits.txg = val;			/* (0xC000 - 0x45E4) / 0x5D3;	 TX PGA Gain */
17511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->psccr.bits.addr = 7;				/* R/W Smart Cable Register Address */
17521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->psccr.bits.rw = 0;				/* Read / Write flag */
17531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->psccr.bits.dev = 0;
17541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb(j->sidac.byte, j->XILINXbase + 0x00);
17551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb(j->psccr.byte, j->XILINXbase + 0x01);
17561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_PCcontrol_wait(j);
17571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return j->sidac.bits.txg;
17581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
17591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
17601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return -1;
17611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
17621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
17631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_pcmcia_cable_check(IXJ *j)
17641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
17651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->pccr1.byte = inb_p(j->XILINXbase + 0x03);
17661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!j->flags.pcmciastate) {
17671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pccr2.byte = inb_p(j->XILINXbase + 0x02);
17681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->pccr1.bits.drf || j->pccr2.bits.rstc) {
17691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->flags.pcmciastate = 4;
17701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 0;
17711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
17721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->pccr1.bits.ed) {
17731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pccr1.bits.ed = 0;
17741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->psccr.bits.dev = 3;
17751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->psccr.bits.rw = 1;
17761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outw_p(j->psccr.byte << 8, j->XILINXbase + 0x00);
17771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_PCcontrol_wait(j);
17781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pslic.byte = inw_p(j->XILINXbase + 0x00) & 0xFF;
17791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pslic.bits.led2 = j->pslic.bits.det ? 1 : 0;
17801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->psccr.bits.dev = 3;
17811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->psccr.bits.rw = 0;
17821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
17831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_PCcontrol_wait(j);
17841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return j->pslic.bits.led2 ? 1 : 0;
17851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else if (j->flags.pcmciasct) {
17861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return j->r_hook;
17871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
17881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 1;
17891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
17901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else if (j->flags.pcmciastate == 4) {
17911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!j->pccr1.bits.drf) {
17921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->flags.pcmciastate = 3;
17931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
17941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
17951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else if (j->flags.pcmciastate == 3) {
17961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pccr2.bits.pwr = 0;
17971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pccr2.bits.rstc = 1;
17981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb(j->pccr2.byte, j->XILINXbase + 0x02);
17991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->checkwait = jiffies + (hertz * 2);
18001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->flags.incheck = 1;
18011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->flags.pcmciastate = 2;
18021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
18031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else if (j->flags.pcmciastate == 2) {
18041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->flags.incheck) {
18051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (time_before(jiffies, j->checkwait)) {
18061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return 0;
18071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			} else {
18081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->flags.incheck = 0;
18091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
18101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
18111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pccr2.bits.pwr = 0;
18121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pccr2.bits.rstc = 0;
18131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb_p(j->pccr2.byte, j->XILINXbase + 0x02);
18141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->flags.pcmciastate = 1;
18151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
18161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else if (j->flags.pcmciastate == 1) {
18171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->flags.pcmciastate = 0;
18181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!j->pccr1.bits.drf) {
18191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->psccr.bits.dev = 3;
18201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->psccr.bits.rw = 1;
18211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb_p(j->psccr.byte, j->XILINXbase + 0x01);
18221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_PCcontrol_wait(j);
18231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->flags.pcmciascp = 1;		/* Set Cable Present Flag */
18241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
18251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->flags.pcmciasct = (inw_p(j->XILINXbase + 0x00) >> 8) & 0x03;		/* Get Cable Type */
18261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
18271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (j->flags.pcmciasct == 3) {
18281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->flags.pcmciastate = 4;
18291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return 0;
18301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			} else if (j->flags.pcmciasct == 0) {
18311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->pccr2.bits.pwr = 1;
18321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->pccr2.bits.rstc = 0;
18331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				outb_p(j->pccr2.byte, j->XILINXbase + 0x02);
18341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->port = PORT_SPEAKER;
18351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			} else {
18361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->port = PORT_POTS;
18371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
18381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->sic1.bits.cpd = 0;				/* Chip Power Down */
18391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->sic1.bits.mpd = 0;				/* MIC Bias Power Down */
18401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->sic1.bits.hpd = 0;				/* Handset Bias Power Down */
18411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->sic1.bits.lpd = 0;				/* Line Bias Power Down */
18421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->sic1.bits.spd = 1;				/* Speaker Drive Power Down */
18431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->psccr.bits.addr = 1;				/* R/W Smart Cable Register Address */
18441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->psccr.bits.rw = 0;				/* Read / Write flag */
18451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->psccr.bits.dev = 0;
18461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb(j->sic1.byte, j->XILINXbase + 0x00);
18471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb(j->psccr.byte, j->XILINXbase + 0x01);
18481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_PCcontrol_wait(j);
18491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
18501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->sic2.bits.al = 0;				/* Analog Loopback DAC analog -> ADC analog */
18511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->sic2.bits.dl2 = 0;				/* Digital Loopback DAC -> ADC one bit */
18521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->sic2.bits.dl1 = 0;				/* Digital Loopback ADC -> DAC one bit */
18531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->sic2.bits.pll = 0;				/* 1 = div 10, 0 = div 5 */
18541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->sic2.bits.hpd = 0;				/* HPF disable */
18551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->psccr.bits.addr = 2;				/* R/W Smart Cable Register Address */
18561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->psccr.bits.rw = 0;				/* Read / Write flag */
18571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->psccr.bits.dev = 0;
18581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb(j->sic2.byte, j->XILINXbase + 0x00);
18591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb(j->psccr.byte, j->XILINXbase + 0x01);
18601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_PCcontrol_wait(j);
18611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
18621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->psccr.bits.addr = 3;				/* R/W Smart Cable Register Address */
18631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->psccr.bits.rw = 0;				/* Read / Write flag */
18641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->psccr.bits.dev = 0;
18651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb(0x00, j->XILINXbase + 0x00);		/* PLL Divide N1 */
18661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb(j->psccr.byte, j->XILINXbase + 0x01);
18671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_PCcontrol_wait(j);
18681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
18691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->psccr.bits.addr = 4;				/* R/W Smart Cable Register Address */
18701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->psccr.bits.rw = 0;				/* Read / Write flag */
18711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->psccr.bits.dev = 0;
18721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb(0x09, j->XILINXbase + 0x00);		/* PLL Multiply M1 */
18731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb(j->psccr.byte, j->XILINXbase + 0x01);
18741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_PCcontrol_wait(j);
18751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
18761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->sirxg.bits.lig = 1;				/* Line In Gain */
18771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->sirxg.bits.lim = 1;				/* Line In Mute */
18781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->sirxg.bits.mcg = 0;				/* MIC In Gain was 3 */
18791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->sirxg.bits.mcm = 0;				/* MIC In Mute */
18801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->sirxg.bits.him = 0;				/* Handset In Mute */
18811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->sirxg.bits.iir = 1;				/* IIR */
18821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->psccr.bits.addr = 5;				/* R/W Smart Cable Register Address */
18831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->psccr.bits.rw = 0;				/* Read / Write flag */
18841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->psccr.bits.dev = 0;
18851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb(j->sirxg.byte, j->XILINXbase + 0x00);
18861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb(j->psccr.byte, j->XILINXbase + 0x01);
18871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_PCcontrol_wait(j);
18881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
18891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_siadc(j, 0x17);
18901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_sidac(j, 0x1D);
18911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
18921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->siaatt.bits.sot = 0;
18931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->psccr.bits.addr = 9;				/* R/W Smart Cable Register Address */
18941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->psccr.bits.rw = 0;				/* Read / Write flag */
18951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->psccr.bits.dev = 0;
18961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb(j->siaatt.byte, j->XILINXbase + 0x00);
18971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb(j->psccr.byte, j->XILINXbase + 0x01);
18981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_PCcontrol_wait(j);
18991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
19001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (j->flags.pcmciasct == 1 && !j->readers && !j->writers) {
19011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->psccr.byte = j->pslic.byte = 0;
19021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->pslic.bits.powerdown = 1;
19031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->psccr.bits.dev = 3;
19041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->psccr.bits.rw = 0;
19051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
19061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ixj_PCcontrol_wait(j);
19071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
19081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
19091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
19101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
19111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->flags.pcmciascp = 0;
19121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
19131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
19141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
19151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
19161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
19171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_hookstate(IXJ *j)
19181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
19191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int fOffHook = 0;
19201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
19211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (j->cardtype) {
19221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case QTI_PHONEJACK:
19231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_gpio_read(j);
19241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		fOffHook = j->gpio.bits.gpio3read ? 1 : 0;
19251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
19261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case QTI_LINEJACK:
19271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case QTI_PHONEJACK_LITE:
19281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case QTI_PHONEJACK_PCI:
19291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		SLIC_GetState(j);
19301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(j->cardtype == QTI_LINEJACK && j->flags.pots_pstn == 1 && (j->readers || j->writers)) {
19311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			fOffHook = j->pld_slicr.bits.potspstn ? 1 : 0;
19321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if(fOffHook != j->p_hook) {
19331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if(!j->checkwait) {
19341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->checkwait = jiffies;
19351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
19361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if(time_before(jiffies, j->checkwait + 2)) {
19371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					fOffHook ^= 1;
19381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				} else {
19391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->checkwait = 0;
19401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
19411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->p_hook = fOffHook;
19421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 			printk("IXJ : /dev/phone%d pots-pstn hookstate check %d at %ld\n", j->board, fOffHook, jiffies);
19431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
19441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
19451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (j->pld_slicr.bits.state == PLD_SLIC_STATE_ACTIVE ||
19461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			    j->pld_slicr.bits.state == PLD_SLIC_STATE_STANDBY) {
19471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (j->flags.ringing || j->flags.cringing) {
19481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					if (!in_interrupt()) {
1949f4c9925ccc185da68c2d42230711d017f222e420Nishanth Aravamudan						msleep(20);
19501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					}
19511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					SLIC_GetState(j);
19521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					if (j->pld_slicr.bits.state == PLD_SLIC_STATE_RINGING) {
19531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						ixj_ring_on(j);
19541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					}
19551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
19561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (j->cardtype == QTI_PHONEJACK_PCI) {
19571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->pld_scrr.byte = inb_p(j->XILINXbase);
19581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					fOffHook = j->pld_scrr.pcib.det ? 1 : 0;
19591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				} else
19601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					fOffHook = j->pld_slicr.bits.det ? 1 : 0;
19611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
19621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
19631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
19641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case QTI_PHONECARD:
19651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		fOffHook = ixj_pcmcia_cable_check(j);
19661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
19671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
19681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->r_hook != fOffHook) {
19691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->r_hook = fOffHook;
19701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->port == PORT_SPEAKER || j->port == PORT_HANDSET) { // || (j->port == PORT_PSTN && j->flags.pots_pstn == 0)) {
19711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->ex.bits.hookstate = 1;
19721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_kill_fasync(j, SIG_HOOKSTATE, POLL_IN);
19731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else if (!fOffHook) {
19741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->flash_end = jiffies + ((60 * hertz) / 100);
19751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
19761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
19771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (fOffHook) {
19781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(time_before(jiffies, j->flash_end)) {
19791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->ex.bits.flash = 1;
19801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->flash_end = 0;
19811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_kill_fasync(j, SIG_FLASH, POLL_IN);
19821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
19831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
19841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(time_before(jiffies, j->flash_end)) {
19851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			fOffHook = 1;
19861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
19871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
19881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
19891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->port == PORT_PSTN && j->daa_mode == SOP_PU_CONVERSATION)
19901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		fOffHook |= 2;
19911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
19921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->port == PORT_SPEAKER) {
19931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(j->cardtype == QTI_PHONECARD) {
19941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if(j->flags.pcmciascp && j->flags.pcmciasct) {
19951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				fOffHook |= 2;
19961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
19971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
19981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			fOffHook |= 2;
19991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
20001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
20011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
20021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->port == PORT_HANDSET)
20031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		fOffHook |= 2;
20041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
20051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return fOffHook;
20061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
20071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
20081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_ring_off(IXJ *j)
20091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
20101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->dsp.low == 0x20)	/* Internet PhoneJACK */
20111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 {
20121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixjdebug & 0x0004)
20131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk(KERN_INFO "IXJ Ring Off\n");
20141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->gpio.bytes.high = 0x0B;
20151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->gpio.bytes.low = 0x00;
20161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->gpio.bits.gpio1 = 0;
20171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->gpio.bits.gpio2 = 1;
20181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->gpio.bits.gpio5 = 0;
20191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_WriteDSPCommand(j->gpio.word, j);
20201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else			/* Internet LineJACK */
20211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
20221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixjdebug & 0x0004)
20231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk(KERN_INFO "IXJ Ring Off\n");
20241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
20251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(!j->flags.cidplay)
20261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
20271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
20281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		SLIC_GetState(j);
20291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
20301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
20311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
20321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_ring_start(IXJ *j)
20331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
20341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->flags.cringing = 1;
20351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixjdebug & 0x0004)
20361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk(KERN_INFO "IXJ Cadence Ringing Start /dev/phone%d\n", j->board);
20371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixj_hookstate(j) & 1) {
20381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->port == PORT_POTS)
20391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_ring_off(j);
20401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->flags.cringing = 0;
20411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixjdebug & 0x0004)
20421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk(KERN_INFO "IXJ Cadence Ringing Stopped /dev/phone%d off hook\n", j->board);
20431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else if(j->cadence_f[5].enable && (!j->cadence_f[5].en_filter)) {
20441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->ring_cadence_jif = jiffies;
20451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->flags.cidsent = j->flags.cidring = 0;
20461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->cadence_f[5].state = 0;
20471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(j->cadence_f[5].on1)
20481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_ring_on(j);
20491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
20501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->ring_cadence_jif = jiffies;
20511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->ring_cadence_t = 15;
20521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->ring_cadence & 1 << j->ring_cadence_t) {
20531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_ring_on(j);
20541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
20551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_ring_off(j);
20561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
20571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->flags.cidsent = j->flags.cidring = j->flags.firstring = 0;
20581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
20591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
20601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
20611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_ring(IXJ *j)
20621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
20631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char cntr;
2064f4c9925ccc185da68c2d42230711d017f222e420Nishanth Aravamudan	unsigned long jif;
20651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
20661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->flags.ringing = 1;
20671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixj_hookstate(j) & 1) {
20681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_ring_off(j);
20691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->flags.ringing = 0;
20701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 1;
20711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
20721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (cntr = 0; cntr < j->maxrings; cntr++) {
20731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		jif = jiffies + (1 * hertz);
20741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_ring_on(j);
20751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		while (time_before(jiffies, jif)) {
20761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (ixj_hookstate(j) & 1) {
20771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ixj_ring_off(j);
20781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->flags.ringing = 0;
20791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return 1;
20801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
20811e63bc7342c40f0f1dd83d80d368665bd06f4963Nishanth Aravamudan			schedule_timeout_interruptible(1);
20821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (signal_pending(current))
20831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
20841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
20851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		jif = jiffies + (3 * hertz);
20861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_ring_off(j);
20871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		while (time_before(jiffies, jif)) {
20881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (ixj_hookstate(j) & 1) {
2089f4c9925ccc185da68c2d42230711d017f222e420Nishanth Aravamudan				msleep(10);
20901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (ixj_hookstate(j) & 1) {
20911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->flags.ringing = 0;
20921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					return 1;
20931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
20941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
20951e63bc7342c40f0f1dd83d80d368665bd06f4963Nishanth Aravamudan			schedule_timeout_interruptible(1);
20961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (signal_pending(current))
20971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
20981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
20991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
21001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_ring_off(j);
21011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->flags.ringing = 0;
21021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
21031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
21041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
21051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_open(struct phone_device *p, struct file *file_p)
21061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
21071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IXJ *j = get_ixj(p->board);
21081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	file_p->private_data = j;
21091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
21101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!j->DSPbase)
21111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -ENODEV;
21121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
21131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        if (file_p->f_mode & FMODE_READ) {
21141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(!j->readers) {
21151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	                j->readers++;
21161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        	} else {
21171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                	return -EBUSY;
21181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
21191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        }
21201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
21211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (file_p->f_mode & FMODE_WRITE) {
21221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(!j->writers) {
21231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->writers++;
21241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
21251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (file_p->f_mode & FMODE_READ){
21261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->readers--;
21271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
21281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -EBUSY;
21291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
21301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
21311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
21321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->cardtype == QTI_PHONECARD) {
21331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pslic.bits.powerdown = 0;
21341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->psccr.bits.dev = 3;
21351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->psccr.bits.rw = 0;
21361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outw_p(j->psccr.byte << 8 | j->pslic.byte, j->XILINXbase + 0x00);
21371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_PCcontrol_wait(j);
21381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
21391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
21401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->flags.cidplay = 0;
21411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->flags.cidcw_ack = 0;
21421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
21431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixjdebug & 0x0002)
21441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk(KERN_INFO "Opening board %d\n", p->board);
21451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
21461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->framesread = j->frameswritten = 0;
21471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
21481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
21491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
21501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_release(struct inode *inode, struct file *file_p)
21511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
21521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IXJ_TONE ti;
21531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int cnt;
21541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IXJ *j = file_p->private_data;
21551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int board = j->p.board;
21561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
21571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*
21581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 *    Set up locks to ensure that only one process is talking to the DSP at a time.
21591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 *    This is necessary to keep the DSP from locking up.
21601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
21611e63bc7342c40f0f1dd83d80d368665bd06f4963Nishanth Aravamudan	while(test_and_set_bit(board, (void *)&j->busyflags) != 0)
21621e63bc7342c40f0f1dd83d80d368665bd06f4963Nishanth Aravamudan		schedule_timeout_interruptible(1);
21631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixjdebug & 0x0002)
21641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk(KERN_INFO "Closing board %d\n", NUM(inode));
21651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
21661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->cardtype == QTI_PHONECARD)
21671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_set_port(j, PORT_SPEAKER);
21681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	else
21691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_set_port(j, PORT_POTS);
21701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
21711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	aec_stop(j);
21721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_play_stop(j);
21731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_record_stop(j);
21741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	set_play_volume(j, 0x100);
21751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	set_rec_volume(j, 0x100);
21761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_ring_off(j);
21771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
21781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Restore the tone table to default settings. */
21791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.tone_index = 10;
21801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain0 = 1;
21811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq0 = hz941;
21821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain1 = 0;
21831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq1 = hz1209;
21841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_init_tone(j, &ti);
21851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.tone_index = 11;
21861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain0 = 1;
21871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq0 = hz941;
21881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain1 = 0;
21891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq1 = hz1336;
21901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_init_tone(j, &ti);
21911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.tone_index = 12;
21921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain0 = 1;
21931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq0 = hz941;
21941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain1 = 0;
21951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq1 = hz1477;
21961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_init_tone(j, &ti);
21971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.tone_index = 13;
21981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain0 = 1;
21991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq0 = hz800;
22001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain1 = 0;
22011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq1 = 0;
22021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_init_tone(j, &ti);
22031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.tone_index = 14;
22041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain0 = 1;
22051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq0 = hz1000;
22061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain1 = 0;
22071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq1 = 0;
22081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_init_tone(j, &ti);
22091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.tone_index = 15;
22101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain0 = 1;
22111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq0 = hz1250;
22121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain1 = 0;
22131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq1 = 0;
22141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_init_tone(j, &ti);
22151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.tone_index = 16;
22161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain0 = 1;
22171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq0 = hz950;
22181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain1 = 0;
22191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq1 = 0;
22201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_init_tone(j, &ti);
22211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.tone_index = 17;
22221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain0 = 1;
22231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq0 = hz1100;
22241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain1 = 0;
22251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq1 = 0;
22261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_init_tone(j, &ti);
22271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.tone_index = 18;
22281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain0 = 1;
22291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq0 = hz1400;
22301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain1 = 0;
22311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq1 = 0;
22321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_init_tone(j, &ti);
22331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.tone_index = 19;
22341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain0 = 1;
22351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq0 = hz1500;
22361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain1 = 0;
22371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq1 = 0;
22381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_init_tone(j, &ti);
22391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.tone_index = 20;
22401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain0 = 1;
22411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq0 = hz1600;
22421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain1 = 0;
22431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq1 = 0;
22441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_init_tone(j, &ti);
22451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.tone_index = 21;
22461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain0 = 1;
22471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq0 = hz1800;
22481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain1 = 0;
22491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq1 = 0;
22501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_init_tone(j, &ti);
22511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.tone_index = 22;
22521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain0 = 1;
22531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq0 = hz2100;
22541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain1 = 0;
22551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq1 = 0;
22561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_init_tone(j, &ti);
22571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.tone_index = 23;
22581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain0 = 1;
22591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq0 = hz1300;
22601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain1 = 0;
22611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq1 = 0;
22621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_init_tone(j, &ti);
22631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.tone_index = 24;
22641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain0 = 1;
22651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq0 = hz2450;
22661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain1 = 0;
22671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq1 = 0;
22681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_init_tone(j, &ti);
22691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.tone_index = 25;
22701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain0 = 1;
22711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq0 = hz350;
22721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain1 = 0;
22731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq1 = hz440;
22741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_init_tone(j, &ti);
22751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.tone_index = 26;
22761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain0 = 1;
22771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq0 = hz440;
22781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain1 = 0;
22791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq1 = hz480;
22801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_init_tone(j, &ti);
22811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.tone_index = 27;
22821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain0 = 1;
22831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq0 = hz480;
22841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain1 = 0;
22851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq1 = hz620;
22861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_init_tone(j, &ti);
22871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
22881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	set_rec_depth(j, 2);	/* Set Record Channel Limit to 2 frames */
22891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
22901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	set_play_depth(j, 2);	/* Set Playback Channel Limit to 2 frames */
22911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
22921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->ex.bits.dtmf_ready = 0;
22931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->dtmf_state = 0;
22941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->dtmf_wp = j->dtmf_rp = 0;
22951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->rec_mode = j->play_mode = -1;
22961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->flags.ringing = 0;
22971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->maxrings = MAXRINGS;
22981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->ring_cadence = USA_RING_CADENCE;
22991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if(j->cadence_f[5].enable) {
23001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->cadence_f[5].enable = j->cadence_f[5].en_filter = j->cadence_f[5].state = 0;
23011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
23021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->drybuffer = 0;
23031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->winktime = 320;
23041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->flags.dtmf_oob = 0;
23051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (cnt = 0; cnt < 4; cnt++)
23061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->cadence_f[cnt].enable = 0;
23071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
23081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	idle(j);
23091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
23101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if(j->cardtype == QTI_PHONECARD) {
23111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		SLIC_SetState(PLD_SLIC_STATE_OC, j);
23121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
23131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
23141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (file_p->f_mode & FMODE_READ)
23151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->readers--;
23161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (file_p->f_mode & FMODE_WRITE)
23171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->writers--;
23181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
23191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->read_buffer && !j->readers) {
23201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		kfree(j->read_buffer);
23211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->read_buffer = NULL;
23221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->read_buffer_size = 0;
23231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
23241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->write_buffer && !j->writers) {
23251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		kfree(j->write_buffer);
23261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->write_buffer = NULL;
23271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->write_buffer_size = 0;
23281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
23291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->rec_codec = j->play_codec = 0;
23301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->rec_frame_size = j->play_frame_size = 0;
23311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->flags.cidsent = j->flags.cidring = 0;
23321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
23331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if(j->cardtype == QTI_LINEJACK && !j->readers && !j->writers) {
23341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_set_port(j, PORT_PSTN);
23351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		daa_set_mode(j, SOP_PU_SLEEP);
23361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_set_pots(j, 1);
23371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
23381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_WriteDSPCommand(0x0FE3, j);	/* Put the DSP in 1/5 power mode. */
23391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
23401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Set up the default signals for events */
23411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (cnt = 0; cnt < 35; cnt++)
23421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->ixj_signals[cnt] = SIGIO;
23431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
23441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Set the excetion signal enable flags */
23451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring =
23461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->ex_sig.bits.caller_id = j->ex_sig.bits.pstn_wink = j->ex_sig.bits.f0 = j->ex_sig.bits.f1 = j->ex_sig.bits.f2 =
23471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->ex_sig.bits.f3 = j->ex_sig.bits.fc0 = j->ex_sig.bits.fc1 = j->ex_sig.bits.fc2 = j->ex_sig.bits.fc3 = 1;
23481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
23491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	file_p->private_data = NULL;
23501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	clear_bit(board, &j->busyflags);
23511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
23521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
23531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
23541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int read_filters(IXJ *j)
23551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
23561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned short fc, cnt, trg;
23571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int var;
23581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
23591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	trg = 0;
23601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixj_WriteDSPCommand(0x5144, j)) {
23611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(ixjdebug & 0x0001) {
23621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk(KERN_INFO "Read Frame Counter failed!\n");
23631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
23641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
23651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
23661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	fc = j->ssr.high << 8 | j->ssr.low;
23671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (fc == j->frame_count)
23681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 1;
23691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
23701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->frame_count = fc;
23711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
23721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->dtmf_proc)
23731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 1;
23741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
23751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	var = 10;
23761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
23771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (cnt = 0; cnt < 4; cnt++) {
23781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixj_WriteDSPCommand(0x5154 + cnt, j)) {
23791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if(ixjdebug & 0x0001) {
23801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				printk(KERN_INFO "Select Filter %d failed!\n", cnt);
23811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
23821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -1;
23831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
23841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixj_WriteDSPCommand(0x515C, j)) {
23851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if(ixjdebug & 0x0001) {
23861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				printk(KERN_INFO "Read Filter History %d failed!\n", cnt);
23871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
23881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -1;
23891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
23901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->filter_hist[cnt] = j->ssr.high << 8 | j->ssr.low;
23911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
23921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->cadence_f[cnt].enable) {
23931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) {
23941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (j->cadence_f[cnt].state == 0) {
23951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->cadence_f[cnt].state = 1;
23961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->cadence_f[cnt].on1min = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 - var)) / 10000));
23971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->cadence_f[cnt].on1dot = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100)) / 10000));
23981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->cadence_f[cnt].on1max = jiffies + (long)((j->cadence_f[cnt].on1 * (hertz * (100 + var)) / 10000));
23991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				} else if (j->cadence_f[cnt].state == 2 &&
24001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					   (time_after(jiffies, j->cadence_f[cnt].off1min) &&
24011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					    time_before(jiffies, j->cadence_f[cnt].off1max))) {
24021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					if (j->cadence_f[cnt].on2) {
24031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						j->cadence_f[cnt].state = 3;
24041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						j->cadence_f[cnt].on2min = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 - var)) / 10000));
24051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						j->cadence_f[cnt].on2dot = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100)) / 10000));
24061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						j->cadence_f[cnt].on2max = jiffies + (long)((j->cadence_f[cnt].on2 * (hertz * (100 + var)) / 10000));
24071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					} else {
24081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						j->cadence_f[cnt].state = 7;
24091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					}
24101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				} else if (j->cadence_f[cnt].state == 4 &&
24111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					   (time_after(jiffies, j->cadence_f[cnt].off2min) &&
24121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					    time_before(jiffies, j->cadence_f[cnt].off2max))) {
24131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					if (j->cadence_f[cnt].on3) {
24141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						j->cadence_f[cnt].state = 5;
24151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						j->cadence_f[cnt].on3min = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 - var)) / 10000));
24161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						j->cadence_f[cnt].on3dot = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100)) / 10000));
24171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						j->cadence_f[cnt].on3max = jiffies + (long)((j->cadence_f[cnt].on3 * (hertz * (100 + var)) / 10000));
24181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					} else {
24191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						j->cadence_f[cnt].state = 7;
24201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					}
24211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				} else {
24221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->cadence_f[cnt].state = 0;
24231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
24241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			} else if (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)) {
24251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (j->cadence_f[cnt].state == 1) {
24261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					if(!j->cadence_f[cnt].on1) {
24271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						j->cadence_f[cnt].state = 7;
24281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					} else if((time_after(jiffies, j->cadence_f[cnt].on1min) &&
24291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					  time_before(jiffies, j->cadence_f[cnt].on1max))) {
24301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						if(j->cadence_f[cnt].off1) {
24311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							j->cadence_f[cnt].state = 2;
24321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							j->cadence_f[cnt].off1min = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 - var)) / 10000));
24331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							j->cadence_f[cnt].off1dot = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100)) / 10000));
24341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							j->cadence_f[cnt].off1max = jiffies + (long)((j->cadence_f[cnt].off1 * (hertz * (100 + var)) / 10000));
24351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						} else {
24361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							j->cadence_f[cnt].state = 7;
24371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						}
24381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					} else {
24391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						j->cadence_f[cnt].state = 0;
24401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					}
24411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				} else if (j->cadence_f[cnt].state == 3) {
24421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					if((time_after(jiffies, j->cadence_f[cnt].on2min) &&
24431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					    time_before(jiffies, j->cadence_f[cnt].on2max))) {
24441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						if(j->cadence_f[cnt].off2) {
24451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							j->cadence_f[cnt].state = 4;
24461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							j->cadence_f[cnt].off2min = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 - var)) / 10000));
24471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							j->cadence_f[cnt].off2dot = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100)) / 10000));
24481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							j->cadence_f[cnt].off2max = jiffies + (long)((j->cadence_f[cnt].off2 * (hertz * (100 + var)) / 10000));
24491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						} else {
24501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							j->cadence_f[cnt].state = 7;
24511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						}
24521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					} else {
24531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						j->cadence_f[cnt].state = 0;
24541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					}
24551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				} else if (j->cadence_f[cnt].state == 5) {
24561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					if ((time_after(jiffies, j->cadence_f[cnt].on3min) &&
24571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					    time_before(jiffies, j->cadence_f[cnt].on3max))) {
24581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						if(j->cadence_f[cnt].off3) {
24591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							j->cadence_f[cnt].state = 6;
24601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							j->cadence_f[cnt].off3min = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 - var)) / 10000));
24611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							j->cadence_f[cnt].off3dot = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100)) / 10000));
24621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							j->cadence_f[cnt].off3max = jiffies + (long)((j->cadence_f[cnt].off3 * (hertz * (100 + var)) / 10000));
24631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						} else {
24641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							j->cadence_f[cnt].state = 7;
24651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						}
24661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					} else {
24671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						j->cadence_f[cnt].state = 0;
24681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					}
24691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				} else {
24701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->cadence_f[cnt].state = 0;
24711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
24721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			} else {
24731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				switch(j->cadence_f[cnt].state) {
24741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					case 1:
24751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						if(time_after(jiffies, j->cadence_f[cnt].on1dot) &&
24761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						   !j->cadence_f[cnt].off1 &&
24771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						   !j->cadence_f[cnt].on2 && !j->cadence_f[cnt].off2 &&
24781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						   !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) {
24791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							j->cadence_f[cnt].state = 7;
24801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						}
24811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						break;
24821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					case 3:
24831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						if(time_after(jiffies, j->cadence_f[cnt].on2dot) &&
24841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						   !j->cadence_f[cnt].off2 &&
24851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						   !j->cadence_f[cnt].on3 && !j->cadence_f[cnt].off3) {
24861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							j->cadence_f[cnt].state = 7;
24871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						}
24881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						break;
24891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					case 5:
24901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						if(time_after(jiffies, j->cadence_f[cnt].on3dot) &&
24911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						   !j->cadence_f[cnt].off3) {
24921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							j->cadence_f[cnt].state = 7;
24931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						}
24941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						break;
24951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
24961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
24971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
24981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (ixjdebug & 0x0040) {
24991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				printk(KERN_INFO "IXJ Tone Cadence state = %d /dev/phone%d at %ld\n", j->cadence_f[cnt].state, j->board, jiffies);
25001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				switch(j->cadence_f[cnt].state) {
25011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					case 0:
25021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						printk(KERN_INFO "IXJ /dev/phone%d No Tone detected\n", j->board);
25031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						break;
25041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					case 1:
25051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %u %ld - %ld - %ld\n", j->board,
25061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->cadence_f[cnt].on1, j->cadence_f[cnt].on1min, j->cadence_f[cnt].on1dot, j->cadence_f[cnt].on1max);
25071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						break;
25081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					case 2:
25091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off1min,
25101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds															j->cadence_f[cnt].off1max);
25111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						break;
25121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					case 3:
25131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].on2min,
25141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds															j->cadence_f[cnt].on2max);
25151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						break;
25161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					case 4:
25171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off2min,
25181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds															j->cadence_f[cnt].off2max);
25191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						break;
25201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					case 5:
25211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].on3min,
25221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds															j->cadence_f[cnt].on3max);
25231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						break;
25241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					case 6:
25251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						printk(KERN_INFO "IXJ /dev/phone%d Next Tone Cadence state at %ld - %ld\n", j->board, j->cadence_f[cnt].off3min,
25261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds															j->cadence_f[cnt].off3max);
25271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						break;
25281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
25291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
25301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
25311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->cadence_f[cnt].state == 7) {
25321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->cadence_f[cnt].state = 0;
25331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (j->cadence_f[cnt].enable == 1)
25341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->cadence_f[cnt].enable = 0;
25351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			switch (cnt) {
25361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case 0:
25371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if(ixjdebug & 0x0020) {
25381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					printk(KERN_INFO "Filter Cadence 0 triggered %ld\n", jiffies);
25391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
25401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->ex.bits.fc0 = 1;
25411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ixj_kill_fasync(j, SIG_FC0, POLL_IN);
25421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
25431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case 1:
25441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if(ixjdebug & 0x0020) {
25451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					printk(KERN_INFO "Filter Cadence 1 triggered %ld\n", jiffies);
25461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
25471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->ex.bits.fc1 = 1;
25481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ixj_kill_fasync(j, SIG_FC1, POLL_IN);
25491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
25501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case 2:
25511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if(ixjdebug & 0x0020) {
25521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					printk(KERN_INFO "Filter Cadence 2 triggered %ld\n", jiffies);
25531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
25541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->ex.bits.fc2 = 1;
25551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ixj_kill_fasync(j, SIG_FC2, POLL_IN);
25561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
25571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case 3:
25581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if(ixjdebug & 0x0020) {
25591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					printk(KERN_INFO "Filter Cadence 3 triggered %ld\n", jiffies);
25601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
25611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->ex.bits.fc3 = 1;
25621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ixj_kill_fasync(j, SIG_FC3, POLL_IN);
25631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
25641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
25651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
25661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->filter_en[cnt] && ((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12)) ||
25671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					  (j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3)))) {
25681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if((j->filter_hist[cnt] & 3 && !(j->filter_hist[cnt] & 12))) {
25691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				trg = 1;
25701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			} else if((j->filter_hist[cnt] & 12 && !(j->filter_hist[cnt] & 3))) {
25711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				trg = 0;
25721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
25731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			switch (cnt) {
25741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case 0:
25751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if(ixjdebug & 0x0020) {
25761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					printk(KERN_INFO "Filter 0 triggered %d at %ld\n", trg, jiffies);
25771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
25781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->ex.bits.f0 = 1;
25791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ixj_kill_fasync(j, SIG_F0, POLL_IN);
25801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
25811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case 1:
25821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if(ixjdebug & 0x0020) {
25831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					printk(KERN_INFO "Filter 1 triggered %d at %ld\n", trg, jiffies);
25841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
25851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->ex.bits.f1 = 1;
25861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ixj_kill_fasync(j, SIG_F1, POLL_IN);
25871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
25881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case 2:
25891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if(ixjdebug & 0x0020) {
25901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					printk(KERN_INFO "Filter 2 triggered %d at %ld\n", trg, jiffies);
25911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
25921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->ex.bits.f2 = 1;
25931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ixj_kill_fasync(j, SIG_F2, POLL_IN);
25941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
25951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case 3:
25961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if(ixjdebug & 0x0020) {
25971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					printk(KERN_INFO "Filter 3 triggered %d at %ld\n", trg, jiffies);
25981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
25991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->ex.bits.f3 = 1;
26001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ixj_kill_fasync(j, SIG_F3, POLL_IN);
26011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
26021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
26031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
26041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
26051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
26061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
26071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
26081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int LineMonitor(IXJ *j)
26091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
26101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->dtmf_proc) {
26111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
26121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
26131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->dtmf_proc = 1;
26141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
26151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixj_WriteDSPCommand(0x7000, j))		/* Line Monitor */
26161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
26171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
26181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->dtmf.bytes.high = j->ssr.high;
26191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->dtmf.bytes.low = j->ssr.low;
26201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!j->dtmf_state && j->dtmf.bits.dtmf_valid) {
26211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->dtmf_state = 1;
26221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->dtmf_current = j->dtmf.bits.digit;
26231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
26241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->dtmf_state && !j->dtmf.bits.dtmf_valid)	/* && j->dtmf_wp != j->dtmf_rp) */
26251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 {
26261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(!j->cidcw_wait) {
26271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->dtmfbuffer[j->dtmf_wp] = j->dtmf_current;
26281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->dtmf_wp++;
26291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (j->dtmf_wp == 79)
26301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->dtmf_wp = 0;
26311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->ex.bits.dtmf_ready = 1;
26321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if(j->ex_sig.bits.dtmf_ready) {
26331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ixj_kill_fasync(j, SIG_DTMF_READY, POLL_IN);
26341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
26351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
26361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		else if(j->dtmf_current == 0x00 || j->dtmf_current == 0x0D) {
26371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if(ixjdebug & 0x0020) {
26381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				printk("IXJ phone%d saw CIDCW Ack DTMF %d from display at %ld\n", j->board, j->dtmf_current, jiffies);
26391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
26401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->flags.cidcw_ack = 1;
26411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
26421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->dtmf_state = 0;
26431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
26441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->dtmf_proc = 0;
26451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
26461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
26471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
26481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
26491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/************************************************************************
26501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds*
26511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds* Functions to allow alaw <-> ulaw conversions.
26521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds*
26531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds************************************************************************/
26541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
26551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ulaw2alaw(unsigned char *buff, unsigned long len)
26561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
26571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	static unsigned char table_ulaw2alaw[] =
26581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
26591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x2A, 0x2B, 0x28, 0x29, 0x2E, 0x2F, 0x2C, 0x2D,
26601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x22, 0x23, 0x20, 0x21, 0x26, 0x27, 0x24, 0x25,
26611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x3A, 0x3B, 0x38, 0x39, 0x3E, 0x3F, 0x3C, 0x3D,
26621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x32, 0x33, 0x30, 0x31, 0x36, 0x37, 0x34, 0x35,
26631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D, 0x02,
26641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05, 0x1A,
26651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D, 0x12,
26661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15, 0x6B,
26671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D, 0x62, 0x63,
26681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x60, 0x61, 0x66, 0x67, 0x64, 0x65, 0x7B, 0x79,
26691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x7E, 0x7F, 0x7C, 0x7D, 0x72, 0x73, 0x70, 0x71,
26701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x76, 0x77, 0x74, 0x75, 0x4B, 0x49, 0x4F, 0x4D,
26711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x42, 0x43, 0x40, 0x41, 0x46, 0x47, 0x44, 0x45,
26721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x5A, 0x5B, 0x58, 0x59, 0x5E, 0x5F, 0x5C, 0x5D,
26731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x52, 0x52, 0x53, 0x53, 0x50, 0x50, 0x51, 0x51,
26741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x56, 0x56, 0x57, 0x57, 0x54, 0x54, 0x55, 0xD5,
26751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0xAA, 0xAB, 0xA8, 0xA9, 0xAE, 0xAF, 0xAC, 0xAD,
26761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0xA2, 0xA3, 0xA0, 0xA1, 0xA6, 0xA7, 0xA4, 0xA5,
26771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0xBA, 0xBB, 0xB8, 0xB9, 0xBE, 0xBF, 0xBC, 0xBD,
26781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0xB2, 0xB3, 0xB0, 0xB1, 0xB6, 0xB7, 0xB4, 0xB5,
26791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D, 0x82,
26801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85, 0x9A,
26811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D, 0x92,
26821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95, 0xEB,
26831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED, 0xE2, 0xE3,
26841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5, 0xFB, 0xF9,
26851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0xFE, 0xFF, 0xFC, 0xFD, 0xF2, 0xF3, 0xF0, 0xF1,
26861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0xF6, 0xF7, 0xF4, 0xF5, 0xCB, 0xC9, 0xCF, 0xCD,
26871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0xC2, 0xC3, 0xC0, 0xC1, 0xC6, 0xC7, 0xC4, 0xC5,
26881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0xDA, 0xDB, 0xD8, 0xD9, 0xDE, 0xDF, 0xDC, 0xDD,
26891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0xD2, 0xD2, 0xD3, 0xD3, 0xD0, 0xD0, 0xD1, 0xD1,
26901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0xD6, 0xD6, 0xD7, 0xD7, 0xD4, 0xD4, 0xD5, 0xD5
26911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	};
26921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
26931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while (len--)
26941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
26951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		*buff = table_ulaw2alaw[*(unsigned char *)buff];
26961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		buff++;
26971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
26981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
26991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
27001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void alaw2ulaw(unsigned char *buff, unsigned long len)
27011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
27021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	static unsigned char table_alaw2ulaw[] =
27031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
27041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x29, 0x2A, 0x27, 0x28, 0x2D, 0x2E, 0x2B, 0x2C,
27051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x21, 0x22, 0x1F, 0x20, 0x25, 0x26, 0x23, 0x24,
27061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x39, 0x3A, 0x37, 0x38, 0x3D, 0x3E, 0x3B, 0x3C,
27071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x31, 0x32, 0x2F, 0x30, 0x35, 0x36, 0x33, 0x34,
27081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x0A, 0x0B, 0x08, 0x09, 0x0E, 0x0F, 0x0C, 0x0D,
27091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x02, 0x03, 0x00, 0x01, 0x06, 0x07, 0x04, 0x05,
27101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x1A, 0x1B, 0x18, 0x19, 0x1E, 0x1F, 0x1C, 0x1D,
27111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x12, 0x13, 0x10, 0x11, 0x16, 0x17, 0x14, 0x15,
27121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x62, 0x63, 0x60, 0x61, 0x66, 0x67, 0x64, 0x65,
27131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x5D, 0x5D, 0x5C, 0x5C, 0x5F, 0x5F, 0x5E, 0x5E,
27141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x74, 0x76, 0x70, 0x72, 0x7C, 0x7E, 0x78, 0x7A,
27151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x6A, 0x6B, 0x68, 0x69, 0x6E, 0x6F, 0x6C, 0x6D,
27161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x48, 0x49, 0x46, 0x47, 0x4C, 0x4D, 0x4A, 0x4B,
27171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x40, 0x41, 0x3F, 0x3F, 0x44, 0x45, 0x42, 0x43,
27181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x56, 0x57, 0x54, 0x55, 0x5A, 0x5B, 0x58, 0x59,
27191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x4F, 0x4F, 0x4E, 0x4E, 0x52, 0x53, 0x50, 0x51,
27201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0xA9, 0xAA, 0xA7, 0xA8, 0xAD, 0xAE, 0xAB, 0xAC,
27211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0xA1, 0xA2, 0x9F, 0xA0, 0xA5, 0xA6, 0xA3, 0xA4,
27221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0xB9, 0xBA, 0xB7, 0xB8, 0xBD, 0xBE, 0xBB, 0xBC,
27231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0xB1, 0xB2, 0xAF, 0xB0, 0xB5, 0xB6, 0xB3, 0xB4,
27241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x8A, 0x8B, 0x88, 0x89, 0x8E, 0x8F, 0x8C, 0x8D,
27251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x82, 0x83, 0x80, 0x81, 0x86, 0x87, 0x84, 0x85,
27261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x9A, 0x9B, 0x98, 0x99, 0x9E, 0x9F, 0x9C, 0x9D,
27271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0x92, 0x93, 0x90, 0x91, 0x96, 0x97, 0x94, 0x95,
27281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0xE2, 0xE3, 0xE0, 0xE1, 0xE6, 0xE7, 0xE4, 0xE5,
27291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0xDD, 0xDD, 0xDC, 0xDC, 0xDF, 0xDF, 0xDE, 0xDE,
27301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0xF4, 0xF6, 0xF0, 0xF2, 0xFC, 0xFE, 0xF8, 0xFA,
27311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0xEA, 0xEB, 0xE8, 0xE9, 0xEE, 0xEF, 0xEC, 0xED,
27321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0xC8, 0xC9, 0xC6, 0xC7, 0xCC, 0xCD, 0xCA, 0xCB,
27331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0xC0, 0xC1, 0xBF, 0xBF, 0xC4, 0xC5, 0xC2, 0xC3,
27341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0xD6, 0xD7, 0xD4, 0xD5, 0xDA, 0xDB, 0xD8, 0xD9,
27351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0xCF, 0xCF, 0xCE, 0xCE, 0xD2, 0xD3, 0xD0, 0xD1
27361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	};
27371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
27381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        while (len--)
27391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        {
27401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                *buff = table_alaw2ulaw[*(unsigned char *)buff];
27411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                buff++;
27421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
27431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
27441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
27451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t ixj_read(struct file * file_p, char __user *buf, size_t length, loff_t * ppos)
27461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
27471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long i = *ppos;
2748d1f229744ece0b7aa7ce89ecd1fb598b90305d5bJosef Sipek	IXJ * j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
27491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
27501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DECLARE_WAITQUEUE(wait, current);
27511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
27521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->flags.inread)
27531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -EALREADY;
27541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
27551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->flags.inread = 1;
27561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
27571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	add_wait_queue(&j->read_q, &wait);
27581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	set_current_state(TASK_INTERRUPTIBLE);
27591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mb();
27601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
27611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while (!j->read_buffer_ready || (j->dtmf_state && j->flags.dtmf_oob)) {
27621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		++j->read_wait;
27631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (file_p->f_flags & O_NONBLOCK) {
27641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			set_current_state(TASK_RUNNING);
27651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			remove_wait_queue(&j->read_q, &wait);
27661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->flags.inread = 0;
27671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -EAGAIN;
27681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
27691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!ixj_hookstate(j)) {
27701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			set_current_state(TASK_RUNNING);
27711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			remove_wait_queue(&j->read_q, &wait);
27721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->flags.inread = 0;
27731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 0;
27741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
27751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		interruptible_sleep_on(&j->read_q);
27761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (signal_pending(current)) {
27771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			set_current_state(TASK_RUNNING);
27781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			remove_wait_queue(&j->read_q, &wait);
27791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->flags.inread = 0;
27801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -EINTR;
27811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
27821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
27831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
27841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	remove_wait_queue(&j->read_q, &wait);
27851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	set_current_state(TASK_RUNNING);
27861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Don't ever copy more than the user asks */
27871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if(j->rec_codec == ALAW)
27881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ulaw2alaw(j->read_buffer, min(length, j->read_buffer_size));
27891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	i = copy_to_user(buf, j->read_buffer, min(length, j->read_buffer_size));
27901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->read_buffer_ready = 0;
27911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (i) {
27921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->flags.inread = 0;
27931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -EFAULT;
27941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
27951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->flags.inread = 0;
27961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return min(length, j->read_buffer_size);
27971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
27981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
27991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
28001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t ixj_enhanced_read(struct file * file_p, char __user *buf, size_t length,
28011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			  loff_t * ppos)
28021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
28031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int pre_retval;
28041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ssize_t read_retval = 0;
2805d1f229744ece0b7aa7ce89ecd1fb598b90305d5bJosef Sipek	IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
28061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
28071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pre_retval = ixj_PreRead(j, 0L);
28081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (pre_retval) {
28091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case NORMAL:
28101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		read_retval = ixj_read(file_p, buf, length, ppos);
28111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_PostRead(j, 0L);
28121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
28131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case NOPOST:
28141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		read_retval = ixj_read(file_p, buf, length, ppos);
28151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
28161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case POSTONLY:
28171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_PostRead(j, 0L);
28181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
28191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
28201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		read_retval = pre_retval;
28211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
28221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return read_retval;
28231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
28241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
28251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t ixj_write(struct file *file_p, const char __user *buf, size_t count, loff_t * ppos)
28261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
28271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long i = *ppos;
28281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IXJ *j = file_p->private_data;
28291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
28301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DECLARE_WAITQUEUE(wait, current);
28311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
28321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->flags.inwrite)
28331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -EALREADY;
28341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
28351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->flags.inwrite = 1;
28361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
28371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	add_wait_queue(&j->write_q, &wait);
28381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	set_current_state(TASK_INTERRUPTIBLE);
28391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mb();
28401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
28411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
28421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while (!j->write_buffers_empty) {
28431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		++j->write_wait;
28441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (file_p->f_flags & O_NONBLOCK) {
28451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			set_current_state(TASK_RUNNING);
28461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			remove_wait_queue(&j->write_q, &wait);
28471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->flags.inwrite = 0;
28481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -EAGAIN;
28491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
28501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!ixj_hookstate(j)) {
28511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			set_current_state(TASK_RUNNING);
28521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			remove_wait_queue(&j->write_q, &wait);
28531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->flags.inwrite = 0;
28541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 0;
28551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
28561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		interruptible_sleep_on(&j->write_q);
28571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (signal_pending(current)) {
28581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			set_current_state(TASK_RUNNING);
28591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			remove_wait_queue(&j->write_q, &wait);
28601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->flags.inwrite = 0;
28611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -EINTR;
28621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
28631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
28641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	set_current_state(TASK_RUNNING);
28651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	remove_wait_queue(&j->write_q, &wait);
28661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->write_buffer_wp + count >= j->write_buffer_end)
28671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->write_buffer_wp = j->write_buffer;
28681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	i = copy_from_user(j->write_buffer_wp, buf, min(count, j->write_buffer_size));
28691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (i) {
28701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->flags.inwrite = 0;
28711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -EFAULT;
28721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
28731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds       if(j->play_codec == ALAW)
28741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds               alaw2ulaw(j->write_buffer_wp, min(count, j->write_buffer_size));
28751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->flags.inwrite = 0;
28761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return min(count, j->write_buffer_size);
28771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
28781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
28791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic ssize_t ixj_enhanced_write(struct file * file_p, const char __user *buf, size_t count, loff_t * ppos)
28801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
28811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int pre_retval;
28821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ssize_t write_retval = 0;
28831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2884d1f229744ece0b7aa7ce89ecd1fb598b90305d5bJosef Sipek	IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
28851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
28861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pre_retval = ixj_PreWrite(j, 0L);
28871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (pre_retval) {
28881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case NORMAL:
28891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		write_retval = ixj_write(file_p, buf, count, ppos);
28901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (write_retval > 0) {
28911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_PostWrite(j, 0L);
28921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->write_buffer_wp += write_retval;
28931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->write_buffers_empty--;
28941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
28951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
28961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case NOPOST:
28971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		write_retval = ixj_write(file_p, buf, count, ppos);
28981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (write_retval > 0) {
28991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->write_buffer_wp += write_retval;
29001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->write_buffers_empty--;
29011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
29021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
29031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case POSTONLY:
29041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_PostWrite(j, 0L);
29051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
29061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
29071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		write_retval = pre_retval;
29081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
29091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return write_retval;
29101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
29111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
29121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_read_frame(IXJ *j)
29131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
29141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int cnt, dly;
29151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
29161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->read_buffer) {
29171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {
29181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!(cnt % 16) && !IsRxReady(j)) {
29191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				dly = 0;
29201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				while (!IsRxReady(j)) {
29211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					if (dly++ > 5) {
29221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						dly = 0;
29231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						break;
29241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					}
29251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					udelay(10);
29261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
29271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
29281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			/* Throw away word 0 of the 8021 compressed format to get standard G.729. */
29291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (j->rec_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) {
29301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				inb_p(j->DSPbase + 0x0E);
29311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				inb_p(j->DSPbase + 0x0F);
29321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
29331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			*(j->read_buffer + cnt) = inb_p(j->DSPbase + 0x0E);
29341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			*(j->read_buffer + cnt + 1) = inb_p(j->DSPbase + 0x0F);
29351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
29361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		++j->framesread;
29371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->intercom != -1) {
29381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (IsTxReady(get_ixj(j->intercom))) {
29391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				for (cnt = 0; cnt < j->rec_frame_size * 2; cnt += 2) {
29401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					if (!(cnt % 16) && !IsTxReady(j)) {
29411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						dly = 0;
29421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						while (!IsTxReady(j)) {
29431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							if (dly++ > 5) {
29441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								dly = 0;
29451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								break;
29461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							}
29471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							udelay(10);
29481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						}
29491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					}
29501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					outb_p(*(j->read_buffer + cnt), get_ixj(j->intercom)->DSPbase + 0x0C);
29511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					outb_p(*(j->read_buffer + cnt + 1), get_ixj(j->intercom)->DSPbase + 0x0D);
29521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
29531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				get_ixj(j->intercom)->frameswritten++;
29541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
29551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
29561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->read_buffer_ready = 1;
29571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			wake_up_interruptible(&j->read_q);	/* Wake any blocked readers */
29581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
29591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			wake_up_interruptible(&j->poll_q);	/* Wake any blocked selects */
29601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
29611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if(j->ixj_signals[SIG_READ_READY])
29621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ixj_kill_fasync(j, SIG_READ_READY, POLL_OUT);
29631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
29641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
29651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
29661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
29671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic short fsk[][6][20] =
29681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
29691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
29701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{
29711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			0, 17846, 29934, 32364, 24351, 8481, -10126, -25465, -32587, -29196,
29721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			-16384, 1715, 19260, 30591, 32051, 23170, 6813, -11743, -26509, -32722
29731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		},
29741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{
29751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			-28377, -14876, 3425, 20621, 31163, 31650, 21925, 5126, -13328, -27481,
29761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			-32767, -27481, -13328, 5126, 21925, 31650, 31163, 20621, 3425, -14876
29771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		},
29781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{
29791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			-28377, -32722, -26509, -11743, 6813, 23170, 32051, 30591, 19260, 1715,
29801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			-16384, -29196, -32587, -25465, -10126, 8481, 24351, 32364, 29934, 17846
29811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		},
29821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{
29831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			0, -17846, -29934, -32364, -24351, -8481, 10126, 25465, 32587, 29196,
29841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			16384, -1715, -19260, -30591, -32051, -23170, -6813, 11743, 26509, 32722
29851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		},
29861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{
29871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			28377, 14876, -3425, -20621, -31163, -31650, -21925, -5126, 13328, 27481,
29881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			32767, 27481, 13328, -5126, -21925, -31650, -31163, -20621, -3425, 14876
29891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		},
29901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{
29911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			28377, 32722, 26509, 11743, -6813, -23170, -32051, -30591, -19260, -1715,
29921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			16384, 29196, 32587, 25465, 10126, -8481, -24351, -32364, -29934, -17846
29931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
29941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
29951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
29961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{
29971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126,
29981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126
29991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		},
30001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{
30011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			-28377, -21925, -13328, -3425, 6813, 16384, 24351, 29934, 32587, 32051,
30021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			28377, 21925, 13328, 3425, -6813, -16384, -24351, -29934, -32587, -32051
30031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		},
30041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{
30051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			-28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925,
30061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925
30071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		},
30081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{
30091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			0, -10126, -19260, -26509, -31163, -32767, -31163, -26509, -19260, -10126,
30101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			0, 10126, 19260, 26509, 31163, 32767, 31163, 26509, 19260, 10126
30111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		},
30121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{
30131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			28377, 21925, 13328, 3425, -6813, -16383, -24351, -29934, -32587, -32051,
30141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			-28377, -21925, -13328, -3425, 6813, 16383, 24351, 29934, 32587, 32051
30151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		},
30161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{
30171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			28377, 32051, 32587, 29934, 24351, 16384, 6813, -3425, -13328, -21925,
30181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			-28377, -32051, -32587, -29934, -24351, -16384, -6813, 3425, 13328, 21925
30191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
30201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
30211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
30221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
30231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
30241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_write_cid_bit(IXJ *j, int bit)
30251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
30261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while (j->fskcnt < 20) {
30271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(j->fskdcnt < (j->fsksize - 1))
30281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->fskdata[j->fskdcnt++] = fsk[bit][j->fskz][j->fskcnt];
30291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
30301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->fskcnt += 3;
30311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
30321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->fskcnt %= 20;
30331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
30341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!bit)
30351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->fskz++;
30361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->fskz >= 6)
30371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->fskz = 0;
30381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
30391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
30401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
30411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_write_cid_byte(IXJ *j, char byte)
30421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
30431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IXJ_CBYTE cb;
30441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
30451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cb.cbyte = byte;
30461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_write_cid_bit(j, 0);
30471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_write_cid_bit(j, cb.cbits.b0 ? 1 : 0);
30481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_write_cid_bit(j, cb.cbits.b1 ? 1 : 0);
30491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_write_cid_bit(j, cb.cbits.b2 ? 1 : 0);
30501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_write_cid_bit(j, cb.cbits.b3 ? 1 : 0);
30511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_write_cid_bit(j, cb.cbits.b4 ? 1 : 0);
30521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_write_cid_bit(j, cb.cbits.b5 ? 1 : 0);
30531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_write_cid_bit(j, cb.cbits.b6 ? 1 : 0);
30541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_write_cid_bit(j, cb.cbits.b7 ? 1 : 0);
30551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_write_cid_bit(j, 1);
30561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
30571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
30581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_write_cid_seize(IXJ *j)
30591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
30601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int cnt;
30611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
30621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (cnt = 0; cnt < 150; cnt++) {
30631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_write_cid_bit(j, 0);
30641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_write_cid_bit(j, 1);
30651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
30661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (cnt = 0; cnt < 180; cnt++) {
30671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_write_cid_bit(j, 1);
30681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
30691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
30701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
30711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_write_cidcw_seize(IXJ *j)
30721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
30731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int cnt;
30741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
30751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (cnt = 0; cnt < 80; cnt++) {
30761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_write_cid_bit(j, 1);
30771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
30781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
30791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
30801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_write_cid_string(IXJ *j, char *s, int checksum)
30811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
30821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int cnt;
30831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
30841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (cnt = 0; cnt < strlen(s); cnt++) {
30851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_write_cid_byte(j, s[cnt]);
30861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		checksum = (checksum + s[cnt]);
30871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
30881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return checksum;
30891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
30901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
30911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_pad_fsk(IXJ *j, int pad)
30921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
30931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int cnt;
30941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
30951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (cnt = 0; cnt < pad; cnt++) {
30961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(j->fskdcnt < (j->fsksize - 1))
30971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->fskdata[j->fskdcnt++] = 0x0000;
30981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
30991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (cnt = 0; cnt < 720; cnt++) {
31001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(j->fskdcnt < (j->fsksize - 1))
31011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->fskdata[j->fskdcnt++] = 0x0000;
31021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
31031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
31041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
31051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_pre_cid(IXJ *j)
31061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
31071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cid_play_codec = j->play_codec;
31081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cid_play_frame_size = j->play_frame_size;
31091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cid_play_volume = get_play_volume(j);
31101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cid_play_flag = j->flags.playing;
31111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
31121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cid_rec_codec = j->rec_codec;
31131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cid_rec_volume = get_rec_volume(j);
31141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cid_rec_flag = j->flags.recording;
31151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
31161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cid_play_aec_level = j->aec_level;
31171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
31181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch(j->baseframe.low) {
31191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 0xA0:
31201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->cid_base_frame_size = 20;
31211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
31221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 0x50:
31231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->cid_base_frame_size = 10;
31241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
31251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 0xF0:
31261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->cid_base_frame_size = 30;
31271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
31281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
31291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
31301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_play_stop(j);
31311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_cpt_stop(j);
31321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
31331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->flags.cidplay = 1;
31341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
31351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	set_base_frame(j, 30);
31361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	set_play_codec(j, LINEAR16);
31371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	set_play_volume(j, 0x1B);
31381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_play_start(j);
31391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
31401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
31411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_post_cid(IXJ *j)
31421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
31431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_play_stop(j);
31441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
31451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if(j->cidsize > 5000) {
31461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
31471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
31481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->flags.cidplay = 0;
31491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if(ixjdebug & 0x0200) {
31501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk("IXJ phone%d Finished Playing CallerID data %ld\n", j->board, jiffies);
31511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
31521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
31531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_fsk_free(j);
31541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
31551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->fskdcnt = 0;
31561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	set_base_frame(j, j->cid_base_frame_size);
31571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	set_play_codec(j, j->cid_play_codec);
31581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_aec_start(j, j->cid_play_aec_level);
31591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	set_play_volume(j, j->cid_play_volume);
31601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
31611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	set_rec_codec(j, j->cid_rec_codec);
31621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	set_rec_volume(j, j->cid_rec_volume);
31631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
31641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if(j->cid_rec_flag)
31651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_record_start(j);
31661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
31671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if(j->cid_play_flag)
31681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_play_start(j);
31691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
31701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if(j->cid_play_flag) {
31711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		wake_up_interruptible(&j->write_q);	/* Wake any blocked writers */
31721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
31731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
31741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
31751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_write_cid(IXJ *j)
31761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
31771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char sdmf1[50];
31781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char sdmf2[50];
31791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char sdmf3[80];
31801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char mdmflen, len1, len2, len3;
31811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int pad;
31821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
31831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int checksum = 0;
31841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
31851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->dsp.low == 0x20 || j->flags.cidplay)
31861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return;
31871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
31881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
31891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cidsize = j->cidcnt = 0;
31901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
31911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_fsk_alloc(j);
31921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
31931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	strcpy(sdmf1, j->cid_send.month);
31941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	strcat(sdmf1, j->cid_send.day);
31951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	strcat(sdmf1, j->cid_send.hour);
31961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	strcat(sdmf1, j->cid_send.min);
31971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	strcpy(sdmf2, j->cid_send.number);
31981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	strcpy(sdmf3, j->cid_send.name);
31991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
32001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	len1 = strlen(sdmf1);
32011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	len2 = strlen(sdmf2);
32021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	len3 = strlen(sdmf3);
32031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mdmflen = len1 + len2 + len3 + 6;
32041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
32051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while(1){
32061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_write_cid_seize(j);
32071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
32081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_write_cid_byte(j, 0x80);
32091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		checksum = 0x80;
32101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_write_cid_byte(j, mdmflen);
32111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		checksum = checksum + mdmflen;
32121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
32131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_write_cid_byte(j, 0x01);
32141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		checksum = checksum + 0x01;
32151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_write_cid_byte(j, len1);
32161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		checksum = checksum + len1;
32171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		checksum = ixj_write_cid_string(j, sdmf1, checksum);
32181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(ixj_hookstate(j) & 1)
32191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
32201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
32211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_write_cid_byte(j, 0x02);
32221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		checksum = checksum + 0x02;
32231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_write_cid_byte(j, len2);
32241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		checksum = checksum + len2;
32251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		checksum = ixj_write_cid_string(j, sdmf2, checksum);
32261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(ixj_hookstate(j) & 1)
32271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
32281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
32291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_write_cid_byte(j, 0x07);
32301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		checksum = checksum + 0x07;
32311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_write_cid_byte(j, len3);
32321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		checksum = checksum + len3;
32331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		checksum = ixj_write_cid_string(j, sdmf3, checksum);
32341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(ixj_hookstate(j) & 1)
32351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
32361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
32371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		checksum %= 256;
32381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		checksum ^= 0xFF;
32391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		checksum += 1;
32401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
32411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_write_cid_byte(j, (char) checksum);
32421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
32431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		pad = j->fskdcnt % 240;
32441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (pad) {
32451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			pad = 240 - pad;
32461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
32471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_pad_fsk(j, pad);
32481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
32491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
32501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
32511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_write_frame(j);
32521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
32531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
32541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_write_cidcw(IXJ *j)
32551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
32561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IXJ_TONE ti;
32571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
32581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char sdmf1[50];
32591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char sdmf2[50];
32601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char sdmf3[80];
32611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char mdmflen, len1, len2, len3;
32621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int pad;
32631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
32641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int checksum = 0;
32651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
32661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->dsp.low == 0x20 || j->flags.cidplay)
32671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return;
32681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
32691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
32701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cidsize = j->cidcnt = 0;
32711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
32721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_fsk_alloc(j);
32731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
32741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->flags.cidcw_ack = 0;
32751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
32761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.tone_index = 23;
32771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain0 = 1;
32781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq0 = hz440;
32791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain1 = 0;
32801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq1 = 0;
32811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_init_tone(j, &ti);
32821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
32831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_set_tone_on(1500, j);
32841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_set_tone_off(32, j);
32851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if(ixjdebug & 0x0200) {
32861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk("IXJ cidcw phone%d first tone start at %ld\n", j->board, jiffies);
32871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
32881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_play_tone(j, 23);
32891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
32901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	clear_bit(j->board, &j->busyflags);
32911e63bc7342c40f0f1dd83d80d368665bd06f4963Nishanth Aravamudan	while(j->tone_state)
32921e63bc7342c40f0f1dd83d80d368665bd06f4963Nishanth Aravamudan		schedule_timeout_interruptible(1);
32931e63bc7342c40f0f1dd83d80d368665bd06f4963Nishanth Aravamudan	while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0)
32941e63bc7342c40f0f1dd83d80d368665bd06f4963Nishanth Aravamudan		schedule_timeout_interruptible(1);
32951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if(ixjdebug & 0x0200) {
32961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk("IXJ cidcw phone%d first tone end at %ld\n", j->board, jiffies);
32971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
32981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
32991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.tone_index = 24;
33001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain0 = 1;
33011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq0 = hz2130;
33021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.gain1 = 0;
33031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ti.freq1 = hz2750;
33041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_init_tone(j, &ti);
33051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
33061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_set_tone_off(10, j);
33071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_set_tone_on(600, j);
33081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if(ixjdebug & 0x0200) {
33091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk("IXJ cidcw phone%d second tone start at %ld\n", j->board, jiffies);
33101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
33111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_play_tone(j, 24);
33121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
33131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	clear_bit(j->board, &j->busyflags);
33141e63bc7342c40f0f1dd83d80d368665bd06f4963Nishanth Aravamudan	while(j->tone_state)
33151e63bc7342c40f0f1dd83d80d368665bd06f4963Nishanth Aravamudan		schedule_timeout_interruptible(1);
33161e63bc7342c40f0f1dd83d80d368665bd06f4963Nishanth Aravamudan	while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0)
33171e63bc7342c40f0f1dd83d80d368665bd06f4963Nishanth Aravamudan		schedule_timeout_interruptible(1);
33181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if(ixjdebug & 0x0200) {
33191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk("IXJ cidcw phone%d sent second tone at %ld\n", j->board, jiffies);
33201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
33211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
33221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cidcw_wait = jiffies + ((50 * hertz) / 100);
33231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
33241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	clear_bit(j->board, &j->busyflags);
33251e63bc7342c40f0f1dd83d80d368665bd06f4963Nishanth Aravamudan	while(!j->flags.cidcw_ack && time_before(jiffies, j->cidcw_wait))
33261e63bc7342c40f0f1dd83d80d368665bd06f4963Nishanth Aravamudan		schedule_timeout_interruptible(1);
33271e63bc7342c40f0f1dd83d80d368665bd06f4963Nishanth Aravamudan	while(test_and_set_bit(j->board, (void *)&j->busyflags) != 0)
33281e63bc7342c40f0f1dd83d80d368665bd06f4963Nishanth Aravamudan		schedule_timeout_interruptible(1);
33291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cidcw_wait = 0;
33301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if(!j->flags.cidcw_ack) {
33311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(ixjdebug & 0x0200) {
33321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk("IXJ cidcw phone%d did not receive ACK from display %ld\n", j->board, jiffies);
33331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
33341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_post_cid(j);
33351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(j->cid_play_flag) {
33361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			wake_up_interruptible(&j->write_q);	/* Wake any blocked readers */
33371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
33381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return;
33391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
33401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_pre_cid(j);
33411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
33421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->flags.cidcw_ack = 0;
33431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	strcpy(sdmf1, j->cid_send.month);
33441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	strcat(sdmf1, j->cid_send.day);
33451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	strcat(sdmf1, j->cid_send.hour);
33461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	strcat(sdmf1, j->cid_send.min);
33471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	strcpy(sdmf2, j->cid_send.number);
33481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	strcpy(sdmf3, j->cid_send.name);
33491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
33501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	len1 = strlen(sdmf1);
33511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	len2 = strlen(sdmf2);
33521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	len3 = strlen(sdmf3);
33531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mdmflen = len1 + len2 + len3 + 6;
33541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
33551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_write_cidcw_seize(j);
33561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
33571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_write_cid_byte(j, 0x80);
33581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	checksum = 0x80;
33591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_write_cid_byte(j, mdmflen);
33601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	checksum = checksum + mdmflen;
33611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
33621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_write_cid_byte(j, 0x01);
33631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	checksum = checksum + 0x01;
33641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_write_cid_byte(j, len1);
33651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	checksum = checksum + len1;
33661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	checksum = ixj_write_cid_string(j, sdmf1, checksum);
33671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
33681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_write_cid_byte(j, 0x02);
33691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	checksum = checksum + 0x02;
33701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_write_cid_byte(j, len2);
33711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	checksum = checksum + len2;
33721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	checksum = ixj_write_cid_string(j, sdmf2, checksum);
33731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
33741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_write_cid_byte(j, 0x07);
33751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	checksum = checksum + 0x07;
33761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_write_cid_byte(j, len3);
33771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	checksum = checksum + len3;
33781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	checksum = ixj_write_cid_string(j, sdmf3, checksum);
33791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
33801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	checksum %= 256;
33811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	checksum ^= 0xFF;
33821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	checksum += 1;
33831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
33841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_write_cid_byte(j, (char) checksum);
33851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
33861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pad = j->fskdcnt % 240;
33871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (pad) {
33881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		pad = 240 - pad;
33891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
33901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_pad_fsk(j, pad);
33911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if(ixjdebug & 0x0200) {
33921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk("IXJ cidcw phone%d sent FSK data at %ld\n", j->board, jiffies);
33931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
33941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
33951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
33961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_write_vmwi(IXJ *j, int msg)
33971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
33981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char mdmflen;
33991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int pad;
34001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
34011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int checksum = 0;
34021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
34031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->dsp.low == 0x20 || j->flags.cidplay)
34041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return;
34051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
34061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->fskz = j->fskphase = j->fskcnt = j->fskdcnt = 0;
34071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cidsize = j->cidcnt = 0;
34081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
34091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_fsk_alloc(j);
34101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
34111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mdmflen = 3;
34121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
34131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->port == PORT_POTS)
34141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		SLIC_SetState(PLD_SLIC_STATE_OHT, j);
34151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
34161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_write_cid_seize(j);
34171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
34181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_write_cid_byte(j, 0x82);
34191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	checksum = 0x82;
34201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_write_cid_byte(j, mdmflen);
34211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	checksum = checksum + mdmflen;
34221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
34231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_write_cid_byte(j, 0x0B);
34241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	checksum = checksum + 0x0B;
34251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_write_cid_byte(j, 1);
34261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	checksum = checksum + 1;
34271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
34281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if(msg) {
34291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_write_cid_byte(j, 0xFF);
34301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		checksum = checksum + 0xFF;
34311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
34321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	else {
34331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_write_cid_byte(j, 0x00);
34341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		checksum = checksum + 0x00;
34351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
34361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
34371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	checksum %= 256;
34381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	checksum ^= 0xFF;
34391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	checksum += 1;
34401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
34411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_write_cid_byte(j, (char) checksum);
34421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
34431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pad = j->fskdcnt % 240;
34441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (pad) {
34451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		pad = 240 - pad;
34461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
34471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_pad_fsk(j, pad);
34481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
34491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
34501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_write_frame(IXJ *j)
34511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
34521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int cnt, frame_count, dly;
34531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IXJ_WORD dat;
34541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
34551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	frame_count = 0;
34561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if(j->flags.cidplay) {
34571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		for(cnt = 0; cnt < 480; cnt++) {
34581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!(cnt % 16) && !IsTxReady(j)) {
34591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				dly = 0;
34601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				while (!IsTxReady(j)) {
34611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					if (dly++ > 5) {
34621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						dly = 0;
34631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						break;
34641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					}
34651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					udelay(10);
34661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
34671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
34681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			dat.word = j->fskdata[j->cidcnt++];
34691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb_p(dat.bytes.low, j->DSPbase + 0x0C);
34701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb_p(dat.bytes.high, j->DSPbase + 0x0D);
34711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cnt++;
34721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
34731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(j->cidcnt >= j->fskdcnt) {
34741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_post_cid(j);
34751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
34761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* This may seem rude, but if we just played one frame of FSK data for CallerID
34771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		   and there is real audio data in the buffer, we need to throw it away because
34781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		   we just used it's time slot */
34791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->write_buffer_rp > j->write_buffer_wp) {
34801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->write_buffer_rp += j->cid_play_frame_size * 2;
34811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (j->write_buffer_rp >= j->write_buffer_end) {
34821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->write_buffer_rp = j->write_buffer;
34831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
34841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->write_buffers_empty++;
34851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			wake_up_interruptible(&j->write_q);	/* Wake any blocked writers */
34861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
34871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			wake_up_interruptible(&j->poll_q);	/* Wake any blocked selects */
34881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
34891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else if (j->write_buffer && j->write_buffers_empty < 1) {
34901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->write_buffer_wp > j->write_buffer_rp) {
34911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			frame_count =
34921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			    (j->write_buffer_wp - j->write_buffer_rp) / (j->play_frame_size * 2);
34931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
34941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->write_buffer_rp > j->write_buffer_wp) {
34951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			frame_count =
34961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			    (j->write_buffer_wp - j->write_buffer) / (j->play_frame_size * 2) +
34971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			    (j->write_buffer_end - j->write_buffer_rp) / (j->play_frame_size * 2);
34981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
34991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (frame_count >= 1) {
35001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (j->ver.low == 0x12 && j->play_mode && j->flags.play_first_frame) {
35010d480db85dea59e1393c3968fbdac0117431e797Jeff Garzik				BYTES blankword;
35020d480db85dea59e1393c3968fbdac0117431e797Jeff Garzik
35031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				switch (j->play_mode) {
35041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				case PLAYBACK_MODE_ULAW:
35051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				case PLAYBACK_MODE_ALAW:
35061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					blankword.low = blankword.high = 0xFF;
35071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					break;
35081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				case PLAYBACK_MODE_8LINEAR:
35091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				case PLAYBACK_MODE_16LINEAR:
35100d480db85dea59e1393c3968fbdac0117431e797Jeff Garzik				default:
35111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					blankword.low = blankword.high = 0x00;
35121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					break;
35131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				case PLAYBACK_MODE_8LINEAR_WSS:
35141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					blankword.low = blankword.high = 0x80;
35151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					break;
35161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
35171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				for (cnt = 0; cnt < 16; cnt++) {
35181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					if (!(cnt % 16) && !IsTxReady(j)) {
35191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						dly = 0;
35201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						while (!IsTxReady(j)) {
35211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							if (dly++ > 5) {
35221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								dly = 0;
35231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								break;
35241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							}
35251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							udelay(10);
35261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						}
35271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					}
35281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					outb_p((blankword.low), j->DSPbase + 0x0C);
35291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					outb_p((blankword.high), j->DSPbase + 0x0D);
35301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
35311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->flags.play_first_frame = 0;
35321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			} else	if (j->play_codec == G723_63 && j->flags.play_first_frame) {
35331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				for (cnt = 0; cnt < 24; cnt++) {
35340d480db85dea59e1393c3968fbdac0117431e797Jeff Garzik					BYTES blankword;
35350d480db85dea59e1393c3968fbdac0117431e797Jeff Garzik
35361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					if(cnt == 12) {
35371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						blankword.low = 0x02;
35381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						blankword.high = 0x00;
35391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					}
35401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					else {
35411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						blankword.low = blankword.high = 0x00;
35421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					}
35431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					if (!(cnt % 16) && !IsTxReady(j)) {
35441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						dly = 0;
35451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						while (!IsTxReady(j)) {
35461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							if (dly++ > 5) {
35471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								dly = 0;
35481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds								break;
35491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							}
35501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							udelay(10);
35511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						}
35521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					}
35531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					outb_p((blankword.low), j->DSPbase + 0x0C);
35541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					outb_p((blankword.high), j->DSPbase + 0x0D);
35551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
35561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->flags.play_first_frame = 0;
35571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
35581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			for (cnt = 0; cnt < j->play_frame_size * 2; cnt += 2) {
35591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (!(cnt % 16) && !IsTxReady(j)) {
35601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					dly = 0;
35611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					while (!IsTxReady(j)) {
35621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						if (dly++ > 5) {
35631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							dly = 0;
35641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds							break;
35651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						}
35661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						udelay(10);
35671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					}
35681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
35691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			/* Add word 0 to G.729 frames for the 8021.  Right now we don't do VAD/CNG  */
35701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (j->play_codec == G729 && (cnt == 0 || cnt == 10 || cnt == 20)) {
357166ac5a294db70aa377c0d7bbdb0c4e3ef2349b7bAlexey Dobriyan					if (j->write_buffer_rp[cnt] == 0 &&
357266ac5a294db70aa377c0d7bbdb0c4e3ef2349b7bAlexey Dobriyan					    j->write_buffer_rp[cnt + 1] == 0 &&
357366ac5a294db70aa377c0d7bbdb0c4e3ef2349b7bAlexey Dobriyan					    j->write_buffer_rp[cnt + 2] == 0 &&
357466ac5a294db70aa377c0d7bbdb0c4e3ef2349b7bAlexey Dobriyan					    j->write_buffer_rp[cnt + 3] == 0 &&
357566ac5a294db70aa377c0d7bbdb0c4e3ef2349b7bAlexey Dobriyan					    j->write_buffer_rp[cnt + 4] == 0 &&
357666ac5a294db70aa377c0d7bbdb0c4e3ef2349b7bAlexey Dobriyan					    j->write_buffer_rp[cnt + 5] == 0 &&
357766ac5a294db70aa377c0d7bbdb0c4e3ef2349b7bAlexey Dobriyan					    j->write_buffer_rp[cnt + 6] == 0 &&
357866ac5a294db70aa377c0d7bbdb0c4e3ef2349b7bAlexey Dobriyan					    j->write_buffer_rp[cnt + 7] == 0 &&
357966ac5a294db70aa377c0d7bbdb0c4e3ef2349b7bAlexey Dobriyan					    j->write_buffer_rp[cnt + 8] == 0 &&
358066ac5a294db70aa377c0d7bbdb0c4e3ef2349b7bAlexey Dobriyan					    j->write_buffer_rp[cnt + 9] == 0) {
35811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					/* someone is trying to write silence lets make this a type 0 frame. */
35821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						outb_p(0x00, j->DSPbase + 0x0C);
35831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						outb_p(0x00, j->DSPbase + 0x0D);
35841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					} else {
35851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					/* so all other frames are type 1. */
35861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						outb_p(0x01, j->DSPbase + 0x0C);
35871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds						outb_p(0x00, j->DSPbase + 0x0D);
35881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					}
35891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
35901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				outb_p(*(j->write_buffer_rp + cnt), j->DSPbase + 0x0C);
35911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				outb_p(*(j->write_buffer_rp + cnt + 1), j->DSPbase + 0x0D);
35921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				*(j->write_buffer_rp + cnt) = 0;
35931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				*(j->write_buffer_rp + cnt + 1) = 0;
35941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
35951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->write_buffer_rp += j->play_frame_size * 2;
35961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (j->write_buffer_rp >= j->write_buffer_end) {
35971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->write_buffer_rp = j->write_buffer;
35981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
35991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->write_buffers_empty++;
36001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			wake_up_interruptible(&j->write_q);	/* Wake any blocked writers */
36011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
36021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			wake_up_interruptible(&j->poll_q);	/* Wake any blocked selects */
36031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
36041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			++j->frameswritten;
36051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
36061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
36071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->drybuffer++;
36081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
36091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if(j->ixj_signals[SIG_WRITE_READY]) {
36101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_kill_fasync(j, SIG_WRITE_READY, POLL_OUT);
36111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
36121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
36131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
36141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int idle(IXJ *j)
36151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
36161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixj_WriteDSPCommand(0x0000, j))		/* DSP Idle */
36171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
36181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
36191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
36201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->ssr.high || j->ssr.low) {
36211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
36221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
36231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->play_mode = -1;
36241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->flags.playing = 0;
36251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->rec_mode = -1;
36261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->flags.recording = 0;
36271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 1;
36281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        }
36291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
36301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
36311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int set_base_frame(IXJ *j, int size)
36321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
36331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned short cmd;
36341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int cnt;
36351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
36361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	idle(j);
36371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cid_play_aec_level = j->aec_level;
36381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	aec_stop(j);
36391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (cnt = 0; cnt < 10; cnt++) {
36401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (idle(j))
36411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
36421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
36431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->ssr.high || j->ssr.low)
36441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
36451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->dsp.low != 0x20) {
36461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (size) {
36471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 30:
36481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmd = 0x07F0;
36491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			/* Set Base Frame Size to 240 pg9-10 8021 */
36501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
36511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 20:
36521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmd = 0x07A0;
36531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			/* Set Base Frame Size to 160 pg9-10 8021 */
36541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
36551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 10:
36561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmd = 0x0750;
36571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			/* Set Base Frame Size to 80 pg9-10 8021 */
36581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
36591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		default:
36601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -1;
36611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
36621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
36631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (size == 30)
36641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return size;
36651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		else
36661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -1;
36671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
36681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixj_WriteDSPCommand(cmd, j)) {
36691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->baseframe.high = j->baseframe.low = 0xFF;
36701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
36711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
36721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->baseframe.high = j->ssr.high;
36731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->baseframe.low = j->ssr.low;
36741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* If the status returned is 0x0000 (pg9-9 8021) the call failed */
36751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(j->baseframe.high == 0x00 && j->baseframe.low == 0x00) {
36761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -1;
36771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
36781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
36791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_aec_start(j, j->cid_play_aec_level);
36801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return size;
36811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
36821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
36831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int set_rec_codec(IXJ *j, int rate)
36841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
36851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int retval = 0;
36861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
36871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->rec_codec = rate;
36881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
36891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (rate) {
36901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case G723_63:
36911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->ver.low != 0x12 || ixj_convert_loaded) {
36921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->rec_frame_size = 12;
36931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->rec_mode = 0;
36941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
36951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = 1;
36961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
36971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
36981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case G723_53:
36991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->ver.low != 0x12 || ixj_convert_loaded) {
37001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->rec_frame_size = 10;
37011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->rec_mode = 0;
37021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
37031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = 1;
37041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
37051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
37061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case TS85:
37071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
37081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->rec_frame_size = 16;
37091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->rec_mode = 0;
37101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
37111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = 1;
37121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
37131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
37141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case TS48:
37151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->ver.low != 0x12 || ixj_convert_loaded) {
37161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->rec_frame_size = 9;
37171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->rec_mode = 0;
37181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
37191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = 1;
37201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
37211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
37221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case TS41:
37231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->ver.low != 0x12 || ixj_convert_loaded) {
37241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->rec_frame_size = 8;
37251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->rec_mode = 0;
37261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
37271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = 1;
37281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
37291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
37301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case G728:
37311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->dsp.low != 0x20) {
37321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->rec_frame_size = 48;
37331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->rec_mode = 0;
37341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
37351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = 1;
37361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
37371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
37381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case G729:
37391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->dsp.low != 0x20) {
37401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!j->flags.g729_loaded) {
37411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				retval = 1;
37421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
37431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
37441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			switch (j->baseframe.low) {
37451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case 0xA0:
37461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->rec_frame_size = 10;
37471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
37481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case 0x50:
37491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->rec_frame_size = 5;
37501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
37511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			default:
37521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->rec_frame_size = 15;
37531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
37541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
37551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->rec_mode = 0;
37561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
37571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = 1;
37581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
37591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
37601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case G729B:
37611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->dsp.low != 0x20) {
37621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!j->flags.g729_loaded) {
37631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				retval = 1;
37641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
37651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
37661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			switch (j->baseframe.low) {
37671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case 0xA0:
37681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->rec_frame_size = 12;
37691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
37701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case 0x50:
37711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->rec_frame_size = 6;
37721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
37731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			default:
37741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->rec_frame_size = 18;
37751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
37761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
37771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->rec_mode = 0;
37781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
37791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = 1;
37801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
37811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
37821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ULAW:
37831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (j->baseframe.low) {
37841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 0xA0:
37851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->rec_frame_size = 80;
37861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
37871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 0x50:
37881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->rec_frame_size = 40;
37891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
37901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		default:
37911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->rec_frame_size = 120;
37921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
37931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
37941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->rec_mode = 4;
37951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
37961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ALAW:
37971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (j->baseframe.low) {
37981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 0xA0:
37991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->rec_frame_size = 80;
38001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
38011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 0x50:
38021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->rec_frame_size = 40;
38031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
38041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		default:
38051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->rec_frame_size = 120;
38061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
38071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
38081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->rec_mode = 4;
38091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
38101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case LINEAR16:
38111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (j->baseframe.low) {
38121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 0xA0:
38131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->rec_frame_size = 160;
38141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
38151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 0x50:
38161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->rec_frame_size = 80;
38171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
38181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		default:
38191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->rec_frame_size = 240;
38201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
38211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
38221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->rec_mode = 5;
38231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
38241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case LINEAR8:
38251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (j->baseframe.low) {
38261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 0xA0:
38271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->rec_frame_size = 80;
38281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
38291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 0x50:
38301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->rec_frame_size = 40;
38311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
38321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		default:
38331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->rec_frame_size = 120;
38341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
38351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
38361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->rec_mode = 6;
38371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
38381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case WSS:
38391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (j->baseframe.low) {
38401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 0xA0:
38411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->rec_frame_size = 80;
38421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
38431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 0x50:
38441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->rec_frame_size = 40;
38451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
38461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		default:
38471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->rec_frame_size = 120;
38481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
38491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
38501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->rec_mode = 7;
38511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
38521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
38530159f76d9f5839c3c92bc3a91c865e94d5e489a8Jesper Juhl		kfree(j->read_buffer);
38541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->rec_frame_size = 0;
38551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->rec_mode = -1;
38560159f76d9f5839c3c92bc3a91c865e94d5e489a8Jesper Juhl		j->read_buffer = NULL;
38570159f76d9f5839c3c92bc3a91c865e94d5e489a8Jesper Juhl		j->read_buffer_size = 0;
38581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		retval = 1;
38591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
38601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
38611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return retval;
38621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
38631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
38641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_record_start(IXJ *j)
38651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
38661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned short cmd = 0x0000;
38671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
38681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->read_buffer) {
38691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_record_stop(j);
38701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
38711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->flags.recording = 1;
38721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_WriteDSPCommand(0x0FE0, j);	/* Put the DSP in full power mode. */
38731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
38741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if(ixjdebug & 0x0002)
38751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk("IXJ %d Starting Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies);
38761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
38771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!j->rec_mode) {
38781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (j->rec_codec) {
38791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case G723_63:
38801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmd = 0x5131;
38811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
38821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case G723_53:
38831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmd = 0x5132;
38841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
38851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case TS85:
38861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmd = 0x5130;	/* TrueSpeech 8.5 */
38871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
38881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
38891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case TS48:
38901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmd = 0x5133;	/* TrueSpeech 4.8 */
38911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
38921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
38931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case TS41:
38941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmd = 0x5134;	/* TrueSpeech 4.1 */
38951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
38961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
38971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case G728:
38981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmd = 0x5135;
38991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
39001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case G729:
39011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case G729B:
39021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmd = 0x5136;
39031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
39041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		default:
39051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 1;
39061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
39071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixj_WriteDSPCommand(cmd, j))
39081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -1;
39091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
39101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!j->read_buffer) {
39111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!j->read_buffer)
39121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->read_buffer = kmalloc(j->rec_frame_size * 2, GFP_ATOMIC);
39131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!j->read_buffer) {
39141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk("Read buffer allocation for ixj board %d failed!\n", j->board);
39151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -ENOMEM;
39161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
39171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
39181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->read_buffer_size = j->rec_frame_size * 2;
39191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
39201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixj_WriteDSPCommand(0x5102, j))		/* Set Poll sync mode */
39211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
39221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
39231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
39241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (j->rec_mode) {
39251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case 0:
39261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cmd = 0x1C03;	/* Record C1 */
39271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
39281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
39291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case 4:
39301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->ver.low == 0x12) {
39311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmd = 0x1E03;	/* Record C1 */
39321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
39331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
39341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmd = 0x1E01;	/* Record C1 */
39351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
39361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
39371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
39381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case 5:
39391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->ver.low == 0x12) {
39401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmd = 0x1E83;	/* Record C1 */
39411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
39421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
39431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmd = 0x1E81;	/* Record C1 */
39441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
39451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
39461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
39471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case 6:
39481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->ver.low == 0x12) {
39491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmd = 0x1F03;	/* Record C1 */
39501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
39511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
39521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmd = 0x1F01;	/* Record C1 */
39531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
39541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
39551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
39561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case 7:
39571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->ver.low == 0x12) {
39581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmd = 0x1F83;	/* Record C1 */
39591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
39601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmd = 0x1F81;	/* Record C1 */
39611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
39621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
39631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
39641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixj_WriteDSPCommand(cmd, j))
39651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
39661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
39671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->flags.playing) {
39681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_aec_start(j, j->aec_level);
39691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
39701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
39711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
39721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
39731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_record_stop(IXJ *j)
39741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
39750159f76d9f5839c3c92bc3a91c865e94d5e489a8Jesper Juhl	if (ixjdebug & 0x0002)
39761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk("IXJ %d Stopping Record Codec %d at %ld\n", j->board, j->rec_codec, jiffies);
39771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
39780159f76d9f5839c3c92bc3a91c865e94d5e489a8Jesper Juhl	kfree(j->read_buffer);
39790159f76d9f5839c3c92bc3a91c865e94d5e489a8Jesper Juhl	j->read_buffer = NULL;
39800159f76d9f5839c3c92bc3a91c865e94d5e489a8Jesper Juhl	j->read_buffer_size = 0;
39811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->rec_mode > -1) {
39821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_WriteDSPCommand(0x5120, j);
39831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->rec_mode = -1;
39841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
39851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->flags.recording = 0;
39861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
39871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_vad(IXJ *j, int arg)
39881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
39891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (arg)
39901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_WriteDSPCommand(0x513F, j);
39911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	else
39921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_WriteDSPCommand(0x513E, j);
39931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
39941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
39951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void set_rec_depth(IXJ *j, int depth)
39961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
39971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (depth > 60)
39981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		depth = 60;
39991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (depth < 0)
40001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		depth = 0;
40011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_WriteDSPCommand(0x5180 + depth, j);
40021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
40031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
40041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void set_dtmf_prescale(IXJ *j, int volume)
40051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
40061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_WriteDSPCommand(0xCF07, j);
40071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_WriteDSPCommand(volume, j);
40081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
40091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
40101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int get_dtmf_prescale(IXJ *j)
40111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
40121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_WriteDSPCommand(0xCF05, j);
40131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return j->ssr.high << 8 | j->ssr.low;
40141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
40151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
40161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void set_rec_volume(IXJ *j, int volume)
40171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
40181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if(j->aec_level == AEC_AGC) {
40191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixjdebug & 0x0002)
40201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk(KERN_INFO "IXJ: /dev/phone%d Setting AGC Threshold to 0x%4.4x\n", j->board, volume);
40211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_WriteDSPCommand(0xCF96, j);
40221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_WriteDSPCommand(volume, j);
40231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
40241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixjdebug & 0x0002)
40251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk(KERN_INFO "IXJ: /dev/phone %d Setting Record Volume to 0x%4.4x\n", j->board, volume);
40261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_WriteDSPCommand(0xCF03, j);
40271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_WriteDSPCommand(volume, j);
40281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
40291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
40301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
40311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int set_rec_volume_linear(IXJ *j, int volume)
40321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
40331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int newvolume, dsprecmax;
40341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
40351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixjdebug & 0x0002)
40361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk(KERN_INFO "IXJ: /dev/phone %d Setting Linear Record Volume to 0x%4.4x\n", j->board, volume);
40371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if(volume > 100 || volume < 0) {
40381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	  return -1;
40391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
40401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
40411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* This should normalize the perceived volumes between the different cards caused by differences in the hardware */
40421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (j->cardtype) {
40431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case QTI_PHONEJACK:
40441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		dsprecmax = 0x440;
40451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
40461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case QTI_LINEJACK:
40471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		dsprecmax = 0x180;
40481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_mixer(0x0203, j);	/*Voice Left Volume unmute 6db */
40491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_mixer(0x0303, j);	/*Voice Right Volume unmute 6db */
40501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_mixer(0x0C00, j);	/*Mono1 unmute 12db */
40511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
40521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case QTI_PHONEJACK_LITE:
40531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		dsprecmax = 0x4C0;
40541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
40551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case QTI_PHONEJACK_PCI:
40561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		dsprecmax = 0x100;
40571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
40581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case QTI_PHONECARD:
40591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		dsprecmax = 0x400;
40601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
40611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
40621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
40631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
40641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	newvolume = (dsprecmax * volume) / 100;
40651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	set_rec_volume(j, newvolume);
40661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
40671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
40681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
40691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int get_rec_volume(IXJ *j)
40701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
40711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if(j->aec_level == AEC_AGC) {
40721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixjdebug & 0x0002)
40731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk(KERN_INFO "Getting AGC Threshold\n");
40741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_WriteDSPCommand(0xCF86, j);
40751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixjdebug & 0x0002)
40761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk(KERN_INFO "AGC Threshold is 0x%2.2x%2.2x\n", j->ssr.high, j->ssr.low);
40771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return j->ssr.high << 8 | j->ssr.low;
40781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
40791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixjdebug & 0x0002)
40801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk(KERN_INFO "Getting Record Volume\n");
40811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_WriteDSPCommand(0xCF01, j);
40821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return j->ssr.high << 8 | j->ssr.low;
40831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
40841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
40851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
40861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int get_rec_volume_linear(IXJ *j)
40871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
40881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int volume, newvolume, dsprecmax;
40891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
40901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (j->cardtype) {
40911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case QTI_PHONEJACK:
40921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		dsprecmax = 0x440;
40931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
40941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case QTI_LINEJACK:
40951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		dsprecmax = 0x180;
40961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
40971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case QTI_PHONEJACK_LITE:
40981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		dsprecmax = 0x4C0;
40991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
41001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case QTI_PHONEJACK_PCI:
41011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		dsprecmax = 0x100;
41021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
41031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case QTI_PHONECARD:
41041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		dsprecmax = 0x400;
41051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
41061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
41071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
41081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
41091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	volume = get_rec_volume(j);
41101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	newvolume = (volume * 100) / dsprecmax;
41111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if(newvolume > 100)
41121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		newvolume = 100;
41131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return newvolume;
41141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
41151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
41161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int get_rec_level(IXJ *j)
41171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
41181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int retval;
41191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
41201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_WriteDSPCommand(0xCF88, j);
41211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
41221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	retval = j->ssr.high << 8 | j->ssr.low;
41231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	retval = (retval * 256) / 240;
41241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return retval;
41251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
41261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
41271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_aec_start(IXJ *j, int level)
41281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
41291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->aec_level = level;
41301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixjdebug & 0x0002)
41311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk(KERN_INFO "AGC set = 0x%2.2x\n", j->aec_level);
41321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!level) {
41331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		aec_stop(j);
41341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
41351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) {
41361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0xE022, j);	/* Move AEC filter buffer */
41371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
41381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0x0300, j);
41391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
41401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_WriteDSPCommand(0xB001, j);	/* AEC On */
41411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
41421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_WriteDSPCommand(0xE013, j);	/* Advanced AEC C1 */
41431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
41441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (level) {
41451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case AEC_LOW:
41461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0x0000, j);	/* Advanced AEC C2 = off */
41471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
41481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0xE011, j);
41491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0xFFFF, j);
41501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
41511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0xCF97, j);	/* Set AGC Enable */
41521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0x0000, j);	/* to off */
41531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
41541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
41551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
41561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case AEC_MED:
41571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0x0600, j);	/* Advanced AEC C2 = on medium */
41581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
41591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0xE011, j);
41601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0x0080, j);
41611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
41621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0xCF97, j);	/* Set AGC Enable */
41631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0x0000, j);	/* to off */
41641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
41651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
41661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
41671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case AEC_HIGH:
41681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0x0C00, j);	/* Advanced AEC C2 = on high */
41691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
41701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0xE011, j);
41711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0x0080, j);
41721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
41731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0xCF97, j);	/* Set AGC Enable */
41741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0x0000, j);	/* to off */
41751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
41761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
41771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
41781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case AEC_AGC:
41791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                        /* First we have to put the AEC into advance auto mode so that AGC will not conflict with it */
41801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0x0002, j);	/* Attenuation scaling factor of 2 */
41811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
41821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0xE011, j);
41831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0x0100, j);	/* Higher Threshold Floor */
41841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
41851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0xE012, j);	/* Set Train and Lock */
41861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
41871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD)
41881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ixj_WriteDSPCommand(0x0224, j);
41891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			else
41901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ixj_WriteDSPCommand(0x1224, j);
41911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
41921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0xE014, j);
4193af901ca181d92aac3a7dc265144a9081a86d8f39André Goddard Rosa			ixj_WriteDSPCommand(0x0003, j);	/* Lock threshold at 3dB */
41941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
41951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0xE338, j);	/* Set Echo Suppresser Attenuation to 0dB */
41961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
41971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			/* Now we can set the AGC initial parameters and turn it on */
419825985edcedea6396277003854657b5f3cb31a628Lucas De Marchi			ixj_WriteDSPCommand(0xCF90, j);	/* Set AGC Minimum gain */
41991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0x0020, j);	/* to 0.125 (-18dB) */
42001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
42011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0xCF91, j);	/* Set AGC Maximum gain */
42021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0x1000, j);	/* to 16 (24dB) */
42031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
42041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0xCF92, j);	/* Set AGC start gain */
42051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0x0800, j);	/* to 8 (+18dB) */
42061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
42071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0xCF93, j);	/* Set AGC hold time */
42081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0x1F40, j);	/* to 2 seconds (units are 250us) */
42091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
42101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0xCF94, j);	/* Set AGC Attack Time Constant */
42111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0x0005, j);	/* to 8ms */
42121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
42131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0xCF95, j);	/* Set AGC Decay Time Constant */
42141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0x000D, j);	/* to 4096ms */
42151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
42161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0xCF96, j);	/* Set AGC Attack Threshold */
42171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0x1200, j);	/* to 25% */
42181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
42191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0xCF97, j);	/* Set AGC Enable */
42201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0x0001, j);	/* to on */
42211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
42221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
42231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
42241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case AEC_AUTO:
42251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0x0002, j);	/* Attenuation scaling factor of 2 */
42261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
42271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0xE011, j);
42281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0x0100, j);	/* Higher Threshold Floor */
42291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
42301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0xE012, j);	/* Set Train and Lock */
42311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
42321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if(j->cardtype == QTI_LINEJACK || j->cardtype == QTI_PHONECARD)
42331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ixj_WriteDSPCommand(0x0224, j);
42341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			else
42351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ixj_WriteDSPCommand(0x1224, j);
42361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
42371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0xE014, j);
4238af901ca181d92aac3a7dc265144a9081a86d8f39André Goddard Rosa			ixj_WriteDSPCommand(0x0003, j);	/* Lock threshold at 3dB */
42391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
42401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_WriteDSPCommand(0xE338, j);	/* Set Echo Suppresser Attenuation to 0dB */
42411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
42421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
42431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
42441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
42451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
42461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
42471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void aec_stop(IXJ *j)
42481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
42491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->aec_level = AEC_OFF;
42501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->rec_codec == G729 || j->play_codec == G729 || j->rec_codec == G729B || j->play_codec == G729B) {
42511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_WriteDSPCommand(0xE022, j);	/* Move AEC filter buffer back */
42521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
42531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_WriteDSPCommand(0x0700, j);
42541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
42551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->play_mode != -1 && j->rec_mode != -1)
42561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
42571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_WriteDSPCommand(0xB002, j);	/* AEC Stop */
42581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
42591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
42601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
42611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int set_play_codec(IXJ *j, int rate)
42621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
42631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int retval = 0;
42641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
42651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->play_codec = rate;
42661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
42671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (rate) {
42681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case G723_63:
42691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->ver.low != 0x12 || ixj_convert_loaded) {
42701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->play_frame_size = 12;
42711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->play_mode = 0;
42721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
42731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = 1;
42741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
42751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
42761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case G723_53:
42771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->ver.low != 0x12 || ixj_convert_loaded) {
42781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->play_frame_size = 10;
42791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->play_mode = 0;
42801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
42811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = 1;
42821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
42831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
42841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case TS85:
42851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
42861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->play_frame_size = 16;
42871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->play_mode = 0;
42881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
42891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = 1;
42901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
42911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
42921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case TS48:
42931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->ver.low != 0x12 || ixj_convert_loaded) {
42941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->play_frame_size = 9;
42951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->play_mode = 0;
42961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
42971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = 1;
42981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
42991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
43001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case TS41:
43011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->ver.low != 0x12 || ixj_convert_loaded) {
43021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->play_frame_size = 8;
43031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->play_mode = 0;
43041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
43051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = 1;
43061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
43071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
43081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case G728:
43091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->dsp.low != 0x20) {
43101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->play_frame_size = 48;
43111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->play_mode = 0;
43121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
43131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = 1;
43141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
43151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
43161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case G729:
43171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->dsp.low != 0x20) {
43181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!j->flags.g729_loaded) {
43191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				retval = 1;
43201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
43211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
43221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			switch (j->baseframe.low) {
43231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case 0xA0:
43241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->play_frame_size = 10;
43251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
43261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case 0x50:
43271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->play_frame_size = 5;
43281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
43291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			default:
43301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->play_frame_size = 15;
43311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
43321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
43331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->play_mode = 0;
43341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
43351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = 1;
43361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
43371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
43381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case G729B:
43391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->dsp.low != 0x20) {
43401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!j->flags.g729_loaded) {
43411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				retval = 1;
43421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
43431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
43441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			switch (j->baseframe.low) {
43451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case 0xA0:
43461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->play_frame_size = 12;
43471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
43481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case 0x50:
43491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->play_frame_size = 6;
43501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
43511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			default:
43521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->play_frame_size = 18;
43531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
43541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
43551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->play_mode = 0;
43561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
43571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = 1;
43581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
43591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
43601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ULAW:
43611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (j->baseframe.low) {
43621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 0xA0:
43631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->play_frame_size = 80;
43641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
43651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 0x50:
43661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->play_frame_size = 40;
43671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
43681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		default:
43691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->play_frame_size = 120;
43701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
43711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
43721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->play_mode = 2;
43731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
43741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case ALAW:
43751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (j->baseframe.low) {
43761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 0xA0:
43771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->play_frame_size = 80;
43781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
43791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 0x50:
43801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->play_frame_size = 40;
43811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
43821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		default:
43831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->play_frame_size = 120;
43841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
43851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
43861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->play_mode = 2;
43871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
43881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case LINEAR16:
43891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (j->baseframe.low) {
43901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 0xA0:
43911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->play_frame_size = 160;
43921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
43931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 0x50:
43941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->play_frame_size = 80;
43951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
43961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		default:
43971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->play_frame_size = 240;
43981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
43991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
44001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->play_mode = 6;
44011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
44021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case LINEAR8:
44031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (j->baseframe.low) {
44041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 0xA0:
44051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->play_frame_size = 80;
44061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
44071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 0x50:
44081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->play_frame_size = 40;
44091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
44101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		default:
44111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->play_frame_size = 120;
44121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
44131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
44141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->play_mode = 4;
44151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
44161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case WSS:
44171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (j->baseframe.low) {
44181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 0xA0:
44191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->play_frame_size = 80;
44201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
44211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 0x50:
44221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->play_frame_size = 40;
44231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
44241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		default:
44251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->play_frame_size = 120;
44261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
44271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
44281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->play_mode = 5;
44291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
44301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
44310159f76d9f5839c3c92bc3a91c865e94d5e489a8Jesper Juhl		kfree(j->write_buffer);
44321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->play_frame_size = 0;
44331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->play_mode = -1;
44340159f76d9f5839c3c92bc3a91c865e94d5e489a8Jesper Juhl		j->write_buffer = NULL;
44350159f76d9f5839c3c92bc3a91c865e94d5e489a8Jesper Juhl		j->write_buffer_size = 0;
44361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		retval = 1;
44371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
44381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
44391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return retval;
44401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
44411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
44421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_play_start(IXJ *j)
44431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
44441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned short cmd = 0x0000;
44451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
44461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->write_buffer) {
44471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_play_stop(j);
44481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
44491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
44501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if(ixjdebug & 0x0002)
44511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk("IXJ %d Starting Play Codec %d at %ld\n", j->board, j->play_codec, jiffies);
44521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
44531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->flags.playing = 1;
44541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_WriteDSPCommand(0x0FE0, j);	/* Put the DSP in full power mode. */
44551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
44561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->flags.play_first_frame = 1;
44571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->drybuffer = 0;
44581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
44591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!j->play_mode) {
44601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (j->play_codec) {
44611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case G723_63:
44621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmd = 0x5231;
44631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
44641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case G723_53:
44651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmd = 0x5232;
44661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
44671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case TS85:
44681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmd = 0x5230;	/* TrueSpeech 8.5 */
44691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
44701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
44711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case TS48:
44721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmd = 0x5233;	/* TrueSpeech 4.8 */
44731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
44741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
44751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case TS41:
44761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmd = 0x5234;	/* TrueSpeech 4.1 */
44771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
44781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
44791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case G728:
44801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmd = 0x5235;
44811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
44821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case G729:
44831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case G729B:
44841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmd = 0x5236;
44851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
44861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		default:
44871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 1;
44881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
44891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixj_WriteDSPCommand(cmd, j))
44901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -1;
44911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
44921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->write_buffer = kmalloc(j->play_frame_size * 2, GFP_ATOMIC);
44931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!j->write_buffer) {
44941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk("Write buffer allocation for ixj board %d failed!\n", j->board);
44951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -ENOMEM;
44961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
44971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*	j->write_buffers_empty = 2; */
44981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->write_buffers_empty = 1;
44991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->write_buffer_size = j->play_frame_size * 2;
45001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->write_buffer_end = j->write_buffer + j->play_frame_size * 2;
45011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->write_buffer_rp = j->write_buffer_wp = j->write_buffer;
45021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
45031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixj_WriteDSPCommand(0x5202, j))		/* Set Poll sync mode */
45041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
45051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
45061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
45071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (j->play_mode) {
45081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case 0:
45091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cmd = 0x2C03;
45101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
45111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case 2:
45121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->ver.low == 0x12) {
45131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmd = 0x2C23;
45141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
45151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmd = 0x2C21;
45161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
45171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
45181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case 4:
45191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->ver.low == 0x12) {
45201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmd = 0x2C43;
45211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
45221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmd = 0x2C41;
45231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
45241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
45251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case 5:
45261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->ver.low == 0x12) {
45271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmd = 0x2C53;
45281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
45291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmd = 0x2C51;
45301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
45311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
45321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case 6:
45331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->ver.low == 0x12) {
45341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmd = 0x2C63;
45351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
45361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmd = 0x2C61;
45371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
45381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
45391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
45401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixj_WriteDSPCommand(cmd, j))
45411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
45421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
45431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixj_WriteDSPCommand(0x2000, j))		/* Playback C2 */
45441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
45451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
45461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixj_WriteDSPCommand(0x2000 + j->play_frame_size, j))	/* Playback C3 */
45471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
45481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
45491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->flags.recording) {
45501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_aec_start(j, j->aec_level);
45511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
45521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
45531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
45541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
45551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
45561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_play_stop(IXJ *j)
45571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
45580159f76d9f5839c3c92bc3a91c865e94d5e489a8Jesper Juhl	if (ixjdebug & 0x0002)
45591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk("IXJ %d Stopping Play Codec %d at %ld\n", j->board, j->play_codec, jiffies);
45601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
45610159f76d9f5839c3c92bc3a91c865e94d5e489a8Jesper Juhl	kfree(j->write_buffer);
45620159f76d9f5839c3c92bc3a91c865e94d5e489a8Jesper Juhl	j->write_buffer = NULL;
45630159f76d9f5839c3c92bc3a91c865e94d5e489a8Jesper Juhl	j->write_buffer_size = 0;
45641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->play_mode > -1) {
45651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_WriteDSPCommand(0x5221, j);	/* Stop playback and flush buffers.  8022 reference page 9-40 */
45661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
45671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->play_mode = -1;
45681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
45691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->flags.playing = 0;
45701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
45711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
45721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic inline int get_play_level(IXJ *j)
45731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
45741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int retval;
45751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
45761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_WriteDSPCommand(0xCF8F, j); /* 8022 Reference page 9-38 */
45771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return j->ssr.high << 8 | j->ssr.low;
45781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	retval = j->ssr.high << 8 | j->ssr.low;
45791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	retval = (retval * 256) / 240;
45801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return retval;
45811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
45821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
45831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic unsigned int ixj_poll(struct file *file_p, poll_table * wait)
45841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
45851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int mask = 0;
45861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4587d1f229744ece0b7aa7ce89ecd1fb598b90305d5bJosef Sipek	IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
45881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
45891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	poll_wait(file_p, &(j->poll_q), wait);
45901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->read_buffer_ready > 0)
45911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		mask |= POLLIN | POLLRDNORM;	/* readable */
45921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->write_buffers_empty > 0)
45931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		mask |= POLLOUT | POLLWRNORM;	/* writable */
45941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->ex.bytes)
45951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		mask |= POLLPRI;
45961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return mask;
45971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
45981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
45991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_play_tone(IXJ *j, char tone)
46001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
46011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!j->tone_state) {
46021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(ixjdebug & 0x0002) {
46031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk("IXJ %d starting tone %d at %ld\n", j->board, tone, jiffies);
46041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
46051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->dsp.low == 0x20) {
46061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			idle(j);
46071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
46081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->tone_start_jif = jiffies;
46091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
46101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->tone_state = 1;
46111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
46121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
46131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->tone_index = tone;
46141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixj_WriteDSPCommand(0x6000 + j->tone_index, j))
46151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
46161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
46171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
46181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
46191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
46201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_set_tone_on(unsigned short arg, IXJ *j)
46211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
46221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->tone_on_time = arg;
46231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
46241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixj_WriteDSPCommand(0x6E04, j))		/* Set Tone On Period */
46251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
46261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
46271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
46281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixj_WriteDSPCommand(arg, j))
46291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
46301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
46311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
46321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
46331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
46341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int SCI_WaitHighSCI(IXJ *j)
46351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
46361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int cnt;
46371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
46381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->pld_scrr.byte = inb_p(j->XILINXbase);
46391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!j->pld_scrr.bits.sci) {
46401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		for (cnt = 0; cnt < 10; cnt++) {
46411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			udelay(32);
46421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_scrr.byte = inb_p(j->XILINXbase);
46431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
46441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if ((j->pld_scrr.bits.sci))
46451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return 1;
46461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
46471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixjdebug & 0x0001)
46481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk(KERN_INFO "SCI Wait High failed %x\n", j->pld_scrr.byte);
46491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
46501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else
46511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 1;
46521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
46531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
46541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int SCI_WaitLowSCI(IXJ *j)
46551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
46561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int cnt;
46571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
46581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->pld_scrr.byte = inb_p(j->XILINXbase);
46591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->pld_scrr.bits.sci) {
46601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		for (cnt = 0; cnt < 10; cnt++) {
46611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			udelay(32);
46621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_scrr.byte = inb_p(j->XILINXbase);
46631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
46641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!(j->pld_scrr.bits.sci))
46651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return 1;
46661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
46671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixjdebug & 0x0001)
46681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk(KERN_INFO "SCI Wait Low failed %x\n", j->pld_scrr.byte);
46691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
46701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else
46711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 1;
46721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
46731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
46741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int SCI_Control(IXJ *j, int control)
46751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
46761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (control) {
46771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case SCI_End:
46781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pld_scrw.bits.c0 = 0;	/* Set PLD Serial control interface */
46791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
46801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pld_scrw.bits.c1 = 0;	/* to no selection */
46811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
46821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
46831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case SCI_Enable_DAA:
46841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pld_scrw.bits.c0 = 1;	/* Set PLD Serial control interface */
46851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
46861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pld_scrw.bits.c1 = 0;	/* to write to DAA */
46871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
46881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
46891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case SCI_Enable_Mixer:
46901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pld_scrw.bits.c0 = 0;	/* Set PLD Serial control interface */
46911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
46921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pld_scrw.bits.c1 = 1;	/* to write to mixer */
46931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
46941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
46951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case SCI_Enable_EEPROM:
46961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pld_scrw.bits.c0 = 1;	/* Set PLD Serial control interface */
46971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
46981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pld_scrw.bits.c1 = 1;	/* to write to EEPROM */
46991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
47001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
47011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
47021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
47031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
47041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
47051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	outb_p(j->pld_scrw.byte, j->XILINXbase);
47061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
47071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (control) {
47081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case SCI_End:
47091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 1;
47101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
47111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case SCI_Enable_DAA:
47121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case SCI_Enable_Mixer:
47131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case SCI_Enable_EEPROM:
47141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!SCI_WaitHighSCI(j))
47151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 0;
47161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
47171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
47181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
47191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
47201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
47211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 1;
47221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
47231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
47241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int SCI_Prepare(IXJ *j)
47251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
47261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Control(j, SCI_End))
47271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
47281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
47291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_WaitLowSCI(j))
47301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
47311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
47321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 1;
47331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
47341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
47351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_get_mixer(long val, IXJ *j)
47361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
47371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int reg = (val & 0x1F00) >> 8;
47381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        return j->mix.vol[reg];
47391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
47401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
47411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_mixer(long val, IXJ *j)
47421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
47431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	BYTES bytes;
47441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
47451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = (val & 0x1F00) >> 8;
47461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = val & 0x00FF;
47471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
47481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        /* save mixer value so we can get back later on */
47491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        j->mix.vol[bytes.high] = bytes.low;
47501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
47511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	outb_p(bytes.high & 0x1F, j->XILINXbase + 0x03);	/* Load Mixer Address */
47521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
47531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	outb_p(bytes.low, j->XILINXbase + 0x02);	/* Load Mixer Data */
47541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
47551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	SCI_Control(j, SCI_Enable_Mixer);
47561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
47571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	SCI_Control(j, SCI_End);
47581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
47591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
47601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
47611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
47621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int daa_load(BYTES * p_bytes, IXJ *j)
47631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
47641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	outb_p(p_bytes->high, j->XILINXbase + 0x03);
47651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	outb_p(p_bytes->low, j->XILINXbase + 0x02);
47661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Control(j, SCI_Enable_DAA))
47671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
47681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	else
47691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 1;
47701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
47711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
47721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_daa_cr4(IXJ *j, char reg)
47731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
47741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	BYTES bytes;
47751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
47761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (j->daa_mode) {
47771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case SOP_PU_SLEEP:
47781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		bytes.high = 0x14;
47791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
47801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case SOP_PU_RINGING:
47811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		bytes.high = 0x54;
47821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
47831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case SOP_PU_CONVERSATION:
47841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		bytes.high = 0x94;
47851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
47861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case SOP_PU_PULSEDIALING:
47871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		bytes.high = 0xD4;
47881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
47891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
47901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
47911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = reg;
47921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
47931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGX) {
47941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case 0:
47951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 0;
47961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
47971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case 1:
47981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 2;
47991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
48001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case 2:
48011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 1;
48021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
48031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case 3:
48041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.bitreg.AGR_Z = 3;
48051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
48061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
48071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
48081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;
48091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
48101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
48111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
48121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
48131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Prepare(j))
48141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
48151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
48161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 1;
48171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
48181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
48191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic char daa_int_read(IXJ *j)
48201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
48211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	BYTES bytes;
48221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
48231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Prepare(j))
48241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
48251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
48261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = 0x38;
48271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = 0x00;
48281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	outb_p(bytes.high, j->XILINXbase + 0x03);
48291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	outb_p(bytes.low, j->XILINXbase + 0x02);
48301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
48311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Control(j, SCI_Enable_DAA))
48321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
48331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
48341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = inb_p(j->XILINXbase + 0x03);
48351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = inb_p(j->XILINXbase + 0x02);
48361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (bytes.low != ALISDAA_ID_BYTE) {
48371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixjdebug & 0x0001)
48381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
48391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
48401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
48411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Control(j, SCI_Enable_DAA))
48421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
48431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Control(j, SCI_End))
48441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
48451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
48461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = inb_p(j->XILINXbase + 0x03);
48471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = inb_p(j->XILINXbase + 0x02);
48481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
48491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg = bytes.high;
48501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
48511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 1;
48521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
48531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
48541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic char daa_CR_read(IXJ *j, int cr)
48551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
48561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IXJ_WORD wdata;
48571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	BYTES bytes;
48581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
48591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Prepare(j))
48601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
48611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
48621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (j->daa_mode) {
48631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case SOP_PU_SLEEP:
48641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		bytes.high = 0x30 + cr;
48651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
48661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case SOP_PU_RINGING:
48671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		bytes.high = 0x70 + cr;
48681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
48691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case SOP_PU_CONVERSATION:
48701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		bytes.high = 0xB0 + cr;
48711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
48721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case SOP_PU_PULSEDIALING:
48730d480db85dea59e1393c3968fbdac0117431e797Jeff Garzik	default:
48741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		bytes.high = 0xF0 + cr;
48751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
48761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
48771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
48781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = 0x00;
48791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
48801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	outb_p(bytes.high, j->XILINXbase + 0x03);
48811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	outb_p(bytes.low, j->XILINXbase + 0x02);
48821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
48831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Control(j, SCI_Enable_DAA))
48841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
48851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
48861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = inb_p(j->XILINXbase + 0x03);
48871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = inb_p(j->XILINXbase + 0x02);
48881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (bytes.low != ALISDAA_ID_BYTE) {
48891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixjdebug & 0x0001)
48901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk("Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
48911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
48921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
48931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Control(j, SCI_Enable_DAA))
48941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
48951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Control(j, SCI_End))
48961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
48971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
48981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	wdata.word = inw_p(j->XILINXbase + 0x02);
48991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
49001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch(cr){
49011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 5:
49021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = wdata.bytes.high;
49031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
49041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 4:
49051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = wdata.bytes.high;
49061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
49071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 3:
49081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = wdata.bytes.high;
49091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
49101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 2:
49111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = wdata.bytes.high;
49121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
49131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 1:
49141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = wdata.bytes.high;
49151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
49161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case 0:
49171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = wdata.bytes.high;
49181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
49191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		default:
49201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 0;
49211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
49221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 1;
49231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
49241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
49251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_daa_cid_reset(IXJ *j)
49261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
49271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int i;
49281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	BYTES bytes;
49291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
49301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixjdebug & 0x0002)
49311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk("DAA Clearing CID ram\n");
49321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
49331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Prepare(j))
49341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
49351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
49361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = 0x58;
49371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = 0x00;
49381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	outb_p(bytes.high, j->XILINXbase + 0x03);
49391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	outb_p(bytes.low, j->XILINXbase + 0x02);
49401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
49411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Control(j, SCI_Enable_DAA))
49421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
49431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
49441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_WaitHighSCI(j))
49451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
49461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
49471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (i = 0; i < ALISDAA_CALLERID_SIZE - 1; i += 2) {
49481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		bytes.high = bytes.low = 0x00;
49491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb_p(bytes.high, j->XILINXbase + 0x03);
49501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
49511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (i < ALISDAA_CALLERID_SIZE - 1)
49521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb_p(bytes.low, j->XILINXbase + 0x02);
49531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
49541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!SCI_Control(j, SCI_Enable_DAA))
49551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 0;
49561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
49571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!SCI_WaitHighSCI(j))
49581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 0;
49591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
49601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
49611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
49621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Control(j, SCI_End))
49631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
49641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
49651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixjdebug & 0x0002)
49661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk("DAA CID ram cleared\n");
49671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
49681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 1;
49691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
49701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
49711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_daa_cid_read(IXJ *j)
49721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
49731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int i;
49741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	BYTES bytes;
4975e13df2c58f8e8c72278b61e8f59de9a1403f9426Richard Knutsson	char CID[ALISDAA_CALLERID_SIZE];
4976e13df2c58f8e8c72278b61e8f59de9a1403f9426Richard Knutsson	bool mContinue;
49771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char *pIn, *pOut;
49781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
49791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Prepare(j))
49801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
49811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
49821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = 0x78;
49831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = 0x00;
49841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	outb_p(bytes.high, j->XILINXbase + 0x03);
49851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	outb_p(bytes.low, j->XILINXbase + 0x02);
49861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
49871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Control(j, SCI_Enable_DAA))
49881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
49891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
49901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_WaitHighSCI(j))
49911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
49921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
49931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = inb_p(j->XILINXbase + 0x03);
49941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = inb_p(j->XILINXbase + 0x02);
49951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (bytes.low != ALISDAA_ID_BYTE) {
49961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixjdebug & 0x0001)
49971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
49981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
49991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
50001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (i = 0; i < ALISDAA_CALLERID_SIZE; i += 2) {
50011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		bytes.high = bytes.low = 0x00;
50021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb_p(bytes.high, j->XILINXbase + 0x03);
50031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb_p(bytes.low, j->XILINXbase + 0x02);
50041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
50051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!SCI_Control(j, SCI_Enable_DAA))
50061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 0;
50071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
50081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!SCI_WaitHighSCI(j))
50091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 0;
50101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
50111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		CID[i + 0] = inb_p(j->XILINXbase + 0x03);
50121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		CID[i + 1] = inb_p(j->XILINXbase + 0x02);
50131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
50141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
50151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Control(j, SCI_End))
50161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
50171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
50181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pIn = CID;
50191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
5020e13df2c58f8e8c72278b61e8f59de9a1403f9426Richard Knutsson	mContinue = true;
50211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while (mContinue) {
50221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if ((pIn[1] & 0x03) == 0x01) {
50231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			pOut[0] = pIn[0];
50241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
50251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if ((pIn[2] & 0x0c) == 0x04) {
50261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			pOut[1] = ((pIn[2] & 0x03) << 6) | ((pIn[1] & 0xfc) >> 2);
50271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
50281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if ((pIn[3] & 0x30) == 0x10) {
50291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			pOut[2] = ((pIn[3] & 0x0f) << 4) | ((pIn[2] & 0xf0) >> 4);
50301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
50311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if ((pIn[4] & 0xc0) == 0x40) {
50321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			pOut[3] = ((pIn[4] & 0x3f) << 2) | ((pIn[3] & 0xc0) >> 6);
50331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
5034e13df2c58f8e8c72278b61e8f59de9a1403f9426Richard Knutsson			mContinue = false;
50351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
50361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		pIn += 5, pOut += 4;
50371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
50381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	memset(&j->cid, 0, sizeof(PHONE_CID));
50391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pOut = j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID;
50401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pOut += 4;
50411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	strncpy(j->cid.month, pOut, 2);
50421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pOut += 2;
50431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	strncpy(j->cid.day, pOut, 2);
50441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pOut += 2;
50451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	strncpy(j->cid.hour, pOut, 2);
50461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pOut += 2;
50471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	strncpy(j->cid.min, pOut, 2);
50481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pOut += 3;
50491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cid.numlen = *pOut;
50501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pOut += 1;
50511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	strncpy(j->cid.number, pOut, j->cid.numlen);
50521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pOut += j->cid.numlen + 1;
50531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cid.namelen = *pOut;
50541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	pOut += 1;
50551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	strncpy(j->cid.name, pOut, j->cid.namelen);
50561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
50571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_daa_cid_reset(j);
50581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 1;
50591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
50601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
50611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic char daa_get_version(IXJ *j)
50621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
50631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	BYTES bytes;
50641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
50651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Prepare(j))
50661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
50671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
50681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = 0x35;
50691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = 0x00;
50701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	outb_p(bytes.high, j->XILINXbase + 0x03);
50711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	outb_p(bytes.low, j->XILINXbase + 0x02);
50721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
50731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Control(j, SCI_Enable_DAA))
50741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
50751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
50761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = inb_p(j->XILINXbase + 0x03);
50771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = inb_p(j->XILINXbase + 0x02);
50781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (bytes.low != ALISDAA_ID_BYTE) {
50791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixjdebug & 0x0001)
50801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk("DAA Get Version Cannot read DAA ID Byte high = %d low = %d\n", bytes.high, bytes.low);
50811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
50821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
50831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Control(j, SCI_Enable_DAA))
50841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
50851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
50861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Control(j, SCI_End))
50871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
50881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
50891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = inb_p(j->XILINXbase + 0x03);
50901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = inb_p(j->XILINXbase + 0x02);
50911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixjdebug & 0x0002)
50921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk("DAA CR5 Byte high = 0x%x low = 0x%x\n", bytes.high, bytes.low);
50931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg = bytes.high;
50941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return bytes.high;
50951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
50961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
50971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int daa_set_mode(IXJ *j, int mode)
50981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
50991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* NOTE:
51001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	      The DAA *MUST* be in the conversation mode if the
51011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	      PSTN line is to be seized (PSTN line off-hook).
51021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	      Taking the PSTN line off-hook while the DAA is in
51031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	      a mode other than conversation mode will cause a
51041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	      hardware failure of the ALIS-A part.
51051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
51061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	   NOTE:
51071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	      The DAA can only go to SLEEP, RINGING or PULSEDIALING modes
51081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	      if the PSTN line is on-hook.  Failure to have the PSTN line
51091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	      in the on-hook state WILL CAUSE A HARDWARE FAILURE OF THE
51101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	      ALIS-A part.
51111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*/
51121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
51131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	BYTES bytes;
51141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
51151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->flags.pstn_rmr = 0;
51161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
51171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Prepare(j))
51181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
51191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
51201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (mode) {
51211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case SOP_PU_RESET:
51221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */
51231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
51241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb_p(j->pld_scrw.byte, j->XILINXbase);
51251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pld_slicw.bits.rly2 = 0;
51261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
51271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		bytes.high = 0x10;
51281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
51291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		daa_load(&bytes, j);
51301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!SCI_Prepare(j))
51311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 0;
51321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
51331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->daa_mode = SOP_PU_SLEEP;
51341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
51351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case SOP_PU_SLEEP:
51361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(j->daa_mode == SOP_PU_SLEEP)
51371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{
51381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
51391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
51401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixjdebug & 0x0008)
51411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk(KERN_INFO "phone DAA: SOP_PU_SLEEP at %ld\n", jiffies);
51421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*		if(j->daa_mode == SOP_PU_CONVERSATION) */
51431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{
51441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */
51451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
51461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb_p(j->pld_scrw.byte, j->XILINXbase);
51471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.rly2 = 0;
51481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
51491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			bytes.high = 0x10;
51501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
51511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			daa_load(&bytes, j);
51521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!SCI_Prepare(j))
51531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return 0;
51541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
51551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */
51561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
51571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb_p(j->pld_scrw.byte, j->XILINXbase);
51581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pld_slicw.bits.rly2 = 0;
51591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
51601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		bytes.high = 0x10;
51611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
51621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		daa_load(&bytes, j);
51631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!SCI_Prepare(j))
51641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 0;
51651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
51661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->daa_mode = SOP_PU_SLEEP;
51671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->flags.pstn_ringing = 0;
51681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->ex.bits.pstn_ring = 0;
51691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pstn_sleeptil = jiffies + (hertz / 4);
51701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		wake_up_interruptible(&j->read_q);      /* Wake any blocked readers */
51711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		wake_up_interruptible(&j->write_q);     /* Wake any blocked writers */
51721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		wake_up_interruptible(&j->poll_q);      /* Wake any blocked selects */
51731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 		break;
51741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case SOP_PU_RINGING:
51751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixjdebug & 0x0008)
51761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk(KERN_INFO "phone DAA: SOP_PU_RINGING at %ld\n", jiffies);
51771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */
51781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
51791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb_p(j->pld_scrw.byte, j->XILINXbase);
51801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pld_slicw.bits.rly2 = 0;
51811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
51821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		bytes.high = 0x50;
51831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
51841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		daa_load(&bytes, j);
51851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!SCI_Prepare(j))
51861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 0;
51871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->daa_mode = SOP_PU_RINGING;
51881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
51891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case SOP_PU_CONVERSATION:
51901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixjdebug & 0x0008)
51911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk(KERN_INFO "phone DAA: SOP_PU_CONVERSATION at %ld\n", jiffies);
51921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		bytes.high = 0x90;
51931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
51941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		daa_load(&bytes, j);
51951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!SCI_Prepare(j))
51961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 0;
51971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pld_slicw.bits.rly2 = 1;
51981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
51991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pld_scrw.bits.daafsyncen = 1;	/* Turn on DAA Frame Sync */
52001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
52011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb_p(j->pld_scrw.byte, j->XILINXbase);
52021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->daa_mode = SOP_PU_CONVERSATION;
52031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->flags.pstn_ringing = 0;
52041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->ex.bits.pstn_ring = 0;
52051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pstn_sleeptil = jiffies;
52061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pstn_ring_start = j->pstn_ring_stop = j->pstn_ring_int = 0;
52071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
52081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case SOP_PU_PULSEDIALING:
52091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixjdebug & 0x0008)
52101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk(KERN_INFO "phone DAA: SOP_PU_PULSEDIALING at %ld\n", jiffies);
52111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */
52121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
52131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb_p(j->pld_scrw.byte, j->XILINXbase);
52141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pld_slicw.bits.rly2 = 0;
52151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
52161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		bytes.high = 0xD0;
52171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
52181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		daa_load(&bytes, j);
52191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!SCI_Prepare(j))
52201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 0;
52211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->daa_mode = SOP_PU_PULSEDIALING;
52221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
52231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
52241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
52251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
52261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 1;
52271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
52281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
52291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_daa_write(IXJ *j)
52301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
52311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	BYTES bytes;
52321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
52331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->flags.pstncheck = 1;
52341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
52351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	daa_set_mode(j, SOP_PU_SLEEP);
52361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
52371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Prepare(j))
52381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
52391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
52401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	outb_p(j->pld_scrw.byte, j->XILINXbase);
52411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
52421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = 0x14;
52431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg;
52441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
52451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
52461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
52471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg;
52481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg;
52491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
52501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
52511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
52521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg;
52531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg;
52541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
52551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
52561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
52571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Prepare(j))
52581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
52591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
52601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = 0x1F;
52611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg;
52621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
52631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
52641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
52651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.XOP_xr6_W.reg;
52661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg;
52671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
52681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
52691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
52701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg;
52711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg;
52721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
52731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
52741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
52751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg;
52761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg;
52771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
52781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
52791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
52801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.XOP_xr0_W.reg;
52811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = 0x00;
52821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
52831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
52841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
52851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Prepare(j))
52861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
52871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
52881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = 0x00;
52891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7];
52901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
52911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
52921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
52931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6];
52941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5];
52951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
52961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
52971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
52981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4];
52991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3];
53001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
53011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
53021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
53031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2];
53041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1];
53051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
53061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
53071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
53081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0];
53091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = 0x00;
53101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
53111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
53121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
53131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Control(j, SCI_End))
53141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
53151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_WaitLowSCI(j))
53161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
53171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
53181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = 0x01;
53191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7];
53201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
53211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
53221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
53231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6];
53241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5];
53251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
53261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
53271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
53281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4];
53291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3];
53301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
53311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
53321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
53331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2];
53341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1];
53351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
53361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
53371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
53381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0];
53391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = 0x00;
53401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
53411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
53421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
53431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Control(j, SCI_End))
53441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
53451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_WaitLowSCI(j))
53461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
53471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
53481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = 0x02;
53491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7];
53501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
53511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
53521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
53531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6];
53541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5];
53551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
53561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
53571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
53581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4];
53591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3];
53601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
53611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
53621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
53631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2];
53641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1];
53651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
53661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
53671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
53681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0];
53691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = 0x00;
53701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
53711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
53721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
53731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Control(j, SCI_End))
53741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
53751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_WaitLowSCI(j))
53761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
53771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
53781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = 0x03;
53791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7];
53801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
53811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
53821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
53831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6];
53841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5];
53851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
53861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
53871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
53881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4];
53891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3];
53901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
53911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
53921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
53931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2];
53941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1];
53951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
53961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
53971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
53981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0];
53991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = 0x00;
54001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
54011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
54021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
54031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Control(j, SCI_End))
54041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
54051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_WaitLowSCI(j))
54061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
54071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
54081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = 0x04;
54091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7];
54101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
54111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
54121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
54131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6];
54141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5];
54151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
54161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
54171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
54181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4];
54191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3];
54201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
54211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
54221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
54231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2];
54241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1];
54251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
54261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
54271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
54281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0];
54291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = 0x00;
54301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
54311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
54321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
54331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Control(j, SCI_End))
54341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
54351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_WaitLowSCI(j))
54361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
54371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
54381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = 0x05;
54391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7];
54401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
54411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
54421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
54431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6];
54441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5];
54451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
54461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
54471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
54481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4];
54491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3];
54501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
54511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
54521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
54531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2];
54541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1];
54551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
54561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
54571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
54581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0];
54591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = 0x00;
54601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
54611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
54621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
54631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Control(j, SCI_End))
54641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
54651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_WaitLowSCI(j))
54661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
54671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
54681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = 0x06;
54691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7];
54701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
54711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
54721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
54731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6];
54741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5];
54751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
54761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
54771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
54781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4];
54791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3];
54801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
54811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
54821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
54831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2];
54841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1];
54851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
54861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
54871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
54881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0];
54891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = 0x00;
54901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
54911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
54921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
54931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Control(j, SCI_End))
54941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
54951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_WaitLowSCI(j))
54961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
54971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
54981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = 0x07;
54991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7];
55001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
55011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
55021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
55031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6];
55041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5];
55051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
55061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
55071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
55081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4];
55091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3];
55101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
55111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
55121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
55131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2];
55141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1];
55151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
55161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
55171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
55181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0];
55191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = 0x00;
55201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
55211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
55221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
55231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Control(j, SCI_End))
55241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
55251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_WaitLowSCI(j))
55261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
55271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
55281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = 0x08;
55291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7];
55301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
55311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
55321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
55331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6];
55341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5];
55351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
55361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
55371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
55381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4];
55391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3];
55401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
55411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
55421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
55431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2];
55441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1];
55451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
55461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
55471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
55481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0];
55491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = 0x00;
55501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
55511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
55521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
55531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Control(j, SCI_End))
55541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
55551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_WaitLowSCI(j))
55561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
55571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
55581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = 0x09;
55591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3];
55601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
55611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
55621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
55631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2];
55641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1];
55651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
55661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
55671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
55681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0];
55691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = 0x00;
55701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
55711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
55721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
55731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Control(j, SCI_End))
55741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
55751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_WaitLowSCI(j))
55761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
55771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
55781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = 0x0A;
55791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3];
55801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
55811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
55821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
55831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2];
55841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1];
55851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
55861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
55871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
55881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0];
55891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = 0x00;
55901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
55911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
55921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
55931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Control(j, SCI_End))
55941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
55951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_WaitLowSCI(j))
55961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
55971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
55981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = 0x0B;
55991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3];
56001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
56011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
56021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
56031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2];
56041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1];
56051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
56061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
56071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
56081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0];
56091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = 0x00;
56101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
56111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
56121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
56131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Control(j, SCI_End))
56141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
56151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_WaitLowSCI(j))
56161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
56171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
56181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = 0x0C;
56191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3];
56201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
56211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
56221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
56231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2];
56241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1];
56251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
56261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
56271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
56281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0];
56291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = 0x00;
56301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
56311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
56321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
56331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Control(j, SCI_End))
56341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
56351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_WaitLowSCI(j))
56361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
56371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
56381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = 0x0D;
56391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3];
56401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
56411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
56421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
56431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2];
56441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1];
56451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
56461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
56471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
56481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0];
56491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = 0x00;
56501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
56511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
56521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
56531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Control(j, SCI_End))
56541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
56551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_WaitLowSCI(j))
56561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
56571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
56581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = 0x0E;
56591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7];
56601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
56611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
56621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
56631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6];
56641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5];
56651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
56661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
56671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
56681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4];
56691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3];
56701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
56711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
56721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
56731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2];
56741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1];
56751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
56761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
56771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
56781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0];
56791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = 0x00;
56801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
56811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
56821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
56831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Control(j, SCI_End))
56841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
56851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_WaitLowSCI(j))
56861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
56871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
56881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = 0x0F;
56891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7];
56901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
56911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
56921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
56931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6];
56941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5];
56951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
56961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
56971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
56981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4];
56991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3];
57001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
57011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
57021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
57031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2];
57041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1];
57051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
57061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
57071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
57081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.high = j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0];
57091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	bytes.low = 0x00;
57101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!daa_load(&bytes, j))
57111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
57121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
57131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	udelay(32);
57141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->pld_scrr.byte = inb_p(j->XILINXbase);
57151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!SCI_Control(j, SCI_End))
57161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
57171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
57181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	outb_p(j->pld_scrw.byte, j->XILINXbase);
57191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
57201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixjdebug & 0x0002)
57211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk("DAA Coefficients Loaded\n");
57221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
57231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->flags.pstncheck = 0;
57241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 1;
57251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
57261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
5727bc940c40c6473cb40178458e2c74aea6b45aac03Matthew Martinstatic int ixj_set_tone_off(unsigned short arg, IXJ *j)
57281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
57291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->tone_off_time = arg;
57301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixj_WriteDSPCommand(0x6E05, j))		/* Set Tone Off Period */
57311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
57321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
57331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixj_WriteDSPCommand(arg, j))
57341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
57351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
57361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
57371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
57381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_get_tone_on(IXJ *j)
57391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
57401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixj_WriteDSPCommand(0x6E06, j))		/* Get Tone On Period */
57411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
57421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
57431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
57441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
57451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
57461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_get_tone_off(IXJ *j)
57471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
57481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixj_WriteDSPCommand(0x6E07, j))		/* Get Tone Off Period */
57491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
57501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
57511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
57521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
57531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
57541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_busytone(IXJ *j)
57551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
57561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->flags.ringback = 0;
57571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->flags.dialtone = 0;
57581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->flags.busytone = 1;
57591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_set_tone_on(0x07D0, j);
57601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_set_tone_off(0x07D0, j);
57611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_play_tone(j, 27);
57621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
57631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
57641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_dialtone(IXJ *j)
57651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
57661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->flags.ringback = 0;
57671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->flags.dialtone = 1;
57681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->flags.busytone = 0;
57691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->dsp.low == 0x20) {
57701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return;
57711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
57721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_set_tone_on(0xFFFF, j);
57731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_set_tone_off(0x0000, j);
57741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_play_tone(j, 25);
57751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
57761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
57771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
57781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_cpt_stop(IXJ *j)
57791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
57801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if(j->tone_state || j->tone_cadence_state)
57811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
57821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->flags.dialtone = 0;
57831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->flags.busytone = 0;
57841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->flags.ringback = 0;
57851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_set_tone_on(0x0001, j);
57861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_set_tone_off(0x0000, j);
57871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_play_tone(j, 0);
57881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->tone_state = j->tone_cadence_state = 0;
57891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->cadence_t) {
57900159f76d9f5839c3c92bc3a91c865e94d5e489a8Jesper Juhl			kfree(j->cadence_t->ce);
57911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			kfree(j->cadence_t);
57921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->cadence_t = NULL;
57931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
57941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
57951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->play_mode == -1 && j->rec_mode == -1)
57961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		idle(j);
57971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->play_mode != -1 && j->dsp.low == 0x20)
57981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_play_start(j);
57991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->rec_mode != -1 && j->dsp.low == 0x20)
58001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_record_start(j);
58011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
58021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
58031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_ringback(IXJ *j)
58041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
58051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->flags.busytone = 0;
58061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->flags.dialtone = 0;
58071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->flags.ringback = 1;
58081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_set_tone_on(0x0FA0, j);
58091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_set_tone_off(0x2EE0, j);
58101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_play_tone(j, 26);
58111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
58121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
58131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void ixj_testram(IXJ *j)
58141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
58151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_WriteDSPCommand(0x3001, j);	/* Test External SRAM */
58161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
58171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
58181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_build_cadence(IXJ *j, IXJ_CADENCE __user * cp)
58191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
58201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_cadence *lcp;
58211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IXJ_CADENCE_ELEMENT __user *cep;
58221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IXJ_CADENCE_ELEMENT *lcep;
58231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IXJ_TONE ti;
58241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int err;
58251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
58261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	lcp = kmalloc(sizeof(ixj_cadence), GFP_KERNEL);
58271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (lcp == NULL)
58281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -ENOMEM;
58291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
58301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	err = -EFAULT;
58311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (copy_from_user(&lcp->elements_used,
58321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			   &cp->elements_used, sizeof(int)))
58331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto out;
58341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (copy_from_user(&lcp->termination,
58351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			   &cp->termination, sizeof(IXJ_CADENCE_TERM)))
58361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto out;
58371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (get_user(cep, &cp->ce))
58381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto out;
58391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
58401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	err = -EINVAL;
58411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if ((unsigned)lcp->elements_used >= ~0U/sizeof(IXJ_CADENCE_ELEMENT))
58421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto out;
58431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
58441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	err = -ENOMEM;
58451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	lcep = kmalloc(sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used, GFP_KERNEL);
58461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!lcep)
58471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto out;
58481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
58491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	err = -EFAULT;
58501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (copy_from_user(lcep, cep, sizeof(IXJ_CADENCE_ELEMENT) * lcp->elements_used))
58511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		goto out1;
58521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
58531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->cadence_t) {
58541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		kfree(j->cadence_t->ce);
58551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		kfree(j->cadence_t);
58561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
58571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	lcp->ce = (void *) lcep;
58581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cadence_t = lcp;
58591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->tone_cadence_state = 0;
58601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_set_tone_on(lcp->ce[0].tone_on_time, j);
58611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_set_tone_off(lcp->ce[0].tone_off_time, j);
58621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->cadence_t->ce[j->tone_cadence_state].freq0) {
58631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ti.tone_index = j->cadence_t->ce[j->tone_cadence_state].index;
58641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ti.freq0 = j->cadence_t->ce[j->tone_cadence_state].freq0;
58651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ti.gain0 = j->cadence_t->ce[j->tone_cadence_state].gain0;
58661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ti.freq1 = j->cadence_t->ce[j->tone_cadence_state].freq1;
58671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ti.gain1 = j->cadence_t->ce[j->tone_cadence_state].gain1;
58681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_init_tone(j, &ti);
58691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
58701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_play_tone(j, lcp->ce[0].index);
58711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 1;
58721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsout1:
58731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	kfree(lcep);
58741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsout:
58751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	kfree(lcp);
58761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return err;
58771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
58781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
58791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_build_filter_cadence(IXJ *j, IXJ_FILTER_CADENCE __user * cp)
58801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
58811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IXJ_FILTER_CADENCE *lcp;
5882b8d6b0d6b6882a53e4586a07e1292223d55299d1Julia Lawall	lcp = memdup_user(cp, sizeof(IXJ_FILTER_CADENCE));
5883b8d6b0d6b6882a53e4586a07e1292223d55299d1Julia Lawall	if (IS_ERR(lcp)) {
58841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(ixjdebug & 0x0001) {
5885b8d6b0d6b6882a53e4586a07e1292223d55299d1Julia Lawall			printk(KERN_INFO "Could not allocate memory for cadence or could not copy cadence to kernel\n");
58861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
5887b8d6b0d6b6882a53e4586a07e1292223d55299d1Julia Lawall		return PTR_ERR(lcp);
58881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        }
58891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (lcp->filter > 5) {
58901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(ixjdebug & 0x0001) {
58911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk(KERN_INFO "Cadence out of range\n");
58921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
58931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		kfree(lcp);
58941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
58951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
58961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cadence_f[lcp->filter].state = 0;
58971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cadence_f[lcp->filter].enable = lcp->enable;
58981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->filter_en[lcp->filter] = j->cadence_f[lcp->filter].en_filter = lcp->en_filter;
58991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cadence_f[lcp->filter].on1 = lcp->on1;
59001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cadence_f[lcp->filter].on1min = 0;
59011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cadence_f[lcp->filter].on1max = 0;
59021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cadence_f[lcp->filter].off1 = lcp->off1;
59031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cadence_f[lcp->filter].off1min = 0;
59041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cadence_f[lcp->filter].off1max = 0;
59051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cadence_f[lcp->filter].on2 = lcp->on2;
59061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cadence_f[lcp->filter].on2min = 0;
59071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cadence_f[lcp->filter].on2max = 0;
59081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cadence_f[lcp->filter].off2 = lcp->off2;
59091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cadence_f[lcp->filter].off2min = 0;
59101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cadence_f[lcp->filter].off2max = 0;
59111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cadence_f[lcp->filter].on3 = lcp->on3;
59121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cadence_f[lcp->filter].on3min = 0;
59131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cadence_f[lcp->filter].on3max = 0;
59141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cadence_f[lcp->filter].off3 = lcp->off3;
59151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cadence_f[lcp->filter].off3min = 0;
59161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cadence_f[lcp->filter].off3max = 0;
59171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if(ixjdebug & 0x0002) {
59181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk(KERN_INFO "Cadence %d loaded\n", lcp->filter);
59191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
59201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	kfree(lcp);
59211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
59221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
59231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
59241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void add_caps(IXJ *j)
59251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
59261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->caps = 0;
59271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->caplist[j->caps].cap = PHONE_VENDOR_QUICKNET;
59281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	strcpy(j->caplist[j->caps].desc, "Quicknet Technologies, Inc. (www.quicknet.net)");
59291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->caplist[j->caps].captype = vendor;
5930953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König	j->caplist[j->caps].handle = j->caps;
5931953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König	j->caps++;
59321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->caplist[j->caps].captype = device;
59331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (j->cardtype) {
59341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case QTI_PHONEJACK:
59351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK");
59361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
59371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case QTI_LINEJACK:
59381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		strcpy(j->caplist[j->caps].desc, "Quicknet Internet LineJACK");
59391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
59401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case QTI_PHONEJACK_LITE:
59411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK Lite");
59421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
59431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case QTI_PHONEJACK_PCI:
59441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneJACK PCI");
59451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
59461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case QTI_PHONECARD:
59471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		strcpy(j->caplist[j->caps].desc, "Quicknet Internet PhoneCARD");
59481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
59491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
59501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->caplist[j->caps].cap = j->cardtype;
5951953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König	j->caplist[j->caps].handle = j->caps;
5952953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König	j->caps++;
59531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	strcpy(j->caplist[j->caps].desc, "POTS");
59541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->caplist[j->caps].captype = port;
59551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->caplist[j->caps].cap = pots;
5956953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König	j->caplist[j->caps].handle = j->caps;
5957953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König	j->caps++;
59581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
59591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 	/* add devices that can do speaker/mic */
59601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (j->cardtype) {
59611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case QTI_PHONEJACK:
59621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case QTI_LINEJACK:
59631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case QTI_PHONEJACK_PCI:
59641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case QTI_PHONECARD:
59651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		strcpy(j->caplist[j->caps].desc, "SPEAKER");
59661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->caplist[j->caps].captype = port;
59671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->caplist[j->caps].cap = speaker;
5968953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König		j->caplist[j->caps].handle = j->caps;
5969953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König		j->caps++;
59701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        default:
59711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds     		break;
59721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
59731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
59741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 	/* add devices that can do handset */
59751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (j->cardtype) {
59761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case QTI_PHONEJACK:
59771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		strcpy(j->caplist[j->caps].desc, "HANDSET");
59781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->caplist[j->caps].captype = port;
59791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->caplist[j->caps].cap = handset;
5980953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König		j->caplist[j->caps].handle = j->caps;
5981953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König		j->caps++;
59821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
59831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        default:
59841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds     		break;
59851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
59861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
59871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 	/* add devices that can do PSTN */
59881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (j->cardtype) {
59891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case QTI_LINEJACK:
59901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		strcpy(j->caplist[j->caps].desc, "PSTN");
59911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->caplist[j->caps].captype = port;
59921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->caplist[j->caps].cap = pstn;
5993953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König		j->caplist[j->caps].handle = j->caps;
5994953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König		j->caps++;
59951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
59961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        default:
59971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds     		break;
59981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
59991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
60001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* add codecs - all cards can do uLaw, linear 8/16, and Windows sound system */
60011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	strcpy(j->caplist[j->caps].desc, "ULAW");
60021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->caplist[j->caps].captype = codec;
60031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->caplist[j->caps].cap = ULAW;
6004953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König	j->caplist[j->caps].handle = j->caps;
6005953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König	j->caps++;
60061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
60071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	strcpy(j->caplist[j->caps].desc, "LINEAR 16 bit");
60081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->caplist[j->caps].captype = codec;
60091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->caplist[j->caps].cap = LINEAR16;
6010953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König	j->caplist[j->caps].handle = j->caps;
6011953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König	j->caps++;
60121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
60131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	strcpy(j->caplist[j->caps].desc, "LINEAR 8 bit");
60141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->caplist[j->caps].captype = codec;
60151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->caplist[j->caps].cap = LINEAR8;
6016953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König	j->caplist[j->caps].handle = j->caps;
6017953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König	j->caps++;
60181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
60191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	strcpy(j->caplist[j->caps].desc, "Windows Sound System");
60201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->caplist[j->caps].captype = codec;
60211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->caplist[j->caps].cap = WSS;
6022953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König	j->caplist[j->caps].handle = j->caps;
6023953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König	j->caps++;
60241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
60251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* software ALAW codec, made from ULAW */
60261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	strcpy(j->caplist[j->caps].desc, "ALAW");
60271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->caplist[j->caps].captype = codec;
60281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->caplist[j->caps].cap = ALAW;
6029953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König	j->caplist[j->caps].handle = j->caps;
6030953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König	j->caps++;
60311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
60321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* version 12 of the 8020 does the following codecs in a broken way */
60331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->dsp.low != 0x20 || j->ver.low != 0x12) {
60341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		strcpy(j->caplist[j->caps].desc, "G.723.1 6.3kbps");
60351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->caplist[j->caps].captype = codec;
60361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->caplist[j->caps].cap = G723_63;
6037953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König		j->caplist[j->caps].handle = j->caps;
6038953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König		j->caps++;
60391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
60401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		strcpy(j->caplist[j->caps].desc, "G.723.1 5.3kbps");
60411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->caplist[j->caps].captype = codec;
60421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->caplist[j->caps].cap = G723_53;
6043953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König		j->caplist[j->caps].handle = j->caps;
6044953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König		j->caps++;
60451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
60461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.8kbps");
60471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->caplist[j->caps].captype = codec;
60481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->caplist[j->caps].cap = TS48;
6049953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König		j->caplist[j->caps].handle = j->caps;
6050953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König		j->caps++;
60511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
60521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		strcpy(j->caplist[j->caps].desc, "TrueSpeech 4.1kbps");
60531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->caplist[j->caps].captype = codec;
60541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->caplist[j->caps].cap = TS41;
6055953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König		j->caplist[j->caps].handle = j->caps;
6056953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König		j->caps++;
60571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
60581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
60591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* 8020 chips can do TS8.5 native, and 8021/8022 can load it */
60601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->dsp.low == 0x20 || j->flags.ts85_loaded) {
60611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		strcpy(j->caplist[j->caps].desc, "TrueSpeech 8.5kbps");
60621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->caplist[j->caps].captype = codec;
60631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->caplist[j->caps].cap = TS85;
6064953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König		j->caplist[j->caps].handle = j->caps;
6065953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König		j->caps++;
60661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
60671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
60681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* 8021 chips can do G728 */
60691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->dsp.low == 0x21) {
60701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		strcpy(j->caplist[j->caps].desc, "G.728 16kbps");
60711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->caplist[j->caps].captype = codec;
60721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->caplist[j->caps].cap = G728;
6073953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König		j->caplist[j->caps].handle = j->caps;
6074953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König		j->caps++;
60751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
60761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
60771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* 8021/8022 chips can do G729 if loaded */
60781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->dsp.low != 0x20 && j->flags.g729_loaded) {
60791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		strcpy(j->caplist[j->caps].desc, "G.729A 8kbps");
60801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->caplist[j->caps].captype = codec;
60811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->caplist[j->caps].cap = G729;
6082953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König		j->caplist[j->caps].handle = j->caps;
6083953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König		j->caps++;
60841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
60851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->dsp.low != 0x20 && j->flags.g729_loaded) {
60861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		strcpy(j->caplist[j->caps].desc, "G.729B 8kbps");
60871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->caplist[j->caps].captype = codec;
60881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->caplist[j->caps].cap = G729B;
6089953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König		j->caplist[j->caps].handle = j->caps;
6090953326cb60c1dff1bd3458d6468d16d75f2bcd61Uwe Kleine-König		j->caps++;
60911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
60921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
60931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
60941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int capabilities_check(IXJ *j, struct phone_capability *pcreq)
60951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
60961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int cnt;
60971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int retval = 0;
60981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (cnt = 0; cnt < j->caps; cnt++) {
60991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (pcreq->captype == j->caplist[cnt].captype
61001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		    && pcreq->cap == j->caplist[cnt].cap) {
61011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = 1;
61021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
61031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
61041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
61051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return retval;
61061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
61071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6108e05e9f7c4aeb82eaa23e46b29580ff514590c641Alan Coxstatic long do_ixj_ioctl(struct file *file_p, unsigned int cmd, unsigned long arg)
61091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
61101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IXJ_TONE ti;
61111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IXJ_FILTER jf;
61121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IXJ_FILTER_RAW jfr;
61131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	void __user *argp = (void __user *)arg;
6114e05e9f7c4aeb82eaa23e46b29580ff514590c641Alan Cox	struct inode *inode = file_p->f_path.dentry->d_inode;
61151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int minor = iminor(inode);
6116e05e9f7c4aeb82eaa23e46b29580ff514590c641Alan Cox	unsigned int raise, mant;
61171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int board = NUM(inode);
61181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
61191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IXJ *j = get_ixj(NUM(inode));
61201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
61211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int retval = 0;
61221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
61231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*
61241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 *    Set up locks to ensure that only one process is talking to the DSP at a time.
61251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 *    This is necessary to keep the DSP from locking up.
61261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
61271e63bc7342c40f0f1dd83d80d368665bd06f4963Nishanth Aravamudan	while(test_and_set_bit(board, (void *)&j->busyflags) != 0)
61281e63bc7342c40f0f1dd83d80d368665bd06f4963Nishanth Aravamudan		schedule_timeout_interruptible(1);
61291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixjdebug & 0x0040)
61301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk("phone%d ioctl, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
61311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (minor >= IXJMAX) {
61321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		clear_bit(board, &j->busyflags);
61331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -ENODEV;
61341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
61351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*
61361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 *    Check ioctls only root can use.
61371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	 */
61381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!capable(CAP_SYS_ADMIN)) {
61391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (cmd) {
61401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case IXJCTL_TESTRAM:
61411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case IXJCTL_HZ:
61421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = -EPERM;
61431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
61441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
61451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (cmd) {
61461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_TESTRAM:
61471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_testram(j);
61481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		retval = (j->ssr.high << 8) + j->ssr.low;
61491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
61501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_CARDTYPE:
61511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		retval = j->cardtype;
61521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
61531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_SERIAL:
61541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		retval = j->serial;
61551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
61561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_VERSION:
6157fba478b1719c39ea67f15c6158ff4993933e9d18Domen Puncer		{
6158fba478b1719c39ea67f15c6158ff4993933e9d18Domen Puncer			char arg_str[100];
6159fba478b1719c39ea67f15c6158ff4993933e9d18Domen Puncer			snprintf(arg_str, sizeof(arg_str),
6160fba478b1719c39ea67f15c6158ff4993933e9d18Domen Puncer				"\nDriver version %i.%i.%i", IXJ_VER_MAJOR,
6161fba478b1719c39ea67f15c6158ff4993933e9d18Domen Puncer				IXJ_VER_MINOR, IXJ_BLD_VER);
6162fba478b1719c39ea67f15c6158ff4993933e9d18Domen Puncer			if (copy_to_user(argp, arg_str, strlen(arg_str)))
6163fba478b1719c39ea67f15c6158ff4993933e9d18Domen Puncer				retval = -EFAULT;
6164fba478b1719c39ea67f15c6158ff4993933e9d18Domen Puncer		}
61651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
61661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_RING_CADENCE:
61671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->ring_cadence = arg;
61681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
61691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_CIDCW:
61701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(arg) {
61711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (copy_from_user(&j->cid_send, argp, sizeof(PHONE_CID))) {
61721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				retval = -EFAULT;
61731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
61741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
61751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
61761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			memset(&j->cid_send, 0, sizeof(PHONE_CID));
61771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
61781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_write_cidcw(j);
61791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
61801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        /* Binary compatbility */
61811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        case OLD_PHONE_RING_START:
61821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                arg = 0;
61831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                /* Fall through */
61841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 	case PHONE_RING_START:
61851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(arg) {
61861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (copy_from_user(&j->cid_send, argp, sizeof(PHONE_CID))) {
61871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				retval = -EFAULT;
61881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
61891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
61901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_write_cid(j);
61911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
61921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			memset(&j->cid_send, 0, sizeof(PHONE_CID));
61931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
61941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_ring_start(j);
61951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
61961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_RING_STOP:
61971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->flags.cringing = 0;
61981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(j->cadence_f[5].enable) {
61991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->cadence_f[5].state = 0;
62001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
62011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_ring_off(j);
62021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
62031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_RING:
62041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		retval = ixj_ring(j);
62051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
62061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_EXCEPTION:
62071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		retval = j->ex.bytes;
62081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(j->ex.bits.flash) {
62091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->flash_end = 0;
62101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->ex.bits.flash = 0;
62111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
62121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->ex.bits.pstn_ring = 0;
62131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->ex.bits.caller_id = 0;
62141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->ex.bits.pstn_wink = 0;
62151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->ex.bits.f0 = 0;
62161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->ex.bits.f1 = 0;
62171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->ex.bits.f2 = 0;
62181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->ex.bits.f3 = 0;
62191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->ex.bits.fc0 = 0;
62201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->ex.bits.fc1 = 0;
62211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->ex.bits.fc2 = 0;
62221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->ex.bits.fc3 = 0;
62231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->ex.bits.reserved = 0;
62241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
62251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_HOOKSTATE:
62261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->ex.bits.hookstate = 0;
62271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		retval = j->hookstate;  //j->r_hook;
62281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
62291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_SET_LED:
62301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		LED_SetState(arg, j);
62311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
62321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_FRAME:
62331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		retval = set_base_frame(j, arg);
62341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
62351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_REC_CODEC:
62361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		retval = set_rec_codec(j, arg);
62371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
62381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_VAD:
62391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_vad(j, arg);
62401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
62411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_REC_START:
62421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_record_start(j);
62431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
62441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_REC_STOP:
62451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_record_stop(j);
62461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
62471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_REC_DEPTH:
62481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		set_rec_depth(j, arg);
62491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
62501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_REC_VOLUME:
62511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(arg == -1) {
62521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = get_rec_volume(j);
62531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
62541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		else {
62551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			set_rec_volume(j, arg);
62561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = arg;
62571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
62581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
62591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_REC_VOLUME_LINEAR:
62601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(arg == -1) {
62611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = get_rec_volume_linear(j);
62621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
62631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		else {
62641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			set_rec_volume_linear(j, arg);
62651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = arg;
62661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
62671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
62681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_DTMF_PRESCALE:
62691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(arg == -1) {
62701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = get_dtmf_prescale(j);
62711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
62721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		else {
62731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			set_dtmf_prescale(j, arg);
62741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = arg;
62751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
62761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
62771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_REC_LEVEL:
62781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		retval = get_rec_level(j);
62791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
62801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_SC_RXG:
62811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		retval = ixj_siadc(j, arg);
62821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
62831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_SC_TXG:
62841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		retval = ixj_sidac(j, arg);
62851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
62861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_AEC_START:
62871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_aec_start(j, arg);
62881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
62891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_AEC_STOP:
62901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		aec_stop(j);
62911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
62921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_AEC_GET_LEVEL:
62931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		retval = j->aec_level;
62941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
62951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_PLAY_CODEC:
62961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		retval = set_play_codec(j, arg);
62971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
62981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_PLAY_START:
62991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		retval = ixj_play_start(j);
63001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
63011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_PLAY_STOP:
63021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_play_stop(j);
63031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
63041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_PLAY_DEPTH:
63051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		set_play_depth(j, arg);
63061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
63071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_PLAY_VOLUME:
63081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(arg == -1) {
63091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = get_play_volume(j);
63101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
63111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		else {
63121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			set_play_volume(j, arg);
63131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = arg;
63141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
63151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
63161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_PLAY_VOLUME_LINEAR:
63171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(arg == -1) {
63181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = get_play_volume_linear(j);
63191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
63201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		else {
63211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			set_play_volume_linear(j, arg);
63221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = arg;
63231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
63241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
63251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_PLAY_LEVEL:
63261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		retval = get_play_level(j);
63271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
63281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_DSP_TYPE:
63291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		retval = (j->dsp.high << 8) + j->dsp.low;
63301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
63311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_DSP_VERSION:
63321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		retval = (j->ver.high << 8) + j->ver.low;
63331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
63341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_HZ:
63351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		hertz = arg;
63361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
63371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_RATE:
63381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (arg > hertz)
63391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = -1;
63401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		else
63411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			samplerate = arg;
63421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
63431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_DRYBUFFER_READ:
63441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		put_user(j->drybuffer, (unsigned long __user *) argp);
63451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
63461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_DRYBUFFER_CLEAR:
63471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->drybuffer = 0;
63481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
63491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_FRAMES_READ:
63501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		put_user(j->framesread, (unsigned long __user *) argp);
63511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
63521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_FRAMES_WRITTEN:
63531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		put_user(j->frameswritten, (unsigned long __user *) argp);
63541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
63551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_READ_WAIT:
63561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		put_user(j->read_wait, (unsigned long __user *) argp);
63571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
63581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_WRITE_WAIT:
63591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		put_user(j->write_wait, (unsigned long __user *) argp);
63601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
63611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_MAXRINGS:
63621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->maxrings = arg;
63631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
63641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_SET_TONE_ON_TIME:
63651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_set_tone_on(arg, j);
63661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
63671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_SET_TONE_OFF_TIME:
63681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_set_tone_off(arg, j);
63691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
63701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_GET_TONE_ON_TIME:
63711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixj_get_tone_on(j)) {
63721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = -1;
63731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
63741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = (j->ssr.high << 8) + j->ssr.low;
63751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
63761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
63771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_GET_TONE_OFF_TIME:
63781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixj_get_tone_off(j)) {
63791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = -1;
63801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
63811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = (j->ssr.high << 8) + j->ssr.low;
63821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
63831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
63841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_PLAY_TONE:
63851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!j->tone_state)
63861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = ixj_play_tone(j, arg);
63871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		else
63881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = -1;
63891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
63901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_GET_TONE_STATE:
63911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		retval = j->tone_state;
63921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
63931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_DTMF_READY:
63941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		retval = j->ex.bits.dtmf_ready;
63951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
63961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_GET_DTMF:
63971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixj_hookstate(j)) {
63981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (j->dtmf_rp != j->dtmf_wp) {
63991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				retval = j->dtmfbuffer[j->dtmf_rp];
64001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->dtmf_rp++;
64011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (j->dtmf_rp == 79)
64021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->dtmf_rp = 0;
64031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (j->dtmf_rp == j->dtmf_wp) {
64041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
64051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
64061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
64071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
64081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
64091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_GET_DTMF_ASCII:
64101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixj_hookstate(j)) {
64111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (j->dtmf_rp != j->dtmf_wp) {
64121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				switch (j->dtmfbuffer[j->dtmf_rp]) {
64131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				case 10:
64141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					retval = 42;	/* '*'; */
64151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
64161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					break;
64171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				case 11:
64181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					retval = 48;	/*'0'; */
64191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
64201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					break;
64211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				case 12:
64221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					retval = 35;	/*'#'; */
64231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
64241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					break;
64251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				case 28:
64261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					retval = 65;	/*'A'; */
64271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
64281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					break;
64291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				case 29:
64301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					retval = 66;	/*'B'; */
64311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
64321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					break;
64331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				case 30:
64341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					retval = 67;	/*'C'; */
64351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
64361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					break;
64371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				case 31:
64381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					retval = 68;	/*'D'; */
64391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
64401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					break;
64411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				default:
64421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					retval = 48 + j->dtmfbuffer[j->dtmf_rp];
64431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					break;
64441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
64451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->dtmf_rp++;
64461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (j->dtmf_rp == 79)
64471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->dtmf_rp = 0;
64481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if(j->dtmf_rp == j->dtmf_wp)
64491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				{
64501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					j->ex.bits.dtmf_ready = j->dtmf_rp = j->dtmf_wp = 0;
64511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
64521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
64531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
64541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
64551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_DTMF_OOB:
64561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->flags.dtmf_oob = arg;
64571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
64581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_DIALTONE:
64591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_dialtone(j);
64601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
64611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_BUSY:
64621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_busytone(j);
64631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
64641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_RINGBACK:
64651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_ringback(j);
64661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
64671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_WINK:
64681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(j->cardtype == QTI_PHONEJACK)
64691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = -1;
64701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		else
64711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = ixj_wink(j);
64721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
64731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_CPT_STOP:
64741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_cpt_stop(j);
64751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
64761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        case PHONE_QUERY_CODEC:
64771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        {
64781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                struct phone_codec_data pd;
64791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                int val;
64801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                int proto_size[] = {
64811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                        -1,
64821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                        12, 10, 16, 9, 8, 48, 5,
64831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                        40, 40, 80, 40, 40, 6
64841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                };
64851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                if(copy_from_user(&pd, argp, sizeof(pd))) {
64861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                        retval = -EFAULT;
64871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
64881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
64891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                if(pd.type<1 || pd.type>13) {
64901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                        retval = -EPROTONOSUPPORT;
64911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
64921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
64931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                if(pd.type<G729)
64941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                        val=proto_size[pd.type];
64951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                else switch(j->baseframe.low)
64961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                {
64971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                        case 0xA0:val=2*proto_size[pd.type];break;
64981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                        case 0x50:val=proto_size[pd.type];break;
64991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                        default:val=proto_size[pd.type]*3;break;
65001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                }
65011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                pd.buf_min=pd.buf_max=pd.buf_opt=val;
65021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                if(copy_to_user(argp, &pd, sizeof(pd)))
65031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                        retval = -EFAULT;
65041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        	break;
65051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        }
65061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_DSP_IDLE:
65071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		idle(j);
65081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
65091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_MIXER:
65101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                if ((arg & 0xff) == 0xff)
65111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = ixj_get_mixer(arg, j);
65121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                else
65131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(arg, j);
65141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
65151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_DAA_COEFF_SET:
65161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (arg) {
65171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case DAA_US:
65181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			DAA_Coeff_US(j);
65191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = ixj_daa_write(j);
65201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
65211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case DAA_UK:
65221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			DAA_Coeff_UK(j);
65231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = ixj_daa_write(j);
65241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
65251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case DAA_FRANCE:
65261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			DAA_Coeff_France(j);
65271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = ixj_daa_write(j);
65281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
65291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case DAA_GERMANY:
65301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			DAA_Coeff_Germany(j);
65311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = ixj_daa_write(j);
65321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
65331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case DAA_AUSTRALIA:
65341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			DAA_Coeff_Australia(j);
65351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = ixj_daa_write(j);
65361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
65371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case DAA_JAPAN:
65381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			DAA_Coeff_Japan(j);
65391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = ixj_daa_write(j);
65401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
65411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		default:
65421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = 1;
65431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
65441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
65451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
65461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_DAA_AGAIN:
65471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_daa_cr4(j, arg | 0x02);
65481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
65491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_PSTN_LINETEST:
65501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		retval = ixj_linetest(j);
65511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
65521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_VMWI:
65531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_write_vmwi(j, arg);
65541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
65551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_CID:
65561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (copy_to_user(argp, &j->cid, sizeof(PHONE_CID)))
65571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = -EFAULT;
65581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->ex.bits.caller_id = 0;
65591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
65601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_WINK_DURATION:
65611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->winktime = arg;
65621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
65631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_PORT:
65641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (arg)
65651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = ixj_set_port(j, arg);
65661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		else
65671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = j->port;
65681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
65691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_POTS_PSTN:
65701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		retval = ixj_set_pots(j, arg);
65711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
65721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_CAPABILITIES:
65731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		add_caps(j);
65741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		retval = j->caps;
65751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
65761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_CAPABILITIES_LIST:
65771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		add_caps(j);
65781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (copy_to_user(argp, j->caplist, sizeof(struct phone_capability) * j->caps))
65791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = -EFAULT;
65801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
65811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_CAPABILITIES_CHECK:
65821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		{
65831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			struct phone_capability cap;
65841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (copy_from_user(&cap, argp, sizeof(cap)))
65851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				retval = -EFAULT;
65861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			else {
65871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				add_caps(j);
65881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				retval = capabilities_check(j, &cap);
65891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
65901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
65911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
65921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_PSTN_SET_STATE:
65931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		daa_set_mode(j, arg);
65941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
65951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case PHONE_PSTN_GET_STATE:
65961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		retval = j->daa_mode;
65971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->ex.bits.pstn_ring = 0;
65981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
65991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_SET_FILTER:
66001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (copy_from_user(&jf, argp, sizeof(jf)))
66011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = -EFAULT;
6602b0438a1b71955c425c304a2a483765ef24841766Nicolas Kaiser		else
6603b0438a1b71955c425c304a2a483765ef24841766Nicolas Kaiser			retval = ixj_init_filter(j, &jf);
66041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
66051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_SET_FILTER_RAW:
66061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (copy_from_user(&jfr, argp, sizeof(jfr)))
66071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = -EFAULT;
66081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		else
66091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = ixj_init_filter_raw(j, &jfr);
66101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
66111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_GET_FILTER_HIST:
66121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(arg<0||arg>3)
66131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = -EINVAL;
66141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		else
66151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = j->filter_hist[arg];
66161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
66171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_INIT_TONE:
66181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (copy_from_user(&ti, argp, sizeof(ti)))
66191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = -EFAULT;
66201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		else
66211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = ixj_init_tone(j, &ti);
66221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
66231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_TONE_CADENCE:
66241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		retval = ixj_build_cadence(j, argp);
66251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
66261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_FILTER_CADENCE:
66271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		retval = ixj_build_filter_cadence(j, argp);
66281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
66291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_SIGCTL:
66301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (copy_from_user(&j->sigdef, argp, sizeof(IXJ_SIGDEF))) {
66311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			retval = -EFAULT;
66321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
66331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
66341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->ixj_signals[j->sigdef.event] = j->sigdef.signal;
66351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(j->sigdef.event < 33) {
66361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			raise = 1;
66371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			for(mant = 0; mant < j->sigdef.event; mant++){
66381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				raise *= 2;
66391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
66401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if(j->sigdef.signal)
66411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->ex_sig.bytes |= raise;
66421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			else
66431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->ex_sig.bytes &= (raise^0xffff);
66441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
66451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
66461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_INTERCOM_STOP:
66471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(arg < 0 || arg >= IXJMAX)
66481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -EINVAL;
66491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->intercom = -1;
66501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_record_stop(j);
66511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_play_stop(j);
66521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		idle(j);
66531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		get_ixj(arg)->intercom = -1;
66541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_record_stop(get_ixj(arg));
66551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_play_stop(get_ixj(arg));
66561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		idle(get_ixj(arg));
66571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
66581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case IXJCTL_INTERCOM_START:
66591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(arg < 0 || arg >= IXJMAX)
66601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -EINVAL;
66611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->intercom = arg;
66621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_record_start(j);
66631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_play_start(j);
66641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		get_ixj(arg)->intercom = board;
66651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_play_start(get_ixj(arg));
66661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_record_start(get_ixj(arg));
66671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		break;
66681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
66691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixjdebug & 0x0040)
66701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk("phone%d ioctl end, cmd: 0x%x, arg: 0x%lx\n", minor, cmd, arg);
66711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	clear_bit(board, &j->busyflags);
66721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return retval;
66731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
66741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
6675e05e9f7c4aeb82eaa23e46b29580ff514590c641Alan Coxstatic long ixj_ioctl(struct file *file_p, unsigned int cmd, unsigned long arg)
6676e05e9f7c4aeb82eaa23e46b29580ff514590c641Alan Cox{
6677e05e9f7c4aeb82eaa23e46b29580ff514590c641Alan Cox	long ret;
6678613655fa39ff6957754fa8ceb8559980920eb8eeArnd Bergmann	mutex_lock(&ixj_mutex);
6679e05e9f7c4aeb82eaa23e46b29580ff514590c641Alan Cox	ret = do_ixj_ioctl(file_p, cmd, arg);
6680613655fa39ff6957754fa8ceb8559980920eb8eeArnd Bergmann	mutex_unlock(&ixj_mutex);
6681e05e9f7c4aeb82eaa23e46b29580ff514590c641Alan Cox	return ret;
6682e05e9f7c4aeb82eaa23e46b29580ff514590c641Alan Cox}
6683e05e9f7c4aeb82eaa23e46b29580ff514590c641Alan Cox
66841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_fasync(int fd, struct file *file_p, int mode)
66851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
6686d1f229744ece0b7aa7ce89ecd1fb598b90305d5bJosef Sipek	IXJ *j = get_ixj(NUM(file_p->f_path.dentry->d_inode));
66871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
66881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return fasync_helper(fd, file_p, mode, &j->async_queue);
66891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
66901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
669100977a59b951207d38380c75f03a36829950265cArjan van de Venstatic const struct file_operations ixj_fops =
66921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
66931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        .owner          = THIS_MODULE,
66941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        .read           = ixj_enhanced_read,
66951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        .write          = ixj_enhanced_write,
66961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        .poll           = ixj_poll,
6697e05e9f7c4aeb82eaa23e46b29580ff514590c641Alan Cox        .unlocked_ioctl = ixj_ioctl,
66981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        .release        = ixj_release,
66996038f373a3dc1f1c26496e60b6c40b164716f07eArnd Bergmann        .fasync         = ixj_fasync,
67006038f373a3dc1f1c26496e60b6c40b164716f07eArnd Bergmann        .llseek	 = default_llseek,
67011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
67021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
67031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_linetest(IXJ *j)
67041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
67051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->flags.pstncheck = 1;	/* Testing */
67061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->flags.pstn_present = 0; /* Assume the line is not there */
67071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
67081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	daa_int_read(j);	/*Clear DAA Interrupt flags */
67091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* */
67101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Hold all relays in the normally de-energized position. */
67111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* */
67121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
67131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->pld_slicw.bits.rly1 = 0;
67141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->pld_slicw.bits.rly2 = 0;
67151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->pld_slicw.bits.rly3 = 0;
67161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
67171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */
67181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
67191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	outb_p(j->pld_scrw.byte, j->XILINXbase);
67201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->pld_slicr.byte = inb_p(j->XILINXbase + 0x01);
67211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->pld_slicr.bits.potspstn) {
67221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->flags.pots_pstn = 1;
67231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->flags.pots_correct = 0;
67241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		LED_SetState(0x4, j);
67251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
67261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->flags.pots_pstn = 0;
67271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pld_slicw.bits.rly1 = 0;
67281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pld_slicw.bits.rly2 = 0;
67291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pld_slicw.bits.rly3 = 1;
67301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
67311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */
67321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
67331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		outb_p(j->pld_scrw.byte, j->XILINXbase);
67341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		daa_set_mode(j, SOP_PU_CONVERSATION);
6735f4c9925ccc185da68c2d42230711d017f222e420Nishanth Aravamudan		msleep(1000);
67361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		daa_int_read(j);
67371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		daa_set_mode(j, SOP_PU_RESET);
67381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
67391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->flags.pots_correct = 0;	/* Should not be line voltage on POTS port. */
67401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			LED_SetState(0x4, j);
67411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.rly3 = 0;
67421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
67431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
67441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->flags.pots_correct = 1;
67451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			LED_SetState(0x8, j);
67461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.rly1 = 1;
67471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.rly2 = 0;
67481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.bits.rly3 = 0;
67491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
67501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
67511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
67521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->pld_slicw.bits.rly3 = 0;
67531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
67541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	daa_set_mode(j, SOP_PU_CONVERSATION);
6755f4c9925ccc185da68c2d42230711d017f222e420Nishanth Aravamudan	msleep(1000);
67561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	daa_int_read(j);
67571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	daa_set_mode(j, SOP_PU_RESET);
67581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK) {
67591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->pstn_sleeptil = jiffies + (hertz / 4);
67601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->flags.pstn_present = 1;
67611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
67621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->flags.pstn_present = 0;
67631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
67641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->flags.pstn_present) {
67651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->flags.pots_correct) {
67661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			LED_SetState(0xA, j);
67671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
67681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			LED_SetState(0x6, j);
67691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
67701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
67711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->flags.pots_correct) {
67721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			LED_SetState(0x9, j);
67731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
67741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			LED_SetState(0x5, j);
67751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
67761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
67771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->flags.pstncheck = 0;	/* Testing */
67781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return j->flags.pstn_present;
67791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
67801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
67811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_selfprobe(IXJ *j)
67821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
67831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned short cmd;
67841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int cnt;
67851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	BYTES bytes;
67861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
67871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        init_waitqueue_head(&j->poll_q);
67881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        init_waitqueue_head(&j->read_q);
67891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        init_waitqueue_head(&j->write_q);
67901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
67911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while(atomic_read(&j->DSPWrite) > 0)
67921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		atomic_dec(&j->DSPWrite);
67931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixjdebug & 0x0002)
67941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk(KERN_INFO "Write IDLE to Software Control Register\n");
67951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_WriteDSPCommand(0x0FE0, j);	/* Put the DSP in full power mode. */
67961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
67971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixj_WriteDSPCommand(0x0000, j))		/* Write IDLE to Software Control Register */
67981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
67991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* The read values of the SSR should be 0x00 for the IDLE command */
68001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->ssr.low || j->ssr.high)
68011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
68021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixjdebug & 0x0002)
68031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk(KERN_INFO "Get Device ID Code\n");
68041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixj_WriteDSPCommand(0x3400, j))		/* Get Device ID Code */
68051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
68061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->dsp.low = j->ssr.low;
68071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->dsp.high = j->ssr.high;
68081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixjdebug & 0x0002)
68091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk(KERN_INFO "Get Device Version Code\n");
68101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixj_WriteDSPCommand(0x3800, j))		/* Get Device Version Code */
68111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
68121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->ver.low = j->ssr.low;
68131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->ver.high = j->ssr.high;
68141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!j->cardtype) {
68151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->dsp.low == 0x21) {
68161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			bytes.high = bytes.low = inb_p(j->XILINXbase + 0x02);
68171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb_p(bytes.low ^ 0xFF, j->XILINXbase + 0x02);
68181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Test for Internet LineJACK or Internet PhoneJACK Lite */
68191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			bytes.low = inb_p(j->XILINXbase + 0x02);
68201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (bytes.low == bytes.high)	/*  Register is read only on */
68211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				/*  Internet PhoneJack Lite */
68221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			 {
68231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->cardtype = QTI_PHONEJACK_LITE;
68241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (!request_region(j->XILINXbase, 4, "ixj control")) {
68251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
68261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					return -1;
68271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
68281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->pld_slicw.pcib.e1 = 1;
68291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				outb_p(j->pld_slicw.byte, j->XILINXbase);
68301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			} else {
68311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->cardtype = QTI_LINEJACK;
68321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
68331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (!request_region(j->XILINXbase, 8, "ixj control")) {
68341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
68351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					return -1;
68361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
68371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
68381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else if (j->dsp.low == 0x22) {
68391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->cardtype = QTI_PHONEJACK_PCI;
68401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			request_region(j->XILINXbase, 4, "ixj control");
68411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.pcib.e1 = 1;
68421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb_p(j->pld_slicw.byte, j->XILINXbase);
68431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else
68441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->cardtype = QTI_PHONEJACK;
68451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
68461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		switch (j->cardtype) {
68471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case QTI_PHONEJACK:
68481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!j->dsp.low != 0x20) {
68491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->dsp.high = 0x80;
68501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->dsp.low = 0x20;
68511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ixj_WriteDSPCommand(0x3800, j);
68521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->ver.low = j->ssr.low;
68531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->ver.high = j->ssr.high;
68541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
68551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
68561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case QTI_LINEJACK:
68571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!request_region(j->XILINXbase, 8, "ixj control")) {
68581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
68591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return -1;
68601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
68611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
68621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case QTI_PHONEJACK_LITE:
68631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case QTI_PHONEJACK_PCI:
68641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!request_region(j->XILINXbase, 4, "ixj control")) {
68651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				printk(KERN_INFO "ixj: can't get I/O address 0x%x\n", j->XILINXbase);
68661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return -1;
68671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
68681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_slicw.pcib.e1 = 1;
68691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb_p(j->pld_slicw.byte, j->XILINXbase);
68701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
68711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		case QTI_PHONECARD:
68721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
68731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
68741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
68751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->dsp.low == 0x20 || j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) {
68761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixjdebug & 0x0002)
68771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk(KERN_INFO "Write CODEC config to Software Control Register\n");
68781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixj_WriteDSPCommand(0xC462, j))		/* Write CODEC config to Software Control Register */
68791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -1;
68801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixjdebug & 0x0002)
68811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk(KERN_INFO "Write CODEC timing to Software Control Register\n");
68821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->cardtype == QTI_PHONEJACK) {
68831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmd = 0x9FF2;
68841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
68851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmd = 0x9FF5;
68861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
68871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixj_WriteDSPCommand(cmd, j))	/* Write CODEC timing to Software Control Register */
68881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -1;
68891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
68901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (set_base_frame(j, 30) != 30)
68911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -1;
68921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixjdebug & 0x0002)
68931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk(KERN_INFO "Write CODEC config to Software Control Register\n");
68941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->cardtype == QTI_PHONECARD) {
68951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (ixj_WriteDSPCommand(0xC528, j))		/* Write CODEC config to Software Control Register */
68961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return -1;
68971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
68981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->cardtype == QTI_LINEJACK) {
68991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (ixj_WriteDSPCommand(0xC528, j))		/* Write CODEC config to Software Control Register */
69001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return -1;
69011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (ixjdebug & 0x0002)
69021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				printk(KERN_INFO "Turn on the PLD Clock at 8Khz\n");
69031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pld_clock.byte = 0;
69041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			outb_p(j->pld_clock.byte, j->XILINXbase + 0x04);
69051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
69061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
69071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
69081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->dsp.low == 0x20) {
69091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixjdebug & 0x0002)
69101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk(KERN_INFO "Configure GPIO pins\n");
69111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->gpio.bytes.high = 0x09;
69121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*  bytes.low = 0xEF;  0xF7 */
69131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->gpio.bits.gpio1 = 1;
69141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->gpio.bits.gpio2 = 1;
69151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->gpio.bits.gpio3 = 0;
69161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->gpio.bits.gpio4 = 1;
69171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->gpio.bits.gpio5 = 1;
69181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->gpio.bits.gpio6 = 1;
69191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->gpio.bits.gpio7 = 1;
69201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_WriteDSPCommand(j->gpio.word, j);	/* Set GPIO pin directions */
69211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixjdebug & 0x0002)
69221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk(KERN_INFO "Enable SLIC\n");
69231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->gpio.bytes.high = 0x0B;
69241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->gpio.bytes.low = 0x00;
69251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->gpio.bits.gpio1 = 0;
69261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->gpio.bits.gpio2 = 1;
69271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->gpio.bits.gpio5 = 0;
69281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ixj_WriteDSPCommand(j->gpio.word, j);	/* send the ring stop signal */
69291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->port = PORT_POTS;
69301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
69311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->cardtype == QTI_LINEJACK) {
69321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			LED_SetState(0x1, j);
6933f4c9925ccc185da68c2d42230711d017f222e420Nishanth Aravamudan			msleep(100);
69341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			LED_SetState(0x2, j);
6935f4c9925ccc185da68c2d42230711d017f222e420Nishanth Aravamudan			msleep(100);
69361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			LED_SetState(0x4, j);
6937f4c9925ccc185da68c2d42230711d017f222e420Nishanth Aravamudan			msleep(100);
69381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			LED_SetState(0x8, j);
6939f4c9925ccc185da68c2d42230711d017f222e420Nishanth Aravamudan			msleep(100);
69401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			LED_SetState(0x0, j);
69411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			daa_get_version(j);
69421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (ixjdebug & 0x0002)
69431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				printk("Loading DAA Coefficients\n");
69441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			DAA_Coeff_US(j);
69451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!ixj_daa_write(j)) {
69461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				printk("DAA write failed on board %d\n", j->board);
69471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return -1;
69481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
69491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if(!ixj_daa_cid_reset(j)) {
69501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				printk("DAA CID reset failed on board %d\n", j->board);
69511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return -1;
69521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
69531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->flags.pots_correct = 0;
69541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->flags.pstn_present = 0;
69551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_linetest(j);
69561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (j->flags.pots_correct) {
69571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */
69581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
69591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				outb_p(j->pld_scrw.byte, j->XILINXbase);
69601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->pld_slicw.bits.rly1 = 1;
69611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->pld_slicw.bits.spken = 1;
69621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
69631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
69641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*				SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
69651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->port = PORT_POTS;
69661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
69671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_set_port(j, PORT_PSTN);
69681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_set_pots(j, 1);
69691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (ixjdebug & 0x0002)
69701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				printk(KERN_INFO "Enable Mixer\n");
69711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x0000, j);	/*Master Volume Left unmute 0db */
69721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x0100, j);	/*Master Volume Right unmute 0db */
69731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
69741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x0203, j);	/*Voice Left Volume unmute 6db */
69751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x0303, j);	/*Voice Right Volume unmute 6db */
69761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
69771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x0480, j);	/*FM Left mute */
69781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x0580, j);	/*FM Right mute */
69791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
69801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x0680, j);	/*CD Left mute */
69811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x0780, j);	/*CD Right mute */
69821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
69831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x0880, j);	/*Line Left mute */
69841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x0980, j);	/*Line Right mute */
69851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
69861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x0A80, j);	/*Aux left mute  */
69871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x0B80, j);	/*Aux right mute */
69881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
69891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x0C00, j);	/*Mono1 unmute 12db */
69901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x0D80, j);	/*Mono2 mute */
69911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
69921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x0E80, j);	/*Mic mute */
69931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
69941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x0F00, j);	/*Mono Out Volume unmute 0db */
69951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
69961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x1000, j);	/*Voice Left and Right out only */
69971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x110C, j);
69981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
69991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
70001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x1200, j);	/*Mono1 switch on mixer left */
70011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x1401, j);
70021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
70031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x1300, j);       /*Mono1 switch on mixer right */
70041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x1501, j);
70051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
70061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x1700, j);	/*Clock select */
70071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
70081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x1800, j);	/*ADC input from mixer */
70091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
70101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj_mixer(0x1901, j);	/*Mic gain 30db */
70111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
70121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (ixjdebug & 0x0002)
70131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				printk(KERN_INFO "Setting Default US Ring Cadence Detection\n");
70141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->cadence_f[4].state = 0;
70151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->cadence_f[4].on1 = 0;	/*Cadence Filter 4 is used for PSTN ring cadence */
70161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->cadence_f[4].off1 = 0;
70171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->cadence_f[4].on2 = 0;
70181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->cadence_f[4].off2 = 0;
70191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->cadence_f[4].on3 = 0;
70201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->cadence_f[4].off3 = 0;	/* These should represent standard US ring pulse. */
70211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->pstn_last_rmr = jiffies;
70221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
70231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
70241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (j->cardtype == QTI_PHONECARD) {
70251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ixj_WriteDSPCommand(0xCF07, j);
70261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ixj_WriteDSPCommand(0x00B0, j);
70271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ixj_set_port(j, PORT_SPEAKER);
70281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			} else {
70291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				ixj_set_port(j, PORT_POTS);
70301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				SLIC_SetState(PLD_SLIC_STATE_STANDBY, j);
70311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*				SLIC_SetState(PLD_SLIC_STATE_ACTIVE, j); */
70321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
70331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
70341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
70351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
70361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->intercom = -1;
70371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->framesread = j->frameswritten = 0;
70381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->read_wait = j->write_wait = 0;
70391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->rxreadycheck = j->txreadycheck = 0;
70401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
70411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* initialise the DTMF prescale to a sensible value */
70421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->cardtype == QTI_LINEJACK) {
70431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		set_dtmf_prescale(j, 0x10);
70441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
70451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		set_dtmf_prescale(j, 0x40);
70461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
70471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	set_play_volume(j, 0x100);
70481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	set_rec_volume(j, 0x100);
70491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
70501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixj_WriteDSPCommand(0x0000, j))		/* Write IDLE to Software Control Register */
70511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
70521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* The read values of the SSR should be 0x00 for the IDLE command */
70531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->ssr.low || j->ssr.high)
70541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
70551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
70561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixjdebug & 0x0002)
70571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk(KERN_INFO "Enable Line Monitor\n");
70581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
70591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixjdebug & 0x0002)
70601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk(KERN_INFO "Set Line Monitor to Asyncronous Mode\n");
70611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
70621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixj_WriteDSPCommand(0x7E01, j))		/* Asynchronous Line Monitor */
70631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
70641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
70651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixjdebug & 0x002)
70661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk(KERN_INFO "Enable DTMF Detectors\n");
70671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
70681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixj_WriteDSPCommand(0x5151, j))		/* Enable DTMF detection */
70691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
70701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
70711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixj_WriteDSPCommand(0x6E01, j))		/* Set Asyncronous Tone Generation */
70721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
70731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
70741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	set_rec_depth(j, 2);	/* Set Record Channel Limit to 2 frames */
70751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
70761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	set_play_depth(j, 2);	/* Set Playback Channel Limit to 2 frames */
70771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
70781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->ex.bits.dtmf_ready = 0;
70791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->dtmf_state = 0;
70801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->dtmf_wp = j->dtmf_rp = 0;
70811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->rec_mode = j->play_mode = -1;
70821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->flags.ringing = 0;
70831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->maxrings = MAXRINGS;
70841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->ring_cadence = USA_RING_CADENCE;
70851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->drybuffer = 0;
70861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->winktime = 320;
70871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->flags.dtmf_oob = 0;
70881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (cnt = 0; cnt < 4; cnt++)
70891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->cadence_f[cnt].enable = 0;
70901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* must be a device on the specified address */
70911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_WriteDSPCommand(0x0FE3, j);	/* Put the DSP in 1/5 power mode. */
70921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
70931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Set up the default signals for events */
70941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (cnt = 0; cnt < 35; cnt++)
70951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->ixj_signals[cnt] = SIGIO;
70961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
70971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Set the excetion signal enable flags */
70981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->ex_sig.bits.dtmf_ready = j->ex_sig.bits.hookstate = j->ex_sig.bits.flash = j->ex_sig.bits.pstn_ring =
70991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->ex_sig.bits.caller_id = j->ex_sig.bits.pstn_wink = j->ex_sig.bits.f0 = j->ex_sig.bits.f1 = j->ex_sig.bits.f2 =
71001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->ex_sig.bits.f3 = j->ex_sig.bits.fc0 = j->ex_sig.bits.fc1 = j->ex_sig.bits.fc2 = j->ex_sig.bits.fc3 = 1;
71011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef IXJ_DYN_ALLOC
71021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->fskdata = NULL;
71031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
71041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->fskdcnt = 0;
71051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cidcw_wait = 0;
71061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
71071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Register with the Telephony for Linux subsystem */
71081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->p.f_op = &ixj_fops;
71091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->p.open = ixj_open;
71101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->p.board = j->board;
71111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	phone_register_device(&j->p, PHONE_UNIT_ANY);
71121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
71131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_init_timer(j);
71141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_add_timer(j);
71151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
71161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
71171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
71181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
71191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *	Exported service for pcmcia card handling
71201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
71211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
71221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsIXJ *ixj_pcmcia_probe(unsigned long dsp, unsigned long xilinx)
71231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
71241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IXJ *j = ixj_alloc();
71251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
71261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->board = 0;
71271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
71281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->DSPbase = dsp;
71291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->XILINXbase = xilinx;
71301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->cardtype = QTI_PHONECARD;
71311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ixj_selfprobe(j);
71321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return j;
71331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
71341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
71351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(ixj_pcmcia_probe);		/* Fpr PCMCIA */
71361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
71371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_get_status_proc(char *buf)
71381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
71391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int len;
71401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int cnt;
71411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IXJ *j;
71421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	len = 0;
71431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	len += sprintf(buf + len, "\nDriver version %i.%i.%i", IXJ_VER_MAJOR, IXJ_VER_MINOR, IXJ_BLD_VER);
71441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	len += sprintf(buf + len, "\nsizeof IXJ struct %Zd bytes", sizeof(IXJ));
71451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	len += sprintf(buf + len, "\nsizeof DAA struct %Zd bytes", sizeof(DAA_REGS));
71461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	len += sprintf(buf + len, "\nUsing old telephony API");
71471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	len += sprintf(buf + len, "\nDebug Level %d\n", ixjdebug);
71481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
71491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (cnt = 0; cnt < IXJMAX; cnt++) {
71501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j = get_ixj(cnt);
71511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(j==NULL)
71521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			continue;
71531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->DSPbase) {
71541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			len += sprintf(buf + len, "\nCard Num %d", cnt);
71551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			len += sprintf(buf + len, "\nDSP Base Address 0x%4.4x", j->DSPbase);
71561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (j->cardtype != QTI_PHONEJACK)
71571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "\nXILINX Base Address 0x%4.4x", j->XILINXbase);
71581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			len += sprintf(buf + len, "\nDSP Type %2.2x%2.2x", j->dsp.high, j->dsp.low);
71591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			len += sprintf(buf + len, "\nDSP Version %2.2x.%2.2x", j->ver.high, j->ver.low);
71601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			len += sprintf(buf + len, "\nSerial Number %8.8x", j->serial);
71611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			switch (j->cardtype) {
71621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case (QTI_PHONEJACK):
71631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK");
71641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
71651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case (QTI_LINEJACK):
71661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "\nCard Type = Internet LineJACK");
71671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (j->flags.g729_loaded)
71681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					len += sprintf(buf + len, " w/G.729 A/B");
71691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, " Country = %d", j->daa_country);
71701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
71711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case (QTI_PHONEJACK_LITE):
71721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK Lite");
71731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (j->flags.g729_loaded)
71741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					len += sprintf(buf + len, " w/G.729 A/B");
71751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
71761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case (QTI_PHONEJACK_PCI):
71771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "\nCard Type = Internet PhoneJACK PCI");
71781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (j->flags.g729_loaded)
71791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					len += sprintf(buf + len, " w/G.729 A/B");
71801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
71811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case (QTI_PHONECARD):
71821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "\nCard Type = Internet PhoneCARD");
71831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (j->flags.g729_loaded)
71841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					len += sprintf(buf + len, " w/G.729 A/B");
71851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "\nSmart Cable %spresent", j->pccr1.bits.drf ? "not " : "");
71861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (!j->pccr1.bits.drf)
71871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					len += sprintf(buf + len, "\nSmart Cable type %d", j->flags.pcmciasct);
71881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "\nSmart Cable state %d", j->flags.pcmciastate);
71891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
71901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			default:
71911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "\nCard Type = %d", j->cardtype);
71921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
71931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
71941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			len += sprintf(buf + len, "\nReaders %d", j->readers);
71951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			len += sprintf(buf + len, "\nWriters %d", j->writers);
71961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			add_caps(j);
71971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			len += sprintf(buf + len, "\nCapabilities %d", j->caps);
71981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (j->dsp.low != 0x20)
71991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "\nDSP Processor load %d", j->proc_load);
72001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (j->flags.cidsent)
72011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "\nCaller ID data sent");
72021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			else
72031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "\nCaller ID data not sent");
72041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
72051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			len += sprintf(buf + len, "\nPlay CODEC ");
72061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			switch (j->play_codec) {
72071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case G723_63:
72081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "G.723.1 6.3");
72091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
72101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case G723_53:
72111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "G.723.1 5.3");
72121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
72131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case TS85:
72141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "TrueSpeech 8.5");
72151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
72161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case TS48:
72171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "TrueSpeech 4.8");
72181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
72191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case TS41:
72201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "TrueSpeech 4.1");
72211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
72221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case G728:
72231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "G.728");
72241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
72251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case G729:
72261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "G.729");
72271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
72281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case G729B:
72291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "G.729B");
72301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
72311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case ULAW:
72321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "uLaw");
72331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
72341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case ALAW:
72351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "aLaw");
72361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
72371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case LINEAR16:
72381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "16 bit Linear");
72391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
72401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case LINEAR8:
72411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "8 bit Linear");
72421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
72431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case WSS:
72441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "Windows Sound System");
72451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
72461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			default:
72471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "NO CODEC CHOSEN");
72481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
72491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
72501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			len += sprintf(buf + len, "\nRecord CODEC ");
72511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			switch (j->rec_codec) {
72521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case G723_63:
72531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "G.723.1 6.3");
72541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
72551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case G723_53:
72561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "G.723.1 5.3");
72571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
72581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case TS85:
72591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "TrueSpeech 8.5");
72601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
72611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case TS48:
72621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "TrueSpeech 4.8");
72631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
72641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case TS41:
72651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "TrueSpeech 4.1");
72661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
72671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case G728:
72681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "G.728");
72691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
72701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case G729:
72711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "G.729");
72721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
72731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case G729B:
72741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "G.729B");
72751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
72761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case ULAW:
72771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "uLaw");
72781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
72791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case ALAW:
72801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "aLaw");
72811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
72821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case LINEAR16:
72831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "16 bit Linear");
72841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
72851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case LINEAR8:
72861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "8 bit Linear");
72871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
72881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case WSS:
72891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "Windows Sound System");
72901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
72911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			default:
72921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "NO CODEC CHOSEN");
72931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
72941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
72951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			len += sprintf(buf + len, "\nAEC ");
72961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			switch (j->aec_level) {
72971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case AEC_OFF:
72981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "Off");
72991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
73001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case AEC_LOW:
73011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "Low");
73021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
73031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case AEC_MED:
73041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "Med");
73051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
73061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case AEC_HIGH:
73071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "High");
73081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
73091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case AEC_AUTO:
73101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "Auto");
73111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
73121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case AEC_AGC:
73131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "AEC/AGC");
73141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
73151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			default:
73161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "unknown(%i)", j->aec_level);
73171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
73181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
73191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
73201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			len += sprintf(buf + len, "\nRec volume 0x%x", get_rec_volume(j));
73211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			len += sprintf(buf + len, "\nPlay volume 0x%x", get_play_volume(j));
73221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			len += sprintf(buf + len, "\nDTMF prescale 0x%x", get_dtmf_prescale(j));
73231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
73241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			len += sprintf(buf + len, "\nHook state %d", j->hookstate); /* j->r_hook);	*/
73251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
73261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (j->cardtype == QTI_LINEJACK) {
73271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "\nPOTS Correct %d", j->flags.pots_correct);
73281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "\nPSTN Present %d", j->flags.pstn_present);
73291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "\nPSTN Check %d", j->flags.pstncheck);
73301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "\nPOTS to PSTN %d", j->flags.pots_pstn);
73311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				switch (j->daa_mode) {
73321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				case SOP_PU_SLEEP:
73331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					len += sprintf(buf + len, "\nDAA PSTN On Hook");
73341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					break;
73351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				case SOP_PU_RINGING:
73361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					len += sprintf(buf + len, "\nDAA PSTN Ringing");
73371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					len += sprintf(buf + len, "\nRinging state = %d", j->cadence_f[4].state);
73381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					break;
73391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				case SOP_PU_CONVERSATION:
73401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					len += sprintf(buf + len, "\nDAA PSTN Off Hook");
73411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					break;
73421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				case SOP_PU_PULSEDIALING:
73431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					len += sprintf(buf + len, "\nDAA PSTN Pulse Dialing");
73441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					break;
73451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
73461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "\nDAA RMR = %d", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.bitreg.RMR);
73471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "\nDAA VDD OK = %d", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.bitreg.VDD_OK);
73481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "\nDAA CR0 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg);
73491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "\nDAA CR1 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg);
73501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "\nDAA CR2 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg);
73511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "\nDAA CR3 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg);
73521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "\nDAA CR4 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg);
73531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "\nDAA CR5 = 0x%02x", j->m_DAAShadowRegs.SOP_REGS.SOP.cr5.reg);
73541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "\nDAA XR0 = 0x%02x", j->m_DAAShadowRegs.XOP_REGS.XOP.xr0.reg);
73551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "\nDAA ringstop %ld - jiffies %ld", j->pstn_ring_stop, jiffies);
73561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
73571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			switch (j->port) {
73581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case PORT_POTS:
73591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "\nPort POTS");
73601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
73611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case PORT_PSTN:
73621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "\nPort PSTN");
73631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
73641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case PORT_SPEAKER:
73651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "\nPort SPEAKER/MIC");
73661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
73671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case PORT_HANDSET:
73681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "\nPort HANDSET");
73691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
73701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
73711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (j->dsp.low == 0x21 || j->dsp.low == 0x22) {
73721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				len += sprintf(buf + len, "\nSLIC state ");
73731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				switch (SLIC_GetState(j)) {
73741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				case PLD_SLIC_STATE_OC:
73751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					len += sprintf(buf + len, "OC");
73761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					break;
73771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				case PLD_SLIC_STATE_RINGING:
73781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					len += sprintf(buf + len, "RINGING");
73791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					break;
73801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				case PLD_SLIC_STATE_ACTIVE:
73811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					len += sprintf(buf + len, "ACTIVE");
73821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					break;
73831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				case PLD_SLIC_STATE_OHT:	/* On-hook transmit */
73841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					len += sprintf(buf + len, "OHT");
73851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					break;
73861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				case PLD_SLIC_STATE_TIPOPEN:
73871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					len += sprintf(buf + len, "TIPOPEN");
73881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					break;
73891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				case PLD_SLIC_STATE_STANDBY:
73901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					len += sprintf(buf + len, "STANDBY");
73911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					break;
73921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				case PLD_SLIC_STATE_APR:	/* Active polarity reversal */
73931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					len += sprintf(buf + len, "APR");
73941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					break;
73951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				case PLD_SLIC_STATE_OHTPR:	/* OHT polarity reversal */
73961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					len += sprintf(buf + len, "OHTPR");
73971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					break;
73981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				default:
73991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					len += sprintf(buf + len, "%d", SLIC_GetState(j));
74001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					break;
74011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
74021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
74031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			len += sprintf(buf + len, "\nBase Frame %2.2x.%2.2x", j->baseframe.high, j->baseframe.low);
74041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			len += sprintf(buf + len, "\nCID Base Frame %2d", j->cid_base_frame_size);
74051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef PERFMON_STATS
74061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			len += sprintf(buf + len, "\nTimer Checks %ld", j->timerchecks);
74071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			len += sprintf(buf + len, "\nRX Ready Checks %ld", j->rxreadycheck);
74081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			len += sprintf(buf + len, "\nTX Ready Checks %ld", j->txreadycheck);
74091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			len += sprintf(buf + len, "\nFrames Read %ld", j->framesread);
74101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			len += sprintf(buf + len, "\nFrames Written %ld", j->frameswritten);
74111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			len += sprintf(buf + len, "\nDry Buffer %ld", j->drybuffer);
74121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			len += sprintf(buf + len, "\nRead Waits %ld", j->read_wait);
74131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			len += sprintf(buf + len, "\nWrite Waits %ld", j->write_wait);
74141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                        len += sprintf(buf + len, "\nStatus Waits %ld", j->statuswait);
74151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                        len += sprintf(buf + len, "\nStatus Wait Fails %ld", j->statuswaitfail);
74161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                        len += sprintf(buf + len, "\nPControl Waits %ld", j->pcontrolwait);
74171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                        len += sprintf(buf + len, "\nPControl Wait Fails %ld", j->pcontrolwaitfail);
74181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                        len += sprintf(buf + len, "\nIs Control Ready Checks %ld", j->iscontrolready);
74191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                        len += sprintf(buf + len, "\nIs Control Ready Check failures %ld", j->iscontrolreadyfail);
74201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
74211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
74221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			len += sprintf(buf + len, "\n");
74231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
74241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
74251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return len;
74261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
74271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
74281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_read_proc(char *page, char **start, off_t off,
74291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds                              int count, int *eof, void *data)
74301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
74311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        int len = ixj_get_status_proc(page);
74321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        if (len <= off+count) *eof = 1;
74331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        *start = page + off;
74341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        len -= off;
74351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        if (len>count) len = count;
74361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        if (len<0) len = 0;
74371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        return len;
74381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
74391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
74401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
74411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void cleanup(void)
74421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
74431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int cnt;
74441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IXJ *j;
74451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
74461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (cnt = 0; cnt < IXJMAX; cnt++) {
74471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j = get_ixj(cnt);
74481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if(j != NULL && j->DSPbase) {
74491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (ixjdebug & 0x0002)
74501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				printk(KERN_INFO "IXJ: Deleting timer for /dev/phone%d\n", cnt);
74511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			del_timer(&j->timer);
74521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (j->cardtype == QTI_LINEJACK) {
74531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->pld_scrw.bits.daafsyncen = 0;	/* Turn off DAA Frame Sync */
74541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
74551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				outb_p(j->pld_scrw.byte, j->XILINXbase);
74561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->pld_slicw.bits.rly1 = 0;
74571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->pld_slicw.bits.rly2 = 0;
74581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->pld_slicw.bits.rly3 = 0;
74591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				outb_p(j->pld_slicw.byte, j->XILINXbase + 0x01);
74601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				LED_SetState(0x0, j);
74611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (ixjdebug & 0x0002)
74621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt);
74631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				release_region(j->XILINXbase, 8);
74641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			} else if (j->cardtype == QTI_PHONEJACK_LITE || j->cardtype == QTI_PHONEJACK_PCI) {
74651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				if (ixjdebug & 0x0002)
74661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					printk(KERN_INFO "IXJ: Releasing XILINX address for /dev/phone%d\n", cnt);
74671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				release_region(j->XILINXbase, 4);
74681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
74690159f76d9f5839c3c92bc3a91c865e94d5e489a8Jesper Juhl			kfree(j->read_buffer);
74700159f76d9f5839c3c92bc3a91c865e94d5e489a8Jesper Juhl			kfree(j->write_buffer);
74711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (j->dev)
74721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				pnp_device_detach(j->dev);
74731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (ixjdebug & 0x0002)
74741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				printk(KERN_INFO "IXJ: Unregistering /dev/phone%d from LTAPI\n", cnt);
74751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			phone_unregister_device(&j->p);
74761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (ixjdebug & 0x0002)
74771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				printk(KERN_INFO "IXJ: Releasing DSP address for /dev/phone%d\n", cnt);
74781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			release_region(j->DSPbase, 16);
74791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef IXJ_DYN_ALLOC
74801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (ixjdebug & 0x0002)
74811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				printk(KERN_INFO "IXJ: Freeing memory for /dev/phone%d\n", cnt);
74821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			kfree(j);
74831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			ixj[cnt] = NULL;
74841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
74851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
74861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
74871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixjdebug & 0x0002)
74881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk(KERN_INFO "IXJ: Removing /proc/ixj\n");
74891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	remove_proc_entry ("ixj", NULL);
74901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
74911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
74921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Typedefs */
74931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct {
74941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	BYTE length;
74951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DWORD bits;
74961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} DATABLOCK;
74971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
74981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void PCIEE_WriteBit(WORD wEEPROMAddress, BYTE lastLCC, BYTE byData)
74991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
75001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	lastLCC = lastLCC & 0xfb;
75011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	lastLCC = lastLCC | (byData ? 4 : 0);
75021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	outb(lastLCC, wEEPROMAddress);	/*set data out bit as appropriate */
75031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
75041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mdelay(1);
75051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	lastLCC = lastLCC | 0x01;
75061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	outb(lastLCC, wEEPROMAddress);	/*SK rising edge */
75071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
75081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	byData = byData << 1;
75091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	lastLCC = lastLCC & 0xfe;
75101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mdelay(1);
75111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	outb(lastLCC, wEEPROMAddress);	/*after delay, SK falling edge */
75121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
75131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
75141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
75151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic BYTE PCIEE_ReadBit(WORD wEEPROMAddress, BYTE lastLCC)
75161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
75171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mdelay(1);
75181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	lastLCC = lastLCC | 0x01;
75191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	outb(lastLCC, wEEPROMAddress);	/*SK rising edge */
75201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
75211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	lastLCC = lastLCC & 0xfe;
75221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mdelay(1);
75231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	outb(lastLCC, wEEPROMAddress);	/*after delay, SK falling edge */
75241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
75251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return ((inb(wEEPROMAddress) >> 3) & 1);
75261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
75271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
7528e13df2c58f8e8c72278b61e8f59de9a1403f9426Richard Knutssonstatic bool PCIEE_ReadWord(WORD wAddress, WORD wLoc, WORD * pwResult)
75291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
75301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	BYTE lastLCC;
75311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	WORD wEEPROMAddress = wAddress + 3;
75321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DWORD i;
75331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	BYTE byResult;
75341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*pwResult = 0;
75351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	lastLCC = inb(wEEPROMAddress);
75361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	lastLCC = lastLCC | 0x02;
75371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	lastLCC = lastLCC & 0xfe;
75381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	outb(lastLCC, wEEPROMAddress);	/* CS hi, SK lo */
75391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
75401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mdelay(1);		/* delay */
75411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
75421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1);
75431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	PCIEE_WriteBit(wEEPROMAddress, lastLCC, 1);
75441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	PCIEE_WriteBit(wEEPROMAddress, lastLCC, 0);
75451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (i = 0; i < 8; i++) {
75461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		PCIEE_WriteBit(wEEPROMAddress, lastLCC, wLoc & 0x80 ? 1 : 0);
75471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		wLoc <<= 1;
75481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
75491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
75501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (i = 0; i < 16; i++) {
75511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		byResult = PCIEE_ReadBit(wEEPROMAddress, lastLCC);
75521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		*pwResult = (*pwResult << 1) | byResult;
75531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
75541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
75551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	mdelay(1);		/* another delay */
75561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
75571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	lastLCC = lastLCC & 0xfd;
75581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	outb(lastLCC, wEEPROMAddress);	/* negate CS */
75591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
75601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
75611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
75621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
75631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic DWORD PCIEE_GetSerialNumber(WORD wAddress)
75641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
75651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	WORD wLo, wHi;
75661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (PCIEE_ReadWord(wAddress, 62, &wLo))
75671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
75681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (PCIEE_ReadWord(wAddress, 63, &wHi))
75691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
75701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return (((DWORD) wHi << 16) | wLo);
75711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
75721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
75731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int dspio[IXJMAX + 1] =
75741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
75751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	0,
75761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
75771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int xio[IXJMAX + 1] =
75781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
75791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	0,
75801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
75811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
75821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_param_array(dspio, int, NULL, 0);
75831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_param_array(xio, int, NULL, 0);
75841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_DESCRIPTION("Quicknet VoIP Telephony card module - www.quicknet.net");
75851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_AUTHOR("Ed Okerson <eokerson@quicknet.net>");
75861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_LICENSE("GPL");
75871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
75881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void __exit ixj_exit(void)
75891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
75901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        cleanup();
75911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
75921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
75931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic IXJ *new_ixj(unsigned long port)
75941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
75951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IXJ *res;
75961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!request_region(port, 16, "ixj DSP")) {
75971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk(KERN_INFO "ixj: can't get I/O address 0x%lx\n", port);
75981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return NULL;
75991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
76001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	res = ixj_alloc();
76011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!res) {
76021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		release_region(port, 16);
76031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk(KERN_INFO "ixj: out of memory\n");
76041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return NULL;
76051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
76061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	res->DSPbase = port;
76071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return res;
76081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
76091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
76101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __init ixj_probe_isapnp(int *cnt)
76111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
76121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int probe = 0;
76131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int func = 0x110;
76141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        struct pnp_dev *dev = NULL, *old_dev = NULL;
76151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
76161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while (1) {
76171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		do {
76181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			IXJ *j;
76191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			int result;
76201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
76211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			old_dev = dev;
76221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			dev = pnp_find_dev(NULL, ISAPNP_VENDOR('Q', 'T', 'I'),
76231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					 ISAPNP_FUNCTION(func), old_dev);
76241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!dev || !dev->card)
76251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
76261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			result = pnp_device_attach(dev);
76271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (result < 0) {
76281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				printk("pnp attach failed %d \n", result);
76291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
76301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
76311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (pnp_activate_dev(dev) < 0) {
76321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				printk("pnp activate failed (out of resources?)\n");
76331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				pnp_device_detach(dev);
76341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return -ENOMEM;
76351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
76361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
76371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!pnp_port_valid(dev, 0)) {
76381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				pnp_device_detach(dev);
76391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return -ENODEV;
76401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
76411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
76421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j = new_ixj(pnp_port_start(dev, 0));
76431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!j)
76441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
76451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
76461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (func != 0x110)
76471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->XILINXbase = pnp_port_start(dev, 1);	/* get real port */
76481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
76491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			switch (func) {
76501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case (0x110):
76511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->cardtype = QTI_PHONEJACK;
76521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
76531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case (0x310):
76541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->cardtype = QTI_LINEJACK;
76551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
76561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			case (0x410):
76571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->cardtype = QTI_PHONEJACK_LITE;
76581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
76591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
76601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->board = *cnt;
76611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			probe = ixj_selfprobe(j);
76621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if(!probe) {
76631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->serial = dev->card->serial;
76641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				j->dev = dev;
76651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				switch (func) {
76661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				case 0x110:
76671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					printk(KERN_INFO "ixj: found Internet PhoneJACK at 0x%x\n", j->DSPbase);
76681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					break;
76691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				case 0x310:
76701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					printk(KERN_INFO "ixj: found Internet LineJACK at 0x%x\n", j->DSPbase);
76711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					break;
76721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				case 0x410:
76731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					printk(KERN_INFO "ixj: found Internet PhoneJACK Lite at 0x%x\n", j->DSPbase);
76741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds					break;
76751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				}
76761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			}
76771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			++*cnt;
76781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} while (dev);
76791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (func == 0x410)
76801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
76811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (func == 0x310)
76821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			func = 0x410;
76831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (func == 0x110)
76841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			func = 0x310;
76851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		dev = NULL;
76861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
76871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return probe;
76881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
76891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
76901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __init ixj_probe_isa(int *cnt)
76911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
76921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int i, probe;
76931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
76941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Use passed parameters for older kernels without PnP */
76951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (i = 0; i < IXJMAX; i++) {
76961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (dspio[i]) {
76971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			IXJ *j = new_ixj(dspio[i]);
76981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
76991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (!j)
77001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				break;
77011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
77021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->XILINXbase = xio[i];
77031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->cardtype = 0;
77041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
77051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->board = *cnt;
77061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			probe = ixj_selfprobe(j);
77071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			j->dev = NULL;
77081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			++*cnt;
77091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
77101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
77111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
77121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
77131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
77141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __init ixj_probe_pci(int *cnt)
77151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
77161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct pci_dev *pci = NULL;
77171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int i, probe = 0;
77181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IXJ *j = NULL;
77191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
77201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (i = 0; i < IXJMAX - *cnt; i++) {
77216de2d20235a2b8c751d39ec4b68347d66b19d815Surya		pci = pci_get_device(PCI_VENDOR_ID_QUICKNET,
7722d77f09e51f5793583ede9733a93bd31a324d051cBen Collins				      PCI_DEVICE_ID_QUICKNET_XJ, pci);
77231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!pci)
77241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
77251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
77261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (pci_enable_device(pci))
77271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
77281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j = new_ixj(pci_resource_start(pci, 0));
77291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!j)
77301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			break;
77311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
77321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->serial = (PCIEE_GetSerialNumber)pci_resource_start(pci, 2);
77331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->XILINXbase = j->DSPbase + 0x10;
77341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->cardtype = QTI_PHONEJACK_PCI;
77351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->board = *cnt;
77361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		probe = ixj_selfprobe(j);
77371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (!probe)
77381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			printk(KERN_INFO "ixj: found Internet PhoneJACK PCI at 0x%x\n", j->DSPbase);
77391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		++*cnt;
77401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
77416de2d20235a2b8c751d39ec4b68347d66b19d815Surya	pci_dev_put(pci);
77421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return probe;
77431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
77441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
77451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __init ixj_init(void)
77461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
77471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int cnt = 0;
77481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int probe = 0;
77491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
77501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	cnt = 0;
77511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
77521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* These might be no-ops, see above. */
77531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if ((probe = ixj_probe_isapnp(&cnt)) < 0) {
77541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return probe;
77551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
77561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if ((probe = ixj_probe_isa(&cnt)) < 0) {
77571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return probe;
77581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
77591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if ((probe = ixj_probe_pci(&cnt)) < 0) {
77601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return probe;
77611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
7762fba478b1719c39ea67f15c6158ff4993933e9d18Domen Puncer	printk(KERN_INFO "ixj driver initialized.\n");
77631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	create_proc_read_entry ("ixj", 0, NULL, ixj_read_proc, NULL);
77641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return probe;
77651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
77661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
77671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_init(ixj_init);
77681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsmodule_exit(ixj_exit);
77691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
77701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void DAA_Coeff_US(IXJ *j)
77711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
77721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int i;
77731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
77741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->daa_country = DAA_US;
77751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*----------------------------------------------- */
77761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* CAO */
77771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
77781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
77791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
77801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
77811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for IM-filter part 1 (04): 0E,32,E2,2F,C2,5A,C0,00 */
77821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x03;
77831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0x4B;
77841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x5D;
77851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xCD;
77861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x24;
77871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xC5;
77881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
77891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
77901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for IM-filter part 2 (05): 72,85,00,0E,2B,3A,D0,08 */
77911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x71;
77921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x1A;
77931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
77941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A;
77951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xB5;
77961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
77971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
77981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
77991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for FRX-filter       (08): 03,8F,48,F2,8F,48,70,08 */
78001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x05;
78011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xA3;
78021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x72;
78031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
78041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x3F;
78051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x3B;
78061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30;
78071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
78081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for FRR-filter       (07): 04,8F,38,7F,9B,EA,B0,08 */
78091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x05;
78101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87;
78111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9;
78121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x3E;
78131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x32;
78141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xDA;
78151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0;
78161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
78171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for AX-filter        (0A): 16,55,DD,CA */
78181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x41;
78191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5;
78201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
78211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
78221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for AR-filter        (09): 52,D3,11,42 */
78231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25;
78241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7;
78251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
78261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
78271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for TH-filter part 1 (00): 00,42,48,81,B3,80,00,98 */
78281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
78291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
78301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
78311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
78321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA5;
78331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
78341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
78351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
78361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for TH-filter part 2 (01): 02,F2,33,A0,68,AB,8A,AD */
78371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
78381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xA2;
78391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2B;
78401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0;
78411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8;
78421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAB;
78431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81;
78441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xCC;
78451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for TH-filter part 3 (02): 00,88,DA,54,A4,BA,2D,BB */
78461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
78471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
78481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xD2;
78491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x24;
78501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBA;
78511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xA9;
78521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x3B;
78531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xA6;
78541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ;  (10K, 0.68uF) */
78551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*  */
78561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
78571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
78581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
78591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
78601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
78611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
78621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
78631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
78641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
78651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
78661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
78671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
78681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
78691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
78701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
78711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
78721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
78731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
78741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
78751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Levelmetering Ringing        (0D):B2,45,0F,8E       */
78761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
78771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
78781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
78791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
78801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
78811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
78821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1C; */
78831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0xB3; */
78841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0xAB; */
78851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xAB; */
78861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x54; */
78871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x2D; */
78881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0x62; */
78891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x2D; */
78901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
78911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x2D; */
78921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x62; */
78931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6; */
78941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBB; */
78951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x2A; */
78961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7D; */
78971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A; */
78981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD4; */
78991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* */
79001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Levelmetering Ringing        (0D):B2,45,0F,8E       */
79011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA; */
79021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x05; */
79031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F; */
79041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E; */
79051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
79061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Caller ID 1st Tone           (0E):CA,0E,CA,09,99,99,99,99 */
79071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
79081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
79091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
79101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
79111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
79121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
79131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
79141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
79151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Caller ID 2nd Tone           (0F):FD,B5,BA,07,DA,00,00,00 */
79161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
79171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
79181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
79191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
79201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
79211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
79221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
79231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
79241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*  */
79251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* ;CR Registers */
79261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Config. Reg. 0 (filters)       (cr0):FE ; CLK gen. by crystal */
79271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
79281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Config. Reg. 1 (dialing)       (cr1):05 */
79291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
79301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Config. Reg. 2 (caller ID)     (cr2):04 */
79311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
79321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Config. Reg. 3 (testloops)     (cr3):03 ; SEL Bit==0, HP-disabled */
79331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
79341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Config. Reg. 4 (analog gain)   (cr4):02 */
79351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
79361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Config. Reg. 5 (Version)       (cr5):02 */
79371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Config. Reg. 6 (Reserved)      (cr6):00 */
79381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Config. Reg. 7 (Reserved)      (cr7):00 */
79391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*  */
79401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* ;xr Registers */
79411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Ext. Reg. 0 (Interrupt Reg.)   (xr0):02 */
79421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
79431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;	/* SO_1 set to '1' because it is inverted. */
79441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Ext. Reg. 1 (Interrupt enable) (xr1):3C Cadence, RING, Caller ID, VDD_OK */
79451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
79461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x3C;
79471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Ext. Reg. 2 (Cadence Time Out) (xr2):7D */
79481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
79491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Ext. Reg. 3 (DC Char)          (xr3):32 ; B-Filter Off == 1 */
79501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x3B;		/*0x32; */
79511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Ext. Reg. 4 (Cadence)          (xr4):00 */
79521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
79531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
79541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Ext. Reg. 5 (Ring timer)       (xr5):22 */
79551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
79561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Ext. Reg. 6 (Power State)      (xr6):00 */
79571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
79581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Ext. Reg. 7 (Vdd)              (xr7):40 */
79591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40;		/* 0x40 ??? Should it be 0x00? */
79601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*  */
79611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* DTMF Tone 1                     (0B): 11,B3,5A,2C ;   697 Hz   */
79621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*                                       12,33,5A,C3 ;  770 Hz   */
79631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*                                       13,3C,5B,32 ;  852 Hz   */
79641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*                                       1D,1B,5C,CC ;  941 Hz   */
79651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
79661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
79671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
79681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
79691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
79701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* DTMF Tone 2                     (0C): 32,32,52,B3 ;  1209 Hz   */
79711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*                                       EC,1D,52,22 ;  1336 Hz   */
79721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*                                       AA,AC,51,D2 ;  1477 Hz   */
79731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*                                       9B,3B,51,25 ;  1633 Hz   */
79741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
79751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
79761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
79771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
79781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
79791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
79801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void DAA_Coeff_UK(IXJ *j)
79811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
79821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int i;
79831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
79841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->daa_country = DAA_UK;
79851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*----------------------------------------------- */
79861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* CAO */
79871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
79881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
79891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
79901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
79911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*  Bytes for IM-filter part 1 (04): 00,C2,BB,A8,CB,81,A0,00 */
79921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
79931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xC2;
79941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB;
79951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xA8;
79961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xCB;
79971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81;
79981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
79991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
80001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for IM-filter part 2 (05): 40,00,00,0A,A4,33,E0,08 */
80011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x40;
80021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x00;
80031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
80041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0A;
80051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xA4;
80061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
80071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
80081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
80091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for FRX-filter       (08): 07,9B,ED,24,B2,A2,A0,08 */
80101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
80111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9B;
80121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xED;
80131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x24;
80141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0xB2;
80151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0xA2;
80161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xA0;
80171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
80181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for FRR-filter       (07): 0F,92,F2,B2,87,D2,30,08 */
80191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F;
80201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x92;
80211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF2;
80221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0xB2;
80231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87;
80241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xD2;
80251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x30;
80261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
80271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for AX-filter        (0A): 1B,A5,DD,CA */
80281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x1B;
80291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xA5;
80301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
80311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
80321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for AR-filter        (09): E2,27,10,D6 */
80331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2;
80341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x27;
80351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
80361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
80371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for TH-filter part 1 (00): 80,2D,38,8B,D0,00,00,98 */
80381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
80391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x2D;
80401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x38;
80411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x8B;
80421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xD0;
80431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x00;
80441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
80451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
80461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for TH-filter part 2 (01): 02,5A,53,F0,0B,5F,84,D4 */
80471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
80481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x5A;
80491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x53;
80501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xF0;
80511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x0B;
80521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5F;
80531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x84;
80541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xD4;
80551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for TH-filter part 3 (02): 00,88,6A,A4,8F,52,F5,32 */
80561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
80571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
80581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x6A;
80591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA4;
80601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x8F;
80611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x52;
80621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xF5;
80631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x32;
80641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ; idle */
80651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
80661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
80671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
80681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
80691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
80701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
80711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
80721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
80731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
80741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
80751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
80761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
80771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
80781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
80791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
80801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
80811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
80821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
80831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Levelmetering Ringing           (0D):AA,35,0F,8E     ; 25Hz 30V less possible? */
80841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
80851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
80861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
80871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
80881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Caller ID 1st Tone              (0E):CA,0E,CA,09,99,99,99,99 */
80891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
80901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
80911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
80921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
80931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
80941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
80951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
80961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
80971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Caller ID 2nd Tone              (0F):FD,B5,BA,07,DA,00,00,00 */
80981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
80991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
81001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
81011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
81021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
81031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
81041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
81051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
81061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ;CR Registers */
81071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Config. Reg. 0 (filters)        (cr0):FF */
81081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
81091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Config. Reg. 1 (dialing)        (cr1):05 */
81101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
81111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Config. Reg. 2 (caller ID)      (cr2):04 */
81121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
81131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Config. Reg. 3 (testloops)      (cr3):00        ;  */
81141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
81151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Config. Reg. 4 (analog gain)    (cr4):02 */
81161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
81171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Config. Reg. 5 (Version)        (cr5):02 */
81181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Config. Reg. 6 (Reserved)       (cr6):00 */
81191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Config. Reg. 7 (Reserved)       (cr7):00 */
81201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* ;xr Registers */
81211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Ext. Reg. 0 (Interrupt Reg.)    (xr0):02 */
81221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
81231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;	/* SO_1 set to '1' because it is inverted. */
81241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Ext. Reg. 1 (Interrupt enable)  (xr1):1C */
81251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
81261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;		/* RING, Caller ID, VDD_OK */
81271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Ext. Reg. 2 (Cadence Time Out)  (xr2):7D */
81281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
81291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
81301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Ext. Reg. 3 (DC Char)           (xr3):36        ;  */
81311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36;
81321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Ext. Reg. 4 (Cadence)           (xr4):00 */
81331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
81341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Ext. Reg. 5 (Ring timer)        (xr5):22 */
81351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
81361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Ext. Reg. 6 (Power State)       (xr6):00 */
81371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
81381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Ext. Reg. 7 (Vdd)               (xr7):46 */
81391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46;		/* 0x46 ??? Should it be 0x00? */
81401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz   */
81411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*                                       12,33,5A,C3    ;  770 Hz   */
81421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*                                       13,3C,5B,32    ;  852 Hz   */
81431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*                                       1D,1B,5C,CC    ;  941 Hz   */
81441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
81451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
81461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
81471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
81481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
81491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz   */
81501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*                                       EC,1D,52,22    ;  1336 Hz   */
81511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*                                       AA,AC,51,D2    ;  1477 Hz   */
81521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*                                       9B,3B,51,25    ;  1633 Hz   */
81531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
81541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
81551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
81561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
81571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
81581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
81591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
81601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void DAA_Coeff_France(IXJ *j)
81611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
81621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int i;
81631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
81641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->daa_country = DAA_FRANCE;
81651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*----------------------------------------------- */
81661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* CAO */
81671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
81681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
81691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
81701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
81711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for IM-filter part 1 (04): 02,A2,43,2C,22,AF,A0,00 */
81721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x02;
81731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA2;
81741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0x43;
81751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2C;
81761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0x22;
81771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xAF;
81781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
81791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
81801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for IM-filter part 2 (05): 67,CE,00,0C,22,33,E0,08 */
81811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x67;
81821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xCE;
81831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
81841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x2C;
81851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x22;
81861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
81871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
81881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
81891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for FRX-filter       (08): 07,9A,28,F6,23,4A,B0,08 */
81901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
81911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x9A;
81921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x28;
81931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0xF6;
81941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x23;
81951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x4A;
81961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xB0;
81971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
81981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for FRR-filter       (07): 03,8F,F9,2F,9E,FA,20,08 */
81991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03;
82001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F;
82011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xF9;
82021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F;
82031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9E;
82041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xFA;
82051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20;
82061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
82071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for AX-filter        (0A): 16,B5,DD,CA */
82081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x16;
82091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xB5;
82101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
82111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
82121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for AR-filter        (09): 52,C7,10,D6 */
82131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0xE2;
82141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xC7;
82151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
82161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
82171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for TH-filter part 1 (00): 00,42,48,81,A6,80,00,98 */
82181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
82191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
82201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
82211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
82221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xA6;
82231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
82241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
82251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
82261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for TH-filter part 2 (01): 02,AC,2A,30,78,AC,8A,2C */
82271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
82281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAC;
82291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A;
82301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x30;
82311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x78;
82321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0xAC;
82331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x8A;
82341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x2C;
82351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for TH-filter part 3 (02): 00,88,DA,A5,22,BA,2C,45 */
82361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
82371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
82381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA;
82391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0xA5;
82401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x22;
82411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xBA;
82421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x2C;
82431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x45;
82441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ; idle */
82451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
82461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
82471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
82481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
82491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
82501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
82511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
82521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
82531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
82541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
82551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
82561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
82571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
82581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
82591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
82601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
82611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
82621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
82631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Levelmetering Ringing           (0D):32,45,B5,84     ; 50Hz 20V */
82641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32;
82651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
82661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5;
82671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84;
82681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Caller ID 1st Tone              (0E):CA,0E,CA,09,99,99,99,99 */
82691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
82701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
82711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
82721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
82731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
82741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
82751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
82761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
82771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Caller ID 2nd Tone              (0F):FD,B5,BA,07,DA,00,00,00 */
82781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
82791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
82801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
82811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
82821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
82831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
82841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
82851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
82861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ;CR Registers */
82871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Config. Reg. 0 (filters)        (cr0):FF */
82881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
82891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Config. Reg. 1 (dialing)        (cr1):05 */
82901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
82911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Config. Reg. 2 (caller ID)      (cr2):04 */
82921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
82931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Config. Reg. 3 (testloops)      (cr3):00        ;  */
82941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
82951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Config. Reg. 4 (analog gain)    (cr4):02 */
82961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
82971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Config. Reg. 5 (Version)        (cr5):02 */
82981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Config. Reg. 6 (Reserved)       (cr6):00 */
82991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Config. Reg. 7 (Reserved)       (cr7):00 */
83001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* ;xr Registers */
83011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Ext. Reg. 0 (Interrupt Reg.)    (xr0):02 */
83021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
83031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;	/* SO_1 set to '1' because it is inverted. */
83041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Ext. Reg. 1 (Interrupt enable)  (xr1):1C */
83051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
83061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;		/* RING, Caller ID, VDD_OK */
83071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Ext. Reg. 2 (Cadence Time Out)  (xr2):7D */
83081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
83091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
83101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Ext. Reg. 3 (DC Char)           (xr3):36        ;  */
83111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x36;
83121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Ext. Reg. 4 (Cadence)           (xr4):00 */
83131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
83141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Ext. Reg. 5 (Ring timer)        (xr5):22 */
83151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
83161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Ext. Reg. 6 (Power State)       (xr6):00 */
83171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
83181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Ext. Reg. 7 (Vdd)               (xr7):46 */
83191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x46;		/* 0x46 ??? Should it be 0x00? */
83201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz   */
83211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*                                       12,33,5A,C3    ;  770 Hz   */
83221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*                                       13,3C,5B,32    ;  852 Hz   */
83231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*                                       1D,1B,5C,CC    ;  941 Hz   */
83241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
83251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
83261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
83271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
83281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
83291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz   */
83301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*                                       EC,1D,52,22    ;  1336 Hz   */
83311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*                                       AA,AC,51,D2    ;  1477 Hz   */
83321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*                                       9B,3B,51,25    ;  1633 Hz   */
83331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
83341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
83351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
83361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
83371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
83381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
83391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
83401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void DAA_Coeff_Germany(IXJ *j)
83411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
83421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int i;
83431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
83441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->daa_country = DAA_GERMANY;
83451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*----------------------------------------------- */
83461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* CAO */
83471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
83481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
83491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
83501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
83511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for IM-filter part 1 (04): 00,CE,BB,B8,D2,81,B0,00 */
83521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
83531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xCE;
83541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xBB;
83551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0xB8;
83561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xD2;
83571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x81;
83581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xB0;
83591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
83601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for IM-filter part 2 (05): 45,8F,00,0C,D2,3A,D0,08 */
83611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x45;
83621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x8F;
83631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
83641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0C;
83651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0xD2;
83661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x3A;
83671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xD0;
83681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
83691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for FRX-filter       (08): 07,AA,E2,34,24,89,20,08 */
83701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
83711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0xAA;
83721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2;
83731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
83741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x24;
83751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x89;
83761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x20;
83771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
83781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for FRR-filter       (07): 02,87,FA,37,9A,CA,B0,08 */
83791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x02;
83801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x87;
83811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xFA;
83821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x37;
83831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x9A;
83841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCA;
83851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xB0;
83861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
83871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for AX-filter        (0A): 72,D5,DD,CA */
83881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x72;
83891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xD5;
83901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
83911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
83921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for AR-filter        (09): 72,42,13,4B */
83931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x72;
83941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x42;
83951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x13;
83961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0x4B;
83971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for TH-filter part 1 (00): 80,52,48,81,AD,80,00,98 */
83981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
83991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52;
84001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
84011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
84021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAD;
84031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
84041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
84051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
84061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for TH-filter part 2 (01): 02,42,5A,20,E8,1A,81,27 */
84071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
84081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0x42;
84091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x5A;
84101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20;
84111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0xE8;
84121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x1A;
84131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x81;
84141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x27;
84151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for TH-filter part 3 (02): 00,88,63,26,BD,4B,A3,C2 */
84161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
84171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
84181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x63;
84191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x26;
84201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0xBD;
84211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x4B;
84221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0xA3;
84231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xC2;
84241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ;  (10K, 0.68uF) */
84251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Bytes for Ringing part 1 (03):1B,3B,9B,BA,D4,1C,B3,23 */
84261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
84271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3B;
84281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x9B;
84291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0xBA;
84301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0xD4;
84311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x1C;
84321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xB3;
84331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
84341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for Ringing part 2 (06):13,42,A6,BA,D4,73,CA,D5 */
84351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x13;
84361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0x42;
84371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
84381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
84391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0xD4;
84401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x73;
84411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0xCA;
84421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
84431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Levelmetering Ringing        (0D):B2,45,0F,8E       */
84441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xB2;
84451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
84461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
84471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
84481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Caller ID 1st Tone           (0E):CA,0E,CA,09,99,99,99,99 */
84491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
84501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
84511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
84521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
84531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
84541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
84551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
84561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
84571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Caller ID 2nd Tone           (0F):FD,B5,BA,07,DA,00,00,00 */
84581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
84591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
84601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
84611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
84621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
84631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
84641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
84651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
84661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ;CR Registers */
84671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Config. Reg. 0 (filters)        (cr0):FF ; all Filters enabled, CLK from ext. source */
84681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
84691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Config. Reg. 1 (dialing)        (cr1):05 ; Manual Ring, Ring metering enabled */
84701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
84711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Config. Reg. 2 (caller ID)      (cr2):04 ; Analog Gain 0dB, FSC internal */
84721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
84731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Config. Reg. 3 (testloops)      (cr3):00 ; SEL Bit==0, HP-enabled */
84741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
84751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Config. Reg. 4 (analog gain)    (cr4):02 */
84761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
84771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Config. Reg. 5 (Version)        (cr5):02 */
84781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Config. Reg. 6 (Reserved)       (cr6):00 */
84791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Config. Reg. 7 (Reserved)       (cr7):00 */
84801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* ;xr Registers */
84811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Ext. Reg. 0 (Interrupt Reg.)    (xr0):02 */
84821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
84831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;	/* SO_1 set to '1' because it is inverted. */
84841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Ext. Reg. 1 (Interrupt enable)  (xr1):1C ; Ring, CID, VDDOK Interrupts enabled */
84851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
84861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;		/* RING, Caller ID, VDD_OK */
84871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Ext. Reg. 2 (Cadence Time Out)  (xr2):7D */
84881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
84891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
84901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Ext. Reg. 3 (DC Char)           (xr3):32 ; B-Filter Off==1, U0=3.5V, R=200Ohm */
84911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x32;
84921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Ext. Reg. 4 (Cadence)           (xr4):00 */
84931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
84941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Ext. Reg. 5 (Ring timer)        (xr5):22 */
84951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
84961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Ext. Reg. 6 (Power State)       (xr6):00 */
84971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
84981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Ext. Reg. 7 (Vdd)               (xr7):40 ; VDD=4.25 V */
84991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40;		/* 0x40 ??? Should it be 0x00? */
85001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz   */
85011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*                                       12,33,5A,C3    ;  770 Hz   */
85021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*                                       13,3C,5B,32    ;  852 Hz   */
85031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*                                       1D,1B,5C,CC    ;  941 Hz   */
85041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
85051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
85061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
85071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
85081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
85091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz   */
85101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*                                       EC,1D,52,22    ;  1336 Hz   */
85111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*                                       AA,AC,51,D2    ;  1477 Hz   */
85121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*                                       9B,3B,51,25    ;  1633 Hz   */
85131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
85141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
85151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
85161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
85171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
85181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
85191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
85201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void DAA_Coeff_Australia(IXJ *j)
85211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
85221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int i;
85231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
85241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->daa_country = DAA_AUSTRALIA;
85251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*----------------------------------------------- */
85261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* CAO */
85271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
85281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
85291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
85301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
85311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for IM-filter part 1 (04): 00,A3,AA,28,B3,82,D0,00 */
85321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x00;
85331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xA3;
85341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xAA;
85351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x28;
85361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xB3;
85371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0x82;
85381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xD0;
85391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
85401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for IM-filter part 2 (05): 70,96,00,09,32,6B,C0,08 */
85411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x70;
85421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0x96;
85431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
85441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x09;
85451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x32;
85461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x6B;
85471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xC0;
85481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
85491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for FRX-filter       (08): 07,96,E2,34,32,9B,30,08 */
85501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x07;
85511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x96;
85521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0xE2;
85531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x34;
85541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x32;
85551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x9B;
85561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0x30;
85571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
85581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for FRR-filter       (07): 0F,9A,E9,2F,22,CC,A0,08 */
85591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x0F;
85601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x9A;
85611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0xE9;
85621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x2F;
85631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x22;
85641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xCC;
85651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0xA0;
85661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
85671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for AX-filter        (0A): CB,45,DD,CA */
85681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0xCB;
85691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0x45;
85701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
85711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
85721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for AR-filter        (09): 1B,67,10,D6 */
85731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x1B;
85741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0x67;
85751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
85761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
85771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for TH-filter part 1 (00): 80,52,48,81,AF,80,00,98 */
85781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x80;
85791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x52;
85801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
85811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
85821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAF;
85831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
85841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
85851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
85861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for TH-filter part 2 (01): 02,DB,52,B0,38,01,82,AC */
85871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
85881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xDB;
85891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x52;
85901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0xB0;
85911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x38;
85921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x01;
85931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x82;
85941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0xAC;
85951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for TH-filter part 3 (02): 00,88,4A,3E,2C,3B,24,46 */
85961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
85971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
85981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0x4A;
85991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x3E;
86001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x2C;
86011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0x3B;
86021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x24;
86031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0x46;
86041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ;  idle */
86051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
86061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
86071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
86081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
86091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
86101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
86111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
86121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
86131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
86141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
86151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
86161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
86171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
86181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
86191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
86201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
86211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
86221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
86231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Levelmetering Ringing           (0D):32,45,B5,84   ; 50Hz 20V */
86241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0x32;
86251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x45;
86261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0xB5;
86271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x84;
86281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Caller ID 1st Tone              (0E):CA,0E,CA,09,99,99,99,99 */
86291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
86301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
86311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
86321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
86331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
86341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
86351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
86361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
86371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Caller ID 2nd Tone              (0F):FD,B5,BA,07,DA,00,00,00 */
86381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
86391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
86401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
86411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
86421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
86431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
86441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
86451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
86461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ;CR Registers */
86471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Config. Reg. 0 (filters)        (cr0):FF */
86481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
86491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Config. Reg. 1 (dialing)        (cr1):05 */
86501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
86511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Config. Reg. 2 (caller ID)      (cr2):04 */
86521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
86531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Config. Reg. 3 (testloops)      (cr3):00        ;  */
86541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
86551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Config. Reg. 4 (analog gain)    (cr4):02 */
86561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
86571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Config. Reg. 5 (Version)        (cr5):02 */
86581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Config. Reg. 6 (Reserved)       (cr6):00 */
86591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Config. Reg. 7 (Reserved)       (cr7):00 */
86601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* ;xr Registers */
86611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Ext. Reg. 0 (Interrupt Reg.)    (xr0):02 */
86621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
86631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;	/* SO_1 set to '1' because it is inverted. */
86641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Ext. Reg. 1 (Interrupt enable)  (xr1):1C */
86651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
86661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;		/* RING, Caller ID, VDD_OK */
86671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Ext. Reg. 2 (Cadence Time Out)  (xr2):7D */
86681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
86691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
86701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Ext. Reg. 3 (DC Char)           (xr3):2B      ;  */
86711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x2B;
86721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Ext. Reg. 4 (Cadence)           (xr4):00 */
86731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
86741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Ext. Reg. 5 (Ring timer)        (xr5):22 */
86751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
86761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Ext. Reg. 6 (Power State)       (xr6):00 */
86771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
86781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Ext. Reg. 7 (Vdd)               (xr7):40 */
86791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40;		/* 0x40 ??? Should it be 0x00? */
86801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
86811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* DTMF Tone 1                     (0B): 11,B3,5A,2C    ;  697 Hz   */
86821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*                                       12,33,5A,C3    ;  770 Hz   */
86831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*                                       13,3C,5B,32    ;  852 Hz   */
86841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*                                       1D,1B,5C,CC    ;  941 Hz   */
86851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
86861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
86871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
86881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
86891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
86901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz   */
86911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*                                       EC,1D,52,22    ;  1336 Hz   */
86921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*                                       AA,AC,51,D2    ;  1477 Hz   */
86931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*                                       9B,3B,51,25    ;  1633 Hz   */
86941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
86951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
86961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
86971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
86981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
86991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
87001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void DAA_Coeff_Japan(IXJ *j)
87011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
87021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int i;
87031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
87041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->daa_country = DAA_JAPAN;
87051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*----------------------------------------------- */
87061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* CAO */
87071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (i = 0; i < ALISDAA_CALLERID_SIZE; i++) {
87081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		j->m_DAAShadowRegs.CAO_REGS.CAO.CallerID[i] = 0;
87091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
87101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
87111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for IM-filter part 1 (04): 06,BD,E2,2D,BA,F9,A0,00 */
87121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[7] = 0x06;
87131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[6] = 0xBD;
87141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[5] = 0xE2;
87151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[4] = 0x2D;
87161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[3] = 0xBA;
87171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[2] = 0xF9;
87181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[1] = 0xA0;
87191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_1[0] = 0x00;
87201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for IM-filter part 2 (05): 6F,F7,00,0E,34,33,E0,08 */
87211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[7] = 0x6F;
87221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[6] = 0xF7;
87231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[5] = 0x00;
87241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[4] = 0x0E;
87251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[3] = 0x34;
87261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[2] = 0x33;
87271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[1] = 0xE0;
87281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.IMFilterCoeff_2[0] = 0x08;
87291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for FRX-filter       (08): 02,8F,68,77,9C,58,F0,08 */
87301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[7] = 0x02;
87311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[6] = 0x8F;
87321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[5] = 0x68;
87331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[4] = 0x77;
87341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[3] = 0x9C;
87351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[2] = 0x58;
87361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[1] = 0xF0;
87371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRXFilterCoeff[0] = 0x08;
87381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for FRR-filter       (07): 03,8F,38,73,87,EA,20,08 */
87391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[7] = 0x03;
87401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[6] = 0x8F;
87411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[5] = 0x38;
87421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[4] = 0x73;
87431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[3] = 0x87;
87441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[2] = 0xEA;
87451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[1] = 0x20;
87461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.FRRFilterCoeff[0] = 0x08;
87471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for AX-filter        (0A): 51,C5,DD,CA */
87481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[3] = 0x51;
87491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[2] = 0xC5;
87501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[1] = 0xDD;
87511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.AXFilterCoeff[0] = 0xCA;
87521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for AR-filter        (09): 25,A7,10,D6 */
87531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[3] = 0x25;
87541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[2] = 0xA7;
87551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[1] = 0x10;
87561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.ARFilterCoeff[0] = 0xD6;
87571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for TH-filter part 1 (00): 00,42,48,81,AE,80,00,98 */
87581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[7] = 0x00;
87591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[6] = 0x42;
87601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[5] = 0x48;
87611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[4] = 0x81;
87621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[3] = 0xAE;
87631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[2] = 0x80;
87641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[1] = 0x00;
87651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_1[0] = 0x98;
87661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for TH-filter part 2 (01): 02,AB,2A,20,99,5B,89,28 */
87671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[7] = 0x02;
87681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[6] = 0xAB;
87691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[5] = 0x2A;
87701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[4] = 0x20;
87711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[3] = 0x99;
87721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[2] = 0x5B;
87731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[1] = 0x89;
87741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_2[0] = 0x28;
87751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for TH-filter part 3 (02): 00,88,DA,25,34,C5,4C,BA */
87761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[7] = 0x00;
87771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[6] = 0x88;
87781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[5] = 0xDA;
87791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[4] = 0x25;
87801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[3] = 0x34;
87811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[2] = 0xC5;
87821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[1] = 0x4C;
87831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.THFilterCoeff_3[0] = 0xBA;
87841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ;  idle */
87851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Bytes for Ringing part 1 (03):1B,3C,93,3A,22,12,A3,23 */
87861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[7] = 0x1B;
87871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[6] = 0x3C;
87881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[5] = 0x93;
87891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[4] = 0x3A;
87901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[3] = 0x22;
87911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[2] = 0x12;
87921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[1] = 0xA3;
87931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_1[0] = 0x23;
87941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bytes for Ringing part 2 (06):12,A2,A6,BA,22,7A,0A,D5 */
87951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[7] = 0x12;
87961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[6] = 0xA2;
87971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[5] = 0xA6;
87981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[4] = 0xBA;
87991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[3] = 0x22;
88001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[2] = 0x7A;
88011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[1] = 0x0A;
88021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.RingerImpendance_2[0] = 0xD5;
88031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Levelmetering Ringing           (0D):AA,35,0F,8E    ; 25Hz 30V ????????? */
88041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[3] = 0xAA;
88051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[2] = 0x35;
88061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[1] = 0x0F;
88071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.LevelmeteringRinging[0] = 0x8E;
88081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Caller ID 1st Tone              (0E):CA,0E,CA,09,99,99,99,99 */
88091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[7] = 0xCA;
88101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[6] = 0x0E;
88111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[5] = 0xCA;
88121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[4] = 0x09;
88131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[3] = 0x99;
88141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[2] = 0x99;
88151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[1] = 0x99;
88161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID1stTone[0] = 0x99;
88171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Caller ID 2nd Tone              (0F):FD,B5,BA,07,DA,00,00,00 */
88181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[7] = 0xFD;
88191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[6] = 0xB5;
88201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[5] = 0xBA;
88211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[4] = 0x07;
88221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[3] = 0xDA;
88231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[2] = 0x00;
88241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[1] = 0x00;
88251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.CallerID2ndTone[0] = 0x00;
88261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ;CR Registers */
88271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Config. Reg. 0 (filters)        (cr0):FF */
88281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.SOP_REGS.SOP.cr0.reg = 0xFF;
88291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Config. Reg. 1 (dialing)        (cr1):05 */
88301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.SOP_REGS.SOP.cr1.reg = 0x05;
88311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Config. Reg. 2 (caller ID)      (cr2):04 */
88321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.SOP_REGS.SOP.cr2.reg = 0x04;
88331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Config. Reg. 3 (testloops)      (cr3):00        ;  */
88341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.SOP_REGS.SOP.cr3.reg = 0x00;
88351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Config. Reg. 4 (analog gain)    (cr4):02 */
88361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.SOP_REGS.SOP.cr4.reg = 0x02;
88371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Config. Reg. 5 (Version)        (cr5):02 */
88381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Config. Reg. 6 (Reserved)       (cr6):00 */
88391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Config. Reg. 7 (Reserved)       (cr7):00 */
88401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* ;xr Registers */
88411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Ext. Reg. 0 (Interrupt Reg.)    (xr0):02 */
88421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
88431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_xr0_W.reg = 0x02;	/* SO_1 set to '1' because it is inverted. */
88441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Ext. Reg. 1 (Interrupt enable)  (xr1):1C */
88451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
88461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_REGS.XOP.xr1.reg = 0x1C;		/* RING, Caller ID, VDD_OK */
88471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Ext. Reg. 2 (Cadence Time Out)  (xr2):7D */
88481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
88491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_REGS.XOP.xr2.reg = 0x7D;
88501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Ext. Reg. 3 (DC Char)           (xr3):22        ;  */
88511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_REGS.XOP.xr3.reg = 0x22;
88521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Ext. Reg. 4 (Cadence)           (xr4):00 */
88531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_REGS.XOP.xr4.reg = 0x00;
88541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Ext. Reg. 5 (Ring timer)        (xr5):22 */
88551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_REGS.XOP.xr5.reg = 0x22;
88561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Ext. Reg. 6 (Power State)       (xr6):00 */
88571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_xr6_W.reg = 0x00;
88581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Ext. Reg. 7 (Vdd)               (xr7):40 */
88591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.XOP_REGS.XOP.xr7.reg = 0x40;		/* 0x40 ??? Should it be 0x00? */
88601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* DTMF Tone 1                     (0B): 11,B3,5A,2C    ;   697 Hz   */
88611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*                                       12,33,5A,C3    ;  770 Hz   */
88621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*                                       13,3C,5B,32    ;  852 Hz   */
88631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*                                       1D,1B,5C,CC    ;  941 Hz   */
88641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
88651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[3] = 0x11;
88661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[2] = 0xB3;
88671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[1] = 0x5A;
88681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone1Coeff[0] = 0x2C;
88691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* DTMF Tone 2                     (0C): 32,32,52,B3    ;  1209 Hz   */
88701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*                                       EC,1D,52,22    ;  1336 Hz   */
88711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*                                       AA,AC,51,D2    ;  1477 Hz   */
88721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/*                                       9B,3B,51,25    ;  1633 Hz   */
88731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[3] = 0x32;
88741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[2] = 0x32;
88751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[1] = 0x52;
88761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->m_DAAShadowRegs.COP_REGS.COP.Tone2Coeff[0] = 0xB3;
88771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
88781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
88791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic s16 tone_table[][19] =
88801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
88811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f20_50[] 11 */
88821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		32538,		/* A1 = 1.985962 */
88831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32325,	/* A2 = -0.986511 */
88841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -343,		/* B2 = -0.010493 */
88851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0 */
88861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 343,		/* B0 = 0.010493 */
88871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 32619,		/* A1 = 1.990906 */
88881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32520,	/* A2 = -0.992462 */
88891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 19179,		/* B2 = 0.585327 */
88901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -19178,	/* B1 = -1.170593 */
88911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 19179,		/* B0 = 0.585327 */
88921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 32723,		/* A1 = 1.997314 */
88931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32686,	/* A2 = -0.997528 */
88941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 9973,		/* B2 = 0.304352 */
88951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -9955,		/* B1 = -0.607605 */
88961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 9973,		/* B0 = 0.304352 */
88971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 7,		/* Internal filter scaling */
88981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
88991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
89001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
89011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
89021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f133_200[] 12 */
89031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		32072,		/* A1 = 1.95752 */
89041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -31896,	/* A2 = -0.973419 */
89051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -435,		/* B2 = -0.013294 */
89061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0 */
89071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 435,		/* B0 = 0.013294 */
89081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 32188,		/* A1 = 1.9646 */
89091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32400,	/* A2 = -0.98877 */
89101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 15139,		/* B2 = 0.462036 */
89111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -14882,	/* B1 = -0.908356 */
89121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 15139,		/* B0 = 0.462036 */
89131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 32473,		/* A1 = 1.981995 */
89141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32524,	/* A2 = -0.992584 */
89151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 23200,		/* B2 = 0.708008 */
89161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -23113,	/* B1 = -1.410706 */
89171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 23200,		/* B0 = 0.708008 */
89181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 7,		/* Internal filter scaling */
89191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
89201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
89211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
89221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
89231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f300 13 */
89241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		31769,		/* A1 = -1.939026 */
89251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32584,	/* A2 = 0.994385 */
89261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -475,		/* B2 = -0.014522 */
89271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
89281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 475,		/* B0 = 0.014522 */
89291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 31789,		/* A1 = -1.940247 */
89301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32679,	/* A2 = 0.997284 */
89311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 17280,		/* B2 = 0.527344 */
89321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -16865,	/* B1 = -1.029358 */
89331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 17280,		/* B0 = 0.527344 */
89341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 31841,		/* A1 = -1.943481 */
89351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32681,	/* A2 = 0.997345 */
89361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 543,		/* B2 = 0.016579 */
89371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -525,		/* B1 = -0.032097 */
89381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 543,		/* B0 = 0.016579 */
89391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
89401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
89411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
89421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
89431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
89441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f300_420[] 14 */
89451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		30750,		/* A1 = 1.876892 */
89461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -31212,	/* A2 = -0.952515 */
89471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -804,		/* B2 = -0.024541 */
89481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0 */
89491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 804,		/* B0 = 0.024541 */
89501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30686,		/* A1 = 1.872925 */
89511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32145,	/* A2 = -0.980988 */
89521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 14747,		/* B2 = 0.450043 */
89531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -13703,	/* B1 = -0.836395 */
89541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 14747,		/* B0 = 0.450043 */
89551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 31651,		/* A1 = 1.931824 */
89561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32321,	/* A2 = -0.986389 */
89571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 24425,		/* B2 = 0.745422 */
89581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -23914,	/* B1 = -1.459595 */
89591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 24427,		/* B0 = 0.745483 */
89601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 7,		/* Internal filter scaling */
89611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
89621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
89631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
89641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
89651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f330 15 */
89661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		31613,		/* A1 = -1.929565 */
89671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32646,	/* A2 = 0.996277 */
89681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -185,		/* B2 = -0.005657 */
89691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
89701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 185,		/* B0 = 0.005657 */
89711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 31620,		/* A1 = -1.929932 */
89721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32713,	/* A2 = 0.998352 */
89731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 19253,		/* B2 = 0.587585 */
89741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -18566,	/* B1 = -1.133179 */
89751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 19253,		/* B0 = 0.587585 */
89761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 31674,		/* A1 = -1.933228 */
89771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32715,	/* A2 = 0.998413 */
89781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 2575,		/* B2 = 0.078590 */
89791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -2495,		/* B1 = -0.152283 */
89801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 2575,		/* B0 = 0.078590 */
89811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
89821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
89831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
89841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
89851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
89861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f300_425[] 16 */
89871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		30741,		/* A1 = 1.876282 */
89881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -31475,	/* A2 = -0.960541 */
89891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -703,		/* B2 = -0.021484 */
89901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0 */
89911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 703,		/* B0 = 0.021484 */
89921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30688,		/* A1 = 1.873047 */
89931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32248,	/* A2 = -0.984161 */
89941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 14542,		/* B2 = 0.443787 */
89951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -13523,	/* B1 = -0.825439 */
89961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 14542,		/* B0 = 0.443817 */
89971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 31494,		/* A1 = 1.922302 */
89981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32366,	/* A2 = -0.987762 */
89991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21577,		/* B2 = 0.658508 */
90001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -21013,	/* B1 = -1.282532 */
90011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21577,		/* B0 = 0.658508 */
90021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 7,		/* Internal filter scaling */
90031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
90041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
90051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
90061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
90071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f330_440[] 17 */
90081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		30627,		/* A1 = 1.869324 */
90091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -31338,	/* A2 = -0.95636 */
90101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -843,		/* B2 = -0.025749 */
90111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0 */
90121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 843,		/* B0 = 0.025749 */
90131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30550,		/* A1 = 1.864685 */
90141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32221,	/* A2 = -0.983337 */
90151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 13594,		/* B2 = 0.414886 */
90161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -12589,	/* B1 = -0.768402 */
90171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 13594,		/* B0 = 0.414886 */
90181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 31488,		/* A1 = 1.921936 */
90191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32358,	/* A2 = -0.987518 */
90201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 24684,		/* B2 = 0.753296 */
90211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -24029,	/* B1 = -1.466614 */
90221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 24684,		/* B0 = 0.753296 */
90231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 7,		/* Internal filter scaling */
90241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
90251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
90261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
90271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
90281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f340 18 */
90291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		31546,		/* A1 = -1.925476 */
90301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32646,	/* A2 = 0.996277 */
90311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -445,		/* B2 = -0.013588 */
90321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
90331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 445,		/* B0 = 0.013588 */
90341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 31551,		/* A1 = -1.925781 */
90351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32713,	/* A2 = 0.998352 */
90361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 23884,		/* B2 = 0.728882 */
90371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -22979,	/* B1 = -1.402527 */
90381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 23884,		/* B0 = 0.728882 */
90391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 31606,		/* A1 = -1.929138 */
90401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32715,	/* A2 = 0.998413 */
90411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 863,		/* B2 = 0.026367 */
90421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -835,		/* B1 = -0.050985 */
90431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 863,		/* B0 = 0.026367 */
90441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
90451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
90461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
90471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
90481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
90491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f350_400[] 19 */
90501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		31006,		/* A1 = 1.892517 */
90511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32029,	/* A2 = -0.977448 */
90521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -461,		/* B2 = -0.014096 */
90531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0 */
90541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 461,		/* B0 = 0.014096 */
90551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30999,		/* A1 = 1.892029 */
90561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32487,	/* A2 = -0.991455 */
90571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 11325,		/* B2 = 0.345612 */
90581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -10682,	/* B1 = -0.651978 */
90591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 11325,		/* B0 = 0.345612 */
90601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 31441,		/* A1 = 1.919067 */
90611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32526,	/* A2 = -0.992615 */
90621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 24324,		/* B2 = 0.74231 */
90631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -23535,	/* B1 = -1.436523 */
90641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 24324,		/* B0 = 0.74231 */
90651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 7,		/* Internal filter scaling */
90661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
90671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
90681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
90691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
90701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f350_440[] */
90711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		30634,		/* A1 = 1.869751 */
90721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -31533,	/* A2 = -0.962341 */
90731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -680,		/* B2 = -0.020782 */
90741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0 */
90751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 680,		/* B0 = 0.020782 */
90761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30571,		/* A1 = 1.865906 */
90771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32277,	/* A2 = -0.985016 */
90781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 12894,		/* B2 = 0.393524 */
90791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -11945,	/* B1 = -0.729065 */
90801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 12894,		/* B0 = 0.393524 */
90811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 31367,		/* A1 = 1.91449 */
90821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32379,	/* A2 = -0.988129 */
90831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 23820,		/* B2 = 0.726929 */
90841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -23104,	/* B1 = -1.410217 */
90851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 23820,		/* B0 = 0.726929 */
90861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 7,		/* Internal filter scaling */
90871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
90881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
90891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
90901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
90911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f350_450[] */
90921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		30552,		/* A1 = 1.864807 */
90931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -31434,	/* A2 = -0.95929 */
90941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -690,		/* B2 = -0.021066 */
90951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0 */
90961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 690,		/* B0 = 0.021066 */
90971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30472,		/* A1 = 1.859924 */
90981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32248,	/* A2 = -0.984161 */
90991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 13385,		/* B2 = 0.408478 */
91001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -12357,	/* B1 = -0.754242 */
91011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 13385,		/* B0 = 0.408478 */
91021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 31358,		/* A1 = 1.914001 */
91031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32366,	/* A2 = -0.987732 */
91041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 26488,		/* B2 = 0.80835 */
91051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -25692,	/* B1 = -1.568176 */
91061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 26490,		/* B0 = 0.808411 */
91071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 7,		/* Internal filter scaling */
91081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
91091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
91101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
91111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
91121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f360 */
91131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		31397,		/* A1 = -1.916321 */
91141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32623,	/* A2 = 0.995605 */
91151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -117,		/* B2 = -0.003598 */
91161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
91171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 117,		/* B0 = 0.003598 */
91181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 31403,		/* A1 = -1.916687 */
91191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32700,	/* A2 = 0.997925 */
91201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 3388,		/* B2 = 0.103401 */
91211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -3240,		/* B1 = -0.197784 */
91221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 3388,		/* B0 = 0.103401 */
91231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 31463,		/* A1 = -1.920410 */
91241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32702,	/* A2 = 0.997986 */
91251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 13346,		/* B2 = 0.407288 */
91261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -12863,	/* B1 = -0.785126 */
91271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 13346,		/* B0 = 0.407288 */
91281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
91291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
91301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
91311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
91321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
91331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f380_420[] */
91341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		30831,		/* A1 = 1.881775 */
91351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32064,	/* A2 = -0.978546 */
91361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -367,		/* B2 = -0.01122 */
91371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0 */
91381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 367,		/* B0 = 0.01122 */
91391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30813,		/* A1 = 1.880737 */
91401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32456,	/* A2 = -0.990509 */
91411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 11068,		/* B2 = 0.337769 */
91421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -10338,	/* B1 = -0.631042 */
91431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 11068,		/* B0 = 0.337769 */
91441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 31214,		/* A1 = 1.905212 */
91451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32491,	/* A2 = -0.991577 */
91461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 16374,		/* B2 = 0.499695 */
91471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -15781,	/* B1 = -0.963196 */
91481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 16374,		/* B0 = 0.499695 */
91491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 7,		/* Internal filter scaling */
91501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
91511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
91521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
91531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
91541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f392 */
91551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		31152,		/* A1 = -1.901428 */
91561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32613,	/* A2 = 0.995300 */
91571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -314,		/* B2 = -0.009605 */
91581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
91591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 314,		/* B0 = 0.009605 */
91601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 31156,		/* A1 = -1.901672 */
91611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32694,	/* A2 = 0.997742 */
91621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 28847,		/* B2 = 0.880371 */
91631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -2734,		/* B1 = -0.166901 */
91641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 28847,		/* B0 = 0.880371 */
91651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 31225,		/* A1 = -1.905823 */
91661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32696,	/* A2 = 0.997803 */
91671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 462,		/* B2 = 0.014108 */
91681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -442,		/* B1 = -0.027019 */
91691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 462,		/* B0 = 0.014108 */
91701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
91711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
91721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
91731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
91741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
91751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f400_425[] */
91761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		30836,		/* A1 = 1.882141 */
91771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32296,	/* A2 = -0.985596 */
91781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -324,		/* B2 = -0.009903 */
91791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0 */
91801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 324,		/* B0 = 0.009903 */
91811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30825,		/* A1 = 1.881409 */
91821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32570,	/* A2 = -0.993958 */
91831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 16847,		/* B2 = 0.51416 */
91841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -15792,	/* B1 = -0.963898 */
91851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 16847,		/* B0 = 0.51416 */
91861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 31106,		/* A1 = 1.89856 */
91871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32584,	/* A2 = -0.994415 */
91881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 9579,		/* B2 = 0.292328 */
91891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -9164,		/* B1 = -0.559357 */
91901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 9579,		/* B0 = 0.292328 */
91911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 7,		/* Internal filter scaling */
91921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
91931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
91941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
91951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
91961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f400_440[] */
91971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		30702,		/* A1 = 1.873962 */
91981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32134,	/* A2 = -0.980682 */
91991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -517,		/* B2 = -0.015793 */
92001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0 */
92011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 517,		/* B0 = 0.015793 */
92021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30676,		/* A1 = 1.872375 */
92031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32520,	/* A2 = -0.992462 */
92041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 8144,		/* B2 = 0.24855 */
92051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -7596,		/* B1 = -0.463684 */
92061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 8144,		/* B0 = 0.24855 */
92071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 31084,		/* A1 = 1.897217 */
92081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32547,	/* A2 = -0.993256 */
92091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 22713,		/* B2 = 0.693176 */
92101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -21734,	/* B1 = -1.326599 */
92111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 22713,		/* B0 = 0.693176 */
92121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 7,		/* Internal filter scaling */
92131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
92141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
92151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
92161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
92171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f400_450[] */
92181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		30613,		/* A1 = 1.86853 */
92191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32031,	/* A2 = -0.977509 */
92201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -618,		/* B2 = -0.018866 */
92211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0 */
92221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 618,		/* B0 = 0.018866 */
92231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30577,		/* A1 = 1.866272 */
92241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32491,	/* A2 = -0.991577 */
92251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 9612,		/* B2 = 0.293335 */
92261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -8935,		/* B1 = -0.54541 */
92271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 9612,		/* B0 = 0.293335 */
92281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 31071,		/* A1 = 1.896484 */
92291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32524,	/* A2 = -0.992584 */
92301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21596,		/* B2 = 0.659058 */
92311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -20667,	/* B1 = -1.261414 */
92321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21596,		/* B0 = 0.659058 */
92331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 7,		/* Internal filter scaling */
92341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
92351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
92361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
92371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
92381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f420 */
92391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		30914,		/* A1 = -1.886841 */
92401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32584,	/* A2 = 0.994385 */
92411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -426,		/* B2 = -0.013020 */
92421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
92431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 426,		/* B0 = 0.013020 */
92441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30914,		/* A1 = -1.886841 */
92451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32679,	/* A2 = 0.997314 */
92461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 17520,		/* B2 = 0.534668 */
92471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -16471,	/* B1 = -1.005310 */
92481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 17520,		/* B0 = 0.534668 */
92491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 31004,		/* A1 = -1.892334 */
92501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32683,	/* A2 = 0.997406 */
92511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 819,		/* B2 = 0.025023 */
92521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -780,		/* B1 = -0.047619 */
92531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 819,		/* B0 = 0.025023 */
92541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
92551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
92561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
92571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
92581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
92591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#if 0
92601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f425 */
92611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		30881,		/* A1 = -1.884827 */
92621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32603,	/* A2 = 0.994965 */
92631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -496,		/* B2 = -0.015144 */
92641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
92651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 496,		/* B0 = 0.015144 */
92661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30880,		/* A1 = -1.884766 */
92671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32692,	/* A2 = 0.997711 */
92681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 24767,		/* B2 = 0.755859 */
92691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -23290,	/* B1 = -1.421509 */
92701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 24767,		/* B0 = 0.755859 */
92711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30967,		/* A1 = -1.890076 */
92721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32694,	/* A2 = 0.997772 */
92731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 728,		/* B2 = 0.022232 */
92741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -691,		/* B1 = -0.042194 */
92751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 728,		/* B0 = 0.022232 */
92761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
92771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
92781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
92791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
92801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
92811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else
92821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
92831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		30850,
92841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		-32534,
92851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		-504,
92861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0,
92871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		504,
92881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		30831,
92891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		-32669,
92901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		24303,
92911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		-22080,
92921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		24303,
92931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		30994,
92941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		-32673,
92951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		1905,
92961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		-1811,
92971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		1905,
92981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		5,
92991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		129,
93001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		17,
93011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		0xff5
93021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
93031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
93041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f425_450[] */
93051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		30646,		/* A1 = 1.870544 */
93061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32327,	/* A2 = -0.986572 */
93071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -287,		/* B2 = -0.008769 */
93081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0 */
93091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 287,		/* B0 = 0.008769 */
93101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30627,		/* A1 = 1.869324 */
93111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32607,	/* A2 = -0.995087 */
93121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 13269,		/* B2 = 0.404968 */
93131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -12376,	/* B1 = -0.755432 */
93141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 13269,		/* B0 = 0.404968 */
93151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30924,		/* A1 = 1.887512 */
93161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32619,	/* A2 = -0.995453 */
93171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 19950,		/* B2 = 0.608826 */
93181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -18940,	/* B1 = -1.156006 */
93191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 19950,		/* B0 = 0.608826 */
93201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 7,		/* Internal filter scaling */
93211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
93221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
93231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
93241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
93251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f425_475[] */
93261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		30396,		/* A1 = 1.855225 */
93271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32014,	/* A2 = -0.97699 */
93281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -395,		/* B2 = -0.012055 */
93291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0 */
93301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 395,		/* B0 = 0.012055 */
93311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30343,		/* A1 = 1.85199 */
93321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32482,	/* A2 = -0.991302 */
93331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 17823,		/* B2 = 0.543945 */
93341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -16431,	/* B1 = -1.002869 */
93351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 17823,		/* B0 = 0.543945 */
93361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30872,		/* A1 = 1.884338 */
93371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32516,	/* A2 = -0.99231 */
93381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 18124,		/* B2 = 0.553101 */
93391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -17246,	/* B1 = -1.052673 */
93401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 18124,		/* B0 = 0.553101 */
93411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 7,		/* Internal filter scaling */
93421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
93431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
93441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
93451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
93461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f435 */
93471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		30796,		/* A1 = -1.879639 */
93481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32603,	/* A2 = 0.994965 */
93491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -254,		/* B2 = -0.007762 */
93501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
93511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 254,		/* B0 = 0.007762 */
93521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30793,		/* A1 = -1.879456 */
93531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32692,	/* A2 = 0.997711 */
93541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 18934,		/* B2 = 0.577820 */
93551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -17751,	/* B1 = -1.083496 */
93561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 18934,		/* B0 = 0.577820 */
93571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30882,		/* A1 = -1.884888 */
93581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32694,	/* A2 = 0.997772 */
93591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 1858,		/* B2 = 0.056713 */
93601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -1758,		/* B1 = -0.107357 */
93611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 1858,		/* B0 = 0.056713 */
93621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
93631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
93641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
93651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
93661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
93671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f440_450[] */
93681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		30641,		/* A1 = 1.870239 */
93691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32458,	/* A2 = -0.99057 */
93701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -155,		/* B2 = -0.004735 */
93711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0 */
93721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 155,		/* B0 = 0.004735 */
93731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30631,		/* A1 = 1.869568 */
93741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32630,	/* A2 = -0.995789 */
93751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 11453,		/* B2 = 0.349548 */
93761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -10666,	/* B1 = -0.651001 */
93771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 11453,		/* B0 = 0.349548 */
93781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30810,		/* A1 = 1.880554 */
93791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32634,	/* A2 = -0.995941 */
93801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 12237,		/* B2 = 0.373474 */
93811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -11588,	/* B1 = -0.707336 */
93821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 12237,		/* B0 = 0.373474 */
93831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 7,		/* Internal filter scaling */
93841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
93851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
93861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
93871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
93881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f440_480[] */
93891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		30367,		/* A1 = 1.853455 */
93901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32147,	/* A2 = -0.981079 */
93911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -495,		/* B2 = -0.015113 */
93921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0 */
93931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 495,		/* B0 = 0.015113 */
93941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30322,		/* A1 = 1.850769 */
93951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32543,	/* A2 = -0.993134 */
93961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 10031,		/* B2 = 0.306152 */
93971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -9252,		/* B1 = -0.564728 */
93981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 10031,		/* B0 = 0.306152 */
93991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30770,		/* A1 = 1.878052 */
94001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32563,	/* A2 = -0.993774 */
94011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 22674,		/* B2 = 0.691956 */
94021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -21465,	/* B1 = -1.31012 */
94031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 22674,		/* B0 = 0.691956 */
94041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 7,		/* Internal filter scaling */
94051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
94061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
94071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
94081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
94091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f445 */
94101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		30709,		/* A1 = -1.874329 */
94111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32603,	/* A2 = 0.994965 */
94121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -83,		/* B2 = -0.002545 */
94131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
94141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 83,		/* B0 = 0.002545 */
94151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30704,		/* A1 = -1.874084 */
94161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32692,	/* A2 = 0.997711 */
94171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 10641,		/* B2 = 0.324738 */
94181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -9947,		/* B1 = -0.607147 */
94191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 10641,		/* B0 = 0.324738 */
94201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30796,		/* A1 = -1.879639 */
94211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32694,	/* A2 = 0.997772 */
94221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 10079,		/* B2 = 0.307587 */
94231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 9513,		/* B1 = 0.580688 */
94241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 10079,		/* B0 = 0.307587 */
94251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
94261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
94271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
94281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
94291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
94301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f450 */
94311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		30664,		/* A1 = -1.871643 */
94321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32603,	/* A2 = 0.994965 */
94331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -164,		/* B2 = -0.005029 */
94341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
94351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 164,		/* B0 = 0.005029 */
94361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30661,		/* A1 = -1.871399 */
94371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32692,	/* A2 = 0.997711 */
94381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 15294,		/* B2 = 0.466736 */
94391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -14275,	/* B1 = -0.871307 */
94401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 15294,		/* B0 = 0.466736 */
94411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30751,		/* A1 = -1.876953 */
94421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32694,	/* A2 = 0.997772 */
94431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 3548,		/* B2 = 0.108284 */
94441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -3344,		/* B1 = -0.204155 */
94451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 3548,		/* B0 = 0.108284 */
94461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
94471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
94481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
94491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
94501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
94511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f452 */
94521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		30653,		/* A1 = -1.870911 */
94531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32615,	/* A2 = 0.995361 */
94541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -209,		/* B2 = -0.006382 */
94551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
94561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 209,		/* B0 = 0.006382 */
94571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30647,		/* A1 = -1.870605 */
94581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32702,	/* A2 = 0.997986 */
94591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 18971,		/* B2 = 0.578979 */
94601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -17716,	/* B1 = -1.081299 */
94611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 18971,		/* B0 = 0.578979 */
94621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30738,		/* A1 = -1.876099 */
94631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32702,	/* A2 = 0.998016 */
94641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 2967,		/* B2 = 0.090561 */
94651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -2793,		/* B1 = -0.170502 */
94661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 2967,		/* B0 = 0.090561 */
94671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
94681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
94691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
94701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
94711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
94721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f475 */
94731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		30437,		/* A1 = -1.857727 */
94741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32603,	/* A2 = 0.994965 */
94751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -264,		/* B2 = -0.008062 */
94761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
94771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 264,		/* B0 = 0.008062 */
94781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30430,		/* A1 = -1.857300 */
94791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32692,	/* A2 = 0.997711 */
94801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21681,		/* B2 = 0.661682 */
94811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -20082,	/* B1 = -1.225708 */
94821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21681,		/* B0 = 0.661682 */
94831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30526,		/* A1 = -1.863220 */
94841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32694,	/* A2 = 0.997742 */
94851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 1559,		/* B2 = 0.047600 */
94861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -1459,		/* B1 = -0.089096 */
94871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 1559,		/* B0 = 0.047600 */
94881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
94891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
94901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
94911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
94921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
94931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f480_620[] */
94941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		28975,		/* A1 = 1.768494 */
94951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -30955,	/* A2 = -0.944672 */
94961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -1026,		/* B2 = -0.03133 */
94971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0 */
94981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 1026,		/* B0 = 0.03133 */
94991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 28613,		/* A1 = 1.746399 */
95001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32089,	/* A2 = -0.979309 */
95011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 14214,		/* B2 = 0.433807 */
95021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -12202,	/* B1 = -0.744812 */
95031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 14214,		/* B0 = 0.433807 */
95041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30243,		/* A1 = 1.845947 */
95051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32238,	/* A2 = -0.983856 */
95061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 24825,		/* B2 = 0.757629 */
95071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -23402,	/* B1 = -1.428345 */
95081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 24825,		/* B0 = 0.757629 */
95091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 7,		/* Internal filter scaling */
95101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
95111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
95121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
95131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
95141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f494 */
95151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		30257,		/* A1 = -1.846741 */
95161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32605,	/* A2 = 0.995056 */
95171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -249,		/* B2 = -0.007625 */
95181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
95191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 249,		/* B0 = 0.007625 */
95201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30247,		/* A1 = -1.846191 */
95211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32694,	/* A2 = 0.997772 */
95221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 18088,		/* B2 = 0.552002 */
95231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -16652,	/* B1 = -1.016418 */
95241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 18088,		/* B0 = 0.552002 */
95251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30348,		/* A1 = -1.852295 */
95261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32696,	/* A2 = 0.997803 */
95271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 2099,		/* B2 = 0.064064 */
95281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -1953,		/* B1 = -0.119202 */
95291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 2099,		/* B0 = 0.064064 */
95301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
95311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
95321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
95331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
95341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
95351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f500 */
95361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		30202,		/* A1 = -1.843431 */
95371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32624,	/* A2 = 0.995622 */
95381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -413,		/* B2 = -0.012622 */
95391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
95401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 413,		/* B0 = 0.012622 */
95411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30191,		/* A1 = -1.842721 */
95421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32714,	/* A2 = 0.998364 */
95431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 25954,		/* B2 = 0.792057 */
95441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -23890,	/* B1 = -1.458131 */
95451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 25954,		/* B0 = 0.792057 */
95461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30296,		/* A1 = -1.849172 */
95471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32715,	/* A2 = 0.998397 */
95481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 2007,		/* B2 = 0.061264 */
95491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -1860,		/* B1 = -0.113568 */
95501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 2007,		/* B0 = 0.061264 */
95511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
95521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
95531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
95541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
95551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
95561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f520 */
95571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		30001,		/* A1 = -1.831116 */
95581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32613,	/* A2 = 0.995270 */
95591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -155,		/* B2 = -0.004750 */
95601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
95611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 155,		/* B0 = 0.004750 */
95621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 29985,		/* A1 = -1.830200 */
95631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32710,	/* A2 = 0.998260 */
95641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 6584,		/* B2 = 0.200928 */
95651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -6018,		/* B1 = -0.367355 */
95661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 6584,		/* B0 = 0.200928 */
95671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30105,		/* A1 = -1.837524 */
95681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32712,	/* A2 = 0.998291 */
95691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 23812,		/* B2 = 0.726685 */
95701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -21936,	/* B1 = -1.338928 */
95711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 23812,		/* B0 = 0.726685 */
95721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
95731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
95741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
95751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
95761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
95771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f523 */
95781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		29964,		/* A1 = -1.828918 */
95791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32601,	/* A2 = 0.994904 */
95801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -101,		/* B2 = -0.003110 */
95811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
95821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 101,		/* B0 = 0.003110 */
95831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 29949,		/* A1 = -1.827942 */
95841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32700,	/* A2 = 0.997925 */
95851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 11041,		/* B2 = 0.336975 */
95861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -10075,	/* B1 = -0.614960 */
95871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 11041,		/* B0 = 0.336975 */
95881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30070,		/* A1 = -1.835388 */
95891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32702,	/* A2 = 0.997986 */
95901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 16762,		/* B2 = 0.511536 */
95911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -15437,	/* B1 = -0.942230 */
95921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 16762,		/* B0 = 0.511536 */
95931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
95941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
95951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
95961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
95971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
95981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f525 */
95991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		29936,		/* A1 = -1.827209 */
96001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32584,	/* A2 = 0.994415 */
96011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -91,		/* B2 = -0.002806 */
96021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
96031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 91,		/* B0 = 0.002806 */
96041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 29921,		/* A1 = -1.826233 */
96051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32688,	/* A2 = 0.997559 */
96061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 11449,		/* B2 = 0.349396 */
96071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -10426,	/* B1 = -0.636383 */
96081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 11449,		/* B0 = 0.349396 */
96091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 30045,		/* A1 = -1.833862 */
96101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32688,	/* A2 = 0.997589 */
96111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 13055,		/* B2 = 0.398407 */
96121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -12028,	/* B1 = -0.734161 */
96131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 13055,		/* B0 = 0.398407 */
96141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
96151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
96161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
96171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
96181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
96191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f540_660[] */
96201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		28499,		/* A1 = 1.739441 */
96211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -31129,	/* A2 = -0.949982 */
96221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -849,		/* B2 = -0.025922 */
96231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0 */
96241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 849,		/* B0 = 0.025922 */
96251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 28128,		/* A1 = 1.716797 */
96261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32130,	/* A2 = -0.98056 */
96271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 14556,		/* B2 = 0.444214 */
96281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -12251,	/* B1 = -0.747772 */
96291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 14556,		/* B0 = 0.444244 */
96301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 29667,		/* A1 = 1.81073 */
96311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32244,	/* A2 = -0.984039 */
96321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 23038,		/* B2 = 0.703064 */
96331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -21358,	/* B1 = -1.303589 */
96341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 23040,		/* B0 = 0.703125 */
96351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 7,		/* Internal filter scaling */
96361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
96371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
96381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
96391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
96401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f587 */
96411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		29271,		/* A1 = -1.786560 */
96421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32599,	/* A2 = 0.994873 */
96431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -490,		/* B2 = -0.014957 */
96441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
96451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 490,		/* B0 = 0.014957 */
96461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 29246,		/* A1 = -1.785095 */
96471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32700,	/* A2 = 0.997925 */
96481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 28961,		/* B2 = 0.883850 */
96491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -25796,	/* B1 = -1.574463 */
96501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 28961,		/* B0 = 0.883850 */
96511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 29383,		/* A1 = -1.793396 */
96521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32700,	/* A2 = 0.997955 */
96531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 1299,		/* B2 = 0.039650 */
96541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -1169,		/* B1 = -0.071396 */
96551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 1299,		/* B0 = 0.039650 */
96561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
96571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
96581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
96591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
96601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
96611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f590 */
96621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		29230,		/* A1 = -1.784058 */
96631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32584,	/* A2 = 0.994415 */
96641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -418,		/* B2 = -0.012757 */
96651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
96661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 418,		/* B0 = 0.012757 */
96671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 29206,		/* A1 = -1.782593 */
96681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32688,	/* A2 = 0.997559 */
96691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 36556,		/* B2 = 1.115601 */
96701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32478,	/* B1 = -1.982300 */
96711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 36556,		/* B0 = 1.115601 */
96721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 29345,		/* A1 = -1.791077 */
96731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32688,	/* A2 = 0.997589 */
96741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 897,		/* B2 = 0.027397 */
96751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -808,		/* B1 = -0.049334 */
96761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 897,		/* B0 = 0.027397 */
96771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
96781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
96791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
96801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
96811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
96821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f600 */
96831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		29116,		/* A1 = -1.777100 */
96841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32603,	/* A2 = 0.994965 */
96851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -165,		/* B2 = -0.005039 */
96861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
96871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 165,		/* B0 = 0.005039 */
96881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 29089,		/* A1 = -1.775452 */
96891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32708,	/* A2 = 0.998199 */
96901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 6963,		/* B2 = 0.212494 */
96911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -6172,		/* B1 = -0.376770 */
96921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 6963,		/* B0 = 0.212494 */
96931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 29237,		/* A1 = -1.784485 */
96941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32710,	/* A2 = 0.998230 */
96951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 24197,		/* B2 = 0.738464 */
96961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -21657,	/* B1 = -1.321899 */
96971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 24197,		/* B0 = 0.738464 */
96981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
96991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
97001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
97011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
97021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
97031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f660 */
97041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		28376,		/* A1 = -1.731934 */
97051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32567,	/* A2 = 0.993896 */
97061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -363,		/* B2 = -0.011102 */
97071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
97081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 363,		/* B0 = 0.011102 */
97091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 28337,		/* A1 = -1.729614 */
97101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32683,	/* A2 = 0.997434 */
97111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21766,		/* B2 = 0.664246 */
97121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -18761,	/* B1 = -1.145081 */
97131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21766,		/* B0 = 0.664246 */
97141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 28513,		/* A1 = -1.740356 */
97151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32686,	/* A2 = 0.997498 */
97161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 2509,		/* B2 = 0.076584 */
97171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -2196,		/* B1 = -0.134041 */
97181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 2509,		/* B0 = 0.076584 */
97191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
97201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
97211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
97221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
97231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
97241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f700 */
97251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		27844,		/* A1 = -1.699463 */
97261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32563,	/* A2 = 0.993744 */
97271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -366,		/* B2 = -0.011187 */
97281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
97291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 366,		/* B0 = 0.011187 */
97301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 27797,		/* A1 = -1.696655 */
97311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32686,	/* A2 = 0.997498 */
97321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 22748,		/* B2 = 0.694214 */
97331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -19235,	/* B1 = -1.174072 */
97341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 22748,		/* B0 = 0.694214 */
97351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 27995,		/* A1 = -1.708740 */
97361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32688,	/* A2 = 0.997559 */
97371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 2964,		/* B2 = 0.090477 */
97381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -2546,		/* B1 = -0.155449 */
97391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 2964,		/* B0 = 0.090477 */
97401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
97411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
97421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
97431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
97441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
97451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f740 */
97461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		27297,		/* A1 = -1.666077 */
97471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32551,	/* A2 = 0.993408 */
97481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -345,		/* B2 = -0.010540 */
97491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
97501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 345,		/* B0 = 0.010540 */
97511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 27240,		/* A1 = -1.662598 */
97521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32683,	/* A2 = 0.997406 */
97531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 22560,		/* B2 = 0.688477 */
97541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -18688,	/* B1 = -1.140625 */
97551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 22560,		/* B0 = 0.688477 */
97561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 27461,		/* A1 = -1.676147 */
97571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32684,	/* A2 = 0.997467 */
97581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 3541,		/* B2 = 0.108086 */
97591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -2985,		/* B1 = -0.182220 */
97601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 3541,		/* B0 = 0.108086 */
97611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
97621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
97631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
97641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
97651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
97661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f750 */
97671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		27155,		/* A1 = -1.657410 */
97681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32551,	/* A2 = 0.993408 */
97691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -462,		/* B2 = -0.014117 */
97701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
97711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 462,		/* B0 = 0.014117 */
97721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 27097,		/* A1 = -1.653870 */
97731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32683,	/* A2 = 0.997406 */
97741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 32495,		/* B2 = 0.991699 */
97751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -26776,	/* B1 = -1.634338 */
97761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 32495,		/* B0 = 0.991699 */
97771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 27321,		/* A1 = -1.667542 */
97781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32684,	/* A2 = 0.997467 */
97791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 1835,		/* B2 = 0.056007 */
97801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -1539,		/* B1 = -0.093948 */
97811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 1835,		/* B0 = 0.056007 */
97821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
97831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
97841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
97851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
97861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
97871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f750_1450[] */
97881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		19298,		/* A1 = 1.177917 */
97891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -24471,	/* A2 = -0.746796 */
97901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -4152,		/* B2 = -0.126709 */
97911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0 */
97921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 4152,		/* B0 = 0.126709 */
97931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 12902,		/* A1 = 0.787476 */
97941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -29091,	/* A2 = -0.887817 */
97951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 12491,		/* B2 = 0.38121 */
97961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -1794,		/* B1 = -0.109528 */
97971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 12494,		/* B0 = 0.381317 */
97981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 26291,		/* A1 = 1.604736 */
97991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -30470,	/* A2 = -0.929901 */
98001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 28859,		/* B2 = 0.880737 */
98011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -26084,	/* B1 = -1.592102 */
98021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 28861,		/* B0 = 0.880798 */
98031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 7,		/* Internal filter scaling */
98041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
98051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
98061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
98071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
98081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f770 */
98091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		26867,		/* A1 = -1.639832 */
98101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32551,	/* A2 = 0.993408 */
98111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -123,		/* B2 = -0.003755 */
98121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
98131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 123,		/* B0 = 0.003755 */
98141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 26805,		/* A1 = -1.636108 */
98151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32683,	/* A2 = 0.997406 */
98161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 17297,		/* B2 = 0.527863 */
98171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -14096,	/* B1 = -0.860382 */
98181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 17297,		/* B0 = 0.527863 */
98191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 27034,		/* A1 = -1.650085 */
98201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32684,	/* A2 = 0.997467 */
98211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 12958,		/* B2 = 0.395477 */
98221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -10756,	/* B1 = -0.656525 */
98231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 12958,		/* B0 = 0.395477 */
98241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
98251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
98261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
98271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
98281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
98291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f800 */
98301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		26413,		/* A1 = -1.612122 */
98311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32547,	/* A2 = 0.993286 */
98321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -223,		/* B2 = -0.006825 */
98331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
98341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 223,		/* B0 = 0.006825 */
98351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 26342,		/* A1 = -1.607849 */
98361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32686,	/* A2 = 0.997498 */
98371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 6391,		/* B2 = 0.195053 */
98381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -5120,		/* B1 = -0.312531 */
98391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 6391,		/* B0 = 0.195053 */
98401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 26593,		/* A1 = -1.623108 */
98411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32688,	/* A2 = 0.997559 */
98421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 23681,		/* B2 = 0.722717 */
98431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -19328,	/* B1 = -1.179688 */
98441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 23681,		/* B0 = 0.722717 */
98451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
98461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
98471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
98481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
98491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
98501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f816 */
98511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		26168,		/* A1 = -1.597209 */
98521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32528,	/* A2 = 0.992706 */
98531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -235,		/* B2 = -0.007182 */
98541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
98551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 235,		/* B0 = 0.007182 */
98561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 26092,		/* A1 = -1.592590 */
98571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32675,	/* A2 = 0.997192 */
98581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 20823,		/* B2 = 0.635498 */
98591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -16510,	/* B1 = -1.007751 */
98601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 20823,		/* B0 = 0.635498 */
98611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 26363,		/* A1 = -1.609070 */
98621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32677,	/* A2 = 0.997253 */
98631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 6739,		/* B2 = 0.205688 */
98641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -5459,		/* B1 = -0.333206 */
98651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 6739,		/* B0 = 0.205688 */
98661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
98671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
98681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
98691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
98701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
98711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f850 */
98721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		25641,		/* A1 = -1.565063 */
98731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32536,	/* A2 = 0.992950 */
98741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -121,		/* B2 = -0.003707 */
98751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
98761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 121,		/* B0 = 0.003707 */
98771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 25560,		/* A1 = -1.560059 */
98781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32684,	/* A2 = 0.997437 */
98791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 18341,		/* B2 = 0.559753 */
98801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -14252,	/* B1 = -0.869904 */
98811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 18341,		/* B0 = 0.559753 */
98821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 25837,		/* A1 = -1.577026 */
98831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32684,	/* A2 = 0.997467 */
98841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 16679,		/* B2 = 0.509003 */
98851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -13232,	/* B1 = -0.807648 */
98861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 16679,		/* B0 = 0.509003 */
98871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
98881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
98891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
98901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
98911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
98921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f857_1645[] */
98931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		16415,		/* A1 = 1.001953 */
98941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -23669,	/* A2 = -0.722321 */
98951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -4549,		/* B2 = -0.138847 */
98961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0 */
98971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 4549,		/* B0 = 0.138847 */
98981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 8456,		/* A1 = 0.516174 */
98991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -28996,	/* A2 = -0.884918 */
99001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 13753,		/* B2 = 0.419724 */
99011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -12,		/* B1 = -0.000763 */
99021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 13757,		/* B0 = 0.419846 */
99031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 24632,		/* A1 = 1.503418 */
99041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -30271,	/* A2 = -0.923828 */
99051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 29070,		/* B2 = 0.887146 */
99061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -25265,	/* B1 = -1.542114 */
99071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 29073,		/* B0 = 0.887268 */
99081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 7,		/* Internal filter scaling */
99091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
99101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
99111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
99121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
99131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f900 */
99141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		24806,		/* A1 = -1.514099 */
99151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32501,	/* A2 = 0.991852 */
99161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -326,		/* B2 = -0.009969 */
99171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
99181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 326,		/* B0 = 0.009969 */
99191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 24709,		/* A1 = -1.508118 */
99201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32659,	/* A2 = 0.996674 */
99211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 20277,		/* B2 = 0.618835 */
99221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -15182,	/* B1 = -0.926636 */
99231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 20277,		/* B0 = 0.618835 */
99241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 25022,		/* A1 = -1.527222 */
99251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32661,	/* A2 = 0.996735 */
99261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 4320,		/* B2 = 0.131836 */
99271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -3331,		/* B1 = -0.203339 */
99281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 4320,		/* B0 = 0.131836 */
99291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
99301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
99311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
99321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
99331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
99341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f900_1300[] */
99351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		19776,		/* A1 = 1.207092 */
99361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -27437,	/* A2 = -0.837341 */
99371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -2666,		/* B2 = -0.081371 */
99381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0 */
99391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 2666,		/* B0 = 0.081371 */
99401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 16302,		/* A1 = 0.995026 */
99411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -30354,	/* A2 = -0.926361 */
99421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 10389,		/* B2 = 0.317062 */
99431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -3327,		/* B1 = -0.203064 */
99441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 10389,		/* B0 = 0.317062 */
99451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 24299,		/* A1 = 1.483154 */
99461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -30930,	/* A2 = -0.943909 */
99471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 25016,		/* B2 = 0.763428 */
99481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -21171,	/* B1 = -1.292236 */
99491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 25016,		/* B0 = 0.763428 */
99501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 7,		/* Internal filter scaling */
99511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
99521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
99531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
99541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
99551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f935_1215[] */
99561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		20554,		/* A1 = 1.254517 */
99571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -28764,	/* A2 = -0.877838 */
99581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -2048,		/* B2 = -0.062515 */
99591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0 */
99601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 2048,		/* B0 = 0.062515 */
99611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 18209,		/* A1 = 1.11145 */
99621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -30951,	/* A2 = -0.94458 */
99631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 9390,		/* B2 = 0.286575 */
99641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -3955,		/* B1 = -0.241455 */
99651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 9390,		/* B0 = 0.286575 */
99661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 23902,		/* A1 = 1.458923 */
99671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -31286,	/* A2 = -0.954803 */
99681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 23252,		/* B2 = 0.709595 */
99691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -19132,	/* B1 = -1.167725 */
99701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 23252,		/* B0 = 0.709595 */
99711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 7,		/* Internal filter scaling */
99721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
99731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
99741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
99751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
99761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f941_1477[] */
99771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		17543,		/* A1 = 1.07074 */
99781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -26220,	/* A2 = -0.800201 */
99791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -3298,		/* B2 = -0.100647 */
99801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0 */
99811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 3298,		/* B0 = 0.100647 */
99821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 12423,		/* A1 = 0.75827 */
99831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -30036,	/* A2 = -0.916626 */
99841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 12651,		/* B2 = 0.386078 */
99851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -2444,		/* B1 = -0.14917 */
99861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 12653,		/* B0 = 0.386154 */
99871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 23518,		/* A1 = 1.435425 */
99881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -30745,	/* A2 = -0.938293 */
99891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 27282,		/* B2 = 0.832581 */
99901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -22529,	/* B1 = -1.375122 */
99911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 27286,		/* B0 = 0.832703 */
99921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 7,		/* Internal filter scaling */
99931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
99941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
99951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
99961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
99971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f942 */
99981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		24104,		/* A1 = -1.471252 */
99991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32507,	/* A2 = 0.992065 */
100001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -351,		/* B2 = -0.010722 */
100011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
100021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 351,		/* B0 = 0.010722 */
100031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 23996,		/* A1 = -1.464600 */
100041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32671,	/* A2 = 0.997040 */
100051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 22848,		/* B2 = 0.697266 */
100061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -16639,	/* B1 = -1.015564 */
100071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 22848,		/* B0 = 0.697266 */
100081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 24332,		/* A1 = -1.485168 */
100091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32673,	/* A2 = 0.997101 */
100101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 4906,		/* B2 = 0.149727 */
100111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -3672,		/* B1 = -0.224174 */
100121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 4906,		/* B0 = 0.149727 */
100131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
100141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
100151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
100161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
100171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
100181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f950 */
100191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		23967,		/* A1 = -1.462830 */
100201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32507,	/* A2 = 0.992065 */
100211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -518,		/* B2 = -0.015821 */
100221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
100231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 518,		/* B0 = 0.015821 */
100241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 23856,		/* A1 = -1.456055 */
100251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32671,	/* A2 = 0.997040 */
100261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 26287,		/* B2 = 0.802246 */
100271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -19031,	/* B1 = -1.161560 */
100281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 26287,		/* B0 = 0.802246 */
100291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 24195,		/* A1 = -1.476746 */
100301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32673,	/* A2 = 0.997101 */
100311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 2890,		/* B2 = 0.088196 */
100321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -2151,		/* B1 = -0.131317 */
100331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 2890,		/* B0 = 0.088196 */
100341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
100351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
100361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
100371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
100381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
100391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f950_1400[] */
100401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		18294,		/* A1 = 1.116638 */
100411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -26962,	/* A2 = -0.822845 */
100421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -2914,		/* B2 = -0.088936 */
100431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0 */
100441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 2914,		/* B0 = 0.088936 */
100451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 14119,		/* A1 = 0.861786 */
100461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -30227,	/* A2 = -0.922455 */
100471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 11466,		/* B2 = 0.349945 */
100481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -2833,		/* B1 = -0.172943 */
100491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 11466,		/* B0 = 0.349945 */
100501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 23431,		/* A1 = 1.430115 */
100511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -30828,	/* A2 = -0.940796 */
100521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 25331,		/* B2 = 0.773071 */
100531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -20911,	/* B1 = -1.276367 */
100541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 25331,		/* B0 = 0.773071 */
100551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 7,		/* Internal filter scaling */
100561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
100571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
100581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
100591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
100601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f975 */
100611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		23521,		/* A1 = -1.435608 */
100621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32489,	/* A2 = 0.991516 */
100631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -193,		/* B2 = -0.005915 */
100641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
100651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 193,		/* B0 = 0.005915 */
100661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 23404,		/* A1 = -1.428467 */
100671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32655,	/* A2 = 0.996582 */
100681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 17740,		/* B2 = 0.541412 */
100691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -12567,	/* B1 = -0.767029 */
100701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 17740,		/* B0 = 0.541412 */
100711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 23753,		/* A1 = -1.449829 */
100721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32657,	/* A2 = 0.996613 */
100731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 9090,		/* B2 = 0.277405 */
100741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -6662,		/* B1 = -0.406647 */
100751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 9090,		/* B0 = 0.277405 */
100761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
100771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
100781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
100791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
100801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
100811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f1000 */
100821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		23071,		/* A1 = -1.408203 */
100831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32489,	/* A2 = 0.991516 */
100841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -293,		/* B2 = -0.008965 */
100851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
100861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 293,		/* B0 = 0.008965 */
100871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 22951,		/* A1 = -1.400818 */
100881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32655,	/* A2 = 0.996582 */
100891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5689,		/* B2 = 0.173645 */
100901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -3951,		/* B1 = -0.241150 */
100911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5689,		/* B0 = 0.173645 */
100921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 23307,		/* A1 = -1.422607 */
100931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32657,	/* A2 = 0.996613 */
100941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 18692,		/* B2 = 0.570435 */
100951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -13447,	/* B1 = -0.820770 */
100961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 18692,		/* B0 = 0.570435 */
100971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
100981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
100991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
101001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
101011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
101021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f1020 */
101031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		22701,		/* A1 = -1.385620 */
101041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32474,	/* A2 = 0.991058 */
101051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -292,		/* B2 = -0.008933 */
101061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/*163840      , B1 = 10.000000 */
101071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 292,		/* B0 = 0.008933 */
101081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 22564,		/* A1 = -1.377258 */
101091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32655,	/* A2 = 0.996552 */
101101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 20756,		/* B2 = 0.633423 */
101111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -14176,	/* B1 = -0.865295 */
101121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 20756,		/* B0 = 0.633423 */
101131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 22960,		/* A1 = -1.401428 */
101141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32657,	/* A2 = 0.996613 */
101151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 6520,		/* B2 = 0.198990 */
101161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -4619,		/* B1 = -0.281937 */
101171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 6520,		/* B0 = 0.198990 */
101181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
101191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
101201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
101211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
101221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
101231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f1050 */
101241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		22142,		/* A1 = -1.351501 */
101251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32474,	/* A2 = 0.991058 */
101261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -147,		/* B2 = -0.004493 */
101271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
101281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 147,		/* B0 = 0.004493 */
101291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 22000,		/* A1 = -1.342834 */
101301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32655,	/* A2 = 0.996552 */
101311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 15379,		/* B2 = 0.469360 */
101321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -10237,	/* B1 = -0.624847 */
101331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 15379,		/* B0 = 0.469360 */
101341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 22406,		/* A1 = -1.367554 */
101351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32657,	/* A2 = 0.996613 */
101361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 17491,		/* B2 = 0.533783 */
101371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -12096,	/* B1 = -0.738312 */
101381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 17491,		/* B0 = 0.533783 */
101391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
101401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
101411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
101421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
101431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
101441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f1100_1750[] */
101451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		12973,		/* A1 = 0.79184 */
101461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -24916,	/* A2 = -0.760376 */
101471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 6655,		/* B2 = 0.203102 */
101481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 367,		/* B1 = 0.0224 */
101491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 6657,		/* B0 = 0.203171 */
101501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5915,		/* A1 = 0.361053 */
101511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -29560,	/* A2 = -0.90213 */
101521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -7777,		/* B2 = -0.23735 */
101531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0 */
101541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 7777,		/* B0 = 0.23735 */
101551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 20510,		/* A1 = 1.251892 */
101561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -30260,	/* A2 = -0.923462 */
101571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 26662,		/* B2 = 0.81366 */
101581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -20573,	/* B1 = -1.255737 */
101591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 26668,		/* B0 = 0.813843 */
101601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 7,		/* Internal filter scaling */
101611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
101621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
101631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
101641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
101651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f1140 */
101661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		20392,		/* A1 = -1.244629 */
101671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32460,	/* A2 = 0.990601 */
101681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -270,		/* B2 = -0.008240 */
101691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
101701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 270,		/* B0 = 0.008240 */
101711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 20218,		/* A1 = -1.234009 */
101721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32655,	/* A2 = 0.996582 */
101731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21337,		/* B2 = 0.651154 */
101741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -13044,	/* B1 = -0.796143 */
101751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21337,		/* B0 = 0.651154 */
101761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 20684,		/* A1 = -1.262512 */
101771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32657,	/* A2 = 0.996643 */
101781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 8572,		/* B2 = 0.261612 */
101791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -5476,		/* B1 = -0.334244 */
101801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 8572,		/* B0 = 0.261612 */
101811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
101821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
101831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
101841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
101851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
101861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f1200 */
101871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		19159,		/* A1 = -1.169373 */
101881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32456,	/* A2 = 0.990509 */
101891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -335,		/* B2 = -0.010252 */
101901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
101911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 335,		/* B0 = 0.010252 */
101921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 18966,		/* A1 = -1.157593 */
101931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32661,	/* A2 = 0.996735 */
101941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 6802,		/* B2 = 0.207588 */
101951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -3900,		/* B1 = -0.238098 */
101961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 6802,		/* B0 = 0.207588 */
101971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 19467,		/* A1 = -1.188232 */
101981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32661,	/* A2 = 0.996765 */
101991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 25035,		/* B2 = 0.764008 */
102001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -15049,	/* B1 = -0.918579 */
102011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 25035,		/* B0 = 0.764008 */
102021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
102031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
102041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
102051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
102061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
102071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f1209 */
102081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		18976,		/* A1 = -1.158264 */
102091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32439,	/* A2 = 0.989990 */
102101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -183,		/* B2 = -0.005588 */
102111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
102121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 183,		/* B0 = 0.005588 */
102131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 18774,		/* A1 = -1.145874 */
102141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32650,	/* A2 = 0.996429 */
102151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 15468,		/* B2 = 0.472076 */
102161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -8768,		/* B1 = -0.535217 */
102171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 15468,		/* B0 = 0.472076 */
102181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 19300,		/* A1 = -1.177979 */
102191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32652,	/* A2 = 0.996490 */
102201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 19840,		/* B2 = 0.605499 */
102211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -11842,	/* B1 = -0.722809 */
102221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 19840,		/* B0 = 0.605499 */
102231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
102241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
102251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
102261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
102271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
102281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f1330 */
102291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		16357,		/* A1 = -0.998413 */
102301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32368,	/* A2 = 0.987793 */
102311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -217,		/* B2 = -0.006652 */
102321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
102331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 217,		/* B0 = 0.006652 */
102341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 16107,		/* A1 = -0.983126 */
102351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32601,	/* A2 = 0.994904 */
102361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 11602,		/* B2 = 0.354065 */
102371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -5555,		/* B1 = -0.339111 */
102381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 11602,		/* B0 = 0.354065 */
102391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 16722,		/* A1 = -1.020630 */
102401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32603,	/* A2 = 0.994965 */
102411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 15574,		/* B2 = 0.475311 */
102421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -8176,		/* B1 = -0.499069 */
102431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 15574,		/* B0 = 0.475311 */
102441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
102451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
102461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
102471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
102481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
102491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f1336 */
102501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		16234,		/* A1 = -0.990875 */
102511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 32404,		/* A2 = -0.988922 */
102521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -193,		/* B2 = -0.005908 */
102531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
102541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 193,		/* B0 = 0.005908 */
102551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 15986,		/* A1 = -0.975769 */
102561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32632,	/* A2 = 0.995880 */
102571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 18051,		/* B2 = 0.550903 */
102581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -8658,		/* B1 = -0.528473 */
102591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 18051,		/* B0 = 0.550903 */
102601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 16591,		/* A1 = -1.012695 */
102611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32634,	/* A2 = 0.995941 */
102621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 15736,		/* B2 = 0.480240 */
102631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -8125,		/* B1 = -0.495926 */
102641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 15736,		/* B0 = 0.480240 */
102651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
102661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
102671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
102681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
102691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
102701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f1366 */
102711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		15564,		/* A1 = -0.949982 */
102721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32404,	/* A2 = 0.988922 */
102731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -269,		/* B2 = -0.008216 */
102741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
102751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 269,		/* B0 = 0.008216 */
102761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 15310,		/* A1 = -0.934479 */
102771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32632,	/* A2 = 0.995880 */
102781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 10815,		/* B2 = 0.330063 */
102791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -4962,		/* B1 = -0.302887 */
102801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 10815,		/* B0 = 0.330063 */
102811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 15924,		/* A1 = -0.971924 */
102821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32634,	/* A2 = 0.995941 */
102831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 18880,		/* B2 = 0.576172 */
102841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -9364,		/* B1 = -0.571594 */
102851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 18880,		/* B0 = 0.576172 */
102861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
102871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
102881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
102891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
102901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
102911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f1380 */
102921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		15247,		/* A1 = -0.930603 */
102931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32397,	/* A2 = 0.988708 */
102941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -244,		/* B2 = -0.007451 */
102951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
102961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 244,		/* B0 = 0.007451 */
102971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 14989,		/* A1 = -0.914886 */
102981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32627,	/* A2 = 0.995697 */
102991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 18961,		/* B2 = 0.578644 */
103001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -8498,		/* B1 = -0.518707 */
103011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 18961,		/* B0 = 0.578644 */
103021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 15608,		/* A1 = -0.952667 */
103031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32628,	/* A2 = 0.995758 */
103041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 11145,		/* B2 = 0.340134 */
103051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -5430,		/* B1 = -0.331467 */
103061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 11145,		/* B0 = 0.340134 */
103071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
103081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
103091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
103101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
103111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
103121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f1400 */
103131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		14780,		/* A1 = -0.902130 */
103141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32393,	/* A2 = 0.988586 */
103151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -396,		/* B2 = -0.012086 */
103161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
103171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 396,		/* B0 = 0.012086 */
103181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 14510,		/* A1 = -0.885651 */
103191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32630,	/* A2 = 0.995819 */
103201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 6326,		/* B2 = 0.193069 */
103211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -2747,		/* B1 = -0.167671 */
103221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 6326,		/* B0 = 0.193069 */
103231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 15154,		/* A1 = -0.924957 */
103241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32632,	/* A2 = 0.995850 */
103251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 23235,		/* B2 = 0.709076 */
103261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -10983,	/* B1 = -0.670380 */
103271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 23235,		/* B0 = 0.709076 */
103281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
103291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
103301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
103311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
103321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
103331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f1477 */
103341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		13005,		/* A1 = -0.793793 */
103351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32368,	/* A2 = 0.987823 */
103361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -500,		/* B2 = -0.015265 */
103371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
103381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 500,		/* B0 = 0.015265 */
103391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 12708,		/* A1 = -0.775665 */
103401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32615,	/* A2 = 0.995331 */
103411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 11420,		/* B2 = 0.348526 */
103421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -4306,		/* B1 = -0.262833 */
103431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 11420,		/* B0 = 0.348526 */
103441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 13397,		/* A1 = -0.817688 */
103451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32615,	/* A2 = 0.995361 */
103461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 9454,		/* B2 = 0.288528 */
103471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -3981,		/* B1 = -0.243027 */
103481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 9454,		/* B0 = 0.288528 */
103491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
103501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
103511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
103521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
103531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
103541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f1600 */
103551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		10046,		/* A1 = -0.613190 */
103561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32331,	/* A2 = 0.986694 */
103571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -455,		/* B2 = -0.013915 */
103581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
103591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 455,		/* B0 = 0.013915 */
103601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 9694,		/* A1 = -0.591705 */
103611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32601,	/* A2 = 0.994934 */
103621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 6023,		/* B2 = 0.183815 */
103631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -1708,		/* B1 = -0.104279 */
103641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 6023,		/* B0 = 0.183815 */
103651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 10478,		/* A1 = -0.639587 */
103661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32603,	/* A2 = 0.994965 */
103671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 22031,		/* B2 = 0.672333 */
103681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -7342,		/* B1 = -0.448151 */
103691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 22031,		/* B0 = 0.672333 */
103701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
103711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
103721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
103731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
103741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
103751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f1633_1638[] */
103761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		9181,		/* A1 = 0.560394 */
103771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32256,	/* A2 = -0.984375 */
103781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -556,		/* B2 = -0.016975 */
103791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0 */
103801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 556,		/* B0 = 0.016975 */
103811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 8757,		/* A1 = 0.534515 */
103821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32574,	/* A2 = -0.99408 */
103831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 8443,		/* B2 = 0.25769 */
103841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -2135,		/* B1 = -0.130341 */
103851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 8443,		/* B0 = 0.25769 */
103861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 9691,		/* A1 = 0.591522 */
103871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32574,	/* A2 = -0.99411 */
103881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 15446,		/* B2 = 0.471375 */
103891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -4809,		/* B1 = -0.293579 */
103901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 15446,		/* B0 = 0.471375 */
103911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 7,		/* Internal filter scaling */
103921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
103931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
103941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
103951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
103961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f1800 */
103971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		5076,		/* A1 = -0.309875 */
103981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32304,	/* A2 = 0.985840 */
103991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -508,		/* B2 = -0.015503 */
104001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
104011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 508,		/* B0 = 0.015503 */
104021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 4646,		/* A1 = -0.283600 */
104031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32605,	/* A2 = 0.995026 */
104041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 6742,		/* B2 = 0.205780 */
104051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -878,		/* B1 = -0.053635 */
104061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 6742,		/* B0 = 0.205780 */
104071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5552,		/* A1 = -0.338928 */
104081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32605,	/* A2 = 0.995056 */
104091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 23667,		/* B2 = 0.722260 */
104101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -4297,		/* B1 = -0.262329 */
104111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 23667,		/* B0 = 0.722260 */
104121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
104131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
104141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
104151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
104161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
104171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{			/* f1860 */
104181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		3569,		/* A1 = -0.217865 */
104191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32292,	/* A2 = 0.985504 */
104201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -239,		/* B2 = -0.007322 */
104211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0,		/* B1 = 0.000000 */
104221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 239,		/* B0 = 0.007322 */
104231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 3117,		/* A1 = -0.190277 */
104241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32603,	/* A2 = 0.994965 */
104251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 18658,		/* B2 = 0.569427 */
104261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -1557,		/* B1 = -0.095032 */
104271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 18658,		/* B0 = 0.569427 */
104281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 4054,		/* A1 = -0.247437 */
104291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -32603,	/* A2 = 0.994965 */
104301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 18886,		/* B2 = 0.576385 */
104311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 -2566,		/* B1 = -0.156647 */
104321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 18886,		/* B0 = 0.576385 */
104331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 5,		/* Internal filter scaling */
104341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 159,		/* Minimum in-band energy threshold */
104351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 21,		/* 21/32 in-band to broad-band ratio */
104361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		 0x0FF5		/* shift-mask 0x0FF (look at 16 half-frames) bit count = 5 */
104371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
104381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
104391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_init_filter(IXJ *j, IXJ_FILTER * jf)
104401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
104411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned short cmd;
104421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int cnt, max;
104431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
104441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (jf->filter > 3) {
104451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
104461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
104471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixj_WriteDSPCommand(0x5154 + jf->filter, j))	/* Select Filter */
104481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
104491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
104501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!jf->enable) {
104511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixj_WriteDSPCommand(0x5152, j))		/* Disable Filter */
104521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
104531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -1;
104541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		else
104551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 0;
104561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
104571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixj_WriteDSPCommand(0x5153, j))		/* Enable Filter */
104581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
104591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -1;
104601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* Select the filter (f0 - f3) to use. */
104611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixj_WriteDSPCommand(0x5154 + jf->filter, j))
104621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -1;
104631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
104641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (jf->freq < 12 && jf->freq > 3) {
104651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* Select the frequency for the selected filter. */
104661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixj_WriteDSPCommand(0x5170 + jf->freq, j))
104671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -1;
104681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else if (jf->freq > 11) {
104691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* We need to load a programmable filter set for undefined */
104701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* frequencies.  So we will point the filter to a programmable set. */
104711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* Since there are only 4 filters and 4 programmable sets, we will */
104721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* just point the filter to the same number set and program it for the */
104731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* frequency we want. */
104741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixj_WriteDSPCommand(0x5170 + jf->filter, j))
104751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -1;
104761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (j->ver.low != 0x12) {
104771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmd = 0x515B;
104781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			max = 19;
104791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		} else {
104801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			cmd = 0x515E;
104811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			max = 15;
104821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
104831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixj_WriteDSPCommand(cmd, j))
104841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -1;
104851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		for (cnt = 0; cnt < max; cnt++) {
104861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			if (ixj_WriteDSPCommand(tone_table[jf->freq - 12][cnt], j))
104871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				return -1;
104881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
104891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
104901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->filter_en[jf->filter] = jf->enable;
104911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
104921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
104931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
104941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_init_filter_raw(IXJ *j, IXJ_FILTER_RAW * jfr)
104951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
104961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned short cmd;
104971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int cnt, max;
104981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (jfr->filter > 3) {
104991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
105001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
105011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j))	/* Select Filter */
105021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
105031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
105041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!jfr->enable) {
105051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixj_WriteDSPCommand(0x5152, j))		/* Disable Filter */
105061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -1;
105071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		else
105081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return 0;
105091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
105101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixj_WriteDSPCommand(0x5153, j))		/* Enable Filter */
105111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -1;
105121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		/* Select the filter (f0 - f3) to use. */
105131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixj_WriteDSPCommand(0x5154 + jfr->filter, j))
105141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -1;
105151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
105161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* We need to load a programmable filter set for undefined */
105171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* frequencies.  So we will point the filter to a programmable set. */
105181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Since there are only 4 filters and 4 programmable sets, we will */
105191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* just point the filter to the same number set and program it for the */
105201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* frequency we want. */
105211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixj_WriteDSPCommand(0x5170 + jfr->filter, j))
105221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
105231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (j->ver.low != 0x12) {
105241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cmd = 0x515B;
105251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		max = 19;
105261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
105271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		cmd = 0x515E;
105281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		max = 15;
105291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
105301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ixj_WriteDSPCommand(cmd, j))
105311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
105321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for (cnt = 0; cnt < max; cnt++) {
105331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixj_WriteDSPCommand(jfr->coeff[cnt], j))
105341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -1;
105351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
105361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	j->filter_en[jfr->filter] = jfr->enable;
105371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
105381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
105391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
105401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int ixj_init_tone(IXJ *j, IXJ_TONE * ti)
105411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
105421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int freq0, freq1;
105431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned short data;
105441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ti->freq0) {
105451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		freq0 = ti->freq0;
105461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
105471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		freq0 = 0x7FFF;
105481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
105491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
105501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ti->freq1) {
105511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		freq1 = ti->freq1;
105521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} else {
105531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		freq1 = 0x7FFF;
105541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
105551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
105561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if(ti->tone_index > 12 && ti->tone_index < 28)
105571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
105581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixj_WriteDSPCommand(0x6800 + ti->tone_index, j))
105591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -1;
105601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixj_WriteDSPCommand(0x6000 + (ti->gain1 << 4) + ti->gain0, j))
105611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -1;
105621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		data = freq0;
105631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixj_WriteDSPCommand(data, j))
105641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -1;
105651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		data = freq1;
105661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ixj_WriteDSPCommand(data, j))
105671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -1;
105681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
105691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return freq0;
105701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
105711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
10572