Lines Matching refs:chip

165 static inline void wss_outb(struct snd_wss *chip, u8 offset, u8 val)  in wss_outb()  argument
167 outb(val, chip->port + offset); in wss_outb()
170 static inline u8 wss_inb(struct snd_wss *chip, u8 offset) in wss_inb() argument
172 return inb(chip->port + offset); in wss_inb()
175 static void snd_wss_wait(struct snd_wss *chip) in snd_wss_wait() argument
180 timeout > 0 && (wss_inb(chip, CS4231P(REGSEL)) & CS4231_INIT); in snd_wss_wait()
185 static void snd_wss_dout(struct snd_wss *chip, unsigned char reg, in snd_wss_dout() argument
191 timeout > 0 && (wss_inb(chip, CS4231P(REGSEL)) & CS4231_INIT); in snd_wss_dout()
194 wss_outb(chip, CS4231P(REGSEL), chip->mce_bit | reg); in snd_wss_dout()
195 wss_outb(chip, CS4231P(REG), value); in snd_wss_dout()
199 void snd_wss_out(struct snd_wss *chip, unsigned char reg, unsigned char value) in snd_wss_out() argument
201 snd_wss_wait(chip); in snd_wss_out()
203 if (wss_inb(chip, CS4231P(REGSEL)) & CS4231_INIT) in snd_wss_out()
207 wss_outb(chip, CS4231P(REGSEL), chip->mce_bit | reg); in snd_wss_out()
208 wss_outb(chip, CS4231P(REG), value); in snd_wss_out()
209 chip->image[reg] = value; in snd_wss_out()
212 chip->mce_bit | reg, value); in snd_wss_out()
216 unsigned char snd_wss_in(struct snd_wss *chip, unsigned char reg) in snd_wss_in() argument
218 snd_wss_wait(chip); in snd_wss_in()
220 if (wss_inb(chip, CS4231P(REGSEL)) & CS4231_INIT) in snd_wss_in()
224 wss_outb(chip, CS4231P(REGSEL), chip->mce_bit | reg); in snd_wss_in()
226 return wss_inb(chip, CS4231P(REG)); in snd_wss_in()
230 void snd_cs4236_ext_out(struct snd_wss *chip, unsigned char reg, in snd_cs4236_ext_out() argument
233 wss_outb(chip, CS4231P(REGSEL), chip->mce_bit | 0x17); in snd_cs4236_ext_out()
234 wss_outb(chip, CS4231P(REG), in snd_cs4236_ext_out()
235 reg | (chip->image[CS4236_EXT_REG] & 0x01)); in snd_cs4236_ext_out()
236 wss_outb(chip, CS4231P(REG), val); in snd_cs4236_ext_out()
237 chip->eimage[CS4236_REG(reg)] = val; in snd_cs4236_ext_out()
244 unsigned char snd_cs4236_ext_in(struct snd_wss *chip, unsigned char reg) in snd_cs4236_ext_in() argument
246 wss_outb(chip, CS4231P(REGSEL), chip->mce_bit | 0x17); in snd_cs4236_ext_in()
247 wss_outb(chip, CS4231P(REG), in snd_cs4236_ext_in()
248 reg | (chip->image[CS4236_EXT_REG] & 0x01)); in snd_cs4236_ext_in()
250 return wss_inb(chip, CS4231P(REG)); in snd_cs4236_ext_in()
254 res = wss_inb(chip, CS4231P(REG)); in snd_cs4236_ext_in()
265 static void snd_wss_debug(struct snd_wss *chip)
270 wss_inb(chip, CS4231P(REGSEL)),
271 wss_inb(chip, CS4231P(STATUS)));
275 snd_wss_in(chip, 0x00),
276 snd_wss_in(chip, 0x10));
280 snd_wss_in(chip, 0x01),
281 snd_wss_in(chip, 0x11));
285 snd_wss_in(chip, 0x02),
286 snd_wss_in(chip, 0x12));
290 snd_wss_in(chip, 0x03),
291 snd_wss_in(chip, 0x13));
295 snd_wss_in(chip, 0x04),
296 snd_wss_in(chip, 0x14));
300 snd_wss_in(chip, 0x05),
301 snd_wss_in(chip, 0x15));
305 snd_wss_in(chip, 0x06),
306 snd_wss_in(chip, 0x16));
310 snd_wss_in(chip, 0x07),
311 snd_wss_in(chip, 0x17));
315 snd_wss_in(chip, 0x08),
316 snd_wss_in(chip, 0x18));
320 snd_wss_in(chip, 0x09),
321 snd_wss_in(chip, 0x19));
325 snd_wss_in(chip, 0x0a),
326 snd_wss_in(chip, 0x1a));
330 snd_wss_in(chip, 0x0b),
331 snd_wss_in(chip, 0x1b));
335 snd_wss_in(chip, 0x0c),
336 snd_wss_in(chip, 0x1c));
340 snd_wss_in(chip, 0x0d),
341 snd_wss_in(chip, 0x1d));
345 snd_wss_in(chip, 0x0e),
346 snd_wss_in(chip, 0x1e));
350 snd_wss_in(chip, 0x0f),
351 snd_wss_in(chip, 0x1f));
360 static void snd_wss_busy_wait(struct snd_wss *chip) in snd_wss_busy_wait() argument
366 wss_inb(chip, CS4231P(REGSEL)); in snd_wss_busy_wait()
369 timeout > 0 && (wss_inb(chip, CS4231P(REGSEL)) & CS4231_INIT); in snd_wss_busy_wait()
374 void snd_wss_mce_up(struct snd_wss *chip) in snd_wss_mce_up() argument
379 snd_wss_wait(chip); in snd_wss_mce_up()
381 if (wss_inb(chip, CS4231P(REGSEL)) & CS4231_INIT) in snd_wss_mce_up()
385 spin_lock_irqsave(&chip->reg_lock, flags); in snd_wss_mce_up()
386 chip->mce_bit |= CS4231_MCE; in snd_wss_mce_up()
387 timeout = wss_inb(chip, CS4231P(REGSEL)); in snd_wss_mce_up()
391 chip->port); in snd_wss_mce_up()
393 wss_outb(chip, CS4231P(REGSEL), in snd_wss_mce_up()
394 chip->mce_bit | (timeout & 0x1f)); in snd_wss_mce_up()
395 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_wss_mce_up()
399 void snd_wss_mce_down(struct snd_wss *chip) in snd_wss_mce_down() argument
406 snd_wss_busy_wait(chip); in snd_wss_mce_down()
409 if (wss_inb(chip, CS4231P(REGSEL)) & CS4231_INIT) in snd_wss_mce_down()
414 spin_lock_irqsave(&chip->reg_lock, flags); in snd_wss_mce_down()
415 chip->mce_bit &= ~CS4231_MCE; in snd_wss_mce_down()
416 timeout = wss_inb(chip, CS4231P(REGSEL)); in snd_wss_mce_down()
417 wss_outb(chip, CS4231P(REGSEL), chip->mce_bit | (timeout & 0x1f)); in snd_wss_mce_down()
418 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_wss_mce_down()
422 chip->port); in snd_wss_mce_down()
423 if ((timeout & CS4231_MCE) == 0 || !(chip->hardware & hw_mask)) in snd_wss_mce_down()
437 while (snd_wss_in(chip, CS4231_TEST_INIT) & in snd_wss_mce_down()
452 while (wss_inb(chip, CS4231P(REGSEL)) & CS4231_INIT) { in snd_wss_mce_down()
461 snd_printd("mce_down - exit = 0x%x\n", wss_inb(chip, CS4231P(REGSEL))); in snd_wss_mce_down()
483 struct snd_wss *chip = snd_pcm_substream_chip(substream); in snd_wss_trigger() local
502 if (s == chip->playback_substream) { in snd_wss_trigger()
505 } else if (s == chip->capture_substream) { in snd_wss_trigger()
510 spin_lock(&chip->reg_lock); in snd_wss_trigger()
512 chip->image[CS4231_IFACE_CTRL] |= what; in snd_wss_trigger()
513 if (chip->trigger) in snd_wss_trigger()
514 chip->trigger(chip, what, 1); in snd_wss_trigger()
516 chip->image[CS4231_IFACE_CTRL] &= ~what; in snd_wss_trigger()
517 if (chip->trigger) in snd_wss_trigger()
518 chip->trigger(chip, what, 0); in snd_wss_trigger()
520 snd_wss_out(chip, CS4231_IFACE_CTRL, chip->image[CS4231_IFACE_CTRL]); in snd_wss_trigger()
521 spin_unlock(&chip->reg_lock); in snd_wss_trigger()
523 snd_wss_debug(chip); in snd_wss_trigger()
543 static unsigned char snd_wss_get_format(struct snd_wss *chip, in snd_wss_get_format() argument
565 static void snd_wss_calibrate_mute(struct snd_wss *chip, int mute) in snd_wss_calibrate_mute() argument
570 spin_lock_irqsave(&chip->reg_lock, flags); in snd_wss_calibrate_mute()
571 if (chip->calibrate_mute == mute) { in snd_wss_calibrate_mute()
572 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_wss_calibrate_mute()
576 snd_wss_dout(chip, CS4231_LEFT_INPUT, in snd_wss_calibrate_mute()
577 chip->image[CS4231_LEFT_INPUT]); in snd_wss_calibrate_mute()
578 snd_wss_dout(chip, CS4231_RIGHT_INPUT, in snd_wss_calibrate_mute()
579 chip->image[CS4231_RIGHT_INPUT]); in snd_wss_calibrate_mute()
580 snd_wss_dout(chip, CS4231_LOOPBACK, in snd_wss_calibrate_mute()
581 chip->image[CS4231_LOOPBACK]); in snd_wss_calibrate_mute()
583 snd_wss_dout(chip, CS4231_LEFT_INPUT, in snd_wss_calibrate_mute()
585 snd_wss_dout(chip, CS4231_RIGHT_INPUT, in snd_wss_calibrate_mute()
587 snd_wss_dout(chip, CS4231_LOOPBACK, in snd_wss_calibrate_mute()
591 snd_wss_dout(chip, CS4231_AUX1_LEFT_INPUT, in snd_wss_calibrate_mute()
592 mute | chip->image[CS4231_AUX1_LEFT_INPUT]); in snd_wss_calibrate_mute()
593 snd_wss_dout(chip, CS4231_AUX1_RIGHT_INPUT, in snd_wss_calibrate_mute()
594 mute | chip->image[CS4231_AUX1_RIGHT_INPUT]); in snd_wss_calibrate_mute()
595 snd_wss_dout(chip, CS4231_AUX2_LEFT_INPUT, in snd_wss_calibrate_mute()
596 mute | chip->image[CS4231_AUX2_LEFT_INPUT]); in snd_wss_calibrate_mute()
597 snd_wss_dout(chip, CS4231_AUX2_RIGHT_INPUT, in snd_wss_calibrate_mute()
598 mute | chip->image[CS4231_AUX2_RIGHT_INPUT]); in snd_wss_calibrate_mute()
599 snd_wss_dout(chip, CS4231_LEFT_OUTPUT, in snd_wss_calibrate_mute()
600 mute | chip->image[CS4231_LEFT_OUTPUT]); in snd_wss_calibrate_mute()
601 snd_wss_dout(chip, CS4231_RIGHT_OUTPUT, in snd_wss_calibrate_mute()
602 mute | chip->image[CS4231_RIGHT_OUTPUT]); in snd_wss_calibrate_mute()
603 if (!(chip->hardware & WSS_HW_AD1848_MASK)) { in snd_wss_calibrate_mute()
604 snd_wss_dout(chip, CS4231_LEFT_LINE_IN, in snd_wss_calibrate_mute()
605 mute | chip->image[CS4231_LEFT_LINE_IN]); in snd_wss_calibrate_mute()
606 snd_wss_dout(chip, CS4231_RIGHT_LINE_IN, in snd_wss_calibrate_mute()
607 mute | chip->image[CS4231_RIGHT_LINE_IN]); in snd_wss_calibrate_mute()
608 snd_wss_dout(chip, CS4231_MONO_CTRL, in snd_wss_calibrate_mute()
609 mute ? 0xc0 : chip->image[CS4231_MONO_CTRL]); in snd_wss_calibrate_mute()
611 if (chip->hardware == WSS_HW_INTERWAVE) { in snd_wss_calibrate_mute()
612 snd_wss_dout(chip, CS4231_LEFT_MIC_INPUT, in snd_wss_calibrate_mute()
613 mute | chip->image[CS4231_LEFT_MIC_INPUT]); in snd_wss_calibrate_mute()
614 snd_wss_dout(chip, CS4231_RIGHT_MIC_INPUT, in snd_wss_calibrate_mute()
615 mute | chip->image[CS4231_RIGHT_MIC_INPUT]); in snd_wss_calibrate_mute()
616 snd_wss_dout(chip, CS4231_LINE_LEFT_OUTPUT, in snd_wss_calibrate_mute()
617 mute | chip->image[CS4231_LINE_LEFT_OUTPUT]); in snd_wss_calibrate_mute()
618 snd_wss_dout(chip, CS4231_LINE_RIGHT_OUTPUT, in snd_wss_calibrate_mute()
619 mute | chip->image[CS4231_LINE_RIGHT_OUTPUT]); in snd_wss_calibrate_mute()
621 chip->calibrate_mute = mute; in snd_wss_calibrate_mute()
622 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_wss_calibrate_mute()
625 static void snd_wss_playback_format(struct snd_wss *chip, in snd_wss_playback_format() argument
632 mutex_lock(&chip->mce_mutex); in snd_wss_playback_format()
633 if (chip->hardware == WSS_HW_CS4231A || in snd_wss_playback_format()
634 (chip->hardware & WSS_HW_CS4232_MASK)) { in snd_wss_playback_format()
635 spin_lock_irqsave(&chip->reg_lock, flags); in snd_wss_playback_format()
636 if ((chip->image[CS4231_PLAYBK_FORMAT] & 0x0f) == (pdfr & 0x0f)) { /* rate is same? */ in snd_wss_playback_format()
637 snd_wss_out(chip, CS4231_ALT_FEATURE_1, in snd_wss_playback_format()
638 chip->image[CS4231_ALT_FEATURE_1] | 0x10); in snd_wss_playback_format()
639 chip->image[CS4231_PLAYBK_FORMAT] = pdfr; in snd_wss_playback_format()
640 snd_wss_out(chip, CS4231_PLAYBK_FORMAT, in snd_wss_playback_format()
641 chip->image[CS4231_PLAYBK_FORMAT]); in snd_wss_playback_format()
642 snd_wss_out(chip, CS4231_ALT_FEATURE_1, in snd_wss_playback_format()
643 chip->image[CS4231_ALT_FEATURE_1] &= ~0x10); in snd_wss_playback_format()
647 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_wss_playback_format()
648 } else if (chip->hardware == WSS_HW_AD1845) { in snd_wss_playback_format()
660 spin_lock_irqsave(&chip->reg_lock, flags); in snd_wss_playback_format()
661 snd_wss_out(chip, CS4231_PLAYBK_FORMAT, (pdfr & 0xf0)); in snd_wss_playback_format()
662 snd_wss_out(chip, AD1845_UPR_FREQ_SEL, (rate >> 8) & 0xff); in snd_wss_playback_format()
663 snd_wss_out(chip, AD1845_LWR_FREQ_SEL, rate & 0xff); in snd_wss_playback_format()
665 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_wss_playback_format()
668 snd_wss_mce_up(chip); in snd_wss_playback_format()
669 spin_lock_irqsave(&chip->reg_lock, flags); in snd_wss_playback_format()
670 if (chip->hardware != WSS_HW_INTERWAVE && !chip->single_dma) { in snd_wss_playback_format()
671 if (chip->image[CS4231_IFACE_CTRL] & CS4231_RECORD_ENABLE) in snd_wss_playback_format()
673 (chip->image[CS4231_REC_FORMAT] & 0x0f); in snd_wss_playback_format()
675 chip->image[CS4231_PLAYBK_FORMAT] = pdfr; in snd_wss_playback_format()
677 snd_wss_out(chip, CS4231_PLAYBK_FORMAT, pdfr); in snd_wss_playback_format()
678 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_wss_playback_format()
679 if (chip->hardware == WSS_HW_OPL3SA2) in snd_wss_playback_format()
681 snd_wss_mce_down(chip); in snd_wss_playback_format()
683 mutex_unlock(&chip->mce_mutex); in snd_wss_playback_format()
686 static void snd_wss_capture_format(struct snd_wss *chip, in snd_wss_capture_format() argument
693 mutex_lock(&chip->mce_mutex); in snd_wss_capture_format()
694 if (chip->hardware == WSS_HW_CS4231A || in snd_wss_capture_format()
695 (chip->hardware & WSS_HW_CS4232_MASK)) { in snd_wss_capture_format()
696 spin_lock_irqsave(&chip->reg_lock, flags); in snd_wss_capture_format()
697 if ((chip->image[CS4231_PLAYBK_FORMAT] & 0x0f) == (cdfr & 0x0f) || /* rate is same? */ in snd_wss_capture_format()
698 (chip->image[CS4231_IFACE_CTRL] & CS4231_PLAYBACK_ENABLE)) { in snd_wss_capture_format()
699 snd_wss_out(chip, CS4231_ALT_FEATURE_1, in snd_wss_capture_format()
700 chip->image[CS4231_ALT_FEATURE_1] | 0x20); in snd_wss_capture_format()
701 snd_wss_out(chip, CS4231_REC_FORMAT, in snd_wss_capture_format()
702 chip->image[CS4231_REC_FORMAT] = cdfr); in snd_wss_capture_format()
703 snd_wss_out(chip, CS4231_ALT_FEATURE_1, in snd_wss_capture_format()
704 chip->image[CS4231_ALT_FEATURE_1] &= ~0x20); in snd_wss_capture_format()
707 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_wss_capture_format()
708 } else if (chip->hardware == WSS_HW_AD1845) { in snd_wss_capture_format()
720 spin_lock_irqsave(&chip->reg_lock, flags); in snd_wss_capture_format()
721 snd_wss_out(chip, CS4231_REC_FORMAT, (cdfr & 0xf0)); in snd_wss_capture_format()
722 snd_wss_out(chip, AD1845_UPR_FREQ_SEL, (rate >> 8) & 0xff); in snd_wss_capture_format()
723 snd_wss_out(chip, AD1845_LWR_FREQ_SEL, rate & 0xff); in snd_wss_capture_format()
725 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_wss_capture_format()
728 snd_wss_mce_up(chip); in snd_wss_capture_format()
729 spin_lock_irqsave(&chip->reg_lock, flags); in snd_wss_capture_format()
730 if (chip->hardware != WSS_HW_INTERWAVE && in snd_wss_capture_format()
731 !(chip->image[CS4231_IFACE_CTRL] & CS4231_PLAYBACK_ENABLE)) { in snd_wss_capture_format()
732 if (chip->single_dma) in snd_wss_capture_format()
733 snd_wss_out(chip, CS4231_PLAYBK_FORMAT, cdfr); in snd_wss_capture_format()
735 snd_wss_out(chip, CS4231_PLAYBK_FORMAT, in snd_wss_capture_format()
736 (chip->image[CS4231_PLAYBK_FORMAT] & 0xf0) | in snd_wss_capture_format()
738 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_wss_capture_format()
739 snd_wss_mce_down(chip); in snd_wss_capture_format()
740 snd_wss_mce_up(chip); in snd_wss_capture_format()
741 spin_lock_irqsave(&chip->reg_lock, flags); in snd_wss_capture_format()
743 if (chip->hardware & WSS_HW_AD1848_MASK) in snd_wss_capture_format()
744 snd_wss_out(chip, CS4231_PLAYBK_FORMAT, cdfr); in snd_wss_capture_format()
746 snd_wss_out(chip, CS4231_REC_FORMAT, cdfr); in snd_wss_capture_format()
747 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_wss_capture_format()
748 snd_wss_mce_down(chip); in snd_wss_capture_format()
750 mutex_unlock(&chip->mce_mutex); in snd_wss_capture_format()
759 struct snd_wss *chip = snd_timer_chip(timer); in snd_wss_timer_resolution() local
760 if (chip->hardware & WSS_HW_CS4236B_MASK) in snd_wss_timer_resolution()
763 return chip->image[CS4231_PLAYBK_FORMAT] & 1 ? 9969 : 9920; in snd_wss_timer_resolution()
770 struct snd_wss *chip = snd_timer_chip(timer); in snd_wss_timer_start() local
771 spin_lock_irqsave(&chip->reg_lock, flags); in snd_wss_timer_start()
773 if ((chip->image[CS4231_ALT_FEATURE_1] & CS4231_TIMER_ENABLE) == 0 || in snd_wss_timer_start()
774 (unsigned char)(ticks >> 8) != chip->image[CS4231_TIMER_HIGH] || in snd_wss_timer_start()
775 (unsigned char)ticks != chip->image[CS4231_TIMER_LOW]) { in snd_wss_timer_start()
776 chip->image[CS4231_TIMER_HIGH] = (unsigned char) (ticks >> 8); in snd_wss_timer_start()
777 snd_wss_out(chip, CS4231_TIMER_HIGH, in snd_wss_timer_start()
778 chip->image[CS4231_TIMER_HIGH]); in snd_wss_timer_start()
779 chip->image[CS4231_TIMER_LOW] = (unsigned char) ticks; in snd_wss_timer_start()
780 snd_wss_out(chip, CS4231_TIMER_LOW, in snd_wss_timer_start()
781 chip->image[CS4231_TIMER_LOW]); in snd_wss_timer_start()
782 snd_wss_out(chip, CS4231_ALT_FEATURE_1, in snd_wss_timer_start()
783 chip->image[CS4231_ALT_FEATURE_1] | in snd_wss_timer_start()
786 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_wss_timer_start()
793 struct snd_wss *chip = snd_timer_chip(timer); in snd_wss_timer_stop() local
794 spin_lock_irqsave(&chip->reg_lock, flags); in snd_wss_timer_stop()
795 chip->image[CS4231_ALT_FEATURE_1] &= ~CS4231_TIMER_ENABLE; in snd_wss_timer_stop()
796 snd_wss_out(chip, CS4231_ALT_FEATURE_1, in snd_wss_timer_stop()
797 chip->image[CS4231_ALT_FEATURE_1]); in snd_wss_timer_stop()
798 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_wss_timer_stop()
802 static void snd_wss_init(struct snd_wss *chip) in snd_wss_init() argument
806 snd_wss_calibrate_mute(chip, 1); in snd_wss_init()
807 snd_wss_mce_down(chip); in snd_wss_init()
812 snd_wss_mce_up(chip); in snd_wss_init()
813 spin_lock_irqsave(&chip->reg_lock, flags); in snd_wss_init()
814 chip->image[CS4231_IFACE_CTRL] &= ~(CS4231_PLAYBACK_ENABLE | in snd_wss_init()
819 chip->image[CS4231_IFACE_CTRL] |= CS4231_AUTOCALIB; in snd_wss_init()
820 snd_wss_out(chip, CS4231_IFACE_CTRL, chip->image[CS4231_IFACE_CTRL]); in snd_wss_init()
821 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_wss_init()
822 snd_wss_mce_down(chip); in snd_wss_init()
828 snd_wss_mce_up(chip); in snd_wss_init()
829 spin_lock_irqsave(&chip->reg_lock, flags); in snd_wss_init()
830 chip->image[CS4231_IFACE_CTRL] &= ~CS4231_AUTOCALIB; in snd_wss_init()
831 snd_wss_out(chip, CS4231_IFACE_CTRL, chip->image[CS4231_IFACE_CTRL]); in snd_wss_init()
832 snd_wss_out(chip, in snd_wss_init()
833 CS4231_ALT_FEATURE_1, chip->image[CS4231_ALT_FEATURE_1]); in snd_wss_init()
834 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_wss_init()
835 snd_wss_mce_down(chip); in snd_wss_init()
839 chip->image[CS4231_ALT_FEATURE_1]); in snd_wss_init()
842 spin_lock_irqsave(&chip->reg_lock, flags); in snd_wss_init()
843 snd_wss_out(chip, CS4231_ALT_FEATURE_2, in snd_wss_init()
844 chip->image[CS4231_ALT_FEATURE_2]); in snd_wss_init()
845 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_wss_init()
847 snd_wss_mce_up(chip); in snd_wss_init()
848 spin_lock_irqsave(&chip->reg_lock, flags); in snd_wss_init()
849 snd_wss_out(chip, CS4231_PLAYBK_FORMAT, in snd_wss_init()
850 chip->image[CS4231_PLAYBK_FORMAT]); in snd_wss_init()
851 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_wss_init()
852 snd_wss_mce_down(chip); in snd_wss_init()
858 snd_wss_mce_up(chip); in snd_wss_init()
859 spin_lock_irqsave(&chip->reg_lock, flags); in snd_wss_init()
860 if (!(chip->hardware & WSS_HW_AD1848_MASK)) in snd_wss_init()
861 snd_wss_out(chip, CS4231_REC_FORMAT, in snd_wss_init()
862 chip->image[CS4231_REC_FORMAT]); in snd_wss_init()
863 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_wss_init()
864 snd_wss_mce_down(chip); in snd_wss_init()
865 snd_wss_calibrate_mute(chip, 0); in snd_wss_init()
872 static int snd_wss_open(struct snd_wss *chip, unsigned int mode) in snd_wss_open() argument
876 mutex_lock(&chip->open_mutex); in snd_wss_open()
877 if ((chip->mode & mode) || in snd_wss_open()
878 ((chip->mode & WSS_MODE_OPEN) && chip->single_dma)) { in snd_wss_open()
879 mutex_unlock(&chip->open_mutex); in snd_wss_open()
882 if (chip->mode & WSS_MODE_OPEN) { in snd_wss_open()
883 chip->mode |= mode; in snd_wss_open()
884 mutex_unlock(&chip->open_mutex); in snd_wss_open()
888 spin_lock_irqsave(&chip->reg_lock, flags); in snd_wss_open()
889 if (!(chip->hardware & WSS_HW_AD1848_MASK)) { in snd_wss_open()
890 snd_wss_out(chip, CS4231_IRQ_STATUS, in snd_wss_open()
894 snd_wss_out(chip, CS4231_IRQ_STATUS, 0); in snd_wss_open()
896 wss_outb(chip, CS4231P(STATUS), 0); /* clear IRQ */ in snd_wss_open()
897 wss_outb(chip, CS4231P(STATUS), 0); /* clear IRQ */ in snd_wss_open()
898 chip->image[CS4231_PIN_CTRL] |= CS4231_IRQ_ENABLE; in snd_wss_open()
899 snd_wss_out(chip, CS4231_PIN_CTRL, chip->image[CS4231_PIN_CTRL]); in snd_wss_open()
900 if (!(chip->hardware & WSS_HW_AD1848_MASK)) { in snd_wss_open()
901 snd_wss_out(chip, CS4231_IRQ_STATUS, in snd_wss_open()
905 snd_wss_out(chip, CS4231_IRQ_STATUS, 0); in snd_wss_open()
907 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_wss_open()
909 chip->mode = mode; in snd_wss_open()
910 mutex_unlock(&chip->open_mutex); in snd_wss_open()
914 static void snd_wss_close(struct snd_wss *chip, unsigned int mode) in snd_wss_close() argument
918 mutex_lock(&chip->open_mutex); in snd_wss_close()
919 chip->mode &= ~mode; in snd_wss_close()
920 if (chip->mode & WSS_MODE_OPEN) { in snd_wss_close()
921 mutex_unlock(&chip->open_mutex); in snd_wss_close()
925 spin_lock_irqsave(&chip->reg_lock, flags); in snd_wss_close()
926 if (!(chip->hardware & WSS_HW_AD1848_MASK)) in snd_wss_close()
927 snd_wss_out(chip, CS4231_IRQ_STATUS, 0); in snd_wss_close()
928 wss_outb(chip, CS4231P(STATUS), 0); /* clear IRQ */ in snd_wss_close()
929 wss_outb(chip, CS4231P(STATUS), 0); /* clear IRQ */ in snd_wss_close()
930 chip->image[CS4231_PIN_CTRL] &= ~CS4231_IRQ_ENABLE; in snd_wss_close()
931 snd_wss_out(chip, CS4231_PIN_CTRL, chip->image[CS4231_PIN_CTRL]); in snd_wss_close()
935 if (chip->image[CS4231_IFACE_CTRL] & (CS4231_PLAYBACK_ENABLE | CS4231_PLAYBACK_PIO | in snd_wss_close()
937 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_wss_close()
938 snd_wss_mce_up(chip); in snd_wss_close()
939 spin_lock_irqsave(&chip->reg_lock, flags); in snd_wss_close()
940 chip->image[CS4231_IFACE_CTRL] &= ~(CS4231_PLAYBACK_ENABLE | CS4231_PLAYBACK_PIO | in snd_wss_close()
942 snd_wss_out(chip, CS4231_IFACE_CTRL, in snd_wss_close()
943 chip->image[CS4231_IFACE_CTRL]); in snd_wss_close()
944 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_wss_close()
945 snd_wss_mce_down(chip); in snd_wss_close()
946 spin_lock_irqsave(&chip->reg_lock, flags); in snd_wss_close()
950 if (!(chip->hardware & WSS_HW_AD1848_MASK)) in snd_wss_close()
951 snd_wss_out(chip, CS4231_IRQ_STATUS, 0); in snd_wss_close()
952 wss_outb(chip, CS4231P(STATUS), 0); /* clear IRQ */ in snd_wss_close()
953 wss_outb(chip, CS4231P(STATUS), 0); /* clear IRQ */ in snd_wss_close()
954 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_wss_close()
956 chip->mode = 0; in snd_wss_close()
957 mutex_unlock(&chip->open_mutex); in snd_wss_close()
966 struct snd_wss *chip = snd_timer_chip(timer); in snd_wss_timer_open() local
967 snd_wss_open(chip, WSS_MODE_TIMER); in snd_wss_timer_open()
973 struct snd_wss *chip = snd_timer_chip(timer); in snd_wss_timer_close() local
974 snd_wss_close(chip, WSS_MODE_TIMER); in snd_wss_timer_close()
997 struct snd_wss *chip = snd_pcm_substream_chip(substream); in snd_wss_playback_hw_params() local
1003 new_pdfr = snd_wss_get_format(chip, params_format(hw_params), in snd_wss_playback_hw_params()
1006 chip->set_playback_format(chip, hw_params, new_pdfr); in snd_wss_playback_hw_params()
1017 struct snd_wss *chip = snd_pcm_substream_chip(substream); in snd_wss_playback_prepare() local
1023 spin_lock_irqsave(&chip->reg_lock, flags); in snd_wss_playback_prepare()
1024 chip->p_dma_size = size; in snd_wss_playback_prepare()
1025 chip->image[CS4231_IFACE_CTRL] &= ~(CS4231_PLAYBACK_ENABLE | CS4231_PLAYBACK_PIO); in snd_wss_playback_prepare()
1026 snd_dma_program(chip->dma1, runtime->dma_addr, size, DMA_MODE_WRITE | DMA_AUTOINIT); in snd_wss_playback_prepare()
1027 count = snd_wss_get_count(chip->image[CS4231_PLAYBK_FORMAT], count) - 1; in snd_wss_playback_prepare()
1028 snd_wss_out(chip, CS4231_PLY_LWR_CNT, (unsigned char) count); in snd_wss_playback_prepare()
1029 snd_wss_out(chip, CS4231_PLY_UPR_CNT, (unsigned char) (count >> 8)); in snd_wss_playback_prepare()
1030 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_wss_playback_prepare()
1032 snd_wss_debug(chip); in snd_wss_playback_prepare()
1040 struct snd_wss *chip = snd_pcm_substream_chip(substream); in snd_wss_capture_hw_params() local
1046 new_cdfr = snd_wss_get_format(chip, params_format(hw_params), in snd_wss_capture_hw_params()
1049 chip->set_capture_format(chip, hw_params, new_cdfr); in snd_wss_capture_hw_params()
1060 struct snd_wss *chip = snd_pcm_substream_chip(substream); in snd_wss_capture_prepare() local
1066 spin_lock_irqsave(&chip->reg_lock, flags); in snd_wss_capture_prepare()
1067 chip->c_dma_size = size; in snd_wss_capture_prepare()
1068 chip->image[CS4231_IFACE_CTRL] &= ~(CS4231_RECORD_ENABLE | CS4231_RECORD_PIO); in snd_wss_capture_prepare()
1069 snd_dma_program(chip->dma2, runtime->dma_addr, size, DMA_MODE_READ | DMA_AUTOINIT); in snd_wss_capture_prepare()
1070 if (chip->hardware & WSS_HW_AD1848_MASK) in snd_wss_capture_prepare()
1071 count = snd_wss_get_count(chip->image[CS4231_PLAYBK_FORMAT], in snd_wss_capture_prepare()
1074 count = snd_wss_get_count(chip->image[CS4231_REC_FORMAT], in snd_wss_capture_prepare()
1077 if (chip->single_dma && chip->hardware != WSS_HW_INTERWAVE) { in snd_wss_capture_prepare()
1078 snd_wss_out(chip, CS4231_PLY_LWR_CNT, (unsigned char) count); in snd_wss_capture_prepare()
1079 snd_wss_out(chip, CS4231_PLY_UPR_CNT, in snd_wss_capture_prepare()
1082 snd_wss_out(chip, CS4231_REC_LWR_CNT, (unsigned char) count); in snd_wss_capture_prepare()
1083 snd_wss_out(chip, CS4231_REC_UPR_CNT, in snd_wss_capture_prepare()
1086 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_wss_capture_prepare()
1090 void snd_wss_overrange(struct snd_wss *chip) in snd_wss_overrange() argument
1095 spin_lock_irqsave(&chip->reg_lock, flags); in snd_wss_overrange()
1096 res = snd_wss_in(chip, CS4231_TEST_INIT); in snd_wss_overrange()
1097 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_wss_overrange()
1099 chip->capture_substream->runtime->overrange++; in snd_wss_overrange()
1105 struct snd_wss *chip = dev_id; in snd_wss_interrupt() local
1108 if (chip->hardware & WSS_HW_AD1848_MASK) in snd_wss_interrupt()
1112 status = snd_wss_in(chip, CS4231_IRQ_STATUS); in snd_wss_interrupt()
1114 if (chip->timer) in snd_wss_interrupt()
1115 snd_timer_interrupt(chip->timer, chip->timer->sticks); in snd_wss_interrupt()
1117 if (chip->single_dma && chip->hardware != WSS_HW_INTERWAVE) { in snd_wss_interrupt()
1119 if (chip->mode & WSS_MODE_PLAY) { in snd_wss_interrupt()
1120 if (chip->playback_substream) in snd_wss_interrupt()
1121 snd_pcm_period_elapsed(chip->playback_substream); in snd_wss_interrupt()
1123 if (chip->mode & WSS_MODE_RECORD) { in snd_wss_interrupt()
1124 if (chip->capture_substream) { in snd_wss_interrupt()
1125 snd_wss_overrange(chip); in snd_wss_interrupt()
1126 snd_pcm_period_elapsed(chip->capture_substream); in snd_wss_interrupt()
1132 if (chip->playback_substream) in snd_wss_interrupt()
1133 snd_pcm_period_elapsed(chip->playback_substream); in snd_wss_interrupt()
1136 if (chip->capture_substream) { in snd_wss_interrupt()
1137 snd_wss_overrange(chip); in snd_wss_interrupt()
1138 snd_pcm_period_elapsed(chip->capture_substream); in snd_wss_interrupt()
1143 spin_lock(&chip->reg_lock); in snd_wss_interrupt()
1145 if (chip->hardware & WSS_HW_AD1848_MASK) in snd_wss_interrupt()
1146 wss_outb(chip, CS4231P(STATUS), 0); in snd_wss_interrupt()
1148 snd_wss_out(chip, CS4231_IRQ_STATUS, status); in snd_wss_interrupt()
1149 spin_unlock(&chip->reg_lock); in snd_wss_interrupt()
1156 struct snd_wss *chip = snd_pcm_substream_chip(substream); in snd_wss_playback_pointer() local
1159 if (!(chip->image[CS4231_IFACE_CTRL] & CS4231_PLAYBACK_ENABLE)) in snd_wss_playback_pointer()
1161 ptr = snd_dma_pointer(chip->dma1, chip->p_dma_size); in snd_wss_playback_pointer()
1167 struct snd_wss *chip = snd_pcm_substream_chip(substream); in snd_wss_capture_pointer() local
1170 if (!(chip->image[CS4231_IFACE_CTRL] & CS4231_RECORD_ENABLE)) in snd_wss_capture_pointer()
1172 ptr = snd_dma_pointer(chip->dma2, chip->c_dma_size); in snd_wss_capture_pointer()
1180 static int snd_ad1848_probe(struct snd_wss *chip) in snd_ad1848_probe() argument
1189 while (wss_inb(chip, CS4231P(REGSEL)) & CS4231_INIT) { in snd_ad1848_probe()
1194 spin_lock_irqsave(&chip->reg_lock, flags); in snd_ad1848_probe()
1197 snd_wss_dout(chip, CS4231_MISC_INFO, 0); in snd_ad1848_probe()
1199 snd_wss_dout(chip, CS4231_RIGHT_INPUT, 0x45); /* 0x55 & ~0x10 */ in snd_ad1848_probe()
1200 r = snd_wss_in(chip, CS4231_RIGHT_INPUT); in snd_ad1848_probe()
1209 snd_wss_dout(chip, CS4231_LEFT_INPUT, 0xaa); in snd_ad1848_probe()
1210 r = snd_wss_in(chip, CS4231_LEFT_INPUT); in snd_ad1848_probe()
1219 wss_inb(chip, CS4231P(STATUS)); in snd_ad1848_probe()
1220 wss_outb(chip, CS4231P(STATUS), 0); in snd_ad1848_probe()
1223 if ((chip->hardware & WSS_HW_TYPE_MASK) != WSS_HW_DETECT) in snd_ad1848_probe()
1227 chip->hardware = hardware; in snd_ad1848_probe()
1231 r = snd_wss_in(chip, CS4231_MISC_INFO); in snd_ad1848_probe()
1234 snd_wss_dout(chip, CS4231_MISC_INFO, CS4231_MODE2); in snd_ad1848_probe()
1236 if (snd_wss_in(chip, i) != snd_wss_in(chip, 16 + i)) { in snd_ad1848_probe()
1244 snd_wss_dout(chip, CS4231_VERSION, 0); in snd_ad1848_probe()
1245 r = snd_wss_in(chip, CS4231_VERSION) & 0xe7; in snd_ad1848_probe()
1247 chip->hardware = WSS_HW_CMI8330; in snd_ad1848_probe()
1252 chip->hardware = WSS_HW_CS4248; in snd_ad1848_probe()
1254 chip->hardware = WSS_HW_AD1848; in snd_ad1848_probe()
1256 snd_wss_dout(chip, CS4231_MISC_INFO, 0); in snd_ad1848_probe()
1258 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_ad1848_probe()
1262 static int snd_wss_probe(struct snd_wss *chip) in snd_wss_probe() argument
1269 id = snd_ad1848_probe(chip); in snd_wss_probe()
1273 hw = chip->hardware; in snd_wss_probe()
1277 if (wss_inb(chip, CS4231P(REGSEL)) & CS4231_INIT) in snd_wss_probe()
1280 spin_lock_irqsave(&chip->reg_lock, flags); in snd_wss_probe()
1281 snd_wss_out(chip, CS4231_MISC_INFO, in snd_wss_probe()
1283 id = snd_wss_in(chip, CS4231_MISC_INFO) & 0x0f; in snd_wss_probe()
1284 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_wss_probe()
1289 snd_printdd("wss: port = 0x%lx, id = 0x%x\n", chip->port, id); in snd_wss_probe()
1293 rev = snd_wss_in(chip, CS4231_VERSION) & 0xe7; in snd_wss_probe()
1296 unsigned char tmp = snd_wss_in(chip, 23); in snd_wss_probe()
1297 snd_wss_out(chip, 23, ~tmp); in snd_wss_probe()
1298 if (snd_wss_in(chip, 23) != tmp) in snd_wss_probe()
1299 chip->hardware = WSS_HW_AD1845; in snd_wss_probe()
1301 chip->hardware = WSS_HW_CS4231; in snd_wss_probe()
1303 chip->hardware = WSS_HW_CS4231A; in snd_wss_probe()
1305 chip->hardware = WSS_HW_CS4232; in snd_wss_probe()
1307 chip->hardware = WSS_HW_CS4232A; in snd_wss_probe()
1309 chip->hardware = WSS_HW_CS4236; in snd_wss_probe()
1311 chip->hardware = WSS_HW_CS4236B; in snd_wss_probe()
1318 spin_lock_irqsave(&chip->reg_lock, flags); in snd_wss_probe()
1319 wss_inb(chip, CS4231P(STATUS)); /* clear any pendings IRQ */ in snd_wss_probe()
1320 wss_outb(chip, CS4231P(STATUS), 0); in snd_wss_probe()
1322 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_wss_probe()
1324 if (!(chip->hardware & WSS_HW_AD1848_MASK)) in snd_wss_probe()
1325 chip->image[CS4231_MISC_INFO] = CS4231_MODE2; in snd_wss_probe()
1326 switch (chip->hardware) { in snd_wss_probe()
1328 chip->image[CS4231_MISC_INFO] = CS4231_IW_MODE3; in snd_wss_probe()
1336 chip->image[CS4231_MISC_INFO] = CS4231_4236_MODE3; in snd_wss_probe()
1338 chip->hardware = WSS_HW_CS4236; in snd_wss_probe()
1342 chip->image[CS4231_IFACE_CTRL] = in snd_wss_probe()
1343 (chip->image[CS4231_IFACE_CTRL] & ~CS4231_SINGLE_DMA) | in snd_wss_probe()
1344 (chip->single_dma ? CS4231_SINGLE_DMA : 0); in snd_wss_probe()
1345 if (chip->hardware != WSS_HW_OPTI93X) { in snd_wss_probe()
1346 chip->image[CS4231_ALT_FEATURE_1] = 0x80; in snd_wss_probe()
1347 chip->image[CS4231_ALT_FEATURE_2] = in snd_wss_probe()
1348 chip->hardware == WSS_HW_INTERWAVE ? 0xc2 : 0x01; in snd_wss_probe()
1351 if (chip->hardware == WSS_HW_AD1845) in snd_wss_probe()
1352 chip->image[AD1845_PWR_DOWN] = 8; in snd_wss_probe()
1354 ptr = (unsigned char *) &chip->image; in snd_wss_probe()
1355 regnum = (chip->hardware & WSS_HW_AD1848_MASK) ? 16 : 32; in snd_wss_probe()
1356 snd_wss_mce_down(chip); in snd_wss_probe()
1357 spin_lock_irqsave(&chip->reg_lock, flags); in snd_wss_probe()
1359 snd_wss_out(chip, i, *ptr++); in snd_wss_probe()
1360 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_wss_probe()
1361 snd_wss_mce_up(chip); in snd_wss_probe()
1362 snd_wss_mce_down(chip); in snd_wss_probe()
1368 if (chip->hardware == WSS_HW_CS4236B) { in snd_wss_probe()
1369 rev = snd_cs4236_ext_in(chip, CS4236_VERSION); in snd_wss_probe()
1370 snd_cs4236_ext_out(chip, CS4236_VERSION, 0xff); in snd_wss_probe()
1371 id = snd_cs4236_ext_in(chip, CS4236_VERSION); in snd_wss_probe()
1372 snd_cs4236_ext_out(chip, CS4236_VERSION, rev); in snd_wss_probe()
1375 chip->hardware = WSS_HW_CS4235; in snd_wss_probe()
1393 chip->hardware = WSS_HW_CS4236B; in snd_wss_probe()
1402 chip->hardware = WSS_HW_CS4237B; in snd_wss_probe()
1416 chip->hardware = WSS_HW_CS4238B; in snd_wss_probe()
1429 chip->hardware = WSS_HW_CS4239; in snd_wss_probe()
1502 struct snd_wss *chip = snd_pcm_substream_chip(substream); in snd_wss_playback_open() local
1509 if (chip->hardware & WSS_HW_AD1848_MASK) in snd_wss_playback_open()
1514 if (chip->hardware == WSS_HW_INTERWAVE && chip->dma1 > 3) in snd_wss_playback_open()
1518 if (chip->hardware == WSS_HW_CS4235 || in snd_wss_playback_open()
1519 chip->hardware == WSS_HW_CS4239) in snd_wss_playback_open()
1522 snd_pcm_limit_isa_dma_size(chip->dma1, &runtime->hw.buffer_bytes_max); in snd_wss_playback_open()
1523 snd_pcm_limit_isa_dma_size(chip->dma1, &runtime->hw.period_bytes_max); in snd_wss_playback_open()
1525 if (chip->claim_dma) { in snd_wss_playback_open()
1526 if ((err = chip->claim_dma(chip, chip->dma_private_data, chip->dma1)) < 0) in snd_wss_playback_open()
1530 err = snd_wss_open(chip, WSS_MODE_PLAY); in snd_wss_playback_open()
1532 if (chip->release_dma) in snd_wss_playback_open()
1533 chip->release_dma(chip, chip->dma_private_data, chip->dma1); in snd_wss_playback_open()
1537 chip->playback_substream = substream; in snd_wss_playback_open()
1539 chip->rate_constraint(runtime); in snd_wss_playback_open()
1545 struct snd_wss *chip = snd_pcm_substream_chip(substream); in snd_wss_capture_open() local
1552 if (chip->hardware & WSS_HW_AD1848_MASK) in snd_wss_capture_open()
1557 if (chip->hardware == WSS_HW_CS4235 || in snd_wss_capture_open()
1558 chip->hardware == WSS_HW_CS4239 || in snd_wss_capture_open()
1559 chip->hardware == WSS_HW_OPTI93X) in snd_wss_capture_open()
1563 snd_pcm_limit_isa_dma_size(chip->dma2, &runtime->hw.buffer_bytes_max); in snd_wss_capture_open()
1564 snd_pcm_limit_isa_dma_size(chip->dma2, &runtime->hw.period_bytes_max); in snd_wss_capture_open()
1566 if (chip->claim_dma) { in snd_wss_capture_open()
1567 if ((err = chip->claim_dma(chip, chip->dma_private_data, chip->dma2)) < 0) in snd_wss_capture_open()
1571 err = snd_wss_open(chip, WSS_MODE_RECORD); in snd_wss_capture_open()
1573 if (chip->release_dma) in snd_wss_capture_open()
1574 chip->release_dma(chip, chip->dma_private_data, chip->dma2); in snd_wss_capture_open()
1578 chip->capture_substream = substream; in snd_wss_capture_open()
1580 chip->rate_constraint(runtime); in snd_wss_capture_open()
1586 struct snd_wss *chip = snd_pcm_substream_chip(substream); in snd_wss_playback_close() local
1588 chip->playback_substream = NULL; in snd_wss_playback_close()
1589 snd_wss_close(chip, WSS_MODE_PLAY); in snd_wss_playback_close()
1595 struct snd_wss *chip = snd_pcm_substream_chip(substream); in snd_wss_capture_close() local
1597 chip->capture_substream = NULL; in snd_wss_capture_close()
1598 snd_wss_close(chip, WSS_MODE_RECORD); in snd_wss_capture_close()
1602 static void snd_wss_thinkpad_twiddle(struct snd_wss *chip, int on) in snd_wss_thinkpad_twiddle() argument
1606 if (!chip->thinkpad_flag) in snd_wss_thinkpad_twiddle()
1625 static void snd_wss_suspend(struct snd_wss *chip) in snd_wss_suspend() argument
1630 snd_pcm_suspend_all(chip->pcm); in snd_wss_suspend()
1631 spin_lock_irqsave(&chip->reg_lock, flags); in snd_wss_suspend()
1633 chip->image[reg] = snd_wss_in(chip, reg); in snd_wss_suspend()
1634 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_wss_suspend()
1635 if (chip->thinkpad_flag) in snd_wss_suspend()
1636 snd_wss_thinkpad_twiddle(chip, 0); in snd_wss_suspend()
1640 static void snd_wss_resume(struct snd_wss *chip) in snd_wss_resume() argument
1646 if (chip->thinkpad_flag) in snd_wss_resume()
1647 snd_wss_thinkpad_twiddle(chip, 1); in snd_wss_resume()
1648 snd_wss_mce_up(chip); in snd_wss_resume()
1649 spin_lock_irqsave(&chip->reg_lock, flags); in snd_wss_resume()
1655 snd_wss_out(chip, reg, chip->image[reg]); in snd_wss_resume()
1660 if (chip->hardware == WSS_HW_OPL3SA2) in snd_wss_resume()
1661 snd_wss_out(chip, CS4231_PLAYBK_FORMAT, in snd_wss_resume()
1662 chip->image[CS4231_PLAYBK_FORMAT]); in snd_wss_resume()
1663 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_wss_resume()
1665 snd_wss_mce_down(chip); in snd_wss_resume()
1671 snd_wss_busy_wait(chip); in snd_wss_resume()
1672 spin_lock_irqsave(&chip->reg_lock, flags); in snd_wss_resume()
1673 chip->mce_bit &= ~CS4231_MCE; in snd_wss_resume()
1674 timeout = wss_inb(chip, CS4231P(REGSEL)); in snd_wss_resume()
1675 wss_outb(chip, CS4231P(REGSEL), chip->mce_bit | (timeout & 0x1f)); in snd_wss_resume()
1676 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_wss_resume()
1679 "- codec still busy\n", chip->port); in snd_wss_resume()
1681 !(chip->hardware & (WSS_HW_CS4231_MASK | WSS_HW_CS4232_MASK))) { in snd_wss_resume()
1684 snd_wss_busy_wait(chip); in snd_wss_resume()
1689 static int snd_wss_free(struct snd_wss *chip) in snd_wss_free() argument
1691 release_and_free_resource(chip->res_port); in snd_wss_free()
1692 release_and_free_resource(chip->res_cport); in snd_wss_free()
1693 if (chip->irq >= 0) { in snd_wss_free()
1694 disable_irq(chip->irq); in snd_wss_free()
1695 if (!(chip->hwshare & WSS_HWSHARE_IRQ)) in snd_wss_free()
1696 free_irq(chip->irq, (void *) chip); in snd_wss_free()
1698 if (!(chip->hwshare & WSS_HWSHARE_DMA1) && chip->dma1 >= 0) { in snd_wss_free()
1699 snd_dma_disable(chip->dma1); in snd_wss_free()
1700 free_dma(chip->dma1); in snd_wss_free()
1702 if (!(chip->hwshare & WSS_HWSHARE_DMA2) && in snd_wss_free()
1703 chip->dma2 >= 0 && chip->dma2 != chip->dma1) { in snd_wss_free()
1704 snd_dma_disable(chip->dma2); in snd_wss_free()
1705 free_dma(chip->dma2); in snd_wss_free()
1707 if (chip->timer) in snd_wss_free()
1708 snd_device_free(chip->card, chip->timer); in snd_wss_free()
1709 kfree(chip); in snd_wss_free()
1715 struct snd_wss *chip = device->device_data; in snd_wss_dev_free() local
1716 return snd_wss_free(chip); in snd_wss_dev_free()
1719 const char *snd_wss_chip_id(struct snd_wss *chip) in snd_wss_chip_id() argument
1721 switch (chip->hardware) { in snd_wss_chip_id()
1745 return chip->card->shortname; in snd_wss_chip_id()
1769 struct snd_wss *chip; in snd_wss_new() local
1772 chip = kzalloc(sizeof(*chip), GFP_KERNEL); in snd_wss_new()
1773 if (chip == NULL) in snd_wss_new()
1775 chip->hardware = hardware; in snd_wss_new()
1776 chip->hwshare = hwshare; in snd_wss_new()
1778 spin_lock_init(&chip->reg_lock); in snd_wss_new()
1779 mutex_init(&chip->mce_mutex); in snd_wss_new()
1780 mutex_init(&chip->open_mutex); in snd_wss_new()
1781 chip->card = card; in snd_wss_new()
1782 chip->rate_constraint = snd_wss_xrate; in snd_wss_new()
1783 chip->set_playback_format = snd_wss_playback_format; in snd_wss_new()
1784 chip->set_capture_format = snd_wss_capture_format; in snd_wss_new()
1785 if (chip->hardware == WSS_HW_OPTI93X) in snd_wss_new()
1786 memcpy(&chip->image, &snd_opti93x_original_image, in snd_wss_new()
1789 memcpy(&chip->image, &snd_wss_original_image, in snd_wss_new()
1791 if (chip->hardware & WSS_HW_AD1848_MASK) { in snd_wss_new()
1792 chip->image[CS4231_PIN_CTRL] = 0; in snd_wss_new()
1793 chip->image[CS4231_TEST_INIT] = 0; in snd_wss_new()
1796 *rchip = chip; in snd_wss_new()
1811 struct snd_wss *chip; in snd_wss_create() local
1814 err = snd_wss_new(card, hardware, hwshare, &chip); in snd_wss_create()
1818 chip->irq = -1; in snd_wss_create()
1819 chip->dma1 = -1; in snd_wss_create()
1820 chip->dma2 = -1; in snd_wss_create()
1822 chip->res_port = request_region(port, 4, "WSS"); in snd_wss_create()
1823 if (!chip->res_port) { in snd_wss_create()
1825 snd_wss_free(chip); in snd_wss_create()
1828 chip->port = port; in snd_wss_create()
1830 chip->res_cport = request_region(cport, 8, "CS4232 Control"); in snd_wss_create()
1831 if (!chip->res_cport) { in snd_wss_create()
1834 snd_wss_free(chip); in snd_wss_create()
1838 chip->cport = cport; in snd_wss_create()
1841 "WSS", (void *) chip)) { in snd_wss_create()
1843 snd_wss_free(chip); in snd_wss_create()
1846 chip->irq = irq; in snd_wss_create()
1849 snd_wss_free(chip); in snd_wss_create()
1852 chip->dma1 = dma1; in snd_wss_create()
1856 snd_wss_free(chip); in snd_wss_create()
1860 chip->single_dma = 1; in snd_wss_create()
1861 chip->dma2 = chip->dma1; in snd_wss_create()
1863 chip->dma2 = dma2; in snd_wss_create()
1866 chip->thinkpad_flag = 1; in snd_wss_create()
1867 chip->hardware = WSS_HW_DETECT; /* reset */ in snd_wss_create()
1868 snd_wss_thinkpad_twiddle(chip, 1); in snd_wss_create()
1872 if (snd_wss_probe(chip) < 0) { in snd_wss_create()
1873 snd_wss_free(chip); in snd_wss_create()
1876 snd_wss_init(chip); in snd_wss_create()
1879 if (chip->hardware & WSS_HW_CS4232_MASK) { in snd_wss_create()
1880 if (chip->res_cport == NULL) in snd_wss_create()
1887 err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); in snd_wss_create()
1889 snd_wss_free(chip); in snd_wss_create()
1895 chip->suspend = snd_wss_suspend; in snd_wss_create()
1896 chip->resume = snd_wss_resume; in snd_wss_create()
1899 *rchip = chip; in snd_wss_create()
1926 int snd_wss_pcm(struct snd_wss *chip, int device) in snd_wss_pcm() argument
1931 err = snd_pcm_new(chip->card, "WSS", device, 1, 1, &pcm); in snd_wss_pcm()
1939 pcm->private_data = chip; in snd_wss_pcm()
1941 if (chip->single_dma) in snd_wss_pcm()
1943 if (chip->hardware != WSS_HW_INTERWAVE) in snd_wss_pcm()
1945 strcpy(pcm->name, snd_wss_chip_id(chip)); in snd_wss_pcm()
1949 64*1024, chip->dma1 > 3 || chip->dma2 > 3 ? 128*1024 : 64*1024); in snd_wss_pcm()
1951 chip->pcm = pcm; in snd_wss_pcm()
1958 struct snd_wss *chip = timer->private_data; in snd_wss_timer_free() local
1959 chip->timer = NULL; in snd_wss_timer_free()
1962 int snd_wss_timer(struct snd_wss *chip, int device) in snd_wss_timer() argument
1971 tid.card = chip->card->number; in snd_wss_timer()
1974 if ((err = snd_timer_new(chip->card, "CS4231", &tid, &timer)) < 0) in snd_wss_timer()
1976 strcpy(timer->name, snd_wss_chip_id(chip)); in snd_wss_timer()
1977 timer->private_data = chip; in snd_wss_timer()
1980 chip->timer = timer; in snd_wss_timer()
2002 struct snd_wss *chip = snd_kcontrol_chip(kcontrol); in snd_wss_info_mux() local
2004 if (snd_BUG_ON(!chip->card)) in snd_wss_info_mux()
2006 if (!strcmp(chip->card->driver, "GUS MAX")) in snd_wss_info_mux()
2008 switch (chip->hardware) { in snd_wss_info_mux()
2023 struct snd_wss *chip = snd_kcontrol_chip(kcontrol); in snd_wss_get_mux() local
2026 spin_lock_irqsave(&chip->reg_lock, flags); in snd_wss_get_mux()
2027 ucontrol->value.enumerated.item[0] = (chip->image[CS4231_LEFT_INPUT] & CS4231_MIXS_ALL) >> 6; in snd_wss_get_mux()
2028 ucontrol->value.enumerated.item[1] = (chip->image[CS4231_RIGHT_INPUT] & CS4231_MIXS_ALL) >> 6; in snd_wss_get_mux()
2029 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_wss_get_mux()
2036 struct snd_wss *chip = snd_kcontrol_chip(kcontrol); in snd_wss_put_mux() local
2046 spin_lock_irqsave(&chip->reg_lock, flags); in snd_wss_put_mux()
2047 left = (chip->image[CS4231_LEFT_INPUT] & ~CS4231_MIXS_ALL) | left; in snd_wss_put_mux()
2048 right = (chip->image[CS4231_RIGHT_INPUT] & ~CS4231_MIXS_ALL) | right; in snd_wss_put_mux()
2049 change = left != chip->image[CS4231_LEFT_INPUT] || in snd_wss_put_mux()
2050 right != chip->image[CS4231_RIGHT_INPUT]; in snd_wss_put_mux()
2051 snd_wss_out(chip, CS4231_LEFT_INPUT, left); in snd_wss_put_mux()
2052 snd_wss_out(chip, CS4231_RIGHT_INPUT, right); in snd_wss_put_mux()
2053 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_wss_put_mux()
2073 struct snd_wss *chip = snd_kcontrol_chip(kcontrol); in snd_wss_get_single() local
2080 spin_lock_irqsave(&chip->reg_lock, flags); in snd_wss_get_single()
2081 ucontrol->value.integer.value[0] = (chip->image[reg] >> shift) & mask; in snd_wss_get_single()
2082 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_wss_get_single()
2092 struct snd_wss *chip = snd_kcontrol_chip(kcontrol); in snd_wss_put_single() local
2105 spin_lock_irqsave(&chip->reg_lock, flags); in snd_wss_put_single()
2106 val = (chip->image[reg] & ~(mask << shift)) | val; in snd_wss_put_single()
2107 change = val != chip->image[reg]; in snd_wss_put_single()
2108 snd_wss_out(chip, reg, val); in snd_wss_put_single()
2109 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_wss_put_single()
2130 struct snd_wss *chip = snd_kcontrol_chip(kcontrol); in snd_wss_get_double() local
2139 spin_lock_irqsave(&chip->reg_lock, flags); in snd_wss_get_double()
2140 ucontrol->value.integer.value[0] = (chip->image[left_reg] >> shift_left) & mask; in snd_wss_get_double()
2141 ucontrol->value.integer.value[1] = (chip->image[right_reg] >> shift_right) & mask; in snd_wss_get_double()
2142 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_wss_get_double()
2154 struct snd_wss *chip = snd_kcontrol_chip(kcontrol); in snd_wss_put_double() local
2173 spin_lock_irqsave(&chip->reg_lock, flags); in snd_wss_put_double()
2175 val1 = (chip->image[left_reg] & ~(mask << shift_left)) | val1; in snd_wss_put_double()
2176 val2 = (chip->image[right_reg] & ~(mask << shift_right)) | val2; in snd_wss_put_double()
2177 change = val1 != chip->image[left_reg] || in snd_wss_put_double()
2178 val2 != chip->image[right_reg]; in snd_wss_put_double()
2179 snd_wss_out(chip, left_reg, val1); in snd_wss_put_double()
2180 snd_wss_out(chip, right_reg, val2); in snd_wss_put_double()
2183 val1 = (chip->image[left_reg] & ~mask) | val1 | val2; in snd_wss_put_double()
2184 change = val1 != chip->image[left_reg]; in snd_wss_put_double()
2185 snd_wss_out(chip, left_reg, val1); in snd_wss_put_double()
2187 spin_unlock_irqrestore(&chip->reg_lock, flags); in snd_wss_put_double()
2244 int snd_wss_mixer(struct snd_wss *chip) in snd_wss_mixer() argument
2251 if (snd_BUG_ON(!chip || !chip->pcm)) in snd_wss_mixer()
2254 card = chip->card; in snd_wss_mixer()
2256 strcpy(card->mixername, chip->pcm->name); in snd_wss_mixer()
2259 if (chip->hardware & WSS_HW_AD1848_MASK) in snd_wss_mixer()
2262 else if (chip->hardware == WSS_HW_OPTI93X) in snd_wss_mixer()
2268 chip)); in snd_wss_mixer()