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
					
				
			
		
					 2 changed files with 60 additions and 0 deletions
				
			
		| 
						 | 
					@ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue