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