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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * sound/pss.c
  3.  *
  4.  * The low level driver for the Personal Sound System (ECHO ESC614).
  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.  * Alan Cox modularisation, clean up.
  16.  *
  17.  * 98-02-21: Vladimir Michl <vladimir.michl@upol.cz>
  18.  *          Added mixer device for Beethoven ADSP-16 (master volume,
  19.  *     bass, treble, synth), only for speakers.
  20.  *          Fixed bug in pss_write (exchange parameters)
  21.  *          Fixed config port of SB
  22.  *          Requested two regions for PSS (PSS mixer, PSS config)
  23.  *          Modified pss_download_boot
  24.  *          To probe_pss_mss added test for initialize AD1848
  25.  * 98-05-28: Vladimir Michl <vladimir.michl@upol.cz>
  26.  *          Fixed computation of mixer volumes
  27.  * 04-05-1999: Anthony Barbachan <barbcode@xmen.cis.fordham.edu>
  28.  *          Added code that allows the user to enable his cdrom and/or 
  29.  *          joystick through the module parameters pss_cdrom_port and 
  30.  *          pss_enable_joystick.  pss_cdrom_port takes a port address as its
  31.  *          argument.  pss_enable_joystick takes either a 0 or a non-0 as its
  32.  *          argument.
  33.  * 04-06-1999: Anthony Barbachan <barbcode@xmen.cis.fordham.edu>
  34.  *          Separated some code into new functions for easier reuse.  
  35.  *          Cleaned up and streamlined new code.  Added code to allow a user 
  36.  *          to only use this driver for enabling non-sound components 
  37.  *          through the new module parameter pss_no_sound (flag).  Added 
  38.  *          code that would allow a user to decide whether the driver should 
  39.  *          reset the configured hardware settings for the PSS board through 
  40.  *          the module parameter pss_keep_settings (flag).   This flag will 
  41.  *          allow a user to free up resources in use by this card if needbe, 
  42.  *          furthermore it allows him to use this driver to just enable the 
  43.  *          emulations and then be unloaded as it is no longer needed.  Both 
  44.  *          new settings are only available to this driver if compiled as a 
  45.  *          module.  The default settings of all new parameters are set to 
  46.  *          load the driver as it did in previous versions.
  47.  * 04-07-1999: Anthony Barbachan <barbcode@xmen.cis.fordham.edu>
  48.  *          Added module parameter pss_firmware to allow the user to tell 
  49.  *          the driver where the fireware file is located.  The default 
  50.  *          setting is the previous hardcoded setting "/etc/sound/pss_synth".
  51.  * 00-03-03: Christoph Hellwig <chhellwig@infradead.org>
  52.  *     Adapted to module_init/module_exit
  53.  * 11-10-2000: Bartlomiej Zolnierkiewicz <bkz@linux-ide.org>
  54.  *     Added __init to probe_pss(), attach_pss() and probe_pss_mpu()
  55.  * 02-Jan-2001: Chris Rankin
  56.  *          Specify that this module owns the coprocessor
  57.  */
  58. #include <linux/config.h>
  59. #include <linux/init.h>
  60. #include <linux/module.h>
  61. #include "sound_config.h"
  62. #include "sound_firmware.h"
  63. #include "ad1848.h"
  64. #include "mpu401.h"
  65. /*
  66.  * PSS registers.
  67.  */
  68. #define REG(x) (devc->base+x)
  69. #define PSS_DATA 0
  70. #define PSS_STATUS 2
  71. #define PSS_CONTROL 2
  72. #define PSS_ID 4
  73. #define PSS_IRQACK 4
  74. #define PSS_PIO 0x1a
  75. /*
  76.  * Config registers
  77.  */
  78. #define CONF_PSS 0x10
  79. #define CONF_WSS 0x12
  80. #define CONF_SB 0x14
  81. #define CONF_CDROM 0x16
  82. #define CONF_MIDI 0x18
  83. /*
  84.  * Status bits.
  85.  */
  86. #define PSS_FLAG3     0x0800
  87. #define PSS_FLAG2     0x0400
  88. #define PSS_FLAG1     0x1000
  89. #define PSS_FLAG0     0x0800
  90. #define PSS_WRITE_EMPTY  0x8000
  91. #define PSS_READ_FULL    0x4000
  92. /*
  93.  * WSS registers
  94.  */
  95. #define WSS_INDEX 4
  96. #define WSS_DATA 5
  97. /*
  98.  * WSS status bits
  99.  */
  100. #define WSS_INITIALIZING 0x80
  101. #define WSS_AUTOCALIBRATION 0x20
  102. #define NO_WSS_MIXER -1
  103. #include "coproc.h"
  104. #include "pss_boot.h"
  105. /* If compiled into kernel, it enable or disable pss mixer */
  106. #ifdef CONFIG_PSS_MIXER
  107. static unsigned char pss_mixer = 1;
  108. #else
  109. static unsigned char pss_mixer = 0;
  110. #endif
  111. typedef struct pss_mixerdata {
  112. unsigned int volume_l;
  113. unsigned int volume_r;
  114. unsigned int bass;
  115. unsigned int treble;
  116. unsigned int synth;
  117. } pss_mixerdata;
  118. typedef struct pss_confdata {
  119. int             base;
  120. int             irq;
  121. int             dma;
  122. int            *osp;
  123. pss_mixerdata   mixer;
  124. int             ad_mixer_dev;
  125. } pss_confdata;
  126.   
  127. static pss_confdata pss_data;
  128. static pss_confdata *devc = &pss_data;
  129. static int      pss_initialized = 0;
  130. static int      nonstandard_microcode = 0;
  131. static int pss_cdrom_port = -1; /* Parameter for the PSS cdrom port */
  132. static int pss_enable_joystick = 0;/* Parameter for enabling the joystick */
  133. static void pss_write(pss_confdata *devc, int data)
  134. {
  135. int i, limit;
  136. limit = jiffies + HZ/10; /* The timeout is 0.1 seconds */
  137. /*
  138.  * Note! the i<5000000 is an emergency exit. The dsp_command() is sometimes
  139.  * called while interrupts are disabled. This means that the timer is
  140.  * disabled also. However the timeout situation is a abnormal condition.
  141.  * Normally the DSP should be ready to accept commands after just couple of
  142.  * loops.
  143.  */
  144. for (i = 0; i < 5000000 && time_before(jiffies, limit); i++)
  145.   {
  146.   if (inw(REG(PSS_STATUS)) & PSS_WRITE_EMPTY)
  147.   {
  148.   outw(data, REG(PSS_DATA));
  149.   return;
  150.   }
  151.   }
  152.   printk(KERN_WARNING "PSS: DSP Command (%04x) Timeout.n", data);
  153. }
  154. int __init probe_pss(struct address_info *hw_config)
  155. {
  156. unsigned short id;
  157. int irq, dma;
  158. devc->base = hw_config->io_base;
  159. irq = devc->irq = hw_config->irq;
  160. dma = devc->dma = hw_config->dma;
  161. devc->osp = hw_config->osp;
  162. if (devc->base != 0x220 && devc->base != 0x240)
  163. if (devc->base != 0x230 && devc->base != 0x250) /* Some cards use these */
  164. return 0;
  165. if (check_region(devc->base, 0x19 /*16*/)) { 
  166. printk(KERN_ERR "PSS: I/O port conflictn");
  167. return 0;
  168. }
  169. id = inw(REG(PSS_ID));
  170. if ((id >> 8) != 'E') {
  171. printk(KERN_ERR "No PSS signature detected at 0x%x (0x%x)n",  devc->base,  id); 
  172. return 0;
  173. }
  174. return 1;
  175. }
  176. static int set_irq(pss_confdata * devc, int dev, int irq)
  177. {
  178. static unsigned short irq_bits[16] =
  179. {
  180. 0x0000, 0x0000, 0x0000, 0x0008,
  181. 0x0000, 0x0010, 0x0000, 0x0018,
  182. 0x0000, 0x0020, 0x0028, 0x0030,
  183. 0x0038, 0x0000, 0x0000, 0x0000
  184. };
  185. unsigned short  tmp, bits;
  186. if (irq < 0 || irq > 15)
  187. return 0;
  188. tmp = inw(REG(dev)) & ~0x38; /* Load confreg, mask IRQ bits out */
  189. if ((bits = irq_bits[irq]) == 0 && irq != 0)
  190. {
  191. printk(KERN_ERR "PSS: Invalid IRQ %dn", irq);
  192. return 0;
  193. }
  194. outw(tmp | bits, REG(dev));
  195. return 1;
  196. }
  197. static int set_io_base(pss_confdata * devc, int dev, int base)
  198. {
  199. unsigned short  tmp = inw(REG(dev)) & 0x003f;
  200. unsigned short  bits = (base & 0x0ffc) << 4;
  201. outw(bits | tmp, REG(dev));
  202. return 1;
  203. }
  204. static int set_dma(pss_confdata * devc, int dev, int dma)
  205. {
  206. static unsigned short dma_bits[8] =
  207. {
  208. 0x0001, 0x0002, 0x0000, 0x0003,
  209. 0x0000, 0x0005, 0x0006, 0x0007
  210. };
  211. unsigned short  tmp, bits;
  212. if (dma < 0 || dma > 7)
  213. return 0;
  214. tmp = inw(REG(dev)) & ~0x07; /* Load confreg, mask DMA bits out */
  215. if ((bits = dma_bits[dma]) == 0 && dma != 4)
  216. {
  217.   printk(KERN_ERR "PSS: Invalid DMA %dn", dma);
  218.   return 0;
  219. }
  220. outw(tmp | bits, REG(dev));
  221. return 1;
  222. }
  223. static int pss_reset_dsp(pss_confdata * devc)
  224. {
  225. unsigned long   i, limit = jiffies + HZ/10;
  226. outw(0x2000, REG(PSS_CONTROL));
  227. for (i = 0; i < 32768 && (limit-jiffies >= 0); i++)
  228. inw(REG(PSS_CONTROL));
  229. outw(0x0000, REG(PSS_CONTROL));
  230. return 1;
  231. }
  232. static int pss_put_dspword(pss_confdata * devc, unsigned short word)
  233. {
  234. int i, val;
  235. for (i = 0; i < 327680; i++)
  236. {
  237. val = inw(REG(PSS_STATUS));
  238. if (val & PSS_WRITE_EMPTY)
  239. {
  240. outw(word, REG(PSS_DATA));
  241. return 1;
  242. }
  243. }
  244. return 0;
  245. }
  246. static int pss_get_dspword(pss_confdata * devc, unsigned short *word)
  247. {
  248. int i, val;
  249. for (i = 0; i < 327680; i++)
  250. {
  251. val = inw(REG(PSS_STATUS));
  252. if (val & PSS_READ_FULL)
  253. {
  254. *word = inw(REG(PSS_DATA));
  255. return 1;
  256. }
  257. }
  258. return 0;
  259. }
  260. static int pss_download_boot(pss_confdata * devc, unsigned char *block, int size, int flags)
  261. {
  262. int i, limit, val, count;
  263. if (flags & CPF_FIRST)
  264. {
  265. /*_____ Warn DSP software that a boot is coming */
  266. outw(0x00fe, REG(PSS_DATA));
  267. limit = jiffies + HZ/10;
  268. for (i = 0; i < 32768 && time_before(jiffies, limit); i++)
  269. if (inw(REG(PSS_DATA)) == 0x5500)
  270. break;
  271. outw(*block++, REG(PSS_DATA));
  272. pss_reset_dsp(devc);
  273. }
  274. count = 1;
  275. while ((flags&CPF_LAST) || count<size )
  276. {
  277. int j;
  278. for (j = 0; j < 327670; j++)
  279. {
  280. /*_____ Wait for BG to appear */
  281. if (inw(REG(PSS_STATUS)) & PSS_FLAG3)
  282. break;
  283. }
  284. if (j == 327670)
  285. {
  286. /* It's ok we timed out when the file was empty */
  287. if (count >= size && flags & CPF_LAST)
  288. break;
  289. else
  290. {
  291. printk("n");
  292. printk(KERN_ERR "PSS: Download timeout problems, byte %d=%dn", count, size);
  293. return 0;
  294. }
  295. }
  296. /*_____ Send the next byte */
  297. if (count >= size) 
  298. {
  299. /* If not data in block send 0xffff */
  300. outw (0xffff, REG (PSS_DATA));
  301. }
  302. else
  303. {
  304. /*_____ Send the next byte */
  305. outw (*block++, REG (PSS_DATA));
  306. };
  307. count++;
  308. }
  309. if (flags & CPF_LAST)
  310. {
  311. /*_____ Why */
  312. outw(0, REG(PSS_DATA));
  313. limit = jiffies + HZ/10;
  314. for (i = 0; i < 32768 && (limit - jiffies >= 0); i++)
  315. val = inw(REG(PSS_STATUS));
  316. limit = jiffies + HZ/10;
  317. for (i = 0; i < 32768 && (limit-jiffies >= 0); i++)
  318. {
  319. val = inw(REG(PSS_STATUS));
  320. if (val & 0x4000)
  321. break;
  322. }
  323. /* now read the version */
  324. for (i = 0; i < 32000; i++)
  325. {
  326. val = inw(REG(PSS_STATUS));
  327. if (val & PSS_READ_FULL)
  328. break;
  329. }
  330. if (i == 32000)
  331. return 0;
  332. val = inw(REG(PSS_DATA));
  333. /* printk( "<PSS: microcode version %d.%d loaded>",  val/16,  val % 16); */
  334. }
  335. return 1;
  336. }
  337. /* Mixer */
  338. static void set_master_volume(pss_confdata *devc, int left, int right)
  339. {
  340. static unsigned char log_scale[101] =  {
  341. 0xdb, 0xe0, 0xe3, 0xe5, 0xe7, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xed, 0xee,
  342. 0xef, 0xef, 0xf0, 0xf0, 0xf1, 0xf1, 0xf2, 0xf2, 0xf2, 0xf3, 0xf3, 0xf3,
  343. 0xf4, 0xf4, 0xf4, 0xf5, 0xf5, 0xf5, 0xf5, 0xf6, 0xf6, 0xf6, 0xf6, 0xf7,
  344. 0xf7, 0xf7, 0xf7, 0xf7, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf9, 0xf9, 0xf9,
  345. 0xf9, 0xf9, 0xf9, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfa, 0xfb, 0xfb,
  346. 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc,
  347. 0xfc, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd,
  348. 0xfd, 0xfd, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe,
  349. 0xfe, 0xfe, 0xff, 0xff, 0xff
  350. };
  351. pss_write(devc, 0x0010);
  352. pss_write(devc, log_scale[left] | 0x0000);
  353. pss_write(devc, 0x0010);
  354. pss_write(devc, log_scale[right] | 0x0100);
  355. }
  356. static void set_synth_volume(pss_confdata *devc, int volume)
  357. {
  358. int vol = ((0x8000*volume)/100L);
  359. pss_write(devc, 0x0080);
  360. pss_write(devc, vol);
  361. pss_write(devc, 0x0081);
  362. pss_write(devc, vol);
  363. }
  364. static void set_bass(pss_confdata *devc, int level)
  365. {
  366. int vol = (int)(((0xfd - 0xf0) * level)/100L) + 0xf0;
  367. pss_write(devc, 0x0010);
  368. pss_write(devc, vol | 0x0200);
  369. };
  370. static void set_treble(pss_confdata *devc, int level)
  371. {
  372. int vol = (((0xfd - 0xf0) * level)/100L) + 0xf0;
  373. pss_write(devc, 0x0010);
  374. pss_write(devc, vol | 0x0300);
  375. };
  376. static void pss_mixer_reset(pss_confdata *devc)
  377. {
  378. set_master_volume(devc, 33, 33);
  379. set_bass(devc, 50);
  380. set_treble(devc, 50);
  381. set_synth_volume(devc, 30);
  382. pss_write (devc, 0x0010);
  383. pss_write (devc, 0x0800 | 0xce); /* Stereo */
  384. if(pss_mixer)
  385. {
  386. devc->mixer.volume_l = devc->mixer.volume_r = 33;
  387. devc->mixer.bass = 50;
  388. devc->mixer.treble = 50;
  389. devc->mixer.synth = 30;
  390. }
  391. }
  392. static void arg_to_volume_mono(unsigned int volume, int *aleft)
  393. {
  394. int left;
  395. left = volume & 0x00ff;
  396. if (left > 100)
  397. left = 100;
  398. *aleft = left;
  399. }
  400. static void arg_to_volume_stereo(unsigned int volume, int *aleft, int *aright)
  401. {
  402. arg_to_volume_mono(volume, aleft);
  403. arg_to_volume_mono(volume >> 8, aright);
  404. }
  405. static int ret_vol_mono(int left)
  406. {
  407. return ((left << 8) | left);
  408. }
  409. static int ret_vol_stereo(int left, int right)
  410. {
  411. return ((right << 8) | left);
  412. }
  413. static int call_ad_mixer(pss_confdata *devc,unsigned int cmd, caddr_t arg)
  414. {
  415. if (devc->ad_mixer_dev != NO_WSS_MIXER) 
  416. return mixer_devs[devc->ad_mixer_dev]->ioctl(devc->ad_mixer_dev, cmd, arg);
  417. else 
  418. return -EINVAL;
  419. }
  420. static int pss_mixer_ioctl (int dev, unsigned int cmd, caddr_t arg)
  421. {
  422. pss_confdata *devc = mixer_devs[dev]->devc;
  423. int cmdf = cmd & 0xff;
  424. if ((cmdf != SOUND_MIXER_VOLUME) && (cmdf != SOUND_MIXER_BASS) &&
  425. (cmdf != SOUND_MIXER_TREBLE) && (cmdf != SOUND_MIXER_SYNTH) &&
  426. (cmdf != SOUND_MIXER_DEVMASK) && (cmdf != SOUND_MIXER_STEREODEVS) &&
  427. (cmdf != SOUND_MIXER_RECMASK) && (cmdf != SOUND_MIXER_CAPS) &&
  428. (cmdf != SOUND_MIXER_RECSRC)) 
  429. {
  430. return call_ad_mixer(devc, cmd, arg);
  431. }
  432. if (((cmd >> 8) & 0xff) != 'M')
  433. return -EINVAL;
  434. if (_SIOC_DIR (cmd) & _SIOC_WRITE)
  435. {
  436. switch (cmdf)
  437. {
  438. case SOUND_MIXER_RECSRC:
  439. if (devc->ad_mixer_dev != NO_WSS_MIXER)
  440. return call_ad_mixer(devc, cmd, arg);
  441. else
  442. {
  443. if (*(int *)arg != 0)
  444. return -EINVAL;
  445. return 0;
  446. }
  447. case SOUND_MIXER_VOLUME:
  448. arg_to_volume_stereo(*(unsigned int *)arg, &devc->mixer.volume_l,
  449. &devc->mixer.volume_r); 
  450. set_master_volume(devc, devc->mixer.volume_l,
  451. devc->mixer.volume_r);
  452. return ret_vol_stereo(devc->mixer.volume_l,
  453. devc->mixer.volume_r);
  454.   
  455. case SOUND_MIXER_BASS:
  456. arg_to_volume_mono(*(unsigned int *)arg,
  457. &devc->mixer.bass);
  458. set_bass(devc, devc->mixer.bass);
  459. return ret_vol_mono(devc->mixer.bass);
  460.   
  461. case SOUND_MIXER_TREBLE:
  462. arg_to_volume_mono(*(unsigned int *)arg,
  463. &devc->mixer.treble);
  464. set_treble(devc, devc->mixer.treble);
  465. return ret_vol_mono(devc->mixer.treble);
  466.   
  467. case SOUND_MIXER_SYNTH:
  468. arg_to_volume_mono(*(unsigned int *)arg,
  469. &devc->mixer.synth);
  470. set_synth_volume(devc, devc->mixer.synth);
  471. return ret_vol_mono(devc->mixer.synth);
  472.   
  473. default:
  474. return -EINVAL;
  475. }
  476. }
  477. else
  478. {
  479. /*
  480.  * Return parameters
  481.  */
  482. switch (cmdf)
  483. {
  484. case SOUND_MIXER_DEVMASK:
  485. if (call_ad_mixer(devc, cmd, arg) == -EINVAL)
  486. *(int *)arg = 0; /* no mixer devices */
  487. return (*(int *)arg |= SOUND_MASK_VOLUME | SOUND_MASK_BASS | SOUND_MASK_TREBLE | SOUND_MASK_SYNTH);
  488.   
  489. case SOUND_MIXER_STEREODEVS:
  490. if (call_ad_mixer(devc, cmd, arg) == -EINVAL)
  491. *(int *)arg = 0; /* no stereo devices */
  492. return (*(int *)arg |= SOUND_MASK_VOLUME);
  493.   
  494. case SOUND_MIXER_RECMASK:
  495. if (devc->ad_mixer_dev != NO_WSS_MIXER)
  496. return call_ad_mixer(devc, cmd, arg);
  497. else
  498. return (*(int *)arg = 0); /* no record devices */
  499. case SOUND_MIXER_CAPS:
  500. if (devc->ad_mixer_dev != NO_WSS_MIXER)
  501. return call_ad_mixer(devc, cmd, arg);
  502. else
  503. return (*(int *)arg = SOUND_CAP_EXCL_INPUT);
  504. case SOUND_MIXER_RECSRC:
  505. if (devc->ad_mixer_dev != NO_WSS_MIXER)
  506. return call_ad_mixer(devc, cmd, arg);
  507. else
  508. return (*(int *)arg = 0); /* no record source */
  509. case SOUND_MIXER_VOLUME:
  510. return (*(int *)arg = ret_vol_stereo(devc->mixer.volume_l, devc->mixer.volume_r));
  511.   
  512. case SOUND_MIXER_BASS:
  513. return (*(int *)arg = ret_vol_mono(devc->mixer.bass));
  514.   
  515. case SOUND_MIXER_TREBLE:
  516. return (*(int *)arg = ret_vol_mono(devc->mixer.treble));
  517.   
  518. case SOUND_MIXER_SYNTH:
  519. return (*(int *)arg = ret_vol_mono(devc->mixer.synth));
  520. default:
  521. return -EINVAL;
  522. }
  523. }
  524. }
  525. static struct mixer_operations pss_mixer_operations =
  526. {
  527. owner: THIS_MODULE,
  528. id: "SOUNDPORT",
  529. name: "PSS-AD1848",
  530. ioctl: pss_mixer_ioctl
  531. };
  532. void disable_all_emulations(void)
  533. {
  534. outw(0x0000, REG(CONF_PSS)); /* 0x0400 enables joystick */
  535. outw(0x0000, REG(CONF_WSS));
  536. outw(0x0000, REG(CONF_SB));
  537. outw(0x0000, REG(CONF_MIDI));
  538. outw(0x0000, REG(CONF_CDROM));
  539. }
  540. void configure_nonsound_components(void)
  541. {
  542. /* Configure Joystick port */
  543. if(pss_enable_joystick)
  544. {
  545. outw(0x0400, REG(CONF_PSS)); /* 0x0400 enables joystick */
  546. printk(KERN_INFO "PSS: joystick enabled.n");
  547. }
  548. else
  549. {
  550. printk(KERN_INFO "PSS: joystick port not enabled.n");
  551. }
  552. /* Configure CDROM port */
  553. if(pss_cdrom_port == -1) /* If cdrom port enablation wasn't requested */
  554. {
  555. printk(KERN_INFO "PSS: CDROM port not enabled.n");
  556. }
  557. else if(check_region(pss_cdrom_port, 2))
  558. {
  559. printk(KERN_ERR "PSS: CDROM I/O port conflict.n");
  560. }
  561. else if(!set_io_base(devc, CONF_CDROM, pss_cdrom_port))
  562. {
  563. printk(KERN_ERR "PSS: CDROM I/O port could not be set.n");
  564. }
  565. else /* CDROM port successfully configured */
  566. {
  567. printk(KERN_INFO "PSS: CDROM I/O port set to 0x%x.n", pss_cdrom_port);
  568. }
  569. }
  570. void __init attach_pss(struct address_info *hw_config)
  571. {
  572. unsigned short  id;
  573. char tmp[100];
  574. devc->base = hw_config->io_base;
  575. devc->irq = hw_config->irq;
  576. devc->dma = hw_config->dma;
  577. devc->osp = hw_config->osp;
  578. devc->ad_mixer_dev = NO_WSS_MIXER;
  579. if (!probe_pss(hw_config))
  580. return;
  581. request_region(hw_config->io_base, 0x10, "PSS mixer, SB emulation");
  582. request_region(hw_config->io_base + 0x10, 0x9, "PSS config");
  583. id = inw(REG(PSS_ID)) & 0x00ff;
  584. /*
  585.  * Disable all emulations. Will be enabled later (if required).
  586.  */
  587.  
  588. disable_all_emulations();
  589. #if YOU_REALLY_WANT_TO_ALLOCATE_THESE_RESOURCES
  590. if (sound_alloc_dma(hw_config->dma, "PSS"))
  591. {
  592. printk("pss.c: Can't allocate DMA channel.n");
  593. return;
  594. }
  595. if (!set_irq(devc, CONF_PSS, devc->irq))
  596. {
  597. printk("PSS: IRQ allocation error.n");
  598. return;
  599. }
  600. if (!set_dma(devc, CONF_PSS, devc->dma))
  601. {
  602. printk(KERN_ERR "PSS: DMA allocation errorn");
  603. return;
  604. }
  605. #endif
  606. configure_nonsound_components();
  607. pss_initialized = 1;
  608. sprintf(tmp, "ECHO-PSS  Rev. %d", id);
  609. conf_printf(tmp, hw_config);
  610. }
  611. int __init probe_pss_mpu(struct address_info *hw_config)
  612. {
  613. int timeout;
  614. if (!pss_initialized)
  615. return 0;
  616. if (check_region(hw_config->io_base, 2))
  617. {
  618. printk(KERN_ERR "PSS: MPU I/O port conflictn");
  619. return 0;
  620. }
  621. if (!set_io_base(devc, CONF_MIDI, hw_config->io_base))
  622. {
  623.   printk(KERN_ERR "PSS: MIDI base could not be set.n");
  624.   return 0;
  625. }
  626. if (!set_irq(devc, CONF_MIDI, hw_config->irq))
  627. {
  628.   printk(KERN_ERR "PSS: MIDI IRQ allocation error.n");
  629.   return 0;
  630. }
  631. if (!pss_synthLen)
  632. {
  633. printk(KERN_ERR "PSS: Can't enable MPU. MIDI synth microcode not available.n");
  634. return 0;
  635. }
  636. if (!pss_download_boot(devc, pss_synth, pss_synthLen, CPF_FIRST | CPF_LAST))
  637. {
  638. printk(KERN_ERR "PSS: Unable to load MIDI synth microcode to DSP.n");
  639. return 0;
  640. }
  641. /*
  642.  * Finally wait until the DSP algorithm has initialized itself and
  643.  * deactivates receive interrupt.
  644.  */
  645. for (timeout = 900000; timeout > 0; timeout--)
  646. {
  647. if ((inb(hw_config->io_base + 1) & 0x80) == 0) /* Input data avail */
  648. inb(hw_config->io_base); /* Discard it */
  649. else
  650. break; /* No more input */
  651. }
  652. return probe_mpu401(hw_config);
  653. }
  654. static int pss_coproc_open(void *dev_info, int sub_device)
  655. {
  656. switch (sub_device)
  657. {
  658. case COPR_MIDI:
  659. if (pss_synthLen == 0)
  660. {
  661. printk(KERN_ERR "PSS: MIDI synth microcode not available.n");
  662. return -EIO;
  663. }
  664. if (nonstandard_microcode)
  665. if (!pss_download_boot(devc, pss_synth, pss_synthLen, CPF_FIRST | CPF_LAST))
  666. {
  667. printk(KERN_ERR "PSS: Unable to load MIDI synth microcode to DSP.n");
  668. return -EIO;
  669. }
  670. nonstandard_microcode = 0;
  671. break;
  672. default:
  673. break;
  674. }
  675. return 0;
  676. }
  677. static void pss_coproc_close(void *dev_info, int sub_device)
  678. {
  679. return;
  680. }
  681. static void pss_coproc_reset(void *dev_info)
  682. {
  683. if (pss_synthLen)
  684. if (!pss_download_boot(devc, pss_synth, pss_synthLen, CPF_FIRST | CPF_LAST))
  685. {
  686. printk(KERN_ERR "PSS: Unable to load MIDI synth microcode to DSP.n");
  687. }
  688. nonstandard_microcode = 0;
  689. }
  690. static int download_boot_block(void *dev_info, copr_buffer * buf)
  691. {
  692. if (buf->len <= 0 || buf->len > sizeof(buf->data))
  693. return -EINVAL;
  694. if (!pss_download_boot(devc, buf->data, buf->len, buf->flags))
  695. {
  696. printk(KERN_ERR "PSS: Unable to load microcode block to DSP.n");
  697. return -EIO;
  698. }
  699. nonstandard_microcode = 1; /* The MIDI microcode has been overwritten */
  700. return 0;
  701. }
  702. static int pss_coproc_ioctl(void *dev_info, unsigned int cmd, caddr_t arg, int local)
  703. {
  704. copr_buffer *buf;
  705. copr_msg *mbuf;
  706. copr_debug_buf dbuf;
  707. unsigned short tmp;
  708. unsigned long flags;
  709. unsigned short *data;
  710. int i, err;
  711. /* printk( "PSS coproc ioctl %x %x %dn",  cmd,  arg,  local); */
  712. switch (cmd) 
  713. {
  714. case SNDCTL_COPR_RESET:
  715. pss_coproc_reset(dev_info);
  716. return 0;
  717. case SNDCTL_COPR_LOAD:
  718. buf = (copr_buffer *) vmalloc(sizeof(copr_buffer));
  719. if (buf == NULL)
  720. return -ENOSPC;
  721. if (copy_from_user(buf, arg, sizeof(copr_buffer))) {
  722. vfree(buf);
  723. return -EFAULT;
  724. }
  725. err = download_boot_block(dev_info, buf);
  726. vfree(buf);
  727. return err;
  728. case SNDCTL_COPR_SENDMSG:
  729. mbuf = (copr_msg *)vmalloc(sizeof(copr_msg));
  730. if (mbuf == NULL)
  731. return -ENOSPC;
  732. if (copy_from_user(mbuf, arg, sizeof(copr_msg))) {
  733. vfree(mbuf);
  734. return -EFAULT;
  735. }
  736. data = (unsigned short *)(mbuf->data);
  737. save_flags(flags);
  738. cli();
  739. for (i = 0; i < mbuf->len; i++) {
  740. if (!pss_put_dspword(devc, *data++)) {
  741. restore_flags(flags);
  742. mbuf->len = i; /* feed back number of WORDs sent */
  743. err = copy_to_user(arg, mbuf, sizeof(copr_msg));
  744. vfree(mbuf);
  745. return err ? -EFAULT : -EIO;
  746. }
  747. }
  748. restore_flags(flags);
  749. vfree(mbuf);
  750. return 0;
  751. case SNDCTL_COPR_RCVMSG:
  752. err = 0;
  753. mbuf = (copr_msg *)vmalloc(sizeof(copr_msg));
  754. if (mbuf == NULL)
  755. return -ENOSPC;
  756. data = (unsigned short *)mbuf->data;
  757. save_flags(flags);
  758. cli();
  759. for (i = 0; i < sizeof(mbuf->data)/sizeof(unsigned short); i++) {
  760. mbuf->len = i; /* feed back number of WORDs read */
  761. if (!pss_get_dspword(devc, data++)) {
  762. if (i == 0)
  763. err = -EIO;
  764. break;
  765. }
  766. }
  767. restore_flags(flags);
  768. if (copy_to_user(arg, mbuf, sizeof(copr_msg)))
  769. err = -EFAULT;
  770. vfree(mbuf);
  771. return err;
  772. case SNDCTL_COPR_RDATA:
  773. if (copy_from_user(&dbuf, arg, sizeof(dbuf)))
  774. return -EFAULT;
  775. save_flags(flags);
  776. cli();
  777. if (!pss_put_dspword(devc, 0x00d0)) {
  778. restore_flags(flags);
  779. return -EIO;
  780. }
  781. if (!pss_put_dspword(devc, (unsigned short)(dbuf.parm1 & 0xffff))) {
  782. restore_flags(flags);
  783. return -EIO;
  784. }
  785. if (!pss_get_dspword(devc, &tmp)) {
  786. restore_flags(flags);
  787. return -EIO;
  788. }
  789. dbuf.parm1 = tmp;
  790. restore_flags(flags);
  791. if (copy_to_user(arg, &dbuf, sizeof(dbuf)))
  792. return -EFAULT;
  793. return 0;
  794. case SNDCTL_COPR_WDATA:
  795. if (copy_from_user(&dbuf, arg, sizeof(dbuf)))
  796. return -EFAULT;
  797. save_flags(flags);
  798. cli();
  799. if (!pss_put_dspword(devc, 0x00d1)) {
  800. restore_flags(flags);
  801. return -EIO;
  802. }
  803. if (!pss_put_dspword(devc, (unsigned short) (dbuf.parm1 & 0xffff))) {
  804. restore_flags(flags);
  805. return -EIO;
  806. }
  807. tmp = (unsigned int)dbuf.parm2 & 0xffff;
  808. if (!pss_put_dspword(devc, tmp)) {
  809. restore_flags(flags);
  810. return -EIO;
  811. }
  812. restore_flags(flags);
  813. return 0;
  814. case SNDCTL_COPR_WCODE:
  815. if (copy_from_user(&dbuf, arg, sizeof(dbuf)))
  816. return -EFAULT;
  817. save_flags(flags);
  818. cli();
  819. if (!pss_put_dspword(devc, 0x00d3)) {
  820. restore_flags(flags);
  821. return -EIO;
  822. }
  823. if (!pss_put_dspword(devc, (unsigned short)(dbuf.parm1 & 0xffff))) {
  824. restore_flags(flags);
  825. return -EIO;
  826. }
  827. tmp = (unsigned int)dbuf.parm2 & 0x00ff;
  828. if (!pss_put_dspword(devc, tmp)) {
  829. restore_flags(flags);
  830. return -EIO;
  831. }
  832. tmp = ((unsigned int)dbuf.parm2 >> 8) & 0xffff;
  833. if (!pss_put_dspword(devc, tmp)) {
  834. restore_flags(flags);
  835. return -EIO;
  836. }
  837. restore_flags(flags);
  838. return 0;
  839. case SNDCTL_COPR_RCODE:
  840. if (copy_from_user(&dbuf, arg, sizeof(dbuf)))
  841. return -EFAULT;
  842. save_flags(flags);
  843. cli();
  844. if (!pss_put_dspword(devc, 0x00d2)) {
  845. restore_flags(flags);
  846. return -EIO;
  847. }
  848. if (!pss_put_dspword(devc, (unsigned short)(dbuf.parm1 & 0xffff))) {
  849. restore_flags(flags);
  850. return -EIO;
  851. }
  852. if (!pss_get_dspword(devc, &tmp)) { /* Read MSB */
  853. restore_flags(flags);
  854. return -EIO;
  855. }
  856. dbuf.parm1 = tmp << 8;
  857. if (!pss_get_dspword(devc, &tmp)) { /* Read LSB */
  858. restore_flags(flags);
  859. return -EIO;
  860. }
  861. dbuf.parm1 |= tmp & 0x00ff;
  862. restore_flags(flags);
  863. if (copy_to_user(arg, &dbuf, sizeof(dbuf)))
  864. return -EFAULT;
  865. return 0;
  866. default:
  867. return -EINVAL;
  868. }
  869. return -EINVAL;
  870. }
  871. static coproc_operations pss_coproc_operations =
  872. {
  873. "ADSP-2115",
  874. THIS_MODULE,
  875. pss_coproc_open,
  876. pss_coproc_close,
  877. pss_coproc_ioctl,
  878. pss_coproc_reset,
  879. &pss_data
  880. };
  881. static void __init attach_pss_mpu(struct address_info *hw_config)
  882. {
  883. attach_mpu401(hw_config, THIS_MODULE); /* Slot 1 */
  884. if (hw_config->slots[1] != -1) /* The MPU driver installed itself */
  885. midi_devs[hw_config->slots[1]]->coproc = &pss_coproc_operations;
  886. }
  887. static int __init probe_pss_mss(struct address_info *hw_config)
  888. {
  889. volatile int timeout;
  890. if (!pss_initialized)
  891. return 0;
  892. if (check_region(hw_config->io_base, 8))
  893. {
  894.   printk(KERN_ERR "PSS: WSS I/O port conflicts.n");
  895.   return 0;
  896. }
  897. if (!set_io_base(devc, CONF_WSS, hw_config->io_base))
  898. {
  899. printk("PSS: WSS base not settable.n");
  900. return 0;
  901. }
  902. if (!set_irq(devc, CONF_WSS, hw_config->irq))
  903. {
  904. printk("PSS: WSS IRQ allocation error.n");
  905. return 0;
  906. }
  907. if (!set_dma(devc, CONF_WSS, hw_config->dma))
  908. {
  909. printk(KERN_ERR "PSS: WSS DMA allocation errorn");
  910. return 0;
  911. }
  912. /*
  913.  * For some reason the card returns 0xff in the WSS status register
  914.  * immediately after boot. Probably MIDI+SB emulation algorithm
  915.  * downloaded to the ADSP2115 spends some time initializing the card.
  916.  * Let's try to wait until it finishes this task.
  917.  */
  918. for (timeout = 0; timeout < 100000 && (inb(hw_config->io_base + WSS_INDEX) &
  919.   WSS_INITIALIZING); timeout++)
  920. ;
  921. outb((0x0b), hw_config->io_base + WSS_INDEX); /* Required by some cards */
  922. for (timeout = 0; (inb(hw_config->io_base + WSS_DATA) & WSS_AUTOCALIBRATION) &&
  923.   (timeout < 100000); timeout++)
  924. ;
  925. return probe_ms_sound(hw_config);
  926. }
  927. static void __init attach_pss_mss(struct address_info *hw_config)
  928. {
  929. int        my_mix = -999; /* gcc shut up */
  930. devc->ad_mixer_dev = NO_WSS_MIXER;
  931. if (pss_mixer) 
  932. {
  933. if ((my_mix = sound_install_mixer (MIXER_DRIVER_VERSION,
  934. "PSS-SPEAKERS and AD1848 (through MSS audio codec)",
  935. &pss_mixer_operations,
  936. sizeof (struct mixer_operations),
  937. devc)) < 0) 
  938. {
  939. printk(KERN_ERR "Could not install PSS mixern");
  940. return;
  941. }
  942. }
  943. pss_mixer_reset(devc);
  944. attach_ms_sound(hw_config, THIS_MODULE); /* Slot 0 */
  945. if (hw_config->slots[0] != -1)
  946. {
  947. /* The MSS driver installed itself */
  948. audio_devs[hw_config->slots[0]]->coproc = &pss_coproc_operations;
  949. if (pss_mixer && (num_mixers == (my_mix + 2)))
  950. {
  951. /* The MSS mixer installed */
  952. devc->ad_mixer_dev = audio_devs[hw_config->slots[0]]->mixer_dev;
  953. }
  954. }
  955. }
  956. static inline void __exit unload_pss(struct address_info *hw_config)
  957. {
  958. release_region(hw_config->io_base, 0x10);
  959. release_region(hw_config->io_base+0x10, 0x9);
  960. }
  961. static inline void __exit unload_pss_mpu(struct address_info *hw_config)
  962. {
  963. unload_mpu401(hw_config);
  964. }
  965. static inline void __exit unload_pss_mss(struct address_info *hw_config)
  966. {
  967. unload_ms_sound(hw_config);
  968. }
  969. static struct address_info cfg;
  970. static struct address_info cfg2;
  971. static struct address_info cfg_mpu;
  972. static int pss_io __initdata = -1;
  973. static int mss_io __initdata = -1;
  974. static int mss_irq __initdata = -1;
  975. static int mss_dma __initdata = -1;
  976. static int mpu_io __initdata = -1;
  977. static int mpu_irq __initdata = -1;
  978. static int pss_no_sound __initdata = 0; /* Just configure non-sound components */
  979. static int pss_keep_settings  = 1; /* Keep hardware settings at module exit */
  980. static char *pss_firmware = "/etc/sound/pss_synth";
  981. MODULE_PARM(pss_io, "i");
  982. MODULE_PARM_DESC(pss_io, "Set i/o base of PSS card (probably 0x220 or 0x240)");
  983. MODULE_PARM(mss_io, "i");
  984. MODULE_PARM_DESC(mss_io, "Set WSS (audio) i/o base (0x530, 0x604, 0xE80, 0xF40, or other. Address must end in 0 or 4 and must be from 0x100 to 0xFF4)");
  985. MODULE_PARM(mss_irq, "i");
  986. MODULE_PARM_DESC(mss_irq, "Set WSS (audio) IRQ (3, 5, 7, 9, 10, 11, 12)");
  987. MODULE_PARM(mss_dma, "i");
  988. MODULE_PARM_DESC(mss_dma, "Set WSS (audio) DMA (0, 1, 3)");
  989. MODULE_PARM(mpu_io, "i");
  990. MODULE_PARM_DESC(mpu_io, "Set MIDI i/o base (0x330 or other. Address must be on 4 location boundaries and must be from 0x100 to 0xFFC)");
  991. MODULE_PARM(mpu_irq, "i");
  992. MODULE_PARM_DESC(mpu_irq, "Set MIDI IRQ (3, 5, 7, 9, 10, 11, 12)");
  993. MODULE_PARM(pss_cdrom_port, "i");
  994. MODULE_PARM_DESC(pss_cdrom_port, "Set the PSS CDROM port i/o base (0x340 or other)");
  995. MODULE_PARM(pss_enable_joystick, "i");
  996. MODULE_PARM_DESC(pss_enable_joystick, "Enables the PSS joystick port (1 to enable, 0 to disable)");
  997. MODULE_PARM(pss_no_sound, "i");
  998. MODULE_PARM_DESC(pss_no_sound, "Configure sound compoents (0 - no, 1 - yes)");
  999. MODULE_PARM(pss_keep_settings, "i");
  1000. MODULE_PARM_DESC(pss_keep_settings, "Keep hardware setting at driver unloading (0 - no, 1 - yes)");
  1001. MODULE_PARM(pss_firmware, "s");
  1002. MODULE_PARM_DESC(pss_firmware, "Location of the firmware file (default - /etc/sound/pss_synth)");
  1003. MODULE_PARM(pss_mixer, "b");
  1004. MODULE_PARM_DESC(pss_mixer, "Enable (1) or disable (0) PSS mixer (controlling of output volume, bass, treble, synth volume). The mixer is not available on all PSS cards.");
  1005. MODULE_AUTHOR("Hannu Savolainen, Vladimir Michl");
  1006. MODULE_DESCRIPTION("Module for PSS sound cards (based on AD1848, ADSP-2115 and ESC614). This module includes control of output amplifier and synth volume of the Beethoven ADSP-16 card (this may work with other PSS cards).");
  1007. MODULE_LICENSE("GPL");
  1008. static int fw_load = 0;
  1009. static int pssmpu = 0, pssmss = 0;
  1010. /*
  1011.  *    Load a PSS sound card module
  1012.  */
  1013. static int __init init_pss(void)
  1014. {
  1015. if(pss_no_sound) /* If configuring only nonsound components */
  1016. {
  1017. cfg.io_base = pss_io;
  1018. if(!probe_pss(&cfg))
  1019. return -ENODEV;
  1020. printk(KERN_INFO "ECHO-PSS  Rev. %dn", inw(REG(PSS_ID)) & 0x00ff);
  1021. printk(KERN_INFO "PSS: loading in no sound mode.n");
  1022. disable_all_emulations();
  1023. configure_nonsound_components();
  1024. return 0;
  1025. }
  1026. cfg.io_base = pss_io;
  1027. cfg2.io_base = mss_io;
  1028. cfg2.irq = mss_irq;
  1029. cfg2.dma = mss_dma;
  1030. cfg_mpu.io_base = mpu_io;
  1031. cfg_mpu.irq = mpu_irq;
  1032. if (cfg.io_base == -1 || cfg2.io_base == -1 || cfg2.irq == -1 || cfg.dma == -1) {
  1033. printk(KERN_INFO "pss: mss_io, mss_dma, mss_irq and pss_io must be set.n");
  1034. return -EINVAL;
  1035. }
  1036. if (!pss_synth) {
  1037. fw_load = 1;
  1038. pss_synthLen = mod_firmware_load(pss_firmware, (void *) &pss_synth);
  1039. }
  1040. if (!probe_pss(&cfg))
  1041. return -ENODEV;
  1042. attach_pss(&cfg);
  1043. /*
  1044.  *    Attach stuff
  1045.  */
  1046. if (probe_pss_mpu(&cfg_mpu)) {
  1047. pssmpu = 1;
  1048. attach_pss_mpu(&cfg_mpu);
  1049. }
  1050. if (probe_pss_mss(&cfg2)) {
  1051. pssmss = 1;
  1052. attach_pss_mss(&cfg2);
  1053. }
  1054. return 0;
  1055. }
  1056. static void __exit cleanup_pss(void)
  1057. {
  1058. if(!pss_no_sound)
  1059. {
  1060. if(fw_load && pss_synth)
  1061. vfree(pss_synth);
  1062. if(pssmss)
  1063. unload_pss_mss(&cfg2);
  1064. if(pssmpu)
  1065. unload_pss_mpu(&cfg_mpu);
  1066. unload_pss(&cfg);
  1067. }
  1068. if(!pss_keep_settings) /* Keep hardware settings if asked */
  1069. {
  1070. disable_all_emulations();
  1071. printk(KERN_INFO "Resetting PSS sound card configurations.n");
  1072. }
  1073. }
  1074. module_init(init_pss);
  1075. module_exit(cleanup_pss);
  1076. #ifndef MODULE
  1077. static int __init setup_pss(char *str)
  1078. {
  1079. /* io, mss_io, mss_irq, mss_dma, mpu_io, mpu_irq */
  1080. int ints[7];
  1081. str = get_options(str, ARRAY_SIZE(ints), ints);
  1082. pss_io = ints[1];
  1083. mss_io = ints[2];
  1084. mss_irq = ints[3];
  1085. mss_dma = ints[4];
  1086. mpu_io = ints[5];
  1087. mpu_irq = ints[6];
  1088. return 1;
  1089. }
  1090. __setup("pss=", setup_pss);
  1091. #endif