[media] rc-core: reuse device numbers

Before changeset d8b4b5822f51e, the remote controller device numbers
were released when the device were unregistered. That helped to maintain
some sanity, as, when USB devices are replugged, the remote controller
would get the same number.

Restore the same behaviour.

Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>

+17 -3
+17 -3
drivers/media/rc/rc-main.c
··· 22 #include <linux/module.h> 23 #include "rc-core-priv.h" 24 25 /* Sizes are in bytes, 256 bytes allows for 32 entries on x64 */ 26 #define IR_TAB_MIN_SIZE 256 27 #define IR_TAB_MAX_SIZE 8192 ··· 1069 int rc_register_device(struct rc_dev *dev) 1070 { 1071 static bool raw_init = false; /* raw decoders loaded? */ 1072 - static atomic_t devno = ATOMIC_INIT(0); 1073 struct rc_map *rc_map; 1074 const char *path; 1075 - int rc; 1076 1077 if (!dev || !dev->map_name) 1078 return -EINVAL; ··· 1099 */ 1100 mutex_lock(&dev->lock); 1101 1102 - dev->devno = (unsigned long)(atomic_inc_return(&devno) - 1); 1103 dev_set_name(&dev->dev, "rc%ld", dev->devno); 1104 dev_set_drvdata(&dev->dev, dev); 1105 rc = device_add(&dev->dev); ··· 1197 device_del(&dev->dev); 1198 out_unlock: 1199 mutex_unlock(&dev->lock); 1200 return rc; 1201 } 1202 EXPORT_SYMBOL_GPL(rc_register_device); ··· 1208 return; 1209 1210 del_timer_sync(&dev->timer_keyup); 1211 1212 if (dev->driver_type == RC_DRIVER_IR_RAW) 1213 ir_raw_event_unregister(dev);
··· 22 #include <linux/module.h> 23 #include "rc-core-priv.h" 24 25 + /* Bitmap to store allocated device numbers from 0 to IRRCV_NUM_DEVICES - 1 */ 26 + #define IRRCV_NUM_DEVICES 256 27 + DECLARE_BITMAP(ir_core_dev_number, IRRCV_NUM_DEVICES); 28 + 29 /* Sizes are in bytes, 256 bytes allows for 32 entries on x64 */ 30 #define IR_TAB_MIN_SIZE 256 31 #define IR_TAB_MAX_SIZE 8192 ··· 1065 int rc_register_device(struct rc_dev *dev) 1066 { 1067 static bool raw_init = false; /* raw decoders loaded? */ 1068 struct rc_map *rc_map; 1069 const char *path; 1070 + int rc, devno; 1071 1072 if (!dev || !dev->map_name) 1073 return -EINVAL; ··· 1096 */ 1097 mutex_lock(&dev->lock); 1098 1099 + do { 1100 + devno = find_first_zero_bit(ir_core_dev_number, 1101 + IRRCV_NUM_DEVICES); 1102 + /* No free device slots */ 1103 + if (devno >= IRRCV_NUM_DEVICES) 1104 + return -ENOMEM; 1105 + } while (test_and_set_bit(devno, ir_core_dev_number)); 1106 + 1107 + dev->devno = devno; 1108 dev_set_name(&dev->dev, "rc%ld", dev->devno); 1109 dev_set_drvdata(&dev->dev, dev); 1110 rc = device_add(&dev->dev); ··· 1186 device_del(&dev->dev); 1187 out_unlock: 1188 mutex_unlock(&dev->lock); 1189 + clear_bit(dev->devno, ir_core_dev_number); 1190 return rc; 1191 } 1192 EXPORT_SYMBOL_GPL(rc_register_device); ··· 1196 return; 1197 1198 del_timer_sync(&dev->timer_keyup); 1199 + 1200 + clear_bit(dev->devno, ir_core_dev_number); 1201 1202 if (dev->driver_type == RC_DRIVER_IR_RAW) 1203 ir_raw_event_unregister(dev);