diff options
Diffstat (limited to 'arch/ia64/kernel')
| -rw-r--r-- | arch/ia64/kernel/msi_ia64.c | 30 | 
1 files changed, 19 insertions, 11 deletions
| diff --git a/arch/ia64/kernel/msi_ia64.c b/arch/ia64/kernel/msi_ia64.c index 9dd7464f8c17..d70bf15c690a 100644 --- a/arch/ia64/kernel/msi_ia64.c +++ b/arch/ia64/kernel/msi_ia64.c @@ -165,7 +165,7 @@ static struct irq_chip dmar_msi_type = {  	.irq_retrigger = ia64_msi_retrigger_irq,  }; -static int +static void  msi_compose_msg(struct pci_dev *pdev, unsigned int irq, struct msi_msg *msg)  {  	struct irq_cfg *cfg = irq_cfg + irq; @@ -186,21 +186,29 @@ msi_compose_msg(struct pci_dev *pdev, unsigned int irq, struct msi_msg *msg)  		MSI_DATA_LEVEL_ASSERT |  		MSI_DATA_DELIVERY_FIXED |  		MSI_DATA_VECTOR(cfg->vector); -	return 0;  } -int arch_setup_dmar_msi(unsigned int irq) +int dmar_alloc_hwirq(int id, int node, void *arg)  { -	int ret; +	int irq;  	struct msi_msg msg; -	ret = msi_compose_msg(NULL, irq, &msg); -	if (ret < 0) -		return ret; -	dmar_msi_write(irq, &msg); -	irq_set_chip_and_handler_name(irq, &dmar_msi_type, handle_edge_irq, -				      "edge"); -	return 0; +	irq = create_irq(); +	if (irq > 0) { +		irq_set_handler_data(irq, arg); +		irq_set_chip_and_handler_name(irq, &dmar_msi_type, +					      handle_edge_irq, "edge"); +		msi_compose_msg(NULL, irq, &msg); +		dmar_msi_write(irq, &msg); +	} + +	return irq; +} + +void dmar_free_hwirq(int irq) +{ +	irq_set_handler_data(irq, NULL); +	destroy_irq(irq);  }  #endif /* CONFIG_INTEL_IOMMU */ | 
