Changeset 42501


Ignore:
Timestamp:
2014-09-12T08:53:00+02:00 (3 years ago)
Author:
blogic
Message:

atheros: ar2315-pci: rework interrupt handling

Add PCI IRQ controller to facilitate interrupt handling, move interrupts
initialization to the IRQ controller initialization from
pcibios_plat_dev_init() callback.

Also remove odd PCI dev configuration manipulation from pcibios_plat_dev_init()
callback.

Signed-off-by: Sergey Ryazanov <ryazanov.s.a@…>

Location:
trunk/target/linux/atheros/patches-3.14
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/atheros/patches-3.14/100-board.patch

    r42497 r42501  
    675675--- /dev/null 
    676676+++ b/arch/mips/include/asm/mach-ar231x/ar2315_regs.h 
    677 @@ -0,0 +1,614 @@ 
     677@@ -0,0 +1,624 @@ 
    678678+/* 
    679679+ * Register definitions for AR2315+ 
     
    715715+#define AR2315_MISC_IRQ_IR_RSVD                (AR231X_MISC_IRQ_BASE+9) 
    716716+#define AR2315_MISC_IRQ_COUNT          10 
     717+ 
     718+/* 
     719+ * PCI interrupts, which share IP5 
     720+ * Keep ordered according to AR2315_PCI_INT_XXX bits 
     721+ */ 
     722+#define AR2315_PCI_IRQ_BASE            0x50 
     723+#define AR2315_PCI_IRQ_EXT             (AR2315_PCI_IRQ_BASE+0) 
     724+#define AR2315_PCI_IRQ_ABORT           (AR2315_PCI_IRQ_BASE+1) 
     725+#define AR2315_PCI_IRQ_COUNT           2 
     726+#define AR2315_PCI_IRQ_SHIFT           25      /* in AR2315_PCI_INT_STATUS */ 
    717727+ 
    718728+/* 
     
    11391149+#define AR2315_PCI_OUT_PTR      (AR2315_PCI + 0x0408) 
    11401150+ 
    1141 +#define AR2315_PCI_INT_STATUS   (AR2315_PCI + 0x0500)   /* write one to clr */ 
    1142 +#define AR2315_PCI_TXINT        0x00000001      /* Desc In Completed */ 
    1143 +#define AR2315_PCI_TXOK         0x00000002      /* Desc In OK */ 
    1144 +#define AR2315_PCI_TXERR        0x00000004      /* Desc In ERR */ 
    1145 +#define AR2315_PCI_TXEOL        0x00000008      /* Desc In End-of-List */ 
    1146 +#define AR2315_PCI_RXINT        0x00000010      /* Desc Out Completed */ 
    1147 +#define AR2315_PCI_RXOK         0x00000020      /* Desc Out OK */ 
    1148 +#define AR2315_PCI_RXERR        0x00000040      /* Desc Out ERR */ 
    1149 +#define AR2315_PCI_RXEOL        0x00000080      /* Desc Out EOL */ 
    1150 +#define AR2315_PCI_TXOOD        0x00000200      /* Desc In Out-of-Desc */ 
    1151 +#define AR2315_PCI_MASK        0x0000FFFF      /* Desc Mask */ 
    1152 +#define AR2315_PCI_EXT_INT      0x02000000 
    1153 +#define AR2315_PCI_ABORT_INT    0x04000000 
    1154 + 
    1155 +#define AR2315_PCI_INT_MASK     (AR2315_PCI + 0x0504)  /* same as INT_STATUS */ 
    1156 + 
    1157 +#define AR2315_PCI_INTEN_REG    (AR2315_PCI + 0x0508) 
    1158 +#define AR2315_PCI_INT_DISABLE  0x00            /* disable pci interrupts */ 
    1159 +#define AR2315_PCI_INT_ENABLE   0x01            /* enable pci interrupts */ 
     1151+#define AR2315_PCI_ISR          (AR2315_PCI + 0x0500)   /* write one to clr */ 
     1152+#define AR2315_PCI_INT_TX       0x00000001      /* Desc In Completed */ 
     1153+#define AR2315_PCI_INT_TXOK     0x00000002      /* Desc In OK */ 
     1154+#define AR2315_PCI_INT_TXERR    0x00000004      /* Desc In ERR */ 
     1155+#define AR2315_PCI_INT_TXEOL    0x00000008      /* Desc In End-of-List */ 
     1156+#define AR2315_PCI_INT_RX       0x00000010      /* Desc Out Completed */ 
     1157+#define AR2315_PCI_INT_RXOK     0x00000020      /* Desc Out OK */ 
     1158+#define AR2315_PCI_INT_RXERR    0x00000040      /* Desc Out ERR */ 
     1159+#define AR2315_PCI_INT_RXEOL    0x00000080      /* Desc Out EOL */ 
     1160+#define AR2315_PCI_INT_TXOOD    0x00000200      /* Desc In Out-of-Desc */ 
     1161+#define AR2315_PCI_INT_DESCMASK 0x0000FFFF      /* Desc Mask */ 
     1162+#define AR2315_PCI_INT_EXT      0x02000000      /* Extern PCI INTA */ 
     1163+#define AR2315_PCI_INT_ABORT    0x04000000      /* PCI bus abort event */ 
     1164+ 
     1165+#define AR2315_PCI_IMR          (AR2315_PCI + 0x0504)  /* mask _PCI_ISR bits */ 
     1166+ 
     1167+#define AR2315_PCI_IER          (AR2315_PCI + 0x0508)  /* global PCI int en */ 
     1168+#define AR2315_PCI_IER_DISABLE  0x00            /* disable pci interrupts */ 
     1169+#define AR2315_PCI_IER_ENABLE   0x01            /* enable pci interrupts */ 
    11601170+ 
    11611171+#define AR2315_PCI_HOST_IN_EN   (AR2315_PCI + 0x0800) 
  • trunk/target/linux/atheros/patches-3.14/105-ar2315_pci.patch

    r42500 r42501  
    88--- /dev/null 
    99+++ b/arch/mips/ar231x/pci.c 
    10 @@ -0,0 +1,280 @@ 
     10@@ -0,0 +1,336 @@ 
    1111+/* 
    1212+ * This program is free software; you can redistribute it and/or 
     
    175175+int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) 
    176176+{ 
    177 +       return AR2315_IRQ_LCBUS_PCI; 
     177+       return AR2315_PCI_IRQ_EXT; 
    178178+} 
    179179+ 
    180180+int pcibios_plat_dev_init(struct pci_dev *dev) 
    181181+{ 
    182 +       pci_write_config_byte(dev, PCI_INTERRUPT_LINE, 5); 
    183 +       pci_write_config_word(dev, 0x40, 0); 
    184 + 
    185 +       /* Clear any pending Abort or external Interrupts 
    186 +        * and enable interrupt processing */ 
    187 +       ar231x_mask_reg(AR2315_PCI_INTEN_REG, AR2315_PCI_INT_ENABLE, 0); 
    188 +       ar231x_write_reg(AR2315_PCI_INT_STATUS, (AR2315_PCI_ABORT_INT | 
    189 +                        AR2315_PCI_EXT_INT)); 
    190 +       ar231x_write_reg(AR2315_PCI_INT_MASK, (AR2315_PCI_ABORT_INT | 
    191 +                        AR2315_PCI_EXT_INT)); 
    192 +       ar231x_mask_reg(AR2315_PCI_INTEN_REG, 0, AR2315_PCI_INT_ENABLE); 
    193 + 
    194182+       return 0; 
    195183+} 
     
    217205+ 
    218206+       return 0; 
     207+} 
     208+ 
     209+static void ar2315_pci_irq_handler(unsigned irq, struct irq_desc *desc) 
     210+{ 
     211+       u32 pending = ar231x_read_reg(AR2315_PCI_ISR) & 
     212+                     ar231x_read_reg(AR2315_PCI_IMR); 
     213+ 
     214+       if (pending & AR2315_PCI_INT_EXT) 
     215+               generic_handle_irq(AR2315_PCI_IRQ_EXT); 
     216+       else if (pending & AR2315_PCI_INT_ABORT) 
     217+               generic_handle_irq(AR2315_PCI_IRQ_ABORT); 
     218+       else 
     219+               spurious_interrupt(); 
     220+} 
     221+ 
     222+static void ar2315_pci_irq_mask(struct irq_data *d) 
     223+{ 
     224+       u32 m = 1 << (d->irq - AR2315_PCI_IRQ_BASE + AR2315_PCI_IRQ_SHIFT); 
     225+ 
     226+       ar231x_mask_reg(AR2315_PCI_IMR, m, 0); 
     227+} 
     228+ 
     229+static void ar2315_pci_irq_mask_ack(struct irq_data *d) 
     230+{ 
     231+       u32 m = 1 << (d->irq - AR2315_PCI_IRQ_BASE + AR2315_PCI_IRQ_SHIFT); 
     232+ 
     233+       ar231x_mask_reg(AR2315_PCI_IMR, m, 0); 
     234+       ar231x_write_reg(AR2315_PCI_ISR, m); 
     235+} 
     236+ 
     237+static void ar2315_pci_irq_unmask(struct irq_data *d) 
     238+{ 
     239+       u32 m = 1 << (d->irq - AR2315_PCI_IRQ_BASE + AR2315_PCI_IRQ_SHIFT); 
     240+ 
     241+       ar231x_mask_reg(AR2315_PCI_IMR, 0, m); 
     242+} 
     243+ 
     244+static struct irq_chip ar2315_pci_irq_chip = { 
     245+       .name = "AR2315-PCI", 
     246+       .irq_mask = ar2315_pci_irq_mask, 
     247+       .irq_mask_ack = ar2315_pci_irq_mask_ack, 
     248+       .irq_unmask = ar2315_pci_irq_unmask, 
     249+}; 
     250+ 
     251+static void ar2315_pci_irq_init(void) 
     252+{ 
     253+       int i; 
     254+ 
     255+       ar231x_mask_reg(AR2315_PCI_IER, AR2315_PCI_IER_ENABLE, 0); 
     256+       ar231x_mask_reg(AR2315_PCI_IMR, (AR2315_PCI_INT_ABORT | 
     257+                        AR2315_PCI_INT_EXT), 0); 
     258+ 
     259+       for (i = 0; i < AR2315_PCI_IRQ_COUNT; ++i) { 
     260+               int irq = AR2315_PCI_IRQ_BASE + i; 
     261+ 
     262+               irq_set_chip_and_handler(irq, &ar2315_pci_irq_chip, 
     263+                                        handle_level_irq); 
     264+       } 
     265+ 
     266+       irq_set_chained_handler(AR2315_IRQ_LCBUS_PCI, ar2315_pci_irq_handler); 
     267+ 
     268+       /* Clear any pending Abort or external Interrupts 
     269+        * and enable interrupt processing */ 
     270+       ar231x_write_reg(AR2315_PCI_ISR, (AR2315_PCI_INT_ABORT | 
     271+                        AR2315_PCI_INT_EXT)); 
     272+       ar231x_mask_reg(AR2315_PCI_IER, 0, AR2315_PCI_IER_ENABLE); 
    219273+} 
    220274+ 
     
    236290+       set_io_port_base(ar2315_pci_controller.io_map_base); /* PCI I/O space*/ 
    237291+ 
     292+       /* Reset PCI DMA logic */ 
    238293+       reg = ar231x_mask_reg(AR2315_RESET, 0, AR2315_RESET_PCIDMA); 
    239294+       msleep(20); 
    240 + 
    241295+       reg &= ~AR2315_RESET_PCIDMA; 
    242296+       ar231x_write_reg(AR2315_RESET, reg); 
     
    278332+       if (res) 
    279333+               goto error; 
     334+ 
     335+       ar2315_pci_irq_init(); 
    280336+ 
    281337+       register_pci_controller(&ar2315_pci_controller); 
     
    304360--- a/arch/mips/ar231x/ar2315.c 
    305361+++ b/arch/mips/ar231x/ar2315.c 
    306 @@ -87,6 +87,28 @@ static void ar2315_misc_irq_handler(unsi 
    307                 do_IRQ(AR2315_MISC_IRQ_NONE); 
    308  } 
    309   
    310 +#ifdef CONFIG_ATHEROS_AR2315_PCI 
    311 +static inline void pci_abort_irq(void) 
    312 +{ 
    313 +       ar231x_write_reg(AR2315_PCI_INT_STATUS, AR2315_PCI_ABORT_INT); 
    314 +} 
    315 + 
    316 +static inline void pci_ack_irq(void) 
    317 +{ 
    318 +       ar231x_write_reg(AR2315_PCI_INT_STATUS, AR2315_PCI_EXT_INT); 
    319 +} 
    320 + 
    321 +static void ar2315_pci_irq(int irq) 
    322 +{ 
    323 +       if (ar231x_read_reg(AR2315_PCI_INT_STATUS) == AR2315_PCI_ABORT_INT) 
    324 +               pci_abort_irq(); 
    325 +       else { 
    326 +               do_IRQ(irq); 
    327 +               pci_ack_irq(); 
    328 +       } 
    329 +} 
    330 +#endif /* CONFIG_ATHEROS_AR2315_PCI */ 
    331 + 
    332  /* 
    333   * Called when an interrupt is received, this function 
    334   * determines exactly which interrupt it was, and it 
    335 @@ -104,6 +126,10 @@ ar2315_irq_dispatch(void) 
     362@@ -104,6 +104,10 @@ ar2315_irq_dispatch(void) 
    336363                do_IRQ(AR2315_IRQ_WLAN0_INTRS); 
    337364        else if (pending & CAUSEF_IP4) 
     
    339366+#ifdef CONFIG_ATHEROS_AR2315_PCI 
    340367+       else if (pending & CAUSEF_IP5) 
    341 +               ar2315_pci_irq(AR2315_IRQ_LCBUS_PCI); 
     368+               do_IRQ(AR2315_IRQ_LCBUS_PCI); 
    342369+#endif 
    343370        else if (pending & CAUSEF_IP2) 
Note: See TracChangeset for help on using the changeset viewer.