diff options
author | Andrey Smirnov <andrew.smirnov@gmail.com> | 2017-11-09 11:05:53 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-11-28 09:32:32 -0500 |
commit | 525ba62c96abec9130b8edb877d1128864cee01c (patch) | |
tree | 701b7a810383978fca73b8840ba1e16c753049b8 | |
parent | 98869f9f9e7dfca97de3505bcdfa1115abe9b893 (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.txt | 3 | ||||
-rw-r--r-- | drivers/tty/serdev/core.c | 27 | ||||
-rw-r--r-- | include/linux/serdev.h | 1 |
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 | ||
387 | SERDEV | ||
388 | devm_serdev_device_open() | ||
389 | |||
387 | SLAVE DMA ENGINE | 390 | SLAVE 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 | } |
133 | EXPORT_SYMBOL_GPL(serdev_device_close); | 133 | EXPORT_SYMBOL_GPL(serdev_device_close); |
134 | 134 | ||
135 | static void devm_serdev_device_release(struct device *dev, void *dr) | ||
136 | { | ||
137 | serdev_device_close(*(struct serdev_device **)dr); | ||
138 | } | ||
139 | |||
140 | int 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 | } | ||
160 | EXPORT_SYMBOL_GPL(devm_serdev_device_open); | ||
161 | |||
135 | void serdev_device_write_wakeup(struct serdev_device *serdev) | 162 | void 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 | ||
194 | int serdev_device_open(struct serdev_device *); | 194 | int serdev_device_open(struct serdev_device *); |
195 | void serdev_device_close(struct serdev_device *); | 195 | void serdev_device_close(struct serdev_device *); |
196 | int devm_serdev_device_open(struct device *, struct serdev_device *); | ||
196 | unsigned int serdev_device_set_baudrate(struct serdev_device *, unsigned int); | 197 | unsigned int serdev_device_set_baudrate(struct serdev_device *, unsigned int); |
197 | void serdev_device_set_flow_control(struct serdev_device *, bool); | 198 | void serdev_device_set_flow_control(struct serdev_device *, bool); |
198 | int serdev_device_write_buf(struct serdev_device *, const unsigned char *, size_t); | 199 | int serdev_device_write_buf(struct serdev_device *, const unsigned char *, size_t); |