[media] rc-core: don't treat dev->rc_map.rc_type as a bitmap
authorDavid Härdeman <david@hardeman.nu>
Wed, 6 Mar 2013 19:52:05 +0000 (16:52 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Sat, 23 Mar 2013 14:25:54 +0000 (11:25 -0300)
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: David Härdeman <david@hardeman.nu>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
14 files changed:
drivers/media/i2c/ir-kbd-i2c.c
drivers/media/rc/ir-jvc-decoder.c
drivers/media/rc/ir-lirc-codec.c
drivers/media/rc/ir-mce_kbd-decoder.c
drivers/media/rc/ir-nec-decoder.c
drivers/media/rc/ir-raw.c
drivers/media/rc/ir-rc5-decoder.c
drivers/media/rc/ir-rc5-sz-decoder.c
drivers/media/rc/ir-rc6-decoder.c
drivers/media/rc/ir-sanyo-decoder.c
drivers/media/rc/ir-sony-decoder.c
drivers/media/rc/rc-core-priv.h
drivers/media/rc/rc-main.c
include/media/rc-core.h

index 08ae067b2b6f19f503e46bf186105dbea61a9194..2586e46f14b5f2f586f49c3f76628e4fccf85951 100644 (file)
@@ -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->allowed_protos = rc_type;
+       rc->enabled_protocols = rc_type;
        if (!rc->driver_name)
                rc->driver_name = MODULE_NAME;
 
index 69edffb9fe9af29056e74c843b5149d629071cb1..3948138ca870cbe21b6638dd5e89fb5574cf5d72 100644 (file)
@@ -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;
 
-       if (!(dev->raw->enabled_protocols & RC_BIT_JVC))
+       if (!(dev->enabled_protocols & RC_BIT_JVC))
                return 0;
 
        if (!is_timing_event(ev)) {
index 9945e5e7f61a6d58d94105c6f5a6a3c9555d93fb..ff4d93d1907fb372c1d93306a780e593d7576e36 100644 (file)
@@ -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;
        int sample;
 
-       if (!(dev->raw->enabled_protocols & RC_BIT_LIRC))
+       if (!(dev->enabled_protocols & RC_BIT_LIRC))
                return 0;
 
        if (!dev->raw->lirc.drv || !dev->raw->lirc.drv->rbuf)
index 33fafa4cf7cb472643a5fa682b78d326e28aea6a..9f3c9b59f30ccf27bf96b00b9d9142057f5148cf 100644 (file)
@@ -216,7 +216,7 @@ static int ir_mce_kbd_decode(struct rc_dev *dev, struct ir_raw_event ev)
        u32 scancode;
        unsigned long delay;
 
-       if (!(dev->raw->enabled_protocols & RC_BIT_MCE_KBD))
+       if (!(dev->enabled_protocols & RC_BIT_MCE_KBD))
                return 0;
 
        if (!is_timing_event(ev)) {
index a47ee36349694aeef38c0e64a2b1a6d27440db25..9a9009411439491417016faf7e2169c172a5ab9d 100644 (file)
@@ -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;
        bool send_32bits = false;
 
-       if (!(dev->raw->enabled_protocols & RC_BIT_NEC))
+       if (!(dev->enabled_protocols & RC_BIT_NEC))
                return 0;
 
        if (!is_timing_event(ev)) {
index 17c94be9f24c45c56db3704d7d1edbe16b23a767..5c42750c7b7152fc7cb9b3ea886e45798011bb87 100644 (file)
@@ -256,7 +256,7 @@ int ir_raw_event_register(struct rc_dev *dev)
                return -ENOMEM;
 
        dev->raw->dev = dev;
-       dev->raw->enabled_protocols = ~0;
+       dev->enabled_protocols = ~0;
        rc = kfifo_alloc(&dev->raw->kfifo,
                         sizeof(struct ir_raw_event) * MAX_IR_EVENT_SIZE,
                         GFP_KERNEL);
index 5b4d1ddeac4ec30cffa5c78f97f9049bdca75dcc..4e53a319c5d84931fa377536494e5728fe55fdfa 100644 (file)
@@ -52,7 +52,7 @@ static int ir_rc5_decode(struct rc_dev *dev, struct ir_raw_event ev)
        u8 toggle;
        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;
 
        if (!is_timing_event(ev)) {
@@ -128,7 +128,7 @@ again:
                if (data->wanted_bits == RC5X_NBITS) {
                        /* RC5X */
                        u8 xdata, command, system;
-                       if (!(dev->raw->enabled_protocols & RC_BIT_RC5X)) {
+                       if (!(dev->enabled_protocols & RC_BIT_RC5X)) {
                                data->state = STATE_INACTIVE;
                                return 0;
                        }
@@ -145,7 +145,7 @@ again:
                } else {
                        /* RC5 */
                        u8 command, system;
-                       if (!(dev->raw->enabled_protocols & RC_BIT_RC5)) {
+                       if (!(dev->enabled_protocols & RC_BIT_RC5)) {
                                data->state = STATE_INACTIVE;
                                return 0;
                        }
index fd807a8308d8e4ff917dbf74bb7bbca60a519320..865fe84fd854c1140c7ab0e7fd75028dacc8d933 100644 (file)
@@ -48,7 +48,7 @@ static int ir_rc5_sz_decode(struct rc_dev *dev, struct ir_raw_event ev)
        u8 toggle, command, system;
        u32 scancode;
 
-       if (!(dev->raw->enabled_protocols & RC_BIT_RC5_SZ))
+       if (!(dev->enabled_protocols & RC_BIT_RC5_SZ))
                return 0;
 
        if (!is_timing_event(ev)) {
index e19072ffb36ca4b873e11b70507b559fc9035a35..7cba7d33a3fac886b7ba8379275499f9c285f24b 100644 (file)
@@ -89,7 +89,7 @@ static int ir_rc6_decode(struct rc_dev *dev, struct ir_raw_event ev)
        u32 scancode;
        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_6A_32 | RC_BIT_RC6_MCE)))
                return 0;
index 7e69a3b653700105c6e4a6c7c775655f83d57e86..0a06205b56771517dc4b53551a03fbe003c29e34 100644 (file)
@@ -58,7 +58,7 @@ static int ir_sanyo_decode(struct rc_dev *dev, struct ir_raw_event ev)
        u32 scancode;
        u8 address, command, not_command;
 
-       if (!(dev->raw->enabled_protocols & RC_BIT_SANYO))
+       if (!(dev->enabled_protocols & RC_BIT_SANYO))
                return 0;
 
        if (!is_timing_event(ev)) {
index fb914342cf4db3f2f0f56035ed0fbb78de0872aa..29ab9c2db060c6831536579d4cbc50fad33120d5 100644 (file)
@@ -45,7 +45,7 @@ static int ir_sony_decode(struct rc_dev *dev, struct ir_raw_event ev)
        u32 scancode;
        u8 device, subdevice, function;
 
-       if (!(dev->raw->enabled_protocols &
+       if (!(dev->enabled_protocols &
              (RC_BIT_SONY12 | RC_BIT_SONY15 | RC_BIT_SONY20)))
                return 0;
 
@@ -124,7 +124,7 @@ static int ir_sony_decode(struct rc_dev *dev, struct ir_raw_event ev)
 
                switch (data->count) {
                case 12:
-                       if (!(dev->raw->enabled_protocols & RC_BIT_SONY12)) {
+                       if (!(dev->enabled_protocols & RC_BIT_SONY12)) {
                                data->state = STATE_INACTIVE;
                                return 0;
                        }
@@ -133,7 +133,7 @@ static int ir_sony_decode(struct rc_dev *dev, struct ir_raw_event ev)
                        function  = bitrev8((data->bits >>  4) & 0xFE);
                        break;
                case 15:
-                       if (!(dev->raw->enabled_protocols & RC_BIT_SONY15)) {
+                       if (!(dev->enabled_protocols & RC_BIT_SONY15)) {
                                data->state = STATE_INACTIVE;
                                return 0;
                        }
@@ -142,7 +142,7 @@ static int ir_sony_decode(struct rc_dev *dev, struct ir_raw_event ev)
                        function  = bitrev8((data->bits >>  7) & 0xFE);
                        break;
                case 20:
-                       if (!(dev->raw->enabled_protocols & RC_BIT_SONY20)) {
+                       if (!(dev->enabled_protocols & RC_BIT_SONY20)) {
                                data->state = STATE_INACTIVE;
                                return 0;
                        }
index 5d87287ed372ac3338b0593267e4457922f967dd..70a180bb0bd090a3b089b58bc7fdc334f89c2c81 100644 (file)
@@ -39,7 +39,6 @@ struct ir_raw_event_ctrl {
        ktime_t                         last_event;     /* when last event occurred */
        enum raw_event_type             last_type;      /* last event type */
        struct rc_dev                   *dev;           /* pointer to the parent rc_dev */
-       u64                             enabled_protocols; /* enabled raw protocol decoders */
 
        /* raw decoder state follows */
        struct ir_raw_event prev_ev;
index f3047920b8c038a476db144b77a4d0f2111a44ed..1cf382a0b27761683f6afa4d8c07aed3904ed789 100644 (file)
@@ -783,13 +783,12 @@ static ssize_t show_protocols(struct device *device,
 
        mutex_lock(&dev->lock);
 
-       if (dev->driver_type == RC_DRIVER_SCANCODE) {
-               enabled = dev->rc_map.rc_type;
+       enabled = dev->enabled_protocols;
+       if (dev->driver_type == RC_DRIVER_SCANCODE)
                allowed = dev->allowed_protos;
-       } else if (dev->raw) {
-               enabled = dev->raw->enabled_protocols;
+       else if (dev->raw)
                allowed = ir_raw_get_allowed_protocols();
-       else {
+       else {
                mutex_unlock(&dev->lock);
                return -ENODEV;
        }
@@ -847,7 +846,6 @@ static ssize_t store_protocols(struct device *device,
        u64 type;
        u64 mask;
        int rc, i, count = 0;
-       unsigned long flags;
        ssize_t ret;
 
        /* Device is being removed */
@@ -856,15 +854,12 @@ static ssize_t store_protocols(struct device *device,
 
        mutex_lock(&dev->lock);
 
-       if (dev->driver_type == RC_DRIVER_SCANCODE)
-               type = dev->rc_map.rc_type;
-       else if (dev->raw)
-               type = dev->raw->enabled_protocols;
-       else {
+       if (dev->driver_type != RC_DRIVER_SCANCODE && !dev->raw) {
                IR_dprintk(1, "Protocol switching not supported\n");
                ret = -EINVAL;
                goto out;
        }
+       type = dev->enabled_protocols;
 
        while ((tmp = strsep((char **) &data, " \n")) != NULL) {
                if (!*tmp)
@@ -922,14 +917,7 @@ static ssize_t store_protocols(struct device *device,
                }
        }
 
-       if (dev->driver_type == RC_DRIVER_SCANCODE) {
-               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;
-       }
-
+       dev->enabled_protocols = type;
        IR_dprintk(1, "Current protocol(s): 0x%llx\n",
                   (long long)type);
 
@@ -1068,9 +1056,8 @@ int rc_register_device(struct rc_dev *dev)
        /*
         * Take the lock here, as the device sysfs node will appear
         * when device_add() is called, which may trigger an ir-keytable udev
-        * rule, which will in turn call show_protocols and access either
-        * dev->rc_map.rc_type or dev->raw->enabled_protocols before it has
-        * been initialized.
+        * rule, which will in turn call show_protocols and access
+        * dev->enabled_protocols before it has been initialized.
         */
        mutex_lock(&dev->lock);
 
@@ -1132,6 +1119,7 @@ int rc_register_device(struct rc_dev *dev)
                rc = dev->change_protocol(dev, &rc_type);
                if (rc < 0)
                        goto out_raw;
+               dev->enabled_protocols = rc_type;
        }
 
        mutex_unlock(&dev->lock);
index f03445f3c767d662b2b08bb57830cfd1ae8c3892..06a75deff553c4a2fac3396c48b3954dda422432 100644 (file)
@@ -51,6 +51,7 @@ enum rc_driver_type {
  * @driver_type: specifies if protocol decoding is done in hardware or software
  * @idle: used to keep track of RX state
  * @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
  *     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
@@ -99,6 +100,7 @@ struct rc_dev {
        enum rc_driver_type             driver_type;
        bool                            idle;
        u64                             allowed_protos;
+       u64                             enabled_protocols;
        u32                             scanmask;
        void                            *priv;
        spinlock_t                      keylock;