Lines Matching refs:cm

515 static inline void snd_cmipci_write(struct cmipci *cm, unsigned int cmd, unsigned int data)  in snd_cmipci_write()  argument
517 outl(data, cm->iobase + cmd); in snd_cmipci_write()
520 static inline unsigned int snd_cmipci_read(struct cmipci *cm, unsigned int cmd) in snd_cmipci_read() argument
522 return inl(cm->iobase + cmd); in snd_cmipci_read()
526 static inline void snd_cmipci_write_w(struct cmipci *cm, unsigned int cmd, unsigned short data) in snd_cmipci_write_w() argument
528 outw(data, cm->iobase + cmd); in snd_cmipci_write_w()
531 static inline unsigned short snd_cmipci_read_w(struct cmipci *cm, unsigned int cmd) in snd_cmipci_read_w() argument
533 return inw(cm->iobase + cmd); in snd_cmipci_read_w()
537 static inline void snd_cmipci_write_b(struct cmipci *cm, unsigned int cmd, unsigned char data) in snd_cmipci_write_b() argument
539 outb(data, cm->iobase + cmd); in snd_cmipci_write_b()
542 static inline unsigned char snd_cmipci_read_b(struct cmipci *cm, unsigned int cmd) in snd_cmipci_read_b() argument
544 return inb(cm->iobase + cmd); in snd_cmipci_read_b()
548 static int snd_cmipci_set_bit(struct cmipci *cm, unsigned int cmd, unsigned int flag) in snd_cmipci_set_bit() argument
551 val = oval = inl(cm->iobase + cmd); in snd_cmipci_set_bit()
555 outl(val, cm->iobase + cmd); in snd_cmipci_set_bit()
559 static int snd_cmipci_clear_bit(struct cmipci *cm, unsigned int cmd, unsigned int flag) in snd_cmipci_clear_bit() argument
562 val = oval = inl(cm->iobase + cmd); in snd_cmipci_clear_bit()
566 outl(val, cm->iobase + cmd); in snd_cmipci_clear_bit()
571 static int snd_cmipci_set_bit_b(struct cmipci *cm, unsigned int cmd, unsigned char flag) in snd_cmipci_set_bit_b() argument
574 val = oval = inb(cm->iobase + cmd); in snd_cmipci_set_bit_b()
578 outb(val, cm->iobase + cmd); in snd_cmipci_set_bit_b()
582 static int snd_cmipci_clear_bit_b(struct cmipci *cm, unsigned int cmd, unsigned char flag) in snd_cmipci_clear_bit_b() argument
585 val = oval = inb(cm->iobase + cmd); in snd_cmipci_clear_bit_b()
589 outb(val, cm->iobase + cmd); in snd_cmipci_clear_bit_b()
664 static void snd_cmipci_set_pll(struct cmipci *cm, unsigned int rate, unsigned int slot) in snd_cmipci_set_pll() argument
675 snd_cmipci_write_b(cm, reg, rate>>8); in snd_cmipci_set_pll()
676 snd_cmipci_write_b(cm, reg, rate&0xff); in snd_cmipci_set_pll()
691 struct cmipci *cm = snd_pcm_substream_chip(substream); in snd_cmipci_playback2_hw_params() local
693 mutex_lock(&cm->open_mutex); in snd_cmipci_playback2_hw_params()
694 if (cm->opened[CM_CH_PLAY]) { in snd_cmipci_playback2_hw_params()
695 mutex_unlock(&cm->open_mutex); in snd_cmipci_playback2_hw_params()
699 cm->opened[CM_CH_PLAY] = CM_OPEN_PLAYBACK_MULTI; in snd_cmipci_playback2_hw_params()
700 mutex_unlock(&cm->open_mutex); in snd_cmipci_playback2_hw_params()
705 static void snd_cmipci_ch_reset(struct cmipci *cm, int ch) in snd_cmipci_ch_reset() argument
707 int reset = CM_RST_CH0 << (cm->channel[ch].ch); in snd_cmipci_ch_reset()
708 snd_cmipci_write(cm, CM_REG_FUNCTRL0, cm->ctrl | reset); in snd_cmipci_ch_reset()
709 snd_cmipci_write(cm, CM_REG_FUNCTRL0, cm->ctrl & ~reset); in snd_cmipci_ch_reset()
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()
748 if (cm->can_multi_ch) { in set_dac_channels()
749 spin_lock_irq(&cm->reg_lock); in set_dac_channels()
751 snd_cmipci_set_bit(cm, CM_REG_LEGACY_CTRL, CM_NXCHG); in set_dac_channels()
752 snd_cmipci_set_bit(cm, CM_REG_MISC_CTRL, CM_XCHGDAC); in set_dac_channels()
754 snd_cmipci_clear_bit(cm, CM_REG_LEGACY_CTRL, CM_NXCHG); in set_dac_channels()
755 snd_cmipci_clear_bit(cm, CM_REG_MISC_CTRL, CM_XCHGDAC); in set_dac_channels()
758 snd_cmipci_set_bit(cm, CM_REG_EXT_MISC, CM_CHB3D8C); in set_dac_channels()
760 snd_cmipci_clear_bit(cm, CM_REG_EXT_MISC, CM_CHB3D8C); in set_dac_channels()
762 snd_cmipci_set_bit(cm, CM_REG_CHFORMAT, CM_CHB3D5C); in set_dac_channels()
763 snd_cmipci_set_bit(cm, CM_REG_LEGACY_CTRL, CM_CHB3D6C); in set_dac_channels()
765 snd_cmipci_clear_bit(cm, CM_REG_CHFORMAT, CM_CHB3D5C); in set_dac_channels()
766 snd_cmipci_clear_bit(cm, CM_REG_LEGACY_CTRL, CM_CHB3D6C); in set_dac_channels()
769 snd_cmipci_set_bit(cm, CM_REG_CHFORMAT, CM_CHB3D); in set_dac_channels()
771 snd_cmipci_clear_bit(cm, CM_REG_CHFORMAT, CM_CHB3D); in set_dac_channels()
772 spin_unlock_irq(&cm->reg_lock); in set_dac_channels()
782 static int snd_cmipci_pcm_prepare(struct cmipci *cm, struct cmipci_pcm *rec, in snd_cmipci_pcm_prepare() argument
798 if (rec->is_dac && set_dac_channels(cm, rec, runtime->channels) < 0) { in snd_cmipci_pcm_prepare()
799 dev_dbg(cm->card->dev, "cannot set dac channels\n"); in snd_cmipci_pcm_prepare()
813 spin_lock_irq(&cm->reg_lock); in snd_cmipci_pcm_prepare()
817 snd_cmipci_write(cm, reg, rec->offset); in snd_cmipci_pcm_prepare()
820 snd_cmipci_write_w(cm, reg, rec->dma_size - 1); in snd_cmipci_pcm_prepare()
821 snd_cmipci_write_w(cm, reg + 2, period_size - 1); in snd_cmipci_pcm_prepare()
826 cm->ctrl &= ~val; in snd_cmipci_pcm_prepare()
828 cm->ctrl |= val; in snd_cmipci_pcm_prepare()
829 snd_cmipci_write(cm, CM_REG_FUNCTRL0, cm->ctrl); in snd_cmipci_pcm_prepare()
844 val = snd_cmipci_read(cm, CM_REG_FUNCTRL1); in snd_cmipci_pcm_prepare()
852 snd_cmipci_write(cm, CM_REG_FUNCTRL1, val); in snd_cmipci_pcm_prepare()
853 dev_dbg(cm->card->dev, "functrl1 = %08x\n", val); in snd_cmipci_pcm_prepare()
856 val = snd_cmipci_read(cm, CM_REG_CHFORMAT); in snd_cmipci_pcm_prepare()
864 if (cm->can_96k) { in snd_cmipci_pcm_prepare()
868 snd_cmipci_write(cm, CM_REG_CHFORMAT, val); in snd_cmipci_pcm_prepare()
869 dev_dbg(cm->card->dev, "chformat = %08x\n", val); in snd_cmipci_pcm_prepare()
871 if (!rec->is_dac && cm->chip_version) { in snd_cmipci_pcm_prepare()
873 snd_cmipci_set_bit(cm, CM_REG_EXT_MISC, CM_ADC48K44K); in snd_cmipci_pcm_prepare()
875 snd_cmipci_clear_bit(cm, CM_REG_EXT_MISC, CM_ADC48K44K); in snd_cmipci_pcm_prepare()
879 spin_unlock_irq(&cm->reg_lock); 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
898 spin_lock(&cm->reg_lock); in snd_cmipci_pcm_trigger()
903 snd_cmipci_set_bit(cm, CM_REG_INT_HLDCLR, inthld); in snd_cmipci_pcm_trigger()
904 cm->ctrl |= chen; in snd_cmipci_pcm_trigger()
906 snd_cmipci_write(cm, CM_REG_FUNCTRL0, cm->ctrl); in snd_cmipci_pcm_trigger()
907 dev_dbg(cm->card->dev, "functrl0 = %08x\n", cm->ctrl); in snd_cmipci_pcm_trigger()
912 snd_cmipci_clear_bit(cm, CM_REG_INT_HLDCLR, inthld); in snd_cmipci_pcm_trigger()
914 cm->ctrl &= ~chen; in snd_cmipci_pcm_trigger()
915 snd_cmipci_write(cm, CM_REG_FUNCTRL0, cm->ctrl | reset); in snd_cmipci_pcm_trigger()
916 snd_cmipci_write(cm, CM_REG_FUNCTRL0, cm->ctrl & ~reset); in snd_cmipci_pcm_trigger()
921 cm->ctrl |= pause; in snd_cmipci_pcm_trigger()
922 snd_cmipci_write(cm, CM_REG_FUNCTRL0, cm->ctrl); in snd_cmipci_pcm_trigger()
926 cm->ctrl &= ~pause; in snd_cmipci_pcm_trigger()
927 snd_cmipci_write(cm, CM_REG_FUNCTRL0, cm->ctrl); in snd_cmipci_pcm_trigger()
933 spin_unlock(&cm->reg_lock); 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
951 rem = snd_cmipci_read_w(cm, reg); in snd_cmipci_pcm_pointer()
955 dev_err(cm->card->dev, "invalid PCM pointer: %#x\n", rem); in snd_cmipci_pcm_pointer()
961 ptr = snd_cmipci_read(cm, reg) - rec->offset; in snd_cmipci_pcm_pointer()
976 struct cmipci *cm = snd_pcm_substream_chip(substream); in snd_cmipci_playback_trigger() local
977 return snd_cmipci_pcm_trigger(cm, &cm->channel[CM_CH_PLAY], cmd); in snd_cmipci_playback_trigger()
982 struct cmipci *cm = snd_pcm_substream_chip(substream); in snd_cmipci_playback_pointer() local
983 return snd_cmipci_pcm_pointer(cm, &cm->channel[CM_CH_PLAY], substream); in snd_cmipci_playback_pointer()
995 struct cmipci *cm = snd_pcm_substream_chip(substream); in snd_cmipci_capture_trigger() local
996 return snd_cmipci_pcm_trigger(cm, &cm->channel[CM_CH_CAPT], cmd); in snd_cmipci_capture_trigger()
1001 struct cmipci *cm = snd_pcm_substream_chip(substream); in snd_cmipci_capture_pointer() local
1002 return snd_cmipci_pcm_pointer(cm, &cm->channel[CM_CH_CAPT], substream); in snd_cmipci_capture_pointer()
1136 static int save_mixer_state(struct cmipci *cm) in save_mixer_state() argument
1138 if (! cm->mixer_insensitive) { in save_mixer_state()
1146 struct snd_kcontrol *ctl = cm->mixer_res_ctl[i]; in save_mixer_state()
1151 cm->mixer_res_status[i] = val->value.integer.value[0]; in save_mixer_state()
1154 if (cm->mixer_res_status[i] != val->value.integer.value[0]) { in save_mixer_state()
1159 snd_ctl_notify(cm->card, event, &ctl->id); in save_mixer_state()
1163 cm->mixer_insensitive = 1; in save_mixer_state()
1170 static void restore_mixer_state(struct cmipci *cm) in restore_mixer_state() argument
1172 if (cm->mixer_insensitive) { in restore_mixer_state()
1179 cm->mixer_insensitive = 0; /* at first clear this; in restore_mixer_state()
1182 struct snd_kcontrol *ctl = cm->mixer_res_ctl[i]; in restore_mixer_state()
1190 if (val->value.integer.value[0] != cm->mixer_res_status[i]) { in restore_mixer_state()
1191 val->value.integer.value[0] = cm->mixer_res_status[i]; in restore_mixer_state()
1195 snd_ctl_notify(cm->card, event, &ctl->id); in restore_mixer_state()
1203 static void setup_ac3(struct cmipci *cm, struct snd_pcm_substream *subs, int do_ac3, int rate) in setup_ac3() argument
1207 snd_cmipci_set_bit(cm, CM_REG_CHFORMAT, CM_AC3EN1); in setup_ac3()
1209 snd_cmipci_set_bit(cm, CM_REG_MISC_CTRL, CM_AC3EN2); in setup_ac3()
1211 if (cm->can_ac3_hw) { in setup_ac3()
1214 snd_cmipci_set_bit(cm, CM_REG_CHFORMAT, CM_SPD24SEL); in setup_ac3()
1215 snd_cmipci_clear_bit(cm, CM_REG_MISC_CTRL, CM_SPD32SEL); in setup_ac3()
1218 snd_cmipci_set_bit(cm, CM_REG_MISC_CTRL, CM_SPD32SEL); in setup_ac3()
1220 if (cm->chip_version == 33) { in setup_ac3()
1222 snd_cmipci_set_bit(cm, CM_REG_CHFORMAT, CM_PLAYBACK_SRATE_176K); in setup_ac3()
1224 snd_cmipci_clear_bit(cm, CM_REG_CHFORMAT, CM_PLAYBACK_SRATE_176K); in setup_ac3()
1230 snd_cmipci_clear_bit(cm, CM_REG_CHFORMAT, CM_AC3EN1); in setup_ac3()
1231 snd_cmipci_clear_bit(cm, CM_REG_MISC_CTRL, CM_AC3EN2); in setup_ac3()
1233 if (cm->can_ac3_hw) { in setup_ac3()
1236 snd_cmipci_set_bit(cm, CM_REG_MISC_CTRL, CM_SPD32SEL); in setup_ac3()
1237 snd_cmipci_set_bit(cm, CM_REG_CHFORMAT, CM_SPD24SEL); in setup_ac3()
1239 snd_cmipci_clear_bit(cm, CM_REG_MISC_CTRL, CM_SPD32SEL); in setup_ac3()
1240 snd_cmipci_clear_bit(cm, CM_REG_CHFORMAT, CM_SPD24SEL); in setup_ac3()
1243 snd_cmipci_clear_bit(cm, CM_REG_MISC_CTRL, CM_SPD32SEL); in setup_ac3()
1244 snd_cmipci_clear_bit(cm, CM_REG_CHFORMAT, CM_SPD24SEL); in setup_ac3()
1245 snd_cmipci_clear_bit(cm, CM_REG_CHFORMAT, CM_PLAYBACK_SRATE_176K); in setup_ac3()
1250 static int setup_spdif_playback(struct cmipci *cm, struct snd_pcm_substream *subs, int up, int do_a… in setup_spdif_playback() argument
1257 if ((err = save_mixer_state(cm)) < 0) in setup_spdif_playback()
1260 spin_lock_irq(&cm->reg_lock); in setup_spdif_playback()
1261 cm->spdif_playback_avail = up; in setup_spdif_playback()
1266 if (cm->spdif_playback_enabled) in setup_spdif_playback()
1267 snd_cmipci_set_bit(cm, CM_REG_FUNCTRL1, CM_PLAYBACK_SPDF); in setup_spdif_playback()
1268 setup_ac3(cm, subs, do_ac3, rate); in setup_spdif_playback()
1271 snd_cmipci_set_bit(cm, CM_REG_MISC_CTRL, CM_SPDIF48K | CM_SPDF_AC97); in setup_spdif_playback()
1273 snd_cmipci_clear_bit(cm, CM_REG_MISC_CTRL, CM_SPDIF48K | CM_SPDF_AC97); in setup_spdif_playback()
1275 snd_cmipci_set_bit(cm, CM_REG_CHFORMAT, CM_DBLSPDS); in setup_spdif_playback()
1277 snd_cmipci_clear_bit(cm, CM_REG_CHFORMAT, CM_DBLSPDS); in setup_spdif_playback()
1282 snd_cmipci_clear_bit(cm, CM_REG_CHFORMAT, CM_DBLSPDS); in setup_spdif_playback()
1283 snd_cmipci_clear_bit(cm, CM_REG_FUNCTRL1, CM_PLAYBACK_SPDF); in setup_spdif_playback()
1284 setup_ac3(cm, subs, 0, 0); in setup_spdif_playback()
1286 spin_unlock_irq(&cm->reg_lock); in setup_spdif_playback()
1298 struct cmipci *cm = snd_pcm_substream_chip(substream); in snd_cmipci_playback_prepare() local
1305 if (do_spdif && cm->can_ac3_hw) in snd_cmipci_playback_prepare()
1306 do_ac3 = cm->dig_pcm_status & IEC958_AES0_NONAUDIO; in snd_cmipci_playback_prepare()
1307 if ((err = setup_spdif_playback(cm, substream, do_spdif, do_ac3)) < 0) in snd_cmipci_playback_prepare()
1309 return snd_cmipci_pcm_prepare(cm, &cm->channel[CM_CH_PLAY], substream); in snd_cmipci_playback_prepare()
1315 struct cmipci *cm = snd_pcm_substream_chip(substream); in snd_cmipci_playback_spdif_prepare() local
1318 if (cm->can_ac3_hw) in snd_cmipci_playback_spdif_prepare()
1319 do_ac3 = cm->dig_pcm_status & IEC958_AES0_NONAUDIO; in snd_cmipci_playback_spdif_prepare()
1322 if ((err = setup_spdif_playback(cm, substream, 1, do_ac3)) < 0) in snd_cmipci_playback_spdif_prepare()
1324 return snd_cmipci_pcm_prepare(cm, &cm->channel[CM_CH_PLAY], substream); in snd_cmipci_playback_spdif_prepare()
1335 static void snd_cmipci_silence_hack(struct cmipci *cm, struct cmipci_pcm *rec) in snd_cmipci_silence_hack() argument
1345 snd_cmipci_write(cm, reg, val); in snd_cmipci_silence_hack()
1349 set_dac_channels(cm, rec, 2); in snd_cmipci_silence_hack()
1350 spin_lock_irq(&cm->reg_lock); in snd_cmipci_silence_hack()
1351 val = snd_cmipci_read(cm, CM_REG_FUNCTRL1); in snd_cmipci_silence_hack()
1354 snd_cmipci_write(cm, CM_REG_FUNCTRL1, val); in snd_cmipci_silence_hack()
1355 val = snd_cmipci_read(cm, CM_REG_CHFORMAT); in snd_cmipci_silence_hack()
1358 if (cm->can_96k) in snd_cmipci_silence_hack()
1360 snd_cmipci_write(cm, CM_REG_CHFORMAT, val); in snd_cmipci_silence_hack()
1363 cm->ctrl |= CM_CHEN0 << rec->ch; in snd_cmipci_silence_hack()
1364 snd_cmipci_write(cm, CM_REG_FUNCTRL0, cm->ctrl); in snd_cmipci_silence_hack()
1365 spin_unlock_irq(&cm->reg_lock); in snd_cmipci_silence_hack()
1370 spin_lock_irq(&cm->reg_lock); in snd_cmipci_silence_hack()
1371 cm->ctrl &= ~(CM_CHEN0 << rec->ch); in snd_cmipci_silence_hack()
1373 snd_cmipci_write(cm, CM_REG_FUNCTRL0, cm->ctrl | val); in snd_cmipci_silence_hack()
1374 snd_cmipci_write(cm, CM_REG_FUNCTRL0, cm->ctrl & ~val); in snd_cmipci_silence_hack()
1375 spin_unlock_irq(&cm->reg_lock); in snd_cmipci_silence_hack()
1383 struct cmipci *cm = snd_pcm_substream_chip(substream); in snd_cmipci_playback_hw_free() local
1384 setup_spdif_playback(cm, substream, 0, 0); in snd_cmipci_playback_hw_free()
1385 restore_mixer_state(cm); in snd_cmipci_playback_hw_free()
1386 snd_cmipci_silence_hack(cm, &cm->channel[0]); in snd_cmipci_playback_hw_free()
1392 struct cmipci *cm = snd_pcm_substream_chip(substream); in snd_cmipci_playback2_hw_free() local
1393 snd_cmipci_silence_hack(cm, &cm->channel[1]); in snd_cmipci_playback2_hw_free()
1400 struct cmipci *cm = snd_pcm_substream_chip(substream); in snd_cmipci_capture_prepare() local
1401 return snd_cmipci_pcm_prepare(cm, &cm->channel[CM_CH_CAPT], substream); in snd_cmipci_capture_prepare()
1407 struct cmipci *cm = snd_pcm_substream_chip(substream); in snd_cmipci_capture_spdif_prepare() local
1409 spin_lock_irq(&cm->reg_lock); in snd_cmipci_capture_spdif_prepare()
1410 snd_cmipci_set_bit(cm, CM_REG_FUNCTRL1, CM_CAPTURE_SPDF); in snd_cmipci_capture_spdif_prepare()
1411 if (cm->can_96k) { in snd_cmipci_capture_spdif_prepare()
1413 snd_cmipci_set_bit(cm, CM_REG_CHFORMAT, CM_DBLSPDS); in snd_cmipci_capture_spdif_prepare()
1415 snd_cmipci_clear_bit(cm, CM_REG_CHFORMAT, CM_DBLSPDS); in snd_cmipci_capture_spdif_prepare()
1418 snd_cmipci_set_bit(cm, CM_REG_MISC_CTRL, CM_SPD32SEL); in snd_cmipci_capture_spdif_prepare()
1420 snd_cmipci_clear_bit(cm, CM_REG_MISC_CTRL, CM_SPD32SEL); in snd_cmipci_capture_spdif_prepare()
1422 spin_unlock_irq(&cm->reg_lock); in snd_cmipci_capture_spdif_prepare()
1424 return snd_cmipci_pcm_prepare(cm, &cm->channel[CM_CH_CAPT], substream); in snd_cmipci_capture_spdif_prepare()
1429 struct cmipci *cm = snd_pcm_substream_chip(subs); in snd_cmipci_capture_spdif_hw_free() local
1431 spin_lock_irq(&cm->reg_lock); in snd_cmipci_capture_spdif_hw_free()
1432 snd_cmipci_clear_bit(cm, CM_REG_FUNCTRL1, CM_CAPTURE_SPDF); in snd_cmipci_capture_spdif_hw_free()
1433 snd_cmipci_clear_bit(cm, CM_REG_MISC_CTRL, CM_SPD32SEL); in snd_cmipci_capture_spdif_hw_free()
1434 spin_unlock_irq(&cm->reg_lock); in snd_cmipci_capture_spdif_hw_free()
1445 struct cmipci *cm = dev_id; in snd_cmipci_interrupt() local
1449 status = snd_cmipci_read(cm, CM_REG_INT_STATUS); in snd_cmipci_interrupt()
1454 spin_lock(&cm->reg_lock); in snd_cmipci_interrupt()
1459 snd_cmipci_clear_bit(cm, CM_REG_INT_HLDCLR, mask); in snd_cmipci_interrupt()
1460 snd_cmipci_set_bit(cm, CM_REG_INT_HLDCLR, mask); in snd_cmipci_interrupt()
1461 spin_unlock(&cm->reg_lock); in snd_cmipci_interrupt()
1463 if (cm->rmidi && (status & CM_UARTINT)) in snd_cmipci_interrupt()
1464 snd_mpu401_uart_interrupt(irq, cm->rmidi->private_data); in snd_cmipci_interrupt()
1466 if (cm->pcm) { in snd_cmipci_interrupt()
1467 if ((status & CM_CHINT0) && cm->channel[0].running) in snd_cmipci_interrupt()
1468 snd_pcm_period_elapsed(cm->channel[0].substream); in snd_cmipci_interrupt()
1469 if ((status & CM_CHINT1) && cm->channel[1].running) in snd_cmipci_interrupt()
1470 snd_pcm_period_elapsed(cm->channel[1].substream); in snd_cmipci_interrupt()
1611 static int open_device_check(struct cmipci *cm, int mode, struct snd_pcm_substream *subs) in open_device_check() argument
1620 mutex_lock(&cm->open_mutex); in open_device_check()
1621 if (cm->opened[ch]) { in open_device_check()
1622 mutex_unlock(&cm->open_mutex); in open_device_check()
1625 cm->opened[ch] = mode; in open_device_check()
1626 cm->channel[ch].substream = subs; in open_device_check()
1629 cm->channel[ch].is_dac = 0; in open_device_check()
1630 spin_lock_irq(&cm->reg_lock); in open_device_check()
1631 snd_cmipci_clear_bit(cm, CM_REG_MISC_CTRL, CM_ENDBDAC); in open_device_check()
1632 spin_unlock_irq(&cm->reg_lock); in open_device_check()
1634 mutex_unlock(&cm->open_mutex); in open_device_check()
1638 static void close_device_check(struct cmipci *cm, int mode) in close_device_check() argument
1642 mutex_lock(&cm->open_mutex); in close_device_check()
1643 if (cm->opened[ch] == mode) { in close_device_check()
1644 if (cm->channel[ch].substream) { in close_device_check()
1645 snd_cmipci_ch_reset(cm, ch); in close_device_check()
1646 cm->channel[ch].running = 0; in close_device_check()
1647 cm->channel[ch].substream = NULL; in close_device_check()
1649 cm->opened[ch] = 0; in close_device_check()
1650 if (! cm->channel[ch].is_dac) { in close_device_check()
1652 cm->channel[ch].is_dac = 1; in close_device_check()
1653 spin_lock_irq(&cm->reg_lock); in close_device_check()
1654 snd_cmipci_set_bit(cm, CM_REG_MISC_CTRL, CM_ENDBDAC); in close_device_check()
1655 spin_unlock_irq(&cm->reg_lock); in close_device_check()
1658 mutex_unlock(&cm->open_mutex); in close_device_check()
1666 struct cmipci *cm = snd_pcm_substream_chip(substream); in snd_cmipci_playback_open() local
1670 if ((err = open_device_check(cm, CM_OPEN_PLAYBACK, substream)) < 0) in snd_cmipci_playback_open()
1673 if (cm->chip_version == 68) { in snd_cmipci_playback_open()
1677 } else if (cm->chip_version == 55) { in snd_cmipci_playback_open()
1686 cm->dig_pcm_status = cm->dig_status; in snd_cmipci_playback_open()
1692 struct cmipci *cm = snd_pcm_substream_chip(substream); in snd_cmipci_capture_open() local
1696 if ((err = open_device_check(cm, CM_OPEN_CAPTURE, substream)) < 0) in snd_cmipci_capture_open()
1699 if (cm->chip_version == 68) { // 8768 only supports 44k/48k recording in snd_cmipci_capture_open()
1702 } else if (cm->chip_version == 55) { in snd_cmipci_capture_open()
1716 struct cmipci *cm = snd_pcm_substream_chip(substream); in snd_cmipci_playback2_open() local
1720 if ((err = open_device_check(cm, CM_OPEN_PLAYBACK2, substream)) < 0) /* use channel B */ in snd_cmipci_playback2_open()
1723 mutex_lock(&cm->open_mutex); in snd_cmipci_playback2_open()
1724 if (! cm->opened[CM_CH_PLAY]) { in snd_cmipci_playback2_open()
1725 if (cm->can_multi_ch) { in snd_cmipci_playback2_open()
1726 runtime->hw.channels_max = cm->max_channels; in snd_cmipci_playback2_open()
1727 if (cm->max_channels == 4) in snd_cmipci_playback2_open()
1729 else if (cm->max_channels == 6) in snd_cmipci_playback2_open()
1731 else if (cm->max_channels == 8) in snd_cmipci_playback2_open()
1735 mutex_unlock(&cm->open_mutex); in snd_cmipci_playback2_open()
1736 if (cm->chip_version == 68) { in snd_cmipci_playback2_open()
1740 } else if (cm->chip_version == 55) { in snd_cmipci_playback2_open()
1754 struct cmipci *cm = snd_pcm_substream_chip(substream); in snd_cmipci_playback_spdif_open() local
1758 if ((err = open_device_check(cm, CM_OPEN_SPDIF_PLAYBACK, substream)) < 0) /* use channel A */ in snd_cmipci_playback_spdif_open()
1760 if (cm->can_ac3_hw) { in snd_cmipci_playback_spdif_open()
1762 if (cm->chip_version >= 37) { in snd_cmipci_playback_spdif_open()
1766 if (cm->can_96k) { in snd_cmipci_playback_spdif_open()
1775 cm->dig_pcm_status = cm->dig_status; in snd_cmipci_playback_spdif_open()
1781 struct cmipci *cm = snd_pcm_substream_chip(substream); in snd_cmipci_capture_spdif_open() local
1785 if ((err = open_device_check(cm, CM_OPEN_SPDIF_CAPTURE, substream)) < 0) /* use channel B */ in snd_cmipci_capture_spdif_open()
1788 if (cm->can_96k && !(cm->chip_version == 68)) { in snd_cmipci_capture_spdif_open()
1803 struct cmipci *cm = snd_pcm_substream_chip(substream); in snd_cmipci_playback_close() local
1804 close_device_check(cm, CM_OPEN_PLAYBACK); in snd_cmipci_playback_close()
1810 struct cmipci *cm = snd_pcm_substream_chip(substream); in snd_cmipci_capture_close() local
1811 close_device_check(cm, CM_OPEN_CAPTURE); in snd_cmipci_capture_close()
1817 struct cmipci *cm = snd_pcm_substream_chip(substream); in snd_cmipci_playback2_close() local
1818 close_device_check(cm, CM_OPEN_PLAYBACK2); in snd_cmipci_playback2_close()
1819 close_device_check(cm, CM_OPEN_PLAYBACK_MULTI); in snd_cmipci_playback2_close()
1825 struct cmipci *cm = snd_pcm_substream_chip(substream); in snd_cmipci_playback_spdif_close() local
1826 close_device_check(cm, CM_OPEN_SPDIF_PLAYBACK); in snd_cmipci_playback_spdif_close()
1832 struct cmipci *cm = snd_pcm_substream_chip(substream); in snd_cmipci_capture_spdif_close() local
1833 close_device_check(cm, CM_OPEN_SPDIF_CAPTURE); in snd_cmipci_capture_spdif_close()
1900 static int snd_cmipci_pcm_new(struct cmipci *cm, int device) in snd_cmipci_pcm_new() argument
1905 err = snd_pcm_new(cm->card, cm->card->driver, device, 1, 1, &pcm); in snd_cmipci_pcm_new()
1912 pcm->private_data = cm; in snd_cmipci_pcm_new()
1915 cm->pcm = pcm; in snd_cmipci_pcm_new()
1918 snd_dma_pci_data(cm->pci), 64*1024, 128*1024); in snd_cmipci_pcm_new()
1923 static int snd_cmipci_pcm2_new(struct cmipci *cm, int device) in snd_cmipci_pcm2_new() argument
1928 err = snd_pcm_new(cm->card, cm->card->driver, device, 1, 0, &pcm); in snd_cmipci_pcm2_new()
1934 pcm->private_data = cm; in snd_cmipci_pcm2_new()
1937 cm->pcm2 = pcm; in snd_cmipci_pcm2_new()
1940 snd_dma_pci_data(cm->pci), 64*1024, 128*1024); in snd_cmipci_pcm2_new()
1945 static int snd_cmipci_pcm_spdif_new(struct cmipci *cm, int device) in snd_cmipci_pcm_spdif_new() argument
1950 err = snd_pcm_new(cm->card, cm->card->driver, device, 1, 1, &pcm); in snd_cmipci_pcm_spdif_new()
1957 pcm->private_data = cm; in snd_cmipci_pcm_spdif_new()
1960 cm->pcm_spdif = pcm; in snd_cmipci_pcm_spdif_new()
1963 snd_dma_pci_data(cm->pci), 64*1024, 128*1024); in snd_cmipci_pcm_spdif_new()
1966 snd_pcm_alt_chmaps, cm->max_channels, 0, in snd_cmipci_pcm_spdif_new()
2051 struct cmipci *cm = snd_kcontrol_chip(kcontrol); in snd_cmipci_get_volume() local
2056 spin_lock_irq(&cm->reg_lock); in snd_cmipci_get_volume()
2057 val = (snd_cmipci_mixer_read(cm, reg.left_reg) >> reg.left_shift) & reg.mask; in snd_cmipci_get_volume()
2062 val = (snd_cmipci_mixer_read(cm, reg.right_reg) >> reg.right_shift) & reg.mask; in snd_cmipci_get_volume()
2067 spin_unlock_irq(&cm->reg_lock); in snd_cmipci_get_volume()
2074 struct cmipci *cm = snd_kcontrol_chip(kcontrol); in snd_cmipci_put_volume() local
2091 spin_lock_irq(&cm->reg_lock); in snd_cmipci_put_volume()
2092 oleft = snd_cmipci_mixer_read(cm, reg.left_reg); in snd_cmipci_put_volume()
2097 snd_cmipci_mixer_write(cm, reg.left_reg, left); in snd_cmipci_put_volume()
2098 oright = snd_cmipci_mixer_read(cm, reg.right_reg); in snd_cmipci_put_volume()
2103 snd_cmipci_mixer_write(cm, reg.right_reg, right); in snd_cmipci_put_volume()
2105 snd_cmipci_mixer_write(cm, reg.left_reg, left); in snd_cmipci_put_volume()
2106 spin_unlock_irq(&cm->reg_lock); in snd_cmipci_put_volume()
2133 struct cmipci *cm = snd_kcontrol_chip(kcontrol); in snd_cmipci_get_input_sw() local
2138 spin_lock_irq(&cm->reg_lock); in snd_cmipci_get_input_sw()
2139 val1 = snd_cmipci_mixer_read(cm, reg.left_reg); in snd_cmipci_get_input_sw()
2140 val2 = snd_cmipci_mixer_read(cm, reg.right_reg); in snd_cmipci_get_input_sw()
2141 spin_unlock_irq(&cm->reg_lock); in snd_cmipci_get_input_sw()
2152 struct cmipci *cm = snd_kcontrol_chip(kcontrol); in snd_cmipci_put_input_sw() local
2158 spin_lock_irq(&cm->reg_lock); in snd_cmipci_put_input_sw()
2159 oval1 = snd_cmipci_mixer_read(cm, reg.left_reg); in snd_cmipci_put_input_sw()
2160 oval2 = snd_cmipci_mixer_read(cm, reg.right_reg); in snd_cmipci_put_input_sw()
2168 snd_cmipci_mixer_write(cm, reg.left_reg, val1); in snd_cmipci_put_input_sw()
2169 snd_cmipci_mixer_write(cm, reg.right_reg, val2); in snd_cmipci_put_input_sw()
2170 spin_unlock_irq(&cm->reg_lock); in snd_cmipci_put_input_sw()
2223 struct cmipci *cm = snd_kcontrol_chip(kcontrol); in snd_cmipci_get_native_mixer() local
2228 spin_lock_irq(&cm->reg_lock); in snd_cmipci_get_native_mixer()
2229 oreg = inb(cm->iobase + reg.left_reg); in snd_cmipci_get_native_mixer()
2240 spin_unlock_irq(&cm->reg_lock); in snd_cmipci_get_native_mixer()
2247 struct cmipci *cm = snd_kcontrol_chip(kcontrol); in snd_cmipci_put_native_mixer() local
2252 spin_lock_irq(&cm->reg_lock); in snd_cmipci_put_native_mixer()
2253 oreg = inb(cm->iobase + reg.left_reg); in snd_cmipci_put_native_mixer()
2266 outb(nreg, cm->iobase + reg.left_reg); in snd_cmipci_put_native_mixer()
2267 spin_unlock_irq(&cm->reg_lock); in snd_cmipci_put_native_mixer()
2284 struct cmipci *cm = snd_kcontrol_chip(kcontrol); in snd_cmipci_put_native_mixer_sensitive() local
2285 if (cm->mixer_insensitive) { in snd_cmipci_put_native_mixer_sensitive()
2352 struct cmipci *cm = snd_kcontrol_chip(kcontrol); in _snd_cmipci_uswitch_get() local
2354 spin_lock_irq(&cm->reg_lock); in _snd_cmipci_uswitch_get()
2355 if (args->ac3_sensitive && cm->mixer_insensitive) { in _snd_cmipci_uswitch_get()
2357 spin_unlock_irq(&cm->reg_lock); in _snd_cmipci_uswitch_get()
2361 val = inb(cm->iobase + args->reg); in _snd_cmipci_uswitch_get()
2363 val = snd_cmipci_read(cm, args->reg); in _snd_cmipci_uswitch_get()
2365 spin_unlock_irq(&cm->reg_lock); in _snd_cmipci_uswitch_get()
2385 struct cmipci *cm = snd_kcontrol_chip(kcontrol); in _snd_cmipci_uswitch_put() local
2387 spin_lock_irq(&cm->reg_lock); in _snd_cmipci_uswitch_put()
2388 if (args->ac3_sensitive && cm->mixer_insensitive) { in _snd_cmipci_uswitch_put()
2390 spin_unlock_irq(&cm->reg_lock); in _snd_cmipci_uswitch_put()
2394 val = inb(cm->iobase + args->reg); in _snd_cmipci_uswitch_put()
2396 val = snd_cmipci_read(cm, args->reg); in _snd_cmipci_uswitch_put()
2406 outb((unsigned char)val, cm->iobase + args->reg); in _snd_cmipci_uswitch_put()
2408 snd_cmipci_write(cm, args->reg, val); in _snd_cmipci_uswitch_put()
2410 spin_unlock_irq(&cm->reg_lock); in _snd_cmipci_uswitch_put()
2515 struct cmipci *cm = snd_kcontrol_chip(kcontrol); in snd_cmipci_line_in_mode_info() local
2521 cm->chip_version >= 39 ? 3 : 2, texts); in snd_cmipci_line_in_mode_info()
2524 static inline unsigned int get_line_in_mode(struct cmipci *cm) in get_line_in_mode() argument
2527 if (cm->chip_version >= 39) { in get_line_in_mode()
2528 val = snd_cmipci_read(cm, CM_REG_LEGACY_CTRL); in get_line_in_mode()
2532 val = snd_cmipci_read_b(cm, CM_REG_MIXER1); in get_line_in_mode()
2541 struct cmipci *cm = snd_kcontrol_chip(kcontrol); in snd_cmipci_line_in_mode_get() local
2543 spin_lock_irq(&cm->reg_lock); in snd_cmipci_line_in_mode_get()
2544 ucontrol->value.enumerated.item[0] = get_line_in_mode(cm); in snd_cmipci_line_in_mode_get()
2545 spin_unlock_irq(&cm->reg_lock); in snd_cmipci_line_in_mode_get()
2552 struct cmipci *cm = snd_kcontrol_chip(kcontrol); in snd_cmipci_line_in_mode_put() local
2555 spin_lock_irq(&cm->reg_lock); in snd_cmipci_line_in_mode_put()
2557 change = snd_cmipci_set_bit(cm, CM_REG_LEGACY_CTRL, CM_CENTR2LIN | CM_BASE2LIN); in snd_cmipci_line_in_mode_put()
2559 change = snd_cmipci_clear_bit(cm, CM_REG_LEGACY_CTRL, CM_CENTR2LIN | CM_BASE2LIN); in snd_cmipci_line_in_mode_put()
2561 change |= snd_cmipci_set_bit_b(cm, CM_REG_MIXER1, CM_REAR2LIN); in snd_cmipci_line_in_mode_put()
2563 change |= snd_cmipci_clear_bit_b(cm, CM_REG_MIXER1, CM_REAR2LIN); in snd_cmipci_line_in_mode_put()
2564 spin_unlock_irq(&cm->reg_lock); in snd_cmipci_line_in_mode_put()
2579 struct cmipci *cm = snd_kcontrol_chip(kcontrol); in snd_cmipci_mic_in_mode_get() local
2581 spin_lock_irq(&cm->reg_lock); in snd_cmipci_mic_in_mode_get()
2583 (snd_cmipci_read_b(cm, CM_REG_MISC) & CM_SPDIF_INVERSE) ? 1 : 0; in snd_cmipci_mic_in_mode_get()
2584 spin_unlock_irq(&cm->reg_lock); in snd_cmipci_mic_in_mode_get()
2591 struct cmipci *cm = snd_kcontrol_chip(kcontrol); in snd_cmipci_mic_in_mode_put() local
2594 spin_lock_irq(&cm->reg_lock); in snd_cmipci_mic_in_mode_put()
2596 change = snd_cmipci_set_bit_b(cm, CM_REG_MISC, CM_SPDIF_INVERSE); in snd_cmipci_mic_in_mode_put()
2598 change = snd_cmipci_clear_bit_b(cm, CM_REG_MISC, CM_SPDIF_INVERSE); in snd_cmipci_mic_in_mode_put()
2599 spin_unlock_irq(&cm->reg_lock); in snd_cmipci_mic_in_mode_put()
2666 static int snd_cmipci_mixer_new(struct cmipci *cm, int pcm_spdif_device) in snd_cmipci_mixer_new() argument
2674 if (snd_BUG_ON(!cm || !cm->card)) in snd_cmipci_mixer_new()
2677 card = cm->card; in snd_cmipci_mixer_new()
2681 spin_lock_irq(&cm->reg_lock); in snd_cmipci_mixer_new()
2682 snd_cmipci_mixer_write(cm, 0x00, 0x00); /* mixer reset */ in snd_cmipci_mixer_new()
2683 spin_unlock_irq(&cm->reg_lock); in snd_cmipci_mixer_new()
2686 if (cm->chip_version == 68) { // 8768 has no PCM volume in snd_cmipci_mixer_new()
2691 if ((err = snd_ctl_add(card, snd_ctl_new1(&snd_cmipci_mixers[idx], cm))) < 0) in snd_cmipci_mixer_new()
2698 err = snd_ctl_add(cm->card, snd_ctl_new1(sw, cm)); in snd_cmipci_mixer_new()
2702 if (! cm->can_multi_ch) { in snd_cmipci_mixer_new()
2703 err = snd_ctl_add(cm->card, snd_ctl_new1(&snd_cmipci_nomulti_switch, cm)); in snd_cmipci_mixer_new()
2707 if (cm->device == PCI_DEVICE_ID_CMEDIA_CM8738 || in snd_cmipci_mixer_new()
2708 cm->device == PCI_DEVICE_ID_CMEDIA_CM8738B) { in snd_cmipci_mixer_new()
2711 err = snd_ctl_add(cm->card, snd_ctl_new1(sw, cm)); in snd_cmipci_mixer_new()
2715 if (cm->can_ac3_hw) { in snd_cmipci_mixer_new()
2716 if ((err = snd_ctl_add(card, kctl = snd_ctl_new1(&snd_cmipci_spdif_default, cm))) < 0) in snd_cmipci_mixer_new()
2719 if ((err = snd_ctl_add(card, kctl = snd_ctl_new1(&snd_cmipci_spdif_mask, cm))) < 0) in snd_cmipci_mixer_new()
2722 if ((err = snd_ctl_add(card, kctl = snd_ctl_new1(&snd_cmipci_spdif_stream, cm))) < 0) in snd_cmipci_mixer_new()
2726 if (cm->chip_version <= 37) { in snd_cmipci_mixer_new()
2729 err = snd_ctl_add(cm->card, snd_ctl_new1(sw, cm)); in snd_cmipci_mixer_new()
2735 if (cm->chip_version >= 39) { in snd_cmipci_mixer_new()
2738 err = snd_ctl_add(cm->card, snd_ctl_new1(sw, cm)); in snd_cmipci_mixer_new()
2749 if (cm->chip_version < 39) { in snd_cmipci_mixer_new()
2750 err = snd_ctl_add(cm->card, in snd_cmipci_mixer_new()
2751 snd_ctl_new1(&snd_cmipci_modem_switch, cm)); in snd_cmipci_mixer_new()
2762 ctl = snd_ctl_find_id(cm->card, &elem_id); in snd_cmipci_mixer_new()
2764 cm->mixer_res_ctl[idx] = ctl; in snd_cmipci_mixer_new()
2779 struct cmipci *cm = entry->private_data; in snd_cmipci_proc_read() local
2782 snd_iprintf(buffer, "%s\n", cm->card->longname); in snd_cmipci_proc_read()
2786 v = inb(cm->iobase + i); in snd_cmipci_proc_read()
2794 static void snd_cmipci_proc_init(struct cmipci *cm) in snd_cmipci_proc_init() argument
2798 if (! snd_card_proc_new(cm->card, "cmipci", &entry)) in snd_cmipci_proc_init()
2799 snd_info_set_text_ops(entry, cm, snd_cmipci_proc_read); in snd_cmipci_proc_init()
2802 static inline void snd_cmipci_proc_init(struct cmipci *cm) {} in snd_cmipci_proc_init() argument
2820 static void query_chip(struct cmipci *cm) in query_chip() argument
2825 detect = snd_cmipci_read(cm, CM_REG_INT_HLDCLR) & CM_CHIP_MASK2; in query_chip()
2828 detect = snd_cmipci_read(cm, CM_REG_CHFORMAT) & CM_CHIP_MASK1; in query_chip()
2831 cm->chip_version = 33; in query_chip()
2832 if (cm->do_soft_ac3) in query_chip()
2833 cm->can_ac3_sw = 1; in query_chip()
2835 cm->can_ac3_hw = 1; in query_chip()
2838 cm->chip_version = 37; in query_chip()
2839 cm->can_ac3_hw = 1; in query_chip()
2842 cm->chip_version = 39; in query_chip()
2843 cm->can_ac3_hw = 1; in query_chip()
2846 cm->max_channels = 2; in query_chip()
2849 cm->chip_version = 39; in query_chip()
2851 cm->max_channels = 6; in query_chip()
2853 cm->max_channels = 4; in query_chip()
2855 cm->chip_version = 68; in query_chip()
2856 cm->max_channels = 8; in query_chip()
2857 cm->can_96k = 1; in query_chip()
2859 cm->chip_version = 55; in query_chip()
2860 cm->max_channels = 6; in query_chip()
2861 cm->can_96k = 1; in query_chip()
2863 cm->can_ac3_hw = 1; in query_chip()
2864 cm->can_multi_ch = 1; in query_chip()
2869 static int snd_cmipci_create_gameport(struct cmipci *cm, int dev) in snd_cmipci_create_gameport() argument
2892 dev_warn(cm->card->dev, "cannot reserve joystick ports\n"); in snd_cmipci_create_gameport()
2896 cm->gameport = gp = gameport_allocate_port(); in snd_cmipci_create_gameport()
2898 dev_err(cm->card->dev, "cannot allocate memory for gameport\n"); in snd_cmipci_create_gameport()
2903 gameport_set_phys(gp, "pci%s/gameport0", pci_name(cm->pci)); in snd_cmipci_create_gameport()
2904 gameport_set_dev_parent(gp, &cm->pci->dev); in snd_cmipci_create_gameport()
2908 snd_cmipci_set_bit(cm, CM_REG_FUNCTRL1, CM_JYSTK_EN); in snd_cmipci_create_gameport()
2910 gameport_register_port(cm->gameport); in snd_cmipci_create_gameport()
2915 static void snd_cmipci_free_gameport(struct cmipci *cm) in snd_cmipci_free_gameport() argument
2917 if (cm->gameport) { in snd_cmipci_free_gameport()
2918 struct resource *r = gameport_get_port_data(cm->gameport); in snd_cmipci_free_gameport()
2920 gameport_unregister_port(cm->gameport); in snd_cmipci_free_gameport()
2921 cm->gameport = NULL; in snd_cmipci_free_gameport()
2923 snd_cmipci_clear_bit(cm, CM_REG_FUNCTRL1, CM_JYSTK_EN); in snd_cmipci_free_gameport()
2928 static inline int snd_cmipci_create_gameport(struct cmipci *cm, int dev) { return -ENOSYS; } in snd_cmipci_create_gameport() argument
2929 static inline void snd_cmipci_free_gameport(struct cmipci *cm) { } in snd_cmipci_free_gameport() argument
2932 static int snd_cmipci_free(struct cmipci *cm) in snd_cmipci_free() argument
2934 if (cm->irq >= 0) { in snd_cmipci_free()
2935 snd_cmipci_clear_bit(cm, CM_REG_MISC_CTRL, CM_FM_EN); in snd_cmipci_free()
2936 snd_cmipci_clear_bit(cm, CM_REG_LEGACY_CTRL, CM_ENSPDOUT); in snd_cmipci_free()
2937 snd_cmipci_write(cm, CM_REG_INT_HLDCLR, 0); /* disable ints */ in snd_cmipci_free()
2938 snd_cmipci_ch_reset(cm, CM_CH_PLAY); in snd_cmipci_free()
2939 snd_cmipci_ch_reset(cm, CM_CH_CAPT); in snd_cmipci_free()
2940 snd_cmipci_write(cm, CM_REG_FUNCTRL0, 0); /* disable channels */ in snd_cmipci_free()
2941 snd_cmipci_write(cm, CM_REG_FUNCTRL1, 0); in snd_cmipci_free()
2944 snd_cmipci_mixer_write(cm, 0, 0); in snd_cmipci_free()
2946 free_irq(cm->irq, cm); in snd_cmipci_free()
2949 snd_cmipci_free_gameport(cm); in snd_cmipci_free()
2950 pci_release_regions(cm->pci); in snd_cmipci_free()
2951 pci_disable_device(cm->pci); in snd_cmipci_free()
2952 kfree(cm); in snd_cmipci_free()
2958 struct cmipci *cm = device->device_data; in snd_cmipci_dev_free() local
2959 return snd_cmipci_free(cm); in snd_cmipci_dev_free()
2962 static int snd_cmipci_create_fm(struct cmipci *cm, long fm_port) in snd_cmipci_create_fm() argument
2972 if (cm->chip_version >= 39) { in snd_cmipci_create_fm()
2974 iosynth = cm->iobase + CM_REG_FM_PCI; in snd_cmipci_create_fm()
2975 err = snd_opl3_create(cm->card, iosynth, iosynth + 2, in snd_cmipci_create_fm()
2982 val = snd_cmipci_read(cm, CM_REG_LEGACY_CTRL) & ~CM_FMSEL_MASK; in snd_cmipci_create_fm()
2992 snd_cmipci_write(cm, CM_REG_LEGACY_CTRL, val); in snd_cmipci_create_fm()
2994 snd_cmipci_set_bit(cm, CM_REG_MISC_CTRL, CM_FM_EN); in snd_cmipci_create_fm()
2996 if (snd_opl3_create(cm->card, iosynth, iosynth + 2, in snd_cmipci_create_fm()
2998 dev_err(cm->card->dev, in snd_cmipci_create_fm()
3005 dev_err(cm->card->dev, "cannot create OPL3 hwdep\n"); in snd_cmipci_create_fm()
3011 snd_cmipci_clear_bit(cm, CM_REG_LEGACY_CTRL, CM_FMSEL_MASK); in snd_cmipci_create_fm()
3012 snd_cmipci_clear_bit(cm, CM_REG_MISC_CTRL, CM_FM_EN); in snd_cmipci_create_fm()
3019 struct cmipci *cm; in snd_cmipci_create() local
3039 cm = kzalloc(sizeof(*cm), GFP_KERNEL); in snd_cmipci_create()
3040 if (cm == NULL) { in snd_cmipci_create()
3045 spin_lock_init(&cm->reg_lock); in snd_cmipci_create()
3046 mutex_init(&cm->open_mutex); in snd_cmipci_create()
3047 cm->device = pci->device; in snd_cmipci_create()
3048 cm->card = card; in snd_cmipci_create()
3049 cm->pci = pci; in snd_cmipci_create()
3050 cm->irq = -1; in snd_cmipci_create()
3051 cm->channel[0].ch = 0; in snd_cmipci_create()
3052 cm->channel[1].ch = 1; in snd_cmipci_create()
3053 cm->channel[0].is_dac = cm->channel[1].is_dac = 1; /* dual DAC mode */ in snd_cmipci_create()
3056 kfree(cm); in snd_cmipci_create()
3060 cm->iobase = pci_resource_start(pci, 0); in snd_cmipci_create()
3063 IRQF_SHARED, KBUILD_MODNAME, cm)) { in snd_cmipci_create()
3065 snd_cmipci_free(cm); in snd_cmipci_create()
3068 cm->irq = pci->irq; in snd_cmipci_create()
3070 pci_set_master(cm->pci); in snd_cmipci_create()
3076 cm->chip_version = 0; in snd_cmipci_create()
3077 cm->max_channels = 2; in snd_cmipci_create()
3078 cm->do_soft_ac3 = soft_ac3[dev]; in snd_cmipci_create()
3082 query_chip(cm); in snd_cmipci_create()
3084 if (cm->can_multi_ch) in snd_cmipci_create()
3085 sprintf(cm->card->driver + strlen(cm->card->driver), in snd_cmipci_create()
3086 "-MC%d", cm->max_channels); in snd_cmipci_create()
3087 else if (cm->can_ac3_sw) in snd_cmipci_create()
3088 strcpy(cm->card->driver + strlen(cm->card->driver), "-SWIEC"); in snd_cmipci_create()
3090 cm->dig_status = SNDRV_PCM_DEFAULT_CON_SPDIF; in snd_cmipci_create()
3091 cm->dig_pcm_status = SNDRV_PCM_DEFAULT_CON_SPDIF; in snd_cmipci_create()
3094 cm->ctrl = CM_CHADC0; /* default FUNCNTRL0 */ in snd_cmipci_create()
3096 cm->ctrl = CM_CHADC1; /* default FUNCNTRL0 */ in snd_cmipci_create()
3100 snd_cmipci_set_bit(cm, CM_REG_MISC_CTRL, CM_RESET); in snd_cmipci_create()
3101 snd_cmipci_clear_bit(cm, CM_REG_MISC_CTRL, CM_RESET); in snd_cmipci_create()
3102 snd_cmipci_write(cm, CM_REG_INT_HLDCLR, 0); /* disable ints */ in snd_cmipci_create()
3103 snd_cmipci_ch_reset(cm, CM_CH_PLAY); in snd_cmipci_create()
3104 snd_cmipci_ch_reset(cm, CM_CH_CAPT); in snd_cmipci_create()
3105 snd_cmipci_write(cm, CM_REG_FUNCTRL0, 0); /* disable channels */ in snd_cmipci_create()
3106 snd_cmipci_write(cm, CM_REG_FUNCTRL1, 0); in snd_cmipci_create()
3108 snd_cmipci_write(cm, CM_REG_CHFORMAT, 0); in snd_cmipci_create()
3109 snd_cmipci_set_bit(cm, CM_REG_MISC_CTRL, CM_ENDBDAC|CM_N4SPK3D); in snd_cmipci_create()
3111 snd_cmipci_set_bit(cm, CM_REG_MISC_CTRL, CM_XCHGDAC); in snd_cmipci_create()
3113 snd_cmipci_clear_bit(cm, CM_REG_MISC_CTRL, CM_XCHGDAC); in snd_cmipci_create()
3115 if (cm->chip_version) { in snd_cmipci_create()
3116 snd_cmipci_write_b(cm, CM_REG_EXT_MISC, 0x20); /* magic */ in snd_cmipci_create()
3117 snd_cmipci_write_b(cm, CM_REG_EXT_MISC + 1, 0x09); /* more magic */ in snd_cmipci_create()
3120 snd_cmipci_set_bit(cm, CM_REG_FUNCTRL1, CM_BREQ); in snd_cmipci_create()
3127 snd_cmipci_set_bit(cm, CM_REG_MISC_CTRL, CM_TXVX); in snd_cmipci_create()
3133 if (cm->chip_version < 68) { in snd_cmipci_create()
3136 switch (snd_cmipci_read_b(cm, CM_REG_INT_HLDCLR + 3) & 0x03) { in snd_cmipci_create()
3161 if (cm->chip_version < 68) in snd_cmipci_create()
3162 sprintf(modelstr, " (model %d)", cm->chip_version); in snd_cmipci_create()
3166 card->shortname, modelstr, cm->iobase, cm->irq); in snd_cmipci_create()
3168 if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, cm, &ops)) < 0) { in snd_cmipci_create()
3169 snd_cmipci_free(cm); in snd_cmipci_create()
3173 if (cm->chip_version >= 39) { in snd_cmipci_create()
3174 val = snd_cmipci_read_b(cm, CM_REG_MPU_PCI + 1); in snd_cmipci_create()
3176 iomidi = cm->iobase + CM_REG_MPU_PCI; in snd_cmipci_create()
3192 snd_cmipci_write(cm, CM_REG_LEGACY_CTRL, val); in snd_cmipci_create()
3194 snd_cmipci_set_bit(cm, CM_REG_FUNCTRL1, CM_UART_EN); in snd_cmipci_create()
3196 dev_err(cm->card->dev, in snd_cmipci_create()
3199 snd_cmipci_clear_bit(cm, CM_REG_FUNCTRL1, in snd_cmipci_create()
3206 if (cm->chip_version < 68) { in snd_cmipci_create()
3207 err = snd_cmipci_create_fm(cm, fm_port[dev]); in snd_cmipci_create()
3213 snd_cmipci_mixer_write(cm, 0, 0); in snd_cmipci_create()
3215 snd_cmipci_proc_init(cm); in snd_cmipci_create()
3219 if ((err = snd_cmipci_pcm_new(cm, pcm_index)) < 0) in snd_cmipci_create()
3222 if ((err = snd_cmipci_pcm2_new(cm, pcm_index)) < 0) in snd_cmipci_create()
3225 if (cm->can_ac3_hw || cm->can_ac3_sw) { in snd_cmipci_create()
3227 if ((err = snd_cmipci_pcm_spdif_new(cm, pcm_index)) < 0) in snd_cmipci_create()
3232 if ((err = snd_cmipci_mixer_new(cm, pcm_spdif_index)) < 0) in snd_cmipci_create()
3241 -1, &cm->rmidi)) < 0) { in snd_cmipci_create()
3242 dev_err(cm->card->dev, in snd_cmipci_create()
3249 snd_cmipci_set_pll(cm, rates[val], val); in snd_cmipci_create()
3254 snd_cmipci_set_bit(cm, CM_REG_MISC_CTRL, CM_SPDIF48K|CM_SPDF_AC97); in snd_cmipci_create()
3257 if (snd_cmipci_create_gameport(cm, dev) < 0) in snd_cmipci_create()
3258 snd_cmipci_clear_bit(cm, CM_REG_FUNCTRL1, CM_JYSTK_EN); in snd_cmipci_create()
3260 *rcmipci = cm; in snd_cmipci_create()
3274 struct cmipci *cm; in snd_cmipci_probe() local
3303 if ((err = snd_cmipci_create(card, pci, dev, &cm)) < 0) { in snd_cmipci_probe()
3307 card->private_data = cm; in snd_cmipci_probe()
3351 struct cmipci *cm = card->private_data; in snd_cmipci_suspend() local
3356 snd_pcm_suspend_all(cm->pcm); in snd_cmipci_suspend()
3357 snd_pcm_suspend_all(cm->pcm2); in snd_cmipci_suspend()
3358 snd_pcm_suspend_all(cm->pcm_spdif); in snd_cmipci_suspend()
3362 cm->saved_regs[i] = snd_cmipci_read(cm, saved_regs[i]); in snd_cmipci_suspend()
3364 cm->saved_mixers[i] = snd_cmipci_mixer_read(cm, saved_mixers[i]); in snd_cmipci_suspend()
3367 snd_cmipci_write(cm, CM_REG_INT_HLDCLR, 0); in snd_cmipci_suspend()
3374 struct cmipci *cm = card->private_data; in snd_cmipci_resume() local
3378 snd_cmipci_write(cm, CM_REG_INT_HLDCLR, 0); in snd_cmipci_resume()
3379 snd_cmipci_ch_reset(cm, CM_CH_PLAY); in snd_cmipci_resume()
3380 snd_cmipci_ch_reset(cm, CM_CH_CAPT); in snd_cmipci_resume()
3381 snd_cmipci_mixer_write(cm, 0, 0); in snd_cmipci_resume()
3385 snd_cmipci_write(cm, saved_regs[i], cm->saved_regs[i]); in snd_cmipci_resume()
3387 snd_cmipci_mixer_write(cm, saved_mixers[i], cm->saved_mixers[i]); in snd_cmipci_resume()