On Mon, 27 Dec 2021 10:45:26 +0100 Uwe Kleine-König <u.kleine-koenig@xxxxxxxxxxxxxx> wrote: > Usage of counter_register() yields issues in device lifetime tracking. All > drivers were converted to the new API, so the old one can go away. > > Signed-off-by: Uwe Kleine-König <u.kleine-koenig@xxxxxxxxxxxxxx> LGTM and nice patch set in general. Just those few things in the patch introducing the new interfaces that need tidying up as far as I am concerned. Thanks, Reviewed-by: Jonathan Cameron <Jonathan.Cameron@xxxxxxxxxx> > --- > drivers/counter/counter-core.c | 97 ++-------------------------------- > include/linux/counter.h | 12 ----- > 2 files changed, 4 insertions(+), 105 deletions(-) > > diff --git a/drivers/counter/counter-core.c b/drivers/counter/counter-core.c > index 8261567b6272..3f7dc5718423 100644 > --- a/drivers/counter/counter-core.c > +++ b/drivers/counter/counter-core.c > @@ -38,8 +38,7 @@ static void counter_device_release(struct device *dev) > counter_chrdev_remove(counter); > ida_free(&counter_ida, dev->id); > > - if (!counter->legacy_device) > - kfree(container_of(counter, struct counter_device_allochelper, counter)); > + kfree(container_of(counter, struct counter_device_allochelper, counter)); > } > > static struct device_type counter_device_type = { > @@ -62,76 +61,13 @@ static dev_t counter_devt; > */ > void *counter_priv(const struct counter_device *const counter) > { > - if (counter->legacy_device) { > - return counter->priv; > - } else { > - struct counter_device_allochelper *ch = > - container_of(counter, struct counter_device_allochelper, counter); > + struct counter_device_allochelper *ch = > + container_of(counter, struct counter_device_allochelper, counter); > > - return &ch->privdata; > - } > + return &ch->privdata; > } > EXPORT_SYMBOL_GPL(counter_priv); > > -/** > - * counter_register - register Counter to the system > - * @counter: pointer to Counter to register > - * > - * This function registers a Counter to the system. A sysfs "counter" directory > - * will be created and populated with sysfs attributes correlating with the > - * Counter Signals, Synapses, and Counts respectively. > - * > - * RETURNS: > - * 0 on success, negative error number on failure. > - */ > -int counter_register(struct counter_device *const counter) > -{ > - struct device *const dev = &counter->dev; > - int id; > - int err; > - > - counter->legacy_device = true; > - > - /* Acquire unique ID */ > - id = ida_alloc(&counter_ida, GFP_KERNEL); > - if (id < 0) > - return id; > - > - mutex_init(&counter->ops_exist_lock); > - > - /* Configure device structure for Counter */ > - dev->id = id; > - dev->type = &counter_device_type; > - dev->bus = &counter_bus_type; > - dev->devt = MKDEV(MAJOR(counter_devt), id); > - if (counter->parent) { > - dev->parent = counter->parent; > - dev->of_node = counter->parent->of_node; > - } > - device_initialize(dev); > - > - err = counter_sysfs_add(counter); > - if (err < 0) > - goto err_free_id; > - > - err = counter_chrdev_add(counter); > - if (err < 0) > - goto err_free_id; > - > - err = cdev_device_add(&counter->chrdev, dev); > - if (err < 0) > - goto err_remove_chrdev; > - > - return 0; > - > -err_remove_chrdev: > - counter_chrdev_remove(counter); > -err_free_id: > - put_device(dev); > - return err; > -} > -EXPORT_SYMBOL_GPL(counter_register); > - > /** > * counter_alloc - allocate a counter_device > * @sizeof_priv: size of the driver private data > @@ -255,31 +191,6 @@ static void devm_counter_release(void *counter) > counter_unregister(counter); > } > > -/** > - * devm_counter_register - Resource-managed counter_register > - * @dev: device to allocate counter_device for > - * @counter: pointer to Counter to register > - * > - * Managed counter_register. The Counter registered with this function is > - * automatically unregistered on driver detach. This function calls > - * counter_register internally. Refer to that function for more information. > - * > - * RETURNS: > - * 0 on success, negative error number on failure. > - */ > -int devm_counter_register(struct device *dev, > - struct counter_device *const counter) > -{ > - int err; > - > - err = counter_register(counter); > - if (err < 0) > - return err; > - > - return devm_add_action_or_reset(dev, devm_counter_release, counter); > -} > -EXPORT_SYMBOL_GPL(devm_counter_register); > - > static void devm_counter_put(void *counter) > { > counter_put(counter); > diff --git a/include/linux/counter.h b/include/linux/counter.h > index f1350a43cd48..9afa0f1e9cea 100644 > --- a/include/linux/counter.h > +++ b/include/linux/counter.h > @@ -314,8 +314,6 @@ struct counter_device { > struct counter_comp *ext; > size_t num_ext; > > - void *priv; > - > struct device dev; > struct cdev chrdev; > struct list_head events_list; > @@ -327,25 +325,15 @@ struct counter_device { > spinlock_t events_in_lock; > struct mutex events_out_lock; > struct mutex ops_exist_lock; > - > - /* > - * This can go away once all drivers are converted to > - * counter_alloc()/counter_add(). > - */ > - bool legacy_device; > }; > > void *counter_priv(const struct counter_device *const counter); > > -int counter_register(struct counter_device *const counter); > - > struct counter_device *counter_alloc(size_t sizeof_priv); > void counter_put(struct counter_device *const counter); > int counter_add(struct counter_device *const counter); > > void counter_unregister(struct counter_device *const counter); > -int devm_counter_register(struct device *dev, > - struct counter_device *const counter); > struct counter_device *devm_counter_alloc(struct device *dev, > size_t sizeof_priv); > int devm_counter_add(struct device *dev,