summaryrefslogtreecommitdiffstats
path: root/include/uapi/linux/cec-funcs.h
diff options
context:
space:
mode:
authorHans Verkuil2016-12-06 14:17:12 +0100
committerMauro Carvalho Chehab2016-12-21 09:59:13 +0100
commitf3854973f196baad5be6b62d8f5ea24b0346b63f (patch)
tree3a5cd042269c43755e5d052c34e57d09ceb7759f /include/uapi/linux/cec-funcs.h
parent[media] smiapp: Make suspend and resume functions __maybe_unused (diff)
downloadkernel-qcow2-linux-f3854973f196baad5be6b62d8f5ea24b0346b63f.tar.gz
kernel-qcow2-linux-f3854973f196baad5be6b62d8f5ea24b0346b63f.tar.xz
kernel-qcow2-linux-f3854973f196baad5be6b62d8f5ea24b0346b63f.zip
[media] cec: fix report_current_latency
In the (very) small print of the REPORT_CURRENT_LATENCY message there is a line that says that the last byte of the message (audio out delay) is only present if the 'audio out compensated' value is 3. I missed this, and so if this message was sent with a total length of 6 (i.e. without the audio out delay byte), then it was rejected by the framework since a minimum length of 7 was expected. Fix this minimum length check and update the wrappers in cec-funcs.h to do the right thing based on the message length. Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Diffstat (limited to 'include/uapi/linux/cec-funcs.h')
-rw-r--r--include/uapi/linux/cec-funcs.h10
1 files changed, 7 insertions, 3 deletions
diff --git a/include/uapi/linux/cec-funcs.h b/include/uapi/linux/cec-funcs.h
index 3cbc327801d6..c451eec42a83 100644
--- a/include/uapi/linux/cec-funcs.h
+++ b/include/uapi/linux/cec-funcs.h
@@ -1665,14 +1665,15 @@ static inline void cec_msg_report_current_latency(struct cec_msg *msg,
__u8 audio_out_compensated,
__u8 audio_out_delay)
{
- msg->len = 7;
+ msg->len = 6;
msg->msg[0] |= 0xf; /* broadcast */
msg->msg[1] = CEC_MSG_REPORT_CURRENT_LATENCY;
msg->msg[2] = phys_addr >> 8;
msg->msg[3] = phys_addr & 0xff;
msg->msg[4] = video_latency;
msg->msg[5] = (low_latency_mode << 2) | audio_out_compensated;
- msg->msg[6] = audio_out_delay;
+ if (audio_out_compensated == 3)
+ msg->msg[msg->len++] = audio_out_delay;
}
static inline void cec_ops_report_current_latency(const struct cec_msg *msg,
@@ -1686,7 +1687,10 @@ static inline void cec_ops_report_current_latency(const struct cec_msg *msg,
*video_latency = msg->msg[4];
*low_latency_mode = (msg->msg[5] >> 2) & 1;
*audio_out_compensated = msg->msg[5] & 3;
- *audio_out_delay = msg->msg[6];
+ if (*audio_out_compensated == 3 && msg->len >= 7)
+ *audio_out_delay = msg->msg[6];
+ else
+ *audio_out_delay = 0;
}
static inline void cec_msg_request_current_latency(struct cec_msg *msg,