Lines Matching defs:solo_dev

95 	struct solo_dev *solo_dev = solo_enc->solo_dev;
97 return (solo_dev->motion_mask >> solo_enc->ch) & 1;
102 struct solo_dev *solo_dev = solo_enc->solo_dev;
108 if (solo_reg_read(solo_dev, SOLO_VI_MOT_STATUS) & ch_mask) {
109 solo_reg_write(solo_dev, SOLO_VI_MOT_CLEAR, ch_mask);
119 struct solo_dev *solo_dev = solo_enc->solo_dev;
126 solo_dev->motion_mask |= mask;
128 solo_dev->motion_mask &= ~mask;
130 solo_reg_write(solo_dev, SOLO_VI_MOT_CLEAR, mask);
132 solo_reg_write(solo_dev, SOLO_VI_MOT_ADR,
133 SOLO_VI_MOTION_EN(solo_dev->motion_mask) |
134 (SOLO_MOTION_EXT_ADDR(solo_dev) >> 16));
141 struct solo_dev *solo_dev = solo_enc->solo_dev;
146 solo_enc->bw_weight = max(solo_dev->fps / solo_enc->interval, 1);
149 solo_enc->width = solo_dev->video_hsize >> 1;
150 solo_enc->height = solo_dev->video_vsize;
151 if (solo_dev->type == SOLO_DEV_6110) {
152 if (solo_dev->video_type == SOLO_VO_FMT_TYPE_NTSC) {
160 if (solo_dev->video_type == SOLO_VO_FMT_TYPE_NTSC) {
169 solo_enc->width = solo_dev->video_hsize;
170 solo_enc->height = solo_dev->video_vsize << 1;
172 if (solo_dev->type == SOLO_DEV_6110) {
173 if (solo_dev->video_type == SOLO_VO_FMT_TYPE_NTSC) {
181 if (solo_dev->video_type == SOLO_VO_FMT_TYPE_NTSC) {
194 if (solo_dev->type == SOLO_DEV_6010) {
195 u16 fps = solo_dev->fps * 1000;
218 jpeg_dqt[solo_g_jpeg_qp(solo_dev, solo_enc->ch)], DQT_LEN);
224 struct solo_dev *solo_dev = solo_enc->solo_dev;
230 if (solo_enc->bw_weight > solo_dev->enc_bw_remain)
233 solo_dev->enc_bw_remain -= solo_enc->bw_weight;
236 solo_reg_write(solo_dev, SOLO_CAP_CH_COMP_ENA_E(ch), 1);
239 solo_reg_write(solo_dev, SOLO_CAP_CH_SCALE(ch), 0);
242 solo_reg_write(solo_dev, SOLO_VE_CH_INTL(ch),
251 solo_reg_write(solo_dev, SOLO_VE_CH_GOP(ch), solo_enc->gop);
252 solo_reg_write(solo_dev, SOLO_VE_CH_QP(ch), solo_enc->qp);
253 solo_reg_write(solo_dev, SOLO_CAP_CH_INTV(ch), interval);
256 solo_reg_write(solo_dev, SOLO_VE_CH_GOP_E(ch), solo_enc->gop);
257 solo_reg_write(solo_dev, SOLO_VE_CH_QP_E(ch), solo_enc->qp);
258 solo_reg_write(solo_dev, SOLO_CAP_CH_INTV_E(ch), interval);
261 solo_reg_write(solo_dev, SOLO_CAP_CH_SCALE(ch), solo_enc->mode);
268 struct solo_dev *solo_dev = solo_enc->solo_dev;
270 solo_dev->enc_bw_remain += solo_enc->bw_weight;
272 solo_reg_write(solo_dev, SOLO_CAP_CH_SCALE(solo_enc->ch), 0);
273 solo_reg_write(solo_dev, SOLO_CAP_CH_COMP_ENA_E(solo_enc->ch), 0);
276 static int enc_get_mpeg_dma(struct solo_dev *solo_dev, dma_addr_t dma,
281 if (off > SOLO_MP4E_EXT_SIZE(solo_dev))
285 if (off + size <= SOLO_MP4E_EXT_SIZE(solo_dev)) {
286 return solo_p2m_dma_t(solo_dev, 0, dma,
287 SOLO_MP4E_EXT_ADDR(solo_dev) + off, size,
292 ret = solo_p2m_dma_t(solo_dev, 0, dma,
293 SOLO_MP4E_EXT_ADDR(solo_dev) + off,
294 SOLO_MP4E_EXT_SIZE(solo_dev) - off, 0, 0);
297 ret = solo_p2m_dma_t(solo_dev, 0,
298 dma + SOLO_MP4E_EXT_SIZE(solo_dev) - off,
299 SOLO_MP4E_EXT_ADDR(solo_dev),
300 size + off - SOLO_MP4E_EXT_SIZE(solo_dev), 0, 0);
312 struct solo_dev *solo_dev = solo_enc->solo_dev;
354 ret = solo_p2m_dma_t(solo_dev, 0, dma, base + off,
359 ret = solo_p2m_dma_t(solo_dev, 0, dma + left, base,
377 ret = solo_p2m_dma_desc(solo_dev, solo_enc->desc_items,
389 return solo_p2m_dma_desc(solo_dev, solo_enc->desc_items,
453 struct solo_dev *solo_dev = solo_enc->solo_dev;
466 vop_jpeg_offset(vh) - SOLO_JPEG_EXT_ADDR(solo_dev),
467 frame_size, SOLO_JPEG_EXT_ADDR(solo_dev),
468 SOLO_JPEG_EXT_SIZE(solo_dev));
475 struct solo_dev *solo_dev = solo_enc->solo_dev;
497 frame_off = (vop_mpeg_offset(vh) - SOLO_MP4E_EXT_ADDR(solo_dev) +
498 sizeof(*vh)) % SOLO_MP4E_EXT_SIZE(solo_dev);
502 SOLO_MP4E_EXT_ADDR(solo_dev),
503 SOLO_MP4E_EXT_SIZE(solo_dev));
573 void solo_enc_v4l2_isr(struct solo_dev *solo_dev)
575 wake_up_interruptible_all(&solo_dev->ring_thread_wait);
578 static void solo_handle_ring(struct solo_dev *solo_dev)
588 cur_q = solo_reg_read(solo_dev, SOLO_VE_STATE(11)) & 0xff;
589 if (cur_q == solo_dev->enc_idx)
592 mpeg_current = solo_reg_read(solo_dev,
593 SOLO_VE_MPEG4_QUE(solo_dev->enc_idx));
594 solo_dev->enc_idx = (solo_dev->enc_idx + 1) % MP4_QS;
605 solo_enc = solo_dev->v4l2_enc[ch];
607 dev_err(&solo_dev->pdev->dev,
613 if (enc_get_mpeg_dma(solo_dev, solo_dev->vh_dma, off,
617 enc_buf.vh = solo_dev->vh_buf;
621 SOLO_MP4E_EXT_ADDR(solo_dev) + off)
635 struct solo_dev *solo_dev = data;
639 add_wait_queue(&solo_dev->ring_thread_wait, &wait);
646 solo_handle_ring(solo_dev);
650 remove_wait_queue(&solo_dev->ring_thread_wait, &wait);
682 static int solo_ring_start(struct solo_dev *solo_dev)
684 solo_dev->ring_thread = kthread_run(solo_ring_thread, solo_dev,
686 if (IS_ERR(solo_dev->ring_thread)) {
687 int err = PTR_ERR(solo_dev->ring_thread);
689 solo_dev->ring_thread = NULL;
693 solo_irq_on(solo_dev, SOLO_IRQ_ENCODER);
698 static void solo_ring_stop(struct solo_dev *solo_dev)
700 if (solo_dev->ring_thread) {
701 kthread_stop(solo_dev->ring_thread);
702 solo_dev->ring_thread = NULL;
705 solo_irq_off(solo_dev, SOLO_IRQ_ENCODER);
767 struct solo_dev *solo_dev = solo_enc->solo_dev;
773 pci_name(solo_dev->pdev));
781 struct solo_dev *solo_dev = solo_enc->solo_dev;
791 if (!tw28_get_video_status(solo_dev, solo_enc->ch))
818 int dev_type = solo_enc->solo_dev->type;
851 struct solo_dev *solo_dev = solo_enc->solo_dev;
854 if (solo_valid_pixfmt(pix->pixelformat, solo_dev->type))
857 if (pix->width < solo_dev->video_hsize ||
858 pix->height < solo_dev->video_vsize << 1) {
860 pix->width = solo_dev->video_hsize >> 1;
861 pix->height = solo_dev->video_vsize;
864 pix->width = solo_dev->video_hsize;
865 pix->height = solo_dev->video_vsize << 1;
890 struct solo_dev *solo_dev = solo_enc->solo_dev;
901 if (pix->width == solo_dev->video_hsize)
943 struct solo_dev *solo_dev = solo_enc->solo_dev;
945 if (solo_dev->video_type == SOLO_VO_FMT_TYPE_NTSC)
956 return solo_set_video_type(solo_enc->solo_dev, std & V4L2_STD_625_50);
963 struct solo_dev *solo_dev = solo_enc->solo_dev;
965 if (solo_valid_pixfmt(fsize->pixel_format, solo_dev->type))
970 fsize->discrete.width = solo_dev->video_hsize >> 1;
971 fsize->discrete.height = solo_dev->video_vsize;
974 fsize->discrete.width = solo_dev->video_hsize;
975 fsize->discrete.height = solo_dev->video_vsize << 1;
990 struct solo_dev *solo_dev = solo_enc->solo_dev;
992 if (solo_valid_pixfmt(fintv->pixel_format, solo_dev->type))
996 if ((fintv->width != solo_dev->video_hsize >> 1 ||
997 fintv->height != solo_dev->video_vsize) &&
998 (fintv->width != solo_dev->video_hsize ||
999 fintv->height != solo_dev->video_vsize << 1))
1005 fintv->stepwise.min.denominator = solo_dev->fps;
1008 fintv->stepwise.max.denominator = solo_dev->fps;
1011 fintv->stepwise.step.denominator = solo_dev->fps;
1024 cp->timeperframe.denominator = solo_enc->solo_dev->fps;
1047 u8 fps = solo_enc->solo_dev->fps;
1061 struct solo_dev *solo_dev = solo_enc->solo_dev;
1070 return tw28_set_ctrl_val(solo_dev, ctrl->id, solo_enc->ch,
1074 solo_reg_write(solo_dev, SOLO_VE_CH_GOP(solo_enc->ch), solo_enc->gop);
1075 solo_reg_write(solo_dev, SOLO_VE_CH_GOP_E(solo_enc->ch), solo_enc->gop);
1079 solo_reg_write(solo_dev, SOLO_VE_CH_QP(solo_enc->ch), solo_enc->qp);
1080 solo_reg_write(solo_dev, SOLO_VE_CH_QP_E(solo_enc->ch), solo_enc->qp);
1086 return solo_set_motion_threshold(solo_dev, solo_enc->ch,
1093 err = solo_set_motion_threshold(solo_dev, solo_enc->ch,
1096 err = solo_set_motion_block(solo_dev, solo_enc->ch,
1105 return solo_set_motion_block(solo_dev, solo_enc->ch,
1209 static struct solo_enc_dev *solo_enc_alloc(struct solo_dev *solo_dev,
1230 if (tw28_has_sharpness(solo_dev, ch))
1234 V4L2_CID_MPEG_VIDEO_GOP_SIZE, 1, 255, 1, solo_dev->fps);
1252 solo_enc->solo_dev = solo_dev;
1257 solo_enc->fmt = (solo_dev->type == SOLO_DEV_6010) ?
1262 solo_enc->gop = solo_dev->fps;
1276 solo_enc->vidq.dev = &solo_dev->pdev->dev;
1289 solo_enc->desc_items = pci_alloc_consistent(solo_dev->pdev,
1302 solo_enc->vfd->v4l2_dev = &solo_dev->v4l2_dev;
1312 "%s-enc (%i/%i)", SOLO6X10_NAME, solo_dev->vfd->num,
1320 pci_free_consistent(solo_enc->solo_dev->pdev,
1334 pci_free_consistent(solo_enc->solo_dev->pdev,
1342 int solo_enc_v4l2_init(struct solo_dev *solo_dev, unsigned nr)
1346 init_waitqueue_head(&solo_dev->ring_thread_wait);
1348 solo_dev->vh_size = sizeof(vop_header);
1349 solo_dev->vh_buf = pci_alloc_consistent(solo_dev->pdev,
1350 solo_dev->vh_size,
1351 &solo_dev->vh_dma);
1352 if (solo_dev->vh_buf == NULL)
1355 for (i = 0; i < solo_dev->nr_chans; i++) {
1356 solo_dev->v4l2_enc[i] = solo_enc_alloc(solo_dev, i, nr);
1357 if (IS_ERR(solo_dev->v4l2_enc[i]))
1361 if (i != solo_dev->nr_chans) {
1362 int ret = PTR_ERR(solo_dev->v4l2_enc[i]);
1365 solo_enc_free(solo_dev->v4l2_enc[i]);
1366 pci_free_consistent(solo_dev->pdev, solo_dev->vh_size,
1367 solo_dev->vh_buf, solo_dev->vh_dma);
1368 solo_dev->vh_buf = NULL;
1372 if (solo_dev->type == SOLO_DEV_6010)
1373 solo_dev->enc_bw_remain = solo_dev->fps * 4 * 4;
1375 solo_dev->enc_bw_remain = solo_dev->fps * 4 * 5;
1377 dev_info(&solo_dev->pdev->dev, "Encoders as /dev/video%d-%d\n",
1378 solo_dev->v4l2_enc[0]->vfd->num,
1379 solo_dev->v4l2_enc[solo_dev->nr_chans - 1]->vfd->num);
1381 return solo_ring_start(solo_dev);
1384 void solo_enc_v4l2_exit(struct solo_dev *solo_dev)
1388 solo_ring_stop(solo_dev);
1390 for (i = 0; i < solo_dev->nr_chans; i++)
1391 solo_enc_free(solo_dev->v4l2_enc[i]);
1393 if (solo_dev->vh_buf)
1394 pci_free_consistent(solo_dev->pdev, solo_dev->vh_size,
1395 solo_dev->vh_buf, solo_dev->vh_dma);