Lines Matching refs:rec
739 static int set_dac_channels(struct cmipci *cm, struct cmipci_pcm *rec, int channels) in set_dac_channels() argument
742 if (!cm->can_multi_ch || !rec->ch) in set_dac_channels()
744 if (rec->fmt != 0x03) /* stereo 16bit only */ in set_dac_channels()
782 static int snd_cmipci_pcm_prepare(struct cmipci *cm, struct cmipci_pcm *rec, in snd_cmipci_pcm_prepare() argument
789 rec->fmt = 0; in snd_cmipci_pcm_prepare()
790 rec->shift = 0; in snd_cmipci_pcm_prepare()
792 rec->fmt |= 0x02; in snd_cmipci_pcm_prepare()
794 rec->shift++; /* 24/32bit */ in snd_cmipci_pcm_prepare()
797 rec->fmt |= 0x01; in snd_cmipci_pcm_prepare()
798 if (rec->is_dac && set_dac_channels(cm, rec, runtime->channels) < 0) { in snd_cmipci_pcm_prepare()
803 rec->offset = runtime->dma_addr; in snd_cmipci_pcm_prepare()
805 rec->dma_size = runtime->buffer_size << rec->shift; in snd_cmipci_pcm_prepare()
806 period_size = runtime->period_size << rec->shift; in snd_cmipci_pcm_prepare()
809 rec->dma_size = (rec->dma_size * runtime->channels) / 2; in snd_cmipci_pcm_prepare()
816 reg = rec->ch ? CM_REG_CH1_FRAME1 : CM_REG_CH0_FRAME1; in snd_cmipci_pcm_prepare()
817 snd_cmipci_write(cm, reg, rec->offset); in snd_cmipci_pcm_prepare()
819 reg = rec->ch ? CM_REG_CH1_FRAME2 : CM_REG_CH0_FRAME2; in snd_cmipci_pcm_prepare()
820 snd_cmipci_write_w(cm, reg, rec->dma_size - 1); in snd_cmipci_pcm_prepare()
824 val = rec->ch ? CM_CHADC1 : CM_CHADC0; in snd_cmipci_pcm_prepare()
825 if (rec->is_dac) in snd_cmipci_pcm_prepare()
845 if (rec->ch) { in snd_cmipci_pcm_prepare()
857 if (rec->ch) { in snd_cmipci_pcm_prepare()
859 val |= rec->fmt << CM_CH1FMT_SHIFT; in snd_cmipci_pcm_prepare()
862 val |= rec->fmt << CM_CH0FMT_SHIFT; in snd_cmipci_pcm_prepare()
865 val &= ~(CM_CH0_SRATE_MASK << (rec->ch * 2)); in snd_cmipci_pcm_prepare()
866 val |= freq_ext << (rec->ch * 2); in snd_cmipci_pcm_prepare()
871 if (!rec->is_dac && cm->chip_version) { in snd_cmipci_pcm_prepare()
878 rec->running = 0; in snd_cmipci_pcm_prepare()
887 static int snd_cmipci_pcm_trigger(struct cmipci *cm, struct cmipci_pcm *rec, in snd_cmipci_pcm_trigger() argument
893 inthld = CM_CH0_INT_EN << rec->ch; in snd_cmipci_pcm_trigger()
894 chen = CM_CHEN0 << rec->ch; in snd_cmipci_pcm_trigger()
895 reset = CM_RST_CH0 << rec->ch; in snd_cmipci_pcm_trigger()
896 pause = CM_PAUSE0 << rec->ch; in snd_cmipci_pcm_trigger()
901 rec->running = 1; in snd_cmipci_pcm_trigger()
910 rec->running = 0; in snd_cmipci_pcm_trigger()
917 rec->needs_silencing = rec->is_dac; in snd_cmipci_pcm_trigger()
940 static snd_pcm_uframes_t snd_cmipci_pcm_pointer(struct cmipci *cm, struct cmipci_pcm *rec, in snd_cmipci_pcm_pointer() argument
946 if (!rec->running) in snd_cmipci_pcm_pointer()
949 reg = rec->ch ? CM_REG_CH1_FRAME2 : CM_REG_CH0_FRAME2; in snd_cmipci_pcm_pointer()
952 if (rem < rec->dma_size) in snd_cmipci_pcm_pointer()
958 ptr = (rec->dma_size - (rem + 1)) >> rec->shift; in snd_cmipci_pcm_pointer()
960 reg = rec->ch ? CM_REG_CH1_FRAME1 : CM_REG_CH0_FRAME1; in snd_cmipci_pcm_pointer()
961 ptr = snd_cmipci_read(cm, reg) - rec->offset; in snd_cmipci_pcm_pointer()
1335 static void snd_cmipci_silence_hack(struct cmipci *cm, struct cmipci_pcm *rec) in snd_cmipci_silence_hack() argument
1337 struct snd_pcm_runtime *runtime = rec->substream->runtime; in snd_cmipci_silence_hack()
1340 if (rec->needs_silencing && runtime && runtime->dma_area) { in snd_cmipci_silence_hack()
1343 reg = rec->ch ? CM_REG_CH1_FRAME2 : CM_REG_CH0_FRAME2; in snd_cmipci_silence_hack()
1349 set_dac_channels(cm, rec, 2); in snd_cmipci_silence_hack()
1352 val &= ~(CM_ASFC_MASK << (rec->ch * 3)); in snd_cmipci_silence_hack()
1353 val |= (4 << CM_ASFC_SHIFT) << (rec->ch * 3); in snd_cmipci_silence_hack()
1356 val &= ~(CM_CH0FMT_MASK << (rec->ch * 2)); in snd_cmipci_silence_hack()
1357 val |= (3 << CM_CH0FMT_SHIFT) << (rec->ch * 2); in snd_cmipci_silence_hack()
1359 val &= ~(CM_CH0_SRATE_MASK << (rec->ch * 2)); in snd_cmipci_silence_hack()
1363 cm->ctrl |= CM_CHEN0 << rec->ch; in snd_cmipci_silence_hack()
1371 cm->ctrl &= ~(CM_CHEN0 << rec->ch); in snd_cmipci_silence_hack()
1372 val = CM_RST_CH0 << rec->ch; in snd_cmipci_silence_hack()
1377 rec->needs_silencing = 0; in snd_cmipci_silence_hack()