]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
media: include/uapi/linux/cec*.h: add CEC LIP support
authorHans Verkuil <hverkuil+cisco@kernel.org>
Mon, 18 May 2026 14:40:32 +0000 (16:40 +0200)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Tue, 19 May 2026 15:53:04 +0000 (17:53 +0200)
Add support for the new Latency Indication Protocol feature.

This adds the opcodes and the wrapper functions.

Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org>
Link: https://patch.msgid.link/8dac7c99b7eab4fcc11d76d50dd08fb4448672f4.1779115235.git.hverkuil+cisco@kernel.org
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
Message-ID: <8dac7c99b7eab4fcc11d76d50dd08fb4448672f4.1779115235.git.hverkuil+cisco@kernel.org>

include/uapi/linux/cec-funcs.h
include/uapi/linux/cec.h

index 189ecf0e13cdb8483f22f4939f14dc8e0ddc5799..ba4b47de9bf021c1189aff8f6e0531ec3a376776 100644 (file)
@@ -1701,6 +1701,188 @@ static inline void cec_ops_request_current_latency(const struct cec_msg *msg,
 }
 
 
+/* Latency Indication Protocol Feature */
+/* Only for CEC 2.0 and up */
+static inline void cec_msg_request_lip_support(struct cec_msg *msg,
+                                              int reply, __u16 phys_addr)
+{
+       msg->len = 4;
+       msg->msg[1] = CEC_MSG_REQUEST_LIP_SUPPORT;
+       msg->msg[2] = phys_addr >> 8;
+       msg->msg[3] = phys_addr & 0xff;
+       msg->reply = reply ? CEC_MSG_REPORT_LIP_SUPPORT : 0;
+}
+
+static inline void cec_ops_request_lip_support(const struct cec_msg *msg,
+                                              __u16 *phys_addr)
+{
+       *phys_addr = (msg->msg[2] << 8) | msg->msg[3];
+}
+
+static inline void cec_msg_report_lip_support(struct cec_msg *msg, __u32 sqid)
+{
+       msg->len = 6;
+       msg->msg[1] = CEC_MSG_REPORT_LIP_SUPPORT;
+       msg->msg[2] = sqid >> 24;
+       msg->msg[3] = (sqid >> 16) & 0xff;
+       msg->msg[4] = (sqid >> 8) & 0xff;
+       msg->msg[5] = sqid & 0xff;
+}
+
+static inline void cec_ops_report_lip_support(const struct cec_msg *msg,
+                                             __u32 *sqid)
+{
+       *sqid = (msg->msg[2] << 24) | (msg->msg[3] << 16) |
+               (msg->msg[4] << 8) | msg->msg[5];
+}
+
+static inline void cec_msg_request_audio_and_video_latency(struct cec_msg *msg,
+                                              int reply, __u8 video_format,
+                                              __u8 hdr_format, __u8 vrr_format,
+                                              __u8 audio_format,
+                                              __u8 audio_format_extension)
+{
+       msg->len = 6;
+       msg->msg[1] = CEC_MSG_REQUEST_AUDIO_AND_VIDEO_LATENCY;
+       msg->msg[2] = video_format;
+       msg->msg[3] = hdr_format;
+       msg->msg[4] = vrr_format;
+       msg->msg[5] = audio_format;
+       if (audio_format >= 1 && audio_format <= 31) {
+               msg->msg[6] = audio_format_extension;
+               msg->len++;
+       }
+       msg->reply = reply ? CEC_MSG_REPORT_AUDIO_AND_VIDEO_LATENCY : 0;
+}
+
+static inline void cec_ops_request_audio_and_video_latency(const struct cec_msg *msg,
+                                              __u8 *video_format,
+                                              __u8 *hdr_format,
+                                              __u8 *vrr_format,
+                                              __u8 *audio_format,
+                                              __u8 *audio_format_extension)
+{
+       *video_format = msg->msg[2];
+       *hdr_format = msg->msg[3];
+       *vrr_format = msg->msg[4];
+       *audio_format = msg->msg[5];
+       *audio_format_extension = msg->len > 6 ? msg->msg[6] : 0;
+}
+
+static inline void cec_msg_report_audio_and_video_latency(struct cec_msg *msg,
+                                                         __u16 video_latency,
+                                                         __u16 audio_latency)
+{
+       msg->len = 6;
+       msg->msg[1] = CEC_MSG_REPORT_AUDIO_AND_VIDEO_LATENCY;
+       msg->msg[2] = video_latency >> 8;
+       msg->msg[3] = video_latency & 0xff;
+       msg->msg[4] = audio_latency >> 8;
+       msg->msg[5] = audio_latency & 0xff;
+}
+
+static inline void cec_ops_report_audio_and_video_latency(const struct cec_msg *msg,
+                                             __u16 *video_latency,
+                                             __u16 *audio_latency)
+{
+       *video_latency = (msg->msg[2] << 8) | msg->msg[3];
+       *audio_latency = (msg->msg[4] << 8) | msg->msg[5];
+}
+
+static inline void cec_msg_request_audio_latency(struct cec_msg *msg,
+                                                int reply,
+                                                __u8 audio_format,
+                                                __u8 audio_format_extension)
+{
+       msg->len = 3;
+       msg->msg[1] = CEC_MSG_REQUEST_AUDIO_LATENCY;
+       msg->msg[2] = audio_format;
+       if (audio_format >= 1 && audio_format <= 31) {
+               msg->msg[3] = audio_format_extension;
+               msg->len++;
+       }
+       msg->reply = reply ? CEC_MSG_REPORT_AUDIO_LATENCY : 0;
+}
+
+static inline void cec_ops_request_audio_latency(const struct cec_msg *msg,
+                                                __u8 *audio_format,
+                                                __u8 *audio_format_extension)
+{
+       *audio_format = msg->msg[2];
+       *audio_format_extension = msg->len > 3 ? msg->msg[3] : 0;
+}
+
+static inline void cec_msg_report_audio_latency(struct cec_msg *msg,
+                                               __u16 audio_latency)
+{
+       msg->len = 4;
+       msg->msg[1] = CEC_MSG_REPORT_AUDIO_LATENCY;
+       msg->msg[2] = audio_latency >> 8;
+       msg->msg[3] = audio_latency & 0xff;
+}
+
+static inline void cec_ops_report_audio_latency(const struct cec_msg *msg,
+                                               __u16 *audio_latency)
+{
+       *audio_latency = (msg->msg[2] << 8) | msg->msg[3];
+}
+
+static inline void cec_msg_request_video_latency(struct cec_msg *msg,
+                                                int reply, __u8 video_format,
+                                                __u8 hdr_format,
+                                                __u8 vrr_format)
+{
+       msg->len = 5;
+       msg->msg[1] = CEC_MSG_REQUEST_VIDEO_LATENCY;
+       msg->msg[2] = video_format;
+       msg->msg[3] = hdr_format;
+       msg->msg[4] = vrr_format;
+       msg->reply = reply ? CEC_MSG_REPORT_VIDEO_LATENCY : 0;
+}
+
+static inline void cec_ops_request_video_latency(const struct cec_msg *msg,
+                                                __u8 *video_format,
+                                                __u8 *hdr_format,
+                                                __u8 *vrr_format)
+{
+       *video_format = msg->msg[2];
+       *hdr_format = msg->msg[3];
+       *vrr_format = msg->msg[4];
+}
+
+static inline void cec_msg_report_video_latency(struct cec_msg *msg,
+                                               __u16 video_latency)
+{
+       msg->len = 4;
+       msg->msg[1] = CEC_MSG_REPORT_VIDEO_LATENCY;
+       msg->msg[2] = video_latency >> 8;
+       msg->msg[3] = video_latency & 0xff;
+}
+
+static inline void cec_ops_report_video_latency(const struct cec_msg *msg,
+                                               __u16 *video_latency)
+{
+       *video_latency = (msg->msg[2] << 8) | msg->msg[3];
+}
+
+static inline void cec_msg_update_sqid(struct cec_msg *msg, __u32 sqid)
+{
+       msg->len = 6;
+       msg->msg[1] = CEC_MSG_UPDATE_SQID;
+       msg->msg[2] = sqid >> 24;
+       msg->msg[3] = (sqid >> 16) & 0xff;
+       msg->msg[4] = (sqid >> 8) & 0xff;
+       msg->msg[5] = sqid & 0xff;
+}
+
+static inline void cec_ops_update_sqid(const struct cec_msg *msg,
+                                      __u32 *sqid)
+{
+       *sqid = (msg->msg[2] << 24) | (msg->msg[3] << 16) |
+               (msg->msg[4] << 8) | msg->msg[5];
+}
+
+
 /* Capability Discovery and Control Feature */
 static inline void cec_msg_cdc_hec_inquire_state(struct cec_msg *msg,
                                                 __u16 phys_addr1,
index b2af1dddd4d7b63e3d5ee29ef661d3a1daf1d448..75bc9e4e0350d8938a8384f45d77ca721d995560 100644 (file)
@@ -1104,6 +1104,30 @@ struct cec_event {
 #define CEC_OP_AUD_OUT_COMPENSATED_PARTIAL_DELAY       3
 
 
+/* Latency Indication Protocol Feature */
+#define CEC_MSG_REQUEST_LIP_SUPPORT                    0x50
+#define CEC_MSG_REPORT_LIP_SUPPORT                     0x51
+#define CEC_MSG_REQUEST_AUDIO_AND_VIDEO_LATENCY                0x52
+/* HDR Format Operand (hdr_format) */
+#define CEC_OP_HDR_FORMAT_GAMMA_SDR                    0
+#define CEC_OP_HDR_FORMAT_GAMMA_HDR                    1
+#define CEC_OP_HDR_FORMAT_PQ                           2
+#define CEC_OP_HDR_FORMAT_HLG                          3
+#define CEC_OP_HDR_FORMAT_DYNAMIC_HDR_TYPE_1           8
+#define CEC_OP_HDR_FORMAT_DYNAMIC_HDR_TYPE_2           9
+#define CEC_OP_HDR_FORMAT_DYNAMIC_HDR_TYPE_4           11
+#define CEC_OP_HDR_FORMAT_DV_SINK_LED                  16
+#define CEC_OP_HDR_FORMAT_DV_SOURCE_LED                        17
+#define CEC_OP_HDR_FORMAT_HDR10PLUS                    24
+#define CEC_OP_HDR_FORMAT_ETSI_TS_103_433              32
+#define CEC_MSG_REPORT_AUDIO_AND_VIDEO_LATENCY         0x53
+#define CEC_MSG_REQUEST_AUDIO_LATENCY                  0x54
+#define CEC_MSG_REPORT_AUDIO_LATENCY                   0x55
+#define CEC_MSG_REQUEST_VIDEO_LATENCY                  0x56
+#define CEC_MSG_REPORT_VIDEO_LATENCY                   0x57
+#define CEC_MSG_UPDATE_SQID                            0x58
+
+
 /* Capability Discovery and Control Feature */
 #define CEC_MSG_CDC_MESSAGE                            0xf8
 /* Ethernet-over-HDMI: nobody ever does this... */