summaryrefslogtreecommitdiffstats
path: root/drivers/media/cec/core
diff options
context:
space:
mode:
authorHans Verkuil <hverkuil-cisco@xs4all.nl>2022-05-06 14:46:46 +0200
committerMauro Carvalho Chehab <mchehab@kernel.org>2022-05-13 11:29:16 +0200
commite3891b36364e85914fcb7a535656695a67e876a7 (patch)
treeb6c72a488bce4d46968e51f9c1cbb3fbe6e494c8 /drivers/media/cec/core
parent59267fc34f4900dcd2ec3295f6be04b79aee2186 (diff)
downloadlinux-e3891b36364e85914fcb7a535656695a67e876a7.tar.gz
linux-e3891b36364e85914fcb7a535656695a67e876a7.tar.bz2
linux-e3891b36364e85914fcb7a535656695a67e876a7.zip
media: cec-adap.c: reconfigure if the PA changes during configuration
If the physical address changes (i.e. becomes invalid, then valid again) while the adapter is still claiming free logical addresses, then trigger a reconfiguration since any claimed LAs may now be stale. Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
Diffstat (limited to 'drivers/media/cec/core')
-rw-r--r--drivers/media/cec/core/cec-adap.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/drivers/media/cec/core/cec-adap.c b/drivers/media/cec/core/cec-adap.c
index 6c235503dd92..38c43a37133d 100644
--- a/drivers/media/cec/core/cec-adap.c
+++ b/drivers/media/cec/core/cec-adap.c
@@ -1278,6 +1278,10 @@ static int cec_config_log_addr(struct cec_adapter *adap,
if (adap->phys_addr == CEC_PHYS_ADDR_INVALID)
return -EINTR;
+ /* Also bail out if the PA changed while configuring. */
+ if (adap->must_reconfigure)
+ return -EINTR;
+
if (err)
return err;
@@ -1405,6 +1409,7 @@ static int cec_config_thread_func(void *arg)
if (las->log_addr_type[0] == CEC_LOG_ADDR_TYPE_UNREGISTERED)
goto configured;
+reconfigure:
for (i = 0; i < las->num_log_addrs; i++) {
unsigned int type = las->log_addr_type[i];
const u8 *la_list;
@@ -1427,6 +1432,13 @@ static int cec_config_thread_func(void *arg)
last_la = la_list[0];
err = cec_config_log_addr(adap, i, last_la);
+
+ if (adap->must_reconfigure) {
+ adap->must_reconfigure = false;
+ las->log_addr_mask = 0;
+ goto reconfigure;
+ }
+
if (err > 0) /* Reused last LA */
continue;
@@ -1472,6 +1484,7 @@ configured:
las->log_addr[i] = CEC_LOG_ADDR_INVALID;
adap->is_configured = true;
adap->is_configuring = false;
+ adap->must_reconfigure = false;
cec_post_state_event(adap);
/*
@@ -1526,6 +1539,7 @@ unconfigure:
las->log_addr[i] = CEC_LOG_ADDR_INVALID;
cec_adap_unconfigure(adap);
adap->is_configuring = false;
+ adap->must_reconfigure = false;
adap->kthread_config = NULL;
complete(&adap->config_completion);
mutex_unlock(&adap->lock);
@@ -1649,7 +1663,11 @@ void __cec_s_phys_addr(struct cec_adapter *adap, u16 phys_addr, bool block)
adap->phys_addr = phys_addr;
cec_post_state_event(adap);
- if (adap->log_addrs.num_log_addrs)
+ if (!adap->log_addrs.num_log_addrs)
+ return;
+ if (adap->is_configuring)
+ adap->must_reconfigure = true;
+ else
cec_claim_log_addrs(adap, block);
}