^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * smapi.c -- SMAPI interface routines
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Written By: Mike Sullivan IBM Corporation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Copyright (C) 1999 IBM Corporation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * This program is free software; you can redistribute it and/or modify
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * it under the terms of the GNU General Public License as published by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * the Free Software Foundation; either version 2 of the License, or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * (at your option) any later version.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) * This program is distributed in the hope that it will be useful,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * but WITHOUT ANY WARRANTY; without even the implied warranty of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * GNU General Public License for more details.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) * NO WARRANTY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) * THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) * CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) * LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) * solely responsible for determining the appropriateness of using and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) * distributing the Program and assumes all risks associated with its
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) * exercise of rights under this Agreement, including but not limited to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) * the risks and costs of program errors, damage to or loss of data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) * programs or equipment, and unavailability or interruption of operations.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) * DISCLAIMER OF LIABILITY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) * NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) * DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) * USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) * HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) * You should have received a copy of the GNU General Public License
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) * along with this program; if not, write to the Free Software
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) * 10/23/2000 - Alpha Release
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) * First release to the public
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #include <linux/mc146818rtc.h> /* CMOS defines */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #include "smapi.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #include "mwavedd.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) static unsigned short g_usSmapiPort = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) static int smapi_request(unsigned short inBX, unsigned short inCX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) unsigned short inDI, unsigned short inSI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) unsigned short *outAX, unsigned short *outBX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) unsigned short *outCX, unsigned short *outDX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) unsigned short *outDI, unsigned short *outSI)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) unsigned short myoutAX = 2, *pmyoutAX = &myoutAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) unsigned short myoutBX = 3, *pmyoutBX = &myoutBX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) unsigned short myoutCX = 4, *pmyoutCX = &myoutCX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) unsigned short myoutDX = 5, *pmyoutDX = &myoutDX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) unsigned short myoutDI = 6, *pmyoutDI = &myoutDI;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) unsigned short myoutSI = 7, *pmyoutSI = &myoutSI;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) unsigned short usSmapiOK = -EIO, *pusSmapiOK = &usSmapiOK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) unsigned int inBXCX = (inBX << 16) | inCX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) unsigned int inDISI = (inDI << 16) | inSI;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) int retval = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) PRINTK_5(TRACE_SMAPI, "inBX %x inCX %x inDI %x inSI %x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) inBX, inCX, inDI, inSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) __asm__ __volatile__("movw $0x5380,%%ax\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) "movl %7,%%ebx\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) "shrl $16, %%ebx\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) "movw %7,%%cx\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) "movl %8,%%edi\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) "shrl $16,%%edi\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) "movw %8,%%si\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) "movw %9,%%dx\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) "out %%al,%%dx\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) "out %%al,$0x4F\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) "cmpb $0x53,%%ah\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) "je 2f\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) "1:\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) "orb %%ah,%%ah\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) "jnz 2f\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) "movw %%ax,%0\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) "movw %%bx,%1\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) "movw %%cx,%2\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) "movw %%dx,%3\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) "movw %%di,%4\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) "movw %%si,%5\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) "movw $1,%6\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) "2:\n\t":"=m"(*(unsigned short *) pmyoutAX),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) "=m"(*(unsigned short *) pmyoutBX),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) "=m"(*(unsigned short *) pmyoutCX),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) "=m"(*(unsigned short *) pmyoutDX),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) "=m"(*(unsigned short *) pmyoutDI),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) "=m"(*(unsigned short *) pmyoutSI),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) "=m"(*(unsigned short *) pusSmapiOK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) :"m"(inBXCX), "m"(inDISI), "m"(g_usSmapiPort)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) :"%eax", "%ebx", "%ecx", "%edx", "%edi",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) "%esi");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) PRINTK_8(TRACE_SMAPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) "myoutAX %x myoutBX %x myoutCX %x myoutDX %x myoutDI %x myoutSI %x usSmapiOK %x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) myoutAX, myoutBX, myoutCX, myoutDX, myoutDI, myoutSI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) usSmapiOK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) *outAX = myoutAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) *outBX = myoutBX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) *outCX = myoutCX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) *outDX = myoutDX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) *outDI = myoutDI;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) *outSI = myoutSI;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) retval = (usSmapiOK == 1) ? 0 : -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) PRINTK_2(TRACE_SMAPI, "smapi::smapi_request exit retval %x\n", retval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) int smapi_query_DSP_cfg(SMAPI_DSP_SETTINGS * pSettings)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) int bRC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) unsigned short usAX, usBX, usCX, usDX, usDI, usSI;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) static const unsigned short ausDspBases[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 0x0030, 0x4E30, 0x8E30, 0xCE30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 0x0130, 0x0350, 0x0070, 0x0DB0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) static const unsigned short ausUartBases[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 0x03F8, 0x02F8, 0x03E8, 0x02E8 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) PRINTK_1(TRACE_SMAPI, "smapi::smapi_query_DSP_cfg entry\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) bRC = smapi_request(0x1802, 0x0000, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) if (bRC) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) PRINTK_ERROR(KERN_ERR_MWAVE "smapi::smapi_query_DSP_cfg: Error: Could not get DSP Settings. Aborting.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) return bRC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) PRINTK_1(TRACE_SMAPI, "smapi::smapi_query_DSP_cfg, smapi_request OK\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) pSettings->bDSPPresent = ((usBX & 0x0100) != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) pSettings->bDSPEnabled = ((usCX & 0x0001) != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) pSettings->usDspIRQ = usSI & 0x00FF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) pSettings->usDspDMA = (usSI & 0xFF00) >> 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) if ((usDI & 0x00FF) < ARRAY_SIZE(ausDspBases)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) pSettings->usDspBaseIO = ausDspBases[usDI & 0x00FF];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) pSettings->usDspBaseIO = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) PRINTK_6(TRACE_SMAPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) "smapi::smapi_query_DSP_cfg get DSP Settings bDSPPresent %x bDSPEnabled %x usDspIRQ %x usDspDMA %x usDspBaseIO %x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) pSettings->bDSPPresent, pSettings->bDSPEnabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) pSettings->usDspIRQ, pSettings->usDspDMA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) pSettings->usDspBaseIO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) /* check for illegal values */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) if ( pSettings->usDspBaseIO == 0 )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) PRINTK_ERROR(KERN_ERR_MWAVE "smapi::smapi_query_DSP_cfg: Worry: DSP base I/O address is 0\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) if ( pSettings->usDspIRQ == 0 )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) PRINTK_ERROR(KERN_ERR_MWAVE "smapi::smapi_query_DSP_cfg: Worry: DSP IRQ line is 0\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) bRC = smapi_request(0x1804, 0x0000, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) if (bRC) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) PRINTK_ERROR("smapi::smapi_query_DSP_cfg: Error: Could not get DSP modem settings. Aborting.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) return bRC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) PRINTK_1(TRACE_SMAPI, "smapi::smapi_query_DSP_cfg, smapi_request OK\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) pSettings->bModemEnabled = ((usCX & 0x0001) != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) pSettings->usUartIRQ = usSI & 0x000F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) if (((usSI & 0xFF00) >> 8) < ARRAY_SIZE(ausUartBases)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) pSettings->usUartBaseIO = ausUartBases[(usSI & 0xFF00) >> 8];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) pSettings->usUartBaseIO = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) PRINTK_4(TRACE_SMAPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) "smapi::smapi_query_DSP_cfg get DSP modem settings bModemEnabled %x usUartIRQ %x usUartBaseIO %x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) pSettings->bModemEnabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) pSettings->usUartIRQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) pSettings->usUartBaseIO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) /* check for illegal values */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) if ( pSettings->usUartBaseIO == 0 )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) PRINTK_ERROR(KERN_ERR_MWAVE "smapi::smapi_query_DSP_cfg: Worry: UART base I/O address is 0\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) if ( pSettings->usUartIRQ == 0 )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) PRINTK_ERROR(KERN_ERR_MWAVE "smapi::smapi_query_DSP_cfg: Worry: UART IRQ line is 0\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) PRINTK_2(TRACE_SMAPI, "smapi::smapi_query_DSP_cfg exit bRC %x\n", bRC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) return bRC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) int smapi_set_DSP_cfg(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) int bRC = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) unsigned short usAX, usBX, usCX, usDX, usDI, usSI;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) static const unsigned short ausDspBases[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 0x0030, 0x4E30, 0x8E30, 0xCE30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 0x0130, 0x0350, 0x0070, 0x0DB0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) static const unsigned short ausUartBases[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 0x03F8, 0x02F8, 0x03E8, 0x02E8 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) static const unsigned short ausDspIrqs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 5, 7, 10, 11, 15 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) static const unsigned short ausUartIrqs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 3, 4 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) unsigned short dspio_index = 0, uartio_index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) PRINTK_5(TRACE_SMAPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) "smapi::smapi_set_DSP_cfg entry mwave_3780i_irq %x mwave_3780i_io %x mwave_uart_irq %x mwave_uart_io %x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) mwave_3780i_irq, mwave_3780i_io, mwave_uart_irq, mwave_uart_io);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) if (mwave_3780i_io) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) for (i = 0; i < ARRAY_SIZE(ausDspBases); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) if (mwave_3780i_io == ausDspBases[i])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) if (i == ARRAY_SIZE(ausDspBases)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) PRINTK_ERROR(KERN_ERR_MWAVE "smapi::smapi_set_DSP_cfg: Error: Invalid mwave_3780i_io address %x. Aborting.\n", mwave_3780i_io);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) return bRC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) dspio_index = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) if (mwave_3780i_irq) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) for (i = 0; i < ARRAY_SIZE(ausDspIrqs); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) if (mwave_3780i_irq == ausDspIrqs[i])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) if (i == ARRAY_SIZE(ausDspIrqs)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) PRINTK_ERROR(KERN_ERR_MWAVE "smapi::smapi_set_DSP_cfg: Error: Invalid mwave_3780i_irq %x. Aborting.\n", mwave_3780i_irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) return bRC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) if (mwave_uart_io) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) for (i = 0; i < ARRAY_SIZE(ausUartBases); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) if (mwave_uart_io == ausUartBases[i])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) if (i == ARRAY_SIZE(ausUartBases)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) PRINTK_ERROR(KERN_ERR_MWAVE "smapi::smapi_set_DSP_cfg: Error: Invalid mwave_uart_io address %x. Aborting.\n", mwave_uart_io);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) return bRC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) uartio_index = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) if (mwave_uart_irq) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) for (i = 0; i < ARRAY_SIZE(ausUartIrqs); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) if (mwave_uart_irq == ausUartIrqs[i])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) if (i == ARRAY_SIZE(ausUartIrqs)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) PRINTK_ERROR(KERN_ERR_MWAVE "smapi::smapi_set_DSP_cfg: Error: Invalid mwave_uart_irq %x. Aborting.\n", mwave_uart_irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) return bRC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) if (mwave_uart_irq || mwave_uart_io) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) /* Check serial port A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) bRC = smapi_request(0x1402, 0x0000, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) /* bRC == 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) if (usBX & 0x0100) { /* serial port A is present */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) if (usCX & 1) { /* serial port is enabled */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) if ((usSI & 0xFF) == mwave_uart_irq) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) #ifndef MWAVE_FUTZ_WITH_OTHER_DEVICES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) PRINTK_ERROR(KERN_ERR_MWAVE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) "smapi::smapi_set_DSP_cfg: Serial port A irq %x conflicts with mwave_uart_irq %x\n", usSI & 0xFF, mwave_uart_irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) PRINTK_3(TRACE_SMAPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) "smapi::smapi_set_DSP_cfg: Serial port A irq %x conflicts with mwave_uart_irq %x\n", usSI & 0xFF, mwave_uart_irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) #ifdef MWAVE_FUTZ_WITH_OTHER_DEVICES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) PRINTK_1(TRACE_SMAPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) "smapi::smapi_set_DSP_cfg Disabling conflicting serial port\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) bRC = smapi_request(0x1403, 0x0100, 0, usSI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) bRC = smapi_request(0x1402, 0x0000, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) goto exit_conflict;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) if ((usSI >> 8) == uartio_index) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) #ifndef MWAVE_FUTZ_WITH_OTHER_DEVICES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) PRINTK_ERROR(KERN_ERR_MWAVE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) "smapi::smapi_set_DSP_cfg: Serial port A base I/O address %x conflicts with mwave uart I/O %x\n", ausUartBases[usSI >> 8], ausUartBases[uartio_index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) PRINTK_3(TRACE_SMAPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) "smapi::smapi_set_DSP_cfg: Serial port A base I/O address %x conflicts with mwave uart I/O %x\n", ausUartBases[usSI >> 8], ausUartBases[uartio_index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) #ifdef MWAVE_FUTZ_WITH_OTHER_DEVICES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) PRINTK_1(TRACE_SMAPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) "smapi::smapi_set_DSP_cfg Disabling conflicting serial port A\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) bRC = smapi_request (0x1403, 0x0100, 0, usSI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) bRC = smapi_request (0x1402, 0x0000, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) goto exit_conflict;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) /* Check serial port B */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) bRC = smapi_request(0x1404, 0x0000, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) /* bRC == 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) if (usBX & 0x0100) { /* serial port B is present */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) if (usCX & 1) { /* serial port is enabled */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) if ((usSI & 0xFF) == mwave_uart_irq) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) #ifndef MWAVE_FUTZ_WITH_OTHER_DEVICES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) PRINTK_ERROR(KERN_ERR_MWAVE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) "smapi::smapi_set_DSP_cfg: Serial port B irq %x conflicts with mwave_uart_irq %x\n", usSI & 0xFF, mwave_uart_irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) PRINTK_3(TRACE_SMAPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) "smapi::smapi_set_DSP_cfg: Serial port B irq %x conflicts with mwave_uart_irq %x\n", usSI & 0xFF, mwave_uart_irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) #ifdef MWAVE_FUTZ_WITH_OTHER_DEVICES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) PRINTK_1(TRACE_SMAPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) "smapi::smapi_set_DSP_cfg Disabling conflicting serial port B\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) bRC = smapi_request(0x1405, 0x0100, 0, usSI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) bRC = smapi_request(0x1404, 0x0000, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) goto exit_conflict;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) if ((usSI >> 8) == uartio_index) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) #ifndef MWAVE_FUTZ_WITH_OTHER_DEVICES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) PRINTK_ERROR(KERN_ERR_MWAVE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) "smapi::smapi_set_DSP_cfg: Serial port B base I/O address %x conflicts with mwave uart I/O %x\n", ausUartBases[usSI >> 8], ausUartBases[uartio_index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) PRINTK_3(TRACE_SMAPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) "smapi::smapi_set_DSP_cfg: Serial port B base I/O address %x conflicts with mwave uart I/O %x\n", ausUartBases[usSI >> 8], ausUartBases[uartio_index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) #ifdef MWAVE_FUTZ_WITH_OTHER_DEVICES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) PRINTK_1 (TRACE_SMAPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) "smapi::smapi_set_DSP_cfg Disabling conflicting serial port B\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) bRC = smapi_request (0x1405, 0x0100, 0, usSI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) bRC = smapi_request (0x1404, 0x0000, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) goto exit_conflict;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) /* Check IR port */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) bRC = smapi_request(0x1700, 0x0000, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) bRC = smapi_request(0x1704, 0x0000, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) /* bRC == 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) if ((usCX & 0xff) != 0xff) { /* IR port not disabled */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) if ((usCX & 0xff) == mwave_uart_irq) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) #ifndef MWAVE_FUTZ_WITH_OTHER_DEVICES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) PRINTK_ERROR(KERN_ERR_MWAVE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) "smapi::smapi_set_DSP_cfg: IR port irq %x conflicts with mwave_uart_irq %x\n", usCX & 0xff, mwave_uart_irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) PRINTK_3(TRACE_SMAPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) "smapi::smapi_set_DSP_cfg: IR port irq %x conflicts with mwave_uart_irq %x\n", usCX & 0xff, mwave_uart_irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) #ifdef MWAVE_FUTZ_WITH_OTHER_DEVICES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) PRINTK_1(TRACE_SMAPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) "smapi::smapi_set_DSP_cfg Disabling conflicting IR port\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) bRC = smapi_request(0x1701, 0x0100, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) bRC = smapi_request(0x1700, 0, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) bRC = smapi_request(0x1705, 0x01ff, 0, usSI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) bRC = smapi_request(0x1704, 0x0000, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) goto exit_conflict;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) if ((usSI & 0xff) == uartio_index) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) #ifndef MWAVE_FUTZ_WITH_OTHER_DEVICES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) PRINTK_ERROR(KERN_ERR_MWAVE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) "smapi::smapi_set_DSP_cfg: IR port base I/O address %x conflicts with mwave uart I/O %x\n", ausUartBases[usSI & 0xff], ausUartBases[uartio_index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) PRINTK_3(TRACE_SMAPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) "smapi::smapi_set_DSP_cfg: IR port base I/O address %x conflicts with mwave uart I/O %x\n", ausUartBases[usSI & 0xff], ausUartBases[uartio_index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) #ifdef MWAVE_FUTZ_WITH_OTHER_DEVICES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) PRINTK_1(TRACE_SMAPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) "smapi::smapi_set_DSP_cfg Disabling conflicting IR port\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) bRC = smapi_request(0x1701, 0x0100, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) bRC = smapi_request(0x1700, 0, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) bRC = smapi_request(0x1705, 0x01ff, 0, usSI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) bRC = smapi_request(0x1704, 0x0000, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) goto exit_conflict;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) bRC = smapi_request(0x1802, 0x0000, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) if (mwave_3780i_io) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) usDI = dspio_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) if (mwave_3780i_irq) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) usSI = (usSI & 0xff00) | mwave_3780i_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) bRC = smapi_request(0x1803, 0x0101, usDI, usSI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) bRC = smapi_request(0x1804, 0x0000, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) if (mwave_uart_io) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) usSI = (usSI & 0x00ff) | (uartio_index << 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) if (mwave_uart_irq) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) usSI = (usSI & 0xff00) | mwave_uart_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) bRC = smapi_request(0x1805, 0x0101, 0, usSI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) bRC = smapi_request(0x1802, 0x0000, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) bRC = smapi_request(0x1804, 0x0000, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) /* normal exit: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) PRINTK_1(TRACE_SMAPI, "smapi::smapi_set_DSP_cfg exit\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) exit_conflict:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) /* Message has already been printed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) exit_smapi_request_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) PRINTK_ERROR(KERN_ERR_MWAVE "smapi::smapi_set_DSP_cfg exit on smapi_request error bRC %x\n", bRC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) return bRC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) int smapi_set_DSP_power_state(bool bOn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) int bRC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) unsigned short usAX, usBX, usCX, usDX, usDI, usSI;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) unsigned short usPowerFunction;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) PRINTK_2(TRACE_SMAPI, "smapi::smapi_set_DSP_power_state entry bOn %x\n", bOn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) usPowerFunction = (bOn) ? 1 : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) bRC = smapi_request(0x4901, 0x0000, 0, usPowerFunction,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) PRINTK_2(TRACE_SMAPI, "smapi::smapi_set_DSP_power_state exit bRC %x\n", bRC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) return bRC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) static int SmapiQuerySystemID(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) int bRC = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) unsigned short usAX = 0xffff, usBX = 0xffff, usCX = 0xffff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) usDX = 0xffff, usDI = 0xffff, usSI = 0xffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) printk("smapi::SmapiQUerySystemID entry\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) bRC = smapi_request(0x0000, 0, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) &usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) if (bRC == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) printk("AX=%x, BX=%x, CX=%x, DX=%x, DI=%x, SI=%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) usAX, usBX, usCX, usDX, usDI, usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) printk("smapi::SmapiQuerySystemID smapi_request error\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) return bRC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) #endif /* 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) int smapi_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) int retval = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) unsigned short usSmapiID = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) PRINTK_1(TRACE_SMAPI, "smapi::smapi_init entry\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) spin_lock_irqsave(&rtc_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) usSmapiID = CMOS_READ(0x7C);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) usSmapiID |= (CMOS_READ(0x7D) << 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) spin_unlock_irqrestore(&rtc_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) PRINTK_2(TRACE_SMAPI, "smapi::smapi_init usSmapiID %x\n", usSmapiID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) if (usSmapiID == 0x5349) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) spin_lock_irqsave(&rtc_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) g_usSmapiPort = CMOS_READ(0x7E);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) g_usSmapiPort |= (CMOS_READ(0x7F) << 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) spin_unlock_irqrestore(&rtc_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) if (g_usSmapiPort == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) PRINTK_ERROR("smapi::smapi_init, ERROR unable to read from SMAPI port\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) PRINTK_2(TRACE_SMAPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) "smapi::smapi_init, exit true g_usSmapiPort %x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) g_usSmapiPort);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) retval = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) //SmapiQuerySystemID();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) PRINTK_ERROR("smapi::smapi_init, ERROR invalid usSmapiID\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) retval = -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) }