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