Re: [PATCH] Minor change to platform_device_register_simple prototype

Dmitry Torokhov
2005-12-07T22:18:43Z

On 12/7/05, Russell King <rmk+lkml@arm.linux.org.uk> wrote:
> On Wed, Dec 07, 2005 at 01:23:11PM -0500, Dmitry Torokhov wrote:
> > On 12/7/05, Russell King <rmk+lkml@arm.linux.org.uk> wrote:
> > > On Wed, Dec 07, 2005 at 12:59:09PM -0500, Dmitry Torokhov > > I have started moving drivers from the "_simple" interface and I found
> > > > that I'm missing platform_device_del that would complement
> > > > platform_device_add. Would you object to having such a function, like
> > > > we do for other sysfs objects? With it one can write somthing like
> > > > this:
> > >
> > > Greg and myself discussed that, and we decided that it was adding
> > > unnecessary complexity to the interface. Maybe Greg's view has
> > > changed?
> > >
> >
> > How do you write error handling path without the _del function if
> > platform_device_add is not the last call? you can't call
> > platform_device_unregister() and then platform_device_put(). And I
> > don't like to take extra references in error path or assign the
> > pointer to NULL in teh middle of unwinding...
>
> The example code in the commit comments contains a complete example of
> registering a platform device, and cleaning up should something go
> wrong with that process.
>

The problem with what you proposing is that one will have to code 2
cleanup code paths - one when platform_device_add fails (in this case
you just call platform_device_put) and another one when
platfrom_device_add succeeds but something else fails. In the second
case you have to use platfrom_device_unregister to release resources
but can't use platform_device_put because the device will most likely
be released by plaform_device_unregister. I prefer having single
cleanup code path, like most other drivers have.

> Unregistering is just a matter of calling platform_device_unregister().
> An unregister call is a del + put in exactly the same way as it is
> throughout the rest of the driver model.
>

Yes, and it works just fine everywhere except in initialization code
when you need to jump in the middle of _del + _put sequence.

--
Dmitry