Lines Matching refs:i2sdev
19 static inline void get_pcm_info(struct i2sbus_dev *i2sdev, int in, in get_pcm_info() argument
24 *pi = &i2sdev->in; in get_pcm_info()
26 *other = &i2sdev->out; in get_pcm_info()
29 *pi = &i2sdev->out; in get_pcm_info()
31 *other = &i2sdev->in; in get_pcm_info()
73 static int i2sbus_pcm_open(struct i2sbus_dev *i2sdev, int in) in i2sbus_pcm_open() argument
87 mutex_lock(&i2sdev->lock); in i2sbus_pcm_open()
89 get_pcm_info(i2sdev, in, &pi, &other); in i2sbus_pcm_open()
92 sdev = &i2sdev->sound; in i2sbus_pcm_open()
182 hw->formats &= pcm_format_to_bits(i2sdev->format); in i2sbus_pcm_open()
184 hw->rate_min = i2sdev->rate; in i2sbus_pcm_open()
185 hw->rate_max = i2sdev->rate; in i2sbus_pcm_open()
224 mutex_unlock(&i2sdev->lock); in i2sbus_pcm_open()
230 static int i2sbus_pcm_close(struct i2sbus_dev *i2sdev, int in) in i2sbus_pcm_close() argument
236 mutex_lock(&i2sdev->lock); in i2sbus_pcm_close()
238 get_pcm_info(i2sdev, in, &pi, NULL); in i2sbus_pcm_close()
240 list_for_each_entry(cii, &i2sdev->sound.codec_list, list) { in i2sbus_pcm_close()
250 mutex_unlock(&i2sdev->lock); in i2sbus_pcm_close()
254 static void i2sbus_wait_for_stop(struct i2sbus_dev *i2sdev, in i2sbus_wait_for_stop() argument
261 spin_lock_irqsave(&i2sdev->low_lock, flags); in i2sbus_wait_for_stop()
265 spin_unlock_irqrestore(&i2sdev->low_lock, flags); in i2sbus_wait_for_stop()
267 spin_lock_irqsave(&i2sdev->low_lock, flags); in i2sbus_wait_for_stop()
283 spin_unlock_irqrestore(&i2sdev->low_lock, flags); in i2sbus_wait_for_stop()
287 void i2sbus_wait_for_stop_both(struct i2sbus_dev *i2sdev) in i2sbus_wait_for_stop_both() argument
291 get_pcm_info(i2sdev, 0, &pi, NULL); in i2sbus_wait_for_stop_both()
292 i2sbus_wait_for_stop(i2sdev, pi); in i2sbus_wait_for_stop_both()
293 get_pcm_info(i2sdev, 1, &pi, NULL); in i2sbus_wait_for_stop_both()
294 i2sbus_wait_for_stop(i2sdev, pi); in i2sbus_wait_for_stop_both()
306 struct i2sbus_dev *i2sdev = snd_pcm_substream_chip(substream); in i2sbus_hw_free() local
309 get_pcm_info(i2sdev, in, &pi, NULL); in i2sbus_hw_free()
311 i2sbus_wait_for_stop(i2sdev, pi); in i2sbus_hw_free()
326 static int i2sbus_pcm_prepare(struct i2sbus_dev *i2sdev, int in) in i2sbus_pcm_prepare() argument
345 mutex_lock(&i2sdev->lock); in i2sbus_pcm_prepare()
347 get_pcm_info(i2sdev, in, &pi, &other); in i2sbus_pcm_prepare()
354 i2sbus_wait_for_stop(i2sdev, pi); in i2sbus_pcm_prepare()
364 ((i2sdev->format != runtime->format) in i2sbus_pcm_prepare()
365 || (i2sdev->rate != runtime->rate))) { in i2sbus_pcm_prepare()
370 i2sdev->format = runtime->format; in i2sbus_pcm_prepare()
371 i2sdev->rate = runtime->rate; in i2sbus_pcm_prepare()
420 list_for_each_entry(cii, &i2sdev->sound.codec_list, list) { in i2sbus_pcm_prepare()
442 list_for_each_entry(cii, &i2sdev->sound.codec_list, list) { in i2sbus_pcm_prepare()
465 list_for_each_entry(cii, &i2sdev->sound.codec_list, list) { in i2sbus_pcm_prepare()
486 if (in_le32(&i2sdev->intfregs->serial_format) == sfr in i2sbus_pcm_prepare()
487 && in_le32(&i2sdev->intfregs->data_word_sizes) == dws) in i2sbus_pcm_prepare()
492 list_for_each_entry(cii, &i2sdev->sound.codec_list, list) in i2sbus_pcm_prepare()
496 i2sbus_control_enable(i2sdev->control, i2sdev); in i2sbus_pcm_prepare()
497 i2sbus_control_cell(i2sdev->control, i2sdev, 1); in i2sbus_pcm_prepare()
499 out_le32(&i2sdev->intfregs->intr_ctl, I2S_PENDING_CLOCKS_STOPPED); in i2sbus_pcm_prepare()
501 i2sbus_control_clock(i2sdev->control, i2sdev, 0); in i2sbus_pcm_prepare()
508 !(in_le32(&i2sdev->intfregs->intr_ctl) & I2S_PENDING_CLOCKS_STOPPED)) { in i2sbus_pcm_prepare()
511 out_le32(&i2sdev->intfregs->intr_ctl, I2S_PENDING_CLOCKS_STOPPED); in i2sbus_pcm_prepare()
514 out_le32(&i2sdev->intfregs->serial_format, sfr); in i2sbus_pcm_prepare()
515 out_le32(&i2sdev->intfregs->data_word_sizes, dws); in i2sbus_pcm_prepare()
517 i2sbus_control_enable(i2sdev->control, i2sdev); in i2sbus_pcm_prepare()
518 i2sbus_control_cell(i2sdev->control, i2sdev, 1); in i2sbus_pcm_prepare()
519 i2sbus_control_clock(i2sdev->control, i2sdev, 1); in i2sbus_pcm_prepare()
522 list_for_each_entry(cii, &i2sdev->sound.codec_list, list) in i2sbus_pcm_prepare()
527 mutex_unlock(&i2sdev->lock); in i2sbus_pcm_prepare()
532 void i2sbus_pcm_prepare_both(struct i2sbus_dev *i2sdev) in i2sbus_pcm_prepare_both() argument
534 i2sbus_pcm_prepare(i2sdev, 0); in i2sbus_pcm_prepare_both()
535 i2sbus_pcm_prepare(i2sdev, 1); in i2sbus_pcm_prepare_both()
539 static int i2sbus_pcm_trigger(struct i2sbus_dev *i2sdev, int in, int cmd) in i2sbus_pcm_trigger() argument
546 spin_lock_irqsave(&i2sdev->low_lock, flags); in i2sbus_pcm_trigger()
548 get_pcm_info(i2sdev, in, &pi, NULL); in i2sbus_pcm_trigger()
557 list_for_each_entry(cii, &i2sdev->sound.codec_list, list) in i2sbus_pcm_trigger()
586 pi->frame_count = in_le32(&i2sdev->intfregs->frame_count); in i2sbus_pcm_trigger()
606 list_for_each_entry(cii, &i2sdev->sound.codec_list, list) in i2sbus_pcm_trigger()
616 spin_unlock_irqrestore(&i2sdev->low_lock, flags); in i2sbus_pcm_trigger()
620 static snd_pcm_uframes_t i2sbus_pcm_pointer(struct i2sbus_dev *i2sdev, int in) in i2sbus_pcm_pointer() argument
625 get_pcm_info(i2sdev, in, &pi, NULL); in i2sbus_pcm_pointer()
627 fc = in_le32(&i2sdev->intfregs->frame_count); in i2sbus_pcm_pointer()
635 static inline void handle_interrupt(struct i2sbus_dev *i2sdev, int in) in handle_interrupt() argument
644 spin_lock(&i2sdev->low_lock); in handle_interrupt()
645 get_pcm_info(i2sdev, in, &pi, NULL); in handle_interrupt()
671 fc = in_le32(&i2sdev->intfregs->frame_count); in handle_interrupt()
701 spin_unlock(&i2sdev->low_lock); in handle_interrupt()
707 spin_unlock(&i2sdev->low_lock); in handle_interrupt()
724 struct i2sbus_dev *i2sdev = snd_pcm_substream_chip(substream); in i2sbus_playback_open() local
726 if (!i2sdev) in i2sbus_playback_open()
728 i2sdev->out.substream = substream; in i2sbus_playback_open()
729 return i2sbus_pcm_open(i2sdev, 0); in i2sbus_playback_open()
734 struct i2sbus_dev *i2sdev = snd_pcm_substream_chip(substream); in i2sbus_playback_close() local
737 if (!i2sdev) in i2sbus_playback_close()
739 if (i2sdev->out.substream != substream) in i2sbus_playback_close()
741 err = i2sbus_pcm_close(i2sdev, 0); in i2sbus_playback_close()
743 i2sdev->out.substream = NULL; in i2sbus_playback_close()
749 struct i2sbus_dev *i2sdev = snd_pcm_substream_chip(substream); in i2sbus_playback_prepare() local
751 if (!i2sdev) in i2sbus_playback_prepare()
753 if (i2sdev->out.substream != substream) in i2sbus_playback_prepare()
755 return i2sbus_pcm_prepare(i2sdev, 0); in i2sbus_playback_prepare()
760 struct i2sbus_dev *i2sdev = snd_pcm_substream_chip(substream); in i2sbus_playback_trigger() local
762 if (!i2sdev) in i2sbus_playback_trigger()
764 if (i2sdev->out.substream != substream) in i2sbus_playback_trigger()
766 return i2sbus_pcm_trigger(i2sdev, 0, cmd); in i2sbus_playback_trigger()
772 struct i2sbus_dev *i2sdev = snd_pcm_substream_chip(substream); in i2sbus_playback_pointer() local
774 if (!i2sdev) in i2sbus_playback_pointer()
776 if (i2sdev->out.substream != substream) in i2sbus_playback_pointer()
778 return i2sbus_pcm_pointer(i2sdev, 0); in i2sbus_playback_pointer()
794 struct i2sbus_dev *i2sdev = snd_pcm_substream_chip(substream); in i2sbus_record_open() local
796 if (!i2sdev) in i2sbus_record_open()
798 i2sdev->in.substream = substream; in i2sbus_record_open()
799 return i2sbus_pcm_open(i2sdev, 1); in i2sbus_record_open()
804 struct i2sbus_dev *i2sdev = snd_pcm_substream_chip(substream); in i2sbus_record_close() local
807 if (!i2sdev) in i2sbus_record_close()
809 if (i2sdev->in.substream != substream) in i2sbus_record_close()
811 err = i2sbus_pcm_close(i2sdev, 1); in i2sbus_record_close()
813 i2sdev->in.substream = NULL; in i2sbus_record_close()
819 struct i2sbus_dev *i2sdev = snd_pcm_substream_chip(substream); in i2sbus_record_prepare() local
821 if (!i2sdev) in i2sbus_record_prepare()
823 if (i2sdev->in.substream != substream) in i2sbus_record_prepare()
825 return i2sbus_pcm_prepare(i2sdev, 1); in i2sbus_record_prepare()
830 struct i2sbus_dev *i2sdev = snd_pcm_substream_chip(substream); in i2sbus_record_trigger() local
832 if (!i2sdev) in i2sbus_record_trigger()
834 if (i2sdev->in.substream != substream) in i2sbus_record_trigger()
836 return i2sbus_pcm_trigger(i2sdev, 1, cmd); in i2sbus_record_trigger()
842 struct i2sbus_dev *i2sdev = snd_pcm_substream_chip(substream); in i2sbus_record_pointer() local
844 if (!i2sdev) in i2sbus_record_pointer()
846 if (i2sdev->in.substream != substream) in i2sbus_record_pointer()
848 return i2sbus_pcm_pointer(i2sdev, 1); in i2sbus_record_pointer()
864 struct i2sbus_dev *i2sdev = snd_pcm_chip(pcm); in i2sbus_private_free() local
867 i2sdev->sound.pcm = NULL; in i2sbus_private_free()
868 i2sdev->out.created = 0; in i2sbus_private_free()
869 i2sdev->in.created = 0; in i2sbus_private_free()
870 list_for_each_entry_safe(p, tmp, &i2sdev->sound.codec_list, list) { in i2sbus_private_free()
876 soundbus_dev_put(&i2sdev->sound); in i2sbus_private_free()
886 struct i2sbus_dev *i2sdev = soundbus_dev_to_i2sbus_dev(dev); in i2sbus_attach_codec() local
977 if (!i2sdev->out.created && out) { in i2sbus_attach_codec()
992 i2sdev->out.created = 1; in i2sbus_attach_codec()
995 if (!i2sdev->in.created && in) { in i2sbus_attach_codec()
1009 i2sdev->in.created = 1; in i2sbus_attach_codec()
1026 dev->pcm->private_data = i2sdev; in i2sbus_attach_codec()
1032 snd_dma_pci_data(macio_get_pci_dev(i2sdev->macio)), in i2sbus_attach_codec()