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_Y16
,
193 .vdownsampling
= { 1 },
195 .color_enc
= TGP_COLOR_ENC_LUMA
,
200 .fourcc
= V4L2_PIX_FMT_Y16_BE
,
201 .vdownsampling
= { 1 },
203 .color_enc
= TGP_COLOR_ENC_LUMA
,
208 .fourcc
= V4L2_PIX_FMT_RGB332
, /* rrrgggbb */
209 .vdownsampling
= { 1 },
215 .fourcc
= V4L2_PIX_FMT_RGB565
, /* gggbbbbb rrrrrggg */
216 .vdownsampling
= { 1 },
220 .can_do_overlay
= true,
223 .fourcc
= V4L2_PIX_FMT_RGB565X
, /* rrrrrggg gggbbbbb */
224 .vdownsampling
= { 1 },
228 .can_do_overlay
= true,
231 .fourcc
= V4L2_PIX_FMT_RGB444
, /* xxxxrrrr ggggbbbb */
232 .vdownsampling
= { 1 },
238 .fourcc
= V4L2_PIX_FMT_XRGB444
, /* xxxxrrrr ggggbbbb */
239 .vdownsampling
= { 1 },
245 .fourcc
= V4L2_PIX_FMT_ARGB444
, /* aaaarrrr ggggbbbb */
246 .vdownsampling
= { 1 },
250 .alpha_mask
= 0x00f0,
253 .fourcc
= V4L2_PIX_FMT_RGB555
, /* gggbbbbb xrrrrrgg */
254 .vdownsampling
= { 1 },
258 .can_do_overlay
= true,
261 .fourcc
= V4L2_PIX_FMT_XRGB555
, /* gggbbbbb xrrrrrgg */
262 .vdownsampling
= { 1 },
266 .can_do_overlay
= true,
269 .fourcc
= V4L2_PIX_FMT_ARGB555
, /* gggbbbbb arrrrrgg */
270 .vdownsampling
= { 1 },
274 .can_do_overlay
= true,
275 .alpha_mask
= 0x8000,
278 .fourcc
= V4L2_PIX_FMT_RGB555X
, /* xrrrrrgg gggbbbbb */
279 .vdownsampling
= { 1 },
285 .fourcc
= V4L2_PIX_FMT_XRGB555X
, /* xrrrrrgg gggbbbbb */
286 .vdownsampling
= { 1 },
292 .fourcc
= V4L2_PIX_FMT_ARGB555X
, /* arrrrrgg gggbbbbb */
293 .vdownsampling
= { 1 },
297 .alpha_mask
= 0x0080,
300 .fourcc
= V4L2_PIX_FMT_RGB24
, /* rgb */
301 .vdownsampling
= { 1 },
307 .fourcc
= V4L2_PIX_FMT_BGR24
, /* bgr */
308 .vdownsampling
= { 1 },
314 .fourcc
= V4L2_PIX_FMT_BGR666
, /* bbbbbbgg ggggrrrr rrxxxxxx */
315 .vdownsampling
= { 1 },
321 .fourcc
= V4L2_PIX_FMT_RGB32
, /* xrgb */
322 .vdownsampling
= { 1 },
328 .fourcc
= V4L2_PIX_FMT_BGR32
, /* bgrx */
329 .vdownsampling
= { 1 },
335 .fourcc
= V4L2_PIX_FMT_XRGB32
, /* xrgb */
336 .vdownsampling
= { 1 },
342 .fourcc
= V4L2_PIX_FMT_XBGR32
, /* bgrx */
343 .vdownsampling
= { 1 },
349 .fourcc
= V4L2_PIX_FMT_ARGB32
, /* argb */
350 .vdownsampling
= { 1 },
354 .alpha_mask
= 0x000000ff,
357 .fourcc
= V4L2_PIX_FMT_ABGR32
, /* bgra */
358 .vdownsampling
= { 1 },
362 .alpha_mask
= 0xff000000,
365 .fourcc
= V4L2_PIX_FMT_SBGGR8
, /* Bayer BG/GR */
366 .vdownsampling
= { 1 },
372 .fourcc
= V4L2_PIX_FMT_SGBRG8
, /* Bayer GB/RG */
373 .vdownsampling
= { 1 },
379 .fourcc
= V4L2_PIX_FMT_SGRBG8
, /* Bayer GR/BG */
380 .vdownsampling
= { 1 },
386 .fourcc
= V4L2_PIX_FMT_SRGGB8
, /* Bayer RG/GB */
387 .vdownsampling
= { 1 },
393 .fourcc
= V4L2_PIX_FMT_SBGGR10
, /* Bayer BG/GR */
394 .vdownsampling
= { 1 },
400 .fourcc
= V4L2_PIX_FMT_SGBRG10
, /* Bayer GB/RG */
401 .vdownsampling
= { 1 },
407 .fourcc
= V4L2_PIX_FMT_SGRBG10
, /* Bayer GR/BG */
408 .vdownsampling
= { 1 },
414 .fourcc
= V4L2_PIX_FMT_SRGGB10
, /* Bayer RG/GB */
415 .vdownsampling
= { 1 },
421 .fourcc
= V4L2_PIX_FMT_SBGGR12
, /* Bayer BG/GR */
422 .vdownsampling
= { 1 },
428 .fourcc
= V4L2_PIX_FMT_SGBRG12
, /* Bayer GB/RG */
429 .vdownsampling
= { 1 },
435 .fourcc
= V4L2_PIX_FMT_SGRBG12
, /* Bayer GR/BG */
436 .vdownsampling
= { 1 },
442 .fourcc
= V4L2_PIX_FMT_SRGGB12
, /* Bayer RG/GB */
443 .vdownsampling
= { 1 },
449 .fourcc
= V4L2_PIX_FMT_HSV24
, /* HSV 24bits */
450 .color_enc
= TGP_COLOR_ENC_HSV
,
451 .vdownsampling
= { 1 },
457 .fourcc
= V4L2_PIX_FMT_HSV32
, /* HSV 32bits */
458 .color_enc
= TGP_COLOR_ENC_HSV
,
459 .vdownsampling
= { 1 },
465 /* Multiplanar formats */
468 .fourcc
= V4L2_PIX_FMT_NV16M
,
469 .vdownsampling
= { 1, 1 },
470 .bit_depth
= { 8, 8 },
471 .color_enc
= TGP_COLOR_ENC_YCBCR
,
474 .data_offset
= { PLANE0_DATA_OFFSET
, 0 },
477 .fourcc
= V4L2_PIX_FMT_NV61M
,
478 .vdownsampling
= { 1, 1 },
479 .bit_depth
= { 8, 8 },
480 .color_enc
= TGP_COLOR_ENC_YCBCR
,
483 .data_offset
= { 0, PLANE0_DATA_OFFSET
},
486 .fourcc
= V4L2_PIX_FMT_YUV420M
,
487 .vdownsampling
= { 1, 2, 2 },
488 .bit_depth
= { 8, 4, 4 },
489 .color_enc
= TGP_COLOR_ENC_YCBCR
,
494 .fourcc
= V4L2_PIX_FMT_YVU420M
,
495 .vdownsampling
= { 1, 2, 2 },
496 .bit_depth
= { 8, 4, 4 },
497 .color_enc
= TGP_COLOR_ENC_YCBCR
,
502 .fourcc
= V4L2_PIX_FMT_NV12M
,
503 .vdownsampling
= { 1, 2 },
504 .bit_depth
= { 8, 8 },
505 .color_enc
= TGP_COLOR_ENC_YCBCR
,
510 .fourcc
= V4L2_PIX_FMT_NV21M
,
511 .vdownsampling
= { 1, 2 },
512 .bit_depth
= { 8, 8 },
513 .color_enc
= TGP_COLOR_ENC_YCBCR
,
518 .fourcc
= V4L2_PIX_FMT_YUV422M
,
519 .vdownsampling
= { 1, 1, 1 },
520 .bit_depth
= { 8, 4, 4 },
521 .color_enc
= TGP_COLOR_ENC_YCBCR
,
526 .fourcc
= V4L2_PIX_FMT_YVU422M
,
527 .vdownsampling
= { 1, 1, 1 },
528 .bit_depth
= { 8, 4, 4 },
529 .color_enc
= TGP_COLOR_ENC_YCBCR
,
534 .fourcc
= V4L2_PIX_FMT_YUV444M
,
535 .vdownsampling
= { 1, 1, 1 },
536 .bit_depth
= { 8, 8, 8 },
537 .color_enc
= TGP_COLOR_ENC_YCBCR
,
542 .fourcc
= V4L2_PIX_FMT_YVU444M
,
543 .vdownsampling
= { 1, 1, 1 },
544 .bit_depth
= { 8, 8, 8 },
545 .color_enc
= TGP_COLOR_ENC_YCBCR
,
551 /* There are this many multiplanar formats in the list */
552 #define VIVID_MPLANAR_FORMATS 10
554 const struct vivid_fmt
*vivid_get_format(struct vivid_dev
*dev
, u32 pixelformat
)
556 const struct vivid_fmt
*fmt
;
559 for (k
= 0; k
< ARRAY_SIZE(vivid_formats
); k
++) {
560 fmt
= &vivid_formats
[k
];
561 if (fmt
->fourcc
== pixelformat
)
562 if (fmt
->buffers
== 1 || dev
->multiplanar
)
569 bool vivid_vid_can_loop(struct vivid_dev
*dev
)
571 if (dev
->src_rect
.width
!= dev
->sink_rect
.width
||
572 dev
->src_rect
.height
!= dev
->sink_rect
.height
)
574 if (dev
->fmt_cap
->fourcc
!= dev
->fmt_out
->fourcc
)
576 if (dev
->field_cap
!= dev
->field_out
)
579 * While this can be supported, it is just too much work
580 * to actually implement.
582 if (dev
->field_cap
== V4L2_FIELD_SEQ_TB
||
583 dev
->field_cap
== V4L2_FIELD_SEQ_BT
)
585 if (vivid_is_svid_cap(dev
) && vivid_is_svid_out(dev
)) {
586 if (!(dev
->std_cap
& V4L2_STD_525_60
) !=
587 !(dev
->std_out
& V4L2_STD_525_60
))
591 if (vivid_is_hdmi_cap(dev
) && vivid_is_hdmi_out(dev
))
596 void vivid_send_source_change(struct vivid_dev
*dev
, unsigned type
)
598 struct v4l2_event ev
= {
599 .type
= V4L2_EVENT_SOURCE_CHANGE
,
600 .u
.src_change
.changes
= V4L2_EVENT_SRC_CH_RESOLUTION
,
604 for (i
= 0; i
< dev
->num_inputs
; i
++) {
606 if (dev
->input_type
[i
] == type
) {
607 if (video_is_registered(&dev
->vid_cap_dev
) && dev
->has_vid_cap
)
608 v4l2_event_queue(&dev
->vid_cap_dev
, &ev
);
609 if (video_is_registered(&dev
->vbi_cap_dev
) && dev
->has_vbi_cap
)
610 v4l2_event_queue(&dev
->vbi_cap_dev
, &ev
);
616 * Conversion function that converts a single-planar format to a
617 * single-plane multiplanar format.
619 void fmt_sp2mp(const struct v4l2_format
*sp_fmt
, struct v4l2_format
*mp_fmt
)
621 struct v4l2_pix_format_mplane
*mp
= &mp_fmt
->fmt
.pix_mp
;
622 struct v4l2_plane_pix_format
*ppix
= &mp
->plane_fmt
[0];
623 const struct v4l2_pix_format
*pix
= &sp_fmt
->fmt
.pix
;
624 bool is_out
= sp_fmt
->type
== V4L2_BUF_TYPE_VIDEO_OUTPUT
;
626 memset(mp
->reserved
, 0, sizeof(mp
->reserved
));
627 mp_fmt
->type
= is_out
? V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE
:
628 V4L2_CAP_VIDEO_CAPTURE_MPLANE
;
629 mp
->width
= pix
->width
;
630 mp
->height
= pix
->height
;
631 mp
->pixelformat
= pix
->pixelformat
;
632 mp
->field
= pix
->field
;
633 mp
->colorspace
= pix
->colorspace
;
634 mp
->xfer_func
= pix
->xfer_func
;
635 /* Also copies hsv_enc */
636 mp
->ycbcr_enc
= pix
->ycbcr_enc
;
637 mp
->quantization
= pix
->quantization
;
639 mp
->flags
= pix
->flags
;
640 ppix
->sizeimage
= pix
->sizeimage
;
641 ppix
->bytesperline
= pix
->bytesperline
;
642 memset(ppix
->reserved
, 0, sizeof(ppix
->reserved
));
645 int fmt_sp2mp_func(struct file
*file
, void *priv
,
646 struct v4l2_format
*f
, fmtfunc func
)
648 struct v4l2_format fmt
;
649 struct v4l2_pix_format_mplane
*mp
= &fmt
.fmt
.pix_mp
;
650 struct v4l2_plane_pix_format
*ppix
= &mp
->plane_fmt
[0];
651 struct v4l2_pix_format
*pix
= &f
->fmt
.pix
;
654 /* Converts to a mplane format */
656 /* Passes it to the generic mplane format function */
657 ret
= func(file
, priv
, &fmt
);
658 /* Copies back the mplane data to the single plane format */
659 pix
->width
= mp
->width
;
660 pix
->height
= mp
->height
;
661 pix
->pixelformat
= mp
->pixelformat
;
662 pix
->field
= mp
->field
;
663 pix
->colorspace
= mp
->colorspace
;
664 pix
->xfer_func
= mp
->xfer_func
;
665 /* Also copies hsv_enc */
666 pix
->ycbcr_enc
= mp
->ycbcr_enc
;
667 pix
->quantization
= mp
->quantization
;
668 pix
->sizeimage
= ppix
->sizeimage
;
669 pix
->bytesperline
= ppix
->bytesperline
;
670 pix
->flags
= mp
->flags
;
674 int vivid_vid_adjust_sel(unsigned flags
, struct v4l2_rect
*r
)
676 unsigned w
= r
->width
;
677 unsigned h
= r
->height
;
679 /* sanitize w and h in case someone passes ~0 as the value */
682 if (!(flags
& V4L2_SEL_FLAG_LE
)) {
690 if (!(flags
& V4L2_SEL_FLAG_GE
)) {
700 if (w
> MAX_WIDTH
|| h
> MAX_HEIGHT
)
706 /* sanitize left and top in case someone passes ~0 as the value */
709 if (r
->left
+ w
> MAX_WIDTH
)
710 r
->left
= MAX_WIDTH
- w
;
711 if (r
->top
+ h
> MAX_HEIGHT
)
712 r
->top
= MAX_HEIGHT
- h
;
713 if ((flags
& (V4L2_SEL_FLAG_GE
| V4L2_SEL_FLAG_LE
)) ==
714 (V4L2_SEL_FLAG_GE
| V4L2_SEL_FLAG_LE
) &&
715 (r
->width
!= w
|| r
->height
!= h
))
722 int vivid_enum_fmt_vid(struct file
*file
, void *priv
,
723 struct v4l2_fmtdesc
*f
)
725 struct vivid_dev
*dev
= video_drvdata(file
);
726 const struct vivid_fmt
*fmt
;
728 if (f
->index
>= ARRAY_SIZE(vivid_formats
) -
729 (dev
->multiplanar
? 0 : VIVID_MPLANAR_FORMATS
))
732 fmt
= &vivid_formats
[f
->index
];
734 f
->pixelformat
= fmt
->fourcc
;
738 int vidioc_enum_fmt_vid_mplane(struct file
*file
, void *priv
,
739 struct v4l2_fmtdesc
*f
)
741 struct vivid_dev
*dev
= video_drvdata(file
);
743 if (!dev
->multiplanar
)
745 return vivid_enum_fmt_vid(file
, priv
, f
);
748 int vidioc_enum_fmt_vid(struct file
*file
, void *priv
,
749 struct v4l2_fmtdesc
*f
)
751 struct vivid_dev
*dev
= video_drvdata(file
);
753 if (dev
->multiplanar
)
755 return vivid_enum_fmt_vid(file
, priv
, f
);
758 int vidioc_g_std(struct file
*file
, void *priv
, v4l2_std_id
*id
)
760 struct vivid_dev
*dev
= video_drvdata(file
);
761 struct video_device
*vdev
= video_devdata(file
);
763 if (vdev
->vfl_dir
== VFL_DIR_RX
) {
764 if (!vivid_is_sdtv_cap(dev
))
768 if (!vivid_is_svid_out(dev
))
775 int vidioc_g_dv_timings(struct file
*file
, void *_fh
,
776 struct v4l2_dv_timings
*timings
)
778 struct vivid_dev
*dev
= video_drvdata(file
);
779 struct video_device
*vdev
= video_devdata(file
);
781 if (vdev
->vfl_dir
== VFL_DIR_RX
) {
782 if (!vivid_is_hdmi_cap(dev
))
784 *timings
= dev
->dv_timings_cap
;
786 if (!vivid_is_hdmi_out(dev
))
788 *timings
= dev
->dv_timings_out
;
793 int vidioc_enum_dv_timings(struct file
*file
, void *_fh
,
794 struct v4l2_enum_dv_timings
*timings
)
796 struct vivid_dev
*dev
= video_drvdata(file
);
797 struct video_device
*vdev
= video_devdata(file
);
799 if (vdev
->vfl_dir
== VFL_DIR_RX
) {
800 if (!vivid_is_hdmi_cap(dev
))
803 if (!vivid_is_hdmi_out(dev
))
806 return v4l2_enum_dv_timings_cap(timings
, &vivid_dv_timings_cap
,
810 int vidioc_dv_timings_cap(struct file
*file
, void *_fh
,
811 struct v4l2_dv_timings_cap
*cap
)
813 struct vivid_dev
*dev
= video_drvdata(file
);
814 struct video_device
*vdev
= video_devdata(file
);
816 if (vdev
->vfl_dir
== VFL_DIR_RX
) {
817 if (!vivid_is_hdmi_cap(dev
))
820 if (!vivid_is_hdmi_out(dev
))
823 *cap
= vivid_dv_timings_cap
;
827 int vidioc_g_edid(struct file
*file
, void *_fh
,
828 struct v4l2_edid
*edid
)
830 struct vivid_dev
*dev
= video_drvdata(file
);
831 struct video_device
*vdev
= video_devdata(file
);
832 struct cec_adapter
*adap
;
834 memset(edid
->reserved
, 0, sizeof(edid
->reserved
));
835 if (vdev
->vfl_dir
== VFL_DIR_RX
) {
836 if (edid
->pad
>= dev
->num_inputs
)
838 if (dev
->input_type
[edid
->pad
] != HDMI
)
840 adap
= dev
->cec_rx_adap
;
842 unsigned int bus_idx
;
844 if (edid
->pad
>= dev
->num_outputs
)
846 if (dev
->output_type
[edid
->pad
] != HDMI
)
848 bus_idx
= dev
->cec_output2bus_map
[edid
->pad
];
849 adap
= dev
->cec_tx_adap
[bus_idx
];
851 if (edid
->start_block
== 0 && edid
->blocks
== 0) {
852 edid
->blocks
= dev
->edid_blocks
;
855 if (dev
->edid_blocks
== 0)
857 if (edid
->start_block
>= dev
->edid_blocks
)
859 if (edid
->start_block
+ edid
->blocks
> dev
->edid_blocks
)
860 edid
->blocks
= dev
->edid_blocks
- edid
->start_block
;
861 memcpy(edid
->edid
, dev
->edid
, edid
->blocks
* 128);
862 cec_set_edid_phys_addr(edid
->edid
, edid
->blocks
* 128, adap
->phys_addr
);