From: Oleksandr Kravchenko <x0199363@ti.com> To: <linux-iio@vger.kernel.org>, <linux-kernel@vger.kernel.org>, <linux-doc@vger.kernel.org> Cc: <grant.likely@linaro.org>, <rob.herring@calxeda.com>, <rob@landley.net>, <jic23@cam.ac.uk>, <pmeerw@pmeerw.net>, <holler@ahsoftware.de>, <srinivas.pandruvada@intel.com>, <devicetree-discuss@lists.ozlabs.org>, <grygorii.strashko@ti.com>, Oleksandr Kravchenko <o.v.kravchenko@globallogic.com> Subject: [PATCH 1/3] iio: core: implement devm_iio_device_alloc/devm_iio_device_free Date: Thu, 18 Jul 2013 13:19:24 +0300 [thread overview] Message-ID: <1374142766-29736-1-git-send-email-x0199363@ti.com> (raw) From: Grygorii Strashko <grygorii.strashko@ti.com> Add a resource managed devm_iio_device_alloc()/devm_iio_device_free() to automatically clean up any allocations made by IIO drivers, thus leading to simplified IIO drivers code. In addition, this will allow IIO drivers to use other devm_*() API (like devm_request_irq) and don't care about the race between iio_device_free() and the release of resources by Device core during driver removing. Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com> [o.v.kravchenko@globallogic.com: fix return value ib devm_iio_device_alloc in case if devres_alloc failed, remove unused variable "rc"] Signed-off-by: Oleksandr Kravchenko <o.v.kravchenko@globallogic.com> Tested-by: Oleksandr Kravchenko <o.v.kravchenko@globallogic.com> --- drivers/iio/industrialio-core.c | 47 +++++++++++++++++++++++++++++++++++++++ include/linux/iio/iio.h | 25 +++++++++++++++++++++ 2 files changed, 72 insertions(+) diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c index e145931..d56d122 100644 --- a/drivers/iio/industrialio-core.c +++ b/drivers/iio/industrialio-core.c @@ -912,6 +912,53 @@ void iio_device_free(struct iio_dev *dev) } EXPORT_SYMBOL(iio_device_free); +static void devm_iio_device_release(struct device *dev, void *res) +{ + iio_device_free(*(struct iio_dev **)res); +} + +static int devm_iio_device_match(struct device *dev, void *res, void *data) +{ + struct iio_dev **r = res; + if (!r || !*r) { + WARN_ON(!r || !*r); + return 0; + } + return *r == data; +} + +struct iio_dev *devm_iio_device_alloc(struct device *dev, int sizeof_priv) +{ + struct iio_dev **ptr, *iio_dev; + + ptr = devres_alloc(devm_iio_device_release, sizeof(*ptr), + GFP_KERNEL); + if (!ptr) + return NULL; + + /* use raw alloc_dr for kmalloc caller tracing */ + iio_dev = iio_device_alloc(sizeof_priv); + if (iio_dev) { + *ptr = iio_dev; + devres_add(dev, ptr); + } else { + devres_free(ptr); + } + + return iio_dev; +} +EXPORT_SYMBOL_GPL(devm_iio_device_alloc); + +void devm_iio_device_free(struct device *dev, struct iio_dev *iio_dev) +{ + int rc; + + rc = devres_release(dev, devm_iio_device_release, + devm_iio_device_match, iio_dev); + WARN_ON(rc); +} +EXPORT_SYMBOL_GPL(devm_iio_device_free); + /** * iio_chrdev_open() - chrdev file open for buffer access and ioctls **/ diff --git a/include/linux/iio/iio.h b/include/linux/iio/iio.h index 8d171f4..f1d99f6 100644 --- a/include/linux/iio/iio.h +++ b/include/linux/iio/iio.h @@ -532,6 +532,31 @@ static inline struct iio_dev *iio_priv_to_dev(void *priv) void iio_device_free(struct iio_dev *indio_dev); /** + * devm_iio_device_alloc - Resource-managed iio_device_alloc() + * @dev: Device to allocate iio_dev for + * @sizeof_priv: Space to allocate for private structure. + * + * Managed iio_device_alloc. iio_dev allocated with this function is + * automatically freed on driver detach. + * + * If an iio_dev allocated with this function needs to be freed separately, + * devm_iio_device_free() must be used. + * + * RETURNS: + * Pointer to allocated iio_dev on success, NULL on failure. + */ +struct iio_dev *devm_iio_device_alloc(struct device *dev, int sizeof_priv); + +/** + * devm_iio_device_free - Resource-managed iio_device_free() + * @dev: Device this iio_dev belongs to + * @indio_dev: the iio_dev associated with the device + * + * Free indio_dev allocated with devm_iio_device_alloc(). + */ +void devm_iio_device_free(struct device *dev, struct iio_dev *iio_dev); + +/** * iio_buffer_enabled() - helper function to test if the buffer is enabled * @indio_dev: IIO device structure for device **/ -- 1.7.9.5
WARNING: multiple messages have this Message-ID (diff)
From: Oleksandr Kravchenko <x0199363@ti.com> To: linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org Cc: grant.likely@linaro.org, rob.herring@calxeda.com, rob@landley.net, jic23@cam.ac.uk, pmeerw@pmeerw.net, holler@ahsoftware.de, srinivas.pandruvada@intel.com, devicetree-discuss@lists.ozlabs.org, grygorii.strashko@ti.com, Oleksandr Kravchenko <o.v.kravchenko@globallogic.com> Subject: [PATCH 1/3] iio: core: implement devm_iio_device_alloc/devm_iio_device_free Date: Thu, 18 Jul 2013 13:19:24 +0300 [thread overview] Message-ID: <1374142766-29736-1-git-send-email-x0199363@ti.com> (raw) From: Grygorii Strashko <grygorii.strashko@ti.com> Add a resource managed devm_iio_device_alloc()/devm_iio_device_free() to automatically clean up any allocations made by IIO drivers, thus leading to simplified IIO drivers code. In addition, this will allow IIO drivers to use other devm_*() API (like devm_request_irq) and don't care about the race between iio_device_free() and the release of resources by Device core during driver removing. Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com> [o.v.kravchenko@globallogic.com: fix return value ib devm_iio_device_alloc in case if devres_alloc failed, remove unused variable "rc"] Signed-off-by: Oleksandr Kravchenko <o.v.kravchenko@globallogic.com> Tested-by: Oleksandr Kravchenko <o.v.kravchenko@globallogic.com> --- drivers/iio/industrialio-core.c | 47 +++++++++++++++++++++++++++++++++++++++ include/linux/iio/iio.h | 25 +++++++++++++++++++++ 2 files changed, 72 insertions(+) diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c index e145931..d56d122 100644 --- a/drivers/iio/industrialio-core.c +++ b/drivers/iio/industrialio-core.c @@ -912,6 +912,53 @@ void iio_device_free(struct iio_dev *dev) } EXPORT_SYMBOL(iio_device_free); +static void devm_iio_device_release(struct device *dev, void *res) +{ + iio_device_free(*(struct iio_dev **)res); +} + +static int devm_iio_device_match(struct device *dev, void *res, void *data) +{ + struct iio_dev **r = res; + if (!r || !*r) { + WARN_ON(!r || !*r); + return 0; + } + return *r == data; +} + +struct iio_dev *devm_iio_device_alloc(struct device *dev, int sizeof_priv) +{ + struct iio_dev **ptr, *iio_dev; + + ptr = devres_alloc(devm_iio_device_release, sizeof(*ptr), + GFP_KERNEL); + if (!ptr) + return NULL; + + /* use raw alloc_dr for kmalloc caller tracing */ + iio_dev = iio_device_alloc(sizeof_priv); + if (iio_dev) { + *ptr = iio_dev; + devres_add(dev, ptr); + } else { + devres_free(ptr); + } + + return iio_dev; +} +EXPORT_SYMBOL_GPL(devm_iio_device_alloc); + +void devm_iio_device_free(struct device *dev, struct iio_dev *iio_dev) +{ + int rc; + + rc = devres_release(dev, devm_iio_device_release, + devm_iio_device_match, iio_dev); + WARN_ON(rc); +} +EXPORT_SYMBOL_GPL(devm_iio_device_free); + /** * iio_chrdev_open() - chrdev file open for buffer access and ioctls **/ diff --git a/include/linux/iio/iio.h b/include/linux/iio/iio.h index 8d171f4..f1d99f6 100644 --- a/include/linux/iio/iio.h +++ b/include/linux/iio/iio.h @@ -532,6 +532,31 @@ static inline struct iio_dev *iio_priv_to_dev(void *priv) void iio_device_free(struct iio_dev *indio_dev); /** + * devm_iio_device_alloc - Resource-managed iio_device_alloc() + * @dev: Device to allocate iio_dev for + * @sizeof_priv: Space to allocate for private structure. + * + * Managed iio_device_alloc. iio_dev allocated with this function is + * automatically freed on driver detach. + * + * If an iio_dev allocated with this function needs to be freed separately, + * devm_iio_device_free() must be used. + * + * RETURNS: + * Pointer to allocated iio_dev on success, NULL on failure. + */ +struct iio_dev *devm_iio_device_alloc(struct device *dev, int sizeof_priv); + +/** + * devm_iio_device_free - Resource-managed iio_device_free() + * @dev: Device this iio_dev belongs to + * @indio_dev: the iio_dev associated with the device + * + * Free indio_dev allocated with devm_iio_device_alloc(). + */ +void devm_iio_device_free(struct device *dev, struct iio_dev *iio_dev); + +/** * iio_buffer_enabled() - helper function to test if the buffer is enabled * @indio_dev: IIO device structure for device **/ -- 1.7.9.5
next reply other threads:[~2013-07-18 10:19 UTC|newest] Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top 2013-07-18 10:19 Oleksandr Kravchenko [this message] 2013-07-18 10:19 ` [PATCH 1/3] iio: core: implement devm_iio_device_alloc/devm_iio_device_free Oleksandr Kravchenko 2013-07-18 10:19 ` [PATCH 2/3] of: Add Avago Technologies vendor prefix Oleksandr Kravchenko 2013-07-18 10:19 ` Oleksandr Kravchenko 2013-07-18 10:19 ` [PATCH 3/3] iio: add APDS9300 ambilent light sensor driver Oleksandr Kravchenko 2013-07-18 10:19 ` Oleksandr Kravchenko 2013-07-21 17:24 ` Jonathan Cameron 2013-07-20 13:05 ` [PATCH 1/3] iio: core: implement devm_iio_device_alloc/devm_iio_device_free Lars-Peter Clausen 2013-07-21 16:54 ` Jonathan Cameron 2013-07-21 16:54 ` Jonathan Cameron 2013-07-22 16:27 ` Jonathan Cameron -- strict thread matches above, loose matches on Subject: below -- 2013-07-18 9:44 Oleksandr Kravchenko 2013-07-18 9:44 ` Oleksandr Kravchenko
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1374142766-29736-1-git-send-email-x0199363@ti.com \ --to=x0199363@ti.com \ --cc=devicetree-discuss@lists.ozlabs.org \ --cc=grant.likely@linaro.org \ --cc=grygorii.strashko@ti.com \ --cc=holler@ahsoftware.de \ --cc=jic23@cam.ac.uk \ --cc=linux-doc@vger.kernel.org \ --cc=linux-iio@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=o.v.kravchenko@globallogic.com \ --cc=pmeerw@pmeerw.net \ --cc=rob.herring@calxeda.com \ --cc=rob@landley.net \ --cc=srinivas.pandruvada@intel.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.