Commit 52bc30fd authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab

[media] cec: replace cec_report_features by cec_fill_msg_report_features

The fill function just fills in the cec_msg struct, it doesn't transmit
the message. This is now done explicitly.

This makes it possible to switch to transmitting this message with adap->lock
held.
Signed-off-by: default avatarHans Verkuil <hansverk@cisco.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent 7af26f88
...@@ -30,8 +30,10 @@ ...@@ -30,8 +30,10 @@
#include "cec-priv.h" #include "cec-priv.h"
static int cec_report_features(struct cec_adapter *adap, unsigned int la_idx);
static int cec_report_phys_addr(struct cec_adapter *adap, unsigned int la_idx); static int cec_report_phys_addr(struct cec_adapter *adap, unsigned int la_idx);
static void cec_fill_msg_report_features(struct cec_adapter *adap,
struct cec_msg *msg,
unsigned int la_idx);
/* /*
* 400 ms is the time it takes for one 16 byte message to be * 400 ms is the time it takes for one 16 byte message to be
...@@ -1258,16 +1260,21 @@ static int cec_config_thread_func(void *arg) ...@@ -1258,16 +1260,21 @@ static int cec_config_thread_func(void *arg)
mutex_unlock(&adap->lock); mutex_unlock(&adap->lock);
for (i = 0; i < las->num_log_addrs; i++) { for (i = 0; i < las->num_log_addrs; i++) {
struct cec_msg msg = {};
if (las->log_addr[i] == CEC_LOG_ADDR_INVALID || if (las->log_addr[i] == CEC_LOG_ADDR_INVALID ||
(las->flags & CEC_LOG_ADDRS_FL_CDC_ONLY)) (las->flags & CEC_LOG_ADDRS_FL_CDC_ONLY))
continue; continue;
/* msg.msg[0] = (las->log_addr[i] << 4) | 0x0f;
* Report Features must come first according
* to CEC 2.0 /* Report Features must come first according to CEC 2.0 */
*/ if (las->log_addr[i] != CEC_LOG_ADDR_UNREGISTERED &&
if (las->log_addr[i] != CEC_LOG_ADDR_UNREGISTERED) adap->log_addrs.cec_version >= CEC_OP_CEC_VERSION_2_0) {
cec_report_features(adap, i); cec_fill_msg_report_features(adap, &msg, i);
cec_transmit_msg(adap, &msg, false);
}
cec_report_phys_addr(adap, i); cec_report_phys_addr(adap, i);
} }
mutex_lock(&adap->lock); mutex_lock(&adap->lock);
...@@ -1526,36 +1533,32 @@ EXPORT_SYMBOL_GPL(cec_s_log_addrs); ...@@ -1526,36 +1533,32 @@ EXPORT_SYMBOL_GPL(cec_s_log_addrs);
/* High-level core CEC message handling */ /* High-level core CEC message handling */
/* Transmit the Report Features message */ /* Fill in the Report Features message */
static int cec_report_features(struct cec_adapter *adap, unsigned int la_idx) static void cec_fill_msg_report_features(struct cec_adapter *adap,
struct cec_msg *msg,
unsigned int la_idx)
{ {
struct cec_msg msg = { };
const struct cec_log_addrs *las = &adap->log_addrs; const struct cec_log_addrs *las = &adap->log_addrs;
const u8 *features = las->features[la_idx]; const u8 *features = las->features[la_idx];
bool op_is_dev_features = false; bool op_is_dev_features = false;
unsigned int idx; unsigned int idx;
/* This is 2.0 and up only */
if (adap->log_addrs.cec_version < CEC_OP_CEC_VERSION_2_0)
return 0;
/* Report Features */ /* Report Features */
msg.msg[0] = (las->log_addr[la_idx] << 4) | 0x0f; msg->msg[0] = (las->log_addr[la_idx] << 4) | 0x0f;
msg.len = 4; msg->len = 4;
msg.msg[1] = CEC_MSG_REPORT_FEATURES; msg->msg[1] = CEC_MSG_REPORT_FEATURES;
msg.msg[2] = adap->log_addrs.cec_version; msg->msg[2] = adap->log_addrs.cec_version;
msg.msg[3] = las->all_device_types[la_idx]; msg->msg[3] = las->all_device_types[la_idx];
/* Write RC Profiles first, then Device Features */ /* Write RC Profiles first, then Device Features */
for (idx = 0; idx < ARRAY_SIZE(las->features[0]); idx++) { for (idx = 0; idx < ARRAY_SIZE(las->features[0]); idx++) {
msg.msg[msg.len++] = features[idx]; msg->msg[msg->len++] = features[idx];
if ((features[idx] & CEC_OP_FEAT_EXT) == 0) { if ((features[idx] & CEC_OP_FEAT_EXT) == 0) {
if (op_is_dev_features) if (op_is_dev_features)
break; break;
op_is_dev_features = true; op_is_dev_features = true;
} }
} }
return cec_transmit_msg(adap, &msg, false);
} }
/* Transmit the Report Physical Address message */ /* Transmit the Report Physical Address message */
...@@ -1779,7 +1782,8 @@ static int cec_receive_notify(struct cec_adapter *adap, struct cec_msg *msg, ...@@ -1779,7 +1782,8 @@ static int cec_receive_notify(struct cec_adapter *adap, struct cec_msg *msg,
case CEC_MSG_GIVE_FEATURES: case CEC_MSG_GIVE_FEATURES:
if (adap->log_addrs.cec_version < CEC_OP_CEC_VERSION_2_0) if (adap->log_addrs.cec_version < CEC_OP_CEC_VERSION_2_0)
return cec_feature_abort(adap, msg); return cec_feature_abort(adap, msg);
return cec_report_features(adap, la_idx); cec_fill_msg_report_features(adap, &tx_cec_msg, la_idx);
return cec_transmit_msg(adap, &tx_cec_msg, false);
default: default:
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment