Lines Matching refs:itv

41 static void ivtv_pcm_work_handler(struct ivtv *itv)  in ivtv_pcm_work_handler()  argument
43 struct ivtv_stream *s = &itv->streams[IVTV_ENC_STREAM_TYPE_PCM]; in ivtv_pcm_work_handler()
62 itv->pcm_announce_callback(itv->alsa, in ivtv_pcm_work_handler()
70 static void ivtv_pio_work_handler(struct ivtv *itv) in ivtv_pio_work_handler() argument
72 struct ivtv_stream *s = &itv->streams[itv->cur_pio_stream]; in ivtv_pio_work_handler()
77 if (itv->cur_pio_stream < 0 || itv->cur_pio_stream >= IVTV_MAX_STREAMS || in ivtv_pio_work_handler()
79 itv->cur_pio_stream = -1; in ivtv_pio_work_handler()
90 memcpy_fromio(buf->buf, itv->dec_mem + s->sg_processing[i].src - IVTV_DECODER_OFFSET, size); in ivtv_pio_work_handler()
93 memcpy_fromio(buf->buf, itv->enc_mem + s->sg_processing[i].src, size); in ivtv_pio_work_handler()
104 struct ivtv *itv = container_of(work, struct ivtv, irq_work); in ivtv_irq_work_handler() local
106 if (test_and_clear_bit(IVTV_F_I_WORK_HANDLER_PIO, &itv->i_flags)) in ivtv_irq_work_handler()
107 ivtv_pio_work_handler(itv); in ivtv_irq_work_handler()
109 if (test_and_clear_bit(IVTV_F_I_WORK_HANDLER_VBI, &itv->i_flags)) in ivtv_irq_work_handler()
110 ivtv_vbi_work_handler(itv); in ivtv_irq_work_handler()
112 if (test_and_clear_bit(IVTV_F_I_WORK_HANDLER_YUV, &itv->i_flags)) in ivtv_irq_work_handler()
113 ivtv_yuv_work_handler(itv); in ivtv_irq_work_handler()
115 if (test_and_clear_bit(IVTV_F_I_WORK_HANDLER_PCM, &itv->i_flags)) in ivtv_irq_work_handler()
116 ivtv_pcm_work_handler(itv); in ivtv_irq_work_handler()
125 struct ivtv *itv = s->itv; in stream_enc_dma_append() local
165 if (itv->has_cx23415) in stream_enc_dma_append()
170 size = itv->vbi.enc_size * itv->vbi.fpi; in stream_enc_dma_append()
171 offset = read_enc(itv->vbi.enc_start - 4) + 12; in stream_enc_dma_append()
180 size = read_dec(itv->vbi.dec_start + 4) + 8; in stream_enc_dma_append()
181 offset = read_dec(itv->vbi.dec_start) + itv->vbi.dec_start; in stream_enc_dma_append()
192 if (itv->has_cx23415 && (s->type == IVTV_ENC_STREAM_TYPE_PCM || in stream_enc_dma_append()
260 struct ivtv *itv = s->itv; in dma_post() local
292 if (itv->has_cx23415 && (s->type == IVTV_ENC_STREAM_TYPE_PCM || in dma_post()
317 ivtv_process_vbi_data(itv, buf, 0, s->type); in dma_post()
329 itv->pcm_announce_callback != NULL) { in dma_post()
341 set_bit(IVTV_F_I_WORK_HANDLER_PCM, &itv->i_flags); in dma_post()
342 set_bit(IVTV_F_I_HAVE_WORK, &itv->i_flags); in dma_post()
351 struct ivtv *itv = s->itv; in ivtv_dma_stream_dec_prepare() local
352 struct yuv_playback_info *yi = &itv->yuv_info; in ivtv_dma_stream_dec_prepare()
412 spin_lock_irqsave(&itv->dma_reg_lock, flags); in ivtv_dma_stream_dec_prepare()
413 if (!test_bit(IVTV_F_I_DMA, &itv->i_flags)) in ivtv_dma_stream_dec_prepare()
417 spin_unlock_irqrestore(&itv->dma_reg_lock, flags); in ivtv_dma_stream_dec_prepare()
419 if (!test_bit(IVTV_F_I_DMA, &itv->i_flags)) in ivtv_dma_stream_dec_prepare()
428 struct ivtv *itv = s->itv; in ivtv_dma_enc_start_xfer() local
438 itv->dma_timer.expires = jiffies + msecs_to_jiffies(300); in ivtv_dma_enc_start_xfer()
439 add_timer(&itv->dma_timer); in ivtv_dma_enc_start_xfer()
444 struct ivtv *itv = s->itv; in ivtv_dma_dec_start_xfer() local
454 itv->dma_timer.expires = jiffies + msecs_to_jiffies(300); in ivtv_dma_dec_start_xfer()
455 add_timer(&itv->dma_timer); in ivtv_dma_dec_start_xfer()
461 struct ivtv *itv = s->itv; in ivtv_dma_enc_start() local
462 struct ivtv_stream *s_vbi = &itv->streams[IVTV_ENC_STREAM_TYPE_VBI]; in ivtv_dma_enc_start()
507 set_bit(IVTV_F_I_WORK_HANDLER_PIO, &itv->i_flags); in ivtv_dma_enc_start()
508 set_bit(IVTV_F_I_HAVE_WORK, &itv->i_flags); in ivtv_dma_enc_start()
509 set_bit(IVTV_F_I_PIO, &itv->i_flags); in ivtv_dma_enc_start()
510 itv->cur_pio_stream = s->type; in ivtv_dma_enc_start()
513 itv->dma_retries = 0; in ivtv_dma_enc_start()
515 set_bit(IVTV_F_I_DMA, &itv->i_flags); in ivtv_dma_enc_start()
516 itv->cur_dma_stream = s->type; in ivtv_dma_enc_start()
522 struct ivtv *itv = s->itv; in ivtv_dma_dec_start() local
533 itv->dma_retries = 0; in ivtv_dma_dec_start()
535 set_bit(IVTV_F_I_DMA, &itv->i_flags); in ivtv_dma_dec_start()
536 itv->cur_dma_stream = s->type; in ivtv_dma_dec_start()
539 static void ivtv_irq_dma_read(struct ivtv *itv) in ivtv_irq_dma_read() argument
547 del_timer(&itv->dma_timer); in ivtv_irq_dma_read()
549 if (!test_bit(IVTV_F_I_UDMA, &itv->i_flags) && itv->cur_dma_stream < 0) in ivtv_irq_dma_read()
552 if (!test_bit(IVTV_F_I_UDMA, &itv->i_flags)) { in ivtv_irq_dma_read()
553 s = &itv->streams[itv->cur_dma_stream]; in ivtv_irq_dma_read()
559 s->sg_processed, s->sg_processing_size, itv->dma_retries); in ivtv_irq_dma_read()
561 if (itv->dma_retries == 3) { in ivtv_irq_dma_read()
563 itv->dma_retries = 0; in ivtv_irq_dma_read()
570 itv->dma_retries++; in ivtv_irq_dma_read()
588 ivtv_vapi(itv, CX2341X_DEC_SCHED_DMA_FROM_HOST, 3, 0, s->q_dma.bytesused, in ivtv_irq_dma_read()
598 clear_bit(IVTV_F_I_UDMA, &itv->i_flags); in ivtv_irq_dma_read()
599 clear_bit(IVTV_F_I_DMA, &itv->i_flags); in ivtv_irq_dma_read()
600 itv->cur_dma_stream = -1; in ivtv_irq_dma_read()
601 wake_up(&itv->dma_waitq); in ivtv_irq_dma_read()
604 static void ivtv_irq_enc_dma_complete(struct ivtv *itv) in ivtv_irq_enc_dma_complete() argument
609 ivtv_api_get_data(&itv->enc_mbox, IVTV_MBOX_DMA_END, 2, data); in ivtv_irq_enc_dma_complete()
610 IVTV_DEBUG_HI_IRQ("ENC DMA COMPLETE %x %d (%d)\n", data[0], data[1], itv->cur_dma_stream); in ivtv_irq_enc_dma_complete()
612 del_timer(&itv->dma_timer); in ivtv_irq_enc_dma_complete()
614 if (itv->cur_dma_stream < 0) in ivtv_irq_enc_dma_complete()
617 s = &itv->streams[itv->cur_dma_stream]; in ivtv_irq_enc_dma_complete()
622 s->dma_offset, s->sg_processed, s->sg_processing_size, itv->dma_retries); in ivtv_irq_enc_dma_complete()
624 if (itv->dma_retries == 3) { in ivtv_irq_enc_dma_complete()
626 itv->dma_retries = 0; in ivtv_irq_enc_dma_complete()
633 itv->dma_retries++; in ivtv_irq_enc_dma_complete()
641 clear_bit(IVTV_F_I_DMA, &itv->i_flags); in ivtv_irq_enc_dma_complete()
642 itv->cur_dma_stream = -1; in ivtv_irq_enc_dma_complete()
645 s = &itv->streams[IVTV_ENC_STREAM_TYPE_VBI]; in ivtv_irq_enc_dma_complete()
650 wake_up(&itv->dma_waitq); in ivtv_irq_enc_dma_complete()
653 static void ivtv_irq_enc_pio_complete(struct ivtv *itv) in ivtv_irq_enc_pio_complete() argument
657 if (itv->cur_pio_stream < 0 || itv->cur_pio_stream >= IVTV_MAX_STREAMS) { in ivtv_irq_enc_pio_complete()
658 itv->cur_pio_stream = -1; in ivtv_irq_enc_pio_complete()
661 s = &itv->streams[itv->cur_pio_stream]; in ivtv_irq_enc_pio_complete()
663 clear_bit(IVTV_F_I_PIO, &itv->i_flags); in ivtv_irq_enc_pio_complete()
664 itv->cur_pio_stream = -1; in ivtv_irq_enc_pio_complete()
667 ivtv_vapi(itv, CX2341X_ENC_SCHED_DMA_TO_HOST, 3, 0, 0, 0); in ivtv_irq_enc_pio_complete()
669 ivtv_vapi(itv, CX2341X_ENC_SCHED_DMA_TO_HOST, 3, 0, 0, 1); in ivtv_irq_enc_pio_complete()
671 ivtv_vapi(itv, CX2341X_ENC_SCHED_DMA_TO_HOST, 3, 0, 0, 2); in ivtv_irq_enc_pio_complete()
672 clear_bit(IVTV_F_I_PIO, &itv->i_flags); in ivtv_irq_enc_pio_complete()
674 s = &itv->streams[IVTV_ENC_STREAM_TYPE_VBI]; in ivtv_irq_enc_pio_complete()
677 wake_up(&itv->dma_waitq); in ivtv_irq_enc_pio_complete()
680 static void ivtv_irq_dma_err(struct ivtv *itv) in ivtv_irq_dma_err() argument
685 del_timer(&itv->dma_timer); in ivtv_irq_dma_err()
687 ivtv_api_get_data(&itv->enc_mbox, IVTV_MBOX_DMA_END, 2, data); in ivtv_irq_dma_err()
690 status, itv->cur_dma_stream); in ivtv_irq_dma_err()
704 if (!test_bit(IVTV_F_I_UDMA, &itv->i_flags) && in ivtv_irq_dma_err()
705 itv->cur_dma_stream >= 0 && itv->cur_dma_stream < IVTV_MAX_STREAMS) { in ivtv_irq_dma_err()
706 struct ivtv_stream *s = &itv->streams[itv->cur_dma_stream]; in ivtv_irq_dma_err()
722 itv->dma_timer.expires = in ivtv_irq_dma_err()
724 add_timer(&itv->dma_timer); in ivtv_irq_dma_err()
728 if (itv->dma_retries < 3) { in ivtv_irq_dma_err()
736 itv->dma_retries++; in ivtv_irq_dma_err()
744 if (test_bit(IVTV_F_I_UDMA, &itv->i_flags)) { in ivtv_irq_dma_err()
745 ivtv_udma_start(itv); in ivtv_irq_dma_err()
748 clear_bit(IVTV_F_I_UDMA, &itv->i_flags); in ivtv_irq_dma_err()
749 clear_bit(IVTV_F_I_DMA, &itv->i_flags); in ivtv_irq_dma_err()
750 itv->cur_dma_stream = -1; in ivtv_irq_dma_err()
751 wake_up(&itv->dma_waitq); in ivtv_irq_dma_err()
754 static void ivtv_irq_enc_start_cap(struct ivtv *itv) in ivtv_irq_enc_start_cap() argument
760 ivtv_api_get_data(&itv->enc_mbox, IVTV_MBOX_DMA, 7, data); in ivtv_irq_enc_start_cap()
768 s = &itv->streams[ivtv_stream_map[data[0]]]; in ivtv_irq_enc_start_cap()
774 static void ivtv_irq_enc_vbi_cap(struct ivtv *itv) in ivtv_irq_enc_vbi_cap() argument
780 s = &itv->streams[IVTV_ENC_STREAM_TYPE_VBI]; in ivtv_irq_enc_vbi_cap()
786 static void ivtv_irq_dec_vbi_reinsert(struct ivtv *itv) in ivtv_irq_dec_vbi_reinsert() argument
789 struct ivtv_stream *s = &itv->streams[IVTV_DEC_STREAM_TYPE_VBI]; in ivtv_irq_dec_vbi_reinsert()
798 static void ivtv_irq_dec_data_req(struct ivtv *itv) in ivtv_irq_dec_data_req() argument
805 if (test_bit(IVTV_F_I_DEC_YUV, &itv->i_flags)) { in ivtv_irq_dec_data_req()
806 ivtv_api_get_data(&itv->dec_mbox, IVTV_MBOX_DMA, 2, data); in ivtv_irq_dec_data_req()
807 itv->dma_data_req_size = in ivtv_irq_dec_data_req()
808 1080 * ((itv->yuv_info.v4l2_src_h + 31) & ~31); in ivtv_irq_dec_data_req()
809 itv->dma_data_req_offset = data[1]; in ivtv_irq_dec_data_req()
810 if (atomic_read(&itv->yuv_info.next_dma_frame) >= 0) in ivtv_irq_dec_data_req()
811 ivtv_yuv_frame_complete(itv); in ivtv_irq_dec_data_req()
812 s = &itv->streams[IVTV_DEC_STREAM_TYPE_YUV]; in ivtv_irq_dec_data_req()
815 ivtv_api_get_data(&itv->dec_mbox, IVTV_MBOX_DMA, 3, data); in ivtv_irq_dec_data_req()
816 itv->dma_data_req_size = min_t(u32, data[2], 0x10000); in ivtv_irq_dec_data_req()
817 itv->dma_data_req_offset = data[1]; in ivtv_irq_dec_data_req()
818 s = &itv->streams[IVTV_DEC_STREAM_TYPE_MPG]; in ivtv_irq_dec_data_req()
821 itv->dma_data_req_offset, itv->dma_data_req_size); in ivtv_irq_dec_data_req()
822 if (itv->dma_data_req_size == 0 || s->q_full.bytesused < itv->dma_data_req_size) { in ivtv_irq_dec_data_req()
826 if (test_bit(IVTV_F_I_DEC_YUV, &itv->i_flags)) in ivtv_irq_dec_data_req()
827 ivtv_yuv_setup_stream_frame(itv); in ivtv_irq_dec_data_req()
829 ivtv_queue_move(s, &s->q_full, NULL, &s->q_predma, itv->dma_data_req_size); in ivtv_irq_dec_data_req()
830 ivtv_dma_stream_dec_prepare(s, itv->dma_data_req_offset + IVTV_DECODER_OFFSET, 0); in ivtv_irq_dec_data_req()
834 static void ivtv_irq_vsync(struct ivtv *itv) in ivtv_irq_vsync() argument
844 struct yuv_playback_info *yi = &itv->yuv_info; in ivtv_irq_vsync()
851 ((itv->last_vsync_field & 1) ^ f->sync_field)) || in ivtv_irq_vsync()
852 (frame != (itv->last_vsync_field & 1) && !f->interlaced)) { in ivtv_irq_vsync()
868 if (frame != (itv->last_vsync_field & 1)) { in ivtv_irq_vsync()
877 struct ivtv_stream *s = ivtv_get_output_stream(itv); in ivtv_irq_vsync()
879 itv->last_vsync_field += 1; in ivtv_irq_vsync()
881 clear_bit(IVTV_F_I_VALID_DEC_TIMINGS, &itv->i_flags); in ivtv_irq_vsync()
882 clear_bit(IVTV_F_I_EV_VSYNC_FIELD, &itv->i_flags); in ivtv_irq_vsync()
885 set_bit(IVTV_F_I_EV_VSYNC_FIELD, &itv->i_flags); in ivtv_irq_vsync()
887 if (test_bit(IVTV_F_I_EV_VSYNC_ENABLED, &itv->i_flags)) { in ivtv_irq_vsync()
888 set_bit(IVTV_F_I_EV_VSYNC, &itv->i_flags); in ivtv_irq_vsync()
889 wake_up(&itv->event_waitq); in ivtv_irq_vsync()
895 wake_up(&itv->vsync_waitq); in ivtv_irq_vsync()
898 if (frame && (itv->output_mode == OUT_PASSTHROUGH || in ivtv_irq_vsync()
899 test_bit(IVTV_F_I_UPDATE_WSS, &itv->i_flags) || in ivtv_irq_vsync()
900 test_bit(IVTV_F_I_UPDATE_VPS, &itv->i_flags) || in ivtv_irq_vsync()
901 test_bit(IVTV_F_I_UPDATE_CC, &itv->i_flags))) { in ivtv_irq_vsync()
902 set_bit(IVTV_F_I_WORK_HANDLER_VBI, &itv->i_flags); in ivtv_irq_vsync()
903 set_bit(IVTV_F_I_HAVE_WORK, &itv->i_flags); in ivtv_irq_vsync()
919 set_bit(IVTV_F_I_WORK_HANDLER_YUV, &itv->i_flags); in ivtv_irq_vsync()
920 set_bit(IVTV_F_I_HAVE_WORK, &itv->i_flags); in ivtv_irq_vsync()
932 struct ivtv *itv = (struct ivtv *)dev_id; in ivtv_irq_handler() local
938 spin_lock(&itv->dma_reg_lock); in ivtv_irq_handler()
942 combo = ~itv->irqmask & stat; in ivtv_irq_handler()
951 if (~itv->irqmask & IVTV_IRQ_DEC_VSYNC) { in ivtv_irq_handler()
953 if ((itv->last_vsync_field & 1) != in ivtv_irq_handler()
964 spin_unlock(&itv->dma_reg_lock); in ivtv_irq_handler()
979 ivtv_irq_dma_read(itv); in ivtv_irq_handler()
983 ivtv_irq_enc_dma_complete(itv); in ivtv_irq_handler()
987 ivtv_irq_enc_pio_complete(itv); in ivtv_irq_handler()
991 ivtv_irq_dma_err(itv); in ivtv_irq_handler()
995 ivtv_irq_enc_start_cap(itv); in ivtv_irq_handler()
999 ivtv_irq_enc_vbi_cap(itv); in ivtv_irq_handler()
1003 ivtv_irq_dec_vbi_reinsert(itv); in ivtv_irq_handler()
1008 set_bit(IVTV_F_I_EOS, &itv->i_flags); in ivtv_irq_handler()
1009 wake_up(&itv->eos_waitq); in ivtv_irq_handler()
1013 ivtv_irq_dec_data_req(itv); in ivtv_irq_handler()
1017 if (~itv->irqmask & IVTV_IRQ_DEC_VSYNC) { in ivtv_irq_handler()
1018 ivtv_irq_vsync(itv); in ivtv_irq_handler()
1030 if ((combo & IVTV_IRQ_DMA) && !test_bit(IVTV_F_I_DMA, &itv->i_flags)) { in ivtv_irq_handler()
1031 itv->irq_rr_idx++; in ivtv_irq_handler()
1033 int idx = (i + itv->irq_rr_idx) % IVTV_MAX_STREAMS; in ivtv_irq_handler()
1034 struct ivtv_stream *s = &itv->streams[idx]; in ivtv_irq_handler()
1046 test_bit(IVTV_F_I_UDMA_PENDING, &itv->i_flags)) in ivtv_irq_handler()
1047 ivtv_udma_start(itv); in ivtv_irq_handler()
1050 if ((combo & IVTV_IRQ_DMA) && !test_bit(IVTV_F_I_PIO, &itv->i_flags)) { in ivtv_irq_handler()
1051 itv->irq_rr_idx++; in ivtv_irq_handler()
1053 int idx = (i + itv->irq_rr_idx) % IVTV_MAX_STREAMS; in ivtv_irq_handler()
1054 struct ivtv_stream *s = &itv->streams[idx]; in ivtv_irq_handler()
1064 if (test_and_clear_bit(IVTV_F_I_HAVE_WORK, &itv->i_flags)) { in ivtv_irq_handler()
1065 queue_kthread_work(&itv->irq_worker, &itv->irq_work); in ivtv_irq_handler()
1068 spin_unlock(&itv->dma_reg_lock); in ivtv_irq_handler()
1079 struct ivtv *itv = (struct ivtv *)arg; in ivtv_unfinished_dma() local
1081 if (!test_bit(IVTV_F_I_DMA, &itv->i_flags)) in ivtv_unfinished_dma()
1083 IVTV_ERR("DMA TIMEOUT %08x %d\n", read_reg(IVTV_REG_DMASTATUS), itv->cur_dma_stream); in ivtv_unfinished_dma()
1086 clear_bit(IVTV_F_I_UDMA, &itv->i_flags); in ivtv_unfinished_dma()
1087 clear_bit(IVTV_F_I_DMA, &itv->i_flags); in ivtv_unfinished_dma()
1088 itv->cur_dma_stream = -1; in ivtv_unfinished_dma()
1089 wake_up(&itv->dma_waitq); in ivtv_unfinished_dma()