Em Thu, 02 Apr 2015 12:18:55 +0200
David Härdeman <da...@hardeman.nu> escreveu:

> This patch changes rc-core to use the kernel facilities that are already
> available for handling unique numbers instead of rolling its own bitmap
> stuff.
> 
> Stefan, this should apply cleanly to the media git tree...could you test it?

Patch looks good to me but...

you forgot to add your SOB on it.

> ---
>  drivers/media/rc/rc-ir-raw.c |    2 +-
>  drivers/media/rc/rc-main.c   |   40 ++++++++++++++++++++--------------------
>  include/media/rc-core.h      |    4 ++--
>  3 files changed, 23 insertions(+), 23 deletions(-)
> 
> diff --git a/drivers/media/rc/rc-ir-raw.c b/drivers/media/rc/rc-ir-raw.c
> index b732ac6..ad26052 100644
> --- a/drivers/media/rc/rc-ir-raw.c
> +++ b/drivers/media/rc/rc-ir-raw.c
> @@ -271,7 +271,7 @@ int ir_raw_event_register(struct rc_dev *dev)
>  
>       spin_lock_init(&dev->raw->lock);
>       dev->raw->thread = kthread_run(ir_raw_event_thread, dev->raw,
> -                                    "rc%ld", dev->devno);
> +                                    "rc%u", dev->minor);
>  
>       if (IS_ERR(dev->raw->thread)) {
>               rc = PTR_ERR(dev->raw->thread);
> diff --git a/drivers/media/rc/rc-main.c b/drivers/media/rc/rc-main.c
> index f8c5e47..d068c4e 100644
> --- a/drivers/media/rc/rc-main.c
> +++ b/drivers/media/rc/rc-main.c
> @@ -18,17 +18,15 @@
>  #include <linux/input.h>
>  #include <linux/leds.h>
>  #include <linux/slab.h>
> +#include <linux/idr.h>
>  #include <linux/device.h>
>  #include <linux/module.h>
>  #include "rc-core-priv.h"
>  
> -/* Bitmap to store allocated device numbers from 0 to IRRCV_NUM_DEVICES - 1 
> */
> -#define IRRCV_NUM_DEVICES      256
> -static DECLARE_BITMAP(ir_core_dev_number, IRRCV_NUM_DEVICES);
> -
>  /* Sizes are in bytes, 256 bytes allows for 32 entries on x64 */
>  #define IR_TAB_MIN_SIZE      256
>  #define IR_TAB_MAX_SIZE      8192
> +#define RC_DEV_MAX   256
>  
>  /* FIXME: IR_KEYPRESS_TIMEOUT should be protocol specific */
>  #define IR_KEYPRESS_TIMEOUT 250
> @@ -38,6 +36,9 @@ static LIST_HEAD(rc_map_list);
>  static DEFINE_SPINLOCK(rc_map_lock);
>  static struct led_trigger *led_feedback;
>  
> +/* Used to keep track of rc devices */
> +static DEFINE_IDA(rc_ida);
> +
>  static struct rc_map_list *seek_rc_map(const char *name)
>  {
>       struct rc_map_list *map = NULL;
> @@ -1312,7 +1313,9 @@ int rc_register_device(struct rc_dev *dev)
>       static bool raw_init = false; /* raw decoders loaded? */
>       struct rc_map *rc_map;
>       const char *path;
> -     int rc, devno, attr = 0;
> +     int attr = 0;
> +     int minor;
> +     int rc;
>  
>       if (!dev || !dev->map_name)
>               return -EINVAL;
> @@ -1332,13 +1335,13 @@ int rc_register_device(struct rc_dev *dev)
>       if (dev->close)
>               dev->input_dev->close = ir_close;
>  
> -     do {
> -             devno = find_first_zero_bit(ir_core_dev_number,
> -                                         IRRCV_NUM_DEVICES);
> -             /* No free device slots */
> -             if (devno >= IRRCV_NUM_DEVICES)
> -                     return -ENOMEM;
> -     } while (test_and_set_bit(devno, ir_core_dev_number));
> +     minor = ida_simple_get(&rc_ida, 0, RC_DEV_MAX, GFP_KERNEL);
> +     if (minor < 0)
> +             return minor;
> +
> +     dev->minor = minor;
> +     dev_set_name(&dev->dev, "rc%u", dev->minor);
> +     dev_set_drvdata(&dev->dev, dev);
>  
>       dev->dev.groups = dev->sysfs_groups;
>       dev->sysfs_groups[attr++] = &rc_dev_protocol_attr_grp;
> @@ -1358,9 +1361,6 @@ int rc_register_device(struct rc_dev *dev)
>        */
>       mutex_lock(&dev->lock);
>  
> -     dev->devno = devno;
> -     dev_set_name(&dev->dev, "rc%ld", dev->devno);
> -     dev_set_drvdata(&dev->dev, dev);
>       rc = device_add(&dev->dev);
>       if (rc)
>               goto out_unlock;
> @@ -1433,8 +1433,8 @@ int rc_register_device(struct rc_dev *dev)
>  
>       mutex_unlock(&dev->lock);
>  
> -     IR_dprintk(1, "Registered rc%ld (driver: %s, remote: %s, mode %s)\n",
> -                dev->devno,
> +     IR_dprintk(1, "Registered rc%u (driver: %s, remote: %s, mode %s)\n",
> +                dev->minor,
>                  dev->driver_name ? dev->driver_name : "unknown",
>                  rc_map->name ? rc_map->name : "unknown",
>                  dev->driver_type == RC_DRIVER_IR_RAW ? "raw" : "cooked");
> @@ -1453,7 +1453,7 @@ out_dev:
>       device_del(&dev->dev);
>  out_unlock:
>       mutex_unlock(&dev->lock);
> -     clear_bit(dev->devno, ir_core_dev_number);
> +     ida_simple_remove(&rc_ida, minor);
>       return rc;
>  }
>  EXPORT_SYMBOL_GPL(rc_register_device);
> @@ -1465,8 +1465,6 @@ void rc_unregister_device(struct rc_dev *dev)
>  
>       del_timer_sync(&dev->timer_keyup);
>  
> -     clear_bit(dev->devno, ir_core_dev_number);
> -
>       if (dev->driver_type == RC_DRIVER_IR_RAW)
>               ir_raw_event_unregister(dev);
>  
> @@ -1479,6 +1477,8 @@ void rc_unregister_device(struct rc_dev *dev)
>  
>       device_del(&dev->dev);
>  
> +     ida_simple_remove(&rc_ida, dev->minor);
> +
>       rc_free_device(dev);
>  }
>  
> diff --git a/include/media/rc-core.h b/include/media/rc-core.h
> index 2c7fbca..6b4400c 100644
> --- a/include/media/rc-core.h
> +++ b/include/media/rc-core.h
> @@ -69,7 +69,7 @@ enum rc_filter_type {
>   * @rc_map: current scan/key table
>   * @lock: used to ensure we've filled in all protocol details before
>   *   anyone can call show_protocols or store_protocols
> - * @devno: unique remote control device number
> + * @minor: unique minor remote control device number
>   * @raw: additional data for raw pulse/space devices
>   * @input_dev: the input child device used to communicate events to userspace
>   * @driver_type: specifies if protocol decoding is done in hardware or 
> software
> @@ -129,7 +129,7 @@ struct rc_dev {
>       const char                      *map_name;
>       struct rc_map                   rc_map;
>       struct mutex                    lock;
> -     unsigned long                   devno;
> +     unsigned int                    minor;
>       struct ir_raw_event_ctrl        *raw;
>       struct input_dev                *input_dev;
>       enum rc_driver_type             driver_type;
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-media" in
> the body of a message to majord...@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to