Lines Matching +full:reg +full:- +full:spacing

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 // Copyright (c) 2019-2020 Intel Corporation
10 #include <linux/dma-mapping.h>
22 #include <linux/v4l2-controls.h>
26 #include <media/v4l2-ctrls.h>
27 #include <media/v4l2-dev.h>
28 #include <media/v4l2-device.h>
29 #include <media/v4l2-dv-timings.h>
30 #include <media/v4l2-event.h>
31 #include <media/v4l2-ioctl.h>
32 #include <media/videobuf2-dma-contig.h>
34 #define DEVICE_NAME "aspeed-video"
410 base = 256 * i; /* AST HW requires this header spacing */ in aspeed_video_init_jpeg_table()
427 static void aspeed_video_update(struct aspeed_video *video, u32 reg, u32 clear, in aspeed_video_update() argument
430 u32 t = readl(video->base + reg); in aspeed_video_update()
435 writel(t, video->base + reg); in aspeed_video_update()
436 dev_dbg(video->dev, "update %03x[%08x -> %08x]\n", reg, before, in aspeed_video_update()
437 readl(video->base + reg)); in aspeed_video_update()
440 static u32 aspeed_video_read(struct aspeed_video *video, u32 reg) in aspeed_video_read() argument
442 u32 t = readl(video->base + reg); in aspeed_video_read()
444 dev_dbg(video->dev, "read %03x[%08x]\n", reg, t); in aspeed_video_read()
448 static void aspeed_video_write(struct aspeed_video *video, u32 reg, u32 val) in aspeed_video_write() argument
450 writel(val, video->base + reg); in aspeed_video_write()
451 dev_dbg(video->dev, "write %03x[%08x]\n", reg, in aspeed_video_write()
452 readl(video->base + reg)); in aspeed_video_write()
462 if (video->v4l2_input_status) { in aspeed_video_start_frame()
463 dev_dbg(video->dev, "No signal; don't start frame\n"); in aspeed_video_start_frame()
469 dev_dbg(video->dev, "Engine busy; don't start frame\n"); in aspeed_video_start_frame()
470 return -EBUSY; in aspeed_video_start_frame()
473 spin_lock_irqsave(&video->lock, flags); in aspeed_video_start_frame()
474 buf = list_first_entry_or_null(&video->buffers, in aspeed_video_start_frame()
477 spin_unlock_irqrestore(&video->lock, flags); in aspeed_video_start_frame()
478 dev_dbg(video->dev, "No buffers; don't start frame\n"); in aspeed_video_start_frame()
479 return -EPROTO; in aspeed_video_start_frame()
482 set_bit(VIDEO_FRAME_INPRG, &video->flags); in aspeed_video_start_frame()
483 addr = vb2_dma_contig_plane_dma_addr(&buf->vb.vb2_buf, 0); in aspeed_video_start_frame()
484 spin_unlock_irqrestore(&video->lock, flags); in aspeed_video_start_frame()
505 /* Disable mode detect in order to re-trigger */ in aspeed_video_enable_mode_detect()
515 if (!test_bit(VIDEO_CLOCKS_ON, &video->flags)) in aspeed_video_off()
523 clk_disable(video->eclk); in aspeed_video_off()
524 clk_disable(video->vclk); in aspeed_video_off()
526 clear_bit(VIDEO_CLOCKS_ON, &video->flags); in aspeed_video_off()
531 if (test_bit(VIDEO_CLOCKS_ON, &video->flags)) in aspeed_video_on()
535 clk_enable(video->vclk); in aspeed_video_on()
536 clk_enable(video->eclk); in aspeed_video_on()
538 set_bit(VIDEO_CLOCKS_ON, &video->flags); in aspeed_video_on()
547 spin_lock_irqsave(&video->lock, flags); in aspeed_video_bufs_done()
548 list_for_each_entry(buf, &video->buffers, link) in aspeed_video_bufs_done()
549 vb2_buffer_done(&buf->vb.vb2_buf, state); in aspeed_video_bufs_done()
550 INIT_LIST_HEAD(&video->buffers); in aspeed_video_bufs_done()
551 spin_unlock_irqrestore(&video->lock, flags); in aspeed_video_bufs_done()
556 dev_dbg(video->dev, "Resolution changed; resetting\n"); in aspeed_video_irq_res_change()
558 set_bit(VIDEO_RES_CHANGE, &video->flags); in aspeed_video_irq_res_change()
559 clear_bit(VIDEO_FRAME_INPRG, &video->flags); in aspeed_video_irq_res_change()
561 video->v4l2_input_status = V4L2_IN_ST_NO_SIGNAL; in aspeed_video_irq_res_change()
566 schedule_delayed_work(&video->res_work, delay); in aspeed_video_irq_res_change()
576 * re-initialize in aspeed_video_irq()
584 if (test_bit(VIDEO_RES_DETECT, &video->flags)) { in aspeed_video_irq()
590 set_bit(VIDEO_MODE_DETECT_DONE, &video->flags); in aspeed_video_irq()
591 wake_up_interruptible_all(&video->wait); in aspeed_video_irq()
595 * detection; reset the engine and re-initialize in aspeed_video_irq()
606 video->comp_size_read); in aspeed_video_irq()
608 spin_lock(&video->lock); in aspeed_video_irq()
609 clear_bit(VIDEO_FRAME_INPRG, &video->flags); in aspeed_video_irq()
610 buf = list_first_entry_or_null(&video->buffers, in aspeed_video_irq()
614 vb2_set_plane_payload(&buf->vb.vb2_buf, 0, frame_size); in aspeed_video_irq()
616 if (!list_is_last(&buf->link, &video->buffers)) { in aspeed_video_irq()
617 buf->vb.vb2_buf.timestamp = ktime_get_ns(); in aspeed_video_irq()
618 buf->vb.sequence = video->sequence++; in aspeed_video_irq()
619 buf->vb.field = V4L2_FIELD_NONE; in aspeed_video_irq()
620 vb2_buffer_done(&buf->vb.vb2_buf, in aspeed_video_irq()
622 list_del(&buf->link); in aspeed_video_irq()
625 spin_unlock(&video->lock); in aspeed_video_irq()
636 if (test_bit(VIDEO_STREAMING, &video->flags) && buf) in aspeed_video_irq()
663 vsync_counter--; in aspeed_video_check_and_set_polarity()
668 hsync_counter--; in aspeed_video_check_and_set_polarity()
677 video->detected_timings.polarities &= in aspeed_video_check_and_set_polarity()
681 video->detected_timings.polarities |= in aspeed_video_check_and_set_polarity()
687 video->detected_timings.polarities &= in aspeed_video_check_and_set_polarity()
691 video->detected_timings.polarities |= in aspeed_video_check_and_set_polarity()
702 addr->virt = dma_alloc_coherent(video->dev, size, &addr->dma, in aspeed_video_alloc_buf()
704 if (!addr->virt) in aspeed_video_alloc_buf()
707 addr->size = size; in aspeed_video_alloc_buf()
714 dma_free_coherent(video->dev, addr->size, addr->virt, addr->dma); in aspeed_video_free_buf()
715 addr->size = 0; in aspeed_video_free_buf()
716 addr->dma = 0ULL; in aspeed_video_free_buf()
717 addr->virt = NULL; in aspeed_video_free_buf()
721 * Get the minimum HW-supported compression buffer size for the frame size.
722 * Assume worst-case JPEG compression size is 1/8 raw size. This should be
736 video->max_compressed_size = UINT_MAX; in aspeed_video_calc_compressed_size()
745 if (size < video->max_compressed_size) { in aspeed_video_calc_compressed_size()
747 video->max_compressed_size = size; in aspeed_video_calc_compressed_size()
755 dev_dbg(video->dev, "Max compressed size: %x\n", in aspeed_video_calc_compressed_size()
756 video->max_compressed_size); in aspeed_video_calc_compressed_size()
759 #define res_check(v) test_and_clear_bit(VIDEO_MODE_DETECT_DONE, &(v)->flags)
771 struct v4l2_bt_timings *det = &video->detected_timings; in aspeed_video_get_resolution()
773 det->width = MIN_WIDTH; in aspeed_video_get_resolution()
774 det->height = MIN_HEIGHT; in aspeed_video_get_resolution()
775 video->v4l2_input_status = V4L2_IN_ST_NO_SIGNAL; in aspeed_video_get_resolution()
784 set_bit(VIDEO_RES_DETECT, &video->flags); in aspeed_video_get_resolution()
789 rc = wait_event_interruptible_timeout(video->wait, in aspeed_video_get_resolution()
793 dev_dbg(video->dev, "Timed out; first mode detect\n"); in aspeed_video_get_resolution()
794 clear_bit(VIDEO_RES_DETECT, &video->flags); in aspeed_video_get_resolution()
802 rc = wait_event_interruptible_timeout(video->wait, in aspeed_video_get_resolution()
805 clear_bit(VIDEO_RES_DETECT, &video->flags); in aspeed_video_get_resolution()
807 dev_dbg(video->dev, "Timed out; second mode detect\n"); in aspeed_video_get_resolution()
817 video->frame_bottom = (src_tb_edge & VE_SRC_TB_EDGE_DET_BOT) >> in aspeed_video_get_resolution()
819 video->frame_top = src_tb_edge & VE_SRC_TB_EDGE_DET_TOP; in aspeed_video_get_resolution()
820 det->vfrontporch = video->frame_top; in aspeed_video_get_resolution()
821 det->vbackporch = ((mds & VE_MODE_DETECT_V_LINES) >> in aspeed_video_get_resolution()
822 VE_MODE_DETECT_V_LINES_SHF) - video->frame_bottom; in aspeed_video_get_resolution()
823 det->vsync = (sync & VE_SYNC_STATUS_VSYNC) >> in aspeed_video_get_resolution()
825 if (video->frame_top > video->frame_bottom) in aspeed_video_get_resolution()
828 video->frame_right = (src_lr_edge & VE_SRC_LR_EDGE_DET_RT) >> in aspeed_video_get_resolution()
830 video->frame_left = src_lr_edge & VE_SRC_LR_EDGE_DET_LEFT; in aspeed_video_get_resolution()
831 det->hfrontporch = video->frame_left; in aspeed_video_get_resolution()
832 det->hbackporch = htotal - video->frame_right; in aspeed_video_get_resolution()
833 det->hsync = sync & VE_SYNC_STATUS_HSYNC; in aspeed_video_get_resolution()
834 if (video->frame_left > video->frame_right) in aspeed_video_get_resolution()
841 dev_dbg(video->dev, "Invalid resolution detected\n"); in aspeed_video_get_resolution()
845 det->height = (video->frame_bottom - video->frame_top) + 1; in aspeed_video_get_resolution()
846 det->width = (video->frame_right - video->frame_left) + 1; in aspeed_video_get_resolution()
847 video->v4l2_input_status = 0; in aspeed_video_get_resolution()
850 * Enable mode-detect watchdog, resolution-change watchdog and in aspeed_video_get_resolution()
858 dev_dbg(video->dev, "Got resolution: %dx%d\n", det->width, in aspeed_video_get_resolution()
859 det->height); in aspeed_video_get_resolution()
864 struct v4l2_bt_timings *act = &video->active_timings; in aspeed_video_set_resolution()
865 unsigned int size = act->width * act->height; in aspeed_video_set_resolution()
870 if (video->active_timings.width == 1680) { in aspeed_video_set_resolution()
876 * 64-pixels aligned value to 1680 to minimize memory bandwidth in aspeed_video_set_resolution()
880 1728 << 16 | act->height); in aspeed_video_set_resolution()
881 size += (1728 - 1680) * video->active_timings.height; in aspeed_video_set_resolution()
884 act->width << 16 | act->height); in aspeed_video_set_resolution()
887 act->width << 16 | act->height); in aspeed_video_set_resolution()
888 aspeed_video_write(video, VE_SRC_SCANLINE_OFFSET, act->width * 4); in aspeed_video_set_resolution()
894 video->frame_left - 1) | in aspeed_video_set_resolution()
896 video->frame_right)); in aspeed_video_set_resolution()
898 FIELD_PREP(VE_TGS_FIRST, video->frame_top) | in aspeed_video_set_resolution()
900 video->frame_bottom + 1)); in aspeed_video_set_resolution()
908 if (size != video->srcs[0].size) { in aspeed_video_set_resolution()
909 if (video->srcs[0].size) in aspeed_video_set_resolution()
910 aspeed_video_free_buf(video, &video->srcs[0]); in aspeed_video_set_resolution()
911 if (video->srcs[1].size) in aspeed_video_set_resolution()
912 aspeed_video_free_buf(video, &video->srcs[1]); in aspeed_video_set_resolution()
914 if (!aspeed_video_alloc_buf(video, &video->srcs[0], size)) in aspeed_video_set_resolution()
916 if (!aspeed_video_alloc_buf(video, &video->srcs[1], size)) in aspeed_video_set_resolution()
919 aspeed_video_write(video, VE_SRC0_ADDR, video->srcs[0].dma); in aspeed_video_set_resolution()
920 aspeed_video_write(video, VE_SRC1_ADDR, video->srcs[1].dma); in aspeed_video_set_resolution()
926 dev_err(video->dev, "Failed to allocate source buffers\n"); in aspeed_video_set_resolution()
928 if (video->srcs[0].size) in aspeed_video_set_resolution()
929 aspeed_video_free_buf(video, &video->srcs[0]); in aspeed_video_set_resolution()
935 FIELD_PREP(VE_COMP_CTRL_DCT_LUM, video->jpeg_quality) | in aspeed_video_init_regs()
936 FIELD_PREP(VE_COMP_CTRL_DCT_CHR, video->jpeg_quality | 0x10); in aspeed_video_init_regs()
938 u32 seq_ctrl = video->jpeg_mode; in aspeed_video_init_regs()
940 if (video->frame_rate) in aspeed_video_init_regs()
941 ctrl |= FIELD_PREP(VE_CTRL_FRC, video->frame_rate); in aspeed_video_init_regs()
943 if (video->yuv420) in aspeed_video_init_regs()
957 aspeed_video_write(video, VE_JPEG_ADDR, video->jpeg.dma); in aspeed_video_init_regs()
985 video->active_timings = video->detected_timings; in aspeed_video_start()
988 video->pix_fmt.width = video->active_timings.width; in aspeed_video_start()
989 video->pix_fmt.height = video->active_timings.height; in aspeed_video_start()
990 video->pix_fmt.sizeimage = video->max_compressed_size; in aspeed_video_start()
995 set_bit(VIDEO_STOPPED, &video->flags); in aspeed_video_stop()
996 cancel_delayed_work_sync(&video->res_work); in aspeed_video_stop()
1000 if (video->srcs[0].size) in aspeed_video_stop()
1001 aspeed_video_free_buf(video, &video->srcs[0]); in aspeed_video_stop()
1003 if (video->srcs[1].size) in aspeed_video_stop()
1004 aspeed_video_free_buf(video, &video->srcs[1]); in aspeed_video_stop()
1006 video->v4l2_input_status = V4L2_IN_ST_NO_SIGNAL; in aspeed_video_stop()
1007 video->flags = 0; in aspeed_video_stop()
1013 strscpy(cap->driver, DEVICE_NAME, sizeof(cap->driver)); in aspeed_video_querycap()
1014 strscpy(cap->card, "Aspeed Video Engine", sizeof(cap->card)); in aspeed_video_querycap()
1015 snprintf(cap->bus_info, sizeof(cap->bus_info), "platform:%s", in aspeed_video_querycap()
1024 if (f->index) in aspeed_video_enum_format()
1025 return -EINVAL; in aspeed_video_enum_format()
1027 f->pixelformat = V4L2_PIX_FMT_JPEG; in aspeed_video_enum_format()
1037 f->fmt.pix = video->pix_fmt; in aspeed_video_get_format()
1047 if (inp->index) in aspeed_video_enum_input()
1048 return -EINVAL; in aspeed_video_enum_input()
1050 strscpy(inp->name, "Host VGA capture", sizeof(inp->name)); in aspeed_video_enum_input()
1051 inp->type = V4L2_INPUT_TYPE_CAMERA; in aspeed_video_enum_input()
1052 inp->capabilities = V4L2_IN_CAP_DV_TIMINGS; in aspeed_video_enum_input()
1053 inp->status = video->v4l2_input_status; in aspeed_video_enum_input()
1068 return -EINVAL; in aspeed_video_set_input()
1078 a->parm.capture.capability = V4L2_CAP_TIMEPERFRAME; in aspeed_video_get_parm()
1079 a->parm.capture.readbuffers = 3; in aspeed_video_get_parm()
1080 a->parm.capture.timeperframe.numerator = 1; in aspeed_video_get_parm()
1081 if (!video->frame_rate) in aspeed_video_get_parm()
1082 a->parm.capture.timeperframe.denominator = MAX_FRAME_RATE; in aspeed_video_get_parm()
1084 a->parm.capture.timeperframe.denominator = video->frame_rate; in aspeed_video_get_parm()
1095 a->parm.capture.capability = V4L2_CAP_TIMEPERFRAME; in aspeed_video_set_parm()
1096 a->parm.capture.readbuffers = 3; in aspeed_video_set_parm()
1098 if (a->parm.capture.timeperframe.numerator) in aspeed_video_set_parm()
1099 frame_rate = a->parm.capture.timeperframe.denominator / in aspeed_video_set_parm()
1100 a->parm.capture.timeperframe.numerator; in aspeed_video_set_parm()
1104 a->parm.capture.timeperframe.denominator = MAX_FRAME_RATE; in aspeed_video_set_parm()
1105 a->parm.capture.timeperframe.numerator = 1; in aspeed_video_set_parm()
1108 if (video->frame_rate != frame_rate) { in aspeed_video_set_parm()
1109 video->frame_rate = frame_rate; in aspeed_video_set_parm()
1122 if (fsize->index) in aspeed_video_enum_framesizes()
1123 return -EINVAL; in aspeed_video_enum_framesizes()
1125 if (fsize->pixel_format != V4L2_PIX_FMT_JPEG) in aspeed_video_enum_framesizes()
1126 return -EINVAL; in aspeed_video_enum_framesizes()
1128 fsize->discrete.width = video->pix_fmt.width; in aspeed_video_enum_framesizes()
1129 fsize->discrete.height = video->pix_fmt.height; in aspeed_video_enum_framesizes()
1130 fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE; in aspeed_video_enum_framesizes()
1140 if (fival->index) in aspeed_video_enum_frameintervals()
1141 return -EINVAL; in aspeed_video_enum_frameintervals()
1143 if (fival->width != video->detected_timings.width || in aspeed_video_enum_frameintervals()
1144 fival->height != video->detected_timings.height) in aspeed_video_enum_frameintervals()
1145 return -EINVAL; in aspeed_video_enum_frameintervals()
1147 if (fival->pixel_format != V4L2_PIX_FMT_JPEG) in aspeed_video_enum_frameintervals()
1148 return -EINVAL; in aspeed_video_enum_frameintervals()
1150 fival->type = V4L2_FRMIVAL_TYPE_CONTINUOUS; in aspeed_video_enum_frameintervals()
1152 fival->stepwise.min.denominator = MAX_FRAME_RATE; in aspeed_video_enum_frameintervals()
1153 fival->stepwise.min.numerator = 1; in aspeed_video_enum_frameintervals()
1154 fival->stepwise.max.denominator = 1; in aspeed_video_enum_frameintervals()
1155 fival->stepwise.max.numerator = 1; in aspeed_video_enum_frameintervals()
1156 fival->stepwise.step = fival->stepwise.max; in aspeed_video_enum_frameintervals()
1166 if (timings->bt.width == video->active_timings.width && in aspeed_video_set_dv_timings()
1167 timings->bt.height == video->active_timings.height) in aspeed_video_set_dv_timings()
1170 if (vb2_is_busy(&video->queue)) in aspeed_video_set_dv_timings()
1171 return -EBUSY; in aspeed_video_set_dv_timings()
1173 video->active_timings = timings->bt; in aspeed_video_set_dv_timings()
1177 video->pix_fmt.width = timings->bt.width; in aspeed_video_set_dv_timings()
1178 video->pix_fmt.height = timings->bt.height; in aspeed_video_set_dv_timings()
1179 video->pix_fmt.sizeimage = video->max_compressed_size; in aspeed_video_set_dv_timings()
1181 timings->type = V4L2_DV_BT_656_1120; in aspeed_video_set_dv_timings()
1191 timings->type = V4L2_DV_BT_656_1120; in aspeed_video_get_dv_timings()
1192 timings->bt = video->active_timings; in aspeed_video_get_dv_timings()
1208 if (file->f_flags & O_NONBLOCK) { in aspeed_video_query_dv_timings()
1209 if (test_bit(VIDEO_RES_CHANGE, &video->flags)) in aspeed_video_query_dv_timings()
1210 return -EAGAIN; in aspeed_video_query_dv_timings()
1212 rc = wait_event_interruptible(video->wait, in aspeed_video_query_dv_timings()
1214 &video->flags)); in aspeed_video_query_dv_timings()
1216 return -EINTR; in aspeed_video_query_dv_timings()
1219 timings->type = V4L2_DV_BT_656_1120; in aspeed_video_query_dv_timings()
1220 timings->bt = video->detected_timings; in aspeed_video_query_dv_timings()
1222 return video->v4l2_input_status ? -ENOLINK : 0; in aspeed_video_query_dv_timings()
1243 switch (sub->type) { in aspeed_video_sub_event()
1290 u32 comp_ctrl = FIELD_PREP(VE_COMP_CTRL_DCT_LUM, video->jpeg_quality) | in aspeed_video_update_jpeg_quality()
1291 FIELD_PREP(VE_COMP_CTRL_DCT_CHR, video->jpeg_quality | 0x10); in aspeed_video_update_jpeg_quality()
1300 if (video->jpeg.virt) in aspeed_video_update_subsampling()
1301 aspeed_video_init_jpeg_table(video->jpeg.virt, video->yuv420); in aspeed_video_update_subsampling()
1303 if (video->yuv420) in aspeed_video_update_subsampling()
1311 struct aspeed_video *video = container_of(ctrl->handler, in aspeed_video_set_ctrl()
1315 switch (ctrl->id) { in aspeed_video_set_ctrl()
1317 video->jpeg_quality = ctrl->val; in aspeed_video_set_ctrl()
1321 if (ctrl->val == V4L2_JPEG_CHROMA_SUBSAMPLING_420) { in aspeed_video_set_ctrl()
1322 video->yuv420 = true; in aspeed_video_set_ctrl()
1325 video->yuv420 = false; in aspeed_video_set_ctrl()
1330 return -EINVAL; in aspeed_video_set_ctrl()
1349 if (test_bit(VIDEO_STOPPED, &video->flags)) in aspeed_video_resolution_work()
1356 if (video->detected_timings.width != video->active_timings.width || in aspeed_video_resolution_work()
1357 video->detected_timings.height != video->active_timings.height) { in aspeed_video_resolution_work()
1363 v4l2_event_queue(&video->vdev, &ev); in aspeed_video_resolution_work()
1364 } else if (test_bit(VIDEO_STREAMING, &video->flags)) { in aspeed_video_resolution_work()
1370 clear_bit(VIDEO_RES_CHANGE, &video->flags); in aspeed_video_resolution_work()
1371 wake_up_interruptible_all(&video->wait); in aspeed_video_resolution_work()
1379 mutex_lock(&video->video_lock); in aspeed_video_open()
1383 mutex_unlock(&video->video_lock); in aspeed_video_open()
1390 mutex_unlock(&video->video_lock); in aspeed_video_open()
1400 mutex_lock(&video->video_lock); in aspeed_video_release()
1407 mutex_unlock(&video->video_lock); in aspeed_video_release()
1431 if (sizes[0] < video->max_compressed_size) in aspeed_video_queue_setup()
1432 return -EINVAL; in aspeed_video_queue_setup()
1438 sizes[0] = video->max_compressed_size; in aspeed_video_queue_setup()
1445 struct aspeed_video *video = vb2_get_drv_priv(vb->vb2_queue); in aspeed_video_buf_prepare()
1447 if (vb2_plane_size(vb, 0) < video->max_compressed_size) in aspeed_video_buf_prepare()
1448 return -EINVAL; in aspeed_video_buf_prepare()
1459 video->sequence = 0; in aspeed_video_start_streaming()
1467 set_bit(VIDEO_STREAMING, &video->flags); in aspeed_video_start_streaming()
1476 clear_bit(VIDEO_STREAMING, &video->flags); in aspeed_video_stop_streaming()
1478 rc = wait_event_timeout(video->wait, in aspeed_video_stop_streaming()
1479 !test_bit(VIDEO_FRAME_INPRG, &video->flags), in aspeed_video_stop_streaming()
1482 dev_dbg(video->dev, "Timed out when stopping streaming\n"); in aspeed_video_stop_streaming()
1502 struct aspeed_video *video = vb2_get_drv_priv(vb->vb2_queue); in aspeed_video_buf_queue()
1507 spin_lock_irqsave(&video->lock, flags); in aspeed_video_buf_queue()
1508 empty = list_empty(&video->buffers); in aspeed_video_buf_queue()
1509 list_add_tail(&avb->link, &video->buffers); in aspeed_video_buf_queue()
1510 spin_unlock_irqrestore(&video->lock, flags); in aspeed_video_buf_queue()
1512 if (test_bit(VIDEO_STREAMING, &video->flags) && in aspeed_video_buf_queue()
1513 !test_bit(VIDEO_FRAME_INPRG, &video->flags) && empty) in aspeed_video_buf_queue()
1531 struct v4l2_device *v4l2_dev = &video->v4l2_dev; in aspeed_video_setup_video()
1532 struct vb2_queue *vbq = &video->queue; in aspeed_video_setup_video()
1533 struct video_device *vdev = &video->vdev; in aspeed_video_setup_video()
1536 video->pix_fmt.pixelformat = V4L2_PIX_FMT_JPEG; in aspeed_video_setup_video()
1537 video->pix_fmt.field = V4L2_FIELD_NONE; in aspeed_video_setup_video()
1538 video->pix_fmt.colorspace = V4L2_COLORSPACE_SRGB; in aspeed_video_setup_video()
1539 video->pix_fmt.quantization = V4L2_QUANTIZATION_FULL_RANGE; in aspeed_video_setup_video()
1540 video->v4l2_input_status = V4L2_IN_ST_NO_SIGNAL; in aspeed_video_setup_video()
1542 rc = v4l2_device_register(video->dev, v4l2_dev); in aspeed_video_setup_video()
1544 dev_err(video->dev, "Failed to register v4l2 device\n"); in aspeed_video_setup_video()
1548 v4l2_ctrl_handler_init(&video->ctrl_handler, 2); in aspeed_video_setup_video()
1549 v4l2_ctrl_new_std(&video->ctrl_handler, &aspeed_video_ctrl_ops, in aspeed_video_setup_video()
1551 ASPEED_VIDEO_JPEG_NUM_QUALITIES - 1, 1, 0); in aspeed_video_setup_video()
1552 v4l2_ctrl_new_std_menu(&video->ctrl_handler, &aspeed_video_ctrl_ops, in aspeed_video_setup_video()
1557 rc = video->ctrl_handler.error; in aspeed_video_setup_video()
1559 v4l2_ctrl_handler_free(&video->ctrl_handler); in aspeed_video_setup_video()
1562 dev_err(video->dev, "Failed to init controls: %d\n", rc); in aspeed_video_setup_video()
1566 v4l2_dev->ctrl_handler = &video->ctrl_handler; in aspeed_video_setup_video()
1568 vbq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; in aspeed_video_setup_video()
1569 vbq->io_modes = VB2_MMAP | VB2_READ | VB2_DMABUF; in aspeed_video_setup_video()
1570 vbq->dev = v4l2_dev->dev; in aspeed_video_setup_video()
1571 vbq->lock = &video->video_lock; in aspeed_video_setup_video()
1572 vbq->ops = &aspeed_video_vb2_ops; in aspeed_video_setup_video()
1573 vbq->mem_ops = &vb2_dma_contig_memops; in aspeed_video_setup_video()
1574 vbq->drv_priv = video; in aspeed_video_setup_video()
1575 vbq->buf_struct_size = sizeof(struct aspeed_video_buffer); in aspeed_video_setup_video()
1576 vbq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; in aspeed_video_setup_video()
1577 vbq->min_buffers_needed = 3; in aspeed_video_setup_video()
1581 v4l2_ctrl_handler_free(&video->ctrl_handler); in aspeed_video_setup_video()
1584 dev_err(video->dev, "Failed to init vb2 queue\n"); in aspeed_video_setup_video()
1588 vdev->queue = vbq; in aspeed_video_setup_video()
1589 vdev->fops = &aspeed_video_v4l2_fops; in aspeed_video_setup_video()
1590 vdev->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE | in aspeed_video_setup_video()
1592 vdev->v4l2_dev = v4l2_dev; in aspeed_video_setup_video()
1593 strscpy(vdev->name, DEVICE_NAME, sizeof(vdev->name)); in aspeed_video_setup_video()
1594 vdev->vfl_type = VFL_TYPE_VIDEO; in aspeed_video_setup_video()
1595 vdev->vfl_dir = VFL_DIR_RX; in aspeed_video_setup_video()
1596 vdev->release = video_device_release_empty; in aspeed_video_setup_video()
1597 vdev->ioctl_ops = &aspeed_video_ioctl_ops; in aspeed_video_setup_video()
1598 vdev->lock = &video->video_lock; in aspeed_video_setup_video()
1603 v4l2_ctrl_handler_free(&video->ctrl_handler); in aspeed_video_setup_video()
1606 dev_err(video->dev, "Failed to register video device\n"); in aspeed_video_setup_video()
1617 struct device *dev = video->dev; in aspeed_video_init()
1619 irq = irq_of_parse_and_map(dev->of_node, 0); in aspeed_video_init()
1622 return -ENODEV; in aspeed_video_init()
1632 video->eclk = devm_clk_get(dev, "eclk"); in aspeed_video_init()
1633 if (IS_ERR(video->eclk)) { in aspeed_video_init()
1635 return PTR_ERR(video->eclk); in aspeed_video_init()
1638 rc = clk_prepare(video->eclk); in aspeed_video_init()
1642 video->vclk = devm_clk_get(dev, "vclk"); in aspeed_video_init()
1643 if (IS_ERR(video->vclk)) { in aspeed_video_init()
1645 rc = PTR_ERR(video->vclk); in aspeed_video_init()
1649 rc = clk_prepare(video->vclk); in aspeed_video_init()
1661 if (!aspeed_video_alloc_buf(video, &video->jpeg, in aspeed_video_init()
1664 rc = -ENOMEM; in aspeed_video_init()
1668 aspeed_video_init_jpeg_table(video->jpeg.virt, video->yuv420); in aspeed_video_init()
1674 clk_unprepare(video->vclk); in aspeed_video_init()
1676 clk_unprepare(video->eclk); in aspeed_video_init()
1682 { .compatible = "aspeed,ast2400-video-engine", .data = &ast2400_config },
1683 { .compatible = "aspeed,ast2500-video-engine", .data = &ast2500_config },
1684 { .compatible = "aspeed,ast2600-video-engine", .data = &ast2600_config },
1696 video = devm_kzalloc(&pdev->dev, sizeof(*video), GFP_KERNEL); in aspeed_video_probe()
1698 return -ENOMEM; in aspeed_video_probe()
1700 video->base = devm_platform_ioremap_resource(pdev, 0); in aspeed_video_probe()
1701 if (IS_ERR(video->base)) in aspeed_video_probe()
1702 return PTR_ERR(video->base); in aspeed_video_probe()
1704 match = of_match_node(aspeed_video_of_match, pdev->dev.of_node); in aspeed_video_probe()
1706 return -EINVAL; in aspeed_video_probe()
1708 config = match->data; in aspeed_video_probe()
1709 video->jpeg_mode = config->jpeg_mode; in aspeed_video_probe()
1710 video->comp_size_read = config->comp_size_read; in aspeed_video_probe()
1712 video->frame_rate = 30; in aspeed_video_probe()
1713 video->dev = &pdev->dev; in aspeed_video_probe()
1714 spin_lock_init(&video->lock); in aspeed_video_probe()
1715 mutex_init(&video->video_lock); in aspeed_video_probe()
1716 init_waitqueue_head(&video->wait); in aspeed_video_probe()
1717 INIT_DELAYED_WORK(&video->res_work, aspeed_video_resolution_work); in aspeed_video_probe()
1718 INIT_LIST_HEAD(&video->buffers); in aspeed_video_probe()
1726 aspeed_video_free_buf(video, &video->jpeg); in aspeed_video_probe()
1727 clk_unprepare(video->vclk); in aspeed_video_probe()
1728 clk_unprepare(video->eclk); in aspeed_video_probe()
1737 struct device *dev = &pdev->dev; in aspeed_video_remove()
1743 clk_unprepare(video->vclk); in aspeed_video_remove()
1744 clk_unprepare(video->eclk); in aspeed_video_remove()
1746 vb2_video_unregister_device(&video->vdev); in aspeed_video_remove()
1748 v4l2_ctrl_handler_free(&video->ctrl_handler); in aspeed_video_remove()
1752 aspeed_video_free_buf(video, &video->jpeg); in aspeed_video_remove()