smapi.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:19k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

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