Lines Matching full:video

35 #include <uapi/linux/aspeed-video.h>
39 #define DEVICE_NAME "aspeed-video"
267 * flags: holds the state of video
274 * format: holds the video format
279 * frame_bottom: end position of video data in vertical direction
280 * frame_left: start position of video data in horizontal direction
281 * frame_right: end position of video data in horizontal direction
282 * frame_top: start position of video data in vertical direction
491 static bool aspeed_video_alloc_buf(struct aspeed_video *video,
495 static void aspeed_video_free_buf(struct aspeed_video *video,
536 static void aspeed_video_update(struct aspeed_video *video, u32 reg, u32 clear, in aspeed_video_update() argument
539 u32 t = readl(video->base + reg); in aspeed_video_update()
544 writel(t, video->base + reg); in aspeed_video_update()
545 v4l2_dbg(3, debug, &video->v4l2_dev, "update %03x[%08x -> %08x]\n", in aspeed_video_update()
546 reg, before, readl(video->base + reg)); in aspeed_video_update()
549 static u32 aspeed_video_read(struct aspeed_video *video, u32 reg) in aspeed_video_read() argument
551 u32 t = readl(video->base + reg); in aspeed_video_read()
553 v4l2_dbg(3, debug, &video->v4l2_dev, "read %03x[%08x]\n", reg, t); in aspeed_video_read()
557 static void aspeed_video_write(struct aspeed_video *video, u32 reg, u32 val) in aspeed_video_write() argument
559 writel(val, video->base + reg); in aspeed_video_write()
560 v4l2_dbg(3, debug, &video->v4l2_dev, "write %03x[%08x]\n", reg, in aspeed_video_write()
561 readl(video->base + reg)); in aspeed_video_write()
579 static int aspeed_video_start_frame(struct aspeed_video *video) in aspeed_video_start_frame() argument
584 u32 seq_ctrl = aspeed_video_read(video, VE_SEQ_CTRL); in aspeed_video_start_frame()
585 bool bcd_buf_need = (video->format != VIDEO_FMT_STANDARD); in aspeed_video_start_frame()
587 if (video->v4l2_input_status) { in aspeed_video_start_frame()
588 v4l2_dbg(1, debug, &video->v4l2_dev, "No signal; don't start frame\n"); in aspeed_video_start_frame()
594 v4l2_dbg(1, debug, &video->v4l2_dev, "Engine busy; don't start frame\n"); in aspeed_video_start_frame()
598 if (bcd_buf_need && !video->bcd.size) { in aspeed_video_start_frame()
599 if (!aspeed_video_alloc_buf(video, &video->bcd, in aspeed_video_start_frame()
601 dev_err(video->dev, "Failed to allocate BCD buffer\n"); in aspeed_video_start_frame()
602 dev_err(video->dev, "don't start frame\n"); in aspeed_video_start_frame()
605 aspeed_video_write(video, VE_BCD_ADDR, video->bcd.dma); in aspeed_video_start_frame()
606 v4l2_dbg(1, debug, &video->v4l2_dev, "bcd addr(%pad) size(%d)\n", in aspeed_video_start_frame()
607 &video->bcd.dma, video->bcd.size); in aspeed_video_start_frame()
608 } else if (!bcd_buf_need && video->bcd.size) { in aspeed_video_start_frame()
609 aspeed_video_free_buf(video, &video->bcd); in aspeed_video_start_frame()
612 spin_lock_irqsave(&video->lock, flags); in aspeed_video_start_frame()
613 buf = list_first_entry_or_null(&video->buffers, in aspeed_video_start_frame()
616 spin_unlock_irqrestore(&video->lock, flags); in aspeed_video_start_frame()
617 v4l2_dbg(1, debug, &video->v4l2_dev, "No buffers; don't start frame\n"); in aspeed_video_start_frame()
621 set_bit(VIDEO_FRAME_INPRG, &video->flags); in aspeed_video_start_frame()
623 spin_unlock_irqrestore(&video->lock, flags); in aspeed_video_start_frame()
625 aspeed_video_write(video, VE_COMP_PROC_OFFSET, 0); in aspeed_video_start_frame()
626 aspeed_video_write(video, VE_COMP_OFFSET, 0); in aspeed_video_start_frame()
627 aspeed_video_write(video, VE_COMP_ADDR, addr); in aspeed_video_start_frame()
629 aspeed_video_update(video, VE_INTERRUPT_CTRL, 0, in aspeed_video_start_frame()
632 video->perf.last_sample = ktime_get(); in aspeed_video_start_frame()
634 aspeed_video_update(video, VE_SEQ_CTRL, 0, in aspeed_video_start_frame()
640 static void aspeed_video_enable_mode_detect(struct aspeed_video *video) in aspeed_video_enable_mode_detect() argument
643 aspeed_video_update(video, VE_INTERRUPT_CTRL, 0, in aspeed_video_enable_mode_detect()
647 aspeed_video_update(video, VE_SEQ_CTRL, in aspeed_video_enable_mode_detect()
651 aspeed_video_update(video, VE_SEQ_CTRL, 0, VE_SEQ_CTRL_TRIG_MODE_DET); in aspeed_video_enable_mode_detect()
654 static void aspeed_video_off(struct aspeed_video *video) in aspeed_video_off() argument
656 if (!test_bit(VIDEO_CLOCKS_ON, &video->flags)) in aspeed_video_off()
660 aspeed_video_write(video, VE_INTERRUPT_CTRL, 0); in aspeed_video_off()
661 aspeed_video_write(video, VE_INTERRUPT_STATUS, 0xffffffff); in aspeed_video_off()
664 clk_disable(video->eclk); in aspeed_video_off()
665 clk_disable(video->vclk); in aspeed_video_off()
667 clear_bit(VIDEO_CLOCKS_ON, &video->flags); in aspeed_video_off()
670 static void aspeed_video_on(struct aspeed_video *video) in aspeed_video_on() argument
672 if (test_bit(VIDEO_CLOCKS_ON, &video->flags)) in aspeed_video_on()
676 clk_enable(video->vclk); in aspeed_video_on()
677 clk_enable(video->eclk); in aspeed_video_on()
679 set_bit(VIDEO_CLOCKS_ON, &video->flags); in aspeed_video_on()
682 static void aspeed_video_bufs_done(struct aspeed_video *video, in aspeed_video_bufs_done() argument
688 spin_lock_irqsave(&video->lock, flags); in aspeed_video_bufs_done()
689 list_for_each_entry(buf, &video->buffers, link) in aspeed_video_bufs_done()
691 INIT_LIST_HEAD(&video->buffers); in aspeed_video_bufs_done()
692 spin_unlock_irqrestore(&video->lock, flags); in aspeed_video_bufs_done()
695 static void aspeed_video_irq_res_change(struct aspeed_video *video, ulong delay) in aspeed_video_irq_res_change() argument
697 v4l2_dbg(1, debug, &video->v4l2_dev, "Resolution changed; resetting\n"); in aspeed_video_irq_res_change()
699 set_bit(VIDEO_RES_CHANGE, &video->flags); in aspeed_video_irq_res_change()
700 clear_bit(VIDEO_FRAME_INPRG, &video->flags); in aspeed_video_irq_res_change()
702 video->v4l2_input_status = V4L2_IN_ST_NO_SIGNAL; in aspeed_video_irq_res_change()
704 aspeed_video_off(video); in aspeed_video_irq_res_change()
705 aspeed_video_bufs_done(video, VB2_BUF_STATE_ERROR); in aspeed_video_irq_res_change()
707 schedule_delayed_work(&video->res_work, delay); in aspeed_video_irq_res_change()
730 struct aspeed_video *video = arg; in aspeed_video_irq() local
731 u32 sts = aspeed_video_read(video, VE_INTERRUPT_STATUS); in aspeed_video_irq()
737 sts &= aspeed_video_read(video, VE_INTERRUPT_CTRL); in aspeed_video_irq()
739 v4l2_dbg(2, debug, &video->v4l2_dev, "irq sts=%#x %s%s%s%s\n", sts, in aspeed_video_irq()
750 aspeed_video_irq_res_change(video, 0); in aspeed_video_irq()
755 if (test_bit(VIDEO_RES_DETECT, &video->flags)) { in aspeed_video_irq()
756 aspeed_video_update(video, VE_INTERRUPT_CTRL, in aspeed_video_irq()
758 aspeed_video_write(video, VE_INTERRUPT_STATUS, in aspeed_video_irq()
761 set_bit(VIDEO_MODE_DETECT_DONE, &video->flags); in aspeed_video_irq()
762 wake_up_interruptible_all(&video->wait); in aspeed_video_irq()
768 aspeed_video_irq_res_change(video, in aspeed_video_irq()
777 u32 frame_size = aspeed_video_read(video, in aspeed_video_irq()
778 video->comp_size_read); in aspeed_video_irq()
780 update_perf(&video->perf); in aspeed_video_irq()
782 spin_lock(&video->lock); in aspeed_video_irq()
783 clear_bit(VIDEO_FRAME_INPRG, &video->flags); in aspeed_video_irq()
784 buf = list_first_entry_or_null(&video->buffers, in aspeed_video_irq()
795 if (video->format == VIDEO_FMT_STANDARD && in aspeed_video_irq()
796 list_is_last(&buf->link, &video->buffers)) { in aspeed_video_irq()
798 v4l2_dbg(1, debug, &video->v4l2_dev, "skip to keep last frame updated\n"); in aspeed_video_irq()
801 buf->vb.sequence = video->sequence++; in aspeed_video_irq()
806 empty = list_empty(&video->buffers); in aspeed_video_irq()
809 spin_unlock(&video->lock); in aspeed_video_irq()
811 aspeed_video_update(video, VE_SEQ_CTRL, in aspeed_video_irq()
815 aspeed_video_update(video, VE_INTERRUPT_CTRL, in aspeed_video_irq()
817 aspeed_video_write(video, VE_INTERRUPT_STATUS, in aspeed_video_irq()
821 aspeed_video_swap_src_buf(video); in aspeed_video_irq()
823 if (test_bit(VIDEO_STREAMING, &video->flags) && !empty) in aspeed_video_irq()
824 aspeed_video_start_frame(video); in aspeed_video_irq()
830 static void aspeed_video_check_and_set_polarity(struct aspeed_video *video) in aspeed_video_check_and_set_polarity() argument
838 sts = aspeed_video_read(video, VE_MODE_DETECT_STATUS); in aspeed_video_check_and_set_polarity()
850 ctrl = aspeed_video_read(video, VE_CTRL); in aspeed_video_check_and_set_polarity()
854 video->detected_timings.polarities &= in aspeed_video_check_and_set_polarity()
858 video->detected_timings.polarities |= in aspeed_video_check_and_set_polarity()
864 video->detected_timings.polarities &= in aspeed_video_check_and_set_polarity()
868 video->detected_timings.polarities |= in aspeed_video_check_and_set_polarity()
872 aspeed_video_write(video, VE_CTRL, ctrl); in aspeed_video_check_and_set_polarity()
875 static bool aspeed_video_alloc_buf(struct aspeed_video *video, in aspeed_video_alloc_buf() argument
879 addr->virt = dma_alloc_coherent(video->dev, size, &addr->dma, in aspeed_video_alloc_buf()
888 static void aspeed_video_free_buf(struct aspeed_video *video, in aspeed_video_free_buf() argument
891 dma_free_coherent(video->dev, addr->size, addr->virt, addr->dma); in aspeed_video_free_buf()
903 static void aspeed_video_calc_compressed_size(struct aspeed_video *video, in aspeed_video_calc_compressed_size() argument
913 video->max_compressed_size = UINT_MAX; in aspeed_video_calc_compressed_size()
922 if (size < video->max_compressed_size) { in aspeed_video_calc_compressed_size()
924 video->max_compressed_size = size; in aspeed_video_calc_compressed_size()
929 aspeed_video_write(video, VE_STREAM_BUF_SIZE, in aspeed_video_calc_compressed_size()
932 v4l2_dbg(1, debug, &video->v4l2_dev, "Max compressed size: %#x\n", in aspeed_video_calc_compressed_size()
933 video->max_compressed_size); in aspeed_video_calc_compressed_size()
997 * of sync would be larger than video's active area if negative. in aspeed_video_get_timings()
1031 static void aspeed_video_get_resolution(struct aspeed_video *video) in aspeed_video_get_resolution() argument
1039 struct v4l2_bt_timings *det = &video->detected_timings; in aspeed_video_get_resolution()
1043 video->v4l2_input_status = V4L2_IN_ST_NO_SIGNAL; in aspeed_video_get_resolution()
1044 memset(&video->perf, 0, sizeof(video->perf)); in aspeed_video_get_resolution()
1053 set_bit(VIDEO_RES_DETECT, &video->flags); in aspeed_video_get_resolution()
1054 aspeed_video_update(video, VE_CTRL, in aspeed_video_get_resolution()
1056 aspeed_video_enable_mode_detect(video); in aspeed_video_get_resolution()
1058 rc = wait_event_interruptible_timeout(video->wait, in aspeed_video_get_resolution()
1059 res_check(video), in aspeed_video_get_resolution()
1062 v4l2_dbg(1, debug, &video->v4l2_dev, "Timed out; first mode detect\n"); in aspeed_video_get_resolution()
1063 clear_bit(VIDEO_RES_DETECT, &video->flags); in aspeed_video_get_resolution()
1067 mds = aspeed_video_read(video, VE_MODE_DETECT_STATUS); in aspeed_video_get_resolution()
1074 aspeed_video_check_and_set_polarity(video); in aspeed_video_get_resolution()
1076 aspeed_video_enable_mode_detect(video); in aspeed_video_get_resolution()
1078 rc = wait_event_interruptible_timeout(video->wait, in aspeed_video_get_resolution()
1079 res_check(video), in aspeed_video_get_resolution()
1081 clear_bit(VIDEO_RES_DETECT, &video->flags); in aspeed_video_get_resolution()
1083 v4l2_dbg(1, debug, &video->v4l2_dev, "Timed out; second mode detect\n"); in aspeed_video_get_resolution()
1087 src_lr_edge = aspeed_video_read(video, VE_SRC_LR_EDGE_DET); in aspeed_video_get_resolution()
1088 src_tb_edge = aspeed_video_read(video, VE_SRC_TB_EDGE_DET); in aspeed_video_get_resolution()
1090 video->frame_bottom = FIELD_GET(VE_SRC_TB_EDGE_DET_BOT, src_tb_edge); in aspeed_video_get_resolution()
1091 video->frame_top = FIELD_GET(VE_SRC_TB_EDGE_DET_TOP, src_tb_edge); in aspeed_video_get_resolution()
1093 if (video->frame_top > video->frame_bottom) in aspeed_video_get_resolution()
1096 video->frame_right = FIELD_GET(VE_SRC_LR_EDGE_DET_RT, src_lr_edge); in aspeed_video_get_resolution()
1097 video->frame_left = FIELD_GET(VE_SRC_LR_EDGE_DET_LEFT, src_lr_edge); in aspeed_video_get_resolution()
1099 if (video->frame_left > video->frame_right) in aspeed_video_get_resolution()
1106 v4l2_dbg(1, debug, &video->v4l2_dev, "Invalid resolution detected\n"); in aspeed_video_get_resolution()
1110 det->height = (video->frame_bottom - video->frame_top) + 1; in aspeed_video_get_resolution()
1111 det->width = (video->frame_right - video->frame_left) + 1; in aspeed_video_get_resolution()
1112 video->v4l2_input_status = 0; in aspeed_video_get_resolution()
1114 aspeed_video_get_timings(video, det); in aspeed_video_get_resolution()
1120 aspeed_video_update(video, VE_INTERRUPT_CTRL, 0, in aspeed_video_get_resolution()
1122 aspeed_video_update(video, VE_SEQ_CTRL, 0, in aspeed_video_get_resolution()
1125 v4l2_dbg(1, debug, &video->v4l2_dev, "Got resolution: %dx%d\n", in aspeed_video_get_resolution()
1129 static void aspeed_video_set_resolution(struct aspeed_video *video) in aspeed_video_set_resolution() argument
1131 struct v4l2_bt_timings *act = &video->active_timings; in aspeed_video_set_resolution()
1135 aspeed_video_calc_compressed_size(video, size); in aspeed_video_set_resolution()
1144 * and to get better access speed from video engine. in aspeed_video_set_resolution()
1148 aspeed_video_write(video, VE_CAP_WINDOW, width << 16 | act->height); in aspeed_video_set_resolution()
1151 aspeed_video_write(video, VE_CAP_WINDOW, in aspeed_video_set_resolution()
1154 aspeed_video_write(video, VE_COMP_WINDOW, in aspeed_video_set_resolution()
1156 aspeed_video_write(video, VE_SRC_SCANLINE_OFFSET, act->width * 4); in aspeed_video_set_resolution()
1160 v4l2_dbg(1, debug, &video->v4l2_dev, "Capture: Sync Mode\n"); in aspeed_video_set_resolution()
1161 aspeed_video_write(video, VE_TGS_0, in aspeed_video_set_resolution()
1163 video->frame_left - 1) | in aspeed_video_set_resolution()
1165 video->frame_right)); in aspeed_video_set_resolution()
1166 aspeed_video_write(video, VE_TGS_1, in aspeed_video_set_resolution()
1167 FIELD_PREP(VE_TGS_FIRST, video->frame_top) | in aspeed_video_set_resolution()
1169 video->frame_bottom + 1)); in aspeed_video_set_resolution()
1170 aspeed_video_update(video, VE_CTRL, in aspeed_video_set_resolution()
1174 v4l2_dbg(1, debug, &video->v4l2_dev, "Capture: Direct Mode\n"); in aspeed_video_set_resolution()
1175 aspeed_video_update(video, VE_CTRL, in aspeed_video_set_resolution()
1182 if (size != video->srcs[0].size) { in aspeed_video_set_resolution()
1183 if (video->srcs[0].size) in aspeed_video_set_resolution()
1184 aspeed_video_free_buf(video, &video->srcs[0]); in aspeed_video_set_resolution()
1185 if (video->srcs[1].size) in aspeed_video_set_resolution()
1186 aspeed_video_free_buf(video, &video->srcs[1]); in aspeed_video_set_resolution()
1188 if (!aspeed_video_alloc_buf(video, &video->srcs[0], size)) in aspeed_video_set_resolution()
1190 if (!aspeed_video_alloc_buf(video, &video->srcs[1], size)) in aspeed_video_set_resolution()
1193 v4l2_dbg(1, debug, &video->v4l2_dev, "src buf0 addr(%pad) size(%d)\n", in aspeed_video_set_resolution()
1194 &video->srcs[0].dma, video->srcs[0].size); in aspeed_video_set_resolution()
1195 v4l2_dbg(1, debug, &video->v4l2_dev, "src buf1 addr(%pad) size(%d)\n", in aspeed_video_set_resolution()
1196 &video->srcs[1].dma, video->srcs[1].size); in aspeed_video_set_resolution()
1197 aspeed_video_write(video, VE_SRC0_ADDR, video->srcs[0].dma); in aspeed_video_set_resolution()
1198 aspeed_video_write(video, VE_SRC1_ADDR, video->srcs[1].dma); in aspeed_video_set_resolution()
1204 dev_err(video->dev, "Failed to allocate source buffers\n"); in aspeed_video_set_resolution()
1206 if (video->srcs[0].size) in aspeed_video_set_resolution()
1207 aspeed_video_free_buf(video, &video->srcs[0]); in aspeed_video_set_resolution()
1210 static void aspeed_video_update_regs(struct aspeed_video *video) in aspeed_video_update_regs() argument
1212 u8 jpeg_hq_quality = clamp((int)video->jpeg_hq_quality - 1, 0, in aspeed_video_update_regs()
1214 u32 comp_ctrl = FIELD_PREP(VE_COMP_CTRL_DCT_LUM, video->jpeg_quality) | in aspeed_video_update_regs()
1215 FIELD_PREP(VE_COMP_CTRL_DCT_CHR, video->jpeg_quality | 0x10) | in aspeed_video_update_regs()
1216 FIELD_PREP(VE_COMP_CTRL_EN_HQ, video->hq_mode) | in aspeed_video_update_regs()
1222 v4l2_dbg(1, debug, &video->v4l2_dev, "framerate(%d)\n", in aspeed_video_update_regs()
1223 video->frame_rate); in aspeed_video_update_regs()
1224 v4l2_dbg(1, debug, &video->v4l2_dev, "jpeg format(%s) subsample(%s)\n", in aspeed_video_update_regs()
1225 format_str[video->format], in aspeed_video_update_regs()
1226 video->yuv420 ? "420" : "444"); in aspeed_video_update_regs()
1227 v4l2_dbg(1, debug, &video->v4l2_dev, "compression quality(%d)\n", in aspeed_video_update_regs()
1228 video->jpeg_quality); in aspeed_video_update_regs()
1229 v4l2_dbg(1, debug, &video->v4l2_dev, "hq_mode(%s) hq_quality(%d)\n", in aspeed_video_update_regs()
1230 video->hq_mode ? "on" : "off", video->jpeg_hq_quality); in aspeed_video_update_regs()
1232 if (video->format == VIDEO_FMT_ASPEED) in aspeed_video_update_regs()
1233 aspeed_video_update(video, VE_BCD_CTRL, 0, VE_BCD_CTRL_EN_BCD); in aspeed_video_update_regs()
1235 aspeed_video_update(video, VE_BCD_CTRL, VE_BCD_CTRL_EN_BCD, 0); in aspeed_video_update_regs()
1237 if (video->frame_rate) in aspeed_video_update_regs()
1238 ctrl |= FIELD_PREP(VE_CTRL_FRC, video->frame_rate); in aspeed_video_update_regs()
1240 if (video->format == VIDEO_FMT_STANDARD) { in aspeed_video_update_regs()
1241 comp_ctrl &= ~FIELD_PREP(VE_COMP_CTRL_EN_HQ, video->hq_mode); in aspeed_video_update_regs()
1242 seq_ctrl |= video->jpeg_mode; in aspeed_video_update_regs()
1245 if (video->yuv420) in aspeed_video_update_regs()
1248 if (video->jpeg.virt) in aspeed_video_update_regs()
1249 aspeed_video_update_jpeg_table(video->jpeg.virt, video->yuv420); in aspeed_video_update_regs()
1252 aspeed_video_update(video, VE_SEQ_CTRL, in aspeed_video_update_regs()
1253 video->jpeg_mode | VE_SEQ_CTRL_YUV420, in aspeed_video_update_regs()
1255 aspeed_video_update(video, VE_CTRL, VE_CTRL_FRC, ctrl); in aspeed_video_update_regs()
1256 aspeed_video_update(video, VE_COMP_CTRL, in aspeed_video_update_regs()
1264 static void aspeed_video_init_regs(struct aspeed_video *video) in aspeed_video_init_regs() argument
1270 aspeed_video_write(video, VE_PROTECTION_KEY, VE_PROTECTION_KEY_UNLOCK); in aspeed_video_init_regs()
1273 aspeed_video_write(video, VE_INTERRUPT_CTRL, 0); in aspeed_video_init_regs()
1274 aspeed_video_write(video, VE_INTERRUPT_STATUS, 0xffffffff); in aspeed_video_init_regs()
1277 aspeed_video_write(video, VE_COMP_PROC_OFFSET, 0); in aspeed_video_init_regs()
1278 aspeed_video_write(video, VE_COMP_OFFSET, 0); in aspeed_video_init_regs()
1280 aspeed_video_write(video, VE_JPEG_ADDR, video->jpeg.dma); in aspeed_video_init_regs()
1283 aspeed_video_write(video, VE_CTRL, ctrl); in aspeed_video_init_regs()
1284 aspeed_video_write(video, VE_COMP_CTRL, VE_COMP_CTRL_RSVD); in aspeed_video_init_regs()
1287 aspeed_video_write(video, VE_SCALING_FACTOR, 0x10001000); in aspeed_video_init_regs()
1288 aspeed_video_write(video, VE_SCALING_FILTER0, 0x00200000); in aspeed_video_init_regs()
1289 aspeed_video_write(video, VE_SCALING_FILTER1, 0x00200000); in aspeed_video_init_regs()
1290 aspeed_video_write(video, VE_SCALING_FILTER2, 0x00200000); in aspeed_video_init_regs()
1291 aspeed_video_write(video, VE_SCALING_FILTER3, 0x00200000); in aspeed_video_init_regs()
1294 aspeed_video_write(video, VE_MODE_DETECT, in aspeed_video_init_regs()
1301 aspeed_video_write(video, VE_BCD_CTRL, 0); in aspeed_video_init_regs()
1304 static void aspeed_video_start(struct aspeed_video *video) in aspeed_video_start() argument
1306 aspeed_video_on(video); in aspeed_video_start()
1308 aspeed_video_init_regs(video); in aspeed_video_start()
1311 aspeed_video_get_resolution(video); in aspeed_video_start()
1314 video->active_timings = video->detected_timings; in aspeed_video_start()
1315 aspeed_video_set_resolution(video); in aspeed_video_start()
1317 video->pix_fmt.width = video->active_timings.width; in aspeed_video_start()
1318 video->pix_fmt.height = video->active_timings.height; in aspeed_video_start()
1319 video->pix_fmt.sizeimage = video->max_compressed_size; in aspeed_video_start()
1322 static void aspeed_video_stop(struct aspeed_video *video) in aspeed_video_stop() argument
1324 set_bit(VIDEO_STOPPED, &video->flags); in aspeed_video_stop()
1325 cancel_delayed_work_sync(&video->res_work); in aspeed_video_stop()
1327 aspeed_video_off(video); in aspeed_video_stop()
1329 if (video->srcs[0].size) in aspeed_video_stop()
1330 aspeed_video_free_buf(video, &video->srcs[0]); in aspeed_video_stop()
1332 if (video->srcs[1].size) in aspeed_video_stop()
1333 aspeed_video_free_buf(video, &video->srcs[1]); in aspeed_video_stop()
1335 if (video->bcd.size) in aspeed_video_stop()
1336 aspeed_video_free_buf(video, &video->bcd); in aspeed_video_stop()
1338 video->v4l2_input_status = V4L2_IN_ST_NO_SIGNAL; in aspeed_video_stop()
1339 video->flags = 0; in aspeed_video_stop()
1346 strscpy(cap->card, "Aspeed Video Engine", sizeof(cap->card)); in aspeed_video_querycap()
1356 struct aspeed_video *video = video_drvdata(file); in aspeed_video_enum_format() local
1361 f->pixelformat = video->pix_fmt.pixelformat; in aspeed_video_enum_format()
1369 struct aspeed_video *video = video_drvdata(file); in aspeed_video_get_format() local
1371 f->fmt.pix = video->pix_fmt; in aspeed_video_get_format()
1379 struct aspeed_video *video = video_drvdata(file); in aspeed_video_set_format() local
1381 if (vb2_is_busy(&video->queue)) in aspeed_video_set_format()
1386 video->format = VIDEO_FMT_STANDARD; in aspeed_video_set_format()
1389 video->format = VIDEO_FMT_ASPEED; in aspeed_video_set_format()
1394 video->pix_fmt.pixelformat = f->fmt.pix.pixelformat; in aspeed_video_set_format()
1402 struct aspeed_video *video = video_drvdata(file); in aspeed_video_enum_input() local
1410 inp->status = video->v4l2_input_status; in aspeed_video_enum_input()
1433 struct aspeed_video *video = video_drvdata(file); in aspeed_video_get_parm() local
1438 if (!video->frame_rate) in aspeed_video_get_parm()
1441 a->parm.capture.timeperframe.denominator = video->frame_rate; in aspeed_video_get_parm()
1450 struct aspeed_video *video = video_drvdata(file); in aspeed_video_set_parm() local
1465 if (video->frame_rate != frame_rate) { in aspeed_video_set_parm()
1466 video->frame_rate = frame_rate; in aspeed_video_set_parm()
1467 aspeed_video_update(video, VE_CTRL, VE_CTRL_FRC, in aspeed_video_set_parm()
1477 struct aspeed_video *video = video_drvdata(file); in aspeed_video_enum_framesizes() local
1485 fsize->discrete.width = video->pix_fmt.width; in aspeed_video_enum_framesizes()
1486 fsize->discrete.height = video->pix_fmt.height; in aspeed_video_enum_framesizes()
1495 struct aspeed_video *video = video_drvdata(file); in aspeed_video_enum_frameintervals() local
1500 if (fival->width != video->detected_timings.width || in aspeed_video_enum_frameintervals()
1501 fival->height != video->detected_timings.height) in aspeed_video_enum_frameintervals()
1521 struct aspeed_video *video = video_drvdata(file); in aspeed_video_set_dv_timings() local
1523 if (timings->bt.width == video->active_timings.width && in aspeed_video_set_dv_timings()
1524 timings->bt.height == video->active_timings.height) in aspeed_video_set_dv_timings()
1527 if (vb2_is_busy(&video->queue)) in aspeed_video_set_dv_timings()
1530 video->active_timings = timings->bt; in aspeed_video_set_dv_timings()
1532 aspeed_video_set_resolution(video); in aspeed_video_set_dv_timings()
1534 video->pix_fmt.width = timings->bt.width; in aspeed_video_set_dv_timings()
1535 video->pix_fmt.height = timings->bt.height; in aspeed_video_set_dv_timings()
1536 video->pix_fmt.sizeimage = video->max_compressed_size; in aspeed_video_set_dv_timings()
1540 v4l2_dbg(1, debug, &video->v4l2_dev, "set new timings(%dx%d)\n", in aspeed_video_set_dv_timings()
1549 struct aspeed_video *video = video_drvdata(file); in aspeed_video_get_dv_timings() local
1552 timings->bt = video->active_timings; in aspeed_video_get_dv_timings()
1561 struct aspeed_video *video = video_drvdata(file); in aspeed_video_query_dv_timings() local
1569 if (test_bit(VIDEO_RES_CHANGE, &video->flags)) in aspeed_video_query_dv_timings()
1572 rc = wait_event_interruptible(video->wait, in aspeed_video_query_dv_timings()
1574 &video->flags)); in aspeed_video_query_dv_timings()
1580 timings->bt = video->detected_timings; in aspeed_video_query_dv_timings()
1582 return video->v4l2_input_status ? -ENOLINK : 0; in aspeed_video_query_dv_timings()
1650 struct aspeed_video *video = container_of(ctrl->handler, in aspeed_video_set_ctrl() local
1656 video->jpeg_quality = ctrl->val; in aspeed_video_set_ctrl()
1657 if (test_bit(VIDEO_STREAMING, &video->flags)) in aspeed_video_set_ctrl()
1658 aspeed_video_update_regs(video); in aspeed_video_set_ctrl()
1661 video->yuv420 = (ctrl->val == V4L2_JPEG_CHROMA_SUBSAMPLING_420); in aspeed_video_set_ctrl()
1662 if (test_bit(VIDEO_STREAMING, &video->flags)) in aspeed_video_set_ctrl()
1663 aspeed_video_update_regs(video); in aspeed_video_set_ctrl()
1666 video->hq_mode = ctrl->val; in aspeed_video_set_ctrl()
1667 if (test_bit(VIDEO_STREAMING, &video->flags)) in aspeed_video_set_ctrl()
1668 aspeed_video_update_regs(video); in aspeed_video_set_ctrl()
1671 video->jpeg_hq_quality = ctrl->val; in aspeed_video_set_ctrl()
1672 if (test_bit(VIDEO_STREAMING, &video->flags)) in aspeed_video_set_ctrl()
1673 aspeed_video_update_regs(video); in aspeed_video_set_ctrl()
1711 struct aspeed_video *video = container_of(dwork, struct aspeed_video, in aspeed_video_resolution_work() local
1714 aspeed_video_on(video); in aspeed_video_resolution_work()
1717 if (test_bit(VIDEO_STOPPED, &video->flags)) in aspeed_video_resolution_work()
1720 aspeed_video_init_regs(video); in aspeed_video_resolution_work()
1722 aspeed_video_update_regs(video); in aspeed_video_resolution_work()
1724 aspeed_video_get_resolution(video); in aspeed_video_resolution_work()
1726 if (video->detected_timings.width != video->active_timings.width || in aspeed_video_resolution_work()
1727 video->detected_timings.height != video->active_timings.height) { in aspeed_video_resolution_work()
1733 v4l2_dbg(1, debug, &video->v4l2_dev, "fire source change event\n"); in aspeed_video_resolution_work()
1734 v4l2_event_queue(&video->vdev, &ev); in aspeed_video_resolution_work()
1735 } else if (test_bit(VIDEO_STREAMING, &video->flags)) { in aspeed_video_resolution_work()
1737 aspeed_video_start_frame(video); in aspeed_video_resolution_work()
1741 clear_bit(VIDEO_RES_CHANGE, &video->flags); in aspeed_video_resolution_work()
1742 wake_up_interruptible_all(&video->wait); in aspeed_video_resolution_work()
1748 struct aspeed_video *video = video_drvdata(file); in aspeed_video_open() local
1750 mutex_lock(&video->video_lock); in aspeed_video_open()
1754 mutex_unlock(&video->video_lock); in aspeed_video_open()
1759 aspeed_video_start(video); in aspeed_video_open()
1761 mutex_unlock(&video->video_lock); in aspeed_video_open()
1769 struct aspeed_video *video = video_drvdata(file); in aspeed_video_release() local
1771 mutex_lock(&video->video_lock); in aspeed_video_release()
1774 aspeed_video_stop(video); in aspeed_video_release()
1778 mutex_unlock(&video->video_lock); in aspeed_video_release()
1799 struct aspeed_video *video = vb2_get_drv_priv(q); in aspeed_video_queue_setup() local
1802 if (sizes[0] < video->max_compressed_size) in aspeed_video_queue_setup()
1809 sizes[0] = video->max_compressed_size; in aspeed_video_queue_setup()
1816 struct aspeed_video *video = vb2_get_drv_priv(vb->vb2_queue); in aspeed_video_buf_prepare() local
1818 if (vb2_plane_size(vb, 0) < video->max_compressed_size) in aspeed_video_buf_prepare()
1828 struct aspeed_video *video = vb2_get_drv_priv(q); in aspeed_video_start_streaming() local
1830 video->sequence = 0; in aspeed_video_start_streaming()
1831 video->perf.duration_max = 0; in aspeed_video_start_streaming()
1832 video->perf.duration_min = 0xffffffff; in aspeed_video_start_streaming()
1834 aspeed_video_update_regs(video); in aspeed_video_start_streaming()
1836 rc = aspeed_video_start_frame(video); in aspeed_video_start_streaming()
1838 aspeed_video_bufs_done(video, VB2_BUF_STATE_QUEUED); in aspeed_video_start_streaming()
1842 set_bit(VIDEO_STREAMING, &video->flags); in aspeed_video_start_streaming()
1849 struct aspeed_video *video = vb2_get_drv_priv(q); in aspeed_video_stop_streaming() local
1851 clear_bit(VIDEO_STREAMING, &video->flags); in aspeed_video_stop_streaming()
1853 rc = wait_event_timeout(video->wait, in aspeed_video_stop_streaming()
1854 !test_bit(VIDEO_FRAME_INPRG, &video->flags), in aspeed_video_stop_streaming()
1857 v4l2_dbg(1, debug, &video->v4l2_dev, "Timed out when stopping streaming\n"); in aspeed_video_stop_streaming()
1863 aspeed_video_off(video); in aspeed_video_stop_streaming()
1864 aspeed_video_on(video); in aspeed_video_stop_streaming()
1866 aspeed_video_init_regs(video); in aspeed_video_stop_streaming()
1868 aspeed_video_get_resolution(video); in aspeed_video_stop_streaming()
1871 aspeed_video_bufs_done(video, VB2_BUF_STATE_ERROR); in aspeed_video_stop_streaming()
1877 struct aspeed_video *video = vb2_get_drv_priv(vb->vb2_queue); in aspeed_video_buf_queue() local
1882 spin_lock_irqsave(&video->lock, flags); in aspeed_video_buf_queue()
1883 empty = list_empty(&video->buffers); in aspeed_video_buf_queue()
1884 list_add_tail(&avb->link, &video->buffers); in aspeed_video_buf_queue()
1885 spin_unlock_irqrestore(&video->lock, flags); in aspeed_video_buf_queue()
1887 if (test_bit(VIDEO_STREAMING, &video->flags) && in aspeed_video_buf_queue()
1888 !test_bit(VIDEO_FRAME_INPRG, &video->flags) && empty) in aspeed_video_buf_queue()
1889 aspeed_video_start_frame(video); in aspeed_video_buf_queue()
1918 seq_printf(s, " %-20s:\t%s\n", "Video source", in aspeed_video_debugfs_show()
1967 static void aspeed_video_debugfs_remove(struct aspeed_video *video) in aspeed_video_debugfs_remove() argument
1973 static void aspeed_video_debugfs_create(struct aspeed_video *video) in aspeed_video_debugfs_create() argument
1976 video, in aspeed_video_debugfs_create()
1980 static void aspeed_video_debugfs_remove(struct aspeed_video *video) { } in aspeed_video_debugfs_remove() argument
1981 static void aspeed_video_debugfs_create(struct aspeed_video *video) { } in aspeed_video_debugfs_create() argument
1984 static int aspeed_video_setup_video(struct aspeed_video *video) in aspeed_video_setup_video() argument
1988 struct v4l2_device *v4l2_dev = &video->v4l2_dev; in aspeed_video_setup_video()
1989 struct vb2_queue *vbq = &video->queue; in aspeed_video_setup_video()
1990 struct video_device *vdev = &video->vdev; in aspeed_video_setup_video()
1991 struct v4l2_ctrl_handler *hdl = &video->ctrl_handler; in aspeed_video_setup_video()
1994 video->pix_fmt.pixelformat = V4L2_PIX_FMT_JPEG; in aspeed_video_setup_video()
1995 video->pix_fmt.field = V4L2_FIELD_NONE; in aspeed_video_setup_video()
1996 video->pix_fmt.colorspace = V4L2_COLORSPACE_SRGB; in aspeed_video_setup_video()
1997 video->pix_fmt.quantization = V4L2_QUANTIZATION_FULL_RANGE; in aspeed_video_setup_video()
1998 video->v4l2_input_status = V4L2_IN_ST_NO_SIGNAL; in aspeed_video_setup_video()
2000 rc = v4l2_device_register(video->dev, v4l2_dev); in aspeed_video_setup_video()
2002 dev_err(video->dev, "Failed to register v4l2 device\n"); in aspeed_video_setup_video()
2019 v4l2_ctrl_handler_free(&video->ctrl_handler); in aspeed_video_setup_video()
2022 dev_err(video->dev, "Failed to init controls: %d\n", rc); in aspeed_video_setup_video()
2031 vbq->lock = &video->video_lock; in aspeed_video_setup_video()
2034 vbq->drv_priv = video; in aspeed_video_setup_video()
2041 v4l2_ctrl_handler_free(&video->ctrl_handler); in aspeed_video_setup_video()
2044 dev_err(video->dev, "Failed to init vb2 queue\n"); in aspeed_video_setup_video()
2058 vdev->lock = &video->video_lock; in aspeed_video_setup_video()
2060 video_set_drvdata(vdev, video); in aspeed_video_setup_video()
2063 v4l2_ctrl_handler_free(&video->ctrl_handler); in aspeed_video_setup_video()
2066 dev_err(video->dev, "Failed to register video device\n"); in aspeed_video_setup_video()
2073 static int aspeed_video_init(struct aspeed_video *video) in aspeed_video_init() argument
2077 struct device *dev = video->dev; in aspeed_video_init()
2086 IRQF_ONESHOT, DEVICE_NAME, video); in aspeed_video_init()
2091 dev_info(video->dev, "irq %d\n", irq); in aspeed_video_init()
2093 video->eclk = devm_clk_get(dev, "eclk"); in aspeed_video_init()
2094 if (IS_ERR(video->eclk)) { in aspeed_video_init()
2096 return PTR_ERR(video->eclk); in aspeed_video_init()
2099 rc = clk_prepare(video->eclk); in aspeed_video_init()
2103 video->vclk = devm_clk_get(dev, "vclk"); in aspeed_video_init()
2104 if (IS_ERR(video->vclk)) { in aspeed_video_init()
2106 rc = PTR_ERR(video->vclk); in aspeed_video_init()
2110 rc = clk_prepare(video->vclk); in aspeed_video_init()
2122 if (!aspeed_video_alloc_buf(video, &video->jpeg, in aspeed_video_init()
2128 dev_info(video->dev, "alloc mem size(%d) at %pad for jpeg header\n", in aspeed_video_init()
2129 VE_JPEG_HEADER_SIZE, &video->jpeg.dma); in aspeed_video_init()
2131 aspeed_video_init_jpeg_table(video->jpeg.virt, video->yuv420); in aspeed_video_init()
2137 clk_unprepare(video->vclk); in aspeed_video_init()
2139 clk_unprepare(video->eclk); in aspeed_video_init()
2145 { .compatible = "aspeed,ast2400-video-engine", .data = &ast2400_config },
2146 { .compatible = "aspeed,ast2500-video-engine", .data = &ast2500_config },
2147 { .compatible = "aspeed,ast2600-video-engine", .data = &ast2600_config },
2155 struct aspeed_video *video; in aspeed_video_probe() local
2158 video = devm_kzalloc(&pdev->dev, sizeof(*video), GFP_KERNEL); in aspeed_video_probe()
2159 if (!video) in aspeed_video_probe()
2162 video->base = devm_platform_ioremap_resource(pdev, 0); in aspeed_video_probe()
2163 if (IS_ERR(video->base)) in aspeed_video_probe()
2164 return PTR_ERR(video->base); in aspeed_video_probe()
2170 video->jpeg_mode = config->jpeg_mode; in aspeed_video_probe()
2171 video->comp_size_read = config->comp_size_read; in aspeed_video_probe()
2173 video->frame_rate = 30; in aspeed_video_probe()
2174 video->jpeg_hq_quality = 1; in aspeed_video_probe()
2175 video->dev = &pdev->dev; in aspeed_video_probe()
2176 spin_lock_init(&video->lock); in aspeed_video_probe()
2177 mutex_init(&video->video_lock); in aspeed_video_probe()
2178 init_waitqueue_head(&video->wait); in aspeed_video_probe()
2179 INIT_DELAYED_WORK(&video->res_work, aspeed_video_resolution_work); in aspeed_video_probe()
2180 INIT_LIST_HEAD(&video->buffers); in aspeed_video_probe()
2182 rc = aspeed_video_init(video); in aspeed_video_probe()
2186 rc = aspeed_video_setup_video(video); in aspeed_video_probe()
2188 aspeed_video_free_buf(video, &video->jpeg); in aspeed_video_probe()
2189 clk_unprepare(video->vclk); in aspeed_video_probe()
2190 clk_unprepare(video->eclk); in aspeed_video_probe()
2194 aspeed_video_debugfs_create(video); in aspeed_video_probe()
2203 struct aspeed_video *video = to_aspeed_video(v4l2_dev); in aspeed_video_remove() local
2205 aspeed_video_off(video); in aspeed_video_remove()
2207 aspeed_video_debugfs_remove(video); in aspeed_video_remove()
2209 clk_unprepare(video->vclk); in aspeed_video_remove()
2210 clk_unprepare(video->eclk); in aspeed_video_remove()
2212 vb2_video_unregister_device(&video->vdev); in aspeed_video_remove()
2214 v4l2_ctrl_handler_free(&video->ctrl_handler); in aspeed_video_remove()
2218 aspeed_video_free_buf(video, &video->jpeg); in aspeed_video_remove()
2237 MODULE_DESCRIPTION("ASPEED Video Engine Driver");