Message ID | 20220930090845.503815-2-yangyingliang@huawei.com |
---|---|
State | New |
Headers | show |
Series | of: introduce of_address_count() helper | expand |
On Fri, Sep 30, 2022 at 05:08:44PM +0800, Yang Yingliang wrote: > Introduce of_address_count() helper to count the IO resources > instead of open-coding it. > > Signed-off-by: Yang Yingliang <yangyingliang@huawei.com> > --- > drivers/of/address.c | 11 +++++++++++ > include/linux/of_address.h | 7 +++++++ > 2 files changed, 18 insertions(+) > > diff --git a/drivers/of/address.c b/drivers/of/address.c > index 96f0a12e507c..e32846a9a8d5 100644 > --- a/drivers/of/address.c > +++ b/drivers/of/address.c > @@ -848,6 +848,17 @@ int of_address_to_resource(struct device_node *dev, int index, > } > EXPORT_SYMBOL_GPL(of_address_to_resource); > > +int of_address_count(struct device_node *np) > +{ > + struct resource res; > + int count = 0; > + > + while (of_address_to_resource(np, count, &res) == 0) > + count++; > + > + return count; > +} EXPORT? However, I'd just make this always inline instead. > + > /** > * of_iomap - Maps the memory mapped IO for a given device_node > * @np: the device whose io range will be mapped > diff --git a/include/linux/of_address.h b/include/linux/of_address.h > index 45598dbec269..63027e8f3397 100644 > --- a/include/linux/of_address.h > +++ b/include/linux/of_address.h > @@ -43,6 +43,7 @@ extern u64 of_translate_dma_address(struct device_node *dev, > extern u64 of_translate_address(struct device_node *np, const __be32 *addr); > extern int of_address_to_resource(struct device_node *dev, int index, > struct resource *r); > +extern int of_address_count(struct device_node *np); > extern void __iomem *of_iomap(struct device_node *device, int index); > void __iomem *of_io_request_and_map(struct device_node *device, > int index, const char *name); > @@ -127,6 +128,7 @@ static inline bool of_dma_is_coherent(struct device_node *np) > #ifdef CONFIG_OF > extern int of_address_to_resource(struct device_node *dev, int index, > struct resource *r); > +extern int of_address_count(struct device_node *np); I'm pretty sure Sparc build is going to break. Sparc has its own implementation of of_address_to_resource(). > void __iomem *of_iomap(struct device_node *node, int index); > #else > static inline int of_address_to_resource(struct device_node *dev, int index, > @@ -139,6 +141,11 @@ static inline void __iomem *of_iomap(struct device_node *device, int index) > { > return NULL; > } > + > +static inline int of_address_count(struct device_node *np) > +{ > + return 0; > +} > #endif > #define of_range_parser_init of_pci_range_parser_init > > -- > 2.25.1 > >
Hi, On 2022/10/1 5:56, Rob Herring wrote: > On Fri, Sep 30, 2022 at 05:08:44PM +0800, Yang Yingliang wrote: >> Introduce of_address_count() helper to count the IO resources >> instead of open-coding it. >> >> Signed-off-by: Yang Yingliang <yangyingliang@huawei.com> >> --- >> drivers/of/address.c | 11 +++++++++++ >> include/linux/of_address.h | 7 +++++++ >> 2 files changed, 18 insertions(+) >> >> diff --git a/drivers/of/address.c b/drivers/of/address.c >> index 96f0a12e507c..e32846a9a8d5 100644 >> --- a/drivers/of/address.c >> +++ b/drivers/of/address.c >> @@ -848,6 +848,17 @@ int of_address_to_resource(struct device_node *dev, int index, >> } >> EXPORT_SYMBOL_GPL(of_address_to_resource); >> >> +int of_address_count(struct device_node *np) >> +{ >> + struct resource res; >> + int count = 0; >> + >> + while (of_address_to_resource(np, count, &res) == 0) >> + count++; >> + >> + return count; >> +} > EXPORT? > > However, I'd just make this always inline instead. > >> + >> /** >> * of_iomap - Maps the memory mapped IO for a given device_node >> * @np: the device whose io range will be mapped >> diff --git a/include/linux/of_address.h b/include/linux/of_address.h >> index 45598dbec269..63027e8f3397 100644 >> --- a/include/linux/of_address.h >> +++ b/include/linux/of_address.h >> @@ -43,6 +43,7 @@ extern u64 of_translate_dma_address(struct device_node *dev, >> extern u64 of_translate_address(struct device_node *np, const __be32 *addr); >> extern int of_address_to_resource(struct device_node *dev, int index, >> struct resource *r); >> +extern int of_address_count(struct device_node *np); >> extern void __iomem *of_iomap(struct device_node *device, int index); >> void __iomem *of_io_request_and_map(struct device_node *device, >> int index, const char *name); >> @@ -127,6 +128,7 @@ static inline bool of_dma_is_coherent(struct device_node *np) >> #ifdef CONFIG_OF >> extern int of_address_to_resource(struct device_node *dev, int index, >> struct resource *r); >> +extern int of_address_count(struct device_node *np); > I'm pretty sure Sparc build is going to break. Sparc has its own > implementation of of_address_to_resource(). Sorry for late replying. I will make of_address_count() inline in of_address.h in v2, so it will compatible with Sparc. Thanks, Yang >> void __iomem *of_iomap(struct device_node *node, int index); >> #else >> static inline int of_address_to_resource(struct device_node *dev, int index, >> @@ -139,6 +141,11 @@ static inline void __iomem *of_iomap(struct device_node *device, int index) >> { >> return NULL; >> } >> + >> +static inline int of_address_count(struct device_node *np) >> +{ >> + return 0; >> +} >> #endif >> #define of_range_parser_init of_pci_range_parser_init >> >> -- >> 2.25.1 >> >> > .
diff --git a/drivers/of/address.c b/drivers/of/address.c index 96f0a12e507c..e32846a9a8d5 100644 --- a/drivers/of/address.c +++ b/drivers/of/address.c @@ -848,6 +848,17 @@ int of_address_to_resource(struct device_node *dev, int index, } EXPORT_SYMBOL_GPL(of_address_to_resource); +int of_address_count(struct device_node *np) +{ + struct resource res; + int count = 0; + + while (of_address_to_resource(np, count, &res) == 0) + count++; + + return count; +} + /** * of_iomap - Maps the memory mapped IO for a given device_node * @np: the device whose io range will be mapped diff --git a/include/linux/of_address.h b/include/linux/of_address.h index 45598dbec269..63027e8f3397 100644 --- a/include/linux/of_address.h +++ b/include/linux/of_address.h @@ -43,6 +43,7 @@ extern u64 of_translate_dma_address(struct device_node *dev, extern u64 of_translate_address(struct device_node *np, const __be32 *addr); extern int of_address_to_resource(struct device_node *dev, int index, struct resource *r); +extern int of_address_count(struct device_node *np); extern void __iomem *of_iomap(struct device_node *device, int index); void __iomem *of_io_request_and_map(struct device_node *device, int index, const char *name); @@ -127,6 +128,7 @@ static inline bool of_dma_is_coherent(struct device_node *np) #ifdef CONFIG_OF extern int of_address_to_resource(struct device_node *dev, int index, struct resource *r); +extern int of_address_count(struct device_node *np); void __iomem *of_iomap(struct device_node *node, int index); #else static inline int of_address_to_resource(struct device_node *dev, int index, @@ -139,6 +141,11 @@ static inline void __iomem *of_iomap(struct device_node *device, int index) { return NULL; } + +static inline int of_address_count(struct device_node *np) +{ + return 0; +} #endif #define of_range_parser_init of_pci_range_parser_init
Introduce of_address_count() helper to count the IO resources instead of open-coding it. Signed-off-by: Yang Yingliang <yangyingliang@huawei.com> --- drivers/of/address.c | 11 +++++++++++ include/linux/of_address.h | 7 +++++++ 2 files changed, 18 insertions(+)