diff mbox series

[v6,1/4] nvmem: core: add nvmem_device_find

Message ID 20190923114636.6748-2-tbogendoerfer@suse.de (mailing list archive)
State Superseded
Headers show
Series Use MFD framework for SGI IOC3 drivers | expand

Commit Message

Thomas Bogendoerfer Sept. 23, 2019, 11:46 a.m. UTC
nvmem_device_find provides a way to search for nvmem devices with
the help of a match function simlair to bus_find_device.

Signed-off-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>
---
 Documentation/driver-api/nvmem.rst |  2 ++
 drivers/nvmem/core.c               | 61 +++++++++++++++++---------------------
 include/linux/nvmem-consumer.h     |  9 ++++++
 3 files changed, 38 insertions(+), 34 deletions(-)

Comments

Srinivas Kandagatla Oct. 1, 2019, 10:11 a.m. UTC | #1
On 23/09/2019 12:46, Thomas Bogendoerfer wrote:
> nvmem_device_find provides a way to search for nvmem devices with
> the help of a match function simlair to bus_find_device.
> 
> Signed-off-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>
> ---


Thanks for the patch,
This patch looks good for me.

Do you know which tree is going to pick this series up?

I can either apply this patch to nvmem tree

or here is my Ack for this patch to take it via other trees.

Reviewed-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Acked-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>


--srini
>   Documentation/driver-api/nvmem.rst |  2 ++
>   drivers/nvmem/core.c               | 61 +++++++++++++++++---------------------
>   include/linux/nvmem-consumer.h     |  9 ++++++
>   3 files changed, 38 insertions(+), 34 deletions(-)
> 
> diff --git a/Documentation/driver-api/nvmem.rst b/Documentation/driver-api/nvmem.rst
> index d9d958d5c824..287e86819640 100644
> --- a/Documentation/driver-api/nvmem.rst
> +++ b/Documentation/driver-api/nvmem.rst
> @@ -129,6 +129,8 @@ To facilitate such consumers NVMEM framework provides below apis::
>     struct nvmem_device *nvmem_device_get(struct device *dev, const char *name);
>     struct nvmem_device *devm_nvmem_device_get(struct device *dev,
>   					   const char *name);
> +  struct nvmem_device *nvmem_device_find(void *data,
> +			int (*match)(struct device *dev, const void *data));
>     void nvmem_device_put(struct nvmem_device *nvmem);
>     int nvmem_device_read(struct nvmem_device *nvmem, unsigned int offset,
>   		      size_t bytes, void *buf);
> diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c
> index 057d1ff87d5d..9f1ee9c766ec 100644
> --- a/drivers/nvmem/core.c
> +++ b/drivers/nvmem/core.c
> @@ -76,33 +76,6 @@ static struct bus_type nvmem_bus_type = {
>   	.name		= "nvmem",
>   };
>   
> -static struct nvmem_device *of_nvmem_find(struct device_node *nvmem_np)
> -{
> -	struct device *d;
> -
> -	if (!nvmem_np)
> -		return NULL;
> -
> -	d = bus_find_device_by_of_node(&nvmem_bus_type, nvmem_np);
> -
> -	if (!d)
> -		return NULL;
> -
> -	return to_nvmem_device(d);
> -}
> -
> -static struct nvmem_device *nvmem_find(const char *name)
> -{
> -	struct device *d;
> -
> -	d = bus_find_device_by_name(&nvmem_bus_type, NULL, name);
> -
> -	if (!d)
> -		return NULL;
> -
> -	return to_nvmem_device(d);
> -}
> -
>   static void nvmem_cell_drop(struct nvmem_cell *cell)
>   {
>   	blocking_notifier_call_chain(&nvmem_notifier, NVMEM_CELL_REMOVE, cell);
> @@ -532,13 +505,16 @@ int devm_nvmem_unregister(struct device *dev, struct nvmem_device *nvmem)
>   }
>   EXPORT_SYMBOL(devm_nvmem_unregister);
>   
> -static struct nvmem_device *__nvmem_device_get(struct device_node *np,
> -					       const char *nvmem_name)
> +static struct nvmem_device *__nvmem_device_get(void *data,
> +			int (*match)(struct device *dev, const void *data))
>   {
>   	struct nvmem_device *nvmem = NULL;
> +	struct device *dev;
>   
>   	mutex_lock(&nvmem_mutex);
> -	nvmem = np ? of_nvmem_find(np) : nvmem_find(nvmem_name);
> +	dev = bus_find_device(&nvmem_bus_type, NULL, data, match);
> +	if (dev)
> +		nvmem = to_nvmem_device(dev);
>   	mutex_unlock(&nvmem_mutex);
>   	if (!nvmem)
>   		return ERR_PTR(-EPROBE_DEFER);
> @@ -587,7 +563,7 @@ struct nvmem_device *of_nvmem_device_get(struct device_node *np, const char *id)
>   	if (!nvmem_np)
>   		return ERR_PTR(-ENOENT);
>   
> -	return __nvmem_device_get(nvmem_np, NULL);
> +	return __nvmem_device_get(nvmem_np, device_match_of_node);
>   }
>   EXPORT_SYMBOL_GPL(of_nvmem_device_get);
>   #endif
> @@ -613,10 +589,26 @@ struct nvmem_device *nvmem_device_get(struct device *dev, const char *dev_name)
>   
>   	}
>   
> -	return __nvmem_device_get(NULL, dev_name);
> +	return __nvmem_device_get((void *)dev_name, device_match_name);
>   }
>   EXPORT_SYMBOL_GPL(nvmem_device_get);
>   
> +/**
> + * nvmem_device_find() - Find nvmem device with matching function
> + *
> + * @data: Data to pass to match function
> + * @match: Callback function to check device
> + *
> + * Return: ERR_PTR() on error or a valid pointer to a struct nvmem_device
> + * on success.
> + */
> +struct nvmem_device *nvmem_device_find(void *data,
> +			int (*match)(struct device *dev, const void *data))
> +{
> +	return __nvmem_device_get(data, match);
> +}
> +EXPORT_SYMBOL_GPL(nvmem_device_find);
> +
>   static int devm_nvmem_device_match(struct device *dev, void *res, void *data)
>   {
>   	struct nvmem_device **nvmem = res;
> @@ -710,7 +702,8 @@ nvmem_cell_get_from_lookup(struct device *dev, const char *con_id)
>   		if ((strcmp(lookup->dev_id, dev_id) == 0) &&
>   		    (strcmp(lookup->con_id, con_id) == 0)) {
>   			/* This is the right entry. */
> -			nvmem = __nvmem_device_get(NULL, lookup->nvmem_name);
> +			nvmem = __nvmem_device_get((void *)lookup->nvmem_name,
> +						   device_match_name);
>   			if (IS_ERR(nvmem)) {
>   				/* Provider may not be registered yet. */
>   				cell = ERR_CAST(nvmem);
> @@ -780,7 +773,7 @@ struct nvmem_cell *of_nvmem_cell_get(struct device_node *np, const char *id)
>   	if (!nvmem_np)
>   		return ERR_PTR(-EINVAL);
>   
> -	nvmem = __nvmem_device_get(nvmem_np, NULL);
> +	nvmem = __nvmem_device_get(nvmem_np, device_match_of_node);
>   	of_node_put(nvmem_np);
>   	if (IS_ERR(nvmem))
>   		return ERR_CAST(nvmem);
> diff --git a/include/linux/nvmem-consumer.h b/include/linux/nvmem-consumer.h
> index 8f8be5b00060..02dc4aa992b2 100644
> --- a/include/linux/nvmem-consumer.h
> +++ b/include/linux/nvmem-consumer.h
> @@ -89,6 +89,9 @@ void nvmem_del_cell_lookups(struct nvmem_cell_lookup *entries,
>   int nvmem_register_notifier(struct notifier_block *nb);
>   int nvmem_unregister_notifier(struct notifier_block *nb);
>   
> +struct nvmem_device *nvmem_device_find(void *data,
> +			int (*match)(struct device *dev, const void *data));
> +
>   #else
>   
>   static inline struct nvmem_cell *nvmem_cell_get(struct device *dev,
> @@ -204,6 +207,12 @@ static inline int nvmem_unregister_notifier(struct notifier_block *nb)
>   	return -EOPNOTSUPP;
>   }
>   
> +static inline struct nvmem_device *nvmem_device_find(void *data,
> +			int (*match)(struct device *dev, const void *data))
> +{
> +	return NULL;
> +}
> +
>   #endif /* CONFIG_NVMEM */
>   
>   #if IS_ENABLED(CONFIG_NVMEM) && IS_ENABLED(CONFIG_OF)
>
Paul Burton Oct. 2, 2019, 6:33 p.m. UTC | #2
Hello,

On Tue, Oct 01, 2019 at 11:11:58AM +0100, Srinivas Kandagatla wrote:
> On 23/09/2019 12:46, Thomas Bogendoerfer wrote:
> > nvmem_device_find provides a way to search for nvmem devices with
> > the help of a match function simlair to bus_find_device.
> > 
> > Signed-off-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>
> > ---
> 
> Thanks for the patch,
> This patch looks good for me.
> 
> Do you know which tree is going to pick this series up?
> 
> I can either apply this patch to nvmem tree
> 
> or here is my Ack for this patch to take it via other trees.
> 
> Reviewed-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
> Acked-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>

Thanks - if you don't mind I'll take this through mips-next along with
the following patch that depends on it.

Thomas: I see patch 3 has an issue reported by the kbuild test robot,
        and still needs acks from the MFD & network maintainers. Can I
	presume it's safe to apply patches 1 & 2 without 3 & 4 in the
	meantime?

Paul
Thomas Bogendoerfer Oct. 2, 2019, 7:08 p.m. UTC | #3
On Wed, 2 Oct 2019 18:33:28 +0000
Paul Burton <paul.burton@mips.com> wrote:

> Hello,
> 
> On Tue, Oct 01, 2019 at 11:11:58AM +0100, Srinivas Kandagatla wrote:
> > On 23/09/2019 12:46, Thomas Bogendoerfer wrote:
> > > nvmem_device_find provides a way to search for nvmem devices with
> > > the help of a match function simlair to bus_find_device.
> > > 
> > > Signed-off-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>
> > > ---
> > 
> > Thanks for the patch,
> > This patch looks good for me.
> > 
> > Do you know which tree is going to pick this series up?
> > 
> > I can either apply this patch to nvmem tree
> > 
> > or here is my Ack for this patch to take it via other trees.
> > 
> > Reviewed-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
> > Acked-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
> 
> Thanks - if you don't mind I'll take this through mips-next along with
> the following patch that depends on it.
> 
> Thomas: I see patch 3 has an issue reported by the kbuild test robot,

yes, that's because kbuild robot tries to build it 32bit. I'm going to make
it depend on 64bit all possible ioc3 platforms only support 64bit kernels.

>         and still needs acks from the MFD & network maintainers. Can I
> 	presume it's safe to apply patches 1 & 2 without 3 & 4 in the
> 	meantime?

yes, thank you.

Thomas.
diff mbox series

Patch

diff --git a/Documentation/driver-api/nvmem.rst b/Documentation/driver-api/nvmem.rst
index d9d958d5c824..287e86819640 100644
--- a/Documentation/driver-api/nvmem.rst
+++ b/Documentation/driver-api/nvmem.rst
@@ -129,6 +129,8 @@  To facilitate such consumers NVMEM framework provides below apis::
   struct nvmem_device *nvmem_device_get(struct device *dev, const char *name);
   struct nvmem_device *devm_nvmem_device_get(struct device *dev,
 					   const char *name);
+  struct nvmem_device *nvmem_device_find(void *data,
+			int (*match)(struct device *dev, const void *data));
   void nvmem_device_put(struct nvmem_device *nvmem);
   int nvmem_device_read(struct nvmem_device *nvmem, unsigned int offset,
 		      size_t bytes, void *buf);
diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c
index 057d1ff87d5d..9f1ee9c766ec 100644
--- a/drivers/nvmem/core.c
+++ b/drivers/nvmem/core.c
@@ -76,33 +76,6 @@  static struct bus_type nvmem_bus_type = {
 	.name		= "nvmem",
 };
 
-static struct nvmem_device *of_nvmem_find(struct device_node *nvmem_np)
-{
-	struct device *d;
-
-	if (!nvmem_np)
-		return NULL;
-
-	d = bus_find_device_by_of_node(&nvmem_bus_type, nvmem_np);
-
-	if (!d)
-		return NULL;
-
-	return to_nvmem_device(d);
-}
-
-static struct nvmem_device *nvmem_find(const char *name)
-{
-	struct device *d;
-
-	d = bus_find_device_by_name(&nvmem_bus_type, NULL, name);
-
-	if (!d)
-		return NULL;
-
-	return to_nvmem_device(d);
-}
-
 static void nvmem_cell_drop(struct nvmem_cell *cell)
 {
 	blocking_notifier_call_chain(&nvmem_notifier, NVMEM_CELL_REMOVE, cell);
@@ -532,13 +505,16 @@  int devm_nvmem_unregister(struct device *dev, struct nvmem_device *nvmem)
 }
 EXPORT_SYMBOL(devm_nvmem_unregister);
 
-static struct nvmem_device *__nvmem_device_get(struct device_node *np,
-					       const char *nvmem_name)
+static struct nvmem_device *__nvmem_device_get(void *data,
+			int (*match)(struct device *dev, const void *data))
 {
 	struct nvmem_device *nvmem = NULL;
+	struct device *dev;
 
 	mutex_lock(&nvmem_mutex);
-	nvmem = np ? of_nvmem_find(np) : nvmem_find(nvmem_name);
+	dev = bus_find_device(&nvmem_bus_type, NULL, data, match);
+	if (dev)
+		nvmem = to_nvmem_device(dev);
 	mutex_unlock(&nvmem_mutex);
 	if (!nvmem)
 		return ERR_PTR(-EPROBE_DEFER);
@@ -587,7 +563,7 @@  struct nvmem_device *of_nvmem_device_get(struct device_node *np, const char *id)
 	if (!nvmem_np)
 		return ERR_PTR(-ENOENT);
 
-	return __nvmem_device_get(nvmem_np, NULL);
+	return __nvmem_device_get(nvmem_np, device_match_of_node);
 }
 EXPORT_SYMBOL_GPL(of_nvmem_device_get);
 #endif
@@ -613,10 +589,26 @@  struct nvmem_device *nvmem_device_get(struct device *dev, const char *dev_name)
 
 	}
 
-	return __nvmem_device_get(NULL, dev_name);
+	return __nvmem_device_get((void *)dev_name, device_match_name);
 }
 EXPORT_SYMBOL_GPL(nvmem_device_get);
 
+/**
+ * nvmem_device_find() - Find nvmem device with matching function
+ *
+ * @data: Data to pass to match function
+ * @match: Callback function to check device
+ *
+ * Return: ERR_PTR() on error or a valid pointer to a struct nvmem_device
+ * on success.
+ */
+struct nvmem_device *nvmem_device_find(void *data,
+			int (*match)(struct device *dev, const void *data))
+{
+	return __nvmem_device_get(data, match);
+}
+EXPORT_SYMBOL_GPL(nvmem_device_find);
+
 static int devm_nvmem_device_match(struct device *dev, void *res, void *data)
 {
 	struct nvmem_device **nvmem = res;
@@ -710,7 +702,8 @@  nvmem_cell_get_from_lookup(struct device *dev, const char *con_id)
 		if ((strcmp(lookup->dev_id, dev_id) == 0) &&
 		    (strcmp(lookup->con_id, con_id) == 0)) {
 			/* This is the right entry. */
-			nvmem = __nvmem_device_get(NULL, lookup->nvmem_name);
+			nvmem = __nvmem_device_get((void *)lookup->nvmem_name,
+						   device_match_name);
 			if (IS_ERR(nvmem)) {
 				/* Provider may not be registered yet. */
 				cell = ERR_CAST(nvmem);
@@ -780,7 +773,7 @@  struct nvmem_cell *of_nvmem_cell_get(struct device_node *np, const char *id)
 	if (!nvmem_np)
 		return ERR_PTR(-EINVAL);
 
-	nvmem = __nvmem_device_get(nvmem_np, NULL);
+	nvmem = __nvmem_device_get(nvmem_np, device_match_of_node);
 	of_node_put(nvmem_np);
 	if (IS_ERR(nvmem))
 		return ERR_CAST(nvmem);
diff --git a/include/linux/nvmem-consumer.h b/include/linux/nvmem-consumer.h
index 8f8be5b00060..02dc4aa992b2 100644
--- a/include/linux/nvmem-consumer.h
+++ b/include/linux/nvmem-consumer.h
@@ -89,6 +89,9 @@  void nvmem_del_cell_lookups(struct nvmem_cell_lookup *entries,
 int nvmem_register_notifier(struct notifier_block *nb);
 int nvmem_unregister_notifier(struct notifier_block *nb);
 
+struct nvmem_device *nvmem_device_find(void *data,
+			int (*match)(struct device *dev, const void *data));
+
 #else
 
 static inline struct nvmem_cell *nvmem_cell_get(struct device *dev,
@@ -204,6 +207,12 @@  static inline int nvmem_unregister_notifier(struct notifier_block *nb)
 	return -EOPNOTSUPP;
 }
 
+static inline struct nvmem_device *nvmem_device_find(void *data,
+			int (*match)(struct device *dev, const void *data))
+{
+	return NULL;
+}
+
 #endif /* CONFIG_NVMEM */
 
 #if IS_ENABLED(CONFIG_NVMEM) && IS_ENABLED(CONFIG_OF)