mad16.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:22k
源码类别:

嵌入式Linux

开发平台:

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