Lines Matching +full:rx +full:- +full:ctrl
1 // SPDX-License-Identifier: GPL-2.0-only
5 * Derived from ivtv-ioctl.c and cx18-fileops.c
7 * Copyright 2012-2015 Cisco Systems, Inc. and/or its affiliates.
11 #include <linux/dma-mapping.h>
15 #include <linux/v4l2-dv-timings.h>
17 #include <media/v4l2-ctrls.h>
18 #include <media/v4l2-event.h>
19 #include <media/v4l2-dv-timings.h>
23 #include "cobalt-alsa.h"
24 #include "cobalt-cpld.h"
25 #include "cobalt-driver.h"
26 #include "cobalt-v4l2.h"
27 #include "cobalt-irq.h"
28 #include "cobalt-omnitek.h"
38 struct cobalt_stream *s = q->drv_priv; in cobalt_queue_setup()
39 unsigned size = s->stride * s->height; in cobalt_queue_setup()
46 return sizes[0] < size ? -EINVAL : 0; in cobalt_queue_setup()
54 struct cobalt_stream *s = vb->vb2_queue->drv_priv; in cobalt_buf_init()
55 struct cobalt *cobalt = s->cobalt; in cobalt_buf_init()
61 struct sg_dma_desc_info *desc = &s->dma_desc_info[vb->index]; in cobalt_buf_init()
66 size = s->stride * s->height; in cobalt_buf_init()
70 return -EINVAL; in cobalt_buf_init()
73 if (desc->virt == NULL) { in cobalt_buf_init()
74 desc->dev = &cobalt->pci_dev->dev; in cobalt_buf_init()
76 s->is_audio ? audio_bytes : bytes); in cobalt_buf_init()
77 if (desc->virt == NULL) in cobalt_buf_init()
78 return -ENOMEM; in cobalt_buf_init()
80 ret = descriptor_list_create(cobalt, sg_desc->sgl, in cobalt_buf_init()
81 !s->is_output, sg_desc->nents, size, in cobalt_buf_init()
82 s->width * s->bpp, s->stride, desc); in cobalt_buf_init()
90 struct cobalt_stream *s = vb->vb2_queue->drv_priv; in cobalt_buf_cleanup()
91 struct sg_dma_desc_info *desc = &s->dma_desc_info[vb->index]; in cobalt_buf_cleanup()
99 struct cobalt_stream *s = vb->vb2_queue->drv_priv; in cobalt_buf_prepare()
101 vb2_set_plane_payload(vb, 0, s->stride * s->height); in cobalt_buf_prepare()
102 vbuf->field = V4L2_FIELD_NONE; in cobalt_buf_prepare()
113 list_for_each(p, &s->bufs) { in chain_all_buffers()
115 desc[i] = &s->dma_desc_info[cb->vb.vb2_buf.index]; in chain_all_buffers()
117 descriptor_list_chain(desc[i-1], desc[i]); in chain_all_buffers()
125 struct vb2_queue *q = vb->vb2_queue; in cobalt_buf_queue()
126 struct cobalt_stream *s = q->drv_priv; in cobalt_buf_queue()
128 struct sg_dma_desc_info *desc = &s->dma_desc_info[vb->index]; in cobalt_buf_queue()
135 spin_lock_irqsave(&s->irqlock, flags); in cobalt_buf_queue()
136 list_add_tail(&cb->list, &s->bufs); in cobalt_buf_queue()
138 spin_unlock_irqrestore(&s->irqlock, flags); in cobalt_buf_queue()
143 struct cobalt *cobalt = s->cobalt; in cobalt_enable_output()
144 struct v4l2_bt_timings *bt = &s->timings.bt; in cobalt_enable_output()
147 unsigned fmt = s->pixfmt != V4L2_PIX_FMT_BGR32 ? in cobalt_enable_output()
152 u64 clk = bt->pixelclock; in cobalt_enable_output()
154 if (bt->flags & V4L2_DV_FL_REDUCED_FPS) in cobalt_enable_output()
161 sd_fmt.format.colorspace = s->colorspace; in cobalt_enable_output()
162 sd_fmt.format.xfer_func = s->xfer_func; in cobalt_enable_output()
163 sd_fmt.format.ycbcr_enc = s->ycbcr_enc; in cobalt_enable_output()
164 sd_fmt.format.quantization = s->quantization; in cobalt_enable_output()
165 sd_fmt.format.width = bt->width; in cobalt_enable_output()
166 sd_fmt.format.height = bt->height; in cobalt_enable_output()
169 switch (s->pixfmt) { in cobalt_enable_output()
177 v4l2_subdev_call(s->sd, pad, set_fmt, NULL, &sd_fmt); in cobalt_enable_output()
179 iowrite32(0, &vo->control); in cobalt_enable_output()
181 iowrite32(bt->hsync, &vo->sync_generator_h_sync_length); in cobalt_enable_output()
182 iowrite32(bt->hbackporch, &vo->sync_generator_h_backporch_length); in cobalt_enable_output()
183 iowrite32(bt->width, &vo->sync_generator_h_active_length); in cobalt_enable_output()
184 iowrite32(bt->hfrontporch, &vo->sync_generator_h_frontporch_length); in cobalt_enable_output()
185 iowrite32(bt->vsync, &vo->sync_generator_v_sync_length); in cobalt_enable_output()
186 iowrite32(bt->vbackporch, &vo->sync_generator_v_backporch_length); in cobalt_enable_output()
187 iowrite32(bt->height, &vo->sync_generator_v_active_length); in cobalt_enable_output()
188 iowrite32(bt->vfrontporch, &vo->sync_generator_v_frontporch_length); in cobalt_enable_output()
189 iowrite32(0x9900c1, &vo->error_color); in cobalt_enable_output()
192 &vo->control); in cobalt_enable_output()
193 iowrite32(M00514_CONTROL_BITMAP_EVCNT_CLEAR_MSK | fmt, &vo->control); in cobalt_enable_output()
196 fmt, &vo->control); in cobalt_enable_output()
201 struct cobalt *cobalt = s->cobalt; in cobalt_enable_input()
202 int ch = (int)s->video_channel; in cobalt_enable_input()
205 .pad = s->pad_source, in cobalt_enable_input()
210 .pad = s->pad_source, in cobalt_enable_input()
216 s->video_channel, in cobalt_enable_input()
217 s->input == 0 ? "hdmi" : "generator", in cobalt_enable_input()
223 switch (s->pixfmt) { in cobalt_enable_input()
227 &packer->control); in cobalt_enable_input()
228 v4l2_subdev_call(s->sd, pad, set_fmt, NULL, in cobalt_enable_input()
234 &packer->control); in cobalt_enable_input()
235 v4l2_subdev_call(s->sd, pad, set_fmt, NULL, in cobalt_enable_input()
242 &packer->control); in cobalt_enable_input()
243 v4l2_subdev_call(s->sd, pad, set_fmt, NULL, in cobalt_enable_input()
251 struct cobalt *cobalt = s->cobalt; in cobalt_dma_start_streaming()
252 int rx = s->video_channel; in cobalt_dma_start_streaming() local
254 COBALT_CVI_EVCNT(cobalt, rx); in cobalt_dma_start_streaming()
258 spin_lock_irqsave(&s->irqlock, flags); in cobalt_dma_start_streaming()
259 if (!s->is_output) { in cobalt_dma_start_streaming()
260 iowrite32(M00460_CONTROL_BITMAP_CLEAR_MSK, &evcnt->control); in cobalt_dma_start_streaming()
261 iowrite32(M00460_CONTROL_BITMAP_ENABLE_MSK, &evcnt->control); in cobalt_dma_start_streaming()
265 u32 ctrl = ioread32(&vo->control); in cobalt_dma_start_streaming() local
267 ctrl &= ~(M00514_CONTROL_BITMAP_EVCNT_ENABLE_MSK | in cobalt_dma_start_streaming()
269 iowrite32(ctrl | M00514_CONTROL_BITMAP_EVCNT_CLEAR_MSK, in cobalt_dma_start_streaming()
270 &vo->control); in cobalt_dma_start_streaming()
271 iowrite32(ctrl | M00514_CONTROL_BITMAP_EVCNT_ENABLE_MSK, in cobalt_dma_start_streaming()
272 &vo->control); in cobalt_dma_start_streaming()
274 cb = list_first_entry(&s->bufs, struct cobalt_buffer, list); in cobalt_dma_start_streaming()
275 omni_sg_dma_start(s, &s->dma_desc_info[cb->vb.vb2_buf.index]); in cobalt_dma_start_streaming()
276 spin_unlock_irqrestore(&s->irqlock, flags); in cobalt_dma_start_streaming()
281 struct cobalt_stream *s = q->drv_priv; in cobalt_start_streaming()
282 struct cobalt *cobalt = s->cobalt; in cobalt_start_streaming()
286 int rx = s->video_channel; in cobalt_start_streaming() local
287 struct m00389_cvi_regmap __iomem *cvi = COBALT_CVI(cobalt, rx); in cobalt_start_streaming()
288 struct m00460_evcnt_regmap __iomem *evcnt = COBALT_CVI_EVCNT(cobalt, rx); in cobalt_start_streaming()
289 struct v4l2_bt_timings *bt = &s->timings.bt; in cobalt_start_streaming()
293 if (s->is_audio) in cobalt_start_streaming()
295 if (s->is_output) { in cobalt_start_streaming()
296 s->unstable_frame = false; in cobalt_start_streaming()
303 fw = COBALT_CVI_FREEWHEEL(cobalt, rx); in cobalt_start_streaming()
304 vmr = COBALT_CVI_VMR(cobalt, rx); in cobalt_start_streaming()
305 clkloss = COBALT_CVI_CLK_LOSS(cobalt, rx); in cobalt_start_streaming()
307 iowrite32(M00460_CONTROL_BITMAP_CLEAR_MSK, &evcnt->control); in cobalt_start_streaming()
308 iowrite32(M00460_CONTROL_BITMAP_ENABLE_MSK, &evcnt->control); in cobalt_start_streaming()
309 iowrite32(bt->width, &cvi->frame_width); in cobalt_start_streaming()
310 iowrite32(bt->height, &cvi->frame_height); in cobalt_start_streaming()
313 bt->pixelclock), &vmr->hsync_timeout_val); in cobalt_start_streaming()
314 iowrite32(M00233_CONTROL_BITMAP_ENABLE_MEASURE_MSK, &vmr->control); in cobalt_start_streaming()
315 clk_freq = ioread32(&fw->clk_freq); in cobalt_start_streaming()
316 iowrite32(clk_freq / 1000000, &clkloss->ref_clk_cnt_val); in cobalt_start_streaming()
319 iowrite32(div_u64(bt->pixelclock * 995, 1000000000), in cobalt_start_streaming()
320 &clkloss->test_clk_cnt_val); in cobalt_start_streaming()
322 iowrite32(bt->width * bt->height, &fw->active_length); in cobalt_start_streaming()
323 iowrite32(div_u64((u64)clk_freq * tot_size, bt->pixelclock), in cobalt_start_streaming()
324 &fw->total_length); in cobalt_start_streaming()
327 &vmr->irq_triggers); in cobalt_start_streaming()
328 iowrite32(0, &cvi->control); in cobalt_start_streaming()
329 iowrite32(M00233_CONTROL_BITMAP_ENABLE_MEASURE_MSK, &vmr->control); in cobalt_start_streaming()
331 iowrite32(0xff, &fw->output_color); in cobalt_start_streaming()
332 iowrite32(M00479_CTRL_BITMAP_ENABLE_MSK, &clkloss->ctrl); in cobalt_start_streaming()
334 M00473_CTRL_BITMAP_FORCE_FREEWHEEL_MODE_MSK, &fw->ctrl); in cobalt_start_streaming()
335 s->unstable_frame = true; in cobalt_start_streaming()
336 s->enable_freewheel = false; in cobalt_start_streaming()
337 s->enable_cvi = false; in cobalt_start_streaming()
338 s->skip_first_frames = 0; in cobalt_start_streaming()
341 s->sequence = 0; in cobalt_start_streaming()
348 struct cobalt *cobalt = s->cobalt; in cobalt_dma_stop_streaming()
354 int rx = s->video_channel; in cobalt_dma_stop_streaming() local
356 COBALT_CVI_EVCNT(cobalt, rx); in cobalt_dma_stop_streaming()
358 if (!s->is_output) { in cobalt_dma_stop_streaming()
359 iowrite32(0, &evcnt->control); in cobalt_dma_stop_streaming()
360 } else if (!s->is_audio) { in cobalt_dma_stop_streaming()
364 iowrite32(M00514_CONTROL_BITMAP_EVCNT_CLEAR_MSK, &vo->control); in cobalt_dma_stop_streaming()
365 iowrite32(0, &vo->control); in cobalt_dma_stop_streaming()
369 spin_lock_irqsave(&s->irqlock, flags); in cobalt_dma_stop_streaming()
370 list_for_each(p, &s->bufs) { in cobalt_dma_stop_streaming()
372 desc = &s->dma_desc_info[cb->vb.vb2_buf.index]; in cobalt_dma_stop_streaming()
376 spin_unlock_irqrestore(&s->irqlock, flags); in cobalt_dma_stop_streaming()
379 if (!wait_event_timeout(s->q.done_wq, is_dma_done(s), in cobalt_dma_stop_streaming()
385 1 << s->dma_channel); in cobalt_dma_stop_streaming()
390 struct cobalt_stream *s = q->drv_priv; in cobalt_stop_streaming()
391 struct cobalt *cobalt = s->cobalt; in cobalt_stop_streaming()
392 int rx = s->video_channel; in cobalt_stop_streaming() local
403 spin_lock_irqsave(&s->irqlock, flags); in cobalt_stop_streaming()
404 list_for_each_safe(p, safe, &s->bufs) { in cobalt_stop_streaming()
406 list_del(&cb->list); in cobalt_stop_streaming()
407 vb2_buffer_done(&cb->vb.vb2_buf, VB2_BUF_STATE_ERROR); in cobalt_stop_streaming()
409 spin_unlock_irqrestore(&s->irqlock, flags); in cobalt_stop_streaming()
411 if (s->is_audio || s->is_output) in cobalt_stop_streaming()
414 fw = COBALT_CVI_FREEWHEEL(cobalt, rx); in cobalt_stop_streaming()
415 vmr = COBALT_CVI_VMR(cobalt, rx); in cobalt_stop_streaming()
416 clkloss = COBALT_CVI_CLK_LOSS(cobalt, rx); in cobalt_stop_streaming()
417 iowrite32(0, &vmr->control); in cobalt_stop_streaming()
418 iowrite32(M00233_CONTROL_BITMAP_ENABLE_MEASURE_MSK, &vmr->control); in cobalt_stop_streaming()
419 iowrite32(0, &fw->ctrl); in cobalt_stop_streaming()
420 iowrite32(0, &clkloss->ctrl); in cobalt_stop_streaming()
441 void __iomem *adrs = cobalt->bar1 + regs->reg; in cobalt_cobaltc()
446 return -EPERM; in cobalt_cobaltc()
448 regs->size = 4; in cobalt_cobaltc()
450 iowrite32(regs->val, adrs); in cobalt_cobaltc()
452 regs->val = ioread32(adrs); in cobalt_cobaltc()
460 struct cobalt *cobalt = s->cobalt; in cobalt_g_register()
469 struct cobalt *cobalt = s->cobalt; in cobalt_s_register()
480 struct cobalt *cobalt = s->cobalt; in cobalt_querycap()
482 strscpy(vcap->driver, "cobalt", sizeof(vcap->driver)); in cobalt_querycap()
483 strscpy(vcap->card, "cobalt", sizeof(vcap->card)); in cobalt_querycap()
484 snprintf(vcap->bus_info, sizeof(vcap->bus_info), in cobalt_querycap()
485 "PCIe:%s", pci_name(cobalt->pci_dev)); in cobalt_querycap()
486 vcap->capabilities = V4L2_CAP_STREAMING | V4L2_CAP_READWRITE | in cobalt_querycap()
488 if (cobalt->have_hsma_tx) in cobalt_querycap()
489 vcap->capabilities |= V4L2_CAP_VIDEO_OUTPUT; in cobalt_querycap()
500 int rx = s->video_channel; in cobalt_video_input_status_show() local
501 struct cobalt *cobalt = s->cobalt; in cobalt_video_input_status_show()
505 cvi = COBALT_CVI(cobalt, rx); in cobalt_video_input_status_show()
506 vmr = COBALT_CVI_VMR(cobalt, rx); in cobalt_video_input_status_show()
507 fw = COBALT_CVI_FREEWHEEL(cobalt, rx); in cobalt_video_input_status_show()
508 clkloss = COBALT_CVI_CLK_LOSS(cobalt, rx); in cobalt_video_input_status_show()
509 packer = COBALT_CVI_PACKER(cobalt, rx); in cobalt_video_input_status_show()
510 cvi_ctrl = ioread32(&cvi->control); in cobalt_video_input_status_show()
511 cvi_stat = ioread32(&cvi->status); in cobalt_video_input_status_show()
512 vmr_ctrl = ioread32(&vmr->control); in cobalt_video_input_status_show()
513 vmr_stat = ioread32(&vmr->status); in cobalt_video_input_status_show()
514 cobalt_info("rx%d: cvi resolution: %dx%d\n", rx, in cobalt_video_input_status_show()
515 ioread32(&cvi->frame_width), ioread32(&cvi->frame_height)); in cobalt_video_input_status_show()
516 cobalt_info("rx%d: cvi control: %s%s%s\n", rx, in cobalt_video_input_status_show()
520 "HSync- " : "HSync+ ", in cobalt_video_input_status_show()
522 "VSync- " : "VSync+ "); in cobalt_video_input_status_show()
523 cobalt_info("rx%d: cvi status: %s%s\n", rx, in cobalt_video_input_status_show()
525 "lock " : "no-lock ", in cobalt_video_input_status_show()
527 "error " : "no-error "); in cobalt_video_input_status_show()
529 cobalt_info("rx%d: Measurements: %s%s%s%s%s%s%s\n", rx, in cobalt_video_input_status_show()
531 "HSync- " : "HSync+ ", in cobalt_video_input_status_show()
533 "VSync- " : "VSync+ ", in cobalt_video_input_status_show()
537 "irq-enabled " : "irq-disabled ", in cobalt_video_input_status_show()
539 "update-on-hsync " : "", in cobalt_video_input_status_show()
541 "hsync-timeout " : "", in cobalt_video_input_status_show()
543 "init-done" : ""); in cobalt_video_input_status_show()
544 cobalt_info("rx%d: irq_status: 0x%02x irq_triggers: 0x%02x\n", rx, in cobalt_video_input_status_show()
545 ioread32(&vmr->irq_status) & 0xff, in cobalt_video_input_status_show()
546 ioread32(&vmr->irq_triggers) & 0xff); in cobalt_video_input_status_show()
547 cobalt_info("rx%d: vsync: %d\n", rx, ioread32(&vmr->vsync_time)); in cobalt_video_input_status_show()
548 cobalt_info("rx%d: vbp: %d\n", rx, ioread32(&vmr->vback_porch)); in cobalt_video_input_status_show()
549 cobalt_info("rx%d: vact: %d\n", rx, ioread32(&vmr->vactive_area)); in cobalt_video_input_status_show()
550 cobalt_info("rx%d: vfb: %d\n", rx, ioread32(&vmr->vfront_porch)); in cobalt_video_input_status_show()
551 cobalt_info("rx%d: hsync: %d\n", rx, ioread32(&vmr->hsync_time)); in cobalt_video_input_status_show()
552 cobalt_info("rx%d: hbp: %d\n", rx, ioread32(&vmr->hback_porch)); in cobalt_video_input_status_show()
553 cobalt_info("rx%d: hact: %d\n", rx, ioread32(&vmr->hactive_area)); in cobalt_video_input_status_show()
554 cobalt_info("rx%d: hfb: %d\n", rx, ioread32(&vmr->hfront_porch)); in cobalt_video_input_status_show()
555 cobalt_info("rx%d: Freewheeling: %s%s%s\n", rx, in cobalt_video_input_status_show()
556 (ioread32(&fw->ctrl) & M00473_CTRL_BITMAP_ENABLE_MSK) ? in cobalt_video_input_status_show()
558 (ioread32(&fw->ctrl) & M00473_CTRL_BITMAP_FORCE_FREEWHEEL_MODE_MSK) ? in cobalt_video_input_status_show()
560 (ioread32(&fw->status) & M00473_STATUS_BITMAP_FREEWHEEL_MODE_MSK) ? in cobalt_video_input_status_show()
561 "freewheeling " : "video-passthrough "); in cobalt_video_input_status_show()
562 iowrite32(0xff, &vmr->irq_status); in cobalt_video_input_status_show()
563 cobalt_info("rx%d: Clock Loss Detection: %s%s\n", rx, in cobalt_video_input_status_show()
564 (ioread32(&clkloss->ctrl) & M00479_CTRL_BITMAP_ENABLE_MSK) ? in cobalt_video_input_status_show()
566 (ioread32(&clkloss->status) & M00479_STATUS_BITMAP_CLOCK_MISSING_MSK) ? in cobalt_video_input_status_show()
567 "clock-missing " : "found-clock "); in cobalt_video_input_status_show()
568 cobalt_info("rx%d: Packer: %x\n", rx, ioread32(&packer->control)); in cobalt_video_input_status_show()
574 struct cobalt *cobalt = s->cobalt; in cobalt_log_status()
579 cobalt_info("%s", cobalt->hdl_info); in cobalt_log_status()
584 s->dma_channel, s->video_channel); in cobalt_log_status()
588 v4l2_subdev_call(s->sd, core, log_status); in cobalt_log_status()
589 if (!s->is_output) { in cobalt_log_status()
594 stat = ioread32(&vo->rd_status); in cobalt_log_status()
601 cobalt_info("tx: evcnt: %d\n", ioread32(&vo->rd_evcnt_count)); in cobalt_log_status()
610 if (s->input == 1) { in cobalt_enum_dv_timings()
611 if (timings->index) in cobalt_enum_dv_timings()
612 return -EINVAL; in cobalt_enum_dv_timings()
613 memset(timings->reserved, 0, sizeof(timings->reserved)); in cobalt_enum_dv_timings()
614 timings->timings = cea1080p60; in cobalt_enum_dv_timings()
617 timings->pad = 0; in cobalt_enum_dv_timings()
618 return v4l2_subdev_call(s->sd, in cobalt_enum_dv_timings()
628 if (s->input == 1) { in cobalt_s_dv_timings()
633 if (v4l2_match_dv_timings(timings, &s->timings, 0, true)) in cobalt_s_dv_timings()
636 if (vb2_is_busy(&s->q)) in cobalt_s_dv_timings()
637 return -EBUSY; in cobalt_s_dv_timings()
639 err = v4l2_subdev_call(s->sd, in cobalt_s_dv_timings()
642 s->timings = *timings; in cobalt_s_dv_timings()
643 s->width = timings->bt.width; in cobalt_s_dv_timings()
644 s->height = timings->bt.height; in cobalt_s_dv_timings()
645 s->stride = timings->bt.width * s->bpp; in cobalt_s_dv_timings()
655 if (s->input == 1) { in cobalt_g_dv_timings()
659 return v4l2_subdev_call(s->sd, in cobalt_g_dv_timings()
668 if (s->input == 1) { in cobalt_query_dv_timings()
672 return v4l2_subdev_call(s->sd, in cobalt_query_dv_timings()
681 cap->pad = 0; in cobalt_dv_timings_cap()
682 return v4l2_subdev_call(s->sd, in cobalt_dv_timings_cap()
689 switch (f->index) { in cobalt_enum_fmt_vid_cap()
691 f->pixelformat = V4L2_PIX_FMT_YUYV; in cobalt_enum_fmt_vid_cap()
694 f->pixelformat = V4L2_PIX_FMT_RGB24; in cobalt_enum_fmt_vid_cap()
697 f->pixelformat = V4L2_PIX_FMT_BGR32; in cobalt_enum_fmt_vid_cap()
700 return -EINVAL; in cobalt_enum_fmt_vid_cap()
710 struct v4l2_pix_format *pix = &f->fmt.pix; in cobalt_g_fmt_vid_cap()
713 pix->width = s->width; in cobalt_g_fmt_vid_cap()
714 pix->height = s->height; in cobalt_g_fmt_vid_cap()
715 pix->bytesperline = s->stride; in cobalt_g_fmt_vid_cap()
716 pix->field = V4L2_FIELD_NONE; in cobalt_g_fmt_vid_cap()
718 if (s->input == 1) { in cobalt_g_fmt_vid_cap()
719 pix->colorspace = V4L2_COLORSPACE_SRGB; in cobalt_g_fmt_vid_cap()
721 sd_fmt.pad = s->pad_source; in cobalt_g_fmt_vid_cap()
723 v4l2_subdev_call(s->sd, pad, get_fmt, NULL, &sd_fmt); in cobalt_g_fmt_vid_cap()
727 pix->pixelformat = s->pixfmt; in cobalt_g_fmt_vid_cap()
728 pix->sizeimage = pix->bytesperline * pix->height; in cobalt_g_fmt_vid_cap()
737 struct v4l2_pix_format *pix = &f->fmt.pix; in cobalt_try_fmt_vid_cap()
741 if ((pix->width < 176) || (pix->height < 144)) { in cobalt_try_fmt_vid_cap()
742 pix->width = 176; in cobalt_try_fmt_vid_cap()
743 pix->height = 144; in cobalt_try_fmt_vid_cap()
746 if ((pix->width > 1920) || (pix->height > 1080)) { in cobalt_try_fmt_vid_cap()
747 pix->width = 1920; in cobalt_try_fmt_vid_cap()
748 pix->height = 1080; in cobalt_try_fmt_vid_cap()
752 pix->width &= ~0x3; in cobalt_try_fmt_vid_cap()
755 pix->height &= ~0x1; in cobalt_try_fmt_vid_cap()
757 if (s->input == 1) { in cobalt_try_fmt_vid_cap()
759 pix->width = 1920; in cobalt_try_fmt_vid_cap()
760 pix->height = 1080; in cobalt_try_fmt_vid_cap()
761 pix->colorspace = V4L2_COLORSPACE_SRGB; in cobalt_try_fmt_vid_cap()
763 sd_fmt.pad = s->pad_source; in cobalt_try_fmt_vid_cap()
765 v4l2_subdev_call(s->sd, pad, get_fmt, NULL, &sd_fmt); in cobalt_try_fmt_vid_cap()
769 switch (pix->pixelformat) { in cobalt_try_fmt_vid_cap()
772 pix->bytesperline = max(pix->bytesperline & ~0x3, in cobalt_try_fmt_vid_cap()
773 pix->width * COBALT_BYTES_PER_PIXEL_YUYV); in cobalt_try_fmt_vid_cap()
774 pix->pixelformat = V4L2_PIX_FMT_YUYV; in cobalt_try_fmt_vid_cap()
777 pix->bytesperline = max(pix->bytesperline & ~0x3, in cobalt_try_fmt_vid_cap()
778 pix->width * COBALT_BYTES_PER_PIXEL_RGB24); in cobalt_try_fmt_vid_cap()
781 pix->bytesperline = max(pix->bytesperline & ~0x3, in cobalt_try_fmt_vid_cap()
782 pix->width * COBALT_BYTES_PER_PIXEL_RGB32); in cobalt_try_fmt_vid_cap()
786 pix->sizeimage = pix->bytesperline * pix->height; in cobalt_try_fmt_vid_cap()
787 pix->field = V4L2_FIELD_NONE; in cobalt_try_fmt_vid_cap()
796 struct v4l2_pix_format *pix = &f->fmt.pix; in cobalt_s_fmt_vid_cap()
798 if (vb2_is_busy(&s->q)) in cobalt_s_fmt_vid_cap()
799 return -EBUSY; in cobalt_s_fmt_vid_cap()
802 return -EINVAL; in cobalt_s_fmt_vid_cap()
804 s->width = pix->width; in cobalt_s_fmt_vid_cap()
805 s->height = pix->height; in cobalt_s_fmt_vid_cap()
806 s->stride = pix->bytesperline; in cobalt_s_fmt_vid_cap()
807 switch (pix->pixelformat) { in cobalt_s_fmt_vid_cap()
809 s->bpp = COBALT_BYTES_PER_PIXEL_YUYV; in cobalt_s_fmt_vid_cap()
812 s->bpp = COBALT_BYTES_PER_PIXEL_RGB24; in cobalt_s_fmt_vid_cap()
815 s->bpp = COBALT_BYTES_PER_PIXEL_RGB32; in cobalt_s_fmt_vid_cap()
818 return -EINVAL; in cobalt_s_fmt_vid_cap()
820 s->pixfmt = pix->pixelformat; in cobalt_s_fmt_vid_cap()
829 struct v4l2_pix_format *pix = &f->fmt.pix; in cobalt_try_fmt_vid_out()
832 if ((pix->width < 176) || (pix->height < 144)) { in cobalt_try_fmt_vid_out()
833 pix->width = 176; in cobalt_try_fmt_vid_out()
834 pix->height = 144; in cobalt_try_fmt_vid_out()
837 if ((pix->width > 1920) || (pix->height > 1080)) { in cobalt_try_fmt_vid_out()
838 pix->width = 1920; in cobalt_try_fmt_vid_out()
839 pix->height = 1080; in cobalt_try_fmt_vid_out()
843 pix->width &= ~0x3; in cobalt_try_fmt_vid_out()
846 pix->height &= ~0x1; in cobalt_try_fmt_vid_out()
848 switch (pix->pixelformat) { in cobalt_try_fmt_vid_out()
851 pix->bytesperline = max(pix->bytesperline & ~0x3, in cobalt_try_fmt_vid_out()
852 pix->width * COBALT_BYTES_PER_PIXEL_YUYV); in cobalt_try_fmt_vid_out()
853 pix->pixelformat = V4L2_PIX_FMT_YUYV; in cobalt_try_fmt_vid_out()
856 pix->bytesperline = max(pix->bytesperline & ~0x3, in cobalt_try_fmt_vid_out()
857 pix->width * COBALT_BYTES_PER_PIXEL_RGB32); in cobalt_try_fmt_vid_out()
861 pix->sizeimage = pix->bytesperline * pix->height; in cobalt_try_fmt_vid_out()
862 pix->field = V4L2_FIELD_NONE; in cobalt_try_fmt_vid_out()
871 struct v4l2_pix_format *pix = &f->fmt.pix; in cobalt_g_fmt_vid_out()
873 pix->width = s->width; in cobalt_g_fmt_vid_out()
874 pix->height = s->height; in cobalt_g_fmt_vid_out()
875 pix->bytesperline = s->stride; in cobalt_g_fmt_vid_out()
876 pix->field = V4L2_FIELD_NONE; in cobalt_g_fmt_vid_out()
877 pix->pixelformat = s->pixfmt; in cobalt_g_fmt_vid_out()
878 pix->colorspace = s->colorspace; in cobalt_g_fmt_vid_out()
879 pix->xfer_func = s->xfer_func; in cobalt_g_fmt_vid_out()
880 pix->ycbcr_enc = s->ycbcr_enc; in cobalt_g_fmt_vid_out()
881 pix->quantization = s->quantization; in cobalt_g_fmt_vid_out()
882 pix->sizeimage = pix->bytesperline * pix->height; in cobalt_g_fmt_vid_out()
890 switch (f->index) { in cobalt_enum_fmt_vid_out()
892 f->pixelformat = V4L2_PIX_FMT_YUYV; in cobalt_enum_fmt_vid_out()
895 f->pixelformat = V4L2_PIX_FMT_BGR32; in cobalt_enum_fmt_vid_out()
898 return -EINVAL; in cobalt_enum_fmt_vid_out()
908 struct v4l2_pix_format *pix = &f->fmt.pix; in cobalt_s_fmt_vid_out()
913 return -EINVAL; in cobalt_s_fmt_vid_out()
915 if (vb2_is_busy(&s->q) && (pix->pixelformat != s->pixfmt || in cobalt_s_fmt_vid_out()
916 pix->width != s->width || pix->height != s->height || in cobalt_s_fmt_vid_out()
917 pix->bytesperline != s->stride)) in cobalt_s_fmt_vid_out()
918 return -EBUSY; in cobalt_s_fmt_vid_out()
920 switch (pix->pixelformat) { in cobalt_s_fmt_vid_out()
922 s->bpp = COBALT_BYTES_PER_PIXEL_YUYV; in cobalt_s_fmt_vid_out()
926 s->bpp = COBALT_BYTES_PER_PIXEL_RGB32; in cobalt_s_fmt_vid_out()
930 return -EINVAL; in cobalt_s_fmt_vid_out()
932 s->width = pix->width; in cobalt_s_fmt_vid_out()
933 s->height = pix->height; in cobalt_s_fmt_vid_out()
934 s->stride = pix->bytesperline; in cobalt_s_fmt_vid_out()
935 s->pixfmt = pix->pixelformat; in cobalt_s_fmt_vid_out()
936 s->colorspace = pix->colorspace; in cobalt_s_fmt_vid_out()
937 s->xfer_func = pix->xfer_func; in cobalt_s_fmt_vid_out()
938 s->ycbcr_enc = pix->ycbcr_enc; in cobalt_s_fmt_vid_out()
939 s->quantization = pix->quantization; in cobalt_s_fmt_vid_out()
942 v4l2_subdev_call(s->sd, pad, set_fmt, NULL, &sd_fmt); in cobalt_s_fmt_vid_out()
951 if (inp->index > 1) in cobalt_enum_input()
952 return -EINVAL; in cobalt_enum_input()
953 if (inp->index == 0) in cobalt_enum_input()
954 snprintf(inp->name, sizeof(inp->name), in cobalt_enum_input()
955 "HDMI-%d", s->video_channel); in cobalt_enum_input()
957 snprintf(inp->name, sizeof(inp->name), in cobalt_enum_input()
958 "Generator-%d", s->video_channel); in cobalt_enum_input()
959 inp->type = V4L2_INPUT_TYPE_CAMERA; in cobalt_enum_input()
960 inp->capabilities = V4L2_IN_CAP_DV_TIMINGS; in cobalt_enum_input()
961 if (inp->index == 1) in cobalt_enum_input()
963 return v4l2_subdev_call(s->sd, in cobalt_enum_input()
964 video, g_input_status, &inp->status); in cobalt_enum_input()
971 *i = s->input; in cobalt_g_input()
980 return -EINVAL; in cobalt_s_input()
981 if (vb2_is_busy(&s->q)) in cobalt_s_input()
982 return -EBUSY; in cobalt_s_input()
983 s->input = i; in cobalt_s_input()
987 if (s->input == 1) /* Test Pattern Generator */ in cobalt_s_input()
990 return v4l2_subdev_call(s->sd, video, s_routing, in cobalt_s_input()
997 if (out->index) in cobalt_enum_output()
998 return -EINVAL; in cobalt_enum_output()
999 snprintf(out->name, sizeof(out->name), "HDMI-%d", out->index); in cobalt_enum_output()
1000 out->type = V4L2_OUTPUT_TYPE_ANALOG; in cobalt_enum_output()
1001 out->capabilities = V4L2_OUT_CAP_DV_TIMINGS; in cobalt_enum_output()
1013 return i ? -EINVAL : 0; in cobalt_s_output()
1019 u32 pad = edid->pad; in cobalt_g_edid()
1022 if (edid->pad >= (s->is_output ? 1 : 2)) in cobalt_g_edid()
1023 return -EINVAL; in cobalt_g_edid()
1024 edid->pad = 0; in cobalt_g_edid()
1025 ret = v4l2_subdev_call(s->sd, pad, get_edid, edid); in cobalt_g_edid()
1026 edid->pad = pad; in cobalt_g_edid()
1033 u32 pad = edid->pad; in cobalt_s_edid()
1036 if (edid->pad >= 2) in cobalt_s_edid()
1037 return -EINVAL; in cobalt_s_edid()
1038 edid->pad = 0; in cobalt_s_edid()
1039 ret = v4l2_subdev_call(s->sd, pad, set_edid, edid); in cobalt_s_edid()
1040 edid->pad = pad; in cobalt_s_edid()
1047 switch (sub->type) { in cobalt_subscribe_event()
1059 if (a->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) in cobalt_g_parm()
1060 return -EINVAL; in cobalt_g_parm()
1062 fps = v4l2_calc_timeperframe(&s->timings); in cobalt_g_parm()
1063 a->parm.capture.timeperframe.numerator = fps.numerator; in cobalt_g_parm()
1064 a->parm.capture.timeperframe.denominator = fps.denominator; in cobalt_g_parm()
1065 a->parm.capture.readbuffers = 3; in cobalt_g_parm()
1077 return -EINVAL; in cobalt_g_pixelaspect()
1079 if (s->input == 1) in cobalt_g_pixelaspect()
1082 err = v4l2_subdev_call(s->sd, video, g_dv_timings, &timings); in cobalt_g_pixelaspect()
1095 if (sel->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) in cobalt_g_selection()
1096 return -EINVAL; in cobalt_g_selection()
1098 if (s->input == 1) in cobalt_g_selection()
1101 err = v4l2_subdev_call(s->sd, video, g_dv_timings, &timings); in cobalt_g_selection()
1106 switch (sel->target) { in cobalt_g_selection()
1109 sel->r.top = 0; in cobalt_g_selection()
1110 sel->r.left = 0; in cobalt_g_selection()
1111 sel->r.width = timings.bt.width; in cobalt_g_selection()
1112 sel->r.height = timings.bt.height; in cobalt_g_selection()
1115 return -EINVAL; in cobalt_g_selection()
1203 struct cobalt_stream *s = cobalt->streams + node; in cobalt_node_register()
1204 struct video_device *vdev = &s->vdev; in cobalt_node_register()
1205 struct vb2_queue *q = &s->q; in cobalt_node_register()
1208 mutex_init(&s->lock); in cobalt_node_register()
1209 spin_lock_init(&s->irqlock); in cobalt_node_register()
1211 snprintf(vdev->name, sizeof(vdev->name), in cobalt_node_register()
1212 "%s-%d", cobalt->v4l2_dev.name, node); in cobalt_node_register()
1213 s->width = 1920; in cobalt_node_register()
1215 s->height = s->is_audio ? 4 : 1080; in cobalt_node_register()
1217 if (s->is_audio) { in cobalt_node_register()
1218 s->bpp = 1; in cobalt_node_register()
1219 s->pixfmt = V4L2_PIX_FMT_GREY; in cobalt_node_register()
1220 } else if (s->is_output) { in cobalt_node_register()
1221 s->bpp = COBALT_BYTES_PER_PIXEL_RGB32; in cobalt_node_register()
1222 s->pixfmt = V4L2_PIX_FMT_BGR32; in cobalt_node_register()
1224 s->bpp = COBALT_BYTES_PER_PIXEL_YUYV; in cobalt_node_register()
1225 s->pixfmt = V4L2_PIX_FMT_YUYV; in cobalt_node_register()
1227 s->colorspace = V4L2_COLORSPACE_SRGB; in cobalt_node_register()
1228 s->stride = s->width * s->bpp; in cobalt_node_register()
1230 if (!s->is_audio) { in cobalt_node_register()
1231 if (s->is_dummy) in cobalt_node_register()
1233 vdev->v4l2_dev = &cobalt->v4l2_dev; in cobalt_node_register()
1234 if (s->is_dummy) in cobalt_node_register()
1235 vdev->fops = &cobalt_empty_fops; in cobalt_node_register()
1237 vdev->fops = s->is_output ? &cobalt_out_fops : in cobalt_node_register()
1239 vdev->release = video_device_release_empty; in cobalt_node_register()
1240 vdev->vfl_dir = s->is_output ? VFL_DIR_TX : VFL_DIR_RX; in cobalt_node_register()
1241 vdev->lock = &s->lock; in cobalt_node_register()
1242 if (s->sd) in cobalt_node_register()
1243 vdev->ctrl_handler = s->sd->ctrl_handler; in cobalt_node_register()
1244 s->timings = dv1080p60; in cobalt_node_register()
1245 v4l2_subdev_call(s->sd, video, s_dv_timings, &s->timings); in cobalt_node_register()
1246 if (!s->is_output && s->sd) in cobalt_node_register()
1248 vdev->ioctl_ops = s->is_dummy ? &cobalt_ioctl_empty_ops : in cobalt_node_register()
1252 INIT_LIST_HEAD(&s->bufs); in cobalt_node_register()
1253 q->type = s->is_output ? V4L2_BUF_TYPE_VIDEO_OUTPUT : in cobalt_node_register()
1255 q->io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF; in cobalt_node_register()
1256 q->io_modes |= s->is_output ? VB2_WRITE : VB2_READ; in cobalt_node_register()
1257 q->drv_priv = s; in cobalt_node_register()
1258 q->buf_struct_size = sizeof(struct cobalt_buffer); in cobalt_node_register()
1259 q->ops = &cobalt_qops; in cobalt_node_register()
1260 q->mem_ops = &vb2_dma_sg_memops; in cobalt_node_register()
1261 q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; in cobalt_node_register()
1262 q->min_buffers_needed = 2; in cobalt_node_register()
1263 q->lock = &s->lock; in cobalt_node_register()
1264 q->dev = &cobalt->pci_dev->dev; in cobalt_node_register()
1265 vdev->queue = q; in cobalt_node_register()
1266 vdev->device_caps = V4L2_CAP_STREAMING | V4L2_CAP_READWRITE; in cobalt_node_register()
1267 if (s->is_output) in cobalt_node_register()
1268 vdev->device_caps |= V4L2_CAP_VIDEO_OUTPUT; in cobalt_node_register()
1270 vdev->device_caps |= V4L2_CAP_VIDEO_CAPTURE; in cobalt_node_register()
1274 if (!s->is_audio && ret == 0) in cobalt_node_register()
1275 ret = video_register_device(vdev, VFL_TYPE_VIDEO, -1); in cobalt_node_register()
1276 else if (!s->is_dummy) in cobalt_node_register()
1280 if (!s->is_audio) in cobalt_node_register()
1310 struct cobalt_stream *s = cobalt->streams + node; in cobalt_nodes_unregister()
1311 struct video_device *vdev = &s->vdev; in cobalt_nodes_unregister()
1313 if (!s->is_audio) in cobalt_nodes_unregister()
1315 else if (!s->is_dummy) in cobalt_nodes_unregister()