lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Thu, 9 Nov 2017 08:05:53 -0800 From: Andrey Smirnov <andrew.smirnov@...il.com> To: linux-kernel@...r.kernel.org Cc: Andrey Smirnov <andrew.smirnov@...il.com>, linux-serial@...r.kernel.org, Rob Herring <robh@...nel.org>, cphealy@...il.com, Guenter Roeck <linux@...ck-us.net>, Lucas Stach <l.stach@...gutronix.de>, Nikita Yushchenko <nikita.yoush@...entembedded.com>, Lee Jones <lee.jones@...aro.org>, Greg Kroah-Hartman <gregkh@...uxfoundation.org>, Pavel Machek <pavel@....cz>, Andy Shevchenko <andy.shevchenko@...il.com>, Johan Hovold <johan@...nel.org>, Sebastian Reichel <sebastian.reichel@...labora.co.uk> Subject: [PATCH v12 2/5] serdev: Introduce devm_serdev_device_open() 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@...r.kernel.org Cc: linux-serial@...r.kernel.org Cc: Rob Herring <robh@...nel.org> Cc: cphealy@...il.com Cc: Guenter Roeck <linux@...ck-us.net> Cc: Lucas Stach <l.stach@...gutronix.de> Cc: Nikita Yushchenko <nikita.yoush@...entembedded.com> Cc: Lee Jones <lee.jones@...aro.org> Cc: Greg Kroah-Hartman <gregkh@...uxfoundation.org> Cc: Pavel Machek <pavel@....cz> Cc: Andy Shevchenko <andy.shevchenko@...il.com> Cc: Johan Hovold <johan@...nel.org> Cc: Sebastian Reichel <sebastian.reichel@...labora.co.uk> Acked-by: Rob Herring <robh@...nel.org> Reviewed-by: Sebastian Reichel <sebastian.reichel@...labora.co.uk> Reviewed-by: Guenter Roeck <linux@...ck-us.net> Signed-off-by: Andrey Smirnov <andrew.smirnov@...il.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..5074b6a7d533 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 0; +} +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
Powered by blists - more mailing lists