mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 03:15:31 +09:00
UPSTREAM: media: rc: only register protocol for rc device if enabled
The raw_register function exists to create input devices associated with
that IR protocol.
If the mce_kbd module is loaded, then every rc device will have mce_kbd
input devices, even if the protocol is not enabled. Change this to call
the register function to when the protocol is enabled.
Signed-off-by: Sean Young <sean@mess.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
(cherry picked from commit c00cb587a2)
Signed-off-by: Ziyuan Xu <xzy.xu@rock-chips.com>
This commit is contained in:
@@ -245,6 +245,19 @@ static int change_protocol(struct rc_dev *dev, u64 *rc_proto)
|
||||
struct ir_raw_handler *handler;
|
||||
u32 timeout = 0;
|
||||
|
||||
mutex_lock(&ir_raw_handler_lock);
|
||||
list_for_each_entry(handler, &ir_raw_handler_list, list) {
|
||||
if (!(dev->enabled_protocols & handler->protocols) &&
|
||||
(*rc_proto & handler->protocols) && handler->raw_register)
|
||||
handler->raw_register(dev);
|
||||
|
||||
if ((dev->enabled_protocols & handler->protocols) &&
|
||||
!(*rc_proto & handler->protocols) &&
|
||||
handler->raw_unregister)
|
||||
handler->raw_unregister(dev);
|
||||
}
|
||||
mutex_unlock(&ir_raw_handler_lock);
|
||||
|
||||
if (!dev->max_timeout)
|
||||
return 0;
|
||||
|
||||
@@ -616,7 +629,6 @@ int ir_raw_event_prepare(struct rc_dev *dev)
|
||||
|
||||
int ir_raw_event_register(struct rc_dev *dev)
|
||||
{
|
||||
struct ir_raw_handler *handler;
|
||||
struct task_struct *thread;
|
||||
|
||||
thread = kthread_run(ir_raw_event_thread, dev->raw, "rc%u", dev->minor);
|
||||
@@ -627,9 +639,6 @@ int ir_raw_event_register(struct rc_dev *dev)
|
||||
|
||||
mutex_lock(&ir_raw_handler_lock);
|
||||
list_add_tail(&dev->raw->list, &ir_raw_client_list);
|
||||
list_for_each_entry(handler, &ir_raw_handler_list, list)
|
||||
if (handler->raw_register)
|
||||
handler->raw_register(dev);
|
||||
mutex_unlock(&ir_raw_handler_lock);
|
||||
|
||||
return 0;
|
||||
@@ -657,7 +666,8 @@ void ir_raw_event_unregister(struct rc_dev *dev)
|
||||
mutex_lock(&ir_raw_handler_lock);
|
||||
list_del(&dev->raw->list);
|
||||
list_for_each_entry(handler, &ir_raw_handler_list, list)
|
||||
if (handler->raw_unregister)
|
||||
if (handler->raw_unregister &&
|
||||
(handler->protocols & dev->enabled_protocols))
|
||||
handler->raw_unregister(dev);
|
||||
mutex_unlock(&ir_raw_handler_lock);
|
||||
|
||||
@@ -670,13 +680,8 @@ void ir_raw_event_unregister(struct rc_dev *dev)
|
||||
|
||||
int ir_raw_handler_register(struct ir_raw_handler *ir_raw_handler)
|
||||
{
|
||||
struct ir_raw_event_ctrl *raw;
|
||||
|
||||
mutex_lock(&ir_raw_handler_lock);
|
||||
list_add_tail(&ir_raw_handler->list, &ir_raw_handler_list);
|
||||
if (ir_raw_handler->raw_register)
|
||||
list_for_each_entry(raw, &ir_raw_client_list, list)
|
||||
ir_raw_handler->raw_register(raw->dev);
|
||||
atomic64_or(ir_raw_handler->protocols, &available_protocols);
|
||||
mutex_unlock(&ir_raw_handler_lock);
|
||||
|
||||
@@ -692,9 +697,10 @@ void ir_raw_handler_unregister(struct ir_raw_handler *ir_raw_handler)
|
||||
mutex_lock(&ir_raw_handler_lock);
|
||||
list_del(&ir_raw_handler->list);
|
||||
list_for_each_entry(raw, &ir_raw_client_list, list) {
|
||||
ir_raw_disable_protocols(raw->dev, protocols);
|
||||
if (ir_raw_handler->raw_unregister)
|
||||
if (ir_raw_handler->raw_unregister &&
|
||||
(raw->dev->enabled_protocols & protocols))
|
||||
ir_raw_handler->raw_unregister(raw->dev);
|
||||
ir_raw_disable_protocols(raw->dev, protocols);
|
||||
}
|
||||
atomic64_andnot(protocols, &available_protocols);
|
||||
mutex_unlock(&ir_raw_handler_lock);
|
||||
|
||||
Reference in New Issue
Block a user