Changeset 44727


Ignore:
Timestamp:
2015-03-13T04:01:31+01:00 (3 years ago)
Author:
nbd
Message:

atheros: v3.18: switch to IRQ domain

Rework MISC and PCI IRQ controllers code to use IRQ domains and bitops.

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

Location:
trunk/target/linux/atheros
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/atheros/config-3.18

    r44706 r44727  
    8888CONFIG_IP17XX_PHY=y 
    8989CONFIG_IRQ_CPU=y 
     90CONFIG_IRQ_DOMAIN=y 
    9091CONFIG_IRQ_FORCED_THREADING=y 
    9192CONFIG_IRQ_WORK=y 
  • trunk/target/linux/atheros/patches-3.18/100-board.patch

    r44726 r44727  
    11--- a/arch/mips/Kconfig 
    22+++ b/arch/mips/Kconfig 
    3 @@ -96,6 +96,19 @@ config AR7 
     3@@ -96,6 +96,20 @@ config AR7 
    44          Support for the Texas Instruments AR7 System-on-a-Chip 
    55          family: TNETD7100, 7200 and 7300. 
     
    1111+       select DMA_NONCOHERENT 
    1212+       select IRQ_CPU 
     13+       select IRQ_DOMAIN 
    1314+       select SYS_HAS_CPU_MIPS32_R1 
    1415+       select SYS_SUPPORTS_BIG_ENDIAN 
     
    2122        bool "Atheros AR71XX/AR724X/AR913X based boards" 
    2223        select ARCH_REQUIRE_GPIOLIB 
    23 @@ -834,6 +847,7 @@ config MIPS_PARAVIRT 
     24@@ -834,6 +848,7 @@ config MIPS_PARAVIRT 
    2425  
    2526 endchoice 
     
    669670+ * Miscellaneous interrupts, which share IP2. 
    670671+ */ 
    671 +#define AR2315_MISC_IRQ_UART0          (AR231X_MISC_IRQ_BASE+0) 
    672 +#define AR2315_MISC_IRQ_I2C_RSVD       (AR231X_MISC_IRQ_BASE+1) 
    673 +#define AR2315_MISC_IRQ_SPI            (AR231X_MISC_IRQ_BASE+2) 
    674 +#define AR2315_MISC_IRQ_AHB            (AR231X_MISC_IRQ_BASE+3) 
    675 +#define AR2315_MISC_IRQ_APB            (AR231X_MISC_IRQ_BASE+4) 
    676 +#define AR2315_MISC_IRQ_TIMER          (AR231X_MISC_IRQ_BASE+5) 
    677 +#define AR2315_MISC_IRQ_GPIO           (AR231X_MISC_IRQ_BASE+6) 
    678 +#define AR2315_MISC_IRQ_WATCHDOG       (AR231X_MISC_IRQ_BASE+7) 
    679 +#define AR2315_MISC_IRQ_IR_RSVD                (AR231X_MISC_IRQ_BASE+8) 
     672+#define AR2315_MISC_IRQ_UART0          0 
     673+#define AR2315_MISC_IRQ_I2C_RSVD       1 
     674+#define AR2315_MISC_IRQ_SPI            2 
     675+#define AR2315_MISC_IRQ_AHB            3 
     676+#define AR2315_MISC_IRQ_APB            4 
     677+#define AR2315_MISC_IRQ_TIMER          5 
     678+#define AR2315_MISC_IRQ_GPIO           6 
     679+#define AR2315_MISC_IRQ_WATCHDOG       7 
     680+#define AR2315_MISC_IRQ_IR_RSVD                8 
    680681+#define AR2315_MISC_IRQ_COUNT          9 
    681682+ 
     
    11501151+ * Miscellaneous interrupts, which share IP6. 
    11511152+ */ 
    1152 +#define AR5312_MISC_IRQ_TIMER          (AR231X_MISC_IRQ_BASE+0) 
    1153 +#define AR5312_MISC_IRQ_AHB_PROC       (AR231X_MISC_IRQ_BASE+1) 
    1154 +#define AR5312_MISC_IRQ_AHB_DMA                (AR231X_MISC_IRQ_BASE+2) 
    1155 +#define AR5312_MISC_IRQ_GPIO           (AR231X_MISC_IRQ_BASE+3) 
    1156 +#define AR5312_MISC_IRQ_UART0          (AR231X_MISC_IRQ_BASE+4) 
    1157 +#define AR5312_MISC_IRQ_UART0_DMA      (AR231X_MISC_IRQ_BASE+5) 
    1158 +#define AR5312_MISC_IRQ_WATCHDOG       (AR231X_MISC_IRQ_BASE+6) 
    1159 +#define AR5312_MISC_IRQ_LOCAL          (AR231X_MISC_IRQ_BASE+7) 
    1160 +#define AR5312_MISC_IRQ_SPI            (AR231X_MISC_IRQ_BASE+8) 
     1153+#define AR5312_MISC_IRQ_TIMER          0 
     1154+#define AR5312_MISC_IRQ_AHB_PROC       1 
     1155+#define AR5312_MISC_IRQ_AHB_DMA                2 
     1156+#define AR5312_MISC_IRQ_GPIO           3 
     1157+#define AR5312_MISC_IRQ_UART0          4 
     1158+#define AR5312_MISC_IRQ_UART0_DMA      5 
     1159+#define AR5312_MISC_IRQ_WATCHDOG       6 
     1160+#define AR5312_MISC_IRQ_LOCAL          7 
     1161+#define AR5312_MISC_IRQ_SPI            8 
    11611162+#define AR5312_MISC_IRQ_COUNT          9 
    11621163+ 
     
    13541355--- /dev/null 
    13551356+++ b/arch/mips/ath25/ar5312.c 
    1356 @@ -0,0 +1,474 @@ 
     1357@@ -0,0 +1,492 @@ 
    13571358+/* 
    13581359+ * This file is subject to the terms and conditions of the GNU General Public 
     
    13791380+#include <linux/platform_device.h> 
    13801381+#include <linux/kernel.h> 
     1382+#include <linux/bitops.h> 
     1383+#include <linux/irqdomain.h> 
    13811384+#include <linux/reboot.h> 
    13821385+#include <linux/leds.h> 
     
    13951398+ 
    13961399+static void __iomem *ar5312_rst_base; 
     1400+static struct irq_domain *ar5312_misc_irq_domain; 
    13971401+ 
    13981402+static inline u32 ar5312_rst_reg_read(u32 reg) 
     
    14361440+static void ar5312_misc_irq_handler(unsigned irq, struct irq_desc *desc) 
    14371441+{ 
    1438 +       unsigned int ar231x_misc_intrs = ar5312_rst_reg_read(AR5312_ISR) & 
    1439 +                                        ar5312_rst_reg_read(AR5312_IMR); 
    1440 + 
    1441 +       if (ar231x_misc_intrs & AR5312_ISR_TIMER) { 
    1442 +               generic_handle_irq(AR5312_MISC_IRQ_TIMER); 
    1443 +               (void)ar5312_rst_reg_read(AR5312_TIMER); 
    1444 +       } else if (ar231x_misc_intrs & AR5312_ISR_AHBPROC) 
    1445 +               generic_handle_irq(AR5312_MISC_IRQ_AHB_PROC); 
    1446 +       else if ((ar231x_misc_intrs & AR5312_ISR_UART0)) 
    1447 +               generic_handle_irq(AR5312_MISC_IRQ_UART0); 
    1448 +       else if (ar231x_misc_intrs & AR5312_ISR_WD) 
    1449 +               generic_handle_irq(AR5312_MISC_IRQ_WATCHDOG); 
    1450 +       else 
     1442+       u32 pending = ar5312_rst_reg_read(AR5312_ISR) & 
     1443+                     ar5312_rst_reg_read(AR5312_IMR); 
     1444+       unsigned nr, misc_irq = 0; 
     1445+ 
     1446+       if (pending) { 
     1447+               struct irq_domain *domain = irq_get_handler_data(irq); 
     1448+ 
     1449+               nr = __ffs(pending); 
     1450+               misc_irq = irq_find_mapping(domain, nr); 
     1451+       } 
     1452+ 
     1453+       if (misc_irq) { 
     1454+               generic_handle_irq(misc_irq); 
     1455+               if (nr == AR5312_MISC_IRQ_TIMER) 
     1456+                       ar5312_rst_reg_read(AR5312_TIMER); 
     1457+       } else { 
    14511458+               spurious_interrupt(); 
     1459+       } 
    14521460+} 
    14531461+ 
     
    14551463+static void ar5312_misc_irq_unmask(struct irq_data *d) 
    14561464+{ 
    1457 +       unsigned int imr; 
    1458 + 
    1459 +       imr = ar5312_rst_reg_read(AR5312_IMR); 
    1460 +       imr |= 1 << (d->irq - AR231X_MISC_IRQ_BASE); 
    1461 +       ar5312_rst_reg_write(AR5312_IMR, imr); 
     1465+       ar5312_rst_reg_mask(AR5312_IMR, 0, BIT(d->hwirq)); 
    14621466+} 
    14631467+ 
     
    14651469+static void ar5312_misc_irq_mask(struct irq_data *d) 
    14661470+{ 
    1467 +       unsigned int imr; 
    1468 + 
    1469 +       imr = ar5312_rst_reg_read(AR5312_IMR); 
    1470 +       imr &= ~(1 << (d->irq - AR231X_MISC_IRQ_BASE)); 
    1471 +       ar5312_rst_reg_write(AR5312_IMR, imr); 
     1471+       ar5312_rst_reg_mask(AR5312_IMR, BIT(d->hwirq), 0); 
    14721472+       ar5312_rst_reg_read(AR5312_IMR); /* flush write buffer */ 
    14731473+} 
     
    14791479+}; 
    14801480+ 
     1481+static int ar5312_misc_irq_map(struct irq_domain *d, unsigned irq, 
     1482+                              irq_hw_number_t hw) 
     1483+{ 
     1484+       irq_set_chip_and_handler(irq, &ar5312_misc_irq_chip, handle_level_irq); 
     1485+       return 0; 
     1486+} 
     1487+ 
     1488+static struct irq_domain_ops ar5312_misc_irq_domain_ops = { 
     1489+       .map = ar5312_misc_irq_map, 
     1490+}; 
     1491+ 
    14811492+static void ar5312_irq_dispatch(void) 
    14821493+{ 
    1483 +       int pending = read_c0_status() & read_c0_cause(); 
     1494+       u32 pending = read_c0_status() & read_c0_cause(); 
    14841495+ 
    14851496+       if (pending & CAUSEF_IP2) 
     
    15011512+void __init ar5312_arch_init_irq(void) 
    15021513+{ 
    1503 +       int i; 
     1514+       struct irq_domain *domain; 
     1515+       unsigned irq; 
    15041516+ 
    15051517+       ath25_irq_dispatch = ar5312_irq_dispatch; 
    1506 +       for (i = 0; i < AR5312_MISC_IRQ_COUNT; i++) { 
    1507 +               int irq = AR231X_MISC_IRQ_BASE + i; 
    1508 + 
    1509 +               irq_set_chip_and_handler(irq, &ar5312_misc_irq_chip, 
    1510 +                                        handle_level_irq); 
    1511 +       } 
    1512 +       setup_irq(AR5312_MISC_IRQ_AHB_PROC, &ar5312_ahb_err_interrupt); 
     1518+ 
     1519+       domain = irq_domain_add_linear(NULL, AR5312_MISC_IRQ_COUNT, 
     1520+                                      &ar5312_misc_irq_domain_ops, NULL); 
     1521+       if (!domain) 
     1522+               panic("Failed to add IRQ domain"); 
     1523+ 
     1524+       irq = irq_create_mapping(domain, AR5312_MISC_IRQ_AHB_PROC); 
     1525+       setup_irq(irq, &ar5312_ahb_err_interrupt); 
     1526+ 
    15131527+       irq_set_chained_handler(AR5312_IRQ_MISC, ar5312_misc_irq_handler); 
     1528+       irq_set_handler_data(AR5312_IRQ_MISC, domain); 
     1529+ 
     1530+       ar5312_misc_irq_domain = domain; 
    15141531+} 
    15151532+ 
     
    18261843+void __init ar5312_arch_init(void) 
    18271844+{ 
    1828 +       ath25_serial_setup(AR5312_UART0_BASE, AR5312_MISC_IRQ_UART0, 
    1829 +                          ar5312_sys_frequency()); 
     1845+       unsigned irq = irq_create_mapping(ar5312_misc_irq_domain, 
     1846+                                         AR5312_MISC_IRQ_UART0); 
     1847+ 
     1848+       ath25_serial_setup(AR5312_UART0_BASE, irq, ar5312_sys_frequency()); 
    18301849+} 
    18311850--- /dev/null 
    18321851+++ b/arch/mips/ath25/ar2315.c 
    1833 @@ -0,0 +1,418 @@ 
     1852@@ -0,0 +1,438 @@ 
    18341853+/* 
    18351854+ * This file is subject to the terms and conditions of the GNU General Public 
     
    18551874+#include <linux/platform_device.h> 
    18561875+#include <linux/kernel.h> 
     1876+#include <linux/bitops.h> 
     1877+#include <linux/irqdomain.h> 
    18571878+#include <linux/reboot.h> 
    18581879+#include <linux/delay.h> 
     
    18721893+ 
    18731894+static void __iomem *ar2315_rst_base; 
     1895+static struct irq_domain *ar2315_misc_irq_domain; 
    18741896+ 
    18751897+static inline u32 ar2315_rst_reg_read(u32 reg) 
     
    19101932+static void ar2315_misc_irq_handler(unsigned irq, struct irq_desc *desc) 
    19111933+{ 
    1912 +       unsigned int misc_intr = ar2315_rst_reg_read(AR2315_ISR) & 
    1913 +                               ar2315_rst_reg_read(AR2315_IMR); 
    1914 + 
    1915 +       if (misc_intr & AR2315_ISR_SPI) 
    1916 +               generic_handle_irq(AR2315_MISC_IRQ_SPI); 
    1917 +       else if (misc_intr & AR2315_ISR_TIMER) 
    1918 +               generic_handle_irq(AR2315_MISC_IRQ_TIMER); 
    1919 +       else if (misc_intr & AR2315_ISR_AHB) 
    1920 +               generic_handle_irq(AR2315_MISC_IRQ_AHB); 
    1921 +       else if (misc_intr & AR2315_ISR_GPIO) { 
    1922 +               ar2315_rst_reg_write(AR2315_ISR, AR2315_ISR_GPIO); 
    1923 +               generic_handle_irq(AR2315_MISC_IRQ_GPIO); 
    1924 +       } else if (misc_intr & AR2315_ISR_UART0) 
    1925 +               generic_handle_irq(AR2315_MISC_IRQ_UART0); 
    1926 +       else if (misc_intr & AR2315_ISR_WD) { 
    1927 +               ar2315_rst_reg_write(AR2315_ISR, AR2315_ISR_WD); 
    1928 +               generic_handle_irq(AR2315_MISC_IRQ_WATCHDOG); 
    1929 +       } else 
     1934+       u32 pending = ar2315_rst_reg_read(AR2315_ISR) & 
     1935+                     ar2315_rst_reg_read(AR2315_IMR); 
     1936+       unsigned nr, misc_irq = 0; 
     1937+ 
     1938+       if (pending) { 
     1939+               struct irq_domain *domain = irq_get_handler_data(irq); 
     1940+ 
     1941+               nr = __ffs(pending); 
     1942+               misc_irq = irq_find_mapping(domain, nr); 
     1943+       } 
     1944+ 
     1945+       if (misc_irq) { 
     1946+               if (nr == AR2315_MISC_IRQ_GPIO) 
     1947+                       ar2315_rst_reg_write(AR2315_ISR, AR2315_ISR_GPIO); 
     1948+               else if (nr == AR2315_MISC_IRQ_WATCHDOG) 
     1949+                       ar2315_rst_reg_write(AR2315_ISR, AR2315_ISR_WD); 
     1950+               generic_handle_irq(misc_irq); 
     1951+       } else { 
    19301952+               spurious_interrupt(); 
     1953+       } 
    19311954+} 
    19321955+ 
    19331956+static void ar2315_misc_irq_unmask(struct irq_data *d) 
    19341957+{ 
    1935 +       unsigned int imr; 
    1936 + 
    1937 +       imr = ar2315_rst_reg_read(AR2315_IMR); 
    1938 +       imr |= 1 << (d->irq - AR231X_MISC_IRQ_BASE); 
    1939 +       ar2315_rst_reg_write(AR2315_IMR, imr); 
     1958+       ar2315_rst_reg_mask(AR2315_IMR, 0, BIT(d->hwirq)); 
    19401959+} 
    19411960+ 
    19421961+static void ar2315_misc_irq_mask(struct irq_data *d) 
    19431962+{ 
    1944 +       unsigned int imr; 
    1945 + 
    1946 +       imr = ar2315_rst_reg_read(AR2315_IMR); 
    1947 +       imr &= ~(1 << (d->irq - AR231X_MISC_IRQ_BASE)); 
    1948 +       ar2315_rst_reg_write(AR2315_IMR, imr); 
     1963+       ar2315_rst_reg_mask(AR2315_IMR, BIT(d->hwirq), 0); 
    19491964+} 
    19501965+ 
     
    19531968+       .irq_unmask     = ar2315_misc_irq_unmask, 
    19541969+       .irq_mask       = ar2315_misc_irq_mask, 
     1970+}; 
     1971+ 
     1972+static int ar2315_misc_irq_map(struct irq_domain *d, unsigned irq, 
     1973+                              irq_hw_number_t hw) 
     1974+{ 
     1975+       irq_set_chip_and_handler(irq, &ar2315_misc_irq_chip, handle_level_irq); 
     1976+       return 0; 
     1977+} 
     1978+ 
     1979+static struct irq_domain_ops ar2315_misc_irq_domain_ops = { 
     1980+       .map = ar2315_misc_irq_map, 
    19551981+}; 
    19561982+ 
     
    19651991+static void ar2315_irq_dispatch(void) 
    19661992+{ 
    1967 +       int pending = read_c0_status() & read_c0_cause(); 
     1993+       u32 pending = read_c0_status() & read_c0_cause(); 
    19681994+ 
    19691995+       if (pending & CAUSEF_IP3) 
     
    19812007+void __init ar2315_arch_init_irq(void) 
    19822008+{ 
    1983 +       int i; 
     2009+       struct irq_domain *domain; 
     2010+       unsigned irq; 
    19842011+ 
    19852012+       ath25_irq_dispatch = ar2315_irq_dispatch; 
    1986 +       for (i = 0; i < AR2315_MISC_IRQ_COUNT; i++) { 
    1987 +               int irq = AR231X_MISC_IRQ_BASE + i; 
    1988 + 
    1989 +               irq_set_chip_and_handler(irq, &ar2315_misc_irq_chip, 
    1990 +                                        handle_level_irq); 
    1991 +       } 
    1992 +       setup_irq(AR2315_MISC_IRQ_AHB, &ar2315_ahb_err_interrupt); 
     2013+ 
     2014+       domain = irq_domain_add_linear(NULL, AR2315_MISC_IRQ_COUNT, 
     2015+                                      &ar2315_misc_irq_domain_ops, NULL); 
     2016+       if (!domain) 
     2017+               panic("Failed to add IRQ domain"); 
     2018+ 
     2019+       irq = irq_create_mapping(domain, AR2315_MISC_IRQ_AHB); 
     2020+       setup_irq(irq, &ar2315_ahb_err_interrupt); 
     2021+ 
    19932022+       irq_set_chained_handler(AR2315_IRQ_MISC, ar2315_misc_irq_handler); 
     2023+       irq_set_handler_data(AR2315_IRQ_MISC, domain); 
     2024+ 
     2025+       ar2315_misc_irq_domain = domain; 
    19942026+} 
    19952027+ 
     
    20472079+       { 
    20482080+               .flags = IORESOURCE_IRQ, 
    2049 +               .start = AR2315_MISC_IRQ_WATCHDOG, 
    2050 +               .end = AR2315_MISC_IRQ_WATCHDOG, 
    20512081+       } 
    20522082+}; 
     
    21102140+ 
    21112141+       ar2315_init_gpio_leds(); 
     2142+ 
     2143+       ar2315_wdt_res[1].start = irq_create_mapping(ar2315_misc_irq_domain, 
     2144+                                                    AR2315_MISC_IRQ_WATCHDOG); 
     2145+       ar2315_wdt_res[1].end = ar2315_wdt_res[1].start; 
    21122146+       platform_device_register(&ar2315_wdt); 
     2147+ 
    21132148+       platform_device_register(&ar2315_spiflash); 
     2149+ 
    21142150+       ath25_add_ethernet(0, AR2315_ENET0_BASE, "eth0_mii", 
    21152151+                          AR2315_ENET0_MII_BASE, AR2315_IRQ_ENET0, 
    21162152+                          &ar2315_eth_data); 
     2153+ 
    21172154+       ath25_add_wmac(0, AR2315_WLAN0_BASE, AR2315_IRQ_WLAN0); 
    21182155+} 
     
    22472284+void __init ar2315_arch_init(void) 
    22482285+{ 
    2249 +       ath25_serial_setup(AR2315_UART0_BASE, AR2315_MISC_IRQ_UART0, 
    2250 +                          ar2315_apb_frequency()); 
     2286+       unsigned irq = irq_create_mapping(ar2315_misc_irq_domain, 
     2287+                                         AR2315_MISC_IRQ_UART0); 
     2288+ 
     2289+       ath25_serial_setup(AR2315_UART0_BASE, irq, ar2315_apb_frequency()); 
    22512290+} 
    22522291--- /dev/null 
     
    23302369--- /dev/null 
    23312370+++ b/arch/mips/ath25/devices.h 
    2332 @@ -0,0 +1,46 @@ 
     2371@@ -0,0 +1,45 @@ 
    23332372+#ifndef __ATH25_DEVICES_H 
    23342373+#define __ATH25_DEVICES_H 
    23352374+ 
    2336 +#define AR231X_MISC_IRQ_BASE           0x20 
    23372375+#define AR231X_GPIO_IRQ_BASE           0x30 
    23382376+ 
  • trunk/target/linux/atheros/patches-3.18/101-early-printk-support.patch

    r44726 r44727  
    6161--- a/arch/mips/Kconfig 
    6262+++ b/arch/mips/Kconfig 
    63 @@ -106,6 +106,7 @@ config ATH25 
     63@@ -107,6 +107,7 @@ config ATH25 
    6464        select SYS_SUPPORTS_BIG_ENDIAN 
    6565        select SYS_SUPPORTS_32BIT_KERNEL 
  • trunk/target/linux/atheros/patches-3.18/102-ar5312_gpio.patch

    r44726 r44727  
    1111--- a/arch/mips/ath25/ar5312.c 
    1212+++ b/arch/mips/ath25/ar5312.c 
    13 @@ -205,6 +205,22 @@ static struct platform_device ar5312_phy 
     13@@ -221,6 +221,22 @@ static struct platform_device ar5312_phy 
    1414        .num_resources = 1, 
    1515 }; 
     
    3434 static struct gpio_led ar5312_leds[] = { 
    3535        { .name = "wlan", .gpio = 0, .active_low = 1, }, 
    36 @@ -290,6 +306,8 @@ void __init ar5312_init_devices(void) 
     36@@ -306,6 +322,8 @@ void __init ar5312_init_devices(void) 
    3737  
    3838        platform_device_register(&ar5312_physmap_flash); 
  • trunk/target/linux/atheros/patches-3.18/103-ar2315_gpio.patch

    r44725 r44727  
    99--- a/arch/mips/ath25/ar2315.c 
    1010+++ b/arch/mips/ath25/ar2315.c 
    11 @@ -225,6 +225,34 @@ static struct platform_device ar2315_wdt 
     11@@ -236,6 +236,32 @@ static struct platform_device ar2315_wdt 
    1212        .num_resources = ARRAY_SIZE(ar2315_wdt_res) 
    1313 }; 
     
    2323+               .name = "ar2315-gpio", 
    2424+               .flags = IORESOURCE_IRQ, 
    25 +               .start = AR2315_MISC_IRQ_GPIO, 
    26 +               .end = AR2315_MISC_IRQ_GPIO, 
    2725+       }, 
    2826+       { 
     
    4442 static struct gpio_led ar2315_leds[6]; 
    4543 static struct gpio_led_platform_data ar2315_led_data = { 
    46 @@ -275,6 +303,7 @@ void __init ar2315_init_devices(void) 
     44@@ -286,6 +312,11 @@ void __init ar2315_init_devices(void) 
    4745        ath25_find_config(AR2315_SPI_READ_BASE, AR2315_SPI_READ_SIZE); 
    4846        ar2315_eth_data.macaddr = ath25_board.config->enet0_mac; 
    4947  
     48+       ar2315_gpio_res[1].start = irq_create_mapping(ar2315_misc_irq_domain, 
     49+                                                     AR2315_MISC_IRQ_GPIO); 
     50+       ar2315_gpio_res[1].end = ar2315_gpio_res[1].start; 
    5051+       platform_device_register(&ar2315_gpio); 
     52+ 
    5153        ar2315_init_gpio_leds(); 
    52         platform_device_register(&ar2315_wdt); 
    53         platform_device_register(&ar2315_spiflash); 
     54  
     55        ar2315_wdt_res[1].start = irq_create_mapping(ar2315_misc_irq_domain, 
    5456--- a/drivers/gpio/Kconfig 
    5557+++ b/drivers/gpio/Kconfig 
  • trunk/target/linux/atheros/patches-3.18/105-ar2315_pci.patch

    r44726 r44727  
    1111--- /dev/null 
    1212+++ b/arch/mips/pci/pci-ar2315.c 
    13 @@ -0,0 +1,494 @@ 
     13@@ -0,0 +1,511 @@ 
    1414+/* 
    1515+ * This program is free software; you can redistribute it and/or 
     
    4848+ * Fonera 2.0g (FON2202). It has a USB EHCI controller connected to the 
    4949+ * AR2315 PCI bus. IDSEL pin of USB controller is connected to AD[13] line 
    50 + * and IDSEL pin of AR125 is connected to AD[16] line. 
     50+ * and IDSEL pin of AR2315 is connected to AD[16] line. 
    5151+ */ 
    5252+ 
     
    5858+#include <linux/mm.h> 
    5959+#include <linux/delay.h> 
     60+#include <linux/bitops.h> 
    6061+#include <linux/irq.h> 
     62+#include <linux/irqdomain.h> 
    6163+#include <linux/io.h> 
    6264+#include <asm/paccess.h> 
     
    151153+ * Keep ordered according to AR2315_PCI_INT_XXX bits 
    152154+ */ 
    153 +#define AR2315_PCI_IRQ_BASE            0x50 
    154 +#define AR2315_PCI_IRQ_EXT             (AR2315_PCI_IRQ_BASE+0) 
    155 +#define AR2315_PCI_IRQ_ABORT           (AR2315_PCI_IRQ_BASE+1) 
    156 +#define AR2315_PCI_IRQ_COUNT           2 
    157 +#define AR2315_PCI_IRQ_SHIFT           25      /* in AR2315_PCI_INT_STATUS */ 
     155+#define AR2315_PCI_IRQ_EXT             25 
     156+#define AR2315_PCI_IRQ_ABORT           26 
     157+#define AR2315_PCI_IRQ_COUNT           27 
    158158+ 
    159159+/* Arbitrary size of memory region to access the configuration space */ 
     
    174174+       void __iomem *mmr_mem; 
    175175+       unsigned irq; 
     176+       unsigned irq_ext; 
     177+       struct irq_domain *domain; 
    176178+       struct pci_controller pci_ctrl; 
    177179+       struct resource mem_res; 
     
    335337+       u32 pending = ar2315_pci_reg_read(apc, AR2315_PCI_ISR) & 
    336338+                     ar2315_pci_reg_read(apc, AR2315_PCI_IMR); 
    337 + 
    338 +       if (pending & AR2315_PCI_INT_EXT) 
    339 +               generic_handle_irq(AR2315_PCI_IRQ_EXT); 
    340 +       else if (pending & AR2315_PCI_INT_ABORT) 
    341 +               generic_handle_irq(AR2315_PCI_IRQ_ABORT); 
     339+       unsigned pci_irq = 0; 
     340+ 
     341+       if (pending) 
     342+               pci_irq = irq_find_mapping(apc->domain, __ffs(pending)); 
     343+ 
     344+       if (pci_irq) 
     345+               generic_handle_irq(pci_irq); 
    342346+       else 
    343347+               spurious_interrupt(); 
     
    347351+{ 
    348352+       struct ar2315_pci_ctrl *apc = irq_data_get_irq_chip_data(d); 
    349 +       u32 m = 1 << (d->irq - AR2315_PCI_IRQ_BASE + AR2315_PCI_IRQ_SHIFT); 
    350 + 
    351 +       ar2315_pci_reg_mask(apc, AR2315_PCI_IMR, m, 0); 
     353+ 
     354+       ar2315_pci_reg_mask(apc, AR2315_PCI_IMR, BIT(d->hwirq), 0); 
    352355+} 
    353356+ 
     
    355358+{ 
    356359+       struct ar2315_pci_ctrl *apc = irq_data_get_irq_chip_data(d); 
    357 +       u32 m = 1 << (d->irq - AR2315_PCI_IRQ_BASE + AR2315_PCI_IRQ_SHIFT); 
     360+       u32 m = BIT(d->hwirq); 
    358361+ 
    359362+       ar2315_pci_reg_mask(apc, AR2315_PCI_IMR, m, 0); 
     
    364367+{ 
    365368+       struct ar2315_pci_ctrl *apc = irq_data_get_irq_chip_data(d); 
    366 +       u32 m = 1 << (d->irq - AR2315_PCI_IRQ_BASE + AR2315_PCI_IRQ_SHIFT); 
    367 + 
    368 +       ar2315_pci_reg_mask(apc, AR2315_PCI_IMR, 0, m); 
     369+ 
     370+       ar2315_pci_reg_mask(apc, AR2315_PCI_IMR, 0, BIT(d->hwirq)); 
    369371+} 
    370372+ 
     
    376378+}; 
    377379+ 
     380+static int ar2315_pci_irq_map(struct irq_domain *d, unsigned irq, 
     381+                             irq_hw_number_t hw) 
     382+{ 
     383+       irq_set_chip_and_handler(irq, &ar2315_pci_irq_chip, handle_level_irq); 
     384+       irq_set_chip_data(irq, d->host_data); 
     385+       return 0; 
     386+} 
     387+ 
     388+static struct irq_domain_ops ar2315_pci_irq_domain_ops = { 
     389+       .map = ar2315_pci_irq_map, 
     390+}; 
     391+ 
    378392+static void ar2315_pci_irq_init(struct ar2315_pci_ctrl *apc) 
    379393+{ 
    380 +       int i; 
    381 + 
    382394+       ar2315_pci_reg_mask(apc, AR2315_PCI_IER, AR2315_PCI_IER_ENABLE, 0); 
    383395+       ar2315_pci_reg_mask(apc, AR2315_PCI_IMR, (AR2315_PCI_INT_ABORT | 
    384396+                           AR2315_PCI_INT_EXT), 0); 
    385397+ 
    386 +       for (i = 0; i < AR2315_PCI_IRQ_COUNT; ++i) { 
    387 +               int irq = AR2315_PCI_IRQ_BASE + i; 
    388 + 
    389 +               irq_set_chip_and_handler(irq, &ar2315_pci_irq_chip, 
    390 +                                        handle_level_irq); 
    391 +               irq_set_chip_data(irq, apc); 
    392 +       } 
     398+       apc->irq_ext = irq_create_mapping(apc->domain, AR2315_PCI_IRQ_EXT); 
    393399+ 
    394400+       irq_set_chained_handler(apc->irq, ar2315_pci_irq_handler); 
     
    466472+               return err; 
    467473+ 
     474+       apc->domain = irq_domain_add_linear(NULL, AR2315_PCI_IRQ_COUNT, 
     475+                                           &ar2315_pci_irq_domain_ops, apc); 
     476+       if (!apc->domain) { 
     477+               dev_err(dev, "failed to add IRQ domain\n"); 
     478+               return -ENOMEM; 
     479+       } 
     480+ 
    468481+       ar2315_pci_irq_init(apc); 
    469482+ 
     
    479492+ 
    480493+       register_pci_controller(&apc->pci_ctrl); 
     494+ 
     495+       dev_info(dev, "register PCI controller\n"); 
    481496+ 
    482497+       return 0; 
     
    499514+int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin) 
    500515+{ 
    501 +       return AR2315_PCI_IRQ_EXT; 
     516+       struct ar2315_pci_ctrl *apc = ar2315_pci_bus_to_apc(dev->bus); 
     517+ 
     518+       return slot ? 0 : apc->irq_ext; 
    502519+} 
    503520+ 
     
    521538--- a/arch/mips/ath25/ar2315.c 
    522539+++ b/arch/mips/ath25/ar2315.c 
    523 @@ -137,6 +137,10 @@ static void ar2315_irq_dispatch(void) 
     540@@ -144,6 +144,10 @@ static void ar2315_irq_dispatch(void) 
    524541                do_IRQ(AR2315_IRQ_WLAN0); 
    525542        else if (pending & CAUSEF_IP4) 
     
    532549                do_IRQ(AR2315_IRQ_MISC); 
    533550        else if (pending & CAUSEF_IP7) 
    534 @@ -440,8 +444,60 @@ void __init ar2315_plat_mem_setup(void) 
     551@@ -460,10 +464,62 @@ void __init ar2315_plat_mem_setup(void) 
    535552        _machine_restart = ar2315_restart; 
    536553 } 
     
    561578 void __init ar2315_arch_init(void) 
    562579 { 
    563         ath25_serial_setup(AR2315_UART0_BASE, AR2315_MISC_IRQ_UART0, 
    564                            ar2315_apb_frequency()); 
     580        unsigned irq = irq_create_mapping(ar2315_misc_irq_domain, 
     581                                          AR2315_MISC_IRQ_UART0); 
     582  
     583        ath25_serial_setup(AR2315_UART0_BASE, irq, ar2315_apb_frequency()); 
    565584+ 
    566585+#ifdef CONFIG_PCI_AR2315 
Note: See TracChangeset for help on using the changeset viewer.