int lx_plx_mbox_write(struct lx6464es *chip, int mbox_nr, u32 value) { int index = -1; switch (mbox_nr) { case 1: index = ePLX_MBOX1; break; case 3: index = ePLX_MBOX3; break; case 4: index = ePLX_MBOX4; break; case 5: index = ePLX_MBOX5; break; case 6: index = ePLX_MBOX6; break; case 7: index = ePLX_MBOX7; break; case 0: /* reserved for HF flags */ case 2: /* reserved for Pipe States * the DSP keeps an image of it */ snd_BUG(); return -EBADRQC; } lx_plx_reg_write(chip, index, value); return 0; }
static int lx_init_xilinx_test(struct lx6464es *chip) { u32 reg; dev_dbg(chip->card->dev, "->lx_init_xilinx_test\n"); /* TEST if we have access to Xilinx/MicroBlaze */ lx_dsp_reg_write(chip, eReg_CSM, 0); reg = lx_dsp_reg_read(chip, eReg_CSM); if (reg) { dev_err(chip->card->dev, "Problem: Reg_CSM %x.\n", reg); /* PCI9056_SPACE0_REMAP */ lx_plx_reg_write(chip, ePLX_PCICR, 1); reg = lx_dsp_reg_read(chip, eReg_CSM); if (reg) { dev_err(chip->card->dev, "Error: Reg_CSM %x.\n", reg); return -EAGAIN; /* seems to be appropriate */ } } dev_dbg(chip->card->dev, "Xilinx/MicroBlaze access test successful\n"); return 0; }
static int __devinit lx_init_xilinx_test(struct lx6464es *chip) { u32 reg; snd_printdd("->lx_init_xilinx_test\n"); /* TEST if we have access to Xilinx/MicroBlaze */ lx_dsp_reg_write(chip, eReg_CSM, 0); reg = lx_dsp_reg_read(chip, eReg_CSM); if (reg) { snd_printk(KERN_ERR LXP "Problem: Reg_CSM %x.\n", reg); /* PCI9056_SPACE0_REMAP */ lx_plx_reg_write(chip, ePLX_PCICR, 1); reg = lx_dsp_reg_read(chip, eReg_CSM); if (reg) { snd_printk(KERN_ERR LXP "Error: Reg_CSM %x.\n", reg); return -EAGAIN; /* seems to be appropriate */ } } snd_printd(LXP "Xilinx/MicroBlaze access test successful\n"); return 0; }
/* reset the dsp during initialization */ static int lx_init_xilinx_reset(struct lx6464es *chip) { int i; u32 plx_reg = lx_plx_reg_read(chip, ePLX_CHIPSC); dev_dbg(chip->card->dev, "->lx_init_xilinx_reset\n"); /* activate reset of xilinx */ plx_reg &= ~CHIPSC_RESET_XILINX; lx_plx_reg_write(chip, ePLX_CHIPSC, plx_reg); msleep(1); lx_plx_reg_write(chip, ePLX_MBOX3, 0); msleep(1); plx_reg |= CHIPSC_RESET_XILINX; lx_plx_reg_write(chip, ePLX_CHIPSC, plx_reg); /* deactivate reset of xilinx */ for (i = 0; i != 100; ++i) { u32 reg_mbox3; msleep(10); reg_mbox3 = lx_plx_reg_read(chip, ePLX_MBOX3); if (reg_mbox3) { dev_dbg(chip->card->dev, "xilinx reset done\n"); dev_dbg(chip->card->dev, "xilinx took %d loops\n", i); break; } } /* todo: add some error handling? */ /* clear mr */ lx_dsp_reg_write(chip, eReg_CSM, 0); /* le xilinx ES peut ne pas etre encore pret, on attend. */ msleep(600); return 0; }