summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Verkuil <hans.verkuil@cisco.com>2016-11-01 08:55:05 -0200
committerRay Zhang <rayz@codeaurora.org>2017-05-25 11:22:12 +0800
commit7f145a1a087cb84264409076150f0e89fb48f2e6 (patch)
treeeb5c2f47326a9a053a112b40cff21eae4a578cd6
parent9fc0297bd21f2bc756f18316ec214842a515386a (diff)
[media] cec: add CEC_MSG_FL_REPLY_TO_FOLLOWERS
Give the caller more control over how replies to a transmit are handled. By default the reply will only go to the filehandle that called CEC_TRANSMIT. If this new flag is set, then the reply will also go to all followers. Change-Id: I3464ff0980bf5625ebd869eeeafced07c760f741 Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com> Git-commit: adc0c622783978ab0c740af77f98fc8f65c87d66 Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git [rayz@codeaurora.org: remove documents in the original patch to fix conflicts] Signed-off-by: Ray Zhang <rayz@codeaurora.org>
-rw-r--r--drivers/staging/media/cec/TODO4
-rw-r--r--drivers/staging/media/cec/cec-adap.c6
-rw-r--r--drivers/staging/media/cec/cec-api.c1
-rw-r--r--include/linux/cec.h5
4 files changed, 8 insertions, 8 deletions
diff --git a/drivers/staging/media/cec/TODO b/drivers/staging/media/cec/TODO
index 084120687d06..ce69001b0428 100644
--- a/drivers/staging/media/cec/TODO
+++ b/drivers/staging/media/cec/TODO
@@ -13,10 +13,6 @@ Hopefully this will happen later in 2016.
Other TODOs:
- There are two possible replies to CEC_MSG_INITIATE_ARC. How to handle that?
-- If the reply field of cec_msg is set then when the reply arrives it
- is only sent to the filehandle that transmitted the original message
- and not to any followers. Should this behavior change or perhaps
- controlled through a cec_msg flag?
- Should CEC_LOG_ADDR_TYPE_SPECIFIC be replaced by TYPE_2ND_TV and TYPE_PROCESSOR?
And also TYPE_SWITCH and TYPE_CDC_ONLY in addition to the TYPE_UNREGISTERED?
This should give the framework more information about the device type
diff --git a/drivers/staging/media/cec/cec-adap.c b/drivers/staging/media/cec/cec-adap.c
index 589e4576fbe9..6aceb1d4a7a0 100644
--- a/drivers/staging/media/cec/cec-adap.c
+++ b/drivers/staging/media/cec/cec-adap.c
@@ -587,7 +587,6 @@ int cec_transmit_msg_fh(struct cec_adapter *adap, struct cec_msg *msg,
msg->tx_nack_cnt = 0;
msg->tx_low_drive_cnt = 0;
msg->tx_error_cnt = 0;
- msg->flags = 0;
msg->sequence = ++adap->sequence;
if (!msg->sequence)
msg->sequence = ++adap->sequence;
@@ -823,6 +822,7 @@ void cec_received_msg(struct cec_adapter *adap, struct cec_msg *msg)
dst->rx_status = msg->rx_status;
if (abort)
dst->rx_status |= CEC_RX_STATUS_FEATURE_ABORT;
+ msg->flags = dst->flags;
/* Remove it from the wait_queue */
list_del_init(&data->list);
@@ -1575,8 +1575,8 @@ static int cec_receive_notify(struct cec_adapter *adap, struct cec_msg *msg,
}
skip_processing:
- /* If this was a reply, then we're done */
- if (is_reply)
+ /* If this was a reply, then we're done, unless otherwise specified */
+ if (is_reply && !(msg->flags & CEC_MSG_FL_REPLY_TO_FOLLOWERS))
return 0;
/*
diff --git a/drivers/staging/media/cec/cec-api.c b/drivers/staging/media/cec/cec-api.c
index 040ca7ddf2b0..54148a6b3326 100644
--- a/drivers/staging/media/cec/cec-api.c
+++ b/drivers/staging/media/cec/cec-api.c
@@ -190,6 +190,7 @@ static long cec_transmit(struct cec_adapter *adap, struct cec_fh *fh,
return -ENOTTY;
if (copy_from_user(&msg, parg, sizeof(msg)))
return -EFAULT;
+ msg.flags &= CEC_MSG_FL_REPLY_TO_FOLLOWERS;
mutex_lock(&adap->lock);
if (!adap->is_configured)
err = -ENONET;
diff --git a/include/linux/cec.h b/include/linux/cec.h
index 825455fae3cc..3f2f076027b1 100644
--- a/include/linux/cec.h
+++ b/include/linux/cec.h
@@ -175,7 +175,10 @@ static inline void cec_msg_set_reply_to(struct cec_msg *msg,
msg->reply = msg->timeout = 0;
}
-/* cec status field */
+/* cec_msg flags field */
+#define CEC_MSG_FL_REPLY_TO_FOLLOWERS (1 << 0)
+
+/* cec_msg tx/rx_status field */
#define CEC_TX_STATUS_OK (1 << 0)
#define CEC_TX_STATUS_ARB_LOST (1 << 1)
#define CEC_TX_STATUS_NACK (1 << 2)