aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrey Smirnov <andrew.smirnov@gmail.com>2017-11-09 11:05:53 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-11-28 09:32:32 -0500
commit525ba62c96abec9130b8edb877d1128864cee01c (patch)
tree701b7a810383978fca73b8840ba1e16c753049b8
parent98869f9f9e7dfca97de3505bcdfa1115abe9b893 (diff)
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@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> Acked-by: Rob Herring <robh@kernel.org> 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> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--Documentation/driver-model/devres.txt3
-rw-r--r--drivers/tty/serdev/core.c27
-rw-r--r--include/linux/serdev.h1
3 files changed, 31 insertions, 0 deletions
diff --git a/Documentation/driver-model/devres.txt b/Documentation/driver-model/devres.txt
index c180045eb43b..7c1bb3d0c222 100644
--- a/Documentation/driver-model/devres.txt
+++ b/Documentation/driver-model/devres.txt
@@ -384,6 +384,9 @@ RESET
384 devm_reset_control_get() 384 devm_reset_control_get()
385 devm_reset_controller_register() 385 devm_reset_controller_register()
386 386
387SERDEV
388 devm_serdev_device_open()
389
387SLAVE DMA ENGINE 390SLAVE DMA ENGINE
388 devm_acpi_dma_controller_register() 391 devm_acpi_dma_controller_register()
389 392
diff --git a/drivers/tty/serdev/core.c b/drivers/tty/serdev/core.c
index 34050b439c1f..28133dbd2808 100644
--- a/drivers/tty/serdev/core.c
+++ b/drivers/tty/serdev/core.c
@@ -132,6 +132,33 @@ void serdev_device_close(struct serdev_device *serdev)
132} 132}
133EXPORT_SYMBOL_GPL(serdev_device_close); 133EXPORT_SYMBOL_GPL(serdev_device_close);
134 134
135static void devm_serdev_device_release(struct device *dev, void *dr)
136{
137 serdev_device_close(*(struct serdev_device **)dr);
138}
139
140int devm_serdev_device_open(struct device *dev, struct serdev_device *serdev)
141{
142 struct serdev_device **dr;
143 int ret;
144
145 dr = devres_alloc(devm_serdev_device_release, sizeof(*dr), GFP_KERNEL);
146 if (!dr)
147 return -ENOMEM;
148
149 ret = serdev_device_open(serdev);
150 if (ret) {
151 devres_free(dr);
152 return ret;
153 }
154
155 *dr = serdev;
156 devres_add(dev, dr);
157
158 return 0;
159}
160EXPORT_SYMBOL_GPL(devm_serdev_device_open);
161
135void serdev_device_write_wakeup(struct serdev_device *serdev) 162void serdev_device_write_wakeup(struct serdev_device *serdev)
136{ 163{
137 complete(&serdev->write_comp); 164 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,
193 193
194int serdev_device_open(struct serdev_device *); 194int serdev_device_open(struct serdev_device *);
195void serdev_device_close(struct serdev_device *); 195void serdev_device_close(struct serdev_device *);
196int devm_serdev_device_open(struct device *, struct serdev_device *);
196unsigned int serdev_device_set_baudrate(struct serdev_device *, unsigned int); 197unsigned int serdev_device_set_baudrate(struct serdev_device *, unsigned int);
197void serdev_device_set_flow_control(struct serdev_device *, bool); 198void serdev_device_set_flow_control(struct serdev_device *, bool);
198int serdev_device_write_buf(struct serdev_device *, const unsigned char *, size_t); 199int serdev_device_write_buf(struct serdev_device *, const unsigned char *, size_t);