Lines Matching full:video
34 #define DEVICE_NAME "aspeed-video"
425 static void aspeed_video_update(struct aspeed_video *video, u32 reg, u32 clear, in aspeed_video_update() argument
428 u32 t = readl(video->base + reg); in aspeed_video_update()
433 writel(t, video->base + reg); in aspeed_video_update()
434 dev_dbg(video->dev, "update %03x[%08x -> %08x]\n", reg, before, in aspeed_video_update()
435 readl(video->base + reg)); in aspeed_video_update()
438 static u32 aspeed_video_read(struct aspeed_video *video, u32 reg) in aspeed_video_read() argument
440 u32 t = readl(video->base + reg); in aspeed_video_read()
442 dev_dbg(video->dev, "read %03x[%08x]\n", reg, t); in aspeed_video_read()
446 static void aspeed_video_write(struct aspeed_video *video, u32 reg, u32 val) in aspeed_video_write() argument
448 writel(val, video->base + reg); in aspeed_video_write()
449 dev_dbg(video->dev, "write %03x[%08x]\n", reg, in aspeed_video_write()
450 readl(video->base + reg)); in aspeed_video_write()
453 static int aspeed_video_start_frame(struct aspeed_video *video) in aspeed_video_start_frame() argument
458 u32 seq_ctrl = aspeed_video_read(video, VE_SEQ_CTRL); in aspeed_video_start_frame()
460 if (video->v4l2_input_status) { in aspeed_video_start_frame()
461 dev_dbg(video->dev, "No signal; don't start frame\n"); in aspeed_video_start_frame()
467 dev_dbg(video->dev, "Engine busy; don't start frame\n"); in aspeed_video_start_frame()
471 spin_lock_irqsave(&video->lock, flags); in aspeed_video_start_frame()
472 buf = list_first_entry_or_null(&video->buffers, in aspeed_video_start_frame()
475 spin_unlock_irqrestore(&video->lock, flags); in aspeed_video_start_frame()
476 dev_dbg(video->dev, "No buffers; don't start frame\n"); in aspeed_video_start_frame()
480 set_bit(VIDEO_FRAME_INPRG, &video->flags); in aspeed_video_start_frame()
482 spin_unlock_irqrestore(&video->lock, flags); in aspeed_video_start_frame()
484 aspeed_video_write(video, VE_COMP_PROC_OFFSET, 0); in aspeed_video_start_frame()
485 aspeed_video_write(video, VE_COMP_OFFSET, 0); in aspeed_video_start_frame()
486 aspeed_video_write(video, VE_COMP_ADDR, addr); in aspeed_video_start_frame()
488 aspeed_video_update(video, VE_INTERRUPT_CTRL, 0, in aspeed_video_start_frame()
491 aspeed_video_update(video, VE_SEQ_CTRL, 0, in aspeed_video_start_frame()
497 static void aspeed_video_enable_mode_detect(struct aspeed_video *video) in aspeed_video_enable_mode_detect() argument
500 aspeed_video_update(video, VE_INTERRUPT_CTRL, 0, in aspeed_video_enable_mode_detect()
504 aspeed_video_update(video, VE_SEQ_CTRL, in aspeed_video_enable_mode_detect()
508 aspeed_video_update(video, VE_SEQ_CTRL, 0, VE_SEQ_CTRL_TRIG_MODE_DET); in aspeed_video_enable_mode_detect()
511 static void aspeed_video_off(struct aspeed_video *video) in aspeed_video_off() argument
513 if (!test_bit(VIDEO_CLOCKS_ON, &video->flags)) in aspeed_video_off()
517 aspeed_video_write(video, VE_INTERRUPT_CTRL, 0); in aspeed_video_off()
518 aspeed_video_write(video, VE_INTERRUPT_STATUS, 0xffffffff); in aspeed_video_off()
521 clk_disable(video->eclk); in aspeed_video_off()
522 clk_disable(video->vclk); in aspeed_video_off()
524 clear_bit(VIDEO_CLOCKS_ON, &video->flags); in aspeed_video_off()
527 static void aspeed_video_on(struct aspeed_video *video) in aspeed_video_on() argument
529 if (test_bit(VIDEO_CLOCKS_ON, &video->flags)) in aspeed_video_on()
533 clk_enable(video->vclk); in aspeed_video_on()
534 clk_enable(video->eclk); in aspeed_video_on()
536 set_bit(VIDEO_CLOCKS_ON, &video->flags); in aspeed_video_on()
539 static void aspeed_video_bufs_done(struct aspeed_video *video, in aspeed_video_bufs_done() argument
545 spin_lock_irqsave(&video->lock, flags); in aspeed_video_bufs_done()
546 list_for_each_entry(buf, &video->buffers, link) in aspeed_video_bufs_done()
548 INIT_LIST_HEAD(&video->buffers); in aspeed_video_bufs_done()
549 spin_unlock_irqrestore(&video->lock, flags); in aspeed_video_bufs_done()
552 static void aspeed_video_irq_res_change(struct aspeed_video *video, ulong delay) in aspeed_video_irq_res_change() argument
554 dev_dbg(video->dev, "Resolution changed; resetting\n"); in aspeed_video_irq_res_change()
556 set_bit(VIDEO_RES_CHANGE, &video->flags); in aspeed_video_irq_res_change()
557 clear_bit(VIDEO_FRAME_INPRG, &video->flags); in aspeed_video_irq_res_change()
559 video->v4l2_input_status = V4L2_IN_ST_NO_SIGNAL; in aspeed_video_irq_res_change()
561 aspeed_video_off(video); in aspeed_video_irq_res_change()
562 aspeed_video_bufs_done(video, VB2_BUF_STATE_ERROR); in aspeed_video_irq_res_change()
564 schedule_delayed_work(&video->res_work, delay); in aspeed_video_irq_res_change()
569 struct aspeed_video *video = arg; in aspeed_video_irq() local
570 u32 sts = aspeed_video_read(video, VE_INTERRUPT_STATUS); in aspeed_video_irq()
577 aspeed_video_irq_res_change(video, 0); in aspeed_video_irq()
582 if (test_bit(VIDEO_RES_DETECT, &video->flags)) { in aspeed_video_irq()
583 aspeed_video_update(video, VE_INTERRUPT_CTRL, in aspeed_video_irq()
585 aspeed_video_write(video, VE_INTERRUPT_STATUS, in aspeed_video_irq()
588 set_bit(VIDEO_MODE_DETECT_DONE, &video->flags); in aspeed_video_irq()
589 wake_up_interruptible_all(&video->wait); in aspeed_video_irq()
595 aspeed_video_irq_res_change(video, in aspeed_video_irq()
603 u32 frame_size = aspeed_video_read(video, in aspeed_video_irq()
604 video->comp_size_read); in aspeed_video_irq()
606 spin_lock(&video->lock); in aspeed_video_irq()
607 clear_bit(VIDEO_FRAME_INPRG, &video->flags); in aspeed_video_irq()
608 buf = list_first_entry_or_null(&video->buffers, in aspeed_video_irq()
614 if (!list_is_last(&buf->link, &video->buffers)) { in aspeed_video_irq()
616 buf->vb.sequence = video->sequence++; in aspeed_video_irq()
623 spin_unlock(&video->lock); in aspeed_video_irq()
625 aspeed_video_update(video, VE_SEQ_CTRL, in aspeed_video_irq()
629 aspeed_video_update(video, VE_INTERRUPT_CTRL, in aspeed_video_irq()
631 aspeed_video_write(video, VE_INTERRUPT_STATUS, in aspeed_video_irq()
634 if (test_bit(VIDEO_STREAMING, &video->flags) && buf) in aspeed_video_irq()
635 aspeed_video_start_frame(video); in aspeed_video_irq()
651 static void aspeed_video_check_and_set_polarity(struct aspeed_video *video) in aspeed_video_check_and_set_polarity() argument
659 sts = aspeed_video_read(video, VE_MODE_DETECT_STATUS); in aspeed_video_check_and_set_polarity()
671 ctrl = aspeed_video_read(video, VE_CTRL); in aspeed_video_check_and_set_polarity()
675 video->detected_timings.polarities &= in aspeed_video_check_and_set_polarity()
679 video->detected_timings.polarities |= in aspeed_video_check_and_set_polarity()
685 video->detected_timings.polarities &= in aspeed_video_check_and_set_polarity()
689 video->detected_timings.polarities |= in aspeed_video_check_and_set_polarity()
693 aspeed_video_write(video, VE_CTRL, ctrl); in aspeed_video_check_and_set_polarity()
696 static bool aspeed_video_alloc_buf(struct aspeed_video *video, in aspeed_video_alloc_buf() argument
700 addr->virt = dma_alloc_coherent(video->dev, size, &addr->dma, in aspeed_video_alloc_buf()
709 static void aspeed_video_free_buf(struct aspeed_video *video, in aspeed_video_free_buf() argument
712 dma_free_coherent(video->dev, addr->size, addr->virt, addr->dma); in aspeed_video_free_buf()
724 static void aspeed_video_calc_compressed_size(struct aspeed_video *video, in aspeed_video_calc_compressed_size() argument
734 video->max_compressed_size = UINT_MAX; in aspeed_video_calc_compressed_size()
743 if (size < video->max_compressed_size) { in aspeed_video_calc_compressed_size()
745 video->max_compressed_size = size; in aspeed_video_calc_compressed_size()
750 aspeed_video_write(video, VE_STREAM_BUF_SIZE, in aspeed_video_calc_compressed_size()
753 dev_dbg(video->dev, "Max compressed size: %x\n", in aspeed_video_calc_compressed_size()
754 video->max_compressed_size); in aspeed_video_calc_compressed_size()
759 static void aspeed_video_get_resolution(struct aspeed_video *video) in aspeed_video_get_resolution() argument
768 struct v4l2_bt_timings *det = &video->detected_timings; in aspeed_video_get_resolution()
772 video->v4l2_input_status = V4L2_IN_ST_NO_SIGNAL; in aspeed_video_get_resolution()
781 set_bit(VIDEO_RES_DETECT, &video->flags); in aspeed_video_get_resolution()
782 aspeed_video_update(video, VE_CTRL, in aspeed_video_get_resolution()
784 aspeed_video_enable_mode_detect(video); in aspeed_video_get_resolution()
786 rc = wait_event_interruptible_timeout(video->wait, in aspeed_video_get_resolution()
787 res_check(video), in aspeed_video_get_resolution()
790 dev_dbg(video->dev, "Timed out; first mode detect\n"); in aspeed_video_get_resolution()
791 clear_bit(VIDEO_RES_DETECT, &video->flags); in aspeed_video_get_resolution()
795 aspeed_video_check_and_set_polarity(video); in aspeed_video_get_resolution()
797 aspeed_video_enable_mode_detect(video); in aspeed_video_get_resolution()
799 rc = wait_event_interruptible_timeout(video->wait, in aspeed_video_get_resolution()
800 res_check(video), in aspeed_video_get_resolution()
802 clear_bit(VIDEO_RES_DETECT, &video->flags); in aspeed_video_get_resolution()
804 dev_dbg(video->dev, "Timed out; second mode detect\n"); in aspeed_video_get_resolution()
808 src_lr_edge = aspeed_video_read(video, VE_SRC_LR_EDGE_DET); in aspeed_video_get_resolution()
809 src_tb_edge = aspeed_video_read(video, VE_SRC_TB_EDGE_DET); in aspeed_video_get_resolution()
810 mds = aspeed_video_read(video, VE_MODE_DETECT_STATUS); in aspeed_video_get_resolution()
811 sync = aspeed_video_read(video, VE_SYNC_STATUS); in aspeed_video_get_resolution()
813 video->frame_bottom = (src_tb_edge & VE_SRC_TB_EDGE_DET_BOT) >> in aspeed_video_get_resolution()
815 video->frame_top = src_tb_edge & VE_SRC_TB_EDGE_DET_TOP; in aspeed_video_get_resolution()
816 det->vfrontporch = video->frame_top; in aspeed_video_get_resolution()
818 VE_MODE_DETECT_V_LINES_SHF) - video->frame_bottom; in aspeed_video_get_resolution()
821 if (video->frame_top > video->frame_bottom) in aspeed_video_get_resolution()
824 video->frame_right = (src_lr_edge & VE_SRC_LR_EDGE_DET_RT) >> in aspeed_video_get_resolution()
826 video->frame_left = src_lr_edge & VE_SRC_LR_EDGE_DET_LEFT; in aspeed_video_get_resolution()
827 det->hfrontporch = video->frame_left; in aspeed_video_get_resolution()
829 video->frame_right; in aspeed_video_get_resolution()
831 if (video->frame_left > video->frame_right) in aspeed_video_get_resolution()
838 dev_dbg(video->dev, "Invalid resolution detected\n"); in aspeed_video_get_resolution()
842 det->height = (video->frame_bottom - video->frame_top) + 1; in aspeed_video_get_resolution()
843 det->width = (video->frame_right - video->frame_left) + 1; in aspeed_video_get_resolution()
844 video->v4l2_input_status = 0; in aspeed_video_get_resolution()
850 aspeed_video_update(video, VE_INTERRUPT_CTRL, 0, in aspeed_video_get_resolution()
852 aspeed_video_update(video, VE_SEQ_CTRL, 0, in aspeed_video_get_resolution()
855 dev_dbg(video->dev, "Got resolution: %dx%d\n", det->width, in aspeed_video_get_resolution()
859 static void aspeed_video_set_resolution(struct aspeed_video *video) in aspeed_video_set_resolution() argument
861 struct v4l2_bt_timings *act = &video->active_timings; in aspeed_video_set_resolution()
865 aspeed_video_calc_compressed_size(video, size); in aspeed_video_set_resolution()
867 if (video->active_timings.width == 1680) { in aspeed_video_set_resolution()
874 * and to get better access speed from video engine. in aspeed_video_set_resolution()
876 aspeed_video_write(video, VE_CAP_WINDOW, in aspeed_video_set_resolution()
878 size += (1728 - 1680) * video->active_timings.height; in aspeed_video_set_resolution()
880 aspeed_video_write(video, VE_CAP_WINDOW, in aspeed_video_set_resolution()
883 aspeed_video_write(video, VE_COMP_WINDOW, in aspeed_video_set_resolution()
885 aspeed_video_write(video, VE_SRC_SCANLINE_OFFSET, act->width * 4); in aspeed_video_set_resolution()
889 aspeed_video_write(video, VE_TGS_0, in aspeed_video_set_resolution()
891 video->frame_left - 1) | in aspeed_video_set_resolution()
893 video->frame_right)); in aspeed_video_set_resolution()
894 aspeed_video_write(video, VE_TGS_1, in aspeed_video_set_resolution()
895 FIELD_PREP(VE_TGS_FIRST, video->frame_top) | in aspeed_video_set_resolution()
897 video->frame_bottom + 1)); in aspeed_video_set_resolution()
898 aspeed_video_update(video, VE_CTRL, 0, VE_CTRL_INT_DE); in aspeed_video_set_resolution()
900 aspeed_video_update(video, VE_CTRL, 0, VE_CTRL_DIRECT_FETCH); in aspeed_video_set_resolution()
905 if (size != video->srcs[0].size) { in aspeed_video_set_resolution()
906 if (video->srcs[0].size) in aspeed_video_set_resolution()
907 aspeed_video_free_buf(video, &video->srcs[0]); in aspeed_video_set_resolution()
908 if (video->srcs[1].size) in aspeed_video_set_resolution()
909 aspeed_video_free_buf(video, &video->srcs[1]); in aspeed_video_set_resolution()
911 if (!aspeed_video_alloc_buf(video, &video->srcs[0], size)) in aspeed_video_set_resolution()
913 if (!aspeed_video_alloc_buf(video, &video->srcs[1], size)) in aspeed_video_set_resolution()
916 aspeed_video_write(video, VE_SRC0_ADDR, video->srcs[0].dma); in aspeed_video_set_resolution()
917 aspeed_video_write(video, VE_SRC1_ADDR, video->srcs[1].dma); in aspeed_video_set_resolution()
923 dev_err(video->dev, "Failed to allocate source buffers\n"); in aspeed_video_set_resolution()
925 if (video->srcs[0].size) in aspeed_video_set_resolution()
926 aspeed_video_free_buf(video, &video->srcs[0]); in aspeed_video_set_resolution()
929 static void aspeed_video_init_regs(struct aspeed_video *video) in aspeed_video_init_regs() argument
932 FIELD_PREP(VE_COMP_CTRL_DCT_LUM, video->jpeg_quality) | in aspeed_video_init_regs()
933 FIELD_PREP(VE_COMP_CTRL_DCT_CHR, video->jpeg_quality | 0x10); in aspeed_video_init_regs()
935 u32 seq_ctrl = video->jpeg_mode; in aspeed_video_init_regs()
937 if (video->frame_rate) in aspeed_video_init_regs()
938 ctrl |= FIELD_PREP(VE_CTRL_FRC, video->frame_rate); in aspeed_video_init_regs()
940 if (video->yuv420) in aspeed_video_init_regs()
944 aspeed_video_write(video, VE_PROTECTION_KEY, VE_PROTECTION_KEY_UNLOCK); in aspeed_video_init_regs()
947 aspeed_video_write(video, VE_INTERRUPT_CTRL, 0); in aspeed_video_init_regs()
948 aspeed_video_write(video, VE_INTERRUPT_STATUS, 0xffffffff); in aspeed_video_init_regs()
951 aspeed_video_write(video, VE_COMP_PROC_OFFSET, 0); in aspeed_video_init_regs()
952 aspeed_video_write(video, VE_COMP_OFFSET, 0); in aspeed_video_init_regs()
954 aspeed_video_write(video, VE_JPEG_ADDR, video->jpeg.dma); in aspeed_video_init_regs()
957 aspeed_video_write(video, VE_SEQ_CTRL, seq_ctrl); in aspeed_video_init_regs()
958 aspeed_video_write(video, VE_CTRL, ctrl); in aspeed_video_init_regs()
959 aspeed_video_write(video, VE_COMP_CTRL, comp_ctrl); in aspeed_video_init_regs()
962 aspeed_video_write(video, VE_SCALING_FACTOR, 0x10001000); in aspeed_video_init_regs()
963 aspeed_video_write(video, VE_SCALING_FILTER0, 0x00200000); in aspeed_video_init_regs()
964 aspeed_video_write(video, VE_SCALING_FILTER1, 0x00200000); in aspeed_video_init_regs()
965 aspeed_video_write(video, VE_SCALING_FILTER2, 0x00200000); in aspeed_video_init_regs()
966 aspeed_video_write(video, VE_SCALING_FILTER3, 0x00200000); in aspeed_video_init_regs()
969 aspeed_video_write(video, VE_MODE_DETECT, 0x22666500); in aspeed_video_init_regs()
972 static void aspeed_video_start(struct aspeed_video *video) in aspeed_video_start() argument
974 aspeed_video_on(video); in aspeed_video_start()
976 aspeed_video_init_regs(video); in aspeed_video_start()
979 aspeed_video_get_resolution(video); in aspeed_video_start()
982 video->active_timings = video->detected_timings; in aspeed_video_start()
983 aspeed_video_set_resolution(video); in aspeed_video_start()
985 video->pix_fmt.width = video->active_timings.width; in aspeed_video_start()
986 video->pix_fmt.height = video->active_timings.height; in aspeed_video_start()
987 video->pix_fmt.sizeimage = video->max_compressed_size; in aspeed_video_start()
990 static void aspeed_video_stop(struct aspeed_video *video) in aspeed_video_stop() argument
992 set_bit(VIDEO_STOPPED, &video->flags); in aspeed_video_stop()
993 cancel_delayed_work_sync(&video->res_work); in aspeed_video_stop()
995 aspeed_video_off(video); in aspeed_video_stop()
997 if (video->srcs[0].size) in aspeed_video_stop()
998 aspeed_video_free_buf(video, &video->srcs[0]); in aspeed_video_stop()
1000 if (video->srcs[1].size) in aspeed_video_stop()
1001 aspeed_video_free_buf(video, &video->srcs[1]); in aspeed_video_stop()
1003 video->v4l2_input_status = V4L2_IN_ST_NO_SIGNAL; in aspeed_video_stop()
1004 video->flags = 0; in aspeed_video_stop()
1011 strscpy(cap->card, "Aspeed Video Engine", sizeof(cap->card)); in aspeed_video_querycap()
1032 struct aspeed_video *video = video_drvdata(file); in aspeed_video_get_format() local
1034 f->fmt.pix = video->pix_fmt; in aspeed_video_get_format()
1042 struct aspeed_video *video = video_drvdata(file); in aspeed_video_enum_input() local
1050 inp->status = video->v4l2_input_status; in aspeed_video_enum_input()
1073 struct aspeed_video *video = video_drvdata(file); in aspeed_video_get_parm() local
1078 if (!video->frame_rate) in aspeed_video_get_parm()
1081 a->parm.capture.timeperframe.denominator = video->frame_rate; in aspeed_video_get_parm()
1090 struct aspeed_video *video = video_drvdata(file); in aspeed_video_set_parm() local
1105 if (video->frame_rate != frame_rate) { in aspeed_video_set_parm()
1106 video->frame_rate = frame_rate; in aspeed_video_set_parm()
1107 aspeed_video_update(video, VE_CTRL, VE_CTRL_FRC, in aspeed_video_set_parm()
1117 struct aspeed_video *video = video_drvdata(file); in aspeed_video_enum_framesizes() local
1125 fsize->discrete.width = video->pix_fmt.width; in aspeed_video_enum_framesizes()
1126 fsize->discrete.height = video->pix_fmt.height; in aspeed_video_enum_framesizes()
1135 struct aspeed_video *video = video_drvdata(file); in aspeed_video_enum_frameintervals() local
1140 if (fival->width != video->detected_timings.width || in aspeed_video_enum_frameintervals()
1141 fival->height != video->detected_timings.height) in aspeed_video_enum_frameintervals()
1161 struct aspeed_video *video = video_drvdata(file); in aspeed_video_set_dv_timings() local
1163 if (timings->bt.width == video->active_timings.width && in aspeed_video_set_dv_timings()
1164 timings->bt.height == video->active_timings.height) in aspeed_video_set_dv_timings()
1167 if (vb2_is_busy(&video->queue)) in aspeed_video_set_dv_timings()
1170 video->active_timings = timings->bt; in aspeed_video_set_dv_timings()
1172 aspeed_video_set_resolution(video); in aspeed_video_set_dv_timings()
1174 video->pix_fmt.width = timings->bt.width; in aspeed_video_set_dv_timings()
1175 video->pix_fmt.height = timings->bt.height; in aspeed_video_set_dv_timings()
1176 video->pix_fmt.sizeimage = video->max_compressed_size; in aspeed_video_set_dv_timings()
1186 struct aspeed_video *video = video_drvdata(file); in aspeed_video_get_dv_timings() local
1189 timings->bt = video->active_timings; in aspeed_video_get_dv_timings()
1198 struct aspeed_video *video = video_drvdata(file); in aspeed_video_query_dv_timings() local
1206 if (test_bit(VIDEO_RES_CHANGE, &video->flags)) in aspeed_video_query_dv_timings()
1209 rc = wait_event_interruptible(video->wait, in aspeed_video_query_dv_timings()
1211 &video->flags)); in aspeed_video_query_dv_timings()
1217 timings->bt = video->detected_timings; in aspeed_video_query_dv_timings()
1219 return video->v4l2_input_status ? -ENOLINK : 0; in aspeed_video_query_dv_timings()
1285 static void aspeed_video_update_jpeg_quality(struct aspeed_video *video) in aspeed_video_update_jpeg_quality() argument
1287 u32 comp_ctrl = FIELD_PREP(VE_COMP_CTRL_DCT_LUM, video->jpeg_quality) | in aspeed_video_update_jpeg_quality()
1288 FIELD_PREP(VE_COMP_CTRL_DCT_CHR, video->jpeg_quality | 0x10); in aspeed_video_update_jpeg_quality()
1290 aspeed_video_update(video, VE_COMP_CTRL, in aspeed_video_update_jpeg_quality()
1295 static void aspeed_video_update_subsampling(struct aspeed_video *video) in aspeed_video_update_subsampling() argument
1297 if (video->jpeg.virt) in aspeed_video_update_subsampling()
1298 aspeed_video_init_jpeg_table(video->jpeg.virt, video->yuv420); in aspeed_video_update_subsampling()
1300 if (video->yuv420) in aspeed_video_update_subsampling()
1301 aspeed_video_update(video, VE_SEQ_CTRL, 0, VE_SEQ_CTRL_YUV420); in aspeed_video_update_subsampling()
1303 aspeed_video_update(video, VE_SEQ_CTRL, VE_SEQ_CTRL_YUV420, 0); in aspeed_video_update_subsampling()
1308 struct aspeed_video *video = container_of(ctrl->handler, in aspeed_video_set_ctrl() local
1314 video->jpeg_quality = ctrl->val; in aspeed_video_set_ctrl()
1315 aspeed_video_update_jpeg_quality(video); in aspeed_video_set_ctrl()
1319 video->yuv420 = true; in aspeed_video_set_ctrl()
1320 aspeed_video_update_subsampling(video); in aspeed_video_set_ctrl()
1322 video->yuv420 = false; in aspeed_video_set_ctrl()
1323 aspeed_video_update_subsampling(video); in aspeed_video_set_ctrl()
1340 struct aspeed_video *video = container_of(dwork, struct aspeed_video, in aspeed_video_resolution_work() local
1343 aspeed_video_on(video); in aspeed_video_resolution_work()
1346 if (test_bit(VIDEO_STOPPED, &video->flags)) in aspeed_video_resolution_work()
1349 aspeed_video_init_regs(video); in aspeed_video_resolution_work()
1351 aspeed_video_get_resolution(video); in aspeed_video_resolution_work()
1353 if (video->detected_timings.width != video->active_timings.width || in aspeed_video_resolution_work()
1354 video->detected_timings.height != video->active_timings.height) { in aspeed_video_resolution_work()
1360 v4l2_event_queue(&video->vdev, &ev); in aspeed_video_resolution_work()
1361 } else if (test_bit(VIDEO_STREAMING, &video->flags)) { in aspeed_video_resolution_work()
1363 aspeed_video_start_frame(video); in aspeed_video_resolution_work()
1367 clear_bit(VIDEO_RES_CHANGE, &video->flags); in aspeed_video_resolution_work()
1368 wake_up_interruptible_all(&video->wait); in aspeed_video_resolution_work()
1374 struct aspeed_video *video = video_drvdata(file); in aspeed_video_open() local
1376 mutex_lock(&video->video_lock); in aspeed_video_open()
1380 mutex_unlock(&video->video_lock); in aspeed_video_open()
1385 aspeed_video_start(video); in aspeed_video_open()
1387 mutex_unlock(&video->video_lock); in aspeed_video_open()
1395 struct aspeed_video *video = video_drvdata(file); in aspeed_video_release() local
1397 mutex_lock(&video->video_lock); in aspeed_video_release()
1400 aspeed_video_stop(video); in aspeed_video_release()
1404 mutex_unlock(&video->video_lock); in aspeed_video_release()
1425 struct aspeed_video *video = vb2_get_drv_priv(q); in aspeed_video_queue_setup() local
1428 if (sizes[0] < video->max_compressed_size) in aspeed_video_queue_setup()
1435 sizes[0] = video->max_compressed_size; in aspeed_video_queue_setup()
1442 struct aspeed_video *video = vb2_get_drv_priv(vb->vb2_queue); in aspeed_video_buf_prepare() local
1444 if (vb2_plane_size(vb, 0) < video->max_compressed_size) in aspeed_video_buf_prepare()
1454 struct aspeed_video *video = vb2_get_drv_priv(q); in aspeed_video_start_streaming() local
1456 video->sequence = 0; in aspeed_video_start_streaming()
1458 rc = aspeed_video_start_frame(video); in aspeed_video_start_streaming()
1460 aspeed_video_bufs_done(video, VB2_BUF_STATE_QUEUED); in aspeed_video_start_streaming()
1464 set_bit(VIDEO_STREAMING, &video->flags); in aspeed_video_start_streaming()
1471 struct aspeed_video *video = vb2_get_drv_priv(q); in aspeed_video_stop_streaming() local
1473 clear_bit(VIDEO_STREAMING, &video->flags); in aspeed_video_stop_streaming()
1475 rc = wait_event_timeout(video->wait, in aspeed_video_stop_streaming()
1476 !test_bit(VIDEO_FRAME_INPRG, &video->flags), in aspeed_video_stop_streaming()
1479 dev_dbg(video->dev, "Timed out when stopping streaming\n"); in aspeed_video_stop_streaming()
1485 aspeed_video_off(video); in aspeed_video_stop_streaming()
1486 aspeed_video_on(video); in aspeed_video_stop_streaming()
1488 aspeed_video_init_regs(video); in aspeed_video_stop_streaming()
1490 aspeed_video_get_resolution(video); in aspeed_video_stop_streaming()
1493 aspeed_video_bufs_done(video, VB2_BUF_STATE_ERROR); in aspeed_video_stop_streaming()
1499 struct aspeed_video *video = vb2_get_drv_priv(vb->vb2_queue); in aspeed_video_buf_queue() local
1504 spin_lock_irqsave(&video->lock, flags); in aspeed_video_buf_queue()
1505 empty = list_empty(&video->buffers); in aspeed_video_buf_queue()
1506 list_add_tail(&avb->link, &video->buffers); in aspeed_video_buf_queue()
1507 spin_unlock_irqrestore(&video->lock, flags); in aspeed_video_buf_queue()
1509 if (test_bit(VIDEO_STREAMING, &video->flags) && in aspeed_video_buf_queue()
1510 !test_bit(VIDEO_FRAME_INPRG, &video->flags) && empty) in aspeed_video_buf_queue()
1511 aspeed_video_start_frame(video); in aspeed_video_buf_queue()
1524 static int aspeed_video_setup_video(struct aspeed_video *video) in aspeed_video_setup_video() argument
1528 struct v4l2_device *v4l2_dev = &video->v4l2_dev; in aspeed_video_setup_video()
1529 struct vb2_queue *vbq = &video->queue; in aspeed_video_setup_video()
1530 struct video_device *vdev = &video->vdev; in aspeed_video_setup_video()
1533 video->pix_fmt.pixelformat = V4L2_PIX_FMT_JPEG; in aspeed_video_setup_video()
1534 video->pix_fmt.field = V4L2_FIELD_NONE; in aspeed_video_setup_video()
1535 video->pix_fmt.colorspace = V4L2_COLORSPACE_SRGB; in aspeed_video_setup_video()
1536 video->pix_fmt.quantization = V4L2_QUANTIZATION_FULL_RANGE; in aspeed_video_setup_video()
1537 video->v4l2_input_status = V4L2_IN_ST_NO_SIGNAL; in aspeed_video_setup_video()
1539 rc = v4l2_device_register(video->dev, v4l2_dev); in aspeed_video_setup_video()
1541 dev_err(video->dev, "Failed to register v4l2 device\n"); in aspeed_video_setup_video()
1545 v4l2_ctrl_handler_init(&video->ctrl_handler, 2); in aspeed_video_setup_video()
1546 v4l2_ctrl_new_std(&video->ctrl_handler, &aspeed_video_ctrl_ops, in aspeed_video_setup_video()
1549 v4l2_ctrl_new_std_menu(&video->ctrl_handler, &aspeed_video_ctrl_ops, in aspeed_video_setup_video()
1554 rc = video->ctrl_handler.error; in aspeed_video_setup_video()
1556 v4l2_ctrl_handler_free(&video->ctrl_handler); in aspeed_video_setup_video()
1559 dev_err(video->dev, "Failed to init controls: %d\n", rc); in aspeed_video_setup_video()
1563 v4l2_dev->ctrl_handler = &video->ctrl_handler; in aspeed_video_setup_video()
1568 vbq->lock = &video->video_lock; in aspeed_video_setup_video()
1571 vbq->drv_priv = video; in aspeed_video_setup_video()
1578 v4l2_ctrl_handler_free(&video->ctrl_handler); in aspeed_video_setup_video()
1581 dev_err(video->dev, "Failed to init vb2 queue\n"); in aspeed_video_setup_video()
1595 vdev->lock = &video->video_lock; in aspeed_video_setup_video()
1597 video_set_drvdata(vdev, video); in aspeed_video_setup_video()
1600 v4l2_ctrl_handler_free(&video->ctrl_handler); in aspeed_video_setup_video()
1603 dev_err(video->dev, "Failed to register video device\n"); in aspeed_video_setup_video()
1610 static int aspeed_video_init(struct aspeed_video *video) in aspeed_video_init() argument
1614 struct device *dev = video->dev; in aspeed_video_init()
1623 IRQF_ONESHOT, DEVICE_NAME, video); in aspeed_video_init()
1629 video->eclk = devm_clk_get(dev, "eclk"); in aspeed_video_init()
1630 if (IS_ERR(video->eclk)) { in aspeed_video_init()
1632 return PTR_ERR(video->eclk); in aspeed_video_init()
1635 rc = clk_prepare(video->eclk); in aspeed_video_init()
1639 video->vclk = devm_clk_get(dev, "vclk"); in aspeed_video_init()
1640 if (IS_ERR(video->vclk)) { in aspeed_video_init()
1642 rc = PTR_ERR(video->vclk); in aspeed_video_init()
1646 rc = clk_prepare(video->vclk); in aspeed_video_init()
1658 if (!aspeed_video_alloc_buf(video, &video->jpeg, in aspeed_video_init()
1665 aspeed_video_init_jpeg_table(video->jpeg.virt, video->yuv420); in aspeed_video_init()
1671 clk_unprepare(video->vclk); in aspeed_video_init()
1673 clk_unprepare(video->eclk); in aspeed_video_init()
1679 { .compatible = "aspeed,ast2400-video-engine", .data = &ast2400_config },
1680 { .compatible = "aspeed,ast2500-video-engine", .data = &ast2500_config },
1681 { .compatible = "aspeed,ast2600-video-engine", .data = &ast2600_config },
1690 struct aspeed_video *video; in aspeed_video_probe() local
1693 video = devm_kzalloc(&pdev->dev, sizeof(*video), GFP_KERNEL); in aspeed_video_probe()
1694 if (!video) in aspeed_video_probe()
1697 video->base = devm_platform_ioremap_resource(pdev, 0); in aspeed_video_probe()
1698 if (IS_ERR(video->base)) in aspeed_video_probe()
1699 return PTR_ERR(video->base); in aspeed_video_probe()
1706 video->jpeg_mode = config->jpeg_mode; in aspeed_video_probe()
1707 video->comp_size_read = config->comp_size_read; in aspeed_video_probe()
1709 video->frame_rate = 30; in aspeed_video_probe()
1710 video->dev = &pdev->dev; in aspeed_video_probe()
1711 spin_lock_init(&video->lock); in aspeed_video_probe()
1712 mutex_init(&video->video_lock); in aspeed_video_probe()
1713 init_waitqueue_head(&video->wait); in aspeed_video_probe()
1714 INIT_DELAYED_WORK(&video->res_work, aspeed_video_resolution_work); in aspeed_video_probe()
1715 INIT_LIST_HEAD(&video->buffers); in aspeed_video_probe()
1717 rc = aspeed_video_init(video); in aspeed_video_probe()
1721 rc = aspeed_video_setup_video(video); in aspeed_video_probe()
1723 clk_unprepare(video->vclk); in aspeed_video_probe()
1724 clk_unprepare(video->eclk); in aspeed_video_probe()
1735 struct aspeed_video *video = to_aspeed_video(v4l2_dev); in aspeed_video_remove() local
1737 aspeed_video_off(video); in aspeed_video_remove()
1739 clk_unprepare(video->vclk); in aspeed_video_remove()
1740 clk_unprepare(video->eclk); in aspeed_video_remove()
1742 vb2_video_unregister_device(&video->vdev); in aspeed_video_remove()
1744 v4l2_ctrl_handler_free(&video->ctrl_handler); in aspeed_video_remove()
1748 dma_free_coherent(video->dev, VE_JPEG_HEADER_SIZE, video->jpeg.virt, in aspeed_video_remove()
1749 video->jpeg.dma); in aspeed_video_remove()
1767 MODULE_DESCRIPTION("ASPEED Video Engine Driver");