2 * vivid-vid-common.c - common video support functions.
4 * Copyright 2014 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
6 * This program is free software; you may redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2 of the License.
10 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
11 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
12 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
13 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
14 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
15 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
16 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20 #include <linux/errno.h>
21 #include <linux/kernel.h>
22 #include <linux/sched.h>
23 #include <linux/videodev2.h>
24 #include <linux/v4l2-dv-timings.h>
25 #include <media/v4l2-common.h>
26 #include <media/v4l2-event.h>
27 #include <media/v4l2-dv-timings.h>
29 #include "vivid-core.h"
30 #include "vivid-vid-common.h"
32 const struct v4l2_dv_timings_cap vivid_dv_timings_cap
= {
33 .type
= V4L2_DV_BT_656_1120
,
34 /* keep this initialization for compatibility with GCC < 4.4.6 */
36 V4L2_INIT_BT_TIMINGS(0, MAX_WIDTH
, 0, MAX_HEIGHT
, 14000000, 775000000,
37 V4L2_DV_BT_STD_CEA861
| V4L2_DV_BT_STD_DMT
|
38 V4L2_DV_BT_STD_CVT
| V4L2_DV_BT_STD_GTF
,
39 V4L2_DV_BT_CAP_PROGRESSIVE
| V4L2_DV_BT_CAP_INTERLACED
)
42 /* ------------------------------------------------------------------
44 ------------------------------------------------------------------*/
46 struct vivid_fmt vivid_formats
[] = {
48 .fourcc
= V4L2_PIX_FMT_YUYV
,
49 .vdownsampling
= { 1 },
51 .color_enc
= TGP_COLOR_ENC_YCBCR
,
54 .data_offset
= { PLANE0_DATA_OFFSET
},
57 .fourcc
= V4L2_PIX_FMT_UYVY
,
58 .vdownsampling
= { 1 },
60 .color_enc
= TGP_COLOR_ENC_YCBCR
,
65 .fourcc
= V4L2_PIX_FMT_YVYU
,
66 .vdownsampling
= { 1 },
68 .color_enc
= TGP_COLOR_ENC_YCBCR
,
73 .fourcc
= V4L2_PIX_FMT_VYUY
,
74 .vdownsampling
= { 1 },
76 .color_enc
= TGP_COLOR_ENC_YCBCR
,
81 .fourcc
= V4L2_PIX_FMT_YUV422P
,
82 .vdownsampling
= { 1, 1, 1 },
83 .bit_depth
= { 8, 4, 4 },
84 .color_enc
= TGP_COLOR_ENC_YCBCR
,
89 .fourcc
= V4L2_PIX_FMT_YUV420
,
90 .vdownsampling
= { 1, 2, 2 },
91 .bit_depth
= { 8, 4, 4 },
92 .color_enc
= TGP_COLOR_ENC_YCBCR
,
97 .fourcc
= V4L2_PIX_FMT_YVU420
,
98 .vdownsampling
= { 1, 2, 2 },
99 .bit_depth
= { 8, 4, 4 },
100 .color_enc
= TGP_COLOR_ENC_YCBCR
,
105 .fourcc
= V4L2_PIX_FMT_NV12
,
106 .vdownsampling
= { 1, 2 },
107 .bit_depth
= { 8, 8 },
108 .color_enc
= TGP_COLOR_ENC_YCBCR
,
113 .fourcc
= V4L2_PIX_FMT_NV21
,
114 .vdownsampling
= { 1, 2 },
115 .bit_depth
= { 8, 8 },
116 .color_enc
= TGP_COLOR_ENC_YCBCR
,
121 .fourcc
= V4L2_PIX_FMT_NV16
,
122 .vdownsampling
= { 1, 1 },
123 .bit_depth
= { 8, 8 },
124 .color_enc
= TGP_COLOR_ENC_YCBCR
,
129 .fourcc
= V4L2_PIX_FMT_NV61
,
130 .vdownsampling
= { 1, 1 },
131 .bit_depth
= { 8, 8 },
132 .color_enc
= TGP_COLOR_ENC_YCBCR
,
137 .fourcc
= V4L2_PIX_FMT_NV24
,
138 .vdownsampling
= { 1, 1 },
139 .bit_depth
= { 8, 16 },
140 .color_enc
= TGP_COLOR_ENC_YCBCR
,
145 .fourcc
= V4L2_PIX_FMT_NV42
,
146 .vdownsampling
= { 1, 1 },
147 .bit_depth
= { 8, 16 },
148 .color_enc
= TGP_COLOR_ENC_YCBCR
,
153 .fourcc
= V4L2_PIX_FMT_YUV555
, /* uuuvvvvv ayyyyyuu */
154 .vdownsampling
= { 1 },
158 .alpha_mask
= 0x8000,
161 .fourcc
= V4L2_PIX_FMT_YUV565
, /* uuuvvvvv yyyyyuuu */
162 .vdownsampling
= { 1 },
168 .fourcc
= V4L2_PIX_FMT_YUV444
, /* uuuuvvvv aaaayyyy */
169 .vdownsampling
= { 1 },
173 .alpha_mask
= 0xf000,
176 .fourcc
= V4L2_PIX_FMT_YUV32
, /* ayuv */
177 .vdownsampling
= { 1 },
181 .alpha_mask
= 0x000000ff,
184 .fourcc
= V4L2_PIX_FMT_GREY
,
185 .vdownsampling
= { 1 },
187 .color_enc
= TGP_COLOR_ENC_LUMA
,
192 .fourcc
= V4L2_PIX_FMT_Y10
,
193 .vdownsampling
= { 1 },
195 .color_enc
= TGP_COLOR_ENC_LUMA
,
200 .fourcc
= V4L2_PIX_FMT_Y12
,
201 .vdownsampling
= { 1 },
203 .color_enc
= TGP_COLOR_ENC_LUMA
,
208 .fourcc
= V4L2_PIX_FMT_Y16
,
209 .vdownsampling
= { 1 },
211 .color_enc
= TGP_COLOR_ENC_LUMA
,
216 .fourcc
= V4L2_PIX_FMT_Y16_BE
,
217 .vdownsampling
= { 1 },
219 .color_enc
= TGP_COLOR_ENC_LUMA
,
224 .fourcc
= V4L2_PIX_FMT_RGB332
, /* rrrgggbb */
225 .vdownsampling
= { 1 },
231 .fourcc
= V4L2_PIX_FMT_RGB565
, /* gggbbbbb rrrrrggg */
232 .vdownsampling
= { 1 },
236 .can_do_overlay
= true,
239 .fourcc
= V4L2_PIX_FMT_RGB565X
, /* rrrrrggg gggbbbbb */
240 .vdownsampling
= { 1 },
244 .can_do_overlay
= true,
247 .fourcc
= V4L2_PIX_FMT_RGB444
, /* xxxxrrrr ggggbbbb */
248 .vdownsampling
= { 1 },
254 .fourcc
= V4L2_PIX_FMT_XRGB444
, /* xxxxrrrr ggggbbbb */
255 .vdownsampling
= { 1 },
261 .fourcc
= V4L2_PIX_FMT_ARGB444
, /* aaaarrrr ggggbbbb */
262 .vdownsampling
= { 1 },
266 .alpha_mask
= 0x00f0,
269 .fourcc
= V4L2_PIX_FMT_RGB555
, /* gggbbbbb xrrrrrgg */
270 .vdownsampling
= { 1 },
274 .can_do_overlay
= true,
277 .fourcc
= V4L2_PIX_FMT_XRGB555
, /* gggbbbbb xrrrrrgg */
278 .vdownsampling
= { 1 },
282 .can_do_overlay
= true,
285 .fourcc
= V4L2_PIX_FMT_ARGB555
, /* gggbbbbb arrrrrgg */
286 .vdownsampling
= { 1 },
290 .can_do_overlay
= true,
291 .alpha_mask
= 0x8000,
294 .fourcc
= V4L2_PIX_FMT_RGB555X
, /* xrrrrrgg gggbbbbb */
295 .vdownsampling
= { 1 },
301 .fourcc
= V4L2_PIX_FMT_XRGB555X
, /* xrrrrrgg gggbbbbb */
302 .vdownsampling
= { 1 },
308 .fourcc
= V4L2_PIX_FMT_ARGB555X
, /* arrrrrgg gggbbbbb */
309 .vdownsampling
= { 1 },
313 .alpha_mask
= 0x0080,
316 .fourcc
= V4L2_PIX_FMT_RGB24
, /* rgb */
317 .vdownsampling
= { 1 },
323 .fourcc
= V4L2_PIX_FMT_BGR24
, /* bgr */
324 .vdownsampling
= { 1 },
330 .fourcc
= V4L2_PIX_FMT_BGR666
, /* bbbbbbgg ggggrrrr rrxxxxxx */
331 .vdownsampling
= { 1 },
337 .fourcc
= V4L2_PIX_FMT_RGB32
, /* xrgb */
338 .vdownsampling
= { 1 },
344 .fourcc
= V4L2_PIX_FMT_BGR32
, /* bgrx */
345 .vdownsampling
= { 1 },
351 .fourcc
= V4L2_PIX_FMT_XRGB32
, /* xrgb */
352 .vdownsampling
= { 1 },
358 .fourcc
= V4L2_PIX_FMT_XBGR32
, /* bgrx */
359 .vdownsampling
= { 1 },
365 .fourcc
= V4L2_PIX_FMT_ARGB32
, /* argb */
366 .vdownsampling
= { 1 },
370 .alpha_mask
= 0x000000ff,
373 .fourcc
= V4L2_PIX_FMT_ABGR32
, /* bgra */
374 .vdownsampling
= { 1 },
378 .alpha_mask
= 0xff000000,
381 .fourcc
= V4L2_PIX_FMT_SBGGR8
, /* Bayer BG/GR */
382 .vdownsampling
= { 1 },
388 .fourcc
= V4L2_PIX_FMT_SGBRG8
, /* Bayer GB/RG */
389 .vdownsampling
= { 1 },
395 .fourcc
= V4L2_PIX_FMT_SGRBG8
, /* Bayer GR/BG */
396 .vdownsampling
= { 1 },
402 .fourcc
= V4L2_PIX_FMT_SRGGB8
, /* Bayer RG/GB */
403 .vdownsampling
= { 1 },
409 .fourcc
= V4L2_PIX_FMT_SBGGR10
, /* Bayer BG/GR */
410 .vdownsampling
= { 1 },
416 .fourcc
= V4L2_PIX_FMT_SGBRG10
, /* Bayer GB/RG */
417 .vdownsampling
= { 1 },
423 .fourcc
= V4L2_PIX_FMT_SGRBG10
, /* Bayer GR/BG */
424 .vdownsampling
= { 1 },
430 .fourcc
= V4L2_PIX_FMT_SRGGB10
, /* Bayer RG/GB */
431 .vdownsampling
= { 1 },
437 .fourcc
= V4L2_PIX_FMT_SBGGR12
, /* Bayer BG/GR */
438 .vdownsampling
= { 1 },
444 .fourcc
= V4L2_PIX_FMT_SGBRG12
, /* Bayer GB/RG */
445 .vdownsampling
= { 1 },
451 .fourcc
= V4L2_PIX_FMT_SGRBG12
, /* Bayer GR/BG */
452 .vdownsampling
= { 1 },
458 .fourcc
= V4L2_PIX_FMT_SRGGB12
, /* Bayer RG/GB */
459 .vdownsampling
= { 1 },
465 .fourcc
= V4L2_PIX_FMT_HSV24
, /* HSV 24bits */
466 .color_enc
= TGP_COLOR_ENC_HSV
,
467 .vdownsampling
= { 1 },
473 .fourcc
= V4L2_PIX_FMT_HSV32
, /* HSV 32bits */
474 .color_enc
= TGP_COLOR_ENC_HSV
,
475 .vdownsampling
= { 1 },
481 /* Multiplanar formats */
484 .fourcc
= V4L2_PIX_FMT_NV16M
,
485 .vdownsampling
= { 1, 1 },
486 .bit_depth
= { 8, 8 },
487 .color_enc
= TGP_COLOR_ENC_YCBCR
,
490 .data_offset
= { PLANE0_DATA_OFFSET
, 0 },
493 .fourcc
= V4L2_PIX_FMT_NV61M
,
494 .vdownsampling
= { 1, 1 },
495 .bit_depth
= { 8, 8 },
496 .color_enc
= TGP_COLOR_ENC_YCBCR
,
499 .data_offset
= { 0, PLANE0_DATA_OFFSET
},
502 .fourcc
= V4L2_PIX_FMT_YUV420M
,
503 .vdownsampling
= { 1, 2, 2 },
504 .bit_depth
= { 8, 4, 4 },
505 .color_enc
= TGP_COLOR_ENC_YCBCR
,
510 .fourcc
= V4L2_PIX_FMT_YVU420M
,
511 .vdownsampling
= { 1, 2, 2 },
512 .bit_depth
= { 8, 4, 4 },
513 .color_enc
= TGP_COLOR_ENC_YCBCR
,
518 .fourcc
= V4L2_PIX_FMT_NV12M
,
519 .vdownsampling
= { 1, 2 },
520 .bit_depth
= { 8, 8 },
521 .color_enc
= TGP_COLOR_ENC_YCBCR
,
526 .fourcc
= V4L2_PIX_FMT_NV21M
,
527 .vdownsampling
= { 1, 2 },
528 .bit_depth
= { 8, 8 },
529 .color_enc
= TGP_COLOR_ENC_YCBCR
,
534 .fourcc
= V4L2_PIX_FMT_YUV422M
,
535 .vdownsampling
= { 1, 1, 1 },
536 .bit_depth
= { 8, 4, 4 },
537 .color_enc
= TGP_COLOR_ENC_YCBCR
,
542 .fourcc
= V4L2_PIX_FMT_YVU422M
,
543 .vdownsampling
= { 1, 1, 1 },
544 .bit_depth
= { 8, 4, 4 },
545 .color_enc
= TGP_COLOR_ENC_YCBCR
,
550 .fourcc
= V4L2_PIX_FMT_YUV444M
,
551 .vdownsampling
= { 1, 1, 1 },
552 .bit_depth
= { 8, 8, 8 },
553 .color_enc
= TGP_COLOR_ENC_YCBCR
,
558 .fourcc
= V4L2_PIX_FMT_YVU444M
,
559 .vdownsampling
= { 1, 1, 1 },
560 .bit_depth
= { 8, 8, 8 },
561 .color_enc
= TGP_COLOR_ENC_YCBCR
,
567 /* There are this many multiplanar formats in the list */
568 #define VIVID_MPLANAR_FORMATS 10
570 const struct vivid_fmt
*vivid_get_format(struct vivid_dev
*dev
, u32 pixelformat
)
572 const struct vivid_fmt
*fmt
;
575 for (k
= 0; k
< ARRAY_SIZE(vivid_formats
); k
++) {
576 fmt
= &vivid_formats
[k
];
577 if (fmt
->fourcc
== pixelformat
)
578 if (fmt
->buffers
== 1 || dev
->multiplanar
)
585 bool vivid_vid_can_loop(struct vivid_dev
*dev
)
587 if (dev
->src_rect
.width
!= dev
->sink_rect
.width
||
588 dev
->src_rect
.height
!= dev
->sink_rect
.height
)
590 if (dev
->fmt_cap
->fourcc
!= dev
->fmt_out
->fourcc
)
592 if (dev
->field_cap
!= dev
->field_out
)
595 * While this can be supported, it is just too much work
596 * to actually implement.
598 if (dev
->field_cap
== V4L2_FIELD_SEQ_TB
||
599 dev
->field_cap
== V4L2_FIELD_SEQ_BT
)
601 if (vivid_is_svid_cap(dev
) && vivid_is_svid_out(dev
)) {
602 if (!(dev
->std_cap
& V4L2_STD_525_60
) !=
603 !(dev
->std_out
& V4L2_STD_525_60
))
607 if (vivid_is_hdmi_cap(dev
) && vivid_is_hdmi_out(dev
))
612 void vivid_send_source_change(struct vivid_dev
*dev
, unsigned type
)
614 struct v4l2_event ev
= {
615 .type
= V4L2_EVENT_SOURCE_CHANGE
,
616 .u
.src_change
.changes
= V4L2_EVENT_SRC_CH_RESOLUTION
,
620 for (i
= 0; i
< dev
->num_inputs
; i
++) {
622 if (dev
->input_type
[i
] == type
) {
623 if (video_is_registered(&dev
->vid_cap_dev
) && dev
->has_vid_cap
)
624 v4l2_event_queue(&dev
->vid_cap_dev
, &ev
);
625 if (video_is_registered(&dev
->vbi_cap_dev
) && dev
->has_vbi_cap
)
626 v4l2_event_queue(&dev
->vbi_cap_dev
, &ev
);
632 * Conversion function that converts a single-planar format to a
633 * single-plane multiplanar format.
635 void fmt_sp2mp(const struct v4l2_format
*sp_fmt
, struct v4l2_format
*mp_fmt
)
637 struct v4l2_pix_format_mplane
*mp
= &mp_fmt
->fmt
.pix_mp
;
638 struct v4l2_plane_pix_format
*ppix
= &mp
->plane_fmt
[0];
639 const struct v4l2_pix_format
*pix
= &sp_fmt
->fmt
.pix
;
640 bool is_out
= sp_fmt
->type
== V4L2_BUF_TYPE_VIDEO_OUTPUT
;
642 memset(mp
->reserved
, 0, sizeof(mp
->reserved
));
643 mp_fmt
->type
= is_out
? V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE
:
644 V4L2_CAP_VIDEO_CAPTURE_MPLANE
;
645 mp
->width
= pix
->width
;
646 mp
->height
= pix
->height
;
647 mp
->pixelformat
= pix
->pixelformat
;
648 mp
->field
= pix
->field
;
649 mp
->colorspace
= pix
->colorspace
;
650 mp
->xfer_func
= pix
->xfer_func
;
651 /* Also copies hsv_enc */
652 mp
->ycbcr_enc
= pix
->ycbcr_enc
;
653 mp
->quantization
= pix
->quantization
;
655 mp
->flags
= pix
->flags
;
656 ppix
->sizeimage
= pix
->sizeimage
;
657 ppix
->bytesperline
= pix
->bytesperline
;
658 memset(ppix
->reserved
, 0, sizeof(ppix
->reserved
));
661 int fmt_sp2mp_func(struct file
*file
, void *priv
,
662 struct v4l2_format
*f
, fmtfunc func
)
664 struct v4l2_format fmt
;
665 struct v4l2_pix_format_mplane
*mp
= &fmt
.fmt
.pix_mp
;
666 struct v4l2_plane_pix_format
*ppix
= &mp
->plane_fmt
[0];
667 struct v4l2_pix_format
*pix
= &f
->fmt
.pix
;
670 /* Converts to a mplane format */
672 /* Passes it to the generic mplane format function */
673 ret
= func(file
, priv
, &fmt
);
674 /* Copies back the mplane data to the single plane format */
675 pix
->width
= mp
->width
;
676 pix
->height
= mp
->height
;
677 pix
->pixelformat
= mp
->pixelformat
;
678 pix
->field
= mp
->field
;
679 pix
->colorspace
= mp
->colorspace
;
680 pix
->xfer_func
= mp
->xfer_func
;
681 /* Also copies hsv_enc */
682 pix
->ycbcr_enc
= mp
->ycbcr_enc
;
683 pix
->quantization
= mp
->quantization
;
684 pix
->sizeimage
= ppix
->sizeimage
;
685 pix
->bytesperline
= ppix
->bytesperline
;
686 pix
->flags
= mp
->flags
;
690 int vivid_vid_adjust_sel(unsigned flags
, struct v4l2_rect
*r
)
692 unsigned w
= r
->width
;
693 unsigned h
= r
->height
;
695 /* sanitize w and h in case someone passes ~0 as the value */
698 if (!(flags
& V4L2_SEL_FLAG_LE
)) {
706 if (!(flags
& V4L2_SEL_FLAG_GE
)) {
716 if (w
> MAX_WIDTH
|| h
> MAX_HEIGHT
)
722 /* sanitize left and top in case someone passes ~0 as the value */
725 if (r
->left
+ w
> MAX_WIDTH
)
726 r
->left
= MAX_WIDTH
- w
;
727 if (r
->top
+ h
> MAX_HEIGHT
)
728 r
->top
= MAX_HEIGHT
- h
;
729 if ((flags
& (V4L2_SEL_FLAG_GE
| V4L2_SEL_FLAG_LE
)) ==
730 (V4L2_SEL_FLAG_GE
| V4L2_SEL_FLAG_LE
) &&
731 (r
->width
!= w
|| r
->height
!= h
))
738 int vivid_enum_fmt_vid(struct file
*file
, void *priv
,
739 struct v4l2_fmtdesc
*f
)
741 struct vivid_dev
*dev
= video_drvdata(file
);
742 const struct vivid_fmt
*fmt
;
744 if (f
->index
>= ARRAY_SIZE(vivid_formats
) -
745 (dev
->multiplanar
? 0 : VIVID_MPLANAR_FORMATS
))
748 fmt
= &vivid_formats
[f
->index
];
750 f
->pixelformat
= fmt
->fourcc
;
754 int vidioc_enum_fmt_vid_mplane(struct file
*file
, void *priv
,
755 struct v4l2_fmtdesc
*f
)
757 struct vivid_dev
*dev
= video_drvdata(file
);
759 if (!dev
->multiplanar
)
761 return vivid_enum_fmt_vid(file
, priv
, f
);
764 int vidioc_enum_fmt_vid(struct file
*file
, void *priv
,
765 struct v4l2_fmtdesc
*f
)
767 struct vivid_dev
*dev
= video_drvdata(file
);
769 if (dev
->multiplanar
)
771 return vivid_enum_fmt_vid(file
, priv
, f
);
774 int vidioc_g_std(struct file
*file
, void *priv
, v4l2_std_id
*id
)
776 struct vivid_dev
*dev
= video_drvdata(file
);
777 struct video_device
*vdev
= video_devdata(file
);
779 if (vdev
->vfl_dir
== VFL_DIR_RX
) {
780 if (!vivid_is_sdtv_cap(dev
))
784 if (!vivid_is_svid_out(dev
))
791 int vidioc_g_dv_timings(struct file
*file
, void *_fh
,
792 struct v4l2_dv_timings
*timings
)
794 struct vivid_dev
*dev
= video_drvdata(file
);
795 struct video_device
*vdev
= video_devdata(file
);
797 if (vdev
->vfl_dir
== VFL_DIR_RX
) {
798 if (!vivid_is_hdmi_cap(dev
))
800 *timings
= dev
->dv_timings_cap
;
802 if (!vivid_is_hdmi_out(dev
))
804 *timings
= dev
->dv_timings_out
;
809 int vidioc_enum_dv_timings(struct file
*file
, void *_fh
,
810 struct v4l2_enum_dv_timings
*timings
)
812 struct vivid_dev
*dev
= video_drvdata(file
);
813 struct video_device
*vdev
= video_devdata(file
);
815 if (vdev
->vfl_dir
== VFL_DIR_RX
) {
816 if (!vivid_is_hdmi_cap(dev
))
819 if (!vivid_is_hdmi_out(dev
))
822 return v4l2_enum_dv_timings_cap(timings
, &vivid_dv_timings_cap
,
826 int vidioc_dv_timings_cap(struct file
*file
, void *_fh
,
827 struct v4l2_dv_timings_cap
*cap
)
829 struct vivid_dev
*dev
= video_drvdata(file
);
830 struct video_device
*vdev
= video_devdata(file
);
832 if (vdev
->vfl_dir
== VFL_DIR_RX
) {
833 if (!vivid_is_hdmi_cap(dev
))
836 if (!vivid_is_hdmi_out(dev
))
839 *cap
= vivid_dv_timings_cap
;
843 int vidioc_g_edid(struct file
*file
, void *_fh
,
844 struct v4l2_edid
*edid
)
846 struct vivid_dev
*dev
= video_drvdata(file
);
847 struct video_device
*vdev
= video_devdata(file
);
848 struct cec_adapter
*adap
;
850 memset(edid
->reserved
, 0, sizeof(edid
->reserved
));
851 if (vdev
->vfl_dir
== VFL_DIR_RX
) {
852 if (edid
->pad
>= dev
->num_inputs
)
854 if (dev
->input_type
[edid
->pad
] != HDMI
)
856 adap
= dev
->cec_rx_adap
;
858 unsigned int bus_idx
;
860 if (edid
->pad
>= dev
->num_outputs
)
862 if (dev
->output_type
[edid
->pad
] != HDMI
)
864 bus_idx
= dev
->cec_output2bus_map
[edid
->pad
];
865 adap
= dev
->cec_tx_adap
[bus_idx
];
867 if (edid
->start_block
== 0 && edid
->blocks
== 0) {
868 edid
->blocks
= dev
->edid_blocks
;
871 if (dev
->edid_blocks
== 0)
873 if (edid
->start_block
>= dev
->edid_blocks
)
875 if (edid
->start_block
+ edid
->blocks
> dev
->edid_blocks
)
876 edid
->blocks
= dev
->edid_blocks
- edid
->start_block
;
877 cec_set_edid_phys_addr(dev
->edid
, dev
->edid_blocks
* 128, adap
->phys_addr
);
878 memcpy(edid
->edid
, dev
->edid
+ edid
->start_block
* 128, edid
->blocks
* 128);