diff mbox series

spi: spi-mem: Add devm_spi_mem_dirmap_{create,destroy}()

Message ID 20190119150412.2345-1-bbrezillon@kernel.org (mailing list archive)
State Accepted
Commit 1fc1b63638da1accb27264a507b23aa6863c3852
Headers show
Series spi: spi-mem: Add devm_spi_mem_dirmap_{create,destroy}() | expand

Commit Message

Boris Brezillon Jan. 19, 2019, 3:04 p.m. UTC
Since direct mapping descriptors usually the same lifetime as the SPI
MEM device adding devm_ variants of the spi_mem_dirmap_{create,destroy}()
should greatly simplify error/remove path of spi-mem drivers making use
of the direct mapping API.

Signed-off-by: Boris Brezillon <bbrezillon@kernel.org>
---
Hi Mark,

The patch was based on top of https://patchwork.kernel.org/patch/10772063/
which is likely to go through the spi/fixes branch. I don't know how you
deal with such dependencies (merge v5.0-rcX into spi/next once the fix
at reached Linus tree, or wait for the next release cycle before
applying it?).

Regards,

Boris
---
 drivers/spi/spi-mem.c       | 69 +++++++++++++++++++++++++++++++++++++
 include/linux/spi/spi-mem.h |  5 +++
 2 files changed, 74 insertions(+)

Comments

Boris Brezillon Jan. 19, 2019, 3:06 p.m. UTC | #1
On Sat, 19 Jan 2019 16:04:12 +0100
Boris Brezillon <bbrezillon@kernel.org> wrote:

> Since direct mapping descriptors usually the same lifetime as the SPI
> MEM device adding devm_ variants of the spi_mem_dirmap_{create,destroy}()
> should greatly simplify error/remove path of spi-mem drivers making use
> of the direct mapping API.
> 
> Signed-off-by: Boris Brezillon <bbrezillon@kernel.org>
> ---
> Hi Mark,
> 
> The patch was based on top of https://patchwork.kernel.org/patch/10772063/
> which is likely to go through the spi/fixes branch. I don't know how you
> deal with such dependencies (merge v5.0-rcX into spi/next once the fix
> at reached Linus tree, or wait for the next release cycle before
> applying it?).

Nevermind, looks like the diff context does not show the conflicting
lines, so we should be good and both patches can be applied
independently. 

> 
> Regards,
> 
> Boris
> ---
>  drivers/spi/spi-mem.c       | 69 +++++++++++++++++++++++++++++++++++++
>  include/linux/spi/spi-mem.h |  5 +++
>  2 files changed, 74 insertions(+)
> 
> diff --git a/drivers/spi/spi-mem.c b/drivers/spi/spi-mem.c
> index 9487c9cd68bd..a4d8d19ecff9 100644
> --- a/drivers/spi/spi-mem.c
> +++ b/drivers/spi/spi-mem.c
> @@ -552,6 +552,75 @@ void spi_mem_dirmap_destroy(struct spi_mem_dirmap_desc *desc)
>  }
>  EXPORT_SYMBOL_GPL(spi_mem_dirmap_destroy);
>  
> +static void devm_spi_mem_dirmap_release(struct device *dev, void *res)
> +{
> +	struct spi_mem_dirmap_desc *desc = *(struct spi_mem_dirmap_desc **)res;
> +
> +	spi_mem_dirmap_destroy(desc);
> +}
> +
> +/**
> + * devm_spi_mem_dirmap_create() - Create a direct mapping descriptor and attach
> + *				  it to a device
> + * @dev: device the dirmap desc will be attached to
> + * @mem: SPI mem device this direct mapping should be created for
> + * @info: direct mapping information
> + *
> + * devm_ variant of the spi_mem_dirmap_create() function. See
> + * spi_mem_dirmap_create() for more details.
> + *
> + * Return: a valid pointer in case of success, and ERR_PTR() otherwise.
> + */
> +struct spi_mem_dirmap_desc *
> +devm_spi_mem_dirmap_create(struct device *dev, struct spi_mem *mem,
> +			   const struct spi_mem_dirmap_info *info)
> +{
> +	struct spi_mem_dirmap_desc **ptr, *desc;
> +
> +	ptr = devres_alloc(devm_spi_mem_dirmap_release, sizeof(*ptr),
> +			   GFP_KERNEL);
> +	if (!ptr)
> +		return ERR_PTR(-ENOMEM);
> +
> +	desc = spi_mem_dirmap_create(mem, info);
> +	if (IS_ERR(desc)) {
> +		devres_free(ptr);
> +	} else {
> +		*ptr = desc;
> +		devres_add(dev, ptr);
> +	}
> +
> +	return desc;
> +}
> +EXPORT_SYMBOL_GPL(devm_spi_mem_dirmap_create);
> +
> +static int devm_spi_mem_dirmap_match(struct device *dev, void *res, void *data)
> +{
> +        struct spi_mem_dirmap_desc **ptr = res;
> +
> +        if (WARN_ON(!ptr || !*ptr))
> +                return 0;
> +
> +	return *ptr == data;
> +}
> +
> +/**
> + * devm_spi_mem_dirmap_destroy() - Destroy a direct mapping descriptor attached
> + *				   to a device
> + * @dev: device the dirmap desc is attached to
> + * @desc: the direct mapping descriptor to destroy
> + *
> + * devm_ variant of the spi_mem_dirmap_destroy() function. See
> + * spi_mem_dirmap_destroy() for more details.
> + */
> +void devm_spi_mem_dirmap_destroy(struct device *dev,
> +				 struct spi_mem_dirmap_desc *desc)
> +{
> +	devres_release(dev, devm_spi_mem_dirmap_release,
> +		       devm_spi_mem_dirmap_match, desc);
> +}
> +EXPORT_SYMBOL_GPL(devm_spi_mem_dirmap_destroy);
> +
>  /**
>   * spi_mem_dirmap_dirmap_read() - Read data through a direct mapping
>   * @desc: direct mapping descriptor
> diff --git a/include/linux/spi/spi-mem.h b/include/linux/spi/spi-mem.h
> index 3fe24500c5ee..3703d0dcac2e 100644
> --- a/include/linux/spi/spi-mem.h
> +++ b/include/linux/spi/spi-mem.h
> @@ -330,6 +330,11 @@ ssize_t spi_mem_dirmap_read(struct spi_mem_dirmap_desc *desc,
>  			    u64 offs, size_t len, void *buf);
>  ssize_t spi_mem_dirmap_write(struct spi_mem_dirmap_desc *desc,
>  			     u64 offs, size_t len, const void *buf);
> +struct spi_mem_dirmap_desc *
> +devm_spi_mem_dirmap_create(struct device *dev, struct spi_mem *mem,
> +			   const struct spi_mem_dirmap_info *info);
> +void devm_spi_mem_dirmap_destroy(struct device *dev,
> +				 struct spi_mem_dirmap_desc *desc);
>  
>  int spi_mem_driver_register_with_owner(struct spi_mem_driver *drv,
>  				       struct module *owner);
diff mbox series

Patch

diff --git a/drivers/spi/spi-mem.c b/drivers/spi/spi-mem.c
index 9487c9cd68bd..a4d8d19ecff9 100644
--- a/drivers/spi/spi-mem.c
+++ b/drivers/spi/spi-mem.c
@@ -552,6 +552,75 @@  void spi_mem_dirmap_destroy(struct spi_mem_dirmap_desc *desc)
 }
 EXPORT_SYMBOL_GPL(spi_mem_dirmap_destroy);
 
+static void devm_spi_mem_dirmap_release(struct device *dev, void *res)
+{
+	struct spi_mem_dirmap_desc *desc = *(struct spi_mem_dirmap_desc **)res;
+
+	spi_mem_dirmap_destroy(desc);
+}
+
+/**
+ * devm_spi_mem_dirmap_create() - Create a direct mapping descriptor and attach
+ *				  it to a device
+ * @dev: device the dirmap desc will be attached to
+ * @mem: SPI mem device this direct mapping should be created for
+ * @info: direct mapping information
+ *
+ * devm_ variant of the spi_mem_dirmap_create() function. See
+ * spi_mem_dirmap_create() for more details.
+ *
+ * Return: a valid pointer in case of success, and ERR_PTR() otherwise.
+ */
+struct spi_mem_dirmap_desc *
+devm_spi_mem_dirmap_create(struct device *dev, struct spi_mem *mem,
+			   const struct spi_mem_dirmap_info *info)
+{
+	struct spi_mem_dirmap_desc **ptr, *desc;
+
+	ptr = devres_alloc(devm_spi_mem_dirmap_release, sizeof(*ptr),
+			   GFP_KERNEL);
+	if (!ptr)
+		return ERR_PTR(-ENOMEM);
+
+	desc = spi_mem_dirmap_create(mem, info);
+	if (IS_ERR(desc)) {
+		devres_free(ptr);
+	} else {
+		*ptr = desc;
+		devres_add(dev, ptr);
+	}
+
+	return desc;
+}
+EXPORT_SYMBOL_GPL(devm_spi_mem_dirmap_create);
+
+static int devm_spi_mem_dirmap_match(struct device *dev, void *res, void *data)
+{
+        struct spi_mem_dirmap_desc **ptr = res;
+
+        if (WARN_ON(!ptr || !*ptr))
+                return 0;
+
+	return *ptr == data;
+}
+
+/**
+ * devm_spi_mem_dirmap_destroy() - Destroy a direct mapping descriptor attached
+ *				   to a device
+ * @dev: device the dirmap desc is attached to
+ * @desc: the direct mapping descriptor to destroy
+ *
+ * devm_ variant of the spi_mem_dirmap_destroy() function. See
+ * spi_mem_dirmap_destroy() for more details.
+ */
+void devm_spi_mem_dirmap_destroy(struct device *dev,
+				 struct spi_mem_dirmap_desc *desc)
+{
+	devres_release(dev, devm_spi_mem_dirmap_release,
+		       devm_spi_mem_dirmap_match, desc);
+}
+EXPORT_SYMBOL_GPL(devm_spi_mem_dirmap_destroy);
+
 /**
  * spi_mem_dirmap_dirmap_read() - Read data through a direct mapping
  * @desc: direct mapping descriptor
diff --git a/include/linux/spi/spi-mem.h b/include/linux/spi/spi-mem.h
index 3fe24500c5ee..3703d0dcac2e 100644
--- a/include/linux/spi/spi-mem.h
+++ b/include/linux/spi/spi-mem.h
@@ -330,6 +330,11 @@  ssize_t spi_mem_dirmap_read(struct spi_mem_dirmap_desc *desc,
 			    u64 offs, size_t len, void *buf);
 ssize_t spi_mem_dirmap_write(struct spi_mem_dirmap_desc *desc,
 			     u64 offs, size_t len, const void *buf);
+struct spi_mem_dirmap_desc *
+devm_spi_mem_dirmap_create(struct device *dev, struct spi_mem *mem,
+			   const struct spi_mem_dirmap_info *info);
+void devm_spi_mem_dirmap_destroy(struct device *dev,
+				 struct spi_mem_dirmap_desc *desc);
 
 int spi_mem_driver_register_with_owner(struct spi_mem_driver *drv,
 				       struct module *owner);