Commit 9719afae authored by David Härdeman's avatar David Härdeman Committed by Mauro Carvalho Chehab

[media] rc-core: don't treat dev->rc_map.rc_type as a bitmap

store_protocols() treats dev->rc_map.rc_type as a bitmap which is wrong for
two reasons. First of all, it is pretty bogus to change the protocol type of
the keymap just because the hardware has been asked to decode a different
protocol.
Second, dev->rc_map.rc_type is an enum (i.e. a single protocol) as pointed
out by James Hogan <james.hogan@imgtec.com>.
Fix both issues by introducing a separate enabled_protocols member to
struct rc_dev.
Signed-off-by: default avatarDavid Härdeman <david@hardeman.nu>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent efa914d7
...@@ -423,6 +423,7 @@ static int ir_probe(struct i2c_client *client, const struct i2c_device_id *id) ...@@ -423,6 +423,7 @@ static int ir_probe(struct i2c_client *client, const struct i2c_device_id *id)
*/ */
rc->map_name = ir->ir_codes; rc->map_name = ir->ir_codes;
rc->allowed_protos = rc_type; rc->allowed_protos = rc_type;
rc->enabled_protocols = rc_type;
if (!rc->driver_name) if (!rc->driver_name)
rc->driver_name = MODULE_NAME; rc->driver_name = MODULE_NAME;
......
...@@ -47,7 +47,7 @@ static int ir_jvc_decode(struct rc_dev *dev, struct ir_raw_event ev) ...@@ -47,7 +47,7 @@ static int ir_jvc_decode(struct rc_dev *dev, struct ir_raw_event ev)
{ {
struct jvc_dec *data = &dev->raw->jvc; struct jvc_dec *data = &dev->raw->jvc;
if (!(dev->raw->enabled_protocols & RC_BIT_JVC)) if (!(dev->enabled_protocols & RC_BIT_JVC))
return 0; return 0;
if (!is_timing_event(ev)) { if (!is_timing_event(ev)) {
......
...@@ -35,7 +35,7 @@ static int ir_lirc_decode(struct rc_dev *dev, struct ir_raw_event ev) ...@@ -35,7 +35,7 @@ static int ir_lirc_decode(struct rc_dev *dev, struct ir_raw_event ev)
struct lirc_codec *lirc = &dev->raw->lirc; struct lirc_codec *lirc = &dev->raw->lirc;
int sample; int sample;
if (!(dev->raw->enabled_protocols & RC_BIT_LIRC)) if (!(dev->enabled_protocols & RC_BIT_LIRC))
return 0; return 0;
if (!dev->raw->lirc.drv || !dev->raw->lirc.drv->rbuf) if (!dev->raw->lirc.drv || !dev->raw->lirc.drv->rbuf)
......
...@@ -216,7 +216,7 @@ static int ir_mce_kbd_decode(struct rc_dev *dev, struct ir_raw_event ev) ...@@ -216,7 +216,7 @@ static int ir_mce_kbd_decode(struct rc_dev *dev, struct ir_raw_event ev)
u32 scancode; u32 scancode;
unsigned long delay; unsigned long delay;
if (!(dev->raw->enabled_protocols & RC_BIT_MCE_KBD)) if (!(dev->enabled_protocols & RC_BIT_MCE_KBD))
return 0; return 0;
if (!is_timing_event(ev)) { if (!is_timing_event(ev)) {
......
...@@ -52,7 +52,7 @@ static int ir_nec_decode(struct rc_dev *dev, struct ir_raw_event ev) ...@@ -52,7 +52,7 @@ static int ir_nec_decode(struct rc_dev *dev, struct ir_raw_event ev)
u8 address, not_address, command, not_command; u8 address, not_address, command, not_command;
bool send_32bits = false; bool send_32bits = false;
if (!(dev->raw->enabled_protocols & RC_BIT_NEC)) if (!(dev->enabled_protocols & RC_BIT_NEC))
return 0; return 0;
if (!is_timing_event(ev)) { if (!is_timing_event(ev)) {
......
...@@ -256,7 +256,7 @@ int ir_raw_event_register(struct rc_dev *dev) ...@@ -256,7 +256,7 @@ int ir_raw_event_register(struct rc_dev *dev)
return -ENOMEM; return -ENOMEM;
dev->raw->dev = dev; dev->raw->dev = dev;
dev->raw->enabled_protocols = ~0; dev->enabled_protocols = ~0;
rc = kfifo_alloc(&dev->raw->kfifo, rc = kfifo_alloc(&dev->raw->kfifo,
sizeof(struct ir_raw_event) * MAX_IR_EVENT_SIZE, sizeof(struct ir_raw_event) * MAX_IR_EVENT_SIZE,
GFP_KERNEL); GFP_KERNEL);
......
...@@ -52,7 +52,7 @@ static int ir_rc5_decode(struct rc_dev *dev, struct ir_raw_event ev) ...@@ -52,7 +52,7 @@ static int ir_rc5_decode(struct rc_dev *dev, struct ir_raw_event ev)
u8 toggle; u8 toggle;
u32 scancode; u32 scancode;
if (!(dev->raw->enabled_protocols & (RC_BIT_RC5 | RC_BIT_RC5X))) if (!(dev->enabled_protocols & (RC_BIT_RC5 | RC_BIT_RC5X)))
return 0; return 0;
if (!is_timing_event(ev)) { if (!is_timing_event(ev)) {
...@@ -128,7 +128,7 @@ static int ir_rc5_decode(struct rc_dev *dev, struct ir_raw_event ev) ...@@ -128,7 +128,7 @@ static int ir_rc5_decode(struct rc_dev *dev, struct ir_raw_event ev)
if (data->wanted_bits == RC5X_NBITS) { if (data->wanted_bits == RC5X_NBITS) {
/* RC5X */ /* RC5X */
u8 xdata, command, system; u8 xdata, command, system;
if (!(dev->raw->enabled_protocols & RC_BIT_RC5X)) { if (!(dev->enabled_protocols & RC_BIT_RC5X)) {
data->state = STATE_INACTIVE; data->state = STATE_INACTIVE;
return 0; return 0;
} }
...@@ -145,7 +145,7 @@ static int ir_rc5_decode(struct rc_dev *dev, struct ir_raw_event ev) ...@@ -145,7 +145,7 @@ static int ir_rc5_decode(struct rc_dev *dev, struct ir_raw_event ev)
} else { } else {
/* RC5 */ /* RC5 */
u8 command, system; u8 command, system;
if (!(dev->raw->enabled_protocols & RC_BIT_RC5)) { if (!(dev->enabled_protocols & RC_BIT_RC5)) {
data->state = STATE_INACTIVE; data->state = STATE_INACTIVE;
return 0; return 0;
} }
......
...@@ -48,7 +48,7 @@ static int ir_rc5_sz_decode(struct rc_dev *dev, struct ir_raw_event ev) ...@@ -48,7 +48,7 @@ static int ir_rc5_sz_decode(struct rc_dev *dev, struct ir_raw_event ev)
u8 toggle, command, system; u8 toggle, command, system;
u32 scancode; u32 scancode;
if (!(dev->raw->enabled_protocols & RC_BIT_RC5_SZ)) if (!(dev->enabled_protocols & RC_BIT_RC5_SZ))
return 0; return 0;
if (!is_timing_event(ev)) { if (!is_timing_event(ev)) {
......
...@@ -89,7 +89,7 @@ static int ir_rc6_decode(struct rc_dev *dev, struct ir_raw_event ev) ...@@ -89,7 +89,7 @@ static int ir_rc6_decode(struct rc_dev *dev, struct ir_raw_event ev)
u32 scancode; u32 scancode;
u8 toggle; u8 toggle;
if (!(dev->raw->enabled_protocols & if (!(dev->enabled_protocols &
(RC_BIT_RC6_0 | RC_BIT_RC6_6A_20 | RC_BIT_RC6_6A_24 | (RC_BIT_RC6_0 | RC_BIT_RC6_6A_20 | RC_BIT_RC6_6A_24 |
RC_BIT_RC6_6A_32 | RC_BIT_RC6_MCE))) RC_BIT_RC6_6A_32 | RC_BIT_RC6_MCE)))
return 0; return 0;
......
...@@ -58,7 +58,7 @@ static int ir_sanyo_decode(struct rc_dev *dev, struct ir_raw_event ev) ...@@ -58,7 +58,7 @@ static int ir_sanyo_decode(struct rc_dev *dev, struct ir_raw_event ev)
u32 scancode; u32 scancode;
u8 address, command, not_command; u8 address, command, not_command;
if (!(dev->raw->enabled_protocols & RC_BIT_SANYO)) if (!(dev->enabled_protocols & RC_BIT_SANYO))
return 0; return 0;
if (!is_timing_event(ev)) { if (!is_timing_event(ev)) {
......
...@@ -45,7 +45,7 @@ static int ir_sony_decode(struct rc_dev *dev, struct ir_raw_event ev) ...@@ -45,7 +45,7 @@ static int ir_sony_decode(struct rc_dev *dev, struct ir_raw_event ev)
u32 scancode; u32 scancode;
u8 device, subdevice, function; u8 device, subdevice, function;
if (!(dev->raw->enabled_protocols & if (!(dev->enabled_protocols &
(RC_BIT_SONY12 | RC_BIT_SONY15 | RC_BIT_SONY20))) (RC_BIT_SONY12 | RC_BIT_SONY15 | RC_BIT_SONY20)))
return 0; return 0;
...@@ -124,7 +124,7 @@ static int ir_sony_decode(struct rc_dev *dev, struct ir_raw_event ev) ...@@ -124,7 +124,7 @@ static int ir_sony_decode(struct rc_dev *dev, struct ir_raw_event ev)
switch (data->count) { switch (data->count) {
case 12: case 12:
if (!(dev->raw->enabled_protocols & RC_BIT_SONY12)) { if (!(dev->enabled_protocols & RC_BIT_SONY12)) {
data->state = STATE_INACTIVE; data->state = STATE_INACTIVE;
return 0; return 0;
} }
...@@ -133,7 +133,7 @@ static int ir_sony_decode(struct rc_dev *dev, struct ir_raw_event ev) ...@@ -133,7 +133,7 @@ static int ir_sony_decode(struct rc_dev *dev, struct ir_raw_event ev)
function = bitrev8((data->bits >> 4) & 0xFE); function = bitrev8((data->bits >> 4) & 0xFE);
break; break;
case 15: case 15:
if (!(dev->raw->enabled_protocols & RC_BIT_SONY15)) { if (!(dev->enabled_protocols & RC_BIT_SONY15)) {
data->state = STATE_INACTIVE; data->state = STATE_INACTIVE;
return 0; return 0;
} }
...@@ -142,7 +142,7 @@ static int ir_sony_decode(struct rc_dev *dev, struct ir_raw_event ev) ...@@ -142,7 +142,7 @@ static int ir_sony_decode(struct rc_dev *dev, struct ir_raw_event ev)
function = bitrev8((data->bits >> 7) & 0xFE); function = bitrev8((data->bits >> 7) & 0xFE);
break; break;
case 20: case 20:
if (!(dev->raw->enabled_protocols & RC_BIT_SONY20)) { if (!(dev->enabled_protocols & RC_BIT_SONY20)) {
data->state = STATE_INACTIVE; data->state = STATE_INACTIVE;
return 0; return 0;
} }
......
...@@ -39,7 +39,6 @@ struct ir_raw_event_ctrl { ...@@ -39,7 +39,6 @@ struct ir_raw_event_ctrl {
ktime_t last_event; /* when last event occurred */ ktime_t last_event; /* when last event occurred */
enum raw_event_type last_type; /* last event type */ enum raw_event_type last_type; /* last event type */
struct rc_dev *dev; /* pointer to the parent rc_dev */ struct rc_dev *dev; /* pointer to the parent rc_dev */
u64 enabled_protocols; /* enabled raw protocol decoders */
/* raw decoder state follows */ /* raw decoder state follows */
struct ir_raw_event prev_ev; struct ir_raw_event prev_ev;
......
...@@ -783,13 +783,12 @@ static ssize_t show_protocols(struct device *device, ...@@ -783,13 +783,12 @@ static ssize_t show_protocols(struct device *device,
mutex_lock(&dev->lock); mutex_lock(&dev->lock);
if (dev->driver_type == RC_DRIVER_SCANCODE) { enabled = dev->enabled_protocols;
enabled = dev->rc_map.rc_type; if (dev->driver_type == RC_DRIVER_SCANCODE)
allowed = dev->allowed_protos; allowed = dev->allowed_protos;
} else if (dev->raw) { else if (dev->raw)
enabled = dev->raw->enabled_protocols;
allowed = ir_raw_get_allowed_protocols(); allowed = ir_raw_get_allowed_protocols();
} else { else {
mutex_unlock(&dev->lock); mutex_unlock(&dev->lock);
return -ENODEV; return -ENODEV;
} }
...@@ -847,7 +846,6 @@ static ssize_t store_protocols(struct device *device, ...@@ -847,7 +846,6 @@ static ssize_t store_protocols(struct device *device,
u64 type; u64 type;
u64 mask; u64 mask;
int rc, i, count = 0; int rc, i, count = 0;
unsigned long flags;
ssize_t ret; ssize_t ret;
/* Device is being removed */ /* Device is being removed */
...@@ -856,15 +854,12 @@ static ssize_t store_protocols(struct device *device, ...@@ -856,15 +854,12 @@ static ssize_t store_protocols(struct device *device,
mutex_lock(&dev->lock); mutex_lock(&dev->lock);
if (dev->driver_type == RC_DRIVER_SCANCODE) if (dev->driver_type != RC_DRIVER_SCANCODE && !dev->raw) {
type = dev->rc_map.rc_type;
else if (dev->raw)
type = dev->raw->enabled_protocols;
else {
IR_dprintk(1, "Protocol switching not supported\n"); IR_dprintk(1, "Protocol switching not supported\n");
ret = -EINVAL; ret = -EINVAL;
goto out; goto out;
} }
type = dev->enabled_protocols;
while ((tmp = strsep((char **) &data, " \n")) != NULL) { while ((tmp = strsep((char **) &data, " \n")) != NULL) {
if (!*tmp) if (!*tmp)
...@@ -922,14 +917,7 @@ static ssize_t store_protocols(struct device *device, ...@@ -922,14 +917,7 @@ static ssize_t store_protocols(struct device *device,
} }
} }
if (dev->driver_type == RC_DRIVER_SCANCODE) { dev->enabled_protocols = type;
spin_lock_irqsave(&dev->rc_map.lock, flags);
dev->rc_map.rc_type = type;
spin_unlock_irqrestore(&dev->rc_map.lock, flags);
} else {
dev->raw->enabled_protocols = type;
}
IR_dprintk(1, "Current protocol(s): 0x%llx\n", IR_dprintk(1, "Current protocol(s): 0x%llx\n",
(long long)type); (long long)type);
...@@ -1068,9 +1056,8 @@ int rc_register_device(struct rc_dev *dev) ...@@ -1068,9 +1056,8 @@ int rc_register_device(struct rc_dev *dev)
/* /*
* Take the lock here, as the device sysfs node will appear * Take the lock here, as the device sysfs node will appear
* when device_add() is called, which may trigger an ir-keytable udev * when device_add() is called, which may trigger an ir-keytable udev
* rule, which will in turn call show_protocols and access either * rule, which will in turn call show_protocols and access
* dev->rc_map.rc_type or dev->raw->enabled_protocols before it has * dev->enabled_protocols before it has been initialized.
* been initialized.
*/ */
mutex_lock(&dev->lock); mutex_lock(&dev->lock);
...@@ -1132,6 +1119,7 @@ int rc_register_device(struct rc_dev *dev) ...@@ -1132,6 +1119,7 @@ int rc_register_device(struct rc_dev *dev)
rc = dev->change_protocol(dev, &rc_type); rc = dev->change_protocol(dev, &rc_type);
if (rc < 0) if (rc < 0)
goto out_raw; goto out_raw;
dev->enabled_protocols = rc_type;
} }
mutex_unlock(&dev->lock); mutex_unlock(&dev->lock);
......
...@@ -51,6 +51,7 @@ enum rc_driver_type { ...@@ -51,6 +51,7 @@ enum rc_driver_type {
* @driver_type: specifies if protocol decoding is done in hardware or software * @driver_type: specifies if protocol decoding is done in hardware or software
* @idle: used to keep track of RX state * @idle: used to keep track of RX state
* @allowed_protos: bitmask with the supported RC_BIT_* protocols * @allowed_protos: bitmask with the supported RC_BIT_* protocols
* @enabled_protocols: bitmask with the enabled RC_BIT_* protocols
* @scanmask: some hardware decoders are not capable of providing the full * @scanmask: some hardware decoders are not capable of providing the full
* scancode to the application. As this is a hardware limit, we can't do * scancode to the application. As this is a hardware limit, we can't do
* anything with it. Yet, as the same keycode table can be used with other * anything with it. Yet, as the same keycode table can be used with other
...@@ -99,6 +100,7 @@ struct rc_dev { ...@@ -99,6 +100,7 @@ struct rc_dev {
enum rc_driver_type driver_type; enum rc_driver_type driver_type;
bool idle; bool idle;
u64 allowed_protos; u64 allowed_protos;
u64 enabled_protocols;
u32 scanmask; u32 scanmask;
void *priv; void *priv;
spinlock_t keylock; spinlock_t keylock;
......
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