x86: of: remove references to NO_IRQ in drivers/of/platform.c
PATCH 1/2 x86: of: remove references to NO_IRQ in drivers/of/platform.c
Instead of referencing NO_IRQ in platform.c, define some helper functions in irq.c to call instead from platform.c. Keep NO_IRQ usage local to irq.c, and define NO_IRQ if not defined in headers.
Signed-off-by Andres Salomon <[email protected]>
--- drivers/of/irq.c | 39 +++++++++++++++++++++++++++++++++++++++ drivers/of/platform.c | 10 +++------- include/linux/of_irq.h | 3 +++ 3 files changed, 45 insertions(+), 7 deletions(-)
drivers/of/irq.c +39 -0
@@ -24,6 +24,11 @@#include <linux/of_irq.h> #include <linux/string.h> +/* For archs that don't support NO_IRQ (such as x86), provide a dummy value */ +#ifndef NO_IRQ +#define NO_IRQ 0 +#endif +/** * irq_of_parse_and_map - Parse and map an interrupt into linux virq space * @device: Device node of the device whose interrupt is to be mapped
@@ -347,3 +352,37 @@ int of_irq_to_resource(struct device_node *dev, int index, struct resource *r)return irq; }EXPORT_SYMBOL_GPL (of_irq_to_resource); + +/** +* of_irq_count - Count the number of IRQs a node uses +* @dev: pointer to device tree node +*/ +int of_irq_count (struct device_node *dev) +{ +int nr =0 ; + +while (of_irq_to_resource (dev, nr,NULL ) !=NO_IRQ ) + nr++; + +return nr; +} + +/** +* of_irq_to_resource_table - Fill in resource table with node's IRQ info +* @dev: pointer to device tree node +* @res: array of resources to fill in +* @nr_irqs: the number of IRQs (and upper bound for num of @res elements) +* +* Returns the size of the filled in table (up to @nr_irqs). +*/ +int of_irq_to_resource_table (struct device_node *dev,struct resource *res, +int nr_irqs) +{ +int i; + +for (i =0 ; i < nr_irqs; i++, res++) +if (of_irq_to_resource (dev, i, res) ==NO_IRQ ) +break ; + +return i; +}
drivers/of/platform.c +3 -7
@@ -584,14 +584,13 @@ struct platform_device *of_device_alloc(struct device_node *np, struct device *parent) {struct platform_device *dev; -int rc, i, num_reg =0 , num_irq =0 ; +int rc, i, num_reg =0 , num_irq;struct resource *res, temp_res;/* First count how many resources are needed */ while (of_address_to_resource (np, num_reg, &temp_res) ==0 ) num_reg++; -while (of_irq_to_resource (np, num_irq, &temp_res) !=NO_IRQ ) - num_irq++; + num_irq =of_irq_count (np);/* Allocate memory for both the struct device and the resource table */ dev = kzalloc(sizeof(*dev) + (sizeof(*res) * (num_reg + num_irq)),
@@ -608,10 +607,7 @@ struct platform_device *of_device_alloc(struct device_node *np, rc =of_address_to_resource (np, i, res);WARN_ON (rc); } -for (i =0 ; i < num_irq; i++, res++) { - rc =of_irq_to_resource (np, i, res); -WARN_ON (rc ==NO_IRQ ); - } +WARN_ON (of_irq_to_resource_table (np, res, num_irq) != num_irq); } dev->dev.of_node =of_node_get (np);
include/linux/of_irq.h +3 -0
@@ -64,6 +64,9 @@ extern unsigned int irq_create_of_mapping(struct device_node *controller, unsigned int intsize);extern int of_irq_to_resource (struct device_node *dev,int index,struct resource *r); +extern int of_irq_count (struct device_node *dev); +extern int of_irq_to_resource_table (struct device_node *dev, +struct resource *res,int nr_irqs);#endif /* CONFIG_OF_IRQ */ #endif /* CONFIG_OF */
Signature · 1 line
1.5.6.5
Grant Likely
AppliedQuoted 6 lines · Andres Salomon
Instead of referencing
NO_IRQinplatform.c, define some helper functions inirq.cto call instead fromplatform.c. KeepNO_IRQusage local toirq.c, and defineNO_IRQif not defined in headers.Signed-off-by Andres Salomon <[email protected]>
Applied, thanks.
g.
Quoted 110 lines
--- drivers/of/irq.c | 39 +++++++++++++++++++++++++++++++++++++++ drivers/of/platform.c | 10 +++------- include/linux/of_irq.h | 3 +++ 3 files changed, 45 insertions(+), 7 deletions(-)drivers/of/irq.c +39
-0@@ -24,6 +24,11 @@#include <linux/of_irq.h> #include <linux/string.h> +/* For archs that don't support NO_IRQ (such as x86), provide a dummy value */ +#ifndef NO_IRQ +#define NO_IRQ 0 +#endif +/** * irq_of_parse_and_map - Parse and map an interrupt into linux virq space * @device: Device node of the device whose interrupt is to be mapped @@ -347,3 +352,37 @@ int of_irq_to_resource(struct device_node *dev, int index, struct resource *r)return irq; }EXPORT_SYMBOL_GPL (of_irq_to_resource); + +/** +* of_irq_count - Count the number of IRQs a node uses +* @dev: pointer to device tree node +*/ +int of_irq_count (struct device_node *dev) +{ +int nr =0 ; + +while (of_irq_to_resource (dev, nr,NULL ) !=NO_IRQ ) + nr++; + +return nr; +} + +/** +* of_irq_to_resource_table - Fill in resource table with node's IRQ info +* @dev: pointer to device tree node +* @res: array of resources to fill in +* @nr_irqs: the number of IRQs (and upper bound for num of @res elements) +* +* Returns the size of the filled in table (up to @nr_irqs). +*/ +int of_irq_to_resource_table (struct device_node *dev,struct resource *res, +int nr_irqs) +{ +int i; + +for (i =0 ; i < nr_irqs; i++, res++) +if (of_irq_to_resource (dev, i, res) ==NO_IRQ ) +break ; + +return i; +}drivers/of/platform.c +3
-7@@ -584,14 +584,13 @@ struct platform_device *of_device_alloc(struct device_node *np, struct device *parent) {struct platform_device *dev; -int rc, i, num_reg =0 , num_irq =0 ; +int rc, i, num_reg =0 , num_irq;struct resource *res, temp_res;/* First count how many resources are needed */ while (of_address_to_resource (np, num_reg, &temp_res) ==0 ) num_reg++; -while (of_irq_to_resource (np, num_irq, &temp_res) !=NO_IRQ ) - num_irq++; + num_irq =of_irq_count (np);/* Allocate memory for both the struct device and the resource table */ dev = kzalloc(sizeof(*dev) + (sizeof(*res) * (num_reg + num_irq)),@@ -608,10 +607,7 @@ struct platform_device *of_device_alloc(struct device_node *np, rc =of_address_to_resource (np, i, res);WARN_ON (rc); } -for (i =0 ; i < num_irq; i++, res++) { - rc =of_irq_to_resource (np, i, res); -WARN_ON (rc ==NO_IRQ ); - } +WARN_ON (of_irq_to_resource_table (np, res, num_irq) != num_irq); } dev->dev.of_node =of_node_get (np);include/linux/of_irq.h +3
-0@@ -64,6 +64,9 @@ extern unsigned int irq_create_of_mapping(struct device_node *controller, unsigned int intsize);extern int of_irq_to_resource (struct device_node *dev,int index,struct resource *r); +extern int of_irq_count (struct device_node *dev); +extern int of_irq_to_resource_table (struct device_node *dev, +struct resource *res,int nr_irqs);#endif /* CONFIG_OF_IRQ */ #endif /* CONFIG_OF */ Signature · 1 line
1.5.6.5