mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 03:01:39 -04:00
drm/graphics pull request for v4.16-rc1
-----BEGIN PGP SIGNATURE----- iQIcBAABAgAGBQJacnVwAAoJEAx081l5xIa+HhIP/0yDg5tuco0QN3YskE/bIa3o 4VDWsLi+WCoSZoV4uWLKYK8OHiNzKdnGfNoUNWqRqaYilWDtpgBX86Wjg5hxnGwA /6jGfU1nhb0teG9clGBbzgxHXW6iKvT+p/Pp1pC8HXU+zEUaungJcWY120hITwMD NqUGK6kYRsJVYj+4b+5Ho7Fvv912bbjK0YAptD6RdzX4rDPN0D+XrtXlYsg1PJYx jv/NNWEP5mCesYKsS8JzHYcfOF/vdQpPwAV4C3LKaQy5k3pVVIDOEuOycIZTKMf3 K/fSsbvhHMH3Ck+lPcK+etcoQbkLCcmKbw+3uvM/7njkn7Dp24Ryk9FXB3dXXOgb 3kLs7f0gY9j/NAi3uKAMvACPvXNA7eptIvAmN/VKzmEiqgx+l0sveSuU73DVoe/x Jko8ijyiKchcN+/CTgZ7FNyEd0UWO06+9B0RMrlEezE8f14EhR51wIQQTNFJRJn/ kqRM1hC2Cvb00vAwq7jjZcDa7hRCI0OoVU9N37smtPuTJY94tR/CUbq10g4pSlu8 h8FiHnLuhlyh1DQNNS19HQfOSh0yYgEGRQcIKy3vqshsO3/hbe8bQD5UerqMZPZB ZpMEWe5VHSWIVjAxgzHNXFd9F/jSeWDVkCztKfx0CLmzHZNLNjw+/zgbIdF3vj9T S1cwFZLWr/ngf5mbyR88 =pLN1 -----END PGP SIGNATURE----- Merge tag 'drm-for-v4.16' of git://people.freedesktop.org/~airlied/linux Pull drm updates from Dave Airlie: "This seems to have been a comparatively quieter merge window, I assume due to holidays etc. The "biggest" change is AMD header cleanups, which merge/remove a bunch of them. The AMD gpu scheduler is now being made generic with the etnaviv driver wanting to reuse the code, hopefully other drivers can go in the same direction. Otherwise it's the usual lots of stuff in i915/amdgpu, not so much stuff elsewhere. Core: - Add .last_close and .output_poll_changed helpers to reduce driver footprints - Fix plane clipping - Improved debug printing support - Add panel orientation property - Update edid derived properties at edid setting - Reduction in fbdev driver footprint - Move amdgpu scheduler into core for other drivers to use. i915: - Selftest and IGT improvements - Fast boot prep work on IPS, pipe config - HW workarounds for Cannonlake, Geminilake - Cannonlake clock and HDMI2.0 fixes - GPU cache invalidation and context switch improvements - Display planes cleanup - New PMU interface for perf queries - New firmware support for KBL/SKL - Geminilake HW workaround for perforamce - Coffeelake stolen memory improvements - GPU reset robustness work - Cannonlake horizontal plane flipping - GVT work amdgpu/radeon: - RV and Vega header file cleanups (lots of lines gone!) - TTM operation context support - 48-bit GPUVM support for Vega/RV - ECC support for Vega - Resizeable BAR support - Multi-display sync support - Enable swapout for reserved BOs during allocation - S3 fixes on Raven - GPU reset cleanup and fixes - 2+1 level GPU page table amdkfd: - GFX7/8 SDMA user queues support - Hardware scheduling for multiple processes - dGPU prep work rcar: - Added R8A7743/5 support - System suspend/resume support sun4i: - Multi-plane support for YUV formats - A83T and LVDS support msm: - Devfreq support for GPU tegra: - Prep work for adding Tegra186 support - Tegra186 HDMI support - HDMI2.0 and zpos support by using generic helpers tilcdc: - Misc fixes omapdrm: - Support memory bandwidth limits - DSI command mode panel cleanups - DMM error handling exynos: - drop the old IPP subdriver. etnaviv: - Occlusion query fixes - Job handling fixes - Prep work for hooking in gpu scheduler armada: - Move closer to atomic modesetting - Allow disabling primary plane if overlay is full screen imx: - Format modifier support - Add tile prefetch to PRE - Runtime PM support for PRG ast: - fix LUT loading" * tag 'drm-for-v4.16' of git://people.freedesktop.org/~airlied/linux: (1471 commits) drm/ast: Load lut in crtc_commit drm: Check for lessee in DROP_MASTER ioctl drm: fix gpu scheduler link order drm/amd/display: Demote error print to debug print when ATOM impl missing dma-buf: fix reservation_object_wait_timeout_rcu once more v2 drm/amdgpu: Avoid leaking PM domain on driver unbind (v2) drm/amd/amdgpu: Add Polaris version check drm/amdgpu: Reenable manual GPU reset from sysfs drm/amdgpu: disable MMHUB power gating on raven drm/ttm: Don't unreserve swapped BOs that were previously reserved drm/ttm: Don't add swapped BOs to swap-LRU list drm/amdgpu: only check for ECC on Vega10 drm/amd/powerplay: Fix smu_table_entry.handle type drm/ttm: add VADDR_FLAG_UPDATED_COUNT to correctly update dma_page global count drm: Fix PANEL_ORIENTATION_QUIRKS breaking the Kconfig DRM menuconfig drm/radeon: fill in rb backend map on evergreen/ni. drm/amdgpu/gfx9: fix ngg enablement to clear gds reserved memory (v2) drm/ttm: only free pages rather than update global memory count together drm/amdgpu: fix CPU based VM updates drm/amdgpu: fix typo in amdgpu_vce_validate_bo ...
This commit is contained in:
commit
4bf772b146
1020 changed files with 57497 additions and 96993 deletions
|
|
@ -772,6 +772,7 @@ config FB_VESA
|
|||
config FB_EFI
|
||||
bool "EFI-based Framebuffer Support"
|
||||
depends on (FB = y) && !IA64 && EFI
|
||||
select DRM_PANEL_ORIENTATION_QUIRKS
|
||||
select FB_CFB_FILLRECT
|
||||
select FB_CFB_COPYAREA
|
||||
select FB_CFB_IMAGEBLIT
|
||||
|
|
|
|||
|
|
@ -15,9 +15,6 @@ ifeq ($(CONFIG_FRAMEBUFFER_CONSOLE_ROTATION),y)
|
|||
fb-y += fbcon_rotate.o fbcon_cw.o fbcon_ud.o \
|
||||
fbcon_ccw.o
|
||||
endif
|
||||
ifeq ($(CONFIG_DMI),y)
|
||||
fb-y += fbcon_dmi_quirks.o
|
||||
endif
|
||||
endif
|
||||
fb-objs := $(fb-y)
|
||||
|
||||
|
|
|
|||
|
|
@ -964,10 +964,13 @@ static const char *fbcon_startup(void)
|
|||
ops->cur_blink_jiffies = HZ / 5;
|
||||
ops->info = info;
|
||||
info->fbcon_par = ops;
|
||||
if (initial_rotation != -1)
|
||||
p->con_rotate = initial_rotation;
|
||||
else
|
||||
p->con_rotate = fbcon_platform_get_rotate(info);
|
||||
|
||||
p->con_rotate = initial_rotation;
|
||||
if (p->con_rotate == -1)
|
||||
p->con_rotate = info->fbcon_rotate_hint;
|
||||
if (p->con_rotate == -1)
|
||||
p->con_rotate = FB_ROTATE_UR;
|
||||
|
||||
set_blitting_type(vc, info);
|
||||
|
||||
if (info->fix.type != FB_TYPE_TEXT) {
|
||||
|
|
@ -1104,10 +1107,13 @@ static void fbcon_init(struct vc_data *vc, int init)
|
|||
|
||||
ops = info->fbcon_par;
|
||||
ops->cur_blink_jiffies = msecs_to_jiffies(vc->vc_cur_blink_ms);
|
||||
if (initial_rotation != -1)
|
||||
p->con_rotate = initial_rotation;
|
||||
else
|
||||
p->con_rotate = fbcon_platform_get_rotate(info);
|
||||
|
||||
p->con_rotate = initial_rotation;
|
||||
if (p->con_rotate == -1)
|
||||
p->con_rotate = info->fbcon_rotate_hint;
|
||||
if (p->con_rotate == -1)
|
||||
p->con_rotate = FB_ROTATE_UR;
|
||||
|
||||
set_blitting_type(vc, info);
|
||||
|
||||
cols = vc->vc_cols;
|
||||
|
|
|
|||
|
|
@ -262,10 +262,4 @@ extern void fbcon_set_rotate(struct fbcon_ops *ops);
|
|||
#define fbcon_set_rotate(x) do {} while(0)
|
||||
#endif /* CONFIG_FRAMEBUFFER_CONSOLE_ROTATION */
|
||||
|
||||
#ifdef CONFIG_DMI
|
||||
int fbcon_platform_get_rotate(struct fb_info *info);
|
||||
#else
|
||||
#define fbcon_platform_get_rotate(i) FB_ROTATE_UR
|
||||
#endif /* CONFIG_DMI */
|
||||
|
||||
#endif /* _VIDEO_FBCON_H */
|
||||
|
|
|
|||
|
|
@ -1,145 +0,0 @@
|
|||
/*
|
||||
* fbcon_dmi_quirks.c -- DMI based quirk detection for fbcon
|
||||
*
|
||||
* Copyright (C) 2017 Hans de Goede <hdegoede@redhat.com>
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file COPYING in the main directory of this archive for
|
||||
* more details.
|
||||
*/
|
||||
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/fb.h>
|
||||
#include <linux/kernel.h>
|
||||
#include "fbcon.h"
|
||||
|
||||
/*
|
||||
* Some x86 clamshell design devices use portrait tablet screens and a display
|
||||
* engine which cannot rotate in hardware, so we need to rotate the fbcon to
|
||||
* compensate. Unfortunately these (cheap) devices also typically have quite
|
||||
* generic DMI data, so we match on a combination of DMI data, screen resolution
|
||||
* and a list of known BIOS dates to avoid false positives.
|
||||
*/
|
||||
|
||||
struct fbcon_dmi_rotate_data {
|
||||
int width;
|
||||
int height;
|
||||
const char * const *bios_dates;
|
||||
int rotate;
|
||||
};
|
||||
|
||||
static const struct fbcon_dmi_rotate_data rotate_data_asus_t100ha = {
|
||||
.width = 800,
|
||||
.height = 1280,
|
||||
.rotate = FB_ROTATE_CCW,
|
||||
};
|
||||
|
||||
static const struct fbcon_dmi_rotate_data rotate_data_gpd_pocket = {
|
||||
.width = 1200,
|
||||
.height = 1920,
|
||||
.bios_dates = (const char * const []){ "05/26/2017", "06/28/2017",
|
||||
"07/05/2017", "08/07/2017", NULL },
|
||||
.rotate = FB_ROTATE_CW,
|
||||
};
|
||||
|
||||
static const struct fbcon_dmi_rotate_data rotate_data_gpd_win = {
|
||||
.width = 720,
|
||||
.height = 1280,
|
||||
.bios_dates = (const char * const []){
|
||||
"10/25/2016", "11/18/2016", "12/23/2016", "12/26/2016",
|
||||
"02/21/2017", "03/20/2017", "05/25/2017", NULL },
|
||||
.rotate = FB_ROTATE_CW,
|
||||
};
|
||||
|
||||
static const struct fbcon_dmi_rotate_data rotate_data_itworks_tw891 = {
|
||||
.width = 800,
|
||||
.height = 1280,
|
||||
.bios_dates = (const char * const []){ "10/16/2015", NULL },
|
||||
.rotate = FB_ROTATE_CW,
|
||||
};
|
||||
|
||||
static const struct fbcon_dmi_rotate_data rotate_data_vios_lth17 = {
|
||||
.width = 800,
|
||||
.height = 1280,
|
||||
.rotate = FB_ROTATE_CW,
|
||||
};
|
||||
|
||||
static const struct dmi_system_id rotate_data[] = {
|
||||
{ /* Asus T100HA */
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "T100HAN"),
|
||||
},
|
||||
.driver_data = (void *)&rotate_data_asus_t100ha,
|
||||
}, { /*
|
||||
* GPD Pocket, note that the the DMI data is less generic then
|
||||
* it seems, devices with a board-vendor of "AMI Corporation"
|
||||
* are quite rare, as are devices which have both board- *and*
|
||||
* product-id set to "Default String"
|
||||
*/
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"),
|
||||
DMI_EXACT_MATCH(DMI_BOARD_NAME, "Default string"),
|
||||
DMI_EXACT_MATCH(DMI_BOARD_SERIAL, "Default string"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Default string"),
|
||||
},
|
||||
.driver_data = (void *)&rotate_data_gpd_pocket,
|
||||
}, { /* GPD Win (same note on DMI match as GPD Pocket) */
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"),
|
||||
DMI_EXACT_MATCH(DMI_BOARD_NAME, "Default string"),
|
||||
DMI_EXACT_MATCH(DMI_BOARD_SERIAL, "Default string"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Default string"),
|
||||
},
|
||||
.driver_data = (void *)&rotate_data_gpd_win,
|
||||
}, { /* I.T.Works TW891 */
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "To be filled by O.E.M."),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "TW891"),
|
||||
DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "To be filled by O.E.M."),
|
||||
DMI_EXACT_MATCH(DMI_BOARD_NAME, "TW891"),
|
||||
},
|
||||
.driver_data = (void *)&rotate_data_itworks_tw891,
|
||||
}, { /* VIOS LTH17 */
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "VIOS"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "LTH17"),
|
||||
DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "VIOS"),
|
||||
DMI_EXACT_MATCH(DMI_BOARD_NAME, "LTH17"),
|
||||
},
|
||||
.driver_data = (void *)&rotate_data_vios_lth17,
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
int fbcon_platform_get_rotate(struct fb_info *info)
|
||||
{
|
||||
const struct dmi_system_id *match;
|
||||
const struct fbcon_dmi_rotate_data *data;
|
||||
const char *bios_date;
|
||||
int i;
|
||||
|
||||
for (match = dmi_first_match(rotate_data);
|
||||
match;
|
||||
match = dmi_first_match(match + 1)) {
|
||||
data = match->driver_data;
|
||||
|
||||
if (data->width != info->var.xres ||
|
||||
data->height != info->var.yres)
|
||||
continue;
|
||||
|
||||
if (!data->bios_dates)
|
||||
return data->rotate;
|
||||
|
||||
bios_date = dmi_get_system_info(DMI_BIOS_DATE);
|
||||
if (!bios_date)
|
||||
continue;
|
||||
|
||||
for (i = 0; data->bios_dates[i]; i++) {
|
||||
if (!strcmp(data->bios_dates[i], bios_date))
|
||||
return data->rotate;
|
||||
}
|
||||
}
|
||||
|
||||
return FB_ROTATE_UR;
|
||||
}
|
||||
|
|
@ -58,6 +58,7 @@ struct fb_info *framebuffer_alloc(size_t size, struct device *dev)
|
|||
info->par = p + fb_info_size;
|
||||
|
||||
info->device = dev;
|
||||
info->fbcon_rotate_hint = -1;
|
||||
|
||||
#ifdef CONFIG_FB_BACKLIGHT
|
||||
mutex_init(&info->bl_curve_mutex);
|
||||
|
|
|
|||
|
|
@ -16,6 +16,8 @@
|
|||
#include <linux/screen_info.h>
|
||||
#include <video/vga.h>
|
||||
#include <asm/efi.h>
|
||||
#include <drm/drm_utils.h> /* For drm_get_panel_orientation_quirk */
|
||||
#include <drm/drm_connector.h> /* For DRM_MODE_PANEL_ORIENTATION_* */
|
||||
|
||||
static bool request_mem_succeeded = false;
|
||||
static bool nowc = false;
|
||||
|
|
@ -157,7 +159,7 @@ static u64 bar_offset;
|
|||
static int efifb_probe(struct platform_device *dev)
|
||||
{
|
||||
struct fb_info *info;
|
||||
int err;
|
||||
int err, orientation;
|
||||
unsigned int size_vmode;
|
||||
unsigned int size_remap;
|
||||
unsigned int size_total;
|
||||
|
|
@ -329,6 +331,23 @@ static int efifb_probe(struct platform_device *dev)
|
|||
info->fix = efifb_fix;
|
||||
info->flags = FBINFO_FLAG_DEFAULT | FBINFO_MISC_FIRMWARE;
|
||||
|
||||
orientation = drm_get_panel_orientation_quirk(efifb_defined.xres,
|
||||
efifb_defined.yres);
|
||||
switch (orientation) {
|
||||
default:
|
||||
info->fbcon_rotate_hint = FB_ROTATE_UR;
|
||||
break;
|
||||
case DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP:
|
||||
info->fbcon_rotate_hint = FB_ROTATE_UD;
|
||||
break;
|
||||
case DRM_MODE_PANEL_ORIENTATION_LEFT_UP:
|
||||
info->fbcon_rotate_hint = FB_ROTATE_CCW;
|
||||
break;
|
||||
case DRM_MODE_PANEL_ORIENTATION_RIGHT_UP:
|
||||
info->fbcon_rotate_hint = FB_ROTATE_CW;
|
||||
break;
|
||||
}
|
||||
|
||||
err = sysfs_create_groups(&dev->dev.kobj, efifb_groups);
|
||||
if (err) {
|
||||
pr_err("efifb: cannot add sysfs attrs\n");
|
||||
|
|
|
|||
|
|
@ -455,15 +455,26 @@ static int td028ttec1_panel_remove(struct spi_device *spi)
|
|||
}
|
||||
|
||||
static const struct of_device_id td028ttec1_of_match[] = {
|
||||
{ .compatible = "omapdss,tpo,td028ttec1", },
|
||||
/* keep to not break older DTB */
|
||||
{ .compatible = "omapdss,toppoly,td028ttec1", },
|
||||
{},
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(of, td028ttec1_of_match);
|
||||
|
||||
static const struct spi_device_id td028ttec1_ids[] = {
|
||||
{ "toppoly,td028ttec1", 0 },
|
||||
{ "tpo,td028ttec1", 0},
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(spi, td028ttec1_ids);
|
||||
|
||||
static struct spi_driver td028ttec1_spi_driver = {
|
||||
.probe = td028ttec1_panel_probe,
|
||||
.remove = td028ttec1_panel_remove,
|
||||
.id_table = td028ttec1_ids,
|
||||
|
||||
.driver = {
|
||||
.name = "panel-tpo-td028ttec1",
|
||||
|
|
@ -474,7 +485,6 @@ static struct spi_driver td028ttec1_spi_driver = {
|
|||
|
||||
module_spi_driver(td028ttec1_spi_driver);
|
||||
|
||||
MODULE_ALIAS("spi:toppoly,td028ttec1");
|
||||
MODULE_AUTHOR("H. Nikolaus Schaller <[email protected]>");
|
||||
MODULE_DESCRIPTION("Toppoly TD028TTEC1 panel driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
|||
|
|
@ -321,6 +321,17 @@ int hdmi_vendor_infoframe_init(struct hdmi_vendor_infoframe *frame)
|
|||
}
|
||||
EXPORT_SYMBOL(hdmi_vendor_infoframe_init);
|
||||
|
||||
static int hdmi_vendor_infoframe_length(const struct hdmi_vendor_infoframe *frame)
|
||||
{
|
||||
/* for side by side (half) we also need to provide 3D_Ext_Data */
|
||||
if (frame->s3d_struct >= HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF)
|
||||
return 6;
|
||||
else if (frame->vic != 0 || frame->s3d_struct != HDMI_3D_STRUCTURE_INVALID)
|
||||
return 5;
|
||||
else
|
||||
return 4;
|
||||
}
|
||||
|
||||
/**
|
||||
* hdmi_vendor_infoframe_pack() - write a HDMI vendor infoframe to binary buffer
|
||||
* @frame: HDMI infoframe
|
||||
|
|
@ -341,19 +352,11 @@ ssize_t hdmi_vendor_infoframe_pack(struct hdmi_vendor_infoframe *frame,
|
|||
u8 *ptr = buffer;
|
||||
size_t length;
|
||||
|
||||
/* empty info frame */
|
||||
if (frame->vic == 0 && frame->s3d_struct == HDMI_3D_STRUCTURE_INVALID)
|
||||
return -EINVAL;
|
||||
|
||||
/* only one of those can be supplied */
|
||||
if (frame->vic != 0 && frame->s3d_struct != HDMI_3D_STRUCTURE_INVALID)
|
||||
return -EINVAL;
|
||||
|
||||
/* for side by side (half) we also need to provide 3D_Ext_Data */
|
||||
if (frame->s3d_struct >= HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF)
|
||||
frame->length = 6;
|
||||
else
|
||||
frame->length = 5;
|
||||
frame->length = hdmi_vendor_infoframe_length(frame);
|
||||
|
||||
length = HDMI_INFOFRAME_HEADER_SIZE + frame->length;
|
||||
|
||||
|
|
@ -372,14 +375,16 @@ ssize_t hdmi_vendor_infoframe_pack(struct hdmi_vendor_infoframe *frame,
|
|||
ptr[5] = 0x0c;
|
||||
ptr[6] = 0x00;
|
||||
|
||||
if (frame->vic) {
|
||||
ptr[7] = 0x1 << 5; /* video format */
|
||||
ptr[8] = frame->vic;
|
||||
} else {
|
||||
if (frame->s3d_struct != HDMI_3D_STRUCTURE_INVALID) {
|
||||
ptr[7] = 0x2 << 5; /* video format */
|
||||
ptr[8] = (frame->s3d_struct & 0xf) << 4;
|
||||
if (frame->s3d_struct >= HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF)
|
||||
ptr[9] = (frame->s3d_ext_data & 0xf) << 4;
|
||||
} else if (frame->vic) {
|
||||
ptr[7] = 0x1 << 5; /* video format */
|
||||
ptr[8] = frame->vic;
|
||||
} else {
|
||||
ptr[7] = 0x0 << 5; /* video format */
|
||||
}
|
||||
|
||||
hdmi_infoframe_set_checksum(buffer, length);
|
||||
|
|
@ -1165,7 +1170,7 @@ hdmi_vendor_any_infoframe_unpack(union hdmi_vendor_any_infoframe *frame,
|
|||
|
||||
if (ptr[0] != HDMI_INFOFRAME_TYPE_VENDOR ||
|
||||
ptr[1] != 1 ||
|
||||
(ptr[2] != 5 && ptr[2] != 6))
|
||||
(ptr[2] != 4 && ptr[2] != 5 && ptr[2] != 6))
|
||||
return -EINVAL;
|
||||
|
||||
length = ptr[2];
|
||||
|
|
@ -1193,16 +1198,22 @@ hdmi_vendor_any_infoframe_unpack(union hdmi_vendor_any_infoframe *frame,
|
|||
|
||||
hvf->length = length;
|
||||
|
||||
if (hdmi_video_format == 0x1) {
|
||||
hvf->vic = ptr[4];
|
||||
} else if (hdmi_video_format == 0x2) {
|
||||
if (hdmi_video_format == 0x2) {
|
||||
if (length != 5 && length != 6)
|
||||
return -EINVAL;
|
||||
hvf->s3d_struct = ptr[4] >> 4;
|
||||
if (hvf->s3d_struct >= HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF) {
|
||||
if (length == 6)
|
||||
hvf->s3d_ext_data = ptr[5] >> 4;
|
||||
else
|
||||
if (length != 6)
|
||||
return -EINVAL;
|
||||
hvf->s3d_ext_data = ptr[5] >> 4;
|
||||
}
|
||||
} else if (hdmi_video_format == 0x1) {
|
||||
if (length != 5)
|
||||
return -EINVAL;
|
||||
hvf->vic = ptr[4];
|
||||
} else {
|
||||
if (length != 4)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
Loading…
Reference in a new issue