Skip to content

Commit

Permalink
media: cec: core: disable adapter in cec_devnode_unregister
Browse files Browse the repository at this point in the history
Explicitly disable the CEC adapter in cec_devnode_unregister()

Usually this does not really do anything important, but for drivers
that use the CEC pin framework this is needed to properly stop the
hrtimer. Without this a crash would happen when such a driver is
unloaded with rmmod.

Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
  • Loading branch information
Hans Verkuil authored and Mauro Carvalho Chehab committed May 26, 2023
1 parent ed17f89 commit fe4526d
Show file tree
Hide file tree
Showing 3 changed files with 7 additions and 1 deletion.
5 changes: 4 additions & 1 deletion drivers/media/cec/core/cec-adap.c
Original file line number Diff line number Diff line change
Expand Up @@ -1585,7 +1585,7 @@ static void cec_claim_log_addrs(struct cec_adapter *adap, bool block)
*
* This function is called with adap->lock held.
*/
static int cec_adap_enable(struct cec_adapter *adap)
int cec_adap_enable(struct cec_adapter *adap)
{
bool enable;
int ret = 0;
Expand All @@ -1595,6 +1595,9 @@ static int cec_adap_enable(struct cec_adapter *adap)
if (adap->needs_hpd)
enable = enable && adap->phys_addr != CEC_PHYS_ADDR_INVALID;

if (adap->devnode.unregistered)
enable = false;

if (enable == adap->is_enabled)
return 0;

Expand Down
2 changes: 2 additions & 0 deletions drivers/media/cec/core/cec-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,8 @@ static void cec_devnode_unregister(struct cec_adapter *adap)
mutex_lock(&adap->lock);
__cec_s_phys_addr(adap, CEC_PHYS_ADDR_INVALID, false);
__cec_s_log_addrs(adap, NULL, false);
// Disable the adapter (since adap->devnode.unregistered is true)
cec_adap_enable(adap);
mutex_unlock(&adap->lock);

cdev_device_del(&devnode->cdev, &devnode->dev);
Expand Down
1 change: 1 addition & 0 deletions drivers/media/cec/core/cec-priv.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ int cec_monitor_pin_cnt_inc(struct cec_adapter *adap);
void cec_monitor_pin_cnt_dec(struct cec_adapter *adap);
int cec_adap_status(struct seq_file *file, void *priv);
int cec_thread_func(void *_adap);
int cec_adap_enable(struct cec_adapter *adap);
void __cec_s_phys_addr(struct cec_adapter *adap, u16 phys_addr, bool block);
int __cec_s_log_addrs(struct cec_adapter *adap,
struct cec_log_addrs *log_addrs, bool block);
Expand Down

0 comments on commit fe4526d

Please sign in to comment.