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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (C) by Hannu Savolainen 1993-1997
  3.  *
  4.  * mad16.c
  5.  *
  6.  * Initialization code for OPTi MAD16 compatible audio chips. Including
  7.  *
  8.  *      OPTi 82C928     MAD16           (replaced by C929)
  9.  *      OAK OTI-601D    Mozart
  10.  *      OAK OTI-605 Mozart (later version with MPU401 Midi)
  11.  *      OPTi 82C929     MAD16 Pro
  12.  *      OPTi 82C930
  13.  *      OPTi 82C924
  14.  *
  15.  * These audio interface chips don't produce sound themselves. They just
  16.  * connect some other components (OPL-[234] and a WSS compatible codec)
  17.  * to the PC bus and perform I/O, DMA and IRQ address decoding. There is
  18.  * also a UART for the MPU-401 mode (not 82C928/Mozart).
  19.  * The Mozart chip appears to be compatible with the 82C928, although later
  20.  * issues of the card, using the OTI-605 chip, have an MPU-401 compatable Midi
  21.  * port. This port is configured differently to that of the OPTi audio chips.
  22.  *
  23.  * Changes
  24.  *
  25.  * Alan Cox Clean up, added module selections.
  26.  *
  27.  * A. Wik Added support for Opti924 PnP.
  28.  * Improved debugging support. 16-May-1998
  29.  * Fixed bug. 16-Jun-1998
  30.  *
  31.  *      Torsten Duwe            Made Opti924 PnP support non-destructive
  32.  *                                                              23-Dec-1998
  33.  *
  34.  * Paul Grayson Added support for Midi on later Mozart cards.
  35.  * 25-Nov-1999
  36.  * Christoph Hellwig Adapted to module_init/module_exit.
  37.  * Arnaldo C. de Melo got rid of attach_uart401       21-Sep-2000
  38.  *
  39.  * Pavel Rabel Clean up                           Nov-2000
  40.  */
  41. #include <linux/config.h>
  42. #include <linux/init.h>
  43. #include <linux/module.h>
  44. #include <linux/gameport.h>
  45. #include "sound_config.h"
  46. #include "ad1848.h"
  47. #include "sb.h"
  48. #include "mpu401.h"
  49. static int      mad16_conf;
  50. static int      mad16_cdsel;
  51. static struct gameport gameport;
  52. static int      already_initialized = 0;
  53. #define C928 1
  54. #define MOZART 2
  55. #define C929 3
  56. #define C930 4
  57. #define C924    5
  58. /*
  59.  *    Registers
  60.  *
  61.  *      The MAD16 occupies I/O ports 0xf8d to 0xf93 (fixed locations).
  62.  *      All ports are inactive by default. They can be activated by
  63.  *      writing 0xE2 or 0xE3 to the password register. The password is valid
  64.  *      only until the next I/O read or write.
  65.  *
  66.  *      82C930 uses 0xE4 as the password and indirect addressing to access
  67.  *      the config registers.
  68.  */
  69. #define MC0_PORT 0xf8c /* Dummy port */
  70. #define MC1_PORT 0xf8d /* SB address, CD-ROM interface type, joystick */
  71. #define MC2_PORT 0xf8e /* CD-ROM address, IRQ, DMA, plus OPL4 bit */
  72. #define MC3_PORT 0xf8f
  73. #define PASSWD_REG 0xf8f
  74. #define MC4_PORT 0xf90
  75. #define MC5_PORT 0xf91
  76. #define MC6_PORT 0xf92
  77. #define MC7_PORT 0xf93
  78. #define MC8_PORT 0xf94
  79. #define MC9_PORT 0xf95
  80. #define MC10_PORT 0xf96
  81. #define MC11_PORT 0xf97
  82. #define MC12_PORT 0xf98
  83. static int      board_type = C928;
  84. static int     *mad16_osp;
  85. static int c931_detected; /* minor differences from C930 */
  86. static char c924pnp = 0; /* "     "           "    C924 */
  87. static int debug = 0; /* debugging output */
  88. #ifdef DDB
  89. #undef DDB
  90. #endif
  91. #define DDB(x) {if (debug) x;}
  92. static unsigned char mad_read(int port)
  93. {
  94. unsigned long flags;
  95. unsigned char tmp;
  96. save_flags(flags);
  97. cli();
  98. switch (board_type) /* Output password */
  99. {
  100. case C928:
  101. case MOZART:
  102. outb((0xE2), PASSWD_REG);
  103. break;
  104. case C929:
  105. outb((0xE3), PASSWD_REG);
  106. break;
  107. case C930:
  108. /* outb(( 0xE4),  PASSWD_REG); */
  109. break;
  110. case C924:
  111. /* the c924 has its ports relocated by -128 if
  112.    PnP is enabled  -aw */
  113. if (!c924pnp)
  114. outb((0xE5), PASSWD_REG); else
  115. outb((0xE5), PASSWD_REG - 0x80);
  116. break;
  117. }
  118. if (board_type == C930)
  119. {
  120. outb((port - MC0_PORT), 0xe0e); /* Write to index reg */
  121. tmp = inb(0xe0f); /* Read from data reg */
  122. }
  123. else
  124. if (!c924pnp)
  125. tmp = inb(port); else
  126. tmp = inb(port-0x80);
  127. restore_flags(flags);
  128. return tmp;
  129. }
  130. static void mad_write(int port, int value)
  131. {
  132. unsigned long   flags;
  133. save_flags(flags);
  134. cli();
  135. switch (board_type) /* Output password */
  136. {
  137. case C928:
  138. case MOZART:
  139. outb((0xE2), PASSWD_REG);
  140. break;
  141. case C929:
  142. outb((0xE3), PASSWD_REG);
  143. break;
  144. case C930:
  145. /* outb(( 0xE4),  PASSWD_REG); */
  146. break;
  147. case C924:
  148. if (!c924pnp)
  149. outb((0xE5), PASSWD_REG); else
  150. outb((0xE5), PASSWD_REG - 0x80);
  151. break;
  152. }
  153. if (board_type == C930)
  154. {
  155. outb((port - MC0_PORT), 0xe0e); /* Write to index reg */
  156. outb(((unsigned char) (value & 0xff)), 0xe0f);
  157. }
  158. else
  159. if (!c924pnp)
  160. outb(((unsigned char) (value & 0xff)), port); else
  161. outb(((unsigned char) (value & 0xff)), port-0x80);
  162. restore_flags(flags);
  163. }
  164. static int __init detect_c930(void)
  165. {
  166. unsigned char   tmp = mad_read(MC1_PORT);
  167. if ((tmp & 0x06) != 0x06)
  168. {
  169. DDB(printk("Wrong C930 signature (%x)n", tmp));
  170. /* return 0; */
  171. }
  172. mad_write(MC1_PORT, 0);
  173. if (mad_read(MC1_PORT) != 0x06)
  174. {
  175. DDB(printk("Wrong C930 signature2 (%x)n", tmp));
  176. /* return 0; */
  177. }
  178. mad_write(MC1_PORT, tmp); /* Restore bits */
  179. mad_write(MC7_PORT, 0);
  180. if ((tmp = mad_read(MC7_PORT)) != 0)
  181. {
  182. DDB(printk("MC7 not writable (%x)n", tmp));
  183. return 0;
  184. }
  185. mad_write(MC7_PORT, 0xcb);
  186. if ((tmp = mad_read(MC7_PORT)) != 0xcb)
  187. {
  188. DDB(printk("MC7 not writable2 (%x)n", tmp));
  189. return 0;
  190. }
  191. tmp = mad_read(MC0_PORT+18);
  192. if (tmp == 0xff || tmp == 0x00)
  193. return 1;
  194. /* We probably have a C931 */
  195. DDB(printk("Detected C931 config=0x%02xn", tmp));
  196. c931_detected = 1;
  197. /*
  198.          * We cannot configure the chip if it is in PnP mode.
  199.          * If we have a CSN assigned (bit 8 in MC13) we first try
  200.          * a software reset, then a software power off, finally
  201.          * Clearing PnP mode. The last option is not
  202.  * Bit 8 in MC13 
  203.          */
  204. if ((mad_read(MC0_PORT+13) & 0x80) == 0)
  205. return 1;
  206. /* Software reset */
  207. mad_write(MC9_PORT, 0x02);
  208. mad_write(MC9_PORT, 0x00);
  209. if ((mad_read(MC0_PORT+13) & 0x80) == 0)
  210. return 1;
  211. /* Power off, and on again */
  212. mad_write(MC9_PORT, 0xc2);
  213. mad_write(MC9_PORT, 0xc0);
  214. if ((mad_read(MC0_PORT+13) & 0x80) == 0)
  215. return 1;
  216. #if 0
  217. /* Force off PnP mode. This is not recommended because
  218.  * the PnP bios will not recognize the chip on the next
  219.  * warm boot and may assignd different resources to other
  220.  * PnP/PCI cards.
  221.  */
  222. mad_write(MC0_PORT+17, 0x04);
  223. #endif
  224. return 1;
  225. }
  226. static int __init detect_mad16(void)
  227. {
  228. unsigned char tmp, tmp2, bit;
  229. int i, port;
  230. /*
  231.  * Check that reading a register doesn't return bus float (0xff)
  232.  * when the card is accessed using password. This may fail in case
  233.  * the card is in low power mode. Normally at least the power saving
  234.  * mode bit should be 0.
  235.  */
  236. if ((tmp = mad_read(MC1_PORT)) == 0xff)
  237. {
  238. DDB(printk("MC1_PORT returned 0xffn"));
  239. return 0;
  240. }
  241. for (i = 0xf8d; i <= 0xf98; i++)
  242. if (!c924pnp)
  243. DDB(printk("Port %0x (init value) = %0xn", i, mad_read(i))) else
  244. DDB(printk("Port %0x (init value) = %0xn", i-0x80, mad_read(i)));
  245. if (board_type == C930)
  246. return detect_c930();
  247. /*
  248.  * Now check that the gate is closed on first I/O after writing
  249.  * the password. (This is how a MAD16 compatible card works).
  250.  */
  251. if ((tmp2 = inb(MC1_PORT)) == tmp) /* It didn't close */
  252. {
  253. DDB(printk("MC1_PORT didn't close after read (0x%02x)n", tmp2));
  254. return 0;
  255. }
  256. bit  = (c924pnp) ?     0x20 : 0x80;
  257. port = (c924pnp) ? MC2_PORT : MC1_PORT;
  258. tmp = mad_read(port);
  259. mad_write(port, tmp ^ bit); /* Toggle a bit */
  260. if ((tmp2 = mad_read(port)) != (tmp ^ bit)) /* Compare the bit */
  261. {
  262. mad_write(port, tmp); /* Restore */
  263. DDB(printk("Bit revert test failed (0x%02x, 0x%02x)n", tmp, tmp2));
  264. return 0;
  265. }
  266. mad_write(port, tmp); /* Restore */
  267. return 1; /* Bingo */
  268. }
  269. static int __init wss_init(struct address_info *hw_config)
  270. {
  271. int ad_flags = 0;
  272. /*
  273.  *    Verify the WSS parameters
  274.  */
  275. if (check_region(hw_config->io_base, 8))
  276. {
  277. printk(KERN_ERR "MSS: I/O port conflictn");
  278. return 0;
  279. }
  280. if (!ad1848_detect(hw_config->io_base + 4, &ad_flags, mad16_osp))
  281. return 0;
  282. /*
  283.  * Check if the IO port returns valid signature. The original MS Sound
  284.  * system returns 0x04 while some cards (AudioTrix Pro for example)
  285.  * return 0x00.
  286.  */
  287. if ((inb(hw_config->io_base + 3) & 0x3f) != 0x04 &&
  288.     (inb(hw_config->io_base + 3) & 0x3f) != 0x00)
  289. {
  290. DDB(printk("No MSS signature detected on port 0x%x (0x%x)n", hw_config->io_base, inb(hw_config->io_base + 3)));
  291. return 0;
  292. }
  293. if (hw_config->irq > 11)
  294. {
  295. printk(KERN_ERR "MSS: Bad IRQ %dn", hw_config->irq);
  296. return 0;
  297. }
  298. if (hw_config->dma != 0 && hw_config->dma != 1 && hw_config->dma != 3)
  299. {
  300. printk(KERN_ERR "MSS: Bad DMA %dn", hw_config->dma);
  301. return 0;
  302. }
  303. /*
  304.  * Check that DMA0 is not in use with a 8 bit board.
  305.  */
  306. if (hw_config->dma == 0 && inb(hw_config->io_base + 3) & 0x80)
  307. {
  308. printk("MSS: Can't use DMA0 with a 8 bit card/slotn");
  309. return 0;
  310. }
  311. if (hw_config->irq > 7 && hw_config->irq != 9 && inb(hw_config->io_base + 3) & 0x80)
  312. printk(KERN_ERR "MSS: Can't use IRQ%d with a 8 bit card/slotn", hw_config->irq);
  313. return 1;
  314. }
  315. static int __init init_c930(struct address_info *hw_config)
  316. {
  317. unsigned char cfg = 0;
  318. if(c931_detected)
  319. {
  320. /* Bit 0 has reversd meaning. Bits 1 and 2 sese
  321.    reversed on write.
  322.    Support only IDE cdrom. IDE port programmed
  323.    somewhere else. */
  324. cfg =  (cfg & 0x09) ^ 0x07;
  325. }
  326. switch (hw_config->io_base)
  327. {
  328. case 0x530:
  329. cfg |= 0x00;
  330. break;
  331. case 0xe80:
  332. cfg |= 0x10;
  333. break;
  334. case 0xf40:
  335. cfg |= 0x20;
  336. break;
  337. case 0x604:
  338. cfg |= 0x30;
  339. break;
  340. default:
  341. printk(KERN_ERR "MAD16: Invalid codec port %xn", hw_config->io_base);
  342. return 0;
  343. }
  344. mad_write(MC1_PORT, cfg);
  345. /* MC2 is CD configuration. Don't touch it. */
  346. mad_write(MC3_PORT, 0); /* Disable SB mode IRQ and DMA */
  347. /* bit 2 of MC4 reverses it's meaning between the C930
  348.    and the C931. */
  349. cfg = c931_detected ? 0x04 : 0x00;
  350. mad_write(MC4_PORT, 0x52|cfg);
  351. mad_write(MC5_PORT, 0x3C); /* Init it into mode2 */
  352. mad_write(MC6_PORT, 0x02); /* Enable WSS, Disable MPU and SB */
  353. mad_write(MC7_PORT, 0xCB);
  354. mad_write(MC10_PORT, 0x11);
  355. return wss_init(hw_config);
  356. }
  357. static int __init chip_detect(void)
  358. {
  359. int i;
  360. /*
  361.  *    Then try to detect with the old password
  362.  */
  363. board_type = C924;
  364. DDB(printk("Detect using password = 0xE5n"));
  365. if (detect_mad16()) {
  366. return 1;
  367. }
  368. board_type = C928;
  369. DDB(printk("Detect using password = 0xE2n"));
  370. if (detect_mad16())
  371. {
  372. unsigned char model;
  373. if (((model = mad_read(MC3_PORT)) & 0x03) == 0x03) {
  374. DDB(printk("mad16.c: Mozart detectedn"));
  375. board_type = MOZART;
  376. } else {
  377. DDB(printk("mad16.c: 82C928 detected???n"));
  378. board_type = C928;
  379. }
  380. return 1;
  381. }
  382. board_type = C929;
  383. DDB(printk("Detect using password = 0xE3n"));
  384. if (detect_mad16())
  385. {
  386. DDB(printk("mad16.c: 82C929 detectedn"));
  387. return 1;
  388. }
  389. if (inb(PASSWD_REG) != 0xff)
  390. return 0;
  391. /*
  392.  * First relocate MC# registers to 0xe0e/0xe0f, disable password 
  393.  */
  394. outb((0xE4), PASSWD_REG);
  395. outb((0x80), PASSWD_REG);
  396. board_type = C930;
  397. DDB(printk("Detect using password = 0xE4n"));
  398. for (i = 0xf8d; i <= 0xf93; i++)
  399. DDB(printk("port %03x = %02xn", i, mad_read(i)));
  400.         if(detect_mad16()) {
  401. DDB(printk("mad16.c: 82C930 detectedn"));
  402. return 1;
  403. }
  404. /* The C931 has the password reg at F8D */
  405. outb((0xE4), 0xF8D);
  406. outb((0x80), 0xF8D);
  407. DDB(printk("Detect using password = 0xE4 for C931n"));
  408. if (detect_mad16()) {
  409. return 1;
  410. }
  411. board_type = C924;
  412. c924pnp++;
  413. DDB(printk("Detect using password = 0xE5 (again), port offset -0x80n"));
  414. if (detect_mad16()) {
  415. DDB(printk("mad16.c: 82C924 PnP detectedn"));
  416. return 1;
  417. }
  418. c924pnp=0;
  419. return 0;
  420. }
  421. static int __init probe_mad16(struct address_info *hw_config)
  422. {
  423. int i;
  424. static int valid_ports[] = 
  425. {
  426. 0x530, 0xe80, 0xf40, 0x604
  427. };
  428. unsigned char tmp;
  429. unsigned char cs4231_mode = 0;
  430. int ad_flags = 0;
  431. if (already_initialized)
  432. return 0;
  433. mad16_osp = hw_config->osp;
  434. /*
  435.  *    Check that all ports return 0xff (bus float) when no password
  436.  *      is written to the password register.
  437.  */
  438. DDB(printk("--- Detecting MAD16 / Mozart ---n"));
  439. if (!chip_detect())
  440. return 0;
  441. if (board_type == C930)
  442. return init_c930(hw_config);
  443. for (i = 0xf8d; i <= 0xf93; i++)
  444. if (!c924pnp)
  445. DDB(printk("port %03x = %02xn", i, mad_read(i))) else
  446. DDB(printk("port %03x = %02xn", i-0x80, mad_read(i)));
  447. /*
  448.  * Set the WSS address
  449.  */
  450. tmp = (mad_read(MC1_PORT) & 0x0f) | 0x80; /* Enable WSS, Disable SB */
  451. for (i = 0; i < 5; i++)
  452. {
  453. if (i > 3) /* Not a valid port */
  454. {
  455. printk(KERN_ERR "MAD16/Mozart: Bad WSS base address 0x%xn", hw_config->io_base);
  456. return 0;
  457. }
  458. if (valid_ports[i] == hw_config->io_base)
  459. {
  460. tmp |= i << 4; /* WSS port select bits */
  461. break;
  462. }
  463. }
  464. /*
  465.  * Set optional CD-ROM and joystick settings.
  466.  */
  467. tmp &= ~0x0f;
  468. mad_write(MC1_PORT, tmp);
  469. tmp = mad_read(MC2_PORT);
  470. mad_write(MC2_PORT, tmp);
  471. mad_write(MC3_PORT, 0xf0); /* Disable SB */
  472. if (board_type == C924) /* Specific C924 init values */
  473. {
  474. mad_write(MC4_PORT, 0xA0);
  475. mad_write(MC5_PORT, 0x05);
  476. mad_write(MC6_PORT, 0x03);
  477. }
  478. if (!ad1848_detect(hw_config->io_base + 4, &ad_flags, mad16_osp))
  479. return 0;
  480. if (ad_flags & (AD_F_CS4231 | AD_F_CS4248))
  481. cs4231_mode = 0x02; /* CS4248/CS4231 sync delay switch */
  482. if (board_type == C929)
  483. {
  484. mad_write(MC4_PORT, 0xa2);
  485. mad_write(MC5_PORT, 0xA5 | cs4231_mode);
  486. mad_write(MC6_PORT, 0x03); /* Disable MPU401 */
  487. }
  488. else
  489. {
  490. mad_write(MC4_PORT, 0x02);
  491. mad_write(MC5_PORT, 0x30 | cs4231_mode);
  492. }
  493. for (i = 0xf8d; i <= 0xf93; i++) if (!c924pnp)
  494. DDB(printk("port %03x after init = %02xn", i, mad_read(i))) else
  495. DDB(printk("port %03x after init = %02xn", i-0x80, mad_read(i)));
  496. wss_init(hw_config);
  497. return 1;
  498. }
  499. static void __init attach_mad16(struct address_info *hw_config)
  500. {
  501. static signed char     interrupt_bits[12] = {
  502. -1, -1, -1, -1, -1, -1, -1, 0x08, -1, 0x10, 0x18, 0x20
  503. };
  504. signed char bits;
  505. static char     dma_bits[4] = {
  506. 1, 2, 0, 3
  507. };
  508. int config_port = hw_config->io_base + 0, version_port = hw_config->io_base + 3;
  509. int ad_flags = 0, dma = hw_config->dma, dma2 = hw_config->dma2;
  510. unsigned char dma2_bit = 0;
  511. already_initialized = 1;
  512. if (!ad1848_detect(hw_config->io_base + 4, &ad_flags, mad16_osp))
  513. return;
  514. /*
  515.  * Set the IRQ and DMA addresses.
  516.  */
  517. if (board_type == C930 || c924pnp)
  518. interrupt_bits[5] = 0x28; /* Also IRQ5 is possible on C930 */
  519. bits = interrupt_bits[hw_config->irq];
  520. if (bits == -1)
  521. return;
  522. outb((bits | 0x40), config_port);
  523. if ((inb(version_port) & 0x40) == 0)
  524. printk(KERN_ERR "[IRQ Conflict?]n");
  525. /*
  526.  * Handle the capture DMA channel
  527.  */
  528. if (ad_flags & AD_F_CS4231 && dma2 != -1 && dma2 != dma)
  529. {
  530. if (!((dma == 0 && dma2 == 1) ||
  531. (dma == 1 && dma2 == 0) ||
  532. (dma == 3 && dma2 == 0)))
  533. { /* Unsupported combination. Try to swap channels */
  534. int tmp = dma;
  535. dma = dma2;
  536. dma2 = tmp;
  537. }
  538. if ((dma == 0 && dma2 == 1) || (dma == 1 && dma2 == 0) ||
  539. (dma == 3 && dma2 == 0))
  540. {
  541. dma2_bit = 0x04; /* Enable capture DMA */
  542. }
  543. else
  544. {
  545. printk("MAD16: Invalid capture DMAn");
  546. dma2 = dma;
  547. }
  548. }
  549. else dma2 = dma;
  550. outb((bits | dma_bits[dma] | dma2_bit), config_port); /* Write IRQ+DMA setup */
  551. hw_config->slots[0] = ad1848_init("mad16 WSS", hw_config->io_base + 4,
  552.   hw_config->irq,
  553.   dma,
  554.   dma2, 0,
  555.   hw_config->osp,
  556.   THIS_MODULE);
  557. request_region(hw_config->io_base, 4, "mad16 WSS config");
  558. }
  559. static int __init probe_mad16_mpu(struct address_info *hw_config)
  560. {
  561. static int mpu_attached = 0;
  562. unsigned char tmp;
  563. if (!already_initialized) /* The MSS port must be initialized first */
  564. return 0;
  565. if (mpu_attached) /* Don't let them call this twice */
  566. return 0;
  567. mpu_attached = 1;
  568. if (board_type < C929) /* Early chip. No MPU support. Just SB MIDI */
  569. {
  570. #ifdef CONFIG_MAD16_OLDCARD
  571. tmp = mad_read(MC3_PORT);
  572. /* 
  573.  * MAD16 SB base is defined by the WSS base. It cannot be changed 
  574.  * alone.
  575.  * Ignore configured I/O base. Use the active setting. 
  576.  */
  577. if (mad_read(MC1_PORT) & 0x20)
  578. hw_config->io_base = 0x240;
  579. else
  580. hw_config->io_base = 0x220;
  581. switch (hw_config->irq)
  582. {
  583. case 5:
  584. tmp = (tmp & 0x3f) | 0x80;
  585. break;
  586. case 7:
  587. tmp = (tmp & 0x3f);
  588. break;
  589. case 11:
  590. tmp = (tmp & 0x3f) | 0x40;
  591. break;
  592. default:
  593. printk(KERN_ERR "mad16/Mozart: Invalid MIDI IRQn");
  594. return 0;
  595. }
  596. mad_write(MC3_PORT, tmp | 0x04);
  597. hw_config->driver_use_1 = SB_MIDI_ONLY;
  598. if (!sb_dsp_detect(hw_config, 0, 0, NULL))
  599. return 0;
  600. if (mad_read(MC1_PORT) & 0x20)
  601. hw_config->io_base = 0x240;
  602. else
  603. hw_config->io_base = 0x220;
  604. hw_config->name = "Mad16/Mozart";
  605. sb_dsp_init(hw_config, THIS_MODULE);
  606. return 1;
  607. #else
  608. /* assuming all later Mozart cards are identified as
  609.  * either 82C928 or Mozart. If so, following code attempts
  610.  * to set MPU register. TODO - add probing
  611.  */
  612. tmp = mad_read(MC8_PORT);
  613. switch (hw_config->irq)
  614. {
  615. case 5:
  616. tmp |= 0x08;
  617. break;
  618. case 7:
  619. tmp |= 0x10;
  620. break;
  621. case 9:
  622. tmp |= 0x18;
  623. break;
  624. case 10:
  625. tmp |= 0x20;
  626. break;
  627. case 11:
  628. tmp |= 0x28;
  629. break;
  630. default:
  631. printk(KERN_ERR "mad16/MOZART: invalid mpu_irqn");
  632. return 0;
  633. }
  634. switch (hw_config->io_base)
  635. {
  636. case 0x300:
  637. tmp |= 0x01;
  638. break;
  639. case 0x310:
  640. tmp |= 0x03;
  641. break;
  642. case 0x320:
  643. tmp |= 0x05;
  644. break;
  645. case 0x330:
  646. tmp |= 0x07;
  647. break;
  648. default:
  649. printk(KERN_ERR "mad16/MOZART: invalid mpu_ion");
  650. return 0;
  651. }
  652. mad_write(MC8_PORT, tmp); /* write MPU port parameters */
  653. goto probe_401;
  654. #endif
  655. }
  656. tmp = mad_read(MC6_PORT) & 0x83;
  657. tmp |= 0x80; /* MPU-401 enable */
  658. /* Set the MPU base bits */
  659. switch (hw_config->io_base)
  660. {
  661. case 0x300:
  662. tmp |= 0x60;
  663. break;
  664. case 0x310:
  665. tmp |= 0x40;
  666. break;
  667. case 0x320:
  668. tmp |= 0x20;
  669. break;
  670. case 0x330:
  671. tmp |= 0x00;
  672. break;
  673. default:
  674. printk(KERN_ERR "MAD16: Invalid MIDI port 0x%xn", hw_config->io_base);
  675. return 0;
  676. }
  677. /* Set the MPU IRQ bits */
  678. switch (hw_config->irq)
  679. {
  680. case 5:
  681. tmp |= 0x10;
  682. break;
  683. case 7:
  684. tmp |= 0x18;
  685. break;
  686. case 9:
  687. tmp |= 0x00;
  688. break;
  689. case 10:
  690. tmp |= 0x08;
  691. break;
  692. default:
  693. printk(KERN_ERR "MAD16: Invalid MIDI IRQ %dn", hw_config->irq);
  694. break;
  695. }
  696. mad_write(MC6_PORT, tmp); /* Write MPU401 config */
  697. #ifndef CONFIG_MAD16_OLDCARD
  698. probe_401:
  699. #endif
  700. hw_config->driver_use_1 = SB_MIDI_ONLY;
  701. hw_config->name = "Mad16/Mozart";
  702. return probe_uart401(hw_config, THIS_MODULE);
  703. }
  704. static void __exit unload_mad16(struct address_info *hw_config)
  705. {
  706. ad1848_unload(hw_config->io_base + 4,
  707. hw_config->irq,
  708. hw_config->dma,
  709. hw_config->dma2, 0);
  710. release_region(hw_config->io_base, 4);
  711. sound_unload_audiodev(hw_config->slots[0]);
  712. }
  713. static void __exit unload_mad16_mpu(struct address_info *hw_config)
  714. {
  715. #ifdef CONFIG_MAD16_OLDCARD
  716. if (board_type < C929) /* Early chip. No MPU support. Just SB MIDI */
  717. {
  718. sb_dsp_unload(hw_config, 0);
  719. return;
  720. }
  721. #endif
  722. unload_uart401(hw_config);
  723. }
  724. static struct address_info cfg;
  725. static struct address_info cfg_mpu;
  726. static int found_mpu;
  727. static int __initdata mpu_io = 0;
  728. static int __initdata mpu_irq = 0;
  729. static int __initdata io = -1;
  730. static int __initdata dma = -1;
  731. static int __initdata dma16 = -1; /* Set this for modules that need it */
  732. static int __initdata irq = -1;
  733. static int __initdata cdtype = 0;
  734. static int __initdata cdirq = 0;
  735. static int __initdata cdport = 0x340;
  736. static int __initdata cddma = -1;
  737. static int __initdata opl4 = 0;
  738. static int __initdata joystick = 0;
  739. MODULE_PARM(mpu_io, "i");
  740. MODULE_PARM(mpu_irq, "i");
  741. MODULE_PARM(io,"i");
  742. MODULE_PARM(dma,"i");
  743. MODULE_PARM(dma16,"i");
  744. MODULE_PARM(irq,"i");
  745. MODULE_PARM(cdtype,"i");
  746. MODULE_PARM(cdirq,"i");
  747. MODULE_PARM(cdport,"i");
  748. MODULE_PARM(cddma,"i");
  749. MODULE_PARM(opl4,"i");
  750. MODULE_PARM(joystick,"i");
  751. MODULE_PARM(debug,"i");
  752. static int __initdata dma_map[2][8] =
  753. {
  754. {0x03, -1, -1, -1, -1, 0x00, 0x01, 0x02},
  755. {0x03, -1, 0x01, 0x00, -1, -1, -1, -1}
  756. };
  757. static int __initdata irq_map[16] =
  758. {
  759. 0x00, -1, -1, 0x0A,
  760. -1, 0x04, -1, 0x08,
  761. -1, 0x10, 0x14, 0x18,
  762. -1, -1, -1, -1
  763. };
  764. static int __init init_mad16(void)
  765. {
  766. int dmatype = 0;
  767. printk(KERN_INFO "MAD16 audio driver Copyright (C) by Hannu Savolainen 1993-1996n");
  768. printk(KERN_INFO "CDROM ");
  769. switch (cdtype)
  770. {
  771. case 0x00:
  772. printk("Disabled");
  773. cdirq = 0;
  774. break;
  775. case 0x02:
  776. printk("Sony CDU31A");
  777. dmatype = 1;
  778. if(cddma == -1) cddma = 3;
  779. break;
  780. case 0x04:
  781. printk("Mitsumi");
  782. dmatype = 0;
  783. if(cddma == -1) cddma = 5;
  784. break;
  785. case 0x06:
  786. printk("Panasonic Lasermate");
  787. dmatype = 1;
  788. if(cddma == -1) cddma = 3;
  789. break;
  790. case 0x08:
  791. printk("Secondary IDE");
  792. dmatype = 0;
  793. if(cddma == -1) cddma = 5;
  794. break;
  795. case 0x0A:
  796. printk("Primary IDE");
  797. dmatype = 0;
  798. if(cddma == -1) cddma = 5;
  799. break;
  800. default:
  801. printk("n");
  802. printk(KERN_ERR "Invalid CDROM typen");
  803. return -EINVAL;
  804. }
  805.   /*
  806.          *    Build the config words
  807.          */
  808.         mad16_conf = (joystick ^ 1) | cdtype;
  809. mad16_cdsel = 0;
  810.         if (opl4)
  811.                 mad16_cdsel |= 0x20;
  812. if(cdtype){
  813. if (cddma > 7 || cddma < 0 || dma_map[dmatype][cddma] == -1)
  814. {
  815. printk("n");
  816. printk(KERN_ERR "Invalid CDROM DMAn");
  817. return -EINVAL;
  818. }
  819. if (cddma)
  820. printk(", DMA %d", cddma);
  821. else
  822. printk(", no DMA");
  823. if (!cdirq)
  824. printk(", no IRQ");
  825. else if (cdirq < 0 || cdirq > 15 || irq_map[cdirq] == -1)
  826. {
  827.    printk(", invalid IRQ (disabling)");
  828.    cdirq = 0;
  829. }
  830. else printk(", IRQ %d", cdirq);
  831. mad16_cdsel |= dma_map[dmatype][cddma];
  832. if (cdtype < 0x08)
  833. {
  834. switch (cdport)
  835. {
  836. case 0x340:
  837. mad16_cdsel |= 0x00;
  838. break;
  839. case 0x330:
  840. mad16_cdsel |= 0x40;
  841. break;
  842. case 0x360:
  843. mad16_cdsel |= 0x80;
  844. break;
  845. case 0x320:
  846. mad16_cdsel |= 0xC0;
  847. break;
  848. default:
  849. printk(KERN_ERR "Unknown CDROM I/O base %dn", cdport);
  850. return -EINVAL;
  851. }
  852. }
  853. mad16_cdsel |= irq_map[cdirq];
  854. }
  855. printk(".n");
  856. cfg.io_base = io;
  857. cfg.irq = irq;
  858. cfg.dma = dma;
  859. cfg.dma2 = dma16;
  860. if (cfg.io_base == -1 || cfg.dma == -1 || cfg.irq == -1) {
  861. printk(KERN_ERR "I/O, DMA and irq are mandatoryn");
  862. return -EINVAL;
  863. }
  864. if (!probe_mad16(&cfg))
  865. return -ENODEV;
  866. cfg_mpu.io_base = mpu_io;
  867. cfg_mpu.irq = mpu_irq;
  868. attach_mad16(&cfg);
  869. found_mpu = probe_mad16_mpu(&cfg_mpu);
  870. if (joystick == 1) {
  871.         /* register gameport */
  872.                 if (!request_region(0x201, 1, "mad16 gameport"))
  873.                         printk(KERN_ERR "mad16: gameport address 0x201 already in usen");
  874.                 else {
  875. printk(KERN_ERR "mad16: gameport enabled at 0x201n");
  876.                         gameport.io = 0x201;
  877.         gameport_register_port(&gameport);
  878.                 }
  879. }
  880. else printk(KERN_ERR "mad16: gameport disabled.n");
  881. return 0;
  882. }
  883. static void __exit cleanup_mad16(void)
  884. {
  885. if (found_mpu)
  886. unload_mad16_mpu(&cfg_mpu);
  887. unload_mad16(&cfg);
  888. }
  889. module_init(init_mad16);
  890. module_exit(cleanup_mad16);
  891. #ifndef MODULE
  892. static int __init setup_mad16(char *str)
  893. {
  894.         /* io, irq */
  895. int ints[8];
  896. str = get_options(str, ARRAY_SIZE(ints), ints);
  897. io  = ints[1];
  898. irq  = ints[2];
  899. dma  = ints[3];
  900. dma16  = ints[4];
  901. mpu_io  = ints[5];
  902. mpu_irq  = ints[6];
  903. joystick = ints[7];
  904. return 1;
  905. }
  906. __setup("mad16=", setup_mad16);
  907. #endif
  908. MODULE_LICENSE("GPL");