diff options
-rw-r--r-- | drivers/gpu/drm/drm_edid.c | 36 | ||||
-rw-r--r-- | include/drm/drm_edid.h | 4 |
2 files changed, 40 insertions, 0 deletions
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index 3aa653fd03a7..ed3505fe8ace 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c | |||
@@ -3263,3 +3263,39 @@ drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame, | |||
3263 | return 0; | 3263 | return 0; |
3264 | } | 3264 | } |
3265 | EXPORT_SYMBOL(drm_hdmi_avi_infoframe_from_display_mode); | 3265 | EXPORT_SYMBOL(drm_hdmi_avi_infoframe_from_display_mode); |
3266 | |||
3267 | /** | ||
3268 | * drm_hdmi_vendor_infoframe_from_display_mode() - fill an HDMI infoframe with | ||
3269 | * data from a DRM display mode | ||
3270 | * @frame: HDMI vendor infoframe | ||
3271 | * @mode: DRM display mode | ||
3272 | * | ||
3273 | * Note that there's is a need to send HDMI vendor infoframes only when using a | ||
3274 | * 4k or stereoscopic 3D mode. So when giving any other mode as input this | ||
3275 | * function will return -EINVAL, error that can be safely ignored. | ||
3276 | * | ||
3277 | * Returns 0 on success or a negative error code on failure. | ||
3278 | */ | ||
3279 | int | ||
3280 | drm_hdmi_vendor_infoframe_from_display_mode(struct hdmi_vendor_infoframe *frame, | ||
3281 | const struct drm_display_mode *mode) | ||
3282 | { | ||
3283 | int err; | ||
3284 | u8 vic; | ||
3285 | |||
3286 | if (!frame || !mode) | ||
3287 | return -EINVAL; | ||
3288 | |||
3289 | vic = drm_match_hdmi_mode(mode); | ||
3290 | if (!vic) | ||
3291 | return -EINVAL; | ||
3292 | |||
3293 | err = hdmi_vendor_infoframe_init(frame); | ||
3294 | if (err < 0) | ||
3295 | return err; | ||
3296 | |||
3297 | frame->vic = vic; | ||
3298 | |||
3299 | return 0; | ||
3300 | } | ||
3301 | EXPORT_SYMBOL(drm_hdmi_vendor_infoframe_from_display_mode); | ||
diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h index fc481fc17085..7b75621fda4c 100644 --- a/include/drm/drm_edid.h +++ b/include/drm/drm_edid.h | |||
@@ -256,6 +256,7 @@ struct drm_encoder; | |||
256 | struct drm_connector; | 256 | struct drm_connector; |
257 | struct drm_display_mode; | 257 | struct drm_display_mode; |
258 | struct hdmi_avi_infoframe; | 258 | struct hdmi_avi_infoframe; |
259 | struct hdmi_vendor_infoframe; | ||
259 | 260 | ||
260 | void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid); | 261 | void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid); |
261 | int drm_edid_to_sad(struct edid *edid, struct cea_sad **sads); | 262 | int drm_edid_to_sad(struct edid *edid, struct cea_sad **sads); |
@@ -268,5 +269,8 @@ int drm_load_edid_firmware(struct drm_connector *connector); | |||
268 | int | 269 | int |
269 | drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame, | 270 | drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame, |
270 | const struct drm_display_mode *mode); | 271 | const struct drm_display_mode *mode); |
272 | int | ||
273 | drm_hdmi_vendor_infoframe_from_display_mode(struct hdmi_vendor_infoframe *frame, | ||
274 | const struct drm_display_mode *mode); | ||
271 | 275 | ||
272 | #endif /* __DRM_EDID_H__ */ | 276 | #endif /* __DRM_EDID_H__ */ |