Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 52f6537c authored by Andres Salomon's avatar Andres Salomon Committed by Grant Likely
Browse files

of/irq: 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: default avatarAndres Salomon <dilinger@queued.net>
Signed-off-by: default avatarGrant Likely <grant.likely@secretlab.ca>
parent e2f2a93b
Loading
Loading
Loading
Loading
+39 −0
Original line number Diff line number Diff line
@@ -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;
}
+3 −7
Original line number Diff line number Diff line
@@ -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);
+3 −0
Original line number Diff line number Diff line
@@ -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 */