diff options
| -rw-r--r-- | arch/powerpc/include/asm/xics.h | 1 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/xics/ics-rtas.c | 11 | ||||
| -rw-r--r-- | arch/powerpc/sysdev/xics/xics-common.c | 12 | 
3 files changed, 19 insertions, 5 deletions
diff --git a/arch/powerpc/include/asm/xics.h b/arch/powerpc/include/asm/xics.h index c4ed4c5b646..6c06306c410 100644 --- a/arch/powerpc/include/asm/xics.h +++ b/arch/powerpc/include/asm/xics.h @@ -59,6 +59,7 @@ struct ics {  	int (*map)(struct ics *ics, unsigned int virq);  	void (*mask_unknown)(struct ics *ics, unsigned long vec);  	long (*get_server)(struct ics *ics, unsigned long vec); +	int (*host_match)(struct ics *ics, struct device_node *node);  	char data[];  }; diff --git a/arch/powerpc/sysdev/xics/ics-rtas.c b/arch/powerpc/sysdev/xics/ics-rtas.c index 5b3ee387e89..610c148fedc 100644 --- a/arch/powerpc/sysdev/xics/ics-rtas.c +++ b/arch/powerpc/sysdev/xics/ics-rtas.c @@ -26,12 +26,14 @@ static int ibm_int_off;  static int ics_rtas_map(struct ics *ics, unsigned int virq);  static void ics_rtas_mask_unknown(struct ics *ics, unsigned long vec);  static long ics_rtas_get_server(struct ics *ics, unsigned long vec); +static int ics_rtas_host_match(struct ics *ics, struct device_node *node);  /* Only one global & state struct ics */  static struct ics ics_rtas = {  	.map		= ics_rtas_map,  	.mask_unknown	= ics_rtas_mask_unknown,  	.get_server	= ics_rtas_get_server, +	.host_match	= ics_rtas_host_match,  };  static void ics_rtas_unmask_irq(struct irq_data *d) @@ -202,6 +204,15 @@ static long ics_rtas_get_server(struct ics *ics, unsigned long vec)  	return status[0];  } +static int ics_rtas_host_match(struct ics *ics, struct device_node *node) +{ +	/* IBM machines have interrupt parents of various funky types for things +	 * like vdevices, events, etc... The trick we use here is to match +	 * everything here except the legacy 8259 which is compatible "chrp,iic" +	 */ +	return !of_device_is_compatible(node, "chrp,iic"); +} +  int ics_rtas_init(void)  {  	ibm_get_xive = rtas_token("ibm,get-xive"); diff --git a/arch/powerpc/sysdev/xics/xics-common.c b/arch/powerpc/sysdev/xics/xics-common.c index e70175dfe32..c58844d7242 100644 --- a/arch/powerpc/sysdev/xics/xics-common.c +++ b/arch/powerpc/sysdev/xics/xics-common.c @@ -331,11 +331,13 @@ int xics_get_irq_server(unsigned int virq, const struct cpumask *cpumask,  static int xics_host_match(struct irq_host *h, struct device_node *node)  { -	/* IBM machines have interrupt parents of various funky types for things -	 * like vdevices, events, etc... The trick we use here is to match -	 * everything here except the legacy 8259 which is compatible "chrp,iic" -	 */ -	return !of_device_is_compatible(node, "chrp,iic"); +	struct ics *ics; + +	list_for_each_entry(ics, &ics_list, link) +		if (ics->host_match(ics, node)) +			return 1; + +	return 0;  }  /* Dummies */  |