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