static int sc6000_init_mss(char __iomem *vport, int config, char __iomem *vmss_port, int mss_config) { if (sc6000_write(vport, DSP_INIT_MSS)) { snd_printk(KERN_ERR "sc6000_init_mss [0x%x]: failed!\n", DSP_INIT_MSS); return -EIO; } msleep(10); if (sc6000_cfg_write(vport, config)) return -EIO; iowrite8(mss_config, vmss_port); return 0; }
static int sc6000_setup_board(char __iomem *vport, int config) { int loop = 10; do { if (sc6000_write(vport, COMMAND_88)) { snd_printk(KERN_ERR "CMD 0x%x: failed!\n", COMMAND_88); return -EIO; } } while ((sc6000_wait_data(vport) < 0) && loop--); if (sc6000_read(vport) < 0) { snd_printk(KERN_ERR "sc6000_read after CMD 0x%x: failed\n", COMMAND_88); return -EIO; } if (sc6000_cfg_write(vport, config)) return -ENODEV; return 0; }
static int __devinit sc6000_init_board(char __iomem *vport, int irq, int dma, char __iomem *vmss_port, int mpu_irq) { char answer[15]; char version[2]; int mss_config = sc6000_irq_to_softcfg(irq) | sc6000_dma_to_softcfg(dma); int config = mss_config | sc6000_mpu_irq_to_softcfg(mpu_irq); int err; err = sc6000_dsp_reset(vport); if (err < 0) { snd_printk(KERN_ERR "sc6000_dsp_reset: failed!\n"); return err; } memset(answer, 0, sizeof(answer)); err = sc6000_dsp_get_answer(vport, GET_DSP_COPYRIGHT, answer, 15); if (err <= 0) { snd_printk(KERN_ERR "sc6000_dsp_copyright: failed!\n"); return -ENODEV; } /* * My SC-6000 card return "SC-6000" in DSPCopyright, so * if we have something different, we have to be warned. * Mine returns "SC-6000A " - KH */ if (strncmp("SC-6000", answer, 7)) snd_printk(KERN_WARNING "Warning: non SC-6000 audio card!\n"); if (sc6000_dsp_get_answer(vport, GET_DSP_VERSION, version, 2) < 2) { snd_printk(KERN_ERR "sc6000_dsp_version: failed!\n"); return -ENODEV; } printk(KERN_INFO PFX "Detected model: %s, DSP version %d.%d\n", answer, version[0], version[1]); /* * 0x0A == (IRQ 7, DMA 1, MIRQ 0) */ err = sc6000_cfg_write(vport, 0x0a); if (err < 0) { snd_printk(KERN_ERR "sc6000_cfg_write: failed!\n"); return -EFAULT; } err = sc6000_setup_board(vport, config); if (err < 0) { snd_printk(KERN_ERR "sc6000_setup_board: failed!\n"); return -ENODEV; } err = sc6000_init_mss(vport, config, vmss_port, mss_config); if (err < 0) { snd_printk(KERN_ERR "Can not initialize" "Microsoft Sound System mode.\n"); return -ENODEV; } return 0; }