Lines Matching defs:solo_dev
134 struct solo6010_dev *solo_dev = solo_enc->solo_dev;
137 if (solo_dev->motion_mask & (1 << ch))
144 struct solo6010_dev *solo_dev = solo_enc->solo_dev;
150 solo_dev->motion_mask |= (1 << ch);
152 solo_dev->motion_mask &= ~(1 << ch);
154 solo_reg_write(solo_dev, SOLO_VI_MOT_ADR,
155 SOLO_VI_MOTION_EN(solo_dev->motion_mask) |
156 (SOLO_MOTION_EXT_ADDR(solo_dev) >> 16));
158 if (solo_dev->motion_mask)
159 solo6010_irq_on(solo_dev, SOLO_IRQ_MOTION);
161 solo6010_irq_off(solo_dev, SOLO_IRQ_MOTION);
169 struct solo6010_dev *solo_dev = solo_enc->solo_dev;
174 solo_enc->bw_weight = max(solo_dev->fps / solo_enc->interval, 1);
178 solo_enc->width = solo_dev->video_hsize >> 1;
179 solo_enc->height = solo_dev->video_vsize;
182 solo_enc->width = solo_dev->video_hsize;
183 solo_enc->height = solo_dev->video_vsize << 1;
196 struct solo6010_dev *solo_dev = solo_enc->solo_dev;
208 if (solo_enc->bw_weight > solo_dev->enc_bw_remain)
211 solo_dev->enc_bw_remain -= solo_enc->bw_weight;
220 fh->rd_idx = solo_enc->solo_dev->enc_wr_idx;
223 solo_reg_write(solo_dev, SOLO_CAP_CH_COMP_ENA_E(ch), 1);
229 solo_reg_write(solo_dev, SOLO_CAP_CH_SCALE(ch), 0);
232 solo_reg_write(solo_dev, SOLO_VE_CH_INTL(ch),
241 solo_reg_write(solo_dev, SOLO_VE_CH_GOP(ch), solo_enc->gop);
242 solo_reg_write(solo_dev, SOLO_VE_CH_QP(ch), solo_enc->qp);
243 solo_reg_write(solo_dev, SOLO_CAP_CH_INTV(ch), interval);
246 solo_reg_write(solo_dev, SOLO_VE_CH_GOP_E(ch), solo_enc->gop);
247 solo_reg_write(solo_dev, SOLO_VE_CH_QP_E(ch), solo_enc->qp);
248 solo_reg_write(solo_dev, SOLO_CAP_CH_INTV_E(ch), interval);
251 solo_reg_write(solo_dev, SOLO_CAP_CH_SCALE(ch), solo_enc->mode);
262 struct solo6010_dev *solo_dev = solo_enc->solo_dev;
272 solo_dev->enc_bw_remain += solo_enc->bw_weight;
278 solo_reg_write(solo_dev, SOLO_CAP_CH_SCALE(solo_enc->ch), 0);
279 solo_reg_write(solo_dev, SOLO_CAP_CH_COMP_ENA_E(solo_enc->ch), 0);
282 static void enc_reset_gop(struct solo6010_dev *solo_dev, u8 ch)
284 BUG_ON(ch >= solo_dev->nr_chans);
285 solo_reg_write(solo_dev, SOLO_VE_CH_GOP(ch), 1);
286 solo_dev->v4l2_enc[ch]->reset_gop = 1;
289 static int enc_gop_reset(struct solo6010_dev *solo_dev, u8 ch, u8 vop)
291 BUG_ON(ch >= solo_dev->nr_chans);
292 if (!solo_dev->v4l2_enc[ch]->reset_gop)
296 solo_dev->v4l2_enc[ch]->reset_gop = 0;
297 solo_reg_write(solo_dev, SOLO_VE_CH_GOP(ch),
298 solo_dev->v4l2_enc[ch]->gop);
302 static int enc_get_mpeg_dma_t(struct solo6010_dev *solo_dev, dma_addr_t buf,
307 if (off > SOLO_MP4E_EXT_SIZE(solo_dev))
310 if (off + size <= SOLO_MP4E_EXT_SIZE(solo_dev))
311 return solo_p2m_dma_t(solo_dev, SOLO_P2M_DMA_ID_MP4E, 0, buf,
312 SOLO_MP4E_EXT_ADDR(solo_dev) + off, size);
315 ret = solo_p2m_dma_t(solo_dev, SOLO_P2M_DMA_ID_MP4E, 0, buf,
316 SOLO_MP4E_EXT_ADDR(solo_dev) + off,
317 SOLO_MP4E_EXT_SIZE(solo_dev) - off);
319 ret |= solo_p2m_dma_t(solo_dev, SOLO_P2M_DMA_ID_MP4E, 0,
320 buf + SOLO_MP4E_EXT_SIZE(solo_dev) - off,
321 SOLO_MP4E_EXT_ADDR(solo_dev),
322 size + off - SOLO_MP4E_EXT_SIZE(solo_dev));
327 static int enc_get_mpeg_dma(struct solo6010_dev *solo_dev, void *buf,
332 dma_addr_t dma_addr = pci_map_single(solo_dev->pdev, buf, size,
334 ret = enc_get_mpeg_dma_t(solo_dev, dma_addr, off, size);
335 pci_unmap_single(solo_dev->pdev, dma_addr, size, PCI_DMA_FROMDEVICE);
340 static int enc_get_jpeg_dma(struct solo6010_dev *solo_dev, dma_addr_t buf,
345 if (off > SOLO_JPEG_EXT_SIZE(solo_dev))
348 if (off + size <= SOLO_JPEG_EXT_SIZE(solo_dev))
349 return solo_p2m_dma_t(solo_dev, SOLO_P2M_DMA_ID_JPEG, 0, buf,
350 SOLO_JPEG_EXT_ADDR(solo_dev) + off, size);
353 ret = solo_p2m_dma_t(solo_dev, SOLO_P2M_DMA_ID_JPEG, 0, buf,
354 SOLO_JPEG_EXT_ADDR(solo_dev) + off,
355 SOLO_JPEG_EXT_SIZE(solo_dev) - off);
357 ret |= solo_p2m_dma_t(solo_dev, SOLO_P2M_DMA_ID_JPEG, 0,
358 buf + SOLO_JPEG_EXT_SIZE(solo_dev) - off,
359 SOLO_JPEG_EXT_ADDR(solo_dev),
360 size + off - SOLO_JPEG_EXT_SIZE(solo_dev));
369 struct solo6010_dev *solo_dev = solo_enc->solo_dev;
381 return enc_get_jpeg_dma(solo_dev, vbuf, enc_buf->jpeg_off,
389 struct solo6010_dev *solo_dev = solo_enc->solo_dev;
398 ret = enc_get_mpeg_dma(solo_dev, &vh, enc_buf->off, sizeof(vh));
411 u16 fps = solo_dev->fps * 1000;
417 if (solo_dev->video_type == SOLO_VO_FMT_TYPE_NTSC)
443 frame_off = (enc_buf->off + sizeof(vh)) % SOLO_MP4E_EXT_SIZE(solo_dev);
445 ret = enc_get_mpeg_dma_t(solo_dev, vbuf, frame_off, frame_size);
457 struct solo6010_dev *solo_dev = solo_enc->solo_dev;
463 while (idx != solo_dev->enc_wr_idx) {
464 struct solo_enc_buf *ebuf = &solo_dev->enc_buf[idx];
563 void solo_motion_isr(struct solo6010_dev *solo_dev)
568 solo_reg_write(solo_dev, SOLO_IRQ_STAT, SOLO_IRQ_MOTION);
570 status = solo_reg_read(solo_dev, SOLO_VI_MOT_STATUS);
572 for (i = 0; i < solo_dev->nr_chans; i++) {
573 struct solo_enc_dev *solo_enc = solo_dev->v4l2_enc[i];
586 void solo_enc_v4l2_isr(struct solo6010_dev *solo_dev)
597 solo_reg_write(solo_dev, SOLO_IRQ_STAT, SOLO_IRQ_ENCODER);
599 vstatus.status11 = solo_reg_read(solo_dev, SOLO_VE_STATE(11));
602 vstatus.status0 = solo_reg_read(solo_dev, SOLO_VE_STATE(0));
606 while (solo_dev->enc_idx != cur_q) {
607 mpeg_current = solo_reg_read(solo_dev,
608 SOLO_VE_MPEG4_QUE(solo_dev->enc_idx));
609 jpeg_current = solo_reg_read(solo_dev,
610 SOLO_VE_JPEG_QUE(solo_dev->enc_idx));
611 solo_dev->enc_idx = (solo_dev->enc_idx + 1) % MP4_QS;
612 mpeg_next = solo_reg_read(solo_dev,
613 SOLO_VE_MPEG4_QUE(solo_dev->enc_idx));
614 jpeg_next = solo_reg_read(solo_dev,
615 SOLO_VE_JPEG_QUE(solo_dev->enc_idx));
630 mpeg_size = (SOLO_MP4E_EXT_SIZE(solo_dev) +
632 SOLO_MP4E_EXT_SIZE(solo_dev);
634 jpeg_size = (SOLO_JPEG_EXT_SIZE(solo_dev) +
636 SOLO_JPEG_EXT_SIZE(solo_dev);
639 enc_reset_gop(solo_dev, ch);
644 if (enc_gop_reset(solo_dev, ch, vop_type))
647 enc_buf = &solo_dev->enc_buf[solo_dev->enc_wr_idx];
659 solo_dev->enc_wr_idx = (solo_dev->enc_wr_idx + 1) %
662 wake_up_interruptible(&solo_dev->v4l2_enc[ch]->thread_wait);
764 &solo_enc->solo_dev->pdev->dev,
813 struct solo6010_dev *solo_dev = solo_enc->solo_dev;
819 pci_name(solo_dev->pdev));
832 struct solo6010_dev *solo_dev = solo_enc->solo_dev;
841 if (solo_dev->video_type == SOLO_VO_FMT_TYPE_NTSC)
846 if (!tw28_get_video_status(solo_dev, solo_enc->ch))
894 struct solo6010_dev *solo_dev = solo_enc->solo_dev;
906 } else if (!(pix->width == solo_dev->video_hsize &&
907 pix->height == solo_dev->video_vsize << 1) &&
908 !(pix->width == solo_dev->video_hsize >> 1 &&
909 pix->height == solo_dev->video_vsize)) {
911 pix->width = solo_dev->video_hsize >> 1;
912 pix->height = solo_dev->video_vsize;
933 struct solo6010_dev *solo_dev = solo_enc->solo_dev;
944 if (pix->width == solo_dev->video_hsize)
1027 solo_reg_write(solo_enc->solo_dev, SOLO_VI_MOT_CLEAR,
1077 struct solo6010_dev *solo_dev = fh->enc->solo_dev;
1084 fsize->discrete.width = solo_dev->video_hsize >> 1;
1085 fsize->discrete.height = solo_dev->video_vsize;
1088 fsize->discrete.width = solo_dev->video_hsize;
1089 fsize->discrete.height = solo_dev->video_vsize << 1;
1104 struct solo6010_dev *solo_dev = fh->enc->solo_dev;
1111 fintv->stepwise.min.numerator = solo_dev->fps;
1114 fintv->stepwise.max.numerator = solo_dev->fps;
1128 struct solo6010_dev *solo_dev = solo_enc->solo_dev;
1133 cp->timeperframe.denominator = solo_dev->fps;
1145 struct solo6010_dev *solo_dev = solo_enc->solo_dev;
1159 cp->timeperframe.denominator = solo_dev->fps;
1162 if (cp->timeperframe.denominator != solo_dev->fps)
1163 cp->timeperframe.denominator = solo_dev->fps;
1172 solo_enc->gop = max(solo_dev->fps / solo_enc->interval, 1);
1185 struct solo6010_dev *solo_dev = solo_enc->solo_dev;
1205 return v4l2_ctrl_query_fill(qc, 1, 255, 1, solo_dev->fps);
1262 struct solo6010_dev *solo_dev = solo_enc->solo_dev;
1270 return tw28_get_ctrl_val(solo_dev, ctrl->id, solo_enc->ch,
1296 struct solo6010_dev *solo_dev = solo_enc->solo_dev;
1304 return tw28_set_ctrl_val(solo_dev, ctrl->id, solo_enc->ch,
1314 solo_reg_write(solo_dev, SOLO_VE_CH_GOP(solo_enc->ch),
1316 solo_reg_write(solo_dev, SOLO_VE_CH_GOP_E(solo_enc->ch),
1325 solo_set_motion_threshold(solo_dev, solo_enc->ch, ctrl->value);
1464 static struct solo_enc_dev *solo_enc_alloc(struct solo6010_dev *solo_dev, u8 ch)
1479 solo_enc->solo_dev = solo_dev;
1483 solo_enc->vfd->parent = &solo_dev->pdev->dev;
1495 "%s-enc (%i/%i)", SOLO6010_NAME, solo_dev->vfd->num,
1506 solo_enc->gop = solo_dev->fps;
1527 int solo_enc_v4l2_init(struct solo6010_dev *solo_dev)
1531 for (i = 0; i < solo_dev->nr_chans; i++) {
1532 solo_dev->v4l2_enc[i] = solo_enc_alloc(solo_dev, i);
1533 if (IS_ERR(solo_dev->v4l2_enc[i]))
1537 if (i != solo_dev->nr_chans) {
1538 int ret = PTR_ERR(solo_dev->v4l2_enc[i]);
1540 solo_enc_free(solo_dev->v4l2_enc[i]);
1545 solo_dev->enc_bw_remain = solo_dev->fps * 4 * 4;
1547 dev_info(&solo_dev->pdev->dev, "Encoders as /dev/video%d-%d\n",
1548 solo_dev->v4l2_enc[0]->vfd->num,
1549 solo_dev->v4l2_enc[solo_dev->nr_chans - 1]->vfd->num);
1554 void solo_enc_v4l2_exit(struct solo6010_dev *solo_dev)
1558 solo6010_irq_off(solo_dev, SOLO_IRQ_MOTION);
1560 for (i = 0; i < solo_dev->nr_chans; i++)
1561 solo_enc_free(solo_dev->v4l2_enc[i]);