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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * sound/sscape.c
  3.  *
  4.  * Low level driver for Ensoniq SoundScape
  5.  *
  6.  *
  7.  * Copyright (C) by Hannu Savolainen 1993-1997
  8.  *
  9.  * OSS/Free for Linux is distributed under the GNU GENERAL PUBLIC LICENSE (GPL)
  10.  * Version 2 (June 1991). See the "COPYING" file distributed with this software
  11.  * for more info.
  12.  *
  13.  *
  14.  * Thomas Sailer    : ioctl code reworked (vmalloc/vfree removed)
  15.  * Sergey Smitienko : ensoniq p'n'p support
  16.  * Christoph Hellwig : adapted to module_init/module_exit
  17.  * Bartlomiej Zolnierkiewicz : added __init to attach_sscape()
  18.  * Chris Rankin : Specify that this module owns the coprocessor
  19.  * Arnaldo C. de Melo : added missing restore_flags in sscape_pnp_upload_file
  20.  */
  21. #include <linux/init.h>
  22. #include <linux/module.h>
  23. #include "sound_config.h"
  24. #include "sound_firmware.h"
  25. #include <linux/types.h>
  26. #include <linux/errno.h>
  27. #include <linux/signal.h>
  28. #include <linux/fcntl.h>
  29. #include <linux/ctype.h>
  30. #include <linux/stddef.h>
  31. #include <linux/kmod.h>
  32. #include <asm/dma.h>
  33. #include <asm/io.h>
  34. #include <asm/segment.h>
  35. #include <linux/wait.h>
  36. #include <linux/slab.h>
  37. #include <linux/ioport.h>
  38. #include <linux/delay.h>
  39. #include <linux/proc_fs.h>
  40. #include <linux/wrapper.h>
  41. #include "coproc.h"
  42. #include "ad1848.h"
  43. #include "mpu401.h"
  44. /*
  45.  *    I/O ports
  46.  */
  47. #define MIDI_DATA       0
  48. #define MIDI_CTRL       1
  49. #define HOST_CTRL       2
  50. #define TX_READY 0x02
  51. #define RX_READY 0x01
  52. #define HOST_DATA       3
  53. #define ODIE_ADDR       4
  54. #define ODIE_DATA       5
  55. /*
  56.  *    Indirect registers
  57.  */
  58. #define GA_INTSTAT_REG 0
  59. #define GA_INTENA_REG 1
  60. #define GA_DMAA_REG 2
  61. #define GA_DMAB_REG 3
  62. #define GA_INTCFG_REG 4
  63. #define GA_DMACFG_REG 5
  64. #define GA_CDCFG_REG 6
  65. #define GA_SMCFGA_REG 7
  66. #define GA_SMCFGB_REG 8
  67. #define GA_HMCTL_REG 9
  68. /*
  69.  * DMA channel identifiers (A and B)
  70.  */
  71. #define SSCAPE_DMA_A 0
  72. #define SSCAPE_DMA_B 1
  73. #define PORT(name) (devc->base+name)
  74. /*
  75.  * Host commands recognized by the OBP microcode
  76.  */
  77.  
  78. #define CMD_GEN_HOST_ACK 0x80
  79. #define CMD_GEN_MPU_ACK 0x81
  80. #define CMD_GET_BOARD_TYPE 0x82
  81. #define CMD_SET_CONTROL 0x88 /* Old firmware only */
  82. #define CMD_GET_CONTROL 0x89 /* Old firmware only */
  83. #define CTL_MASTER_VOL 0
  84. #define CTL_MIC_MODE 2
  85. #define CTL_SYNTH_VOL 4
  86. #define CTL_WAVE_VOL 7
  87. #define CMD_SET_EXTMIDI 0x8a
  88. #define CMD_GET_EXTMIDI 0x8b
  89. #define CMD_SET_MT32 0x8c
  90. #define CMD_GET_MT32 0x8d
  91. #define CMD_ACK 0x80
  92. #define IC_ODIE 1
  93. #define IC_OPUS 2
  94. typedef struct sscape_info
  95. {
  96. int base, irq, dma;
  97. int codec, codec_irq; /* required to setup pnp cards*/
  98. int codec_type;
  99. int ic_type;
  100. char* raw_buf;
  101. unsigned long raw_buf_phys;
  102. int buffsize; /* -------------------------- */
  103. int ok; /* Properly detected */
  104. int failed;
  105. int dma_allocated;
  106. int codec_audiodev;
  107. int opened;
  108. int *osp;
  109. int my_audiodev;
  110. } sscape_info;
  111. static struct sscape_info adev_info = {
  112. 0
  113. };
  114. static struct sscape_info *devc = &adev_info;
  115. static int sscape_mididev = -1;
  116. /* Some older cards have assigned interrupt bits differently than new ones */
  117. static char valid_interrupts_old[] = {
  118. 9, 7, 5, 15
  119. };
  120. static char valid_interrupts_new[] = {
  121. 9, 5, 7, 10
  122. };
  123. static char *valid_interrupts = valid_interrupts_new;
  124. /*
  125.  * See the bottom of the driver. This can be set by spea =0/1.
  126.  */
  127.  
  128. #ifdef REVEAL_SPEA
  129. static char old_hardware = 1;
  130. #else
  131. static char old_hardware = 0;
  132. #endif
  133. static void sleep(unsigned howlong)
  134. {
  135. current->state = TASK_INTERRUPTIBLE;
  136. schedule_timeout(howlong);
  137. }
  138. static unsigned char sscape_read(struct sscape_info *devc, int reg)
  139. {
  140. unsigned long flags;
  141. unsigned char val;
  142. save_flags(flags);
  143. cli();
  144. outb(reg, PORT(ODIE_ADDR));
  145. val = inb(PORT(ODIE_DATA));
  146. restore_flags(flags);
  147. return val;
  148. }
  149. static void sscape_write(struct sscape_info *devc, int reg, int data)
  150. {
  151. unsigned long flags;
  152. save_flags(flags);
  153. cli();
  154. outb(reg, PORT(ODIE_ADDR));
  155. outb(data, PORT(ODIE_DATA));
  156. restore_flags(flags);
  157. }
  158. static unsigned char sscape_pnp_read_codec(sscape_info* devc, unsigned char reg)
  159. {
  160. unsigned char res;
  161. unsigned long flags;
  162. save_flags(flags);
  163. cli();
  164. outb( reg, devc -> codec);
  165. res = inb (devc -> codec + 1);
  166. restore_flags(flags);
  167. return res;
  168. }
  169. static void sscape_pnp_write_codec(sscape_info* devc, unsigned char reg, unsigned char data)
  170. {
  171. unsigned long flags;
  172. save_flags(flags);
  173. cli();
  174. outb( reg, devc -> codec);
  175. outb( data, devc -> codec + 1);
  176. restore_flags(flags);
  177. }
  178. static void host_open(struct sscape_info *devc)
  179. {
  180. outb((0x00), PORT(HOST_CTRL)); /* Put the board to the host mode */
  181. }
  182. static void host_close(struct sscape_info *devc)
  183. {
  184. outb((0x03), PORT(HOST_CTRL)); /* Put the board to the MIDI mode */
  185. }
  186. static int host_write(struct sscape_info *devc, unsigned char *data, int count)
  187. {
  188. unsigned long flags;
  189. int i, timeout_val;
  190. save_flags(flags);
  191. cli();
  192. /*
  193.  * Send the command and data bytes
  194.  */
  195. for (i = 0; i < count; i++)
  196. {
  197. for (timeout_val = 10000; timeout_val > 0; timeout_val--)
  198. if (inb(PORT(HOST_CTRL)) & TX_READY)
  199. break;
  200. if (timeout_val <= 0)
  201. {
  202.     restore_flags(flags);
  203.     return 0;
  204. }
  205. outb(data[i], PORT(HOST_DATA));
  206. }
  207. restore_flags(flags);
  208. return 1;
  209. }
  210. static int host_read(struct sscape_info *devc)
  211. {
  212. unsigned long flags;
  213. int timeout_val;
  214. unsigned char data;
  215. save_flags(flags);
  216. cli();
  217. /*
  218.  * Read a byte
  219.  */
  220. for (timeout_val = 10000; timeout_val > 0; timeout_val--)
  221. if (inb(PORT(HOST_CTRL)) & RX_READY)
  222. break;
  223. if (timeout_val <= 0)
  224. {
  225. restore_flags(flags);
  226. return -1;
  227. }
  228. data = inb(PORT(HOST_DATA));
  229. restore_flags(flags);
  230. return data;
  231. }
  232. #if 0 /* unused */
  233. static int host_command1(struct sscape_info *devc, int cmd)
  234. {
  235. unsigned char buf[10];
  236. buf[0] = (unsigned char) (cmd & 0xff);
  237. return host_write(devc, buf, 1);
  238. }
  239. #endif /* unused */
  240. static int host_command2(struct sscape_info *devc, int cmd, int parm1)
  241. {
  242. unsigned char buf[10];
  243. buf[0] = (unsigned char) (cmd & 0xff);
  244. buf[1] = (unsigned char) (parm1 & 0xff);
  245. return host_write(devc, buf, 2);
  246. }
  247. static int host_command3(struct sscape_info *devc, int cmd, int parm1, int parm2)
  248. {
  249. unsigned char buf[10];
  250. buf[0] = (unsigned char) (cmd & 0xff);
  251. buf[1] = (unsigned char) (parm1 & 0xff);
  252. buf[2] = (unsigned char) (parm2 & 0xff);
  253. return host_write(devc, buf, 3);
  254. }
  255. static void set_mt32(struct sscape_info *devc, int value)
  256. {
  257. host_open(devc);
  258. host_command2(devc, CMD_SET_MT32, value ? 1 : 0);
  259. if (host_read(devc) != CMD_ACK)
  260. {
  261. /* printk( "SNDSCAPE: Setting MT32 mode failedn"); */
  262. }
  263. host_close(devc);
  264. }
  265. static void set_control(struct sscape_info *devc, int ctrl, int value)
  266. {
  267. host_open(devc);
  268. host_command3(devc, CMD_SET_CONTROL, ctrl, value);
  269. if (host_read(devc) != CMD_ACK)
  270. {
  271. /* printk( "SNDSCAPE: Setting control (%d) failedn",  ctrl); */
  272. }
  273. host_close(devc);
  274. }
  275. static void do_dma(struct sscape_info *devc, int dma_chan, unsigned long buf, int blk_size, int mode)
  276. {
  277. unsigned char temp;
  278. if (dma_chan != SSCAPE_DMA_A)
  279. {
  280. printk(KERN_WARNING "soundscape: Tried to use DMA channel  != A. Why?n");
  281. return;
  282. }
  283. audio_devs[devc->codec_audiodev]->flags &= ~DMA_AUTOMODE;
  284. DMAbuf_start_dma(devc->codec_audiodev, buf, blk_size, mode);
  285. audio_devs[devc->codec_audiodev]->flags |= DMA_AUTOMODE;
  286. temp = devc->dma << 4; /* Setup DMA channel select bits */
  287. if (devc->dma <= 3)
  288. temp |= 0x80; /* 8 bit DMA channel */
  289. temp |= 1; /* Trigger DMA */
  290. sscape_write(devc, GA_DMAA_REG, temp);
  291. temp &= 0xfe; /* Clear DMA trigger */
  292. sscape_write(devc, GA_DMAA_REG, temp);
  293. }
  294. static int verify_mpu(struct sscape_info *devc)
  295. {
  296. /*
  297.  * The SoundScape board could be in three modes (MPU, 8250 and host).
  298.  * If the card is not in the MPU mode, enabling the MPU driver will
  299.  * cause infinite loop (the driver believes that there is always some
  300.  * received data in the buffer.
  301.  *
  302.  * Detect this by looking if there are more than 10 received MIDI bytes
  303.  * (0x00) in the buffer.
  304.  */
  305. int i;
  306. for (i = 0; i < 10; i++)
  307. {
  308. if (inb(devc->base + HOST_CTRL) & 0x80)
  309. return 1;
  310. if (inb(devc->base) != 0x00)
  311. return 1;
  312. }
  313. printk(KERN_WARNING "SoundScape: The device is not in the MPU-401 moden");
  314. return 0;
  315. }
  316. static int sscape_coproc_open(void *dev_info, int sub_device)
  317. {
  318. if (sub_device == COPR_MIDI)
  319. {
  320. set_mt32(devc, 0);
  321. if (!verify_mpu(devc))
  322. return -EIO;
  323. }
  324. return 0;
  325. }
  326. static void sscape_coproc_close(void *dev_info, int sub_device)
  327. {
  328. struct sscape_info *devc = dev_info;
  329. unsigned long   flags;
  330. save_flags(flags);
  331. cli();
  332. if (devc->dma_allocated)
  333. {
  334. sscape_write(devc, GA_DMAA_REG, 0x20); /* DMA channel disabled */
  335. devc->dma_allocated = 0;
  336. }
  337. restore_flags(flags);
  338. return;
  339. }
  340. static void sscape_coproc_reset(void *dev_info)
  341. {
  342. }
  343. static int sscape_download_boot(struct sscape_info *devc, unsigned char *block, int size, int flag)
  344. {
  345. unsigned long flags;
  346. unsigned char temp;
  347. volatile int done, timeout_val;
  348. static unsigned char codec_dma_bits = 0;
  349. if (flag & CPF_FIRST)
  350. {
  351. /*
  352.  * First block. Have to allocate DMA and to reset the board
  353.  * before continuing.
  354.  */
  355. save_flags(flags);
  356. cli();
  357. codec_dma_bits = sscape_read(devc, GA_CDCFG_REG);
  358. if (devc->dma_allocated == 0)
  359. devc->dma_allocated = 1;
  360. restore_flags(flags);
  361. sscape_write(devc, GA_HMCTL_REG, 
  362. (temp = sscape_read(devc, GA_HMCTL_REG)) & 0x3f); /*Reset */
  363. for (timeout_val = 10000; timeout_val > 0; timeout_val--)
  364. sscape_read(devc, GA_HMCTL_REG); /* Delay */
  365. /* Take board out of reset */
  366. sscape_write(devc, GA_HMCTL_REG,
  367. (temp = sscape_read(devc, GA_HMCTL_REG)) | 0x80);
  368. }
  369. /*
  370.  * Transfer one code block using DMA
  371.  */
  372. if (audio_devs[devc->codec_audiodev]->dmap_out->raw_buf == NULL)
  373. {
  374. printk(KERN_WARNING "soundscape: DMA buffer not availablen");
  375. return 0;
  376. }
  377. memcpy(audio_devs[devc->codec_audiodev]->dmap_out->raw_buf, block, size);
  378. save_flags(flags);
  379. cli();
  380. /******** INTERRUPTS DISABLED NOW ********/
  381. do_dma(devc, SSCAPE_DMA_A,
  382.        audio_devs[devc->codec_audiodev]->dmap_out->raw_buf_phys,
  383.        size, DMA_MODE_WRITE);
  384. /*
  385.  * Wait until transfer completes.
  386.  */
  387. done = 0;
  388. timeout_val = 30;
  389. while (!done && timeout_val-- > 0)
  390. {
  391. int resid;
  392. if (HZ / 50)
  393. sleep(HZ / 50);
  394. clear_dma_ff(devc->dma);
  395. if ((resid = get_dma_residue(devc->dma)) == 0)
  396. done = 1;
  397. }
  398. restore_flags(flags);
  399. if (!done)
  400. return 0;
  401. if (flag & CPF_LAST)
  402. {
  403. /*
  404.  * Take the board out of reset
  405.  */
  406. outb((0x00), PORT(HOST_CTRL));
  407. outb((0x00), PORT(MIDI_CTRL));
  408. temp = sscape_read(devc, GA_HMCTL_REG);
  409. temp |= 0x40;
  410. sscape_write(devc, GA_HMCTL_REG, temp); /* Kickstart the board */
  411. /*
  412.  * Wait until the ODB wakes up
  413.  */
  414. save_flags(flags);
  415. cli();
  416. done = 0;
  417. timeout_val = 5 * HZ;
  418. while (!done && timeout_val-- > 0)
  419. {
  420. unsigned char x;
  421. sleep(1);
  422. x = inb(PORT(HOST_DATA));
  423. if (x == 0xff || x == 0xfe) /* OBP startup acknowledge */
  424. {
  425. DDB(printk("Soundscape: Acknowledge = %xn", x));
  426. done = 1;
  427. }
  428. }
  429. sscape_write(devc, GA_CDCFG_REG, codec_dma_bits);
  430. restore_flags(flags);
  431. if (!done)
  432. {
  433. printk(KERN_ERR "soundscape: The OBP didn't respond after code downloadn");
  434. return 0;
  435. }
  436. save_flags(flags);
  437. cli();
  438. done = 0;
  439. timeout_val = 5 * HZ;
  440. while (!done && timeout_val-- > 0)
  441. {
  442. sleep(1);
  443. if (inb(PORT(HOST_DATA)) == 0xfe) /* Host startup acknowledge */
  444. done = 1;
  445. }
  446. restore_flags(flags);
  447. if (!done)
  448. {
  449. printk(KERN_ERR "soundscape: OBP Initialization failed.n");
  450. return 0;
  451. }
  452. printk(KERN_INFO "SoundScape board initialized OKn");
  453. set_control(devc, CTL_MASTER_VOL, 100);
  454. set_control(devc, CTL_SYNTH_VOL, 100);
  455. #ifdef SSCAPE_DEBUG3
  456. /*
  457.  * Temporary debugging aid. Print contents of the registers after
  458.  * downloading the code.
  459.  */
  460. {
  461. int i;
  462. for (i = 0; i < 13; i++)
  463. printk("I%d = %02x (new value)n", i, sscape_read(devc, i));
  464. }
  465. #endif
  466. }
  467. return 1;
  468. }
  469. static int download_boot_block(void *dev_info, copr_buffer * buf)
  470. {
  471. if (buf->len <= 0 || buf->len > sizeof(buf->data))
  472. return -EINVAL;
  473. if (!sscape_download_boot(devc, buf->data, buf->len, buf->flags))
  474. {
  475. printk(KERN_ERR "soundscape: Unable to load microcode block to the OBP.n");
  476. return -EIO;
  477. }
  478. return 0;
  479. }
  480. static int sscape_coproc_ioctl(void *dev_info, unsigned int cmd, caddr_t arg, int local)
  481. {
  482. copr_buffer *buf;
  483. int err;
  484. switch (cmd) 
  485. {
  486. case SNDCTL_COPR_RESET:
  487. sscape_coproc_reset(dev_info);
  488. return 0;
  489. case SNDCTL_COPR_LOAD:
  490. buf = (copr_buffer *) vmalloc(sizeof(copr_buffer));
  491. if (buf == NULL)
  492. return -ENOSPC;
  493. if (copy_from_user(buf, arg, sizeof(copr_buffer))) 
  494. {
  495. vfree(buf);
  496. return -EFAULT;
  497. }
  498. err = download_boot_block(dev_info, buf);
  499. vfree(buf);
  500. return err;
  501. default:
  502. return -EINVAL;
  503. }
  504. }
  505. static coproc_operations sscape_coproc_operations =
  506. {
  507. "SoundScape M68K",
  508. THIS_MODULE,
  509. sscape_coproc_open,
  510. sscape_coproc_close,
  511. sscape_coproc_ioctl,
  512. sscape_coproc_reset,
  513. &adev_info
  514. };
  515. static int sscape_detected = 0;
  516. static int sscape_is_pnp   = 0;
  517. void __init attach_sscape(struct address_info *hw_config)
  518. {
  519. #ifndef SSCAPE_REGS
  520. /*
  521.  * Config register values for Spea/V7 Media FX and Ensoniq S-2000.
  522.  * These values are card
  523.  * dependent. If you have another SoundScape based card, you have to
  524.  * find the correct values. Do the following:
  525.  *  - Compile this driver with SSCAPE_DEBUG1 defined.
  526.  *  - Shut down and power off your machine.
  527.  *  - Boot with DOS so that the SSINIT.EXE program is run.
  528.  *  - Warm boot to {Linux|SYSV|BSD} and write down the lines displayed
  529.  *    when detecting the SoundScape.
  530.  *  - Modify the following list to use the values printed during boot.
  531.  *    Undefine the SSCAPE_DEBUG1
  532.  */
  533. #define SSCAPE_REGS { 
  534. /* I0 */ 0x00, 
  535. /* I1 */ 0xf0, /* Note! Ignored. Set always to 0xf0 */ 
  536. /* I2 */ 0x20, /* Note! Ignored. Set always to 0x20 */ 
  537. /* I3 */ 0x20, /* Note! Ignored. Set always to 0x20 */ 
  538. /* I4 */ 0xf5, /* Ignored */ 
  539. /* I5 */ 0x10, 
  540. /* I6 */ 0x00, 
  541. /* I7 */ 0x2e, /* I7 MEM config A. Likely to vary between models */ 
  542. /* I8 */ 0x00, /* I8 MEM config B. Likely to vary between models */ 
  543. /* I9 */ 0x40 /* Ignored */ 
  544. }
  545. #endif
  546. unsigned long   flags;
  547. static unsigned char regs[10] = SSCAPE_REGS;
  548. int i, irq_bits = 0xff;
  549. if (sscape_detected != hw_config->io_base)
  550. return;
  551. request_region(devc->base + 2, 6, "SoundScape");
  552. if (old_hardware)
  553. {
  554. valid_interrupts = valid_interrupts_old;
  555. conf_printf("Ensoniq SoundScape (old)", hw_config);
  556. }
  557. else
  558. conf_printf("Ensoniq SoundScape", hw_config);
  559. for (i = 0; i < sizeof(valid_interrupts); i++)
  560. {
  561. if (hw_config->irq == valid_interrupts[i])
  562. {
  563. irq_bits = i;
  564. break;
  565. }
  566. }
  567. if (hw_config->irq > 15 || (regs[4] = irq_bits == 0xff))
  568. {
  569. printk(KERN_ERR "Invalid IRQ%dn", hw_config->irq);
  570. return;
  571. }
  572. if (!sscape_is_pnp) {
  573.     save_flags(flags);
  574.     cli();
  575.     for (i = 1; i < 10; i++)
  576.     {
  577. switch (i)
  578. {
  579. case 1: /* Host interrupt enable */
  580. sscape_write(devc, i, 0xf0); /* All interrupts enabled */
  581. break;
  582. case 2: /* DMA A status/trigger register */
  583. case 3: /* DMA B status/trigger register */
  584. sscape_write(devc, i, 0x20); /* DMA channel disabled */
  585. break;
  586. case 4: /* Host interrupt config reg */
  587. sscape_write(devc, i, 0xf0 | (irq_bits << 2) | irq_bits);
  588. break;
  589. case 5: /* Don't destroy CD-ROM DMA config bits (0xc0) */
  590. sscape_write(devc, i, (regs[i] & 0x3f) | (sscape_read(devc, i) & 0xc0));
  591. break;
  592. case 6: /* CD-ROM config (WSS codec actually) */
  593. sscape_write(devc, i, regs[i]);
  594. break;
  595. case 9: /* Master control reg. Don't modify CR-ROM bits. Disable SB emul */
  596. sscape_write(devc, i, (sscape_read(devc, i) & 0xf0) | 0x08);
  597. break;
  598. default:
  599. sscape_write(devc, i, regs[i]);
  600. }
  601.     }
  602.     restore_flags(flags);
  603. }
  604. #ifdef SSCAPE_DEBUG2
  605. /*
  606.  * Temporary debugging aid. Print contents of the registers after
  607.  * changing them.
  608.  */
  609. {
  610. int i;
  611. for (i = 0; i < 13; i++)
  612. printk("I%d = %02x (new value)n", i, sscape_read(devc, i));
  613. }
  614. #endif
  615. if (probe_mpu401(hw_config))
  616. hw_config->always_detect = 1;
  617. hw_config->name = "SoundScape";
  618. hw_config->irq *= -1; /* Negative value signals IRQ sharing */
  619. attach_mpu401(hw_config, THIS_MODULE);
  620. hw_config->irq *= -1; /* Restore it */
  621. if (hw_config->slots[1] != -1) /* The MPU driver installed itself */
  622. {
  623. sscape_mididev = hw_config->slots[1];
  624. midi_devs[hw_config->slots[1]]->coproc = &sscape_coproc_operations;
  625. }
  626. sscape_write(devc, GA_INTENA_REG, 0x80); /* Master IRQ enable */
  627. devc->ok = 1;
  628. devc->failed = 0;
  629. }
  630. static int detect_ga(sscape_info * devc)
  631. {
  632. unsigned char save;
  633. DDB(printk("Entered Soundscape detect_ga(%x)n", devc->base));
  634. if (check_region(devc->base, 8))
  635. return 0;
  636. /*
  637.  * First check that the address register of "ODIE" is
  638.  * there and that it has exactly 4 writable bits.
  639.  * First 4 bits
  640.  */
  641. if ((save = inb(PORT(ODIE_ADDR))) & 0xf0)
  642. {
  643. DDB(printk("soundscape: Detect error An"));
  644. return 0;
  645. }
  646. outb((0x00), PORT(ODIE_ADDR));
  647. if (inb(PORT(ODIE_ADDR)) != 0x00)
  648. {
  649. DDB(printk("soundscape: Detect error Bn"));
  650. return 0;
  651. }
  652. outb((0xff), PORT(ODIE_ADDR));
  653. if (inb(PORT(ODIE_ADDR)) != 0x0f)
  654. {
  655. DDB(printk("soundscape: Detect error Cn"));
  656. return 0;
  657. }
  658. outb((save), PORT(ODIE_ADDR));
  659. /*
  660.  * Now verify that some indirect registers return zero on some bits.
  661.  * This may break the driver with some future revisions of "ODIE" but...
  662.  */
  663. if (sscape_read(devc, 0) & 0x0c)
  664. {
  665. DDB(printk("soundscape: Detect error D (%x)n", sscape_read(devc, 0)));
  666. return 0;
  667. }
  668. if (sscape_read(devc, 1) & 0x0f)
  669. {
  670. DDB(printk("soundscape: Detect error En"));
  671. return 0;
  672. }
  673. if (sscape_read(devc, 5) & 0x0f)
  674. {
  675. DDB(printk("soundscape: Detect error Fn"));
  676. return 0;
  677. }
  678. return 1;
  679. }
  680. static int sscape_read_host_ctrl(sscape_info* devc)
  681. {
  682. return host_read(devc);
  683. }
  684. static void sscape_write_host_ctrl2(sscape_info *devc, int a, int b)
  685. {
  686. host_command2(devc, a, b);
  687. }
  688. static int sscape_alloc_dma(sscape_info *devc)
  689. {
  690. char *start_addr, *end_addr;
  691. int dma_pagesize;
  692. int sz, size;
  693. struct page *page;
  694. if (devc->raw_buf != NULL) return 0; /* Already done */
  695. dma_pagesize = (devc->dma < 4) ? (64 * 1024) : (128 * 1024);
  696. devc->raw_buf = NULL;
  697. devc->buffsize = 8192*4;
  698. if (devc->buffsize > dma_pagesize) devc->buffsize = dma_pagesize;
  699. start_addr = NULL;
  700. /*
  701.  * Now loop until we get a free buffer. Try to get smaller buffer if
  702.  * it fails. Don't accept smaller than 8k buffer for performance
  703.  * reasons.
  704.  */
  705. while (start_addr == NULL && devc->buffsize > PAGE_SIZE) {
  706. for (sz = 0, size = PAGE_SIZE; size < devc->buffsize; sz++, size <<= 1);
  707. devc->buffsize = PAGE_SIZE * (1 << sz);
  708. start_addr = (char *) __get_free_pages(GFP_ATOMIC|GFP_DMA, sz);
  709. if (start_addr == NULL) devc->buffsize /= 2;
  710. }
  711. if (start_addr == NULL) {
  712. printk(KERN_ERR "sscape pnp init error: Couldn't allocate DMA buffern");
  713. return 0;
  714. } else {
  715. /* make some checks */
  716. end_addr = start_addr + devc->buffsize - 1;
  717. /* now check if it fits into the same dma-pagesize */
  718. if (((long) start_addr & ~(dma_pagesize - 1)) != ((long) end_addr & ~(dma_pagesize - 1))
  719.     || end_addr >= (char *) (MAX_DMA_ADDRESS)) {
  720. printk(KERN_ERR "sscape pnp: Got invalid address 0x%lx for %db DMA-buffern", (long) start_addr, devc->buffsize);
  721. return 0;
  722. }
  723. }
  724. devc->raw_buf = start_addr;
  725. devc->raw_buf_phys = virt_to_bus(start_addr);
  726. for (page = virt_to_page(start_addr); page <= virt_to_page(end_addr); page++)
  727. mem_map_reserve(page);
  728. return 1;
  729. }
  730. static void sscape_free_dma(sscape_info *devc)
  731. {
  732. int sz, size;
  733. unsigned long start_addr, end_addr;
  734. struct page *page;
  735. if (devc->raw_buf == NULL) return;
  736. for (sz = 0, size = PAGE_SIZE; size < devc->buffsize; sz++, size <<= 1);
  737. start_addr = (unsigned long) devc->raw_buf;
  738. end_addr = start_addr + devc->buffsize;
  739. for (page = virt_to_page(start_addr); page <= virt_to_page(end_addr); page++)
  740. mem_map_unreserve(page);
  741. free_pages((unsigned long) devc->raw_buf, sz);
  742. devc->raw_buf = NULL;
  743. }
  744. /* Intel version !!!!!!!!! */
  745. static int sscape_start_dma(int chan, unsigned long physaddr, int count, int dma_mode)
  746. {
  747. unsigned long flags;
  748. flags = claim_dma_lock();
  749. disable_dma(chan);
  750. clear_dma_ff(chan);
  751. set_dma_mode(chan, dma_mode);
  752. set_dma_addr(chan, physaddr);
  753. set_dma_count(chan, count);
  754. enable_dma(chan);
  755. release_dma_lock(flags);
  756. return 0;
  757. }
  758. static void sscape_pnp_start_dma(sscape_info* devc, int arg )
  759. {
  760. int reg;
  761. if (arg == 0) reg = 2;
  762. else reg = 3;
  763. sscape_write(devc, reg, sscape_read( devc, reg) | 0x01);
  764. sscape_write(devc, reg, sscape_read( devc, reg) & 0xFE);
  765. }
  766. static int sscape_pnp_wait_dma (sscape_info* devc, int arg )
  767. {
  768. int reg;
  769. unsigned long i;
  770. unsigned char d;
  771. if (arg == 0) reg = 2;
  772. else reg = 3;
  773. sleep ( 1 );
  774. i = 0;
  775. do {
  776. d = sscape_read(devc, reg) & 1;
  777. if ( d == 1)  break;
  778. i++;
  779. } while (i < 500000);
  780. d = sscape_read(devc, reg) & 1; 
  781. return d;
  782. }
  783. static int sscape_pnp_alloc_dma(sscape_info* devc)
  784. {
  785. /* printk(KERN_INFO "sscape: requesting dman"); */
  786. if (request_dma(devc -> dma, "sscape")) return 0;
  787. /* printk(KERN_INFO "sscape: dma channel allocatedn"); */
  788. if (!sscape_alloc_dma(devc)) {
  789. free_dma(devc -> dma);
  790. return 0;
  791. };
  792. return 1;
  793. }
  794. static void sscape_pnp_free_dma(sscape_info* devc)
  795. {
  796. sscape_free_dma( devc);
  797. free_dma(devc -> dma );
  798. /* printk(KERN_INFO "sscape: dma releasedn"); */
  799. }
  800. static int sscape_pnp_upload_file(sscape_info* devc, char* fn)
  801. {
  802. int       done = 0;
  803. int       timeout_val;
  804. char*       data,*dt;
  805. int       len,l;
  806. unsigned long flags;
  807. sscape_write( devc, 9, sscape_read(devc, 9 )  & 0x3F );
  808. sscape_write( devc, 2, (devc -> dma << 4) | 0x80 );
  809. sscape_write( devc, 3, 0x20 );
  810. sscape_write( devc, 9, sscape_read( devc, 9 )  | 0x80 );
  811. len = mod_firmware_load(fn, &data);
  812. if (len == 0) {
  813.     printk(KERN_ERR "sscape: file not found: %sn", fn);
  814.     return 0;
  815. }
  816. dt = data;
  817. save_flags(flags);
  818. cli();
  819. while ( len > 0 ) {
  820. if (len > devc -> buffsize) l = devc->buffsize;
  821. else l = len;
  822. len -= l;
  823. memcpy(devc->raw_buf, dt, l); dt += l;
  824. sscape_start_dma(devc->dma, devc->raw_buf_phys, l, 0x48);
  825. sscape_pnp_start_dma ( devc, 0 );
  826. if (sscape_pnp_wait_dma ( devc, 0 ) == 0) {
  827. restore_flags(flags);     
  828. return 0;
  829. }
  830. }
  831. restore_flags(flags);     
  832. vfree(data);
  833. outb(0, devc -> base + 2);
  834. outb(0, devc -> base);
  835. sscape_write ( devc, 9, sscape_read( devc, 9 ) | 0x40);
  836. timeout_val = 5 * HZ; 
  837. while (!done && timeout_val-- > 0)
  838. {
  839. unsigned char x;
  840. sleep(1);
  841. x = inb( devc -> base + 3);
  842. if (x == 0xff || x == 0xfe) /* OBP startup acknowledge */
  843. {
  844. //printk(KERN_ERR "Soundscape: Acknowledge = %xn", x);
  845. done = 1;
  846. }
  847. }
  848. timeout_val = 5 * HZ;
  849. done = 0;
  850. while (!done && timeout_val-- > 0)
  851. {
  852. unsigned char x;
  853. sleep(1);
  854. x = inb( devc -> base + 3);
  855. if (x == 0xfe) /* OBP startup acknowledge */
  856. {
  857. //printk(KERN_ERR "Soundscape: Acknowledge = %xn", x);
  858. done = 1;
  859. }
  860. }
  861. if ( !done ) printk(KERN_ERR "soundscape: OBP Initialization failed.n");
  862. sscape_write( devc, 2, devc->ic_type == IC_ODIE ? 0x70 : 0x40);
  863. sscape_write( devc, 3, (devc -> dma << 4) + 0x80);
  864. return 1;
  865. }
  866. static void __init sscape_pnp_init_hw(sscape_info* devc)
  867. {
  868. unsigned char midi_irq = 0, sb_irq = 0;
  869. unsigned i;
  870. static char code_file_name[23] = "/sndscape/sndscape.cox";
  871. int sscape_sb_enable = 0;
  872. int sscape_joystic_enable = 0x7f;
  873. int sscape_mic_enable = 0;
  874. int sscape_ext_midi = 0;
  875. if ( !sscape_pnp_alloc_dma(devc) ) {
  876. printk(KERN_ERR "sscape: faild to allocate dman");
  877. return;
  878. }
  879. for (i = 0; i < 4; i++) {
  880. if ( devc -> irq   == valid_interrupts[i] ) 
  881. midi_irq = i;
  882. if ( devc -> codec_irq == valid_interrupts[i] ) 
  883. sb_irq = i;
  884. }
  885. sscape_write( devc, 5, 0x50);
  886. sscape_write( devc, 7, 0x2e);
  887. sscape_write( devc, 8, 0x00);
  888. sscape_write( devc, 2, devc->ic_type == IC_ODIE ? 0x70 : 0x40);
  889. sscape_write( devc, 3, ( devc -> dma << 4) | 0x80);
  890. if ( sscape_sb_enable )
  891. sscape_write (devc, 4, 0xF0 | (sb_irq << 2) | midi_irq);
  892. else
  893. sscape_write (devc, 4, 0xF0 | (midi_irq<<2) | midi_irq);
  894. i = 0x10; //sscape_read(devc, 9) & (devc->ic_type == IC_ODIE ? 0xf0 : 0xc0);
  895. if ( sscape_sb_enable )
  896. i |= devc->ic_type == IC_ODIE ? 0x05 : 0x07;     
  897. if (sscape_joystic_enable) i |= 8;
  898. sscape_write (devc, 9, i);
  899. sscape_write (devc, 6, 0x80);
  900. sscape_write (devc, 1, 0x80);
  901. if (devc -> codec_type == 2) {
  902. sscape_pnp_write_codec( devc, 0x0C, 0x50);
  903. sscape_pnp_write_codec( devc, 0x10, sscape_pnp_read_codec( devc, 0x10) & 0x3F);
  904. sscape_pnp_write_codec( devc, 0x11, sscape_pnp_read_codec( devc, 0x11) | 0xC0);
  905. sscape_pnp_write_codec( devc, 29, 0x20);
  906. }
  907. if (sscape_pnp_upload_file(devc, "/sndscape/scope.cod") == 0 ) {
  908. printk(KERN_ERR "sscape: faild to upload file /sndscape/scope.codn");
  909. sscape_pnp_free_dma(devc);
  910. return;
  911. }
  912. i = sscape_read_host_ctrl( devc );
  913. if ( (i & 0x0F) >  7 ) {
  914. printk(KERN_ERR "sscape: scope.cod faildn");
  915. sscape_pnp_free_dma(devc);
  916. return;
  917. }
  918. if ( i & 0x10 ) sscape_write( devc, 7, 0x2F);
  919. code_file_name[21] = (char) ( i & 0x0F) + 0x30;
  920. if (sscape_pnp_upload_file( devc, code_file_name) == 0) {
  921. printk(KERN_ERR "sscape: faild to upload file %sn", code_file_name);
  922. sscape_pnp_free_dma(devc);
  923. return;
  924. }
  925. if (devc->ic_type != IC_ODIE) {
  926. sscape_pnp_write_codec( devc, 10, (sscape_pnp_read_codec(devc, 10) & 0x7f) |
  927.  ( sscape_mic_enable == 0 ? 0x00 : 0x80) );
  928. }
  929. sscape_write_host_ctrl2( devc, 0x84, 0x64 );  /* MIDI volume */
  930. sscape_write_host_ctrl2( devc, 0x86, 0x64 );  /* MIDI volume?? */
  931. sscape_write_host_ctrl2( devc, 0x8A, sscape_ext_midi);
  932. sscape_pnp_write_codec ( devc, 6, 0x3f ); //WAV_VOL
  933. sscape_pnp_write_codec ( devc, 7, 0x3f ); //WAV_VOL
  934. sscape_pnp_write_codec ( devc, 2, 0x1F ); //WD_CDXVOLL
  935. sscape_pnp_write_codec ( devc, 3, 0x1F ); //WD_CDXVOLR
  936. if (devc -> codec_type == 1) {
  937. sscape_pnp_write_codec ( devc, 4, 0x1F );
  938. sscape_pnp_write_codec ( devc, 5, 0x1F );
  939. sscape_write_host_ctrl2( devc, 0x88, sscape_mic_enable);
  940. } else {
  941. int t;
  942. sscape_pnp_write_codec ( devc, 0x10, 0x1F << 1);
  943. sscape_pnp_write_codec ( devc, 0x11, 0xC0 | (0x1F << 1));
  944. t = sscape_pnp_read_codec( devc, 0x00) & 0xDF;
  945. if ( (sscape_mic_enable == 0)) t |= 0;
  946. else t |= 0x20;
  947. sscape_pnp_write_codec ( devc, 0x00, t);
  948. t = sscape_pnp_read_codec( devc, 0x01) & 0xDF;
  949. if ( (sscape_mic_enable == 0) ) t |= 0;
  950. else t |= 0x20;
  951. sscape_pnp_write_codec ( devc, 0x01, t);
  952. sscape_pnp_write_codec ( devc, 0x40 | 29 , 0x20);
  953. outb(0, devc -> codec);
  954. }
  955. if (devc -> ic_type == IC_OPUS ) {
  956. int i = sscape_read( devc, 9 );
  957. sscape_write( devc, 9, i | 3 );
  958. sscape_write( devc, 3, 0x40);
  959. if (check_region(0x228, 1)) {
  960.          outb(0, 0x228);
  961.     release_region(0x228,1);
  962. }
  963. sscape_write( devc, 3, (devc -> dma << 4) | 0x80);
  964. sscape_write( devc, 9, i );
  965. }
  966. host_close ( devc );
  967. sscape_pnp_free_dma(devc);
  968. }
  969. static int __init detect_sscape_pnp(sscape_info* devc)
  970. {
  971. long  i, irq_bits = 0xff;
  972. unsigned int d;
  973. DDB(printk("Entered detect_sscape_pnp(%x)n", devc->base));
  974. if (check_region(devc->base, 8)) {
  975. printk(KERN_ERR "detect_sscape_pnp: port %x is not freen", devc->base);
  976. return 0;
  977. }
  978. if (check_region(devc->codec, 2)) {
  979. printk(KERN_ERR "detect_sscape_pnp: port %x is not freen", devc->codec);
  980. return 0;
  981. }
  982. if ( (inb( devc -> base + 2) & 0x78) != 0) return 0;
  983. d = inb ( devc -> base + 4) & 0xF0;
  984. if (  (d & 0x80) != 0)  return 0;
  985. if (d == 0) {
  986. devc->codec_type = 1;
  987. devc->ic_type = IC_ODIE;
  988. }
  989. else if ( (d & 0x60) != 0) {
  990. devc->codec_type = 2;
  991. devc->ic_type = IC_OPUS;
  992. }
  993. else if ( (d & 0x40) != 0) {
  994. devc->codec_type = 2;
  995. devc->ic_type = IC_ODIE;
  996. else return 0;
  997. sscape_is_pnp = 1;
  998. outb(0xFA, devc -> base+4);
  999. if  ((inb( devc -> base+4) & 0x9F) != 0x0A)
  1000. return 0;
  1001. outb(0xFE, devc -> base+4);
  1002. if  ( (inb(devc -> base+4) & 0x9F) != 0x0E)
  1003. return 0;
  1004. if  ( (inb(devc -> base+5) & 0x9F) != 0x0E)
  1005. return 0;
  1006. if (devc->codec_type == 2) {
  1007. if (devc -> codec != devc -> base + 8)
  1008. printk("soundscape warning: incorrect codec port specifiedn");
  1009. devc -> codec = devc -> base + 8;
  1010. d = 0x10 | (sscape_read(devc, 9)  & 0xCF);
  1011. sscape_write(devc, 9, d);
  1012. sscape_write(devc, 6, 0x80);
  1013. } else {
  1014. //todo: check codec is not base + 8
  1015. }
  1016. d  = (sscape_read(devc, 9) & 0x3F) | 0xC0;
  1017. sscape_write(devc, 9, d);
  1018. for (i = 0; i < 550000; i++)
  1019. if ( !(inb(devc -> codec) & 0x80) ) break;
  1020. d = inb(devc -> codec);
  1021. if (d & 0x80)
  1022. return 0;
  1023. if ( inb(devc -> codec + 2) == 0xFF)
  1024. return 0;
  1025. sscape_write(devc, 9, sscape_read(devc, 9)  & 0x3F );
  1026. d  = inb(devc -> codec) & 0x80;
  1027. if ( d == 0) {
  1028. printk(KERN_INFO "soundscape: hardware detectedn");
  1029. valid_interrupts = valid_interrupts_new;
  1030. } else {
  1031. printk(KERN_INFO "soundscape: board looks like media fxn");
  1032. valid_interrupts = valid_interrupts_old;
  1033. old_hardware = 1;
  1034. }
  1035. sscape_write( devc, 9, 0xC0 | (sscape_read(devc, 9)  & 0x3F) );
  1036. for (i = 0; i < 550000; i++)
  1037. if ( !(inb(devc -> codec) & 0x80)) 
  1038. break;
  1039. sscape_pnp_init_hw(devc);
  1040. for (i = 0; i < sizeof(valid_interrupts); i++)
  1041. {
  1042. if (devc->codec_irq == valid_interrupts[i]) {
  1043. irq_bits = i;
  1044. break;
  1045. }
  1046. }
  1047. sscape_write(devc, GA_INTENA_REG, 0x00);
  1048. sscape_write(devc, GA_DMACFG_REG, 0x50);
  1049. sscape_write(devc, GA_DMAA_REG, 0x70);
  1050. sscape_write(devc, GA_DMAB_REG, 0x20);
  1051. sscape_write(devc, GA_INTCFG_REG, 0xf0);
  1052. sscape_write(devc, GA_CDCFG_REG, 0x89 | (devc->dma << 4) | (irq_bits << 1));
  1053. sscape_pnp_write_codec( devc, 0, sscape_pnp_read_codec( devc, 0) | 0x20);
  1054. sscape_pnp_write_codec( devc, 0, sscape_pnp_read_codec( devc, 1) | 0x20);
  1055. return 1;
  1056. }
  1057. static int __init probe_sscape(struct address_info *hw_config)
  1058. {
  1059. if (sscape_detected != 0 && sscape_detected != hw_config->io_base)
  1060. return 0;
  1061. devc->base = hw_config->io_base;
  1062. devc->irq = hw_config->irq;
  1063. devc->dma = hw_config->dma;
  1064. devc->osp = hw_config->osp;
  1065. #ifdef SSCAPE_DEBUG1
  1066. /*
  1067.  * Temporary debugging aid. Print contents of the registers before
  1068.  * changing them.
  1069.  */
  1070. {
  1071. int i;
  1072. for (i = 0; i < 13; i++)
  1073. printk("I%d = %02x (old value)n", i, sscape_read(devc, i));
  1074. }
  1075. #endif
  1076. devc->failed = 1;
  1077. if (!detect_ga(devc)) {
  1078. if (detect_sscape_pnp(devc)) {         
  1079. sscape_detected = hw_config->io_base;
  1080. return 1;
  1081. else return 0;
  1082. }
  1083. if (old_hardware) /* Check that it's really an old Spea/Reveal card. */
  1084. {
  1085. unsigned char   tmp;
  1086. int             cc;
  1087. if (!((tmp = sscape_read(devc, GA_HMCTL_REG)) & 0xc0))
  1088. {
  1089. sscape_write(devc, GA_HMCTL_REG, tmp | 0x80);
  1090. for (cc = 0; cc < 200000; ++cc)
  1091. inb(devc->base + ODIE_ADDR);
  1092. }
  1093. }
  1094. sscape_detected = hw_config->io_base;
  1095. return 1;
  1096. }
  1097. static int __init probe_ss_ms_sound(struct address_info *hw_config)
  1098. {
  1099. int i, irq_bits = 0xff;
  1100. int ad_flags = 0;
  1101. if (devc->failed)
  1102. {
  1103. printk(KERN_ERR "soundscape: Card not detectedn");
  1104. return 0;
  1105. }
  1106. if (devc->ok == 0)
  1107. {
  1108. printk(KERN_ERR "soundscape: Invalid initialization order.n");
  1109. return 0;
  1110. }
  1111. for (i = 0; i < sizeof(valid_interrupts); i++)
  1112. {
  1113. if (hw_config->irq == valid_interrupts[i])
  1114. {
  1115. irq_bits = i;
  1116. break;
  1117. }
  1118. }
  1119. if (hw_config->irq > 15 || irq_bits == 0xff)
  1120. {
  1121. printk(KERN_ERR "soundscape: Invalid MSS IRQ%dn", hw_config->irq);
  1122. return 0;
  1123. }
  1124. if (!sscape_is_pnp) {
  1125. if (old_hardware)
  1126. ad_flags = 0x12345677; /* Tell that we may have a CS4248 chip (Spea-V7 Media FX) */
  1127. return ad1848_detect(hw_config->io_base, &ad_flags, hw_config->osp);
  1128. else {
  1129. if (old_hardware)
  1130. ad_flags = 0x12345677; /* Tell that we may have a CS4248 chip (Spea-V7 Media FX) */
  1131. else
  1132. ad_flags = 0x87654321;  /* Tell that we have a soundscape pnp with 1845 chip */
  1133. return ad1848_detect(hw_config->io_base, &ad_flags, hw_config->osp);
  1134. }
  1135. }
  1136. static void __init attach_ss_ms_sound(struct address_info *hw_config)
  1137. {
  1138. /*
  1139.  * This routine configures the SoundScape card for use with the
  1140.  * Win Sound System driver. The AD1848 codec interface uses the CD-ROM
  1141.  * config registers of the "ODIE".
  1142.  */
  1143. int i, irq_bits = 0xff;
  1144.  
  1145.   if (!sscape_is_pnp)  /*pnp is already setup*/
  1146.   {
  1147.   /*
  1148.        * Setup the DMA polarity.
  1149.         */
  1150.   sscape_write(devc, GA_DMACFG_REG, 0x50);
  1151.  
  1152.   /*
  1153.    * Take the gate-array off of the DMA channel.
  1154.    */
  1155.   sscape_write(devc, GA_DMAB_REG, 0x20);
  1156.  
  1157.   /*
  1158.    * Init the AD1848 (CD-ROM) config reg.
  1159.    */
  1160.   for (i = 0; i < sizeof(valid_interrupts); i++)
  1161.   {
  1162.   if (hw_config->irq == valid_interrupts[i])
  1163.   {
  1164.   irq_bits = i;
  1165.   break;
  1166.   }
  1167.   }
  1168.   sscape_write(devc, GA_CDCFG_REG, 0x89 | (hw_config->dma << 4) | (irq_bits << 1));
  1169.   }
  1170.  
  1171.   if (hw_config->irq == devc->irq)
  1172.   printk(KERN_WARNING "soundscape: Warning! The WSS mode can't share IRQ with MIDIn");
  1173.  
  1174. hw_config->slots[0] = ad1848_init(
  1175. sscape_is_pnp ? "SoundScape" : "SoundScape PNP",
  1176. hw_config->io_base,
  1177. hw_config->irq,
  1178. hw_config->dma,
  1179. hw_config->dma,
  1180. 0,
  1181. devc->osp,
  1182. THIS_MODULE);
  1183.     
  1184. if (hw_config->slots[0] != -1) /* The AD1848 driver installed itself */
  1185. {
  1186. audio_devs[hw_config->slots[0]]->coproc = &sscape_coproc_operations;
  1187. devc->codec_audiodev = hw_config->slots[0];
  1188. devc->my_audiodev = hw_config->slots[0];
  1189. /* Set proper routings here (what are they) */
  1190. AD1848_REROUTE(SOUND_MIXER_LINE1, SOUND_MIXER_LINE);
  1191. }
  1192. #ifdef SSCAPE_DEBUG5
  1193. /*
  1194.  * Temporary debugging aid. Print contents of the registers
  1195.  * after the AD1848 device has been initialized.
  1196.  */
  1197. {
  1198. int i;
  1199. for (i = 0; i < 13; i++)
  1200. printk("I%d = %02xn", i, sscape_read(devc, i));
  1201. }
  1202. #endif
  1203. }
  1204. static void __exit unload_sscape(struct address_info *hw_config)
  1205. {
  1206. release_region(devc->base + 2, 6);
  1207. unload_mpu401(hw_config);
  1208. }
  1209. static void __exit unload_ss_ms_sound(struct address_info *hw_config)
  1210. {
  1211. ad1848_unload(hw_config->io_base,
  1212.       hw_config->irq,
  1213.       devc->dma,
  1214.       devc->dma,
  1215.       0);
  1216. sound_unload_audiodev(hw_config->slots[0]);
  1217. }
  1218. static struct address_info cfg;
  1219. static struct address_info cfg_mpu;
  1220. static int __initdata spea = -1;
  1221. static int __initdata mss = 0;
  1222. static int __initdata dma = -1;
  1223. static int __initdata irq = -1;
  1224. static int __initdata io = -1;
  1225. static int __initdata mpu_irq = -1;
  1226. static int __initdata mpu_io = -1;
  1227. MODULE_PARM(dma, "i");
  1228. MODULE_PARM(irq, "i");
  1229. MODULE_PARM(io, "i");
  1230. MODULE_PARM(spea, "i"); /* spea=0/1 set the old_hardware */
  1231. MODULE_PARM(mpu_irq, "i");
  1232. MODULE_PARM(mpu_io, "i");
  1233. MODULE_PARM(mss, "i");
  1234. static int __init init_sscape(void)
  1235. {
  1236. printk(KERN_INFO "Soundscape driver Copyright (C) by Hannu Savolainen 1993-1996n");
  1237. cfg.irq = irq;
  1238. cfg.dma = dma;
  1239. cfg.io_base = io;
  1240. cfg_mpu.irq = mpu_irq;
  1241. cfg_mpu.io_base = mpu_io;
  1242. /* WEH - Try to get right dma channel */
  1243.         cfg_mpu.dma = dma;
  1244. devc->codec = cfg.io_base;
  1245. devc->codec_irq = cfg.irq;
  1246. devc->codec_type = 0;
  1247. devc->ic_type = 0;
  1248. devc->raw_buf = NULL;
  1249. if (cfg.dma == -1 || cfg.irq == -1 || cfg.io_base == -1) {
  1250. printk(KERN_ERR "DMA, IRQ, and IO port must be specified.n");
  1251. return -EINVAL;
  1252. }
  1253. if (cfg_mpu.irq == -1 && cfg_mpu.io_base != -1) {
  1254. printk(KERN_ERR "MPU_IRQ must be specified if MPU_IO is set.n");
  1255. return -EINVAL;
  1256. }
  1257. if(spea != -1) {
  1258. old_hardware = spea;
  1259. printk(KERN_INFO "Forcing %s hardware support.n",
  1260. spea?"new":"old");
  1261. }
  1262. if (probe_sscape(&cfg_mpu) == 0)
  1263. return -ENODEV;
  1264. attach_sscape(&cfg_mpu);
  1265. mss = probe_ss_ms_sound(&cfg);
  1266. if (mss)
  1267. attach_ss_ms_sound(&cfg);
  1268. return 0;
  1269. }
  1270. static void __exit cleanup_sscape(void)
  1271. {
  1272. if (mss)
  1273. unload_ss_ms_sound(&cfg);
  1274. unload_sscape(&cfg_mpu);
  1275. }
  1276. module_init(init_sscape);
  1277. module_exit(cleanup_sscape);
  1278. #ifndef MODULE
  1279. static int __init setup_sscape(char *str)
  1280. {
  1281. /* io, irq, dma, mpu_io, mpu_irq */
  1282. int ints[6];
  1283. str = get_options(str, ARRAY_SIZE(ints), ints);
  1284. io = ints[1];
  1285. irq = ints[2];
  1286. dma = ints[3];
  1287. mpu_io = ints[4];
  1288. mpu_irq = ints[5];
  1289. return 1;
  1290. }
  1291. __setup("sscape=", setup_sscape);
  1292. #endif
  1293. MODULE_LICENSE("GPL");