Lines Matching refs:solo_enc

102 static int solo_is_motion_on(struct solo_enc_dev *solo_enc)  in solo_is_motion_on()  argument
104 struct solo_dev *solo_dev = solo_enc->solo_dev; in solo_is_motion_on()
106 return (solo_dev->motion_mask >> solo_enc->ch) & 1; in solo_is_motion_on()
109 static int solo_motion_detected(struct solo_enc_dev *solo_enc) in solo_motion_detected() argument
111 struct solo_dev *solo_dev = solo_enc->solo_dev; in solo_motion_detected()
113 u32 ch_mask = 1 << solo_enc->ch; in solo_motion_detected()
116 spin_lock_irqsave(&solo_enc->motion_lock, flags); in solo_motion_detected()
121 spin_unlock_irqrestore(&solo_enc->motion_lock, flags); in solo_motion_detected()
126 static void solo_motion_toggle(struct solo_enc_dev *solo_enc, int on) in solo_motion_toggle() argument
128 struct solo_dev *solo_dev = solo_enc->solo_dev; in solo_motion_toggle()
129 u32 mask = 1 << solo_enc->ch; in solo_motion_toggle()
132 spin_lock_irqsave(&solo_enc->motion_lock, flags); in solo_motion_toggle()
145 spin_unlock_irqrestore(&solo_enc->motion_lock, flags); in solo_motion_toggle()
148 void solo_update_mode(struct solo_enc_dev *solo_enc) in solo_update_mode() argument
150 struct solo_dev *solo_dev = solo_enc->solo_dev; in solo_update_mode()
154 solo_enc->interlaced = (solo_enc->mode & 0x08) ? 1 : 0; in solo_update_mode()
155 solo_enc->bw_weight = max(solo_dev->fps / solo_enc->interval, 1); in solo_update_mode()
157 if (solo_enc->mode == SOLO_ENC_MODE_CIF) { in solo_update_mode()
158 solo_enc->width = solo_dev->video_hsize >> 1; in solo_update_mode()
159 solo_enc->height = solo_dev->video_vsize; in solo_update_mode()
178 solo_enc->width = solo_dev->video_hsize; in solo_update_mode()
179 solo_enc->height = solo_dev->video_vsize << 1; in solo_update_mode()
180 solo_enc->bw_weight <<= 2; in solo_update_mode()
200 memcpy(solo_enc->vop, vop, vop_len); in solo_update_mode()
205 u16 interval = solo_enc->interval * 1000; in solo_update_mode()
207 vop = solo_enc->vop; in solo_update_mode()
217 solo_enc->vop_len = vop_len; in solo_update_mode()
220 vop = solo_enc->jpeg_header; in solo_update_mode()
221 vop[SOF0_START + 5] = 0xff & (solo_enc->height >> 8); in solo_update_mode()
222 vop[SOF0_START + 6] = 0xff & solo_enc->height; in solo_update_mode()
223 vop[SOF0_START + 7] = 0xff & (solo_enc->width >> 8); in solo_update_mode()
224 vop[SOF0_START + 8] = 0xff & solo_enc->width; in solo_update_mode()
227 jpeg_dqt[solo_g_jpeg_qp(solo_dev, solo_enc->ch)], DQT_LEN); in solo_update_mode()
230 static int solo_enc_on(struct solo_enc_dev *solo_enc) in solo_enc_on() argument
232 u8 ch = solo_enc->ch; in solo_enc_on()
233 struct solo_dev *solo_dev = solo_enc->solo_dev; in solo_enc_on()
236 solo_update_mode(solo_enc); in solo_enc_on()
239 if (solo_enc->bw_weight > solo_dev->enc_bw_remain) in solo_enc_on()
241 solo_enc->sequence = 0; in solo_enc_on()
242 solo_dev->enc_bw_remain -= solo_enc->bw_weight; in solo_enc_on()
244 if (solo_enc->type == SOLO_ENC_TYPE_EXT) in solo_enc_on()
252 solo_enc->interlaced ? 1 : 0); in solo_enc_on()
254 if (solo_enc->interlaced) in solo_enc_on()
255 interval = solo_enc->interval - 1; in solo_enc_on()
257 interval = solo_enc->interval; in solo_enc_on()
260 solo_reg_write(solo_dev, SOLO_VE_CH_GOP(ch), solo_enc->gop); in solo_enc_on()
261 solo_reg_write(solo_dev, SOLO_VE_CH_QP(ch), solo_enc->qp); in solo_enc_on()
265 solo_reg_write(solo_dev, SOLO_VE_CH_GOP_E(ch), solo_enc->gop); in solo_enc_on()
266 solo_reg_write(solo_dev, SOLO_VE_CH_QP_E(ch), solo_enc->qp); in solo_enc_on()
270 solo_reg_write(solo_dev, SOLO_CAP_CH_SCALE(ch), solo_enc->mode); in solo_enc_on()
275 static void solo_enc_off(struct solo_enc_dev *solo_enc) in solo_enc_off() argument
277 struct solo_dev *solo_dev = solo_enc->solo_dev; in solo_enc_off()
279 solo_dev->enc_bw_remain += solo_enc->bw_weight; in solo_enc_off()
281 solo_reg_write(solo_dev, SOLO_CAP_CH_SCALE(solo_enc->ch), 0); in solo_enc_off()
282 solo_reg_write(solo_dev, SOLO_CAP_CH_COMP_ENA_E(solo_enc->ch), 0); in solo_enc_off()
317 static int solo_send_desc(struct solo_enc_dev *solo_enc, int skip, in solo_send_desc() argument
321 struct solo_dev *solo_dev = solo_enc->solo_dev; in solo_send_desc()
329 solo_enc->desc_count = 1; in solo_send_desc()
337 desc = &solo_enc->desc_items[solo_enc->desc_count++]; in solo_send_desc()
373 solo_enc->desc_count--; in solo_send_desc()
385 if (solo_enc->desc_count >= (solo_enc->desc_nelts - 1)) { in solo_send_desc()
386 ret = solo_p2m_dma_desc(solo_dev, solo_enc->desc_items, in solo_send_desc()
387 solo_enc->desc_dma, in solo_send_desc()
388 solo_enc->desc_count - 1); in solo_send_desc()
391 solo_enc->desc_count = 1; in solo_send_desc()
395 if (solo_enc->desc_count <= 1) in solo_send_desc()
398 return solo_p2m_dma_desc(solo_dev, solo_enc->desc_items, in solo_send_desc()
399 solo_enc->desc_dma, solo_enc->desc_count - 1); in solo_send_desc()
458 static int solo_fill_jpeg(struct solo_enc_dev *solo_enc, in solo_fill_jpeg() argument
462 struct solo_dev *solo_dev = solo_enc->solo_dev; in solo_fill_jpeg()
468 if (vb2_plane_size(vb, 0) < vop_jpeg_size(vh) + solo_enc->jpeg_len) in solo_fill_jpeg()
471 frame_size = ALIGN(vop_jpeg_size(vh) + solo_enc->jpeg_len, DMA_ALIGN); in solo_fill_jpeg()
472 vb2_set_plane_payload(vb, 0, vop_jpeg_size(vh) + solo_enc->jpeg_len); in solo_fill_jpeg()
474 return solo_send_desc(solo_enc, solo_enc->jpeg_len, sgt, in solo_fill_jpeg()
480 static int solo_fill_mpeg(struct solo_enc_dev *solo_enc, in solo_fill_mpeg() argument
484 struct solo_dev *solo_dev = solo_enc->solo_dev; in solo_fill_mpeg()
496 skip = solo_enc->vop_len; in solo_fill_mpeg()
499 solo_enc->vop_len); in solo_fill_mpeg()
510 return solo_send_desc(solo_enc, skip, sgt, frame_off, frame_size, in solo_fill_mpeg()
515 static int solo_enc_fillbuf(struct solo_enc_dev *solo_enc, in solo_enc_fillbuf() argument
522 switch (solo_enc->fmt) { in solo_enc_fillbuf()
525 ret = solo_fill_mpeg(solo_enc, vb, vh); in solo_enc_fillbuf()
528 ret = solo_fill_jpeg(solo_enc, vb, vh); in solo_enc_fillbuf()
533 vbuf->sequence = solo_enc->sequence++; in solo_enc_fillbuf()
538 if (solo_is_motion_on(solo_enc) && enc_buf->motion) { in solo_enc_fillbuf()
549 v4l2_event_queue(solo_enc->vfd, &ev); in solo_enc_fillbuf()
558 static void solo_enc_handle_one(struct solo_enc_dev *solo_enc, in solo_enc_handle_one() argument
564 mutex_lock(&solo_enc->lock); in solo_enc_handle_one()
565 if (solo_enc->type != enc_buf->type) in solo_enc_handle_one()
568 spin_lock_irqsave(&solo_enc->av_lock, flags); in solo_enc_handle_one()
569 if (list_empty(&solo_enc->vidq_active)) { in solo_enc_handle_one()
570 spin_unlock_irqrestore(&solo_enc->av_lock, flags); in solo_enc_handle_one()
573 vb = list_first_entry(&solo_enc->vidq_active, struct solo_vb2_buf, in solo_enc_handle_one()
576 spin_unlock_irqrestore(&solo_enc->av_lock, flags); in solo_enc_handle_one()
578 solo_enc_fillbuf(solo_enc, &vb->vb.vb2_buf, enc_buf); in solo_enc_handle_one()
580 mutex_unlock(&solo_enc->lock); in solo_enc_handle_one()
591 struct solo_enc_dev *solo_enc; in solo_handle_ring() local
615 solo_enc = solo_dev->v4l2_enc[ch]; in solo_handle_ring()
616 if (solo_enc == NULL) { in solo_handle_ring()
634 if (solo_motion_detected(solo_enc)) in solo_handle_ring()
639 solo_enc_handle_one(solo_enc, &enc_buf); in solo_handle_ring()
671 struct solo_enc_dev *solo_enc = vb2_get_drv_priv(q); in solo_enc_queue_setup() local
674 alloc_ctxs[0] = solo_enc->alloc_ctx; in solo_enc_queue_setup()
687 struct solo_enc_dev *solo_enc = vb2_get_drv_priv(vq); in solo_enc_buf_queue() local
691 spin_lock(&solo_enc->av_lock); in solo_enc_buf_queue()
692 list_add_tail(&solo_vb->list, &solo_enc->vidq_active); in solo_enc_buf_queue()
693 spin_unlock(&solo_enc->av_lock); in solo_enc_buf_queue()
724 struct solo_enc_dev *solo_enc = vb2_get_drv_priv(q); in solo_enc_start_streaming() local
726 return solo_enc_on(solo_enc); in solo_enc_start_streaming()
731 struct solo_enc_dev *solo_enc = vb2_get_drv_priv(q); in solo_enc_stop_streaming() local
734 spin_lock_irqsave(&solo_enc->av_lock, flags); in solo_enc_stop_streaming()
735 solo_enc_off(solo_enc); in solo_enc_stop_streaming()
736 while (!list_empty(&solo_enc->vidq_active)) { in solo_enc_stop_streaming()
738 solo_enc->vidq_active.next, in solo_enc_stop_streaming()
744 spin_unlock_irqrestore(&solo_enc->av_lock, flags); in solo_enc_stop_streaming()
750 struct solo_enc_dev *solo_enc = vb2_get_drv_priv(vb->vb2_queue); in solo_enc_buf_finish() local
753 switch (solo_enc->fmt) { in solo_enc_buf_finish()
758 solo_enc->vop, solo_enc->vop_len); in solo_enc_buf_finish()
762 solo_enc->jpeg_header, solo_enc->jpeg_len); in solo_enc_buf_finish()
780 struct solo_enc_dev *solo_enc = video_drvdata(file); in solo_enc_querycap() local
781 struct solo_dev *solo_dev = solo_enc->solo_dev; in solo_enc_querycap()
785 solo_enc->ch); in solo_enc_querycap()
797 struct solo_enc_dev *solo_enc = video_drvdata(file); in solo_enc_enum_input() local
798 struct solo_dev *solo_dev = solo_enc->solo_dev; in solo_enc_enum_input()
804 solo_enc->ch + 1); in solo_enc_enum_input()
806 input->std = solo_enc->vfd->tvnorms; in solo_enc_enum_input()
808 if (!tw28_get_video_status(solo_dev, solo_enc->ch)) in solo_enc_enum_input()
834 struct solo_enc_dev *solo_enc = video_drvdata(file); in solo_enc_enum_fmt_cap() local
835 int dev_type = solo_enc->solo_dev->type; in solo_enc_enum_fmt_cap()
873 struct solo_enc_dev *solo_enc = video_drvdata(file); in solo_enc_try_fmt_cap() local
874 struct solo_dev *solo_dev = solo_enc->solo_dev; in solo_enc_try_fmt_cap()
913 struct solo_enc_dev *solo_enc = video_drvdata(file); in solo_enc_set_fmt_cap() local
914 struct solo_dev *solo_dev = solo_enc->solo_dev; in solo_enc_set_fmt_cap()
918 if (vb2_is_busy(&solo_enc->vidq)) in solo_enc_set_fmt_cap()
926 solo_enc->mode = SOLO_ENC_MODE_D1; in solo_enc_set_fmt_cap()
928 solo_enc->mode = SOLO_ENC_MODE_CIF; in solo_enc_set_fmt_cap()
931 solo_enc->fmt = pix->pixelformat; in solo_enc_set_fmt_cap()
943 solo_update_mode(solo_enc); in solo_enc_set_fmt_cap()
950 struct solo_enc_dev *solo_enc = video_drvdata(file); in solo_enc_get_fmt_cap() local
953 pix->width = solo_enc->width; in solo_enc_get_fmt_cap()
954 pix->height = solo_enc->height; in solo_enc_get_fmt_cap()
955 pix->pixelformat = solo_enc->fmt; in solo_enc_get_fmt_cap()
956 pix->field = solo_enc->interlaced ? V4L2_FIELD_INTERLACED : in solo_enc_get_fmt_cap()
967 struct solo_enc_dev *solo_enc = video_drvdata(file); in solo_enc_g_std() local
968 struct solo_dev *solo_dev = solo_enc->solo_dev; in solo_enc_g_std()
979 struct solo_enc_dev *solo_enc = video_drvdata(file); in solo_enc_s_std() local
981 return solo_set_video_type(solo_enc->solo_dev, std & V4L2_STD_625_50); in solo_enc_s_std()
987 struct solo_enc_dev *solo_enc = video_drvdata(file); in solo_enum_framesizes() local
988 struct solo_dev *solo_dev = solo_enc->solo_dev; in solo_enum_framesizes()
1014 struct solo_enc_dev *solo_enc = video_drvdata(file); in solo_enum_frameintervals() local
1015 struct solo_dev *solo_dev = solo_enc->solo_dev; in solo_enum_frameintervals()
1044 struct solo_enc_dev *solo_enc = video_drvdata(file); in solo_g_parm() local
1048 cp->timeperframe.numerator = solo_enc->interval; in solo_g_parm()
1049 cp->timeperframe.denominator = solo_enc->solo_dev->fps; in solo_g_parm()
1070 struct solo_enc_dev *solo_enc = video_drvdata(file); in solo_s_parm() local
1072 u8 fps = solo_enc->solo_dev->fps; in solo_s_parm()
1074 if (vb2_is_streaming(&solo_enc->vidq)) in solo_s_parm()
1077 solo_enc->interval = calc_interval(fps, t->numerator, t->denominator); in solo_s_parm()
1078 solo_update_mode(solo_enc); in solo_s_parm()
1084 struct solo_enc_dev *solo_enc = in solo_s_ctrl() local
1086 struct solo_dev *solo_dev = solo_enc->solo_dev; in solo_s_ctrl()
1095 return tw28_set_ctrl_val(solo_dev, ctrl->id, solo_enc->ch, in solo_s_ctrl()
1098 solo_enc->gop = ctrl->val; in solo_s_ctrl()
1099 solo_reg_write(solo_dev, SOLO_VE_CH_GOP(solo_enc->ch), solo_enc->gop); in solo_s_ctrl()
1100 solo_reg_write(solo_dev, SOLO_VE_CH_GOP_E(solo_enc->ch), solo_enc->gop); in solo_s_ctrl()
1103 solo_enc->qp = ctrl->val; in solo_s_ctrl()
1104 solo_reg_write(solo_dev, SOLO_VE_CH_QP(solo_enc->ch), solo_enc->qp); in solo_s_ctrl()
1105 solo_reg_write(solo_dev, SOLO_VE_CH_QP_E(solo_enc->ch), solo_enc->qp); in solo_s_ctrl()
1108 solo_enc->motion_thresh = ctrl->val << 8; in solo_s_ctrl()
1109 if (!solo_enc->motion_global || !solo_enc->motion_enabled) in solo_s_ctrl()
1111 return solo_set_motion_threshold(solo_dev, solo_enc->ch, in solo_s_ctrl()
1112 solo_enc->motion_thresh); in solo_s_ctrl()
1114 solo_enc->motion_global = ctrl->val == V4L2_DETECT_MD_MODE_GLOBAL; in solo_s_ctrl()
1115 solo_enc->motion_enabled = ctrl->val > V4L2_DETECT_MD_MODE_DISABLED; in solo_s_ctrl()
1117 if (solo_enc->motion_global) in solo_s_ctrl()
1118 err = solo_set_motion_threshold(solo_dev, solo_enc->ch, in solo_s_ctrl()
1119 solo_enc->motion_thresh); in solo_s_ctrl()
1121 err = solo_set_motion_block(solo_dev, solo_enc->ch, in solo_s_ctrl()
1122 solo_enc->md_thresholds->p_cur.p_u16); in solo_s_ctrl()
1126 solo_motion_toggle(solo_enc, ctrl->val); in solo_s_ctrl()
1129 if (solo_enc->motion_enabled && !solo_enc->motion_global) in solo_s_ctrl()
1130 return solo_set_motion_block(solo_dev, solo_enc->ch, in solo_s_ctrl()
1131 solo_enc->md_thresholds->p_new.p_u16); in solo_s_ctrl()
1134 strcpy(solo_enc->osd_text, ctrl->p_new.p_char); in solo_s_ctrl()
1135 return solo_osd_print(solo_enc); in solo_s_ctrl()
1235 struct solo_enc_dev *solo_enc; in solo_enc_alloc() local
1239 solo_enc = kzalloc(sizeof(*solo_enc), GFP_KERNEL); in solo_enc_alloc()
1240 if (!solo_enc) in solo_enc_alloc()
1243 hdl = &solo_enc->hdl; in solo_enc_alloc()
1244 solo_enc->alloc_ctx = vb2_dma_sg_init_ctx(&solo_dev->pdev->dev); in solo_enc_alloc()
1245 if (IS_ERR(solo_enc->alloc_ctx)) { in solo_enc_alloc()
1246 ret = PTR_ERR(solo_enc->alloc_ctx); in solo_enc_alloc()
1273 solo_enc->md_thresholds = in solo_enc_alloc()
1280 solo_enc->solo_dev = solo_dev; in solo_enc_alloc()
1281 solo_enc->ch = ch; in solo_enc_alloc()
1282 mutex_init(&solo_enc->lock); in solo_enc_alloc()
1283 spin_lock_init(&solo_enc->av_lock); in solo_enc_alloc()
1284 INIT_LIST_HEAD(&solo_enc->vidq_active); in solo_enc_alloc()
1285 solo_enc->fmt = (solo_dev->type == SOLO_DEV_6010) ? in solo_enc_alloc()
1287 solo_enc->type = SOLO_ENC_TYPE_STD; in solo_enc_alloc()
1289 solo_enc->qp = SOLO_DEFAULT_QP; in solo_enc_alloc()
1290 solo_enc->gop = solo_dev->fps; in solo_enc_alloc()
1291 solo_enc->interval = 1; in solo_enc_alloc()
1292 solo_enc->mode = SOLO_ENC_MODE_CIF; in solo_enc_alloc()
1293 solo_enc->motion_global = true; in solo_enc_alloc()
1294 solo_enc->motion_thresh = SOLO_DEF_MOT_THRESH; in solo_enc_alloc()
1295 solo_enc->vidq.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; in solo_enc_alloc()
1296 solo_enc->vidq.io_modes = VB2_MMAP | VB2_USERPTR | VB2_READ; in solo_enc_alloc()
1297 solo_enc->vidq.ops = &solo_enc_video_qops; in solo_enc_alloc()
1298 solo_enc->vidq.mem_ops = &vb2_dma_sg_memops; in solo_enc_alloc()
1299 solo_enc->vidq.drv_priv = solo_enc; in solo_enc_alloc()
1300 solo_enc->vidq.gfp_flags = __GFP_DMA32 | __GFP_KSWAPD_RECLAIM; in solo_enc_alloc()
1301 solo_enc->vidq.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; in solo_enc_alloc()
1302 solo_enc->vidq.buf_struct_size = sizeof(struct solo_vb2_buf); in solo_enc_alloc()
1303 solo_enc->vidq.lock = &solo_enc->lock; in solo_enc_alloc()
1304 ret = vb2_queue_init(&solo_enc->vidq); in solo_enc_alloc()
1307 solo_update_mode(solo_enc); in solo_enc_alloc()
1309 spin_lock_init(&solo_enc->motion_lock); in solo_enc_alloc()
1312 solo_enc->jpeg_len = sizeof(jpeg_header); in solo_enc_alloc()
1313 memcpy(solo_enc->jpeg_header, jpeg_header, solo_enc->jpeg_len); in solo_enc_alloc()
1315 solo_enc->desc_nelts = 32; in solo_enc_alloc()
1316 solo_enc->desc_items = pci_alloc_consistent(solo_dev->pdev, in solo_enc_alloc()
1318 solo_enc->desc_nelts, in solo_enc_alloc()
1319 &solo_enc->desc_dma); in solo_enc_alloc()
1321 if (solo_enc->desc_items == NULL) in solo_enc_alloc()
1324 solo_enc->vfd = video_device_alloc(); in solo_enc_alloc()
1325 if (!solo_enc->vfd) in solo_enc_alloc()
1328 *solo_enc->vfd = solo_enc_template; in solo_enc_alloc()
1329 solo_enc->vfd->v4l2_dev = &solo_dev->v4l2_dev; in solo_enc_alloc()
1330 solo_enc->vfd->ctrl_handler = hdl; in solo_enc_alloc()
1331 solo_enc->vfd->queue = &solo_enc->vidq; in solo_enc_alloc()
1332 solo_enc->vfd->lock = &solo_enc->lock; in solo_enc_alloc()
1333 video_set_drvdata(solo_enc->vfd, solo_enc); in solo_enc_alloc()
1334 ret = video_register_device(solo_enc->vfd, VFL_TYPE_GRABBER, nr); in solo_enc_alloc()
1338 snprintf(solo_enc->vfd->name, sizeof(solo_enc->vfd->name), in solo_enc_alloc()
1340 solo_enc->vfd->num); in solo_enc_alloc()
1342 return solo_enc; in solo_enc_alloc()
1345 video_device_release(solo_enc->vfd); in solo_enc_alloc()
1347 pci_free_consistent(solo_enc->solo_dev->pdev, in solo_enc_alloc()
1348 sizeof(struct solo_p2m_desc) * solo_enc->desc_nelts, in solo_enc_alloc()
1349 solo_enc->desc_items, solo_enc->desc_dma); in solo_enc_alloc()
1352 vb2_dma_sg_cleanup_ctx(solo_enc->alloc_ctx); in solo_enc_alloc()
1353 kfree(solo_enc); in solo_enc_alloc()
1357 static void solo_enc_free(struct solo_enc_dev *solo_enc) in solo_enc_free() argument
1359 if (solo_enc == NULL) in solo_enc_free()
1362 pci_free_consistent(solo_enc->solo_dev->pdev, in solo_enc_free()
1363 sizeof(struct solo_p2m_desc) * solo_enc->desc_nelts, in solo_enc_free()
1364 solo_enc->desc_items, solo_enc->desc_dma); in solo_enc_free()
1365 video_unregister_device(solo_enc->vfd); in solo_enc_free()
1366 v4l2_ctrl_handler_free(&solo_enc->hdl); in solo_enc_free()
1367 vb2_dma_sg_cleanup_ctx(solo_enc->alloc_ctx); in solo_enc_free()
1368 kfree(solo_enc); in solo_enc_free()