|
@@ -22,6 +22,7 @@
|
|
|
*/
|
|
|
|
|
|
#include <linux/bitops.h>
|
|
|
+#include <linux/bug.h>
|
|
|
#include <linux/errno.h>
|
|
|
#include <linux/export.h>
|
|
|
#include <linux/hdmi.h>
|
|
@@ -321,3 +322,45 @@ ssize_t hdmi_vendor_infoframe_pack(struct hdmi_vendor_infoframe *frame,
|
|
|
return length;
|
|
|
}
|
|
|
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);
|