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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *
  3.  * AD1816 lowlevel sound driver for Linux 2.2.0 and above
  4.  *
  5.  * Copyright (C) 1998 by Thorsten Knabe <tek@rbg.informatik.tu-darmstadt.de>
  6.  *
  7.  * Based on the CS4232/AD1848 driver Copyright (C) by Hannu Savolainen 1993-1996
  8.  *
  9.  *
  10.  * version: 1.3.1
  11.  * status: experimental
  12.  * date: 1999/4/18
  13.  *
  14.  * Changes:
  15.  * Oleg Drokin: Some cleanup of load/unload functions. 1998/11/24
  16.  *
  17.  * Thorsten Knabe: attach and unload rewritten, 
  18.  * some argument checks added 1998/11/30
  19.  *
  20.  * Thorsten Knabe: Buggy isa bridge workaround added 1999/01/16
  21.  *
  22.  * David Moews/Thorsten Knabe: Introduced options 
  23.  * parameter. Added slightly modified patch from 
  24.  * David Moews to disable dsp audio sources by setting 
  25.  * bit 0 of options parameter. This seems to be
  26.  * required by some Aztech/Newcom SC-16 cards. 1999/04/18
  27.  *
  28.  * Christoph Hellwig: Adapted to module_init/module_exit. 2000/03/03
  29.  *
  30.  * Christoph Hellwig: Added isapnp support 2000/03/15
  31.  *
  32.  * Arnaldo Carvalho de Melo: get rid of check_region 2001/10/07
  33.  */
  34. #include <linux/config.h>
  35. #include <linux/module.h>
  36. #include <linux/init.h>
  37. #include <linux/isapnp.h>
  38. #include <linux/stddef.h>
  39. #include "sound_config.h"
  40. #define DEBUGNOISE(x)
  41. #define DEBUGINFO(x)
  42. #define DEBUGLOG(x)
  43. #define DEBUGWARN(x)
  44. #define CHECK_FOR_POWER { int timeout=100; 
  45.   while (timeout > 0 && (inb(devc->base)&0x80)!= 0x80) {
  46.           timeout--; 
  47.   } 
  48.   if (timeout==0) {
  49.           printk(KERN_WARNING "ad1816: Check for power failed in %s line: %dn",__FILE__,__LINE__); 
  50.   } 
  51. }
  52. /* structure to hold device specific information */
  53. typedef struct
  54. {
  55.         int            base;          /* set in attach */
  56. int            irq;
  57. int            dma_playback;
  58.         int            dma_capture;
  59.   
  60.         int            speed;         /* open */
  61. int            channels;
  62. int            audio_format;
  63. unsigned char  format_bits;
  64.         int            audio_mode; 
  65. int            opened;
  66.   
  67.         int            recmask;        /* setup */
  68. int            supported_devices;
  69. int            supported_rec_devices;
  70. unsigned short levels[SOUND_MIXER_NRDEVICES];
  71.         int            dev_no;   /* this is the # in audio_devs and NOT 
  72.     in ad1816_info */
  73. int            irq_ok;
  74. int            *osp;
  75.   
  76. } ad1816_info;
  77. static int nr_ad1816_devs;
  78. static int ad1816_clockfreq = 33000;
  79. static int options;
  80. /* for backward mapping of irq to sound device */
  81. static volatile char irq2dev[17] = {-1, -1, -1, -1, -1, -1, -1, -1,
  82.     -1, -1, -1, -1, -1, -1, -1, -1, -1};
  83. /* supported audio formats */
  84. static int  ad_format_mask =
  85. AFMT_U8 | AFMT_S16_LE | AFMT_S16_BE | AFMT_MU_LAW | AFMT_A_LAW;
  86. /* array of device info structures */
  87. static ad1816_info dev_info[MAX_AUDIO_DEV];
  88. /* ------------------------------------------------------------------- */
  89. /* functions for easier access to inderect registers */
  90. static int ad_read (ad1816_info * devc, int reg)
  91. {
  92. unsigned long   flags;
  93. int result;
  94. CHECK_FOR_POWER;
  95. save_flags (flags); /* make register access atomic */
  96. cli ();
  97. outb ((unsigned char) (reg & 0x3f), devc->base+0);
  98. result = inb(devc->base+2);
  99. result+= inb(devc->base+3)<<8;
  100. restore_flags (flags);
  101. return (result);
  102. }
  103. static void ad_write (ad1816_info * devc, int reg, int data)
  104. {
  105. unsigned long flags;
  106. CHECK_FOR_POWER;
  107. save_flags (flags); /* make register access atomic */
  108. cli ();
  109. outb ((unsigned char) (reg & 0xff), devc->base+0);
  110. outb ((unsigned char) (data & 0xff),devc->base+2);
  111. outb ((unsigned char) ((data>>8)&0xff),devc->base+3);
  112. restore_flags (flags);
  113. }
  114. /* ------------------------------------------------------------------- */
  115. /* function interface required by struct audio_driver */
  116. static void ad1816_halt_input (int dev)
  117. {
  118. unsigned long flags;
  119. ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
  120. unsigned char buffer;
  121. DEBUGINFO (printk("ad1816: halt_input calledn"));
  122. save_flags (flags); 
  123. cli ();
  124. if(!isa_dma_bridge_buggy) {
  125.         disable_dma(audio_devs[dev]->dmap_in->dma);
  126. }
  127. buffer=inb(devc->base+9);
  128. if (buffer & 0x01) {
  129. /* disable capture */
  130. outb(buffer & ~0x01,devc->base+9); 
  131. }
  132. if(!isa_dma_bridge_buggy) {
  133.         enable_dma(audio_devs[dev]->dmap_in->dma);
  134. }
  135. /* Clear interrupt status */
  136. outb (~0x40, devc->base+1);
  137. devc->audio_mode &= ~PCM_ENABLE_INPUT;
  138. restore_flags (flags);
  139. }
  140. static void ad1816_halt_output (int dev)
  141. {
  142. unsigned long  flags;
  143. ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
  144. unsigned char buffer;
  145. DEBUGINFO (printk("ad1816: halt_output called!n"));
  146. save_flags (flags); 
  147. cli ();
  148. /* Mute pcm output */
  149. ad_write(devc, 4, ad_read(devc,4)|0x8080);
  150. if(!isa_dma_bridge_buggy) {
  151.         disable_dma(audio_devs[dev]->dmap_out->dma);
  152. }
  153. buffer=inb(devc->base+8);
  154. if (buffer & 0x01) {
  155. /* disable capture */
  156. outb(buffer & ~0x01,devc->base+8); 
  157. }
  158. if(!isa_dma_bridge_buggy) {
  159.         enable_dma(audio_devs[dev]->dmap_out->dma);
  160. }
  161. /* Clear interrupt status */
  162. outb ((unsigned char)~0x80, devc->base+1);
  163. devc->audio_mode &= ~PCM_ENABLE_OUTPUT;
  164. restore_flags (flags);
  165. }
  166. static void ad1816_output_block (int dev, unsigned long buf, 
  167.  int count, int intrflag)
  168. {
  169. unsigned long flags;
  170. unsigned long cnt;
  171. ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
  172. DEBUGINFO(printk("ad1816: output_block called buf=%ld count=%d flags=%dn",buf,count,intrflag));
  173.   
  174. cnt = count/4 - 1;
  175.   
  176. save_flags (flags);
  177. cli ();
  178. /* set transfer count */
  179. ad_write (devc, 8, cnt & 0xffff); 
  180. devc->audio_mode |= PCM_ENABLE_OUTPUT; 
  181. restore_flags (flags);
  182. }
  183. static void ad1816_start_input (int dev, unsigned long buf, int count,
  184. int intrflag)
  185. {
  186. unsigned long flags;
  187. unsigned long  cnt;
  188. ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
  189. DEBUGINFO(printk("ad1816: start_input called buf=%ld count=%d flags=%dn",buf,count,intrflag));
  190. cnt = count/4 - 1;
  191. save_flags (flags); /* make register access atomic */
  192. cli ();
  193. /* set transfer count */
  194. ad_write (devc, 10, cnt & 0xffff); 
  195. devc->audio_mode |= PCM_ENABLE_INPUT;
  196. restore_flags (flags);
  197. }
  198. static int ad1816_prepare_for_input (int dev, int bsize, int bcount)
  199. {
  200. unsigned long flags;
  201. unsigned int freq;
  202. ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
  203. unsigned char fmt_bits;
  204. DEBUGINFO (printk ("ad1816: prepare_for_input called: bsize=%d bcount=%dn",bsize,bcount));
  205. save_flags (flags); 
  206. cli ();
  207. fmt_bits= (devc->format_bits&0x7)<<3;
  208. /* set mono/stereo mode */
  209. if (devc->channels > 1) {
  210. fmt_bits |=0x4;
  211. }
  212. /* set Mono/Stereo in playback/capture register */
  213. outb( (inb(devc->base+8) & ~0x3C)|fmt_bits, devc->base+8); 
  214. outb( (inb(devc->base+9) & ~0x3C)|fmt_bits, devc->base+9);
  215.   
  216. /* If compiled into kernel, AD1816_CLOCK is defined, so use it */
  217. #ifdef AD1816_CLOCK 
  218. ad1816_clockfreq=AD1816_CLOCK;
  219. #endif
  220. /* capture/playback frequency correction for soundcards 
  221.    with clock chips != 33MHz (allowed range 5 - 100 kHz) */
  222. if (ad1816_clockfreq<5000 || ad1816_clockfreq>100000) {
  223. ad1816_clockfreq=33000;
  224. }
  225. freq=((unsigned int)devc->speed*33000)/ad1816_clockfreq; 
  226. /* write playback/capture speeds */
  227. ad_write (devc, 2, freq & 0xffff);
  228. ad_write (devc, 3, freq & 0xffff);
  229. restore_flags (flags);
  230. ad1816_halt_input(dev);
  231. return 0;
  232. }
  233. static int ad1816_prepare_for_output (int dev, int bsize, int bcount)
  234. {
  235. unsigned long flags;
  236. unsigned int freq;
  237. ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
  238. unsigned char fmt_bits;
  239. DEBUGINFO (printk ("ad1816: prepare_for_output called: bsize=%d bcount=%dn",bsize,bcount));
  240. save_flags (flags); /* make register access atomic */
  241. cli ();
  242. fmt_bits= (devc->format_bits&0x7)<<3;
  243. /* set mono/stereo mode */
  244. if (devc->channels > 1) {
  245. fmt_bits |=0x4;
  246. }
  247. /* write format bits to playback/capture registers */
  248. outb( (inb(devc->base+8) & ~0x3C)|fmt_bits, devc->base+8); 
  249. outb( (inb(devc->base+9) & ~0x3C)|fmt_bits, devc->base+9);
  250.   
  251. #ifdef AD1816_CLOCK 
  252. ad1816_clockfreq=AD1816_CLOCK;
  253. #endif
  254. /* capture/playback frequency correction for soundcards 
  255.    with clock chips != 33MHz (allowed range 5 - 100 kHz)*/
  256. if (ad1816_clockfreq<5000 || ad1816_clockfreq>100000) {
  257. ad1816_clockfreq=33000;
  258. }
  259.   
  260. freq=((unsigned int)devc->speed*33000)/ad1816_clockfreq; 
  261. /* write playback/capture speeds */
  262. ad_write (devc, 2, freq & 0xffff);
  263. ad_write (devc, 3, freq & 0xffff);
  264. restore_flags (flags);
  265. ad1816_halt_output(dev);
  266. return 0;
  267. }
  268. static void ad1816_trigger (int dev, int state) 
  269. {
  270. unsigned long flags;
  271. ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
  272. DEBUGINFO (printk("ad1816: trigger called! (devc=%d,devc->base=%dn", devc, devc->base));
  273. /* mode may have changed */
  274. save_flags (flags); /* make register access atomic */
  275. cli ();
  276. /* mask out modes not specified on open call */
  277. state &= devc->audio_mode; 
  278. /* setup soundchip to new io-mode */
  279. if (state & PCM_ENABLE_INPUT) {
  280. /* enable capture */
  281. outb(inb(devc->base+9)|0x01, devc->base+9);
  282. } else {
  283. /* disable capture */
  284. outb(inb(devc->base+9)&~0x01, devc->base+9);
  285. }
  286. if (state & PCM_ENABLE_OUTPUT) {
  287. /* enable playback */
  288. outb(inb(devc->base+8)|0x01, devc->base+8);
  289. /* unmute pcm output */
  290. ad_write(devc, 4, ad_read(devc,4)&~0x8080);
  291. } else {
  292. /* mute pcm output */
  293. ad_write(devc, 4, ad_read(devc,4)|0x8080);
  294. /* disable capture */
  295. outb(inb(devc->base+8)&~0x01, devc->base+8);
  296. }
  297. restore_flags (flags);
  298. }
  299. /* halt input & output */
  300. static void ad1816_halt (int dev)
  301. {
  302. ad1816_halt_input(dev);
  303. ad1816_halt_output(dev);
  304. }
  305. static void ad1816_reset (int dev)
  306. {
  307. ad1816_halt (dev);
  308. }
  309. /* set playback speed */
  310. static int ad1816_set_speed (int dev, int arg)
  311. {
  312. ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
  313. if (arg == 0) {
  314. return devc->speed;
  315. }
  316. /* range checking */
  317. if (arg < 4000) {
  318. arg = 4000;
  319. }
  320. if (arg > 55000) {
  321. arg = 55000;
  322. }
  323. devc->speed = arg;
  324. return devc->speed;
  325. }
  326. static unsigned int ad1816_set_bits (int dev, unsigned int arg)
  327. {
  328. ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
  329. static struct format_tbl {
  330. int             format;
  331. unsigned char   bits;
  332. } format2bits[] = {
  333. { 0, 0 },
  334. { AFMT_MU_LAW, 1 },
  335. { AFMT_A_LAW, 3 },
  336. { AFMT_IMA_ADPCM, 0 },
  337. { AFMT_U8, 0 },
  338. { AFMT_S16_LE, 2 },
  339. { AFMT_S16_BE, 6 },
  340. { AFMT_S8, 0 },
  341. { AFMT_U16_LE, 0 },
  342. { AFMT_U16_BE, 0 }
  343.    };
  344. int  i, n = sizeof (format2bits) / sizeof (struct format_tbl);
  345. /* return current format */
  346. if (arg == 0)
  347. return devc->audio_format;
  348. devc->audio_format = arg;
  349. /* search matching format bits */
  350. for (i = 0; i < n; i++)
  351. if (format2bits[i].format == arg) {
  352. devc->format_bits = format2bits[i].bits;
  353. devc->audio_format = arg;
  354. return arg;
  355. }
  356. /* Still hanging here. Something must be terribly wrong */
  357. devc->format_bits = 0;
  358. return devc->audio_format = AFMT_U8;
  359. }
  360. static short ad1816_set_channels (int dev, short arg)
  361. {
  362. ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
  363. if (arg != 1 && arg != 2)
  364. return devc->channels;
  365. devc->channels = arg;
  366. return arg;
  367. }
  368. /* open device */
  369. static int ad1816_open (int dev, int mode) 
  370. {
  371. ad1816_info    *devc = NULL;
  372. unsigned long   flags;
  373. /* is device number valid ? */
  374. if (dev < 0 || dev >= num_audiodevs)
  375. return -(ENXIO);
  376. /* get device info of this dev */
  377. devc = (ad1816_info *) audio_devs[dev]->devc; 
  378. /* make check if device already open atomic */
  379. save_flags (flags); 
  380. cli ();
  381. if (devc->opened) {
  382. restore_flags (flags);
  383. return -(EBUSY);
  384. }
  385. /* mark device as open */
  386. devc->opened = 1; 
  387. devc->audio_mode = 0;
  388. devc->speed = 8000;
  389. devc->audio_format=AFMT_U8;
  390. devc->channels=1;
  391. ad1816_reset(devc->dev_no); /* halt all pending output */
  392. restore_flags (flags);
  393. return 0;
  394. }
  395. static void ad1816_close (int dev) /* close device */
  396. {
  397. unsigned long flags;
  398. ad1816_info    *devc = (ad1816_info *) audio_devs[dev]->devc;
  399. save_flags (flags); 
  400. cli ();
  401. /* halt all pending output */
  402. ad1816_reset(devc->dev_no); 
  403. devc->opened = 0;
  404. devc->audio_mode = 0;
  405. devc->speed = 8000;
  406. devc->audio_format=AFMT_U8;
  407. devc->format_bits = 0;
  408. restore_flags (flags);
  409. }
  410. /* ------------------------------------------------------------------- */
  411. /* Audio driver structure */
  412. static struct audio_driver ad1816_audio_driver =
  413. {
  414. owner: THIS_MODULE,
  415. open: ad1816_open,
  416. close: ad1816_close,
  417. output_block: ad1816_output_block,
  418. start_input: ad1816_start_input,
  419. prepare_for_input: ad1816_prepare_for_input,
  420. prepare_for_output: ad1816_prepare_for_output,
  421. halt_io: ad1816_halt,
  422. halt_input: ad1816_halt_input,
  423. halt_output: ad1816_halt_output,
  424. trigger: ad1816_trigger,
  425. set_speed: ad1816_set_speed,
  426. set_bits: ad1816_set_bits,
  427. set_channels: ad1816_set_channels,
  428. };
  429. /* ------------------------------------------------------------------- */
  430. /* Interrupt handler */
  431. static void ad1816_interrupt (int irq, void *dev_id, struct pt_regs *dummy)
  432. {
  433. unsigned char status;
  434. ad1816_info *devc;
  435. int dev;
  436. unsigned long flags;
  437. if (irq < 0 || irq > 15) {
  438.         printk(KERN_WARNING "ad1816: Got bogus interrupt %dn", irq);
  439. return;
  440. }
  441. dev = irq2dev[irq];
  442. if (dev < 0 || dev >= num_audiodevs) {
  443.         printk(KERN_WARNING "ad1816: IRQ2AD1816-mapping failed for "
  444.     "irq %d device %dn", irq,dev);
  445. return;         
  446. }
  447. devc = (ad1816_info *) audio_devs[dev]->devc;
  448. save_flags(flags);
  449. cli();
  450. /* read interrupt register */
  451. status = inb (devc->base+1); 
  452. /* Clear all interrupt  */
  453. outb (~status, devc->base+1);
  454. DEBUGNOISE (printk("ad1816: Got interrupt subclass %dn",status));
  455. devc->irq_ok=1;
  456. if (status == 0)
  457. DEBUGWARN(printk ("ad1816: interrupt: Got interrupt, but no reason?n"));
  458. if (devc->opened && (devc->audio_mode & PCM_ENABLE_INPUT) && (status&64))
  459. DMAbuf_inputintr (dev);
  460. if (devc->opened && (devc->audio_mode & PCM_ENABLE_OUTPUT) && (status & 128))
  461. DMAbuf_outputintr (dev, 1);
  462. restore_flags(flags);
  463. }
  464. /* ------------------------------------------------------------------- */
  465. /* Mixer stuff */
  466. struct mixer_def {
  467. unsigned int regno: 7;
  468. unsigned int polarity:1; /* 0=normal, 1=reversed */
  469. unsigned int bitpos:4;
  470. unsigned int nbits:4;
  471. };
  472. static char mix_cvt[101] = {
  473.  0, 0, 3, 7,10,13,16,19,21,23,26,28,30,32,34,35,37,39,40,42,
  474. 43,45,46,47,49,50,51,52,53,55,56,57,58,59,60,61,62,63,64,65,
  475. 65,66,67,68,69,70,70,71,72,73,73,74,75,75,76,77,77,78,79,79,
  476. 80,81,81,82,82,83,84,84,85,85,86,86,87,87,88,88,89,89,90,90,
  477. 91,91,92,92,93,93,94,94,95,95,96,96,96,97,97,98,98,98,99,99,
  478. 100
  479. };
  480. typedef struct mixer_def mixer_ent;
  481. /*
  482.  * Most of the mixer entries work in backwards. Setting the polarity field
  483.  * makes them to work correctly.
  484.  *
  485.  * The channel numbering used by individual soundcards is not fixed. Some
  486.  * cards have assigned different meanings for the AUX1, AUX2 and LINE inputs.
  487.  * The current version doesn't try to compensate this.
  488.  */
  489. #define MIX_ENT(name, reg_l, pola_l, pos_l, len_l, reg_r, pola_r, pos_r, len_r)
  490.   {{reg_l, pola_l, pos_l, len_l}, {reg_r, pola_r, pos_r, len_r}}
  491. mixer_ent mix_devices[SOUND_MIXER_NRDEVICES][2] = {
  492. MIX_ENT(SOUND_MIXER_VOLUME, 14, 1, 8, 5, 14, 1, 0, 5),
  493. MIX_ENT(SOUND_MIXER_BASS,  0, 0, 0, 0,  0, 0, 0, 0),
  494. MIX_ENT(SOUND_MIXER_TREBLE,  0, 0, 0, 0,  0, 0, 0, 0),
  495. MIX_ENT(SOUND_MIXER_SYNTH,  5, 1, 8, 6,  5, 1, 0, 6),
  496. MIX_ENT(SOUND_MIXER_PCM,  4, 1, 8, 6,  4, 1, 0, 6),
  497. MIX_ENT(SOUND_MIXER_SPEAKER,  0, 0, 0, 0,  0, 0, 0, 0),
  498. MIX_ENT(SOUND_MIXER_LINE, 18, 1, 8, 5, 18, 1, 0, 5),
  499. MIX_ENT(SOUND_MIXER_MIC, 19, 1, 8, 5, 19, 1, 0, 5),
  500. MIX_ENT(SOUND_MIXER_CD,   15, 1, 8, 5, 15, 1, 0, 5),
  501. MIX_ENT(SOUND_MIXER_IMIX,  0, 0, 0, 0,  0, 0, 0, 0),
  502. MIX_ENT(SOUND_MIXER_ALTPCM,  0, 0, 0, 0,  0, 0, 0, 0),
  503. MIX_ENT(SOUND_MIXER_RECLEV, 20, 0, 8, 4, 20, 0, 0, 4),
  504. MIX_ENT(SOUND_MIXER_IGAIN,  0, 0, 0, 0,  0, 0, 0, 0),
  505. MIX_ENT(SOUND_MIXER_OGAIN,  0, 0, 0, 0,  0, 0, 0, 0),
  506. MIX_ENT(SOUND_MIXER_LINE1,  17, 1, 8, 5, 17, 1, 0, 5),
  507. MIX_ENT(SOUND_MIXER_LINE2, 16, 1, 8, 5, 16, 1, 0, 5),
  508. MIX_ENT(SOUND_MIXER_LINE3,      39, 0, 9, 4,    39, 1, 0, 5)
  509. };
  510. static unsigned short default_mixer_levels[SOUND_MIXER_NRDEVICES] =
  511. {
  512. 0x4343, /* Master Volume */
  513. 0x3232, /* Bass */
  514. 0x3232, /* Treble */
  515. 0x0000, /* FM */
  516. 0x4343, /* PCM */
  517. 0x0000, /* PC Speaker */
  518. 0x0000, /* Ext Line */
  519. 0x0000, /* Mic */
  520. 0x0000, /* CD */
  521. 0x0000, /* Recording monitor */
  522. 0x0000, /* SB PCM */
  523. 0x0000, /* Recording level */
  524. 0x0000, /* Input gain */
  525. 0x0000, /* Output gain */
  526. 0x0000, /* Line1 */
  527. 0x0000, /* Line2 */
  528. 0x0000 /* Line3 (usually line in)*/
  529. };
  530. #define LEFT_CHN 0
  531. #define RIGHT_CHN 1
  532. static int
  533. ad1816_set_recmask (ad1816_info * devc, int mask)
  534. {
  535. unsigned char   recdev;
  536. int             i, n;
  537. mask &= devc->supported_rec_devices;
  538. n = 0;
  539. /* Count selected device bits */
  540. for (i = 0; i < 32; i++)
  541. if (mask & (1 << i))
  542. n++;
  543. if (n == 0)
  544. mask = SOUND_MASK_MIC;
  545. else if (n != 1) { /* Too many devices selected */
  546. /* Filter out active settings */
  547. mask &= ~devc->recmask;
  548. n = 0;
  549. /* Count selected device bits */
  550. for (i = 0; i < 32; i++) 
  551. if (mask & (1 << i))
  552. n++;
  553. if (n != 1)
  554. mask = SOUND_MASK_MIC;
  555. }
  556. switch (mask) {
  557. case SOUND_MASK_MIC:
  558. recdev = 5;
  559. break;
  560. case SOUND_MASK_LINE:
  561. recdev = 0;
  562. break;
  563. case SOUND_MASK_CD:
  564. recdev = 2;
  565. break;
  566. case SOUND_MASK_LINE1:
  567. recdev = 4;
  568. break;
  569. case SOUND_MASK_LINE2:
  570. recdev = 3;
  571. break;
  572. case SOUND_MASK_VOLUME:
  573. recdev = 1;
  574. break;
  575. default:
  576. mask = SOUND_MASK_MIC;
  577. recdev = 5;
  578. }
  579. recdev <<= 4;
  580. ad_write (devc, 20, 
  581.   (ad_read (devc, 20) & 0x8f8f) | recdev | (recdev<<8));
  582. devc->recmask = mask;
  583. return mask;
  584. }
  585. static void
  586. change_bits (int *regval, int dev, int chn, int newval)
  587. {
  588. unsigned char   mask;
  589. int             shift;
  590.   
  591. /* Reverse polarity*/
  592. if (mix_devices[dev][chn].polarity == 1) 
  593. newval = 100 - newval;
  594. mask = (1 << mix_devices[dev][chn].nbits) - 1;
  595. shift = mix_devices[dev][chn].bitpos;
  596. /* Scale it */
  597. newval = (int) ((newval * mask) + 50) / 100;
  598. /* Clear bits */
  599. *regval &= ~(mask << shift);
  600. /* Set new value */
  601. *regval |= (newval & mask) << shift;
  602. }
  603. static int
  604. ad1816_mixer_get (ad1816_info * devc, int dev)
  605. {
  606. DEBUGINFO(printk("ad1816: mixer_get called!n"));
  607. /* range check + supported mixer check */
  608. if (dev < 0 || dev >= SOUND_MIXER_NRDEVICES )
  609.         return (-(EINVAL));
  610. if (!((1 << dev) & devc->supported_devices))
  611. return -(EINVAL);
  612. return devc->levels[dev];
  613. }
  614. static int
  615. ad1816_mixer_set (ad1816_info * devc, int dev, int value)
  616. {
  617. int   left = value & 0x000000ff;
  618. int   right = (value & 0x0000ff00) >> 8;
  619. int   retvol;
  620. int   regoffs;
  621. int   val;
  622. int   valmute;
  623. DEBUGINFO(printk("ad1816: mixer_set called!n"));
  624. if (dev < 0 || dev >= SOUND_MIXER_NRDEVICES )
  625. return -(EINVAL);
  626. if (left > 100)
  627. left = 100;
  628. if (left < 0)
  629. left = 0;
  630. if (right > 100)
  631. right = 100;
  632. if (right < 0)
  633. right = 0;
  634. /* Mono control */
  635. if (mix_devices[dev][RIGHT_CHN].nbits == 0) 
  636. right = left;
  637. retvol = left | (right << 8);
  638. /* Scale it */
  639. left = mix_cvt[left];
  640. right = mix_cvt[right];
  641. /* reject all mixers that are not supported */
  642. if (!(devc->supported_devices & (1 << dev)))
  643. return -(EINVAL);
  644. /* sanity check */
  645. if (mix_devices[dev][LEFT_CHN].nbits == 0)
  646. return -(EINVAL);
  647. /* keep precise volume internal */
  648. devc->levels[dev] = retvol;
  649. /* Set the left channel */
  650. regoffs = mix_devices[dev][LEFT_CHN].regno;
  651. val = ad_read (devc, regoffs);
  652. change_bits (&val, dev, LEFT_CHN, left);
  653. valmute=val;
  654. /* Mute bit masking on some registers */
  655. if ( regoffs==5 || regoffs==14 || regoffs==15 ||
  656.      regoffs==16 || regoffs==17 || regoffs==18 || 
  657.      regoffs==19 || regoffs==39) {
  658. if (left==0)
  659. valmute |= 0x8000;
  660. else
  661. valmute &= ~0x8000;
  662. }
  663. ad_write (devc, regoffs, valmute); /* mute */
  664. /*
  665.  * Set the right channel
  666.  */
  667.  
  668. /* Was just a mono channel */
  669. if (mix_devices[dev][RIGHT_CHN].nbits == 0)
  670. return retvol;
  671. regoffs = mix_devices[dev][RIGHT_CHN].regno;
  672. val = ad_read (devc, regoffs);
  673. change_bits (&val, dev, RIGHT_CHN, right);
  674. valmute=val;
  675. if ( regoffs==5 || regoffs==14 || regoffs==15 ||
  676.      regoffs==16 || regoffs==17 || regoffs==18 || 
  677.      regoffs==19 || regoffs==39) {
  678. if (right==0)
  679. valmute |= 0x80;
  680. else
  681. valmute &= ~0x80;
  682. }
  683. ad_write (devc, regoffs, valmute); /* mute */
  684.         return retvol;
  685. }
  686. #define MIXER_DEVICES ( SOUND_MASK_VOLUME | 
  687. SOUND_MASK_SYNTH | 
  688. SOUND_MASK_PCM | 
  689. SOUND_MASK_LINE | 
  690. SOUND_MASK_LINE1 | 
  691. SOUND_MASK_LINE2 | 
  692. SOUND_MASK_LINE3 | 
  693. SOUND_MASK_MIC | 
  694. SOUND_MASK_CD | 
  695. SOUND_MASK_RECLEV  
  696. )
  697. #define REC_DEVICES ( SOUND_MASK_LINE2 |
  698.       SOUND_MASK_LINE |
  699.       SOUND_MASK_LINE1 |
  700.       SOUND_MASK_MIC |
  701.       SOUND_MASK_CD |
  702.       SOUND_MASK_VOLUME 
  703.       )
  704.      
  705. static void
  706. ad1816_mixer_reset (ad1816_info * devc)
  707. {
  708. int  i;
  709. devc->supported_devices = MIXER_DEVICES;
  710. devc->supported_rec_devices = REC_DEVICES;
  711. for (i = 0; i < SOUND_MIXER_NRDEVICES; i++)
  712. if (devc->supported_devices & (1 << i))
  713. ad1816_mixer_set (devc, i, default_mixer_levels[i]);
  714. ad1816_set_recmask (devc, SOUND_MASK_MIC);
  715. }
  716. static int
  717. ad1816_mixer_ioctl (int dev, unsigned int cmd, caddr_t arg)
  718. {
  719. ad1816_info    *devc = mixer_devs[dev]->devc;
  720. int val;
  721.   
  722. DEBUGINFO(printk("ad1816: mixer_ioctl called!n"));
  723.   
  724. /* Mixer ioctl */
  725. if (((cmd >> 8) & 0xff) == 'M') { 
  726. /* set ioctl */
  727. if (_SIOC_DIR (cmd) & _SIOC_WRITE) { 
  728. switch (cmd & 0xff){
  729. case SOUND_MIXER_RECSRC:
  730. if (get_user(val, (int *)arg))
  731. return -EFAULT;
  732. val=ad1816_set_recmask (devc, val);
  733. return put_user(val, (int *)arg);
  734. break;
  735. default:
  736. if (get_user(val, (int *)arg))
  737. return -EFAULT;
  738. if ((val=ad1816_mixer_set (devc, cmd & 0xff, val))<0)
  739.         return val;
  740. else
  741.         return put_user(val, (int *)arg);
  742. }
  743. } else { 
  744. /* read ioctl */
  745. switch (cmd & 0xff) {
  746. case SOUND_MIXER_RECSRC:
  747. val=devc->recmask;
  748. return put_user(val, (int *)arg);
  749. break;
  750. case SOUND_MIXER_DEVMASK:
  751. val=devc->supported_devices;
  752. return put_user(val, (int *)arg);
  753. break;
  754. case SOUND_MIXER_STEREODEVS:
  755. val=devc->supported_devices & ~(SOUND_MASK_SPEAKER | SOUND_MASK_IMIX);
  756. return put_user(val, (int *)arg);
  757. break;
  758. case SOUND_MIXER_RECMASK:
  759. val=devc->supported_rec_devices;
  760. return put_user(val, (int *)arg);
  761. break;
  762. case SOUND_MIXER_CAPS:
  763. val=SOUND_CAP_EXCL_INPUT;
  764. return put_user(val, (int *)arg);
  765. break;
  766. default:
  767.         if ((val=ad1816_mixer_get (devc, cmd & 0xff))<0)
  768.         return val;
  769. else
  770.         return put_user(val, (int *)arg);
  771. }
  772. }
  773. } else
  774. /* not for mixer */
  775. return -(EINVAL);
  776. }
  777. /* ------------------------------------------------------------------- */
  778. /* Mixer structure */
  779. static struct mixer_operations ad1816_mixer_operations = {
  780. owner: THIS_MODULE,
  781. id: "AD1816",
  782. name: "AD1816 Mixer",
  783. ioctl: ad1816_mixer_ioctl
  784. };
  785. /* ------------------------------------------------------------------- */
  786. /* stuff for card recognition, init and unloading */
  787. /* replace with probe routine */
  788. static int __init probe_ad1816 ( struct address_info *hw_config )
  789. {
  790. ad1816_info    *devc = &dev_info[nr_ad1816_devs];
  791. int io_base=hw_config->io_base;
  792. int *osp=hw_config->osp;
  793. int tmp;
  794. printk(KERN_INFO "ad1816: AD1816 sounddriver "
  795.  "Copyright (C) 1998 by Thorsten Knaben");
  796. printk(KERN_INFO "ad1816: io=0x%x, irq=%d, dma=%d, dma2=%d, "
  797.  "clockfreq=%d, options=%d isadmabug=%dn",
  798.        hw_config->io_base,
  799.        hw_config->irq,
  800.        hw_config->dma,
  801.        hw_config->dma2,
  802.        ad1816_clockfreq,
  803.        options,
  804.        isa_dma_bridge_buggy);
  805. if (!request_region(io_base, 16, "AD1816 Sound")) {
  806. printk(KERN_WARNING "ad1816: I/O port 0x%03x not freen",
  807.     io_base);
  808. goto err;
  809. }
  810. DEBUGLOG(printk ("ad1816: detect(%x)n", io_base));
  811. if (nr_ad1816_devs >= MAX_AUDIO_DEV) {
  812. printk(KERN_WARNING "ad1816: detect error - step 0n");
  813. goto out_release_region;
  814. }
  815. devc->base = io_base;
  816. devc->irq_ok = 0;
  817. devc->irq = 0;
  818. devc->opened = 0;
  819. devc->osp = osp;
  820. /* base+0: bit 1 must be set but not 255 */
  821. tmp=inb(devc->base);
  822. if ( (tmp&0x80)==0 || tmp==255 ) {
  823. DEBUGLOG (printk ("ad1816: Chip is not an AD1816 or chip is not active (Test 0)n"));
  824. goto out_release_region;
  825. }
  826. /* writes to ireg 8 are copied to ireg 9 */
  827. ad_write(devc,8,12345); 
  828. if (ad_read(devc,9)!=12345) {
  829. DEBUGLOG (printk ("ad1816: Chip is not an AD1816 (Test 1)n"));
  830. goto out_release_region;
  831. }
  832.   
  833. /* writes to ireg 8 are copied to ireg 9 */
  834. ad_write(devc,8,54321); 
  835. if (ad_read(devc,9)!=54321) {
  836. DEBUGLOG (printk ("ad1816: Chip is not an AD1816 (Test 2)n"));
  837. goto out_release_region;
  838. }
  839. /* writes to ireg 10 are copied to ireg 11 */
  840. ad_write(devc,10,54321); 
  841. if (ad_read(devc,11)!=54321) {
  842. DEBUGLOG (printk ("ad1816: Chip is not an AD1816 (Test 3)n"));
  843. goto out_release_region;
  844. }
  845. /* writes to ireg 10 are copied to ireg 11 */
  846. ad_write(devc,10,12345); 
  847. if (ad_read(devc,11)!=12345) {
  848. DEBUGLOG (printk ("ad1816: Chip is not an AD1816 (Test 4)n"));
  849. goto out_release_region;
  850. }
  851. /* bit in base +1 cannot be set to 1 */
  852. tmp=inb(devc->base+1);
  853. outb(0xff,devc->base+1); 
  854. if (inb(devc->base+1)!=tmp) {
  855. DEBUGLOG (printk ("ad1816: Chip is not an AD1816 (Test 5)n"));
  856. goto out_release_region;
  857. }
  858.   
  859. DEBUGLOG (printk ("ad1816: detect() - Detected OKn"));
  860. DEBUGLOG (printk ("ad1816: AD1816 Version: %dn",ad_read(devc,45)));
  861. /* detection was successful */
  862. return 1; 
  863. out_release_region:
  864. release_region(io_base, 16);
  865. /* detection was NOT successful */
  866. err: return 0;
  867. }
  868. /* allocate resources from the kernel. If any allocation fails, free
  869.    all allocated resources and exit attach.
  870.   
  871.  */
  872. static void __init attach_ad1816 (struct address_info *hw_config)
  873. {
  874. int             my_dev;
  875. char            dev_name[100];
  876. ad1816_info    *devc = &dev_info[nr_ad1816_devs];
  877. devc->base = hw_config->io_base;
  878. /* disable all interrupts */
  879. ad_write(devc,1,0);     
  880. /* Clear pending interrupts */
  881. outb (0, devc->base+1);
  882. /* allocate irq */
  883. if (hw_config->irq < 0 || hw_config->irq > 15)
  884. goto out_release_region;
  885. if (request_irq(hw_config->irq, ad1816_interrupt,0,
  886. "SoundPort", hw_config->osp) < 0) {
  887.         printk(KERN_WARNING "ad1816: IRQ in usen");
  888. goto out_release_region;
  889. }
  890. devc->irq=hw_config->irq;
  891. /* DMA stuff */
  892. if (sound_alloc_dma (hw_config->dma, "Sound System")) {
  893. printk(KERN_WARNING "ad1816: Can't allocate DMA%dn",
  894.     hw_config->dma);
  895. goto out_free_irq;
  896. }
  897. devc->dma_playback=hw_config->dma;
  898. if ( hw_config->dma2 != -1 && hw_config->dma2 != hw_config->dma) {
  899. if (sound_alloc_dma(hw_config->dma2,
  900.     "Sound System (capture)")) {
  901. printk(KERN_WARNING "ad1816: Can't allocate DMA%dn",
  902.     hw_config->dma2);
  903. goto out_free_dma;
  904. }
  905. devc->dma_capture=hw_config->dma2;
  906. devc->audio_mode=DMA_AUTOMODE|DMA_DUPLEX;
  907. } else {
  908.         devc->dma_capture=-1;
  909. devc->audio_mode=DMA_AUTOMODE;
  910. }
  911. sprintf (dev_name,"AD1816 audio driver");
  912.   
  913. conf_printf2 (dev_name,
  914.       devc->base, devc->irq, hw_config->dma, hw_config->dma2);
  915. /* register device */
  916. if ((my_dev = sound_install_audiodrv (AUDIO_DRIVER_VERSION,
  917.       dev_name,
  918.       &ad1816_audio_driver,
  919.       sizeof (struct audio_driver),
  920.       devc->audio_mode,
  921.       ad_format_mask,
  922.       devc,
  923.       hw_config->dma, 
  924.       hw_config->dma2)) < 0) {
  925. printk(KERN_WARNING "ad1816: Can't install sound drivern");
  926. goto out_free_dma_2;
  927. }
  928. /* fill rest of structure with reasonable default values */
  929. irq2dev[hw_config->irq] = devc->dev_no = my_dev;
  930. devc->opened = 0;
  931. devc->irq_ok = 0;
  932. devc->osp = hw_config->osp;  
  933. nr_ad1816_devs++;
  934. ad_write(devc,32,0x80f0); /* sound system mode */
  935. if (options&1) {
  936.         ad_write(devc,33,0); /* disable all audiosources for dsp */
  937. } else {
  938.         ad_write(devc,33,0x03f8); /* enable all audiosources for dsp */
  939. }
  940. ad_write(devc,4,0x8080);  /* default values for volumes (muted)*/
  941. ad_write(devc,5,0x8080);
  942. ad_write(devc,6,0x8080);
  943. ad_write(devc,7,0x8080);
  944. ad_write(devc,15,0x8888);
  945. ad_write(devc,16,0x8888);
  946. ad_write(devc,17,0x8888);
  947. ad_write(devc,18,0x8888);
  948. ad_write(devc,19,0xc888); /* +20db mic active */
  949. ad_write(devc,14,0x0000); /* Master volume unmuted */
  950. ad_write(devc,39,0x009f); /* 3D effect on 0% phone out muted */
  951. ad_write(devc,44,0x0080); /* everything on power, 3d enabled for d/a */
  952. outb(0x10,devc->base+8); /* set dma mode */
  953. outb(0x10,devc->base+9);
  954.   
  955. /* enable capture + playback interrupt */
  956. ad_write(devc,1,0xc000); 
  957. /* set mixer defaults */
  958. ad1816_mixer_reset (devc); 
  959.   
  960. /* register mixer */
  961. if ((audio_devs[my_dev]->mixer_dev=sound_install_mixer(
  962.        MIXER_DRIVER_VERSION,
  963.        dev_name,
  964.        &ad1816_mixer_operations,
  965.        sizeof (struct mixer_operations),
  966.        devc)) >= 0) {
  967. audio_devs[my_dev]->min_fragment = 0;
  968. }
  969. out: return;
  970. out_free_dma_2:
  971. if (devc->dma_capture >= 0)
  972.         sound_free_dma(hw_config->dma2);
  973. out_free_dma:
  974. sound_free_dma(hw_config->dma);
  975. out_free_irq:
  976. free_irq(hw_config->irq,hw_config->osp);
  977. out_release_region:
  978. release_region(hw_config->io_base, 16);
  979. goto out;
  980. }
  981. static void __exit unload_card(ad1816_info *devc)
  982. {
  983. int  mixer, dev = 0;
  984. if (devc != NULL) {
  985. DEBUGLOG (printk("ad1816: Unloading card at base=%xn",devc->base));
  986. dev = devc->dev_no;
  987. mixer = audio_devs[dev]->mixer_dev;
  988. /* unreg mixer*/
  989. if(mixer>=0) {
  990. sound_unload_mixerdev(mixer);
  991. }
  992. sound_unload_audiodev(dev);
  993. /* free dma channels */
  994. if (devc->dma_capture>=0) {
  995. sound_free_dma(devc->dma_capture);
  996. }
  997. /* card wont get added if resources could not be allocated
  998.    thus we need not ckeck if allocation was successful */
  999. sound_free_dma (devc->dma_playback);
  1000. free_irq(devc->irq, devc->osp);
  1001. release_region (devc->base, 16);
  1002. DEBUGLOG (printk("ad1816: Unloading card at base=%x was successfuln",devc->base));
  1003. } else
  1004. printk(KERN_WARNING "ad1816: no device/card specifiedn");
  1005. }
  1006. static struct address_info cfg;
  1007. static int __initdata io = -1;
  1008. static int __initdata irq = -1;
  1009. static int __initdata dma = -1;
  1010. static int __initdata dma2 = -1;
  1011. #if defined CONFIG_ISAPNP || defined CONFIG_ISAPNP_MODULE
  1012. struct pci_dev *ad1816_dev  = NULL;
  1013. static int activated = 1;
  1014. static int isapnp = 1;
  1015. static int isapnpjump = 0;
  1016. MODULE_PARM(isapnp, "i");
  1017. MODULE_PARM(isapnpjump, "i");
  1018. #else
  1019. static int isapnp = 0;
  1020. #endif
  1021. MODULE_PARM(io,"i");
  1022. MODULE_PARM(irq,"i");
  1023. MODULE_PARM(dma,"i");
  1024. MODULE_PARM(dma2,"i");
  1025. MODULE_PARM(ad1816_clockfreq,"i");
  1026. MODULE_PARM(options,"i");
  1027. #if defined CONFIG_ISAPNP || defined CONFIG_ISAPNP_MODULE
  1028. static struct pci_dev *activate_dev(char *devname, char *resname, struct pci_dev *dev)
  1029. {
  1030. int err;
  1031. if(dev->active) {
  1032. activated = 0;
  1033. return(dev);
  1034. }
  1035. if((err = dev->activate(dev)) < 0) {
  1036. printk(KERN_ERR "ad1816: %s %s config failed (out of resources?)[%d]n",
  1037. devname, resname, err);
  1038. dev->deactivate(dev);
  1039. return(NULL);
  1040. }
  1041. return(dev);
  1042. }
  1043. static struct pci_dev *ad1816_init_generic(struct pci_bus *bus, struct pci_dev *card,
  1044. struct address_info *hw_config)
  1045. {
  1046. if((ad1816_dev = isapnp_find_dev(bus, card->vendor, card->device, NULL))) {
  1047. ad1816_dev->prepare(ad1816_dev);
  1048. if((ad1816_dev = activate_dev("Analog Devices 1816(A)", "ad1816", ad1816_dev))) {
  1049. hw_config->io_base = ad1816_dev->resource[2].start;
  1050. hw_config->irq = ad1816_dev->irq_resource[0].start;
  1051. hw_config->dma = ad1816_dev->dma_resource[0].start;
  1052. hw_config->dma2 = ad1816_dev->dma_resource[1].start;
  1053. }
  1054. }
  1055. return(ad1816_dev);
  1056. }
  1057. struct isapnp_device_id isapnp_ad1816_list[] __initdata = {
  1058. { ISAPNP_ANY_ID, ISAPNP_ANY_ID,
  1059. ISAPNP_VENDOR('A','D','S'), ISAPNP_FUNCTION(0x7150), 
  1060. 0 },
  1061. { ISAPNP_ANY_ID, ISAPNP_ANY_ID,
  1062. ISAPNP_VENDOR('A','D','S'), ISAPNP_FUNCTION(0x7180),
  1063. 0 },
  1064. {0}
  1065. };
  1066. MODULE_DEVICE_TABLE(isapnp, isapnp_ad1816_list);
  1067. static int __init ad1816_init_isapnp(struct address_info *hw_config,
  1068. struct pci_bus *bus, struct pci_dev *card, int slot)
  1069. {
  1070. char *busname = bus->name[0] ? bus->name : "Analog Devices AD1816a";
  1071. struct pci_dev *idev = NULL;
  1072. printk(KERN_INFO "ad1816: %s detectedn", busname);
  1073. /* Initialize this baby. */
  1074. if ((idev = ad1816_init_generic(bus, card, hw_config))) {
  1075. /* We got it. */
  1076. printk(KERN_NOTICE "ad1816: ISAPnP reports '%s' at i/o %#x, irq %d, dma %d, %dn",
  1077. busname,
  1078. hw_config->io_base, hw_config->irq, hw_config->dma,
  1079. hw_config->dma2);
  1080. return 1;
  1081. } else
  1082. printk(KERN_INFO "ad1816: Failed to initialize %sn", busname);
  1083. return 0;
  1084. }
  1085. /*
  1086.  * Actually this routine will detect and configure only the first card with successful
  1087.  * initialization. isapnpjump could be used to jump to a specific entry.
  1088.  * Please always add entries at the end of the array.
  1089.  * Should this be fixed? - azummo
  1090.  */
  1091. int __init ad1816_probe_isapnp(struct address_info *hw_config)
  1092. {
  1093. int i;
  1094. /* Count entries in isapnp_ad1816_list */
  1095. for (i = 0; isapnp_ad1816_list[i].vendor != 0; i++)
  1096. ;
  1097. /* Check and adjust isapnpjump */
  1098. if( isapnpjump < 0 || isapnpjump > ( i - 1 ) ) {
  1099. printk(KERN_ERR "ad1816: Valid range for isapnpjump is 0-%d. Adjusted to 0.n", i-1);
  1100. isapnpjump = 0;
  1101. }
  1102.  for (i = isapnpjump; isapnp_ad1816_list[i].vendor != 0; i++) {
  1103.   struct pci_dev *card = NULL;
  1104. while ((card = isapnp_find_dev(NULL, isapnp_ad1816_list[i].vendor,
  1105.   isapnp_ad1816_list[i].function, card)))
  1106. if(ad1816_init_isapnp(hw_config, card->bus, card, i))
  1107. return 0;
  1108. }
  1109. return -ENODEV;
  1110. }
  1111. #endif
  1112. static int __init init_ad1816(void)
  1113. {
  1114. #if defined CONFIG_ISAPNP || defined CONFIG_ISAPNP_MODULE
  1115. if(isapnp && (ad1816_probe_isapnp(&cfg) < 0) ) {
  1116. printk(KERN_NOTICE "ad1816: No ISAPnP cards found, trying standard ones...n");
  1117. isapnp = 0;
  1118. }
  1119. #endif
  1120. if( isapnp == 0) {
  1121. cfg.io_base = io;
  1122. cfg.irq = irq;
  1123. cfg.dma = dma;
  1124. cfg.dma2 = dma2;
  1125. }
  1126. if (cfg.io_base == -1 || cfg.irq == -1 || cfg.dma == -1 || cfg.dma2 == -1) {
  1127. printk(KERN_INFO "ad1816: dma, dma2, irq and io must be set.n");
  1128. return -EINVAL;
  1129. }
  1130. if (probe_ad1816(&cfg) == 0) {
  1131. return -ENODEV;
  1132. }
  1133. attach_ad1816(&cfg);
  1134. return 0;
  1135. }
  1136. static void __exit cleanup_ad1816 (void)
  1137. {
  1138. int          i;
  1139. ad1816_info  *devc = NULL;
  1140.   
  1141. /* remove any soundcard */
  1142. for (i = 0;  i < nr_ad1816_devs; i++) {
  1143. devc = &dev_info[i];
  1144. unload_card(devc);
  1145. }     
  1146. nr_ad1816_devs=0;
  1147. #if defined CONFIG_ISAPNP || defined CONFIG_ISAPNP_MODULE
  1148. if(activated)
  1149. if(ad1816_dev)
  1150. ad1816_dev->deactivate(ad1816_dev);
  1151. #endif
  1152. }
  1153. module_init(init_ad1816);
  1154. module_exit(cleanup_ad1816);
  1155. #ifndef MODULE
  1156. static int __init setup_ad1816(char *str)
  1157. {
  1158. /* io, irq, dma, dma2 */
  1159. int ints[5];
  1160. str = get_options(str, ARRAY_SIZE(ints), ints);
  1161. io = ints[1];
  1162. irq = ints[2];
  1163. dma = ints[3];
  1164. dma2 = ints[4];
  1165. return 1;
  1166. }
  1167. __setup("ad1816=", setup_ad1816);
  1168. #endif
  1169. MODULE_LICENSE("GPL");