Lines Matching full:video

32 #define DEVICE_NAME			"aspeed-video"
402 static void aspeed_video_update(struct aspeed_video *video, u32 reg, u32 clear, in aspeed_video_update() argument
405 u32 t = readl(video->base + reg); in aspeed_video_update()
410 writel(t, video->base + reg); in aspeed_video_update()
411 dev_dbg(video->dev, "update %03x[%08x -> %08x]\n", reg, before, in aspeed_video_update()
412 readl(video->base + reg)); in aspeed_video_update()
415 static u32 aspeed_video_read(struct aspeed_video *video, u32 reg) in aspeed_video_read() argument
417 u32 t = readl(video->base + reg); in aspeed_video_read()
419 dev_dbg(video->dev, "read %03x[%08x]\n", reg, t); in aspeed_video_read()
423 static void aspeed_video_write(struct aspeed_video *video, u32 reg, u32 val) in aspeed_video_write() argument
425 writel(val, video->base + reg); in aspeed_video_write()
426 dev_dbg(video->dev, "write %03x[%08x]\n", reg, in aspeed_video_write()
427 readl(video->base + reg)); in aspeed_video_write()
430 static int aspeed_video_start_frame(struct aspeed_video *video) in aspeed_video_start_frame() argument
435 u32 seq_ctrl = aspeed_video_read(video, VE_SEQ_CTRL); in aspeed_video_start_frame()
437 if (video->v4l2_input_status) { in aspeed_video_start_frame()
438 dev_dbg(video->dev, "No signal; don't start frame\n"); in aspeed_video_start_frame()
444 dev_dbg(video->dev, "Engine busy; don't start frame\n"); in aspeed_video_start_frame()
448 spin_lock_irqsave(&video->lock, flags); in aspeed_video_start_frame()
449 buf = list_first_entry_or_null(&video->buffers, in aspeed_video_start_frame()
452 spin_unlock_irqrestore(&video->lock, flags); in aspeed_video_start_frame()
453 dev_dbg(video->dev, "No buffers; don't start frame\n"); in aspeed_video_start_frame()
457 set_bit(VIDEO_FRAME_INPRG, &video->flags); in aspeed_video_start_frame()
459 spin_unlock_irqrestore(&video->lock, flags); in aspeed_video_start_frame()
461 aspeed_video_write(video, VE_COMP_PROC_OFFSET, 0); in aspeed_video_start_frame()
462 aspeed_video_write(video, VE_COMP_OFFSET, 0); in aspeed_video_start_frame()
463 aspeed_video_write(video, VE_COMP_ADDR, addr); in aspeed_video_start_frame()
465 aspeed_video_update(video, VE_INTERRUPT_CTRL, 0, in aspeed_video_start_frame()
468 aspeed_video_update(video, VE_SEQ_CTRL, 0, in aspeed_video_start_frame()
474 static void aspeed_video_enable_mode_detect(struct aspeed_video *video) in aspeed_video_enable_mode_detect() argument
477 aspeed_video_update(video, VE_INTERRUPT_CTRL, 0, in aspeed_video_enable_mode_detect()
481 aspeed_video_update(video, VE_SEQ_CTRL, 0, VE_SEQ_CTRL_TRIG_MODE_DET); in aspeed_video_enable_mode_detect()
484 static void aspeed_video_off(struct aspeed_video *video) in aspeed_video_off() argument
486 if (!test_bit(VIDEO_CLOCKS_ON, &video->flags)) in aspeed_video_off()
490 aspeed_video_write(video, VE_INTERRUPT_CTRL, 0); in aspeed_video_off()
491 aspeed_video_write(video, VE_INTERRUPT_STATUS, 0xffffffff); in aspeed_video_off()
494 clk_disable(video->vclk); in aspeed_video_off()
495 clk_disable(video->eclk); in aspeed_video_off()
497 clear_bit(VIDEO_CLOCKS_ON, &video->flags); in aspeed_video_off()
500 static void aspeed_video_on(struct aspeed_video *video) in aspeed_video_on() argument
502 if (test_bit(VIDEO_CLOCKS_ON, &video->flags)) in aspeed_video_on()
506 clk_enable(video->eclk); in aspeed_video_on()
507 clk_enable(video->vclk); in aspeed_video_on()
509 set_bit(VIDEO_CLOCKS_ON, &video->flags); in aspeed_video_on()
512 static void aspeed_video_bufs_done(struct aspeed_video *video, in aspeed_video_bufs_done() argument
518 spin_lock_irqsave(&video->lock, flags); in aspeed_video_bufs_done()
519 list_for_each_entry(buf, &video->buffers, link) in aspeed_video_bufs_done()
521 INIT_LIST_HEAD(&video->buffers); in aspeed_video_bufs_done()
522 spin_unlock_irqrestore(&video->lock, flags); in aspeed_video_bufs_done()
525 static void aspeed_video_irq_res_change(struct aspeed_video *video, ulong delay) in aspeed_video_irq_res_change() argument
527 dev_dbg(video->dev, "Resolution changed; resetting\n"); in aspeed_video_irq_res_change()
529 set_bit(VIDEO_RES_CHANGE, &video->flags); in aspeed_video_irq_res_change()
530 clear_bit(VIDEO_FRAME_INPRG, &video->flags); in aspeed_video_irq_res_change()
532 aspeed_video_off(video); in aspeed_video_irq_res_change()
533 aspeed_video_bufs_done(video, VB2_BUF_STATE_ERROR); in aspeed_video_irq_res_change()
535 schedule_delayed_work(&video->res_work, delay); in aspeed_video_irq_res_change()
540 struct aspeed_video *video = arg; in aspeed_video_irq() local
541 u32 sts = aspeed_video_read(video, VE_INTERRUPT_STATUS); in aspeed_video_irq()
548 aspeed_video_irq_res_change(video, 0); in aspeed_video_irq()
553 if (test_bit(VIDEO_RES_DETECT, &video->flags)) { in aspeed_video_irq()
554 aspeed_video_update(video, VE_INTERRUPT_CTRL, in aspeed_video_irq()
556 aspeed_video_write(video, VE_INTERRUPT_STATUS, in aspeed_video_irq()
559 set_bit(VIDEO_MODE_DETECT_DONE, &video->flags); in aspeed_video_irq()
560 wake_up_interruptible_all(&video->wait); in aspeed_video_irq()
566 aspeed_video_irq_res_change(video, in aspeed_video_irq()
574 u32 frame_size = aspeed_video_read(video, in aspeed_video_irq()
577 spin_lock(&video->lock); in aspeed_video_irq()
578 clear_bit(VIDEO_FRAME_INPRG, &video->flags); in aspeed_video_irq()
579 buf = list_first_entry_or_null(&video->buffers, in aspeed_video_irq()
585 if (!list_is_last(&buf->link, &video->buffers)) { in aspeed_video_irq()
587 buf->vb.sequence = video->sequence++; in aspeed_video_irq()
594 spin_unlock(&video->lock); in aspeed_video_irq()
596 aspeed_video_update(video, VE_SEQ_CTRL, in aspeed_video_irq()
600 aspeed_video_update(video, VE_INTERRUPT_CTRL, in aspeed_video_irq()
602 aspeed_video_write(video, VE_INTERRUPT_STATUS, in aspeed_video_irq()
605 if (test_bit(VIDEO_STREAMING, &video->flags) && buf) in aspeed_video_irq()
606 aspeed_video_start_frame(video); in aspeed_video_irq()
612 static void aspeed_video_check_and_set_polarity(struct aspeed_video *video) in aspeed_video_check_and_set_polarity() argument
620 sts = aspeed_video_read(video, VE_MODE_DETECT_STATUS); in aspeed_video_check_and_set_polarity()
637 video->detected_timings.polarities &= in aspeed_video_check_and_set_polarity()
640 video->detected_timings.polarities |= in aspeed_video_check_and_set_polarity()
646 video->detected_timings.polarities &= in aspeed_video_check_and_set_polarity()
649 video->detected_timings.polarities |= in aspeed_video_check_and_set_polarity()
654 aspeed_video_update(video, VE_CTRL, 0, ctrl); in aspeed_video_check_and_set_polarity()
658 static bool aspeed_video_alloc_buf(struct aspeed_video *video, in aspeed_video_alloc_buf() argument
662 addr->virt = dma_alloc_coherent(video->dev, size, &addr->dma, in aspeed_video_alloc_buf()
671 static void aspeed_video_free_buf(struct aspeed_video *video, in aspeed_video_free_buf() argument
674 dma_free_coherent(video->dev, addr->size, addr->virt, addr->dma); in aspeed_video_free_buf()
686 static void aspeed_video_calc_compressed_size(struct aspeed_video *video, in aspeed_video_calc_compressed_size() argument
696 video->max_compressed_size = UINT_MAX; in aspeed_video_calc_compressed_size()
705 if (size < video->max_compressed_size) { in aspeed_video_calc_compressed_size()
707 video->max_compressed_size = size; in aspeed_video_calc_compressed_size()
712 aspeed_video_write(video, VE_STREAM_BUF_SIZE, in aspeed_video_calc_compressed_size()
715 dev_dbg(video->dev, "Max compressed size: %x\n", in aspeed_video_calc_compressed_size()
716 video->max_compressed_size); in aspeed_video_calc_compressed_size()
721 static void aspeed_video_get_resolution(struct aspeed_video *video) in aspeed_video_get_resolution() argument
730 struct v4l2_bt_timings *det = &video->detected_timings; in aspeed_video_get_resolution()
734 video->v4l2_input_status = V4L2_IN_ST_NO_SIGNAL; in aspeed_video_get_resolution()
743 set_bit(VIDEO_RES_DETECT, &video->flags); in aspeed_video_get_resolution()
744 aspeed_video_enable_mode_detect(video); in aspeed_video_get_resolution()
746 rc = wait_event_interruptible_timeout(video->wait, in aspeed_video_get_resolution()
747 res_check(video), in aspeed_video_get_resolution()
750 dev_dbg(video->dev, "Timed out; first mode detect\n"); in aspeed_video_get_resolution()
751 clear_bit(VIDEO_RES_DETECT, &video->flags); in aspeed_video_get_resolution()
756 aspeed_video_update(video, VE_SEQ_CTRL, in aspeed_video_get_resolution()
759 aspeed_video_check_and_set_polarity(video); in aspeed_video_get_resolution()
761 aspeed_video_enable_mode_detect(video); in aspeed_video_get_resolution()
763 rc = wait_event_interruptible_timeout(video->wait, in aspeed_video_get_resolution()
764 res_check(video), in aspeed_video_get_resolution()
766 clear_bit(VIDEO_RES_DETECT, &video->flags); in aspeed_video_get_resolution()
768 dev_dbg(video->dev, "Timed out; second mode detect\n"); in aspeed_video_get_resolution()
772 src_lr_edge = aspeed_video_read(video, VE_SRC_LR_EDGE_DET); in aspeed_video_get_resolution()
773 src_tb_edge = aspeed_video_read(video, VE_SRC_TB_EDGE_DET); in aspeed_video_get_resolution()
774 mds = aspeed_video_read(video, VE_MODE_DETECT_STATUS); in aspeed_video_get_resolution()
775 sync = aspeed_video_read(video, VE_SYNC_STATUS); in aspeed_video_get_resolution()
777 video->frame_bottom = (src_tb_edge & VE_SRC_TB_EDGE_DET_BOT) >> in aspeed_video_get_resolution()
779 video->frame_top = src_tb_edge & VE_SRC_TB_EDGE_DET_TOP; in aspeed_video_get_resolution()
780 det->vfrontporch = video->frame_top; in aspeed_video_get_resolution()
782 VE_MODE_DETECT_V_LINES_SHF) - video->frame_bottom; in aspeed_video_get_resolution()
785 if (video->frame_top > video->frame_bottom) in aspeed_video_get_resolution()
788 video->frame_right = (src_lr_edge & VE_SRC_LR_EDGE_DET_RT) >> in aspeed_video_get_resolution()
790 video->frame_left = src_lr_edge & VE_SRC_LR_EDGE_DET_LEFT; in aspeed_video_get_resolution()
791 det->hfrontporch = video->frame_left; in aspeed_video_get_resolution()
793 video->frame_right; in aspeed_video_get_resolution()
795 if (video->frame_left > video->frame_right) in aspeed_video_get_resolution()
802 dev_dbg(video->dev, "Invalid resolution detected\n"); in aspeed_video_get_resolution()
806 det->height = (video->frame_bottom - video->frame_top) + 1; in aspeed_video_get_resolution()
807 det->width = (video->frame_right - video->frame_left) + 1; in aspeed_video_get_resolution()
808 video->v4l2_input_status = 0; in aspeed_video_get_resolution()
814 aspeed_video_update(video, VE_INTERRUPT_CTRL, 0, in aspeed_video_get_resolution()
816 aspeed_video_update(video, VE_SEQ_CTRL, 0, in aspeed_video_get_resolution()
819 dev_dbg(video->dev, "Got resolution: %dx%d\n", det->width, in aspeed_video_get_resolution()
823 static void aspeed_video_set_resolution(struct aspeed_video *video) in aspeed_video_set_resolution() argument
825 struct v4l2_bt_timings *act = &video->active_timings; in aspeed_video_set_resolution()
829 aspeed_video_calc_compressed_size(video, size); in aspeed_video_set_resolution()
831 if (video->active_timings.width == 1680) { in aspeed_video_set_resolution()
838 * and to get better access speed from video engine. in aspeed_video_set_resolution()
840 aspeed_video_write(video, VE_CAP_WINDOW, in aspeed_video_set_resolution()
842 size += (1728 - 1680) * video->active_timings.height; in aspeed_video_set_resolution()
844 aspeed_video_write(video, VE_CAP_WINDOW, in aspeed_video_set_resolution()
847 aspeed_video_write(video, VE_COMP_WINDOW, in aspeed_video_set_resolution()
849 aspeed_video_write(video, VE_SRC_SCANLINE_OFFSET, act->width * 4); in aspeed_video_set_resolution()
853 aspeed_video_write(video, VE_TGS_0, in aspeed_video_set_resolution()
855 video->frame_left - 1) | in aspeed_video_set_resolution()
857 video->frame_right)); in aspeed_video_set_resolution()
858 aspeed_video_write(video, VE_TGS_1, in aspeed_video_set_resolution()
859 FIELD_PREP(VE_TGS_FIRST, video->frame_top) | in aspeed_video_set_resolution()
861 video->frame_bottom + 1)); in aspeed_video_set_resolution()
862 aspeed_video_update(video, VE_CTRL, 0, VE_CTRL_INT_DE); in aspeed_video_set_resolution()
864 aspeed_video_update(video, VE_CTRL, 0, VE_CTRL_DIRECT_FETCH); in aspeed_video_set_resolution()
869 if (size != video->srcs[0].size) { in aspeed_video_set_resolution()
870 if (video->srcs[0].size) in aspeed_video_set_resolution()
871 aspeed_video_free_buf(video, &video->srcs[0]); in aspeed_video_set_resolution()
872 if (video->srcs[1].size) in aspeed_video_set_resolution()
873 aspeed_video_free_buf(video, &video->srcs[1]); in aspeed_video_set_resolution()
875 if (!aspeed_video_alloc_buf(video, &video->srcs[0], size)) in aspeed_video_set_resolution()
877 if (!aspeed_video_alloc_buf(video, &video->srcs[1], size)) in aspeed_video_set_resolution()
880 aspeed_video_write(video, VE_SRC0_ADDR, video->srcs[0].dma); in aspeed_video_set_resolution()
881 aspeed_video_write(video, VE_SRC1_ADDR, video->srcs[1].dma); in aspeed_video_set_resolution()
887 dev_err(video->dev, "Failed to allocate source buffers\n"); in aspeed_video_set_resolution()
889 if (video->srcs[0].size) in aspeed_video_set_resolution()
890 aspeed_video_free_buf(video, &video->srcs[0]); in aspeed_video_set_resolution()
893 static void aspeed_video_init_regs(struct aspeed_video *video) in aspeed_video_init_regs() argument
896 FIELD_PREP(VE_COMP_CTRL_DCT_LUM, video->jpeg_quality) | in aspeed_video_init_regs()
897 FIELD_PREP(VE_COMP_CTRL_DCT_CHR, video->jpeg_quality | 0x10); in aspeed_video_init_regs()
901 if (video->frame_rate) in aspeed_video_init_regs()
902 ctrl |= FIELD_PREP(VE_CTRL_FRC, video->frame_rate); in aspeed_video_init_regs()
904 if (video->yuv420) in aspeed_video_init_regs()
908 aspeed_video_write(video, VE_PROTECTION_KEY, VE_PROTECTION_KEY_UNLOCK); in aspeed_video_init_regs()
911 aspeed_video_write(video, VE_INTERRUPT_CTRL, 0); in aspeed_video_init_regs()
912 aspeed_video_write(video, VE_INTERRUPT_STATUS, 0xffffffff); in aspeed_video_init_regs()
915 aspeed_video_write(video, VE_COMP_PROC_OFFSET, 0); in aspeed_video_init_regs()
916 aspeed_video_write(video, VE_COMP_OFFSET, 0); in aspeed_video_init_regs()
918 aspeed_video_write(video, VE_JPEG_ADDR, video->jpeg.dma); in aspeed_video_init_regs()
921 aspeed_video_write(video, VE_SEQ_CTRL, seq_ctrl); in aspeed_video_init_regs()
922 aspeed_video_write(video, VE_CTRL, ctrl); in aspeed_video_init_regs()
923 aspeed_video_write(video, VE_COMP_CTRL, comp_ctrl); in aspeed_video_init_regs()
926 aspeed_video_write(video, VE_SCALING_FACTOR, 0x10001000); in aspeed_video_init_regs()
927 aspeed_video_write(video, VE_SCALING_FILTER0, 0x00200000); in aspeed_video_init_regs()
928 aspeed_video_write(video, VE_SCALING_FILTER1, 0x00200000); in aspeed_video_init_regs()
929 aspeed_video_write(video, VE_SCALING_FILTER2, 0x00200000); in aspeed_video_init_regs()
930 aspeed_video_write(video, VE_SCALING_FILTER3, 0x00200000); in aspeed_video_init_regs()
933 aspeed_video_write(video, VE_MODE_DETECT, 0x22666500); in aspeed_video_init_regs()
936 static void aspeed_video_start(struct aspeed_video *video) in aspeed_video_start() argument
938 aspeed_video_on(video); in aspeed_video_start()
940 aspeed_video_init_regs(video); in aspeed_video_start()
943 aspeed_video_get_resolution(video); in aspeed_video_start()
946 video->active_timings = video->detected_timings; in aspeed_video_start()
947 aspeed_video_set_resolution(video); in aspeed_video_start()
949 video->pix_fmt.width = video->active_timings.width; in aspeed_video_start()
950 video->pix_fmt.height = video->active_timings.height; in aspeed_video_start()
951 video->pix_fmt.sizeimage = video->max_compressed_size; in aspeed_video_start()
954 static void aspeed_video_stop(struct aspeed_video *video) in aspeed_video_stop() argument
956 set_bit(VIDEO_STOPPED, &video->flags); in aspeed_video_stop()
957 cancel_delayed_work_sync(&video->res_work); in aspeed_video_stop()
959 aspeed_video_off(video); in aspeed_video_stop()
961 if (video->srcs[0].size) in aspeed_video_stop()
962 aspeed_video_free_buf(video, &video->srcs[0]); in aspeed_video_stop()
964 if (video->srcs[1].size) in aspeed_video_stop()
965 aspeed_video_free_buf(video, &video->srcs[1]); in aspeed_video_stop()
967 video->v4l2_input_status = V4L2_IN_ST_NO_SIGNAL; in aspeed_video_stop()
968 video->flags = 0; in aspeed_video_stop()
975 strscpy(cap->card, "Aspeed Video Engine", sizeof(cap->card)); in aspeed_video_querycap()
996 struct aspeed_video *video = video_drvdata(file); in aspeed_video_get_format() local
998 f->fmt.pix = video->pix_fmt; in aspeed_video_get_format()
1006 struct aspeed_video *video = video_drvdata(file); in aspeed_video_enum_input() local
1014 inp->status = video->v4l2_input_status; in aspeed_video_enum_input()
1037 struct aspeed_video *video = video_drvdata(file); in aspeed_video_get_parm() local
1042 if (!video->frame_rate) in aspeed_video_get_parm()
1045 a->parm.capture.timeperframe.denominator = video->frame_rate; in aspeed_video_get_parm()
1054 struct aspeed_video *video = video_drvdata(file); in aspeed_video_set_parm() local
1069 if (video->frame_rate != frame_rate) { in aspeed_video_set_parm()
1070 video->frame_rate = frame_rate; in aspeed_video_set_parm()
1071 aspeed_video_update(video, VE_CTRL, VE_CTRL_FRC, in aspeed_video_set_parm()
1081 struct aspeed_video *video = video_drvdata(file); in aspeed_video_enum_framesizes() local
1089 fsize->discrete.width = video->pix_fmt.width; in aspeed_video_enum_framesizes()
1090 fsize->discrete.height = video->pix_fmt.height; in aspeed_video_enum_framesizes()
1099 struct aspeed_video *video = video_drvdata(file); in aspeed_video_enum_frameintervals() local
1104 if (fival->width != video->detected_timings.width || in aspeed_video_enum_frameintervals()
1105 fival->height != video->detected_timings.height) in aspeed_video_enum_frameintervals()
1125 struct aspeed_video *video = video_drvdata(file); in aspeed_video_set_dv_timings() local
1127 if (timings->bt.width == video->active_timings.width && in aspeed_video_set_dv_timings()
1128 timings->bt.height == video->active_timings.height) in aspeed_video_set_dv_timings()
1131 if (vb2_is_busy(&video->queue)) in aspeed_video_set_dv_timings()
1134 video->active_timings = timings->bt; in aspeed_video_set_dv_timings()
1136 aspeed_video_set_resolution(video); in aspeed_video_set_dv_timings()
1138 video->pix_fmt.width = timings->bt.width; in aspeed_video_set_dv_timings()
1139 video->pix_fmt.height = timings->bt.height; in aspeed_video_set_dv_timings()
1140 video->pix_fmt.sizeimage = video->max_compressed_size; in aspeed_video_set_dv_timings()
1150 struct aspeed_video *video = video_drvdata(file); in aspeed_video_get_dv_timings() local
1153 timings->bt = video->active_timings; in aspeed_video_get_dv_timings()
1162 struct aspeed_video *video = video_drvdata(file); in aspeed_video_query_dv_timings() local
1170 if (test_bit(VIDEO_RES_CHANGE, &video->flags)) in aspeed_video_query_dv_timings()
1173 rc = wait_event_interruptible(video->wait, in aspeed_video_query_dv_timings()
1175 &video->flags)); in aspeed_video_query_dv_timings()
1181 timings->bt = video->detected_timings; in aspeed_video_query_dv_timings()
1183 return video->v4l2_input_status ? -ENOLINK : 0; in aspeed_video_query_dv_timings()
1249 static void aspeed_video_update_jpeg_quality(struct aspeed_video *video) in aspeed_video_update_jpeg_quality() argument
1251 u32 comp_ctrl = FIELD_PREP(VE_COMP_CTRL_DCT_LUM, video->jpeg_quality) | in aspeed_video_update_jpeg_quality()
1252 FIELD_PREP(VE_COMP_CTRL_DCT_CHR, video->jpeg_quality | 0x10); in aspeed_video_update_jpeg_quality()
1254 aspeed_video_update(video, VE_COMP_CTRL, in aspeed_video_update_jpeg_quality()
1259 static void aspeed_video_update_subsampling(struct aspeed_video *video) in aspeed_video_update_subsampling() argument
1261 if (video->jpeg.virt) in aspeed_video_update_subsampling()
1262 aspeed_video_init_jpeg_table(video->jpeg.virt, video->yuv420); in aspeed_video_update_subsampling()
1264 if (video->yuv420) in aspeed_video_update_subsampling()
1265 aspeed_video_update(video, VE_SEQ_CTRL, 0, VE_SEQ_CTRL_YUV420); in aspeed_video_update_subsampling()
1267 aspeed_video_update(video, VE_SEQ_CTRL, VE_SEQ_CTRL_YUV420, 0); in aspeed_video_update_subsampling()
1272 struct aspeed_video *video = container_of(ctrl->handler, in aspeed_video_set_ctrl() local
1278 video->jpeg_quality = ctrl->val; in aspeed_video_set_ctrl()
1279 aspeed_video_update_jpeg_quality(video); in aspeed_video_set_ctrl()
1283 video->yuv420 = true; in aspeed_video_set_ctrl()
1284 aspeed_video_update_subsampling(video); in aspeed_video_set_ctrl()
1286 video->yuv420 = false; in aspeed_video_set_ctrl()
1287 aspeed_video_update_subsampling(video); in aspeed_video_set_ctrl()
1304 struct aspeed_video *video = container_of(dwork, struct aspeed_video, in aspeed_video_resolution_work() local
1306 u32 input_status = video->v4l2_input_status; in aspeed_video_resolution_work()
1308 aspeed_video_on(video); in aspeed_video_resolution_work()
1311 if (test_bit(VIDEO_STOPPED, &video->flags)) in aspeed_video_resolution_work()
1314 aspeed_video_init_regs(video); in aspeed_video_resolution_work()
1316 aspeed_video_get_resolution(video); in aspeed_video_resolution_work()
1318 if (video->detected_timings.width != video->active_timings.width || in aspeed_video_resolution_work()
1319 video->detected_timings.height != video->active_timings.height || in aspeed_video_resolution_work()
1320 input_status != video->v4l2_input_status) { in aspeed_video_resolution_work()
1326 v4l2_event_queue(&video->vdev, &ev); in aspeed_video_resolution_work()
1327 } else if (test_bit(VIDEO_STREAMING, &video->flags)) { in aspeed_video_resolution_work()
1329 aspeed_video_start_frame(video); in aspeed_video_resolution_work()
1333 clear_bit(VIDEO_RES_CHANGE, &video->flags); in aspeed_video_resolution_work()
1334 wake_up_interruptible_all(&video->wait); in aspeed_video_resolution_work()
1340 struct aspeed_video *video = video_drvdata(file); in aspeed_video_open() local
1342 mutex_lock(&video->video_lock); in aspeed_video_open()
1346 mutex_unlock(&video->video_lock); in aspeed_video_open()
1351 aspeed_video_start(video); in aspeed_video_open()
1353 mutex_unlock(&video->video_lock); in aspeed_video_open()
1361 struct aspeed_video *video = video_drvdata(file); in aspeed_video_release() local
1363 mutex_lock(&video->video_lock); in aspeed_video_release()
1366 aspeed_video_stop(video); in aspeed_video_release()
1370 mutex_unlock(&video->video_lock); in aspeed_video_release()
1391 struct aspeed_video *video = vb2_get_drv_priv(q); in aspeed_video_queue_setup() local
1394 if (sizes[0] < video->max_compressed_size) in aspeed_video_queue_setup()
1401 sizes[0] = video->max_compressed_size; in aspeed_video_queue_setup()
1408 struct aspeed_video *video = vb2_get_drv_priv(vb->vb2_queue); in aspeed_video_buf_prepare() local
1410 if (vb2_plane_size(vb, 0) < video->max_compressed_size) in aspeed_video_buf_prepare()
1420 struct aspeed_video *video = vb2_get_drv_priv(q); in aspeed_video_start_streaming() local
1422 video->sequence = 0; in aspeed_video_start_streaming()
1424 rc = aspeed_video_start_frame(video); in aspeed_video_start_streaming()
1426 aspeed_video_bufs_done(video, VB2_BUF_STATE_QUEUED); in aspeed_video_start_streaming()
1430 set_bit(VIDEO_STREAMING, &video->flags); in aspeed_video_start_streaming()
1437 struct aspeed_video *video = vb2_get_drv_priv(q); in aspeed_video_stop_streaming() local
1439 clear_bit(VIDEO_STREAMING, &video->flags); in aspeed_video_stop_streaming()
1441 rc = wait_event_timeout(video->wait, in aspeed_video_stop_streaming()
1442 !test_bit(VIDEO_FRAME_INPRG, &video->flags), in aspeed_video_stop_streaming()
1445 dev_dbg(video->dev, "Timed out when stopping streaming\n"); in aspeed_video_stop_streaming()
1451 aspeed_video_off(video); in aspeed_video_stop_streaming()
1452 aspeed_video_on(video); in aspeed_video_stop_streaming()
1454 aspeed_video_init_regs(video); in aspeed_video_stop_streaming()
1456 aspeed_video_get_resolution(video); in aspeed_video_stop_streaming()
1459 aspeed_video_bufs_done(video, VB2_BUF_STATE_ERROR); in aspeed_video_stop_streaming()
1465 struct aspeed_video *video = vb2_get_drv_priv(vb->vb2_queue); in aspeed_video_buf_queue() local
1470 spin_lock_irqsave(&video->lock, flags); in aspeed_video_buf_queue()
1471 empty = list_empty(&video->buffers); in aspeed_video_buf_queue()
1472 list_add_tail(&avb->link, &video->buffers); in aspeed_video_buf_queue()
1473 spin_unlock_irqrestore(&video->lock, flags); in aspeed_video_buf_queue()
1475 if (test_bit(VIDEO_STREAMING, &video->flags) && in aspeed_video_buf_queue()
1476 !test_bit(VIDEO_FRAME_INPRG, &video->flags) && empty) in aspeed_video_buf_queue()
1477 aspeed_video_start_frame(video); in aspeed_video_buf_queue()
1490 static int aspeed_video_setup_video(struct aspeed_video *video) in aspeed_video_setup_video() argument
1494 struct v4l2_device *v4l2_dev = &video->v4l2_dev; in aspeed_video_setup_video()
1495 struct vb2_queue *vbq = &video->queue; in aspeed_video_setup_video()
1496 struct video_device *vdev = &video->vdev; in aspeed_video_setup_video()
1499 video->pix_fmt.pixelformat = V4L2_PIX_FMT_JPEG; in aspeed_video_setup_video()
1500 video->pix_fmt.field = V4L2_FIELD_NONE; in aspeed_video_setup_video()
1501 video->pix_fmt.colorspace = V4L2_COLORSPACE_SRGB; in aspeed_video_setup_video()
1502 video->pix_fmt.quantization = V4L2_QUANTIZATION_FULL_RANGE; in aspeed_video_setup_video()
1503 video->v4l2_input_status = V4L2_IN_ST_NO_SIGNAL; in aspeed_video_setup_video()
1505 rc = v4l2_device_register(video->dev, v4l2_dev); in aspeed_video_setup_video()
1507 dev_err(video->dev, "Failed to register v4l2 device\n"); in aspeed_video_setup_video()
1511 v4l2_ctrl_handler_init(&video->ctrl_handler, 2); in aspeed_video_setup_video()
1512 v4l2_ctrl_new_std(&video->ctrl_handler, &aspeed_video_ctrl_ops, in aspeed_video_setup_video()
1515 v4l2_ctrl_new_std_menu(&video->ctrl_handler, &aspeed_video_ctrl_ops, in aspeed_video_setup_video()
1520 if (video->ctrl_handler.error) { in aspeed_video_setup_video()
1521 v4l2_ctrl_handler_free(&video->ctrl_handler); in aspeed_video_setup_video()
1524 dev_err(video->dev, "Failed to init controls: %d\n", in aspeed_video_setup_video()
1525 video->ctrl_handler.error); in aspeed_video_setup_video()
1529 v4l2_dev->ctrl_handler = &video->ctrl_handler; in aspeed_video_setup_video()
1534 vbq->lock = &video->video_lock; in aspeed_video_setup_video()
1537 vbq->drv_priv = video; in aspeed_video_setup_video()
1544 v4l2_ctrl_handler_free(&video->ctrl_handler); in aspeed_video_setup_video()
1547 dev_err(video->dev, "Failed to init vb2 queue\n"); in aspeed_video_setup_video()
1561 vdev->lock = &video->video_lock; in aspeed_video_setup_video()
1563 video_set_drvdata(vdev, video); in aspeed_video_setup_video()
1567 v4l2_ctrl_handler_free(&video->ctrl_handler); in aspeed_video_setup_video()
1570 dev_err(video->dev, "Failed to register video device\n"); in aspeed_video_setup_video()
1577 static int aspeed_video_init(struct aspeed_video *video) in aspeed_video_init() argument
1581 struct device *dev = video->dev; in aspeed_video_init()
1590 IRQF_ONESHOT, DEVICE_NAME, video); in aspeed_video_init()
1596 video->eclk = devm_clk_get(dev, "eclk"); in aspeed_video_init()
1597 if (IS_ERR(video->eclk)) { in aspeed_video_init()
1599 return PTR_ERR(video->eclk); in aspeed_video_init()
1602 rc = clk_prepare(video->eclk); in aspeed_video_init()
1606 video->vclk = devm_clk_get(dev, "vclk"); in aspeed_video_init()
1607 if (IS_ERR(video->vclk)) { in aspeed_video_init()
1609 rc = PTR_ERR(video->vclk); in aspeed_video_init()
1613 rc = clk_prepare(video->vclk); in aspeed_video_init()
1625 if (!aspeed_video_alloc_buf(video, &video->jpeg, in aspeed_video_init()
1632 aspeed_video_init_jpeg_table(video->jpeg.virt, video->yuv420); in aspeed_video_init()
1638 clk_unprepare(video->vclk); in aspeed_video_init()
1640 clk_unprepare(video->eclk); in aspeed_video_init()
1649 struct aspeed_video *video = kzalloc(sizeof(*video), GFP_KERNEL); in aspeed_video_probe() local
1651 if (!video) in aspeed_video_probe()
1654 video->frame_rate = 30; in aspeed_video_probe()
1655 video->dev = &pdev->dev; in aspeed_video_probe()
1656 spin_lock_init(&video->lock); in aspeed_video_probe()
1657 mutex_init(&video->video_lock); in aspeed_video_probe()
1658 init_waitqueue_head(&video->wait); in aspeed_video_probe()
1659 INIT_DELAYED_WORK(&video->res_work, aspeed_video_resolution_work); in aspeed_video_probe()
1660 INIT_LIST_HEAD(&video->buffers); in aspeed_video_probe()
1664 video->base = devm_ioremap_resource(video->dev, res); in aspeed_video_probe()
1666 if (IS_ERR(video->base)) in aspeed_video_probe()
1667 return PTR_ERR(video->base); in aspeed_video_probe()
1669 rc = aspeed_video_init(video); in aspeed_video_probe()
1673 rc = aspeed_video_setup_video(video); in aspeed_video_probe()
1684 struct aspeed_video *video = to_aspeed_video(v4l2_dev); in aspeed_video_remove() local
1686 aspeed_video_off(video); in aspeed_video_remove()
1688 clk_unprepare(video->vclk); in aspeed_video_remove()
1689 clk_unprepare(video->eclk); in aspeed_video_remove()
1691 video_unregister_device(&video->vdev); in aspeed_video_remove()
1693 vb2_queue_release(&video->queue); in aspeed_video_remove()
1695 v4l2_ctrl_handler_free(&video->ctrl_handler); in aspeed_video_remove()
1699 dma_free_coherent(video->dev, VE_JPEG_HEADER_SIZE, video->jpeg.virt, in aspeed_video_remove()
1700 video->jpeg.dma); in aspeed_video_remove()
1708 { .compatible = "aspeed,ast2400-video-engine" },
1709 { .compatible = "aspeed,ast2500-video-engine" },
1725 MODULE_DESCRIPTION("ASPEED Video Engine Driver");