Lines Matching refs:chip

60 static void vx_pcm_read_per_bytes(struct vx_core *chip, struct snd_pcm_runtime *runtime,  in vx_pcm_read_per_bytes()  argument
65 *buf++ = vx_inb(chip, RXH); in vx_pcm_read_per_bytes()
70 *buf++ = vx_inb(chip, RXM); in vx_pcm_read_per_bytes()
75 *buf++ = vx_inb(chip, RXL); in vx_pcm_read_per_bytes()
88 static void vx_set_pcx_time(struct vx_core *chip, pcx_time_t *pc_time, in vx_set_pcx_time() argument
105 static int vx_set_differed_time(struct vx_core *chip, struct vx_rmh *rmh, in vx_set_differed_time() argument
116 vx_set_pcx_time(chip, &pipe->pcx_time, &rmh->Cmd[1]); in vx_set_differed_time()
139 static int vx_set_stream_format(struct vx_core *chip, struct vx_pipe *pipe, in vx_set_stream_format() argument
149 vx_set_differed_time(chip, &rmh, pipe); in vx_set_stream_format()
155 return vx_send_msg(chip, &rmh); in vx_set_stream_format()
166 static int vx_set_format(struct vx_core *chip, struct vx_pipe *pipe, in vx_set_format() argument
189 return vx_set_stream_format(chip, pipe, header); in vx_set_format()
195 static int vx_set_ibl(struct vx_core *chip, struct vx_ibl_info *info) in vx_set_ibl() argument
202 err = vx_send_msg(chip, &rmh); in vx_set_ibl()
225 static int vx_get_pipe_state(struct vx_core *chip, struct vx_pipe *pipe, int *state) in vx_get_pipe_state() argument
232 err = vx_send_msg(chip, &rmh); in vx_get_pipe_state()
250 static int vx_query_hbuffer_size(struct vx_core *chip, struct vx_pipe *pipe) in vx_query_hbuffer_size() argument
259 result = vx_send_msg(chip, &rmh); in vx_query_hbuffer_size()
274 static int vx_pipe_can_start(struct vx_core *chip, struct vx_pipe *pipe) in vx_pipe_can_start() argument
283 err = vx_send_msg(chip, &rmh); in vx_pipe_can_start()
295 static int vx_conf_pipe(struct vx_core *chip, struct vx_pipe *pipe) in vx_conf_pipe() argument
303 return vx_send_msg(chip, &rmh); in vx_conf_pipe()
309 static int vx_send_irqa(struct vx_core *chip) in vx_send_irqa() argument
314 return vx_send_msg(chip, &rmh); in vx_send_irqa()
334 static int vx_toggle_pipe(struct vx_core *chip, struct vx_pipe *pipe, int state) in vx_toggle_pipe() argument
339 if (vx_get_pipe_state(chip, pipe, &cur_state) < 0) in vx_toggle_pipe()
350 err = vx_pipe_can_start(chip, pipe); in vx_toggle_pipe()
360 if ((err = vx_conf_pipe(chip, pipe)) < 0) in vx_toggle_pipe()
363 if ((err = vx_send_irqa(chip)) < 0) in vx_toggle_pipe()
371 err = vx_get_pipe_state(chip, pipe, &cur_state); in vx_toggle_pipe()
387 static int vx_stop_pipe(struct vx_core *chip, struct vx_pipe *pipe) in vx_stop_pipe() argument
392 return vx_send_msg(chip, &rmh); in vx_stop_pipe()
405 static int vx_alloc_pipe(struct vx_core *chip, int capture, in vx_alloc_pipe() argument
421 data_mode = (chip->uer_bits & IEC958_AES0_NONAUDIO) != 0; in vx_alloc_pipe()
424 err = vx_send_msg(chip, &rmh); in vx_alloc_pipe()
434 vx_send_msg(chip, &rmh); in vx_alloc_pipe()
455 static int vx_free_pipe(struct vx_core *chip, struct vx_pipe *pipe) in vx_free_pipe() argument
461 vx_send_msg(chip, &rmh); in vx_free_pipe()
473 static int vx_start_stream(struct vx_core *chip, struct vx_pipe *pipe) in vx_start_stream() argument
479 vx_set_differed_time(chip, &rmh, pipe); in vx_start_stream()
480 return vx_send_msg(chip, &rmh); in vx_start_stream()
489 static int vx_stop_stream(struct vx_core *chip, struct vx_pipe *pipe) in vx_stop_stream() argument
495 return vx_send_msg(chip, &rmh); in vx_stop_stream()
529 struct vx_core *chip = snd_pcm_substream_chip(subs); in vx_pcm_playback_open() local
534 if (chip->chip_status & VX_STAT_IS_STALE) in vx_pcm_playback_open()
538 if (snd_BUG_ON(audio >= chip->audio_outs)) in vx_pcm_playback_open()
542 pipe = chip->playback_pipes[audio]; in vx_pcm_playback_open()
545 err = vx_alloc_pipe(chip, 0, audio, 2, &pipe); /* stereo playback */ in vx_pcm_playback_open()
548 chip->playback_pipes[audio] = pipe; in vx_pcm_playback_open()
554 chip->playback_pipes[audio] = pipe; in vx_pcm_playback_open()
557 runtime->hw.period_bytes_min = chip->ibl.size; in vx_pcm_playback_open()
572 struct vx_core *chip = snd_pcm_substream_chip(subs); in vx_pcm_playback_close() local
581 chip->playback_pipes[pipe->number] = NULL; in vx_pcm_playback_close()
582 vx_free_pipe(chip, pipe); in vx_pcm_playback_close()
596 static int vx_notify_end_of_buffer(struct vx_core *chip, struct vx_pipe *pipe) in vx_notify_end_of_buffer() argument
602 vx_send_rih_nolock(chip, IRQ_PAUSE_START_CONNECT); in vx_notify_end_of_buffer()
605 err = vx_send_msg_nolock(chip, &rmh); in vx_notify_end_of_buffer()
609 vx_send_rih_nolock(chip, IRQ_PAUSE_START_CONNECT); in vx_notify_end_of_buffer()
624 static int vx_pcm_playback_transfer_chunk(struct vx_core *chip, in vx_pcm_playback_transfer_chunk() argument
630 space = vx_query_hbuffer_size(chip, pipe); in vx_pcm_playback_transfer_chunk()
633 vx_send_rih(chip, IRQ_CONNECT_STREAM_NEXT); in vx_pcm_playback_transfer_chunk()
638 vx_send_rih(chip, IRQ_CONNECT_STREAM_NEXT); in vx_pcm_playback_transfer_chunk()
646 mutex_lock(&chip->lock); in vx_pcm_playback_transfer_chunk()
647 vx_pseudo_dma_write(chip, runtime, pipe, size); in vx_pcm_playback_transfer_chunk()
648 err = vx_notify_end_of_buffer(chip, pipe); in vx_pcm_playback_transfer_chunk()
650 vx_send_rih_nolock(chip, IRQ_CONNECT_STREAM_NEXT); in vx_pcm_playback_transfer_chunk()
651 mutex_unlock(&chip->lock); in vx_pcm_playback_transfer_chunk()
662 static int vx_update_pipe_position(struct vx_core *chip, in vx_update_pipe_position() argument
672 err = vx_send_msg(chip, &rmh); in vx_update_pipe_position()
690 static void vx_pcm_playback_transfer(struct vx_core *chip, in vx_pcm_playback_transfer() argument
697 if (! pipe->prepared || (chip->chip_status & VX_STAT_IS_STALE)) in vx_pcm_playback_transfer()
700 if ((err = vx_pcm_playback_transfer_chunk(chip, runtime, pipe, in vx_pcm_playback_transfer()
701 chip->ibl.size)) < 0) in vx_pcm_playback_transfer()
710 static void vx_pcm_playback_update(struct vx_core *chip, in vx_pcm_playback_update() argument
717 if (pipe->running && ! (chip->chip_status & VX_STAT_IS_STALE)) { in vx_pcm_playback_update()
718 if ((err = vx_update_pipe_position(chip, runtime, pipe)) < 0) in vx_pcm_playback_update()
732 struct vx_core *chip = snd_pcm_substream_chip(subs); in vx_pcm_trigger() local
736 if (chip->chip_status & VX_STAT_IS_STALE) in vx_pcm_trigger()
743 vx_pcm_playback_transfer(chip, subs, pipe, 2); in vx_pcm_trigger()
744 err = vx_start_stream(chip, pipe); in vx_pcm_trigger()
749 err = vx_toggle_pipe(chip, pipe, 1); in vx_pcm_trigger()
752 vx_stop_stream(chip, pipe); in vx_pcm_trigger()
755 chip->pcm_running++; in vx_pcm_trigger()
760 vx_toggle_pipe(chip, pipe, 0); in vx_pcm_trigger()
761 vx_stop_pipe(chip, pipe); in vx_pcm_trigger()
762 vx_stop_stream(chip, pipe); in vx_pcm_trigger()
763 chip->pcm_running--; in vx_pcm_trigger()
767 if ((err = vx_toggle_pipe(chip, pipe, 0)) < 0) in vx_pcm_trigger()
771 if ((err = vx_toggle_pipe(chip, pipe, 1)) < 0) in vx_pcm_trigger()
813 struct vx_core *chip = snd_pcm_substream_chip(subs); in vx_pcm_prepare() local
819 if (chip->chip_status & VX_STAT_IS_STALE) in vx_pcm_prepare()
822 data_mode = (chip->uer_bits & IEC958_AES0_NONAUDIO) != 0; in vx_pcm_prepare()
830 if ((err = vx_send_msg(chip, &rmh)) < 0) in vx_pcm_prepare()
836 if ((err = vx_send_msg(chip, &rmh)) < 0) in vx_pcm_prepare()
841 if (chip->pcm_running && chip->freq != runtime->rate) { in vx_pcm_prepare()
843 "from the current %d\n", runtime->rate, chip->freq); in vx_pcm_prepare()
846 vx_set_clock(chip, runtime->rate); in vx_pcm_prepare()
848 if ((err = vx_set_format(chip, pipe, runtime)) < 0) in vx_pcm_prepare()
851 if (vx_is_pcmcia(chip)) { in vx_pcm_prepare()
862 vx_update_pipe_position(chip, runtime, pipe); in vx_pcm_prepare()
920 struct vx_core *chip = snd_pcm_substream_chip(subs); in vx_pcm_capture_open() local
926 if (chip->chip_status & VX_STAT_IS_STALE) in vx_pcm_capture_open()
930 if (snd_BUG_ON(audio >= chip->audio_ins)) in vx_pcm_capture_open()
932 err = vx_alloc_pipe(chip, 1, audio, 2, &pipe); in vx_pcm_capture_open()
936 chip->capture_pipes[audio] = pipe; in vx_pcm_capture_open()
939 if (chip->audio_monitor_active[audio]) { in vx_pcm_capture_open()
940 pipe_out_monitoring = chip->playback_pipes[audio]; in vx_pcm_capture_open()
943 err = vx_alloc_pipe(chip, 0, audio, 2, &pipe_out_monitoring); in vx_pcm_capture_open()
946 chip->playback_pipes[audio] = pipe_out_monitoring; in vx_pcm_capture_open()
953 vx_set_monitor_level(chip, audio, chip->audio_monitor[audio], in vx_pcm_capture_open()
954 chip->audio_monitor_active[audio]); in vx_pcm_capture_open()
956 vx_set_monitor_level(chip, audio+1, chip->audio_monitor[audio+1], in vx_pcm_capture_open()
957 chip->audio_monitor_active[audio+1]); in vx_pcm_capture_open()
963 runtime->hw.period_bytes_min = chip->ibl.size; in vx_pcm_capture_open()
978 struct vx_core *chip = snd_pcm_substream_chip(subs); in vx_pcm_capture_close() local
985 chip->capture_pipes[pipe->number] = NULL; in vx_pcm_capture_close()
995 vx_free_pipe(chip, pipe_out_monitoring); in vx_pcm_capture_close()
996 chip->playback_pipes[pipe->number] = NULL; in vx_pcm_capture_close()
1001 vx_free_pipe(chip, pipe); in vx_pcm_capture_close()
1012 static void vx_pcm_capture_update(struct vx_core *chip, struct snd_pcm_substream *subs, in vx_pcm_capture_update() argument
1018 if (! pipe->prepared || (chip->chip_status & VX_STAT_IS_STALE)) in vx_pcm_capture_update()
1025 space = vx_query_hbuffer_size(chip, pipe); in vx_pcm_capture_update()
1042 if (vx_wait_for_rx_full(chip) < 0) in vx_pcm_capture_update()
1044 vx_pcm_read_per_bytes(chip, runtime, pipe); in vx_pcm_capture_update()
1051 vx_pseudo_dma_read(chip, runtime, pipe, space); in vx_pcm_capture_update()
1056 if (vx_wait_for_rx_full(chip) < 0) in vx_pcm_capture_update()
1058 vx_pcm_read_per_bytes(chip, runtime, pipe); in vx_pcm_capture_update()
1062 vx_send_rih(chip, IRQ_CONNECT_STREAM_NEXT); in vx_pcm_capture_update()
1066 vx_pcm_read_per_bytes(chip, runtime, pipe); in vx_pcm_capture_update()
1079 vx_send_rih(chip, IRQ_CONNECT_STREAM_NEXT); in vx_pcm_capture_update()
1113 void vx_pcm_update_intr(struct vx_core *chip, unsigned int events) in vx_pcm_update_intr() argument
1121 vx_init_rmh(&chip->irq_rmh, CMD_ASYNC); in vx_pcm_update_intr()
1123 chip->irq_rmh.Cmd[0] |= 0x00000001; /* SEL_ASYNC_EVENTS */ in vx_pcm_update_intr()
1125 chip->irq_rmh.Cmd[0] |= 0x00000002; /* SEL_END_OF_BUF_EVENTS */ in vx_pcm_update_intr()
1127 if (vx_send_msg(chip, &chip->irq_rmh) < 0) { in vx_pcm_update_intr()
1133 while (i < chip->irq_rmh.LgStat) { in vx_pcm_update_intr()
1135 p = chip->irq_rmh.Stat[i] & MASK_FIRST_FIELD; in vx_pcm_update_intr()
1136 capture = (chip->irq_rmh.Stat[i] & 0x400000) ? 1 : 0; in vx_pcm_update_intr()
1137 eob = (chip->irq_rmh.Stat[i] & 0x800000) ? 1 : 0; in vx_pcm_update_intr()
1144 buf = chip->irq_rmh.Stat[i]; in vx_pcm_update_intr()
1149 if (snd_BUG_ON(p < 0 || p >= chip->audio_outs)) in vx_pcm_update_intr()
1151 pipe = chip->playback_pipes[p]; in vx_pcm_update_intr()
1153 vx_pcm_playback_update(chip, pipe->substream, pipe); in vx_pcm_update_intr()
1154 vx_pcm_playback_transfer(chip, pipe->substream, pipe, buf); in vx_pcm_update_intr()
1160 for (i = 0; i < chip->audio_ins; i++) { in vx_pcm_update_intr()
1161 pipe = chip->capture_pipes[i]; in vx_pcm_update_intr()
1163 vx_pcm_capture_update(chip, pipe->substream, pipe); in vx_pcm_update_intr()
1171 static int vx_init_audio_io(struct vx_core *chip) in vx_init_audio_io() argument
1177 if (vx_send_msg(chip, &rmh) < 0) { in vx_init_audio_io()
1182 chip->audio_outs = rmh.Stat[0] & MASK_FIRST_FIELD; in vx_init_audio_io()
1183 chip->audio_ins = (rmh.Stat[0] >> (FIELD_SIZE*2)) & MASK_FIRST_FIELD; in vx_init_audio_io()
1184 chip->audio_info = rmh.Stat[1]; in vx_init_audio_io()
1187 chip->playback_pipes = kcalloc(chip->audio_outs, sizeof(struct vx_pipe *), GFP_KERNEL); in vx_init_audio_io()
1188 if (!chip->playback_pipes) in vx_init_audio_io()
1190 chip->capture_pipes = kcalloc(chip->audio_ins, sizeof(struct vx_pipe *), GFP_KERNEL); in vx_init_audio_io()
1191 if (!chip->capture_pipes) { in vx_init_audio_io()
1192 kfree(chip->playback_pipes); in vx_init_audio_io()
1196 preferred = chip->ibl.size; in vx_init_audio_io()
1197 chip->ibl.size = 0; in vx_init_audio_io()
1198 vx_set_ibl(chip, &chip->ibl); /* query the info */ in vx_init_audio_io()
1200 chip->ibl.size = ((preferred + chip->ibl.granularity - 1) / in vx_init_audio_io()
1201 chip->ibl.granularity) * chip->ibl.granularity; in vx_init_audio_io()
1202 if (chip->ibl.size > chip->ibl.max_size) in vx_init_audio_io()
1203 chip->ibl.size = chip->ibl.max_size; in vx_init_audio_io()
1205 chip->ibl.size = chip->ibl.min_size; /* set to the minimum */ in vx_init_audio_io()
1206 vx_set_ibl(chip, &chip->ibl); in vx_init_audio_io()
1217 struct vx_core *chip = pcm->private_data; in snd_vx_pcm_free() local
1218 chip->pcm[pcm->device] = NULL; in snd_vx_pcm_free()
1219 kfree(chip->playback_pipes); in snd_vx_pcm_free()
1220 chip->playback_pipes = NULL; in snd_vx_pcm_free()
1221 kfree(chip->capture_pipes); in snd_vx_pcm_free()
1222 chip->capture_pipes = NULL; in snd_vx_pcm_free()
1228 int snd_vx_pcm_new(struct vx_core *chip) in snd_vx_pcm_new() argument
1234 if ((err = vx_init_audio_io(chip)) < 0) in snd_vx_pcm_new()
1237 for (i = 0; i < chip->hw->num_codecs; i++) { in snd_vx_pcm_new()
1239 outs = chip->audio_outs > i * 2 ? 1 : 0; in snd_vx_pcm_new()
1240 ins = chip->audio_ins > i * 2 ? 1 : 0; in snd_vx_pcm_new()
1243 err = snd_pcm_new(chip->card, "VX PCM", i, in snd_vx_pcm_new()
1252 pcm->private_data = chip; in snd_vx_pcm_new()
1256 strcpy(pcm->name, chip->card->shortname); in snd_vx_pcm_new()
1257 chip->pcm[i] = pcm; in snd_vx_pcm_new()