|
@@ -0,0 +1,141 @@
|
|
|
+Index: linux-4.14.66/arch/mips/pci/pci-ar71xx.c
|
|
|
+===================================================================
|
|
|
+--- linux-4.14.66.orig/arch/mips/pci/pci-ar71xx.c
|
|
|
++++ linux-4.14.66/arch/mips/pci/pci-ar71xx.c
|
|
|
+@@ -54,11 +54,9 @@
|
|
|
+ struct ar71xx_pci_controller {
|
|
|
+ struct device_node *np;
|
|
|
+ void __iomem *cfg_base;
|
|
|
+- int irq;
|
|
|
+ struct pci_controller pci_ctrl;
|
|
|
+ struct resource io_res;
|
|
|
+ struct resource mem_res;
|
|
|
+- struct irq_domain *domain;
|
|
|
+ };
|
|
|
+
|
|
|
+ /* Byte lane enable bits */
|
|
|
+@@ -230,104 +228,6 @@ static struct pci_ops ar71xx_pci_ops = {
|
|
|
+ .write = ar71xx_pci_write_config,
|
|
|
+ };
|
|
|
+
|
|
|
+-static void ar71xx_pci_irq_handler(struct irq_desc *desc)
|
|
|
+-{
|
|
|
+- void __iomem *base = ath79_reset_base;
|
|
|
+- struct irq_chip *chip = irq_desc_get_chip(desc);
|
|
|
+- struct ar71xx_pci_controller *apc = irq_desc_get_handler_data(desc);
|
|
|
+- u32 pending;
|
|
|
+-
|
|
|
+- chained_irq_enter(chip, desc);
|
|
|
+- pending = __raw_readl(base + AR71XX_RESET_REG_PCI_INT_STATUS) &
|
|
|
+- __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE);
|
|
|
+-
|
|
|
+- if (pending & AR71XX_PCI_INT_DEV0)
|
|
|
+- generic_handle_irq(irq_linear_revmap(apc->domain, 1));
|
|
|
+-
|
|
|
+- else if (pending & AR71XX_PCI_INT_DEV1)
|
|
|
+- generic_handle_irq(irq_linear_revmap(apc->domain, 2));
|
|
|
+-
|
|
|
+- else if (pending & AR71XX_PCI_INT_DEV2)
|
|
|
+- generic_handle_irq(irq_linear_revmap(apc->domain, 3));
|
|
|
+-
|
|
|
+- else if (pending & AR71XX_PCI_INT_CORE)
|
|
|
+- generic_handle_irq(irq_linear_revmap(apc->domain, 4));
|
|
|
+-
|
|
|
+- else
|
|
|
+- spurious_interrupt();
|
|
|
+- chained_irq_exit(chip, desc);
|
|
|
+-}
|
|
|
+-
|
|
|
+-static void ar71xx_pci_irq_unmask(struct irq_data *d)
|
|
|
+-{
|
|
|
+- struct ar71xx_pci_controller *apc;
|
|
|
+- unsigned int irq;
|
|
|
+- void __iomem *base = ath79_reset_base;
|
|
|
+- u32 t;
|
|
|
+-
|
|
|
+- apc = irq_data_get_irq_chip_data(d);
|
|
|
+- irq = irq_linear_revmap(apc->domain, d->irq);
|
|
|
+-
|
|
|
+- t = __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE);
|
|
|
+- __raw_writel(t | (1 << irq), base + AR71XX_RESET_REG_PCI_INT_ENABLE);
|
|
|
+-
|
|
|
+- /* flush write */
|
|
|
+- __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE);
|
|
|
+-}
|
|
|
+-
|
|
|
+-static void ar71xx_pci_irq_mask(struct irq_data *d)
|
|
|
+-{
|
|
|
+- struct ar71xx_pci_controller *apc;
|
|
|
+- unsigned int irq;
|
|
|
+- void __iomem *base = ath79_reset_base;
|
|
|
+- u32 t;
|
|
|
+-
|
|
|
+- apc = irq_data_get_irq_chip_data(d);
|
|
|
+- irq = irq_linear_revmap(apc->domain, d->irq);
|
|
|
+-
|
|
|
+- t = __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE);
|
|
|
+- __raw_writel(t & ~(1 << irq), base + AR71XX_RESET_REG_PCI_INT_ENABLE);
|
|
|
+-
|
|
|
+- /* flush write */
|
|
|
+- __raw_readl(base + AR71XX_RESET_REG_PCI_INT_ENABLE);
|
|
|
+-}
|
|
|
+-
|
|
|
+-static struct irq_chip ar71xx_pci_irq_chip = {
|
|
|
+- .name = "AR71XX PCI",
|
|
|
+- .irq_mask = ar71xx_pci_irq_mask,
|
|
|
+- .irq_unmask = ar71xx_pci_irq_unmask,
|
|
|
+- .irq_mask_ack = ar71xx_pci_irq_mask,
|
|
|
+-};
|
|
|
+-
|
|
|
+-static int ar71xx_pci_irq_map(struct irq_domain *d,
|
|
|
+- unsigned int irq, irq_hw_number_t hw)
|
|
|
+-{
|
|
|
+- struct ar71xx_pci_controller *apc = d->host_data;
|
|
|
+-
|
|
|
+- irq_set_chip_and_handler(irq, &ar71xx_pci_irq_chip, handle_level_irq);
|
|
|
+- irq_set_chip_data(irq, apc);
|
|
|
+-
|
|
|
+- return 0;
|
|
|
+-}
|
|
|
+-
|
|
|
+-static const struct irq_domain_ops ar71xx_pci_domain_ops = {
|
|
|
+- .xlate = irq_domain_xlate_onecell,
|
|
|
+- .map = ar71xx_pci_irq_map,
|
|
|
+-};
|
|
|
+-
|
|
|
+-static void ar71xx_pci_irq_init(struct ar71xx_pci_controller *apc)
|
|
|
+-{
|
|
|
+- void __iomem *base = ath79_reset_base;
|
|
|
+-
|
|
|
+- __raw_writel(0, base + AR71XX_RESET_REG_PCI_INT_ENABLE);
|
|
|
+- __raw_writel(0, base + AR71XX_RESET_REG_PCI_INT_STATUS);
|
|
|
+-
|
|
|
+- apc->domain = irq_domain_add_linear(apc->np, AR71XX_PCI_IRQ_COUNT,
|
|
|
+- &ar71xx_pci_domain_ops, apc);
|
|
|
+- irq_set_chained_handler_and_data(apc->irq, ar71xx_pci_irq_handler,
|
|
|
+- apc);
|
|
|
+-}
|
|
|
+-
|
|
|
+ static void ar71xx_pci_reset(void)
|
|
|
+ {
|
|
|
+ ath79_device_reset_set(AR71XX_RESET_PCI_BUS | AR71XX_RESET_PCI_CORE);
|
|
|
+@@ -361,10 +261,6 @@ static int ar71xx_pci_probe(struct platf
|
|
|
+ if (IS_ERR(apc->cfg_base))
|
|
|
+ return PTR_ERR(apc->cfg_base);
|
|
|
+
|
|
|
+- apc->irq = platform_get_irq(pdev, 0);
|
|
|
+- if (apc->irq < 0)
|
|
|
+- return -EINVAL;
|
|
|
+-
|
|
|
+ ar71xx_pci_reset();
|
|
|
+
|
|
|
+ /* setup COMMAND register */
|
|
|
+@@ -375,8 +271,6 @@ static int ar71xx_pci_probe(struct platf
|
|
|
+ /* clear bus errors */
|
|
|
+ ar71xx_pci_check_error(apc, 1);
|
|
|
+
|
|
|
+- ar71xx_pci_irq_init(apc);
|
|
|
+-
|
|
|
+ apc->np = pdev->dev.of_node;
|
|
|
+ apc->pci_ctrl.pci_ops = &ar71xx_pci_ops;
|
|
|
+ apc->pci_ctrl.mem_resource = &apc->mem_res;
|