video/hdmi: Introduce a generic hdmi_infoframe union
And a way to pack hdmi_infoframe generically. Cc: Thierry Reding <thierry.reding@avionic-design.de> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Damien Lespiau <damien.lespiau@intel.com> Acked-by: Dave Airlie <airlied@gmail.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
parent
3c6b054de1
commit
72b098964d
@ -22,6 +22,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/bitops.h>
|
#include <linux/bitops.h>
|
||||||
|
#include <linux/bug.h>
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/export.h>
|
#include <linux/export.h>
|
||||||
#include <linux/hdmi.h>
|
#include <linux/hdmi.h>
|
||||||
@ -321,3 +322,45 @@ ssize_t hdmi_vendor_infoframe_pack(struct hdmi_vendor_infoframe *frame,
|
|||||||
return length;
|
return length;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(hdmi_vendor_infoframe_pack);
|
EXPORT_SYMBOL(hdmi_vendor_infoframe_pack);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hdmi_infoframe_pack() - write a HDMI infoframe to binary buffer
|
||||||
|
* @frame: HDMI infoframe
|
||||||
|
* @buffer: destination buffer
|
||||||
|
* @size: size of buffer
|
||||||
|
*
|
||||||
|
* Packs the information contained in the @frame structure into a binary
|
||||||
|
* representation that can be written into the corresponding controller
|
||||||
|
* registers. Also computes the checksum as required by section 5.3.5 of
|
||||||
|
* the HDMI 1.4 specification.
|
||||||
|
*
|
||||||
|
* Returns the number of bytes packed into the binary buffer or a negative
|
||||||
|
* error code on failure.
|
||||||
|
*/
|
||||||
|
ssize_t
|
||||||
|
hdmi_infoframe_pack(union hdmi_infoframe *frame, void *buffer, size_t size)
|
||||||
|
{
|
||||||
|
ssize_t length;
|
||||||
|
|
||||||
|
switch (frame->any.type) {
|
||||||
|
case HDMI_INFOFRAME_TYPE_AVI:
|
||||||
|
length = hdmi_avi_infoframe_pack(&frame->avi, buffer, size);
|
||||||
|
break;
|
||||||
|
case HDMI_INFOFRAME_TYPE_SPD:
|
||||||
|
length = hdmi_spd_infoframe_pack(&frame->spd, buffer, size);
|
||||||
|
break;
|
||||||
|
case HDMI_INFOFRAME_TYPE_AUDIO:
|
||||||
|
length = hdmi_audio_infoframe_pack(&frame->audio, buffer, size);
|
||||||
|
break;
|
||||||
|
case HDMI_INFOFRAME_TYPE_VENDOR:
|
||||||
|
length = hdmi_vendor_infoframe_pack(&frame->vendor,
|
||||||
|
buffer, size);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
WARN(1, "Bad infoframe type %d\n", frame->any.type);
|
||||||
|
length = -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(hdmi_infoframe_pack);
|
||||||
|
@ -23,6 +23,12 @@ enum hdmi_infoframe_type {
|
|||||||
#define HDMI_SPD_INFOFRAME_SIZE 25
|
#define HDMI_SPD_INFOFRAME_SIZE 25
|
||||||
#define HDMI_AUDIO_INFOFRAME_SIZE 10
|
#define HDMI_AUDIO_INFOFRAME_SIZE 10
|
||||||
|
|
||||||
|
struct hdmi_any_infoframe {
|
||||||
|
enum hdmi_infoframe_type type;
|
||||||
|
unsigned char version;
|
||||||
|
unsigned char length;
|
||||||
|
};
|
||||||
|
|
||||||
enum hdmi_colorspace {
|
enum hdmi_colorspace {
|
||||||
HDMI_COLORSPACE_RGB,
|
HDMI_COLORSPACE_RGB,
|
||||||
HDMI_COLORSPACE_YUV422,
|
HDMI_COLORSPACE_YUV422,
|
||||||
@ -228,4 +234,15 @@ struct hdmi_vendor_infoframe {
|
|||||||
ssize_t hdmi_vendor_infoframe_pack(struct hdmi_vendor_infoframe *frame,
|
ssize_t hdmi_vendor_infoframe_pack(struct hdmi_vendor_infoframe *frame,
|
||||||
void *buffer, size_t size);
|
void *buffer, size_t size);
|
||||||
|
|
||||||
|
union hdmi_infoframe {
|
||||||
|
struct hdmi_any_infoframe any;
|
||||||
|
struct hdmi_avi_infoframe avi;
|
||||||
|
struct hdmi_spd_infoframe spd;
|
||||||
|
struct hdmi_vendor_infoframe vendor;
|
||||||
|
struct hdmi_audio_infoframe audio;
|
||||||
|
};
|
||||||
|
|
||||||
|
ssize_t
|
||||||
|
hdmi_infoframe_pack(union hdmi_infoframe *frame, void *buffer, size_t size);
|
||||||
|
|
||||||
#endif /* _DRM_HDMI_H */
|
#endif /* _DRM_HDMI_H */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user