* [PATCH v10 1/5] serdev: Make .remove in struct serdev_device_driver optional [not found] <20171031163656.24552-1-andrew.smirnov@gmail.com> @ 2017-10-31 16:36 ` Andrey Smirnov 2017-11-01 23:48 ` Rob Herring 2017-11-04 11:24 ` Greg Kroah-Hartman 2017-10-31 16:36 ` [PATCH v10 2/5] serdev: Introduce devm_serdev_device_open() Andrey Smirnov 1 sibling, 2 replies; 8+ messages in thread From: Andrey Smirnov @ 2017-10-31 16:36 UTC (permalink / raw) To: linux-kernel Cc: Andrey Smirnov, linux-serial, Rob Herring, cphealy, Guenter Roeck, Lucas Stach, Nikita Yushchenko, Lee Jones, Greg Kroah-Hartman, Pavel Machek, Andy Shevchenko, Johan Hovold, Sebastian Reichel Using devres infrastructure it is possible to write a serdev driver that doesn't have any code that needs to be called as a part of .remove. Add code to make .remove optional. Cc: linux-kernel@vger.kernel.org Cc: linux-serial@vger.kernel.org Cc: Rob Herring <robh@kernel.org> Cc: cphealy@gmail.com Cc: Guenter Roeck <linux@roeck-us.net> Cc: Lucas Stach <l.stach@pengutronix.de> Cc: Nikita Yushchenko <nikita.yoush@cogentembedded.com> Cc: Lee Jones <lee.jones@linaro.org> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Pavel Machek <pavel@ucw.cz> Cc: Andy Shevchenko <andy.shevchenko@gmail.com> Cc: Johan Hovold <johan@kernel.org> Cc: Sebastian Reichel <sebastian.reichel@collabora.co.uk> Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk> Reviewed-by: Guenter Roeck <linux@roeck-us.net> Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com> --- drivers/tty/serdev/core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/tty/serdev/core.c b/drivers/tty/serdev/core.c index c68fb3a8ea1c..f500f6a2ca88 100644 --- a/drivers/tty/serdev/core.c +++ b/drivers/tty/serdev/core.c @@ -252,8 +252,8 @@ static int serdev_drv_probe(struct device *dev) static int serdev_drv_remove(struct device *dev) { const struct serdev_device_driver *sdrv = to_serdev_device_driver(dev->driver); - - sdrv->remove(to_serdev_device(dev)); + if (sdrv->remove) + sdrv->remove(to_serdev_device(dev)); return 0; } -- 2.13.6 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v10 1/5] serdev: Make .remove in struct serdev_device_driver optional 2017-10-31 16:36 ` [PATCH v10 1/5] serdev: Make .remove in struct serdev_device_driver optional Andrey Smirnov @ 2017-11-01 23:48 ` Rob Herring 2017-11-04 11:24 ` Greg Kroah-Hartman 1 sibling, 0 replies; 8+ messages in thread From: Rob Herring @ 2017-11-01 23:48 UTC (permalink / raw) To: Andrey Smirnov Cc: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, Chris Healy, Guenter Roeck, Lucas Stach, Nikita Yushchenko, Lee Jones, Greg Kroah-Hartman, Pavel Machek, Andy Shevchenko, Johan Hovold, Sebastian Reichel On Tue, Oct 31, 2017 at 11:36 AM, Andrey Smirnov <andrew.smirnov@gmail.com> wrote: > Using devres infrastructure it is possible to write a serdev driver > that doesn't have any code that needs to be called as a part of > .remove. Add code to make .remove optional. > > Cc: linux-kernel@vger.kernel.org > Cc: linux-serial@vger.kernel.org > Cc: Rob Herring <robh@kernel.org> > Cc: cphealy@gmail.com > Cc: Guenter Roeck <linux@roeck-us.net> > Cc: Lucas Stach <l.stach@pengutronix.de> > Cc: Nikita Yushchenko <nikita.yoush@cogentembedded.com> > Cc: Lee Jones <lee.jones@linaro.org> > Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> > Cc: Pavel Machek <pavel@ucw.cz> > Cc: Andy Shevchenko <andy.shevchenko@gmail.com> > Cc: Johan Hovold <johan@kernel.org> > Cc: Sebastian Reichel <sebastian.reichel@collabora.co.uk> > Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk> > Reviewed-by: Guenter Roeck <linux@roeck-us.net> > Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com> > --- > drivers/tty/serdev/core.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) Acked-by: Rob Herring <robh@kernel.org> ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v10 1/5] serdev: Make .remove in struct serdev_device_driver optional 2017-10-31 16:36 ` [PATCH v10 1/5] serdev: Make .remove in struct serdev_device_driver optional Andrey Smirnov 2017-11-01 23:48 ` Rob Herring @ 2017-11-04 11:24 ` Greg Kroah-Hartman 2017-11-04 17:05 ` Sebastian Reichel 1 sibling, 1 reply; 8+ messages in thread From: Greg Kroah-Hartman @ 2017-11-04 11:24 UTC (permalink / raw) To: Andrey Smirnov Cc: linux-kernel, linux-serial, Rob Herring, cphealy, Guenter Roeck, Lucas Stach, Nikita Yushchenko, Lee Jones, Pavel Machek, Andy Shevchenko, Johan Hovold, Sebastian Reichel On Tue, Oct 31, 2017 at 09:36:52AM -0700, Andrey Smirnov wrote: > Using devres infrastructure it is possible to write a serdev driver > that doesn't have any code that needs to be called as a part of > .remove. Add code to make .remove optional. What about manual unbind from userspace through sysfs? You need to have a remove function. All drivers need that, to not have it is pretty lazy :) thanks, greg k-h ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v10 1/5] serdev: Make .remove in struct serdev_device_driver optional 2017-11-04 11:24 ` Greg Kroah-Hartman @ 2017-11-04 17:05 ` Sebastian Reichel 0 siblings, 0 replies; 8+ messages in thread From: Sebastian Reichel @ 2017-11-04 17:05 UTC (permalink / raw) To: Greg Kroah-Hartman Cc: Andrey Smirnov, linux-kernel, linux-serial, Rob Herring, cphealy, Guenter Roeck, Lucas Stach, Nikita Yushchenko, Lee Jones, Pavel Machek, Andy Shevchenko, Johan Hovold [-- Attachment #1: Type: text/plain, Size: 906 bytes --] Hi Greg, On Sat, Nov 04, 2017 at 12:24:31PM +0100, Greg Kroah-Hartman wrote: > On Tue, Oct 31, 2017 at 09:36:52AM -0700, Andrey Smirnov wrote: > > Using devres infrastructure it is possible to write a serdev driver > > that doesn't have any code that needs to be called as a part of > > .remove. Add code to make .remove optional. > > What about manual unbind from userspace through sysfs? You need to have > a remove function. All drivers need that, to not have it is pretty lazy :) Resources,that have been requested via devres are free'd by the devres framework after the driver specific remove function. This also works for manual unbind. If *all* driver resources are allocated using devres, you will end up with an empty remove function. In that case it makes sense to remove it completly. This is what quite a few (mainline) i2c and spi drivers actually do. -- Sebastian [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 833 bytes --] ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v10 2/5] serdev: Introduce devm_serdev_device_open() [not found] <20171031163656.24552-1-andrew.smirnov@gmail.com> 2017-10-31 16:36 ` [PATCH v10 1/5] serdev: Make .remove in struct serdev_device_driver optional Andrey Smirnov @ 2017-10-31 16:36 ` Andrey Smirnov 2017-11-01 23:48 ` Rob Herring 2017-11-05 15:38 ` Johan Hovold 1 sibling, 2 replies; 8+ messages in thread From: Andrey Smirnov @ 2017-10-31 16:36 UTC (permalink / raw) To: linux-kernel Cc: Andrey Smirnov, linux-serial, Rob Herring, cphealy, Guenter Roeck, Lucas Stach, Nikita Yushchenko, Lee Jones, Greg Kroah-Hartman, Pavel Machek, Andy Shevchenko, Johan Hovold, Sebastian Reichel Add code implementing managed version of serdev_device_open() for serdev device drivers that "open" the device during driver's lifecycle only once (e.g. opened in .probe() and closed in .remove()). Cc: linux-kernel@vger.kernel.org Cc: linux-serial@vger.kernel.org Cc: Rob Herring <robh@kernel.org> Cc: cphealy@gmail.com Cc: Guenter Roeck <linux@roeck-us.net> Cc: Lucas Stach <l.stach@pengutronix.de> Cc: Nikita Yushchenko <nikita.yoush@cogentembedded.com> Cc: Lee Jones <lee.jones@linaro.org> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Pavel Machek <pavel@ucw.cz> Cc: Andy Shevchenko <andy.shevchenko@gmail.com> Cc: Johan Hovold <johan@kernel.org> Cc: Sebastian Reichel <sebastian.reichel@collabora.co.uk> Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk> Reviewed-by: Guenter Roeck <linux@roeck-us.net> Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com> --- Documentation/driver-model/devres.txt | 3 +++ drivers/tty/serdev/core.c | 27 +++++++++++++++++++++++++++ include/linux/serdev.h | 1 + 3 files changed, 31 insertions(+) diff --git a/Documentation/driver-model/devres.txt b/Documentation/driver-model/devres.txt index 69f08c0f23a8..e9c6b5cfeec1 100644 --- a/Documentation/driver-model/devres.txt +++ b/Documentation/driver-model/devres.txt @@ -383,6 +383,9 @@ RESET devm_reset_control_get() devm_reset_controller_register() +SERDEV + devm_serdev_device_open() + SLAVE DMA ENGINE devm_acpi_dma_controller_register() diff --git a/drivers/tty/serdev/core.c b/drivers/tty/serdev/core.c index f500f6a2ca88..b3a785665c6f 100644 --- a/drivers/tty/serdev/core.c +++ b/drivers/tty/serdev/core.c @@ -116,6 +116,33 @@ void serdev_device_close(struct serdev_device *serdev) } EXPORT_SYMBOL_GPL(serdev_device_close); +static void devm_serdev_device_release(struct device *dev, void *dr) +{ + serdev_device_close(*(struct serdev_device **)dr); +} + +int devm_serdev_device_open(struct device *dev, struct serdev_device *serdev) +{ + struct serdev_device **dr; + int ret; + + dr = devres_alloc(devm_serdev_device_release, sizeof(*dr), GFP_KERNEL); + if (!dr) + return -ENOMEM; + + ret = serdev_device_open(serdev); + if (ret) { + devres_free(dr); + return ret; + } + + *dr = serdev; + devres_add(dev, dr); + + return ret; +} +EXPORT_SYMBOL_GPL(devm_serdev_device_open); + void serdev_device_write_wakeup(struct serdev_device *serdev) { complete(&serdev->write_comp); diff --git a/include/linux/serdev.h b/include/linux/serdev.h index e69402d4a8ae..9929063bd45d 100644 --- a/include/linux/serdev.h +++ b/include/linux/serdev.h @@ -193,6 +193,7 @@ static inline int serdev_controller_receive_buf(struct serdev_controller *ctrl, int serdev_device_open(struct serdev_device *); void serdev_device_close(struct serdev_device *); +int devm_serdev_device_open(struct device *, struct serdev_device *); unsigned int serdev_device_set_baudrate(struct serdev_device *, unsigned int); void serdev_device_set_flow_control(struct serdev_device *, bool); int serdev_device_write_buf(struct serdev_device *, const unsigned char *, size_t); -- 2.13.6 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH v10 2/5] serdev: Introduce devm_serdev_device_open() 2017-10-31 16:36 ` [PATCH v10 2/5] serdev: Introduce devm_serdev_device_open() Andrey Smirnov @ 2017-11-01 23:48 ` Rob Herring 2017-11-05 15:38 ` Johan Hovold 1 sibling, 0 replies; 8+ messages in thread From: Rob Herring @ 2017-11-01 23:48 UTC (permalink / raw) To: Andrey Smirnov Cc: linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, Chris Healy, Guenter Roeck, Lucas Stach, Nikita Yushchenko, Lee Jones, Greg Kroah-Hartman, Pavel Machek, Andy Shevchenko, Johan Hovold, Sebastian Reichel On Tue, Oct 31, 2017 at 11:36 AM, Andrey Smirnov <andrew.smirnov@gmail.com> wrote: > Add code implementing managed version of serdev_device_open() for > serdev device drivers that "open" the device during driver's lifecycle > only once (e.g. opened in .probe() and closed in .remove()). > > Cc: linux-kernel@vger.kernel.org > Cc: linux-serial@vger.kernel.org > Cc: Rob Herring <robh@kernel.org> > Cc: cphealy@gmail.com > Cc: Guenter Roeck <linux@roeck-us.net> > Cc: Lucas Stach <l.stach@pengutronix.de> > Cc: Nikita Yushchenko <nikita.yoush@cogentembedded.com> > Cc: Lee Jones <lee.jones@linaro.org> > Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> > Cc: Pavel Machek <pavel@ucw.cz> > Cc: Andy Shevchenko <andy.shevchenko@gmail.com> > Cc: Johan Hovold <johan@kernel.org> > Cc: Sebastian Reichel <sebastian.reichel@collabora.co.uk> > Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk> > Reviewed-by: Guenter Roeck <linux@roeck-us.net> > Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com> > --- > Documentation/driver-model/devres.txt | 3 +++ > drivers/tty/serdev/core.c | 27 +++++++++++++++++++++++++++ > include/linux/serdev.h | 1 + > 3 files changed, 31 insertions(+) Acked-by: Rob Herring <robh@kernel.org> ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v10 2/5] serdev: Introduce devm_serdev_device_open() 2017-10-31 16:36 ` [PATCH v10 2/5] serdev: Introduce devm_serdev_device_open() Andrey Smirnov 2017-11-01 23:48 ` Rob Herring @ 2017-11-05 15:38 ` Johan Hovold 2017-11-05 22:19 ` Andrey Smirnov 1 sibling, 1 reply; 8+ messages in thread From: Johan Hovold @ 2017-11-05 15:38 UTC (permalink / raw) To: Andrey Smirnov Cc: linux-kernel, linux-serial, Rob Herring, cphealy, Guenter Roeck, Lucas Stach, Nikita Yushchenko, Lee Jones, Greg Kroah-Hartman, Pavel Machek, Andy Shevchenko, Johan Hovold, Sebastian Reichel On Tue, Oct 31, 2017 at 09:36:53AM -0700, Andrey Smirnov wrote: > Add code implementing managed version of serdev_device_open() for > serdev device drivers that "open" the device during driver's lifecycle > only once (e.g. opened in .probe() and closed in .remove()). > > Cc: linux-kernel@vger.kernel.org > Cc: linux-serial@vger.kernel.org > Cc: Rob Herring <robh@kernel.org> > Cc: cphealy@gmail.com > Cc: Guenter Roeck <linux@roeck-us.net> > Cc: Lucas Stach <l.stach@pengutronix.de> > Cc: Nikita Yushchenko <nikita.yoush@cogentembedded.com> > Cc: Lee Jones <lee.jones@linaro.org> > Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> > Cc: Pavel Machek <pavel@ucw.cz> > Cc: Andy Shevchenko <andy.shevchenko@gmail.com> > Cc: Johan Hovold <johan@kernel.org> > Cc: Sebastian Reichel <sebastian.reichel@collabora.co.uk> > Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk> > Reviewed-by: Guenter Roeck <linux@roeck-us.net> > Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com> > --- > Documentation/driver-model/devres.txt | 3 +++ > drivers/tty/serdev/core.c | 27 +++++++++++++++++++++++++++ > include/linux/serdev.h | 1 + > 3 files changed, 31 insertions(+) > +int devm_serdev_device_open(struct device *dev, struct serdev_device *serdev) > +{ > + struct serdev_device **dr; > + int ret; > + > + dr = devres_alloc(devm_serdev_device_release, sizeof(*dr), GFP_KERNEL); > + if (!dr) > + return -ENOMEM; > + > + ret = serdev_device_open(serdev); > + if (ret) { > + devres_free(dr); > + return ret; > + } > + > + *dr = serdev; > + devres_add(dev, dr); > + > + return ret; This would be more readable as return 0. > +} > +EXPORT_SYMBOL_GPL(devm_serdev_device_open); Johan ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH v10 2/5] serdev: Introduce devm_serdev_device_open() 2017-11-05 15:38 ` Johan Hovold @ 2017-11-05 22:19 ` Andrey Smirnov 0 siblings, 0 replies; 8+ messages in thread From: Andrey Smirnov @ 2017-11-05 22:19 UTC (permalink / raw) To: Johan Hovold Cc: linux-kernel, linux-serial, Rob Herring, Chris Healy, Guenter Roeck, Lucas Stach, Nikita Yushchenko, Lee Jones, Greg Kroah-Hartman, Pavel Machek, Andy Shevchenko, Sebastian Reichel On Sun, Nov 5, 2017 at 7:38 AM, Johan Hovold <johan@kernel.org> wrote: > On Tue, Oct 31, 2017 at 09:36:53AM -0700, Andrey Smirnov wrote: >> Add code implementing managed version of serdev_device_open() for >> serdev device drivers that "open" the device during driver's lifecycle >> only once (e.g. opened in .probe() and closed in .remove()). >> >> Cc: linux-kernel@vger.kernel.org >> Cc: linux-serial@vger.kernel.org >> Cc: Rob Herring <robh@kernel.org> >> Cc: cphealy@gmail.com >> Cc: Guenter Roeck <linux@roeck-us.net> >> Cc: Lucas Stach <l.stach@pengutronix.de> >> Cc: Nikita Yushchenko <nikita.yoush@cogentembedded.com> >> Cc: Lee Jones <lee.jones@linaro.org> >> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> >> Cc: Pavel Machek <pavel@ucw.cz> >> Cc: Andy Shevchenko <andy.shevchenko@gmail.com> >> Cc: Johan Hovold <johan@kernel.org> >> Cc: Sebastian Reichel <sebastian.reichel@collabora.co.uk> >> Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk> >> Reviewed-by: Guenter Roeck <linux@roeck-us.net> >> Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com> >> --- >> Documentation/driver-model/devres.txt | 3 +++ >> drivers/tty/serdev/core.c | 27 +++++++++++++++++++++++++++ >> include/linux/serdev.h | 1 + >> 3 files changed, 31 insertions(+) > >> +int devm_serdev_device_open(struct device *dev, struct serdev_device *serdev) >> +{ >> + struct serdev_device **dr; >> + int ret; >> + >> + dr = devres_alloc(devm_serdev_device_release, sizeof(*dr), GFP_KERNEL); >> + if (!dr) >> + return -ENOMEM; >> + >> + ret = serdev_device_open(serdev); >> + if (ret) { >> + devres_free(dr); >> + return ret; >> + } >> + >> + *dr = serdev; >> + devres_add(dev, dr); >> + >> + return ret; > > This would be more readable as return 0. Sure, I'll change that in v11. Thanks, Andrey Smrinov ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2017-11-05 22:19 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20171031163656.24552-1-andrew.smirnov@gmail.com>
2017-10-31 16:36 ` [PATCH v10 1/5] serdev: Make .remove in struct serdev_device_driver optional Andrey Smirnov
2017-11-01 23:48 ` Rob Herring
2017-11-04 11:24 ` Greg Kroah-Hartman
2017-11-04 17:05 ` Sebastian Reichel
2017-10-31 16:36 ` [PATCH v10 2/5] serdev: Introduce devm_serdev_device_open() Andrey Smirnov
2017-11-01 23:48 ` Rob Herring
2017-11-05 15:38 ` Johan Hovold
2017-11-05 22:19 ` Andrey Smirnov
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox