Changeset 42512


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

atheros: convert AR2315 GPIO code to platform driver

Convert gpiolib realization to platform driver and move to the
appropriate subdirectory. Misc GPIO interrupt acknowledgement placed
to the MISC IRQ handler since in fact we can detect only one GPIO state
change.

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

Location:
trunk/target/linux/atheros
Files:
1 added
3 edited

Legend:

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

    r42511 r42512  
    4545CONFIG_GENERIC_SMP_IDLE_THREAD=y 
    4646CONFIG_GPIOLIB=y 
     47CONFIG_GPIO_AR2315=y 
    4748CONFIG_GPIO_AR5312=y 
    4849CONFIG_GPIO_DEVRES=y 
  • trunk/target/linux/atheros/patches-3.14/100-board.patch

    r42511 r42512  
    660660--- /dev/null 
    661661+++ b/arch/mips/include/asm/mach-ar231x/ar2315_regs.h 
    662 @@ -0,0 +1,630 @@ 
     662@@ -0,0 +1,608 @@ 
    663663+/* 
    664664+ * Register definitions for AR2315+ 
     
    10031003+#define AMBACLK_CLK_DIV_S           2 
    10041004+ 
    1005 +/* 
    1006 + * GPIO 
    1007 + */ 
    1008 +#define AR2315_GPIO_DI          (AR2315_DSLBASE + 0x0088) 
    1009 +#define AR2315_GPIO_DO          (AR2315_DSLBASE + 0x0090) 
    1010 +#define AR2315_GPIO_DIR         (AR2315_DSLBASE + 0x0098) 
    1011 +#define AR2315_GPIO_INT         (AR2315_DSLBASE + 0x00a0) 
    1012 + 
    1013 +#define AR2315_GPIO_DIR_M(x)               (1 << (x))       /* mask for i/o */ 
    1014 +#define AR2315_GPIO_DIR_O(x)               (1 << (x))       /* output */ 
    1015 +#define AR2315_GPIO_DIR_I(x)               (0)              /* input */ 
    1016 + 
    1017 +#define AR2315_GPIO_INT_S(x)   (x)             /* interrupt enable */ 
    1018 +#define AR2315_GPIO_INT_M      (0x3F)          /* mask for int */ 
    1019 +#define AR2315_GPIO_INT_LVL(x) ((x) << 6)      /* interrupt level */ 
    1020 +#define AR2315_GPIO_INT_LVL_M  ((0x3) << 6)    /* mask for int level */ 
    1021 + 
    1022 +#define AR2315_GPIO_INT_MAX_Y          1   /* Maximum value of Y for 
    1023 +                                            * AR2315_GPIO_INT_* macros */ 
    1024 +#define AR2315_GPIO_INT_LVL_OFF                0   /* Triggerring off */ 
    1025 +#define AR2315_GPIO_INT_LVL_LOW                1   /* Low Level Triggered */ 
    1026 +#define AR2315_GPIO_INT_LVL_HIGH       2   /* High Level Triggered */ 
    1027 +#define AR2315_GPIO_INT_LVL_EDGE       3   /* Edge Triggered */ 
     1005+/* GPIO MMR base address */ 
     1006+#define AR2315_GPIO                    (AR2315_DSLBASE + 0x0088) 
    10281007+ 
    10291008+#define AR2315_RESET_GPIO       5 
    1030 +#define AR2315_NUM_GPIO         22 
    10311009+ 
    10321010+/* 
     
    20101988--- /dev/null 
    20111989+++ b/arch/mips/ar231x/ar2315.c 
    2012 @@ -0,0 +1,570 @@ 
     1990@@ -0,0 +1,431 @@ 
    20131991+/* 
    20141992+ * This file is subject to the terms and conditions of the GNU General Public 
     
    20502028+#include "ar2315.h" 
    20512029+ 
    2052 +static u32 gpiointmask, gpiointval; 
    2053 + 
    2054 +static void ar2315_gpio_irq_handler(unsigned irq, struct irq_desc *desc) 
    2055 +{ 
    2056 +       u32 pend; 
    2057 +       int bit = -1; 
    2058 + 
    2059 +       /* only do one gpio interrupt at a time */ 
    2060 +       pend = (ar231x_read_reg(AR2315_GPIO_DI) ^ gpiointval) & gpiointmask; 
    2061 + 
    2062 +       if (pend) { 
    2063 +               bit = fls(pend) - 1; 
    2064 +               pend &= ~(1 << bit); 
    2065 +               gpiointval ^= (1 << bit); 
    2066 +       } 
    2067 + 
    2068 +       if (!pend) 
    2069 +               ar231x_write_reg(AR2315_ISR, AR2315_ISR_GPIO); 
    2070 + 
    2071 +       /* Enable interrupt with edge detection */ 
    2072 +       if ((ar231x_read_reg(AR2315_GPIO_DIR) & AR2315_GPIO_DIR_M(bit)) != 
    2073 +           AR2315_GPIO_DIR_I(bit)) 
    2074 +               return; 
    2075 + 
    2076 +       if (bit >= 0) 
    2077 +               generic_handle_irq(AR231X_GPIO_IRQ_BASE + bit); 
    2078 +} 
    2079 + 
    20802030+static void ar2315_misc_irq_handler(unsigned irq, struct irq_desc *desc) 
    20812031+{ 
     
    20892039+       else if (misc_intr & AR2315_ISR_AHB) 
    20902040+               generic_handle_irq(AR2315_MISC_IRQ_AHB); 
    2091 +       else if (misc_intr & AR2315_ISR_GPIO) 
     2041+       else if (misc_intr & AR2315_ISR_GPIO) { 
     2042+               ar231x_write_reg(AR2315_ISR, AR2315_ISR_GPIO); 
    20922043+               generic_handle_irq(AR2315_MISC_IRQ_GPIO); 
    2093 +       else if (misc_intr & AR2315_ISR_UART0) 
     2044+       } else if (misc_intr & AR2315_ISR_UART0) 
    20942045+               generic_handle_irq(AR2315_MISC_IRQ_UART0); 
    20952046+       else if (misc_intr & AR2315_ISR_WD) { 
     
    21252076+} 
    21262077+ 
    2127 +static void ar2315_set_gpiointmask(int gpio, int level) 
    2128 +{ 
    2129 +       u32 reg; 
    2130 + 
    2131 +       reg = ar231x_read_reg(AR2315_GPIO_INT); 
    2132 +       reg &= ~(AR2315_GPIO_INT_M | AR2315_GPIO_INT_LVL_M); 
    2133 +       reg |= gpio | AR2315_GPIO_INT_LVL(level); 
    2134 +       ar231x_write_reg(AR2315_GPIO_INT, reg); 
    2135 +} 
    2136 + 
    2137 +static void ar2315_gpio_irq_unmask(struct irq_data *d) 
    2138 +{ 
    2139 +       unsigned int gpio = d->irq - AR231X_GPIO_IRQ_BASE; 
    2140 + 
    2141 +       /* Enable interrupt with edge detection */ 
    2142 +       if ((ar231x_read_reg(AR2315_GPIO_DIR) & AR2315_GPIO_DIR_M(gpio)) != 
    2143 +           AR2315_GPIO_DIR_I(gpio)) 
    2144 +               return; 
    2145 + 
    2146 +       gpiointmask |= (1 << gpio); 
    2147 +       ar2315_set_gpiointmask(gpio, 3); 
    2148 +} 
    2149 + 
    2150 +static void ar2315_gpio_irq_mask(struct irq_data *d) 
    2151 +{ 
    2152 +       unsigned int gpio = d->irq - AR231X_GPIO_IRQ_BASE; 
    2153 + 
    2154 +       /* Disable interrupt */ 
    2155 +       gpiointmask &= ~(1 << gpio); 
    2156 +       ar2315_set_gpiointmask(gpio, 0); 
    2157 +} 
    2158 + 
    2159 +static struct irq_chip ar2315_gpio_irq_chip = { 
    2160 +       .name           = "AR2315-GPIO", 
    2161 +       .irq_unmask     = ar2315_gpio_irq_unmask, 
    2162 +       .irq_mask       = ar2315_gpio_irq_mask, 
    2163 +}; 
    2164 + 
    21652078+static void 
    21662079+ar2315_misc_irq_unmask(struct irq_data *d) 
     
    22142127+ 
    22152128+       ar231x_irq_dispatch = ar2315_irq_dispatch; 
    2216 +       gpiointval = ar231x_read_reg(AR2315_GPIO_DI); 
    22172129+       for (i = 0; i < AR2315_MISC_IRQ_COUNT; i++) { 
    22182130+               int irq = AR231X_MISC_IRQ_BASE + i; 
     
    22212133+                                        handle_level_irq); 
    22222134+       } 
    2223 +       for (i = 0; i < AR2315_NUM_GPIO; i++) { 
    2224 +               int irq = AR231X_GPIO_IRQ_BASE + i; 
    2225 + 
    2226 +               irq_set_chip_and_handler(irq, &ar2315_gpio_irq_chip, 
    2227 +                                        handle_level_irq); 
    2228 +       } 
    2229 +       irq_set_chained_handler(AR2315_MISC_IRQ_GPIO, ar2315_gpio_irq_handler); 
    22302135+       setup_irq(AR2315_MISC_IRQ_AHB, &ar2315_ahb_proc_interrupt); 
    22312136+       irq_set_chained_handler(AR2315_IRQ_MISC_INTRS, ar2315_misc_irq_handler); 
    22322137+} 
    2233 + 
    2234 +/* 
    2235 + * gpiolib implementation 
    2236 + */ 
    2237 +static int 
    2238 +ar2315_gpio_get_value(struct gpio_chip *chip, unsigned gpio) 
    2239 +{ 
    2240 +       return (ar231x_read_reg(AR2315_GPIO_DI) >> gpio) & 1; 
    2241 +} 
    2242 + 
    2243 +static void 
    2244 +ar2315_gpio_set_value(struct gpio_chip *chip, unsigned gpio, int value) 
    2245 +{ 
    2246 +       u32 reg = ar231x_read_reg(AR2315_GPIO_DO); 
    2247 + 
    2248 +       reg = value ? reg | (1 << gpio) : reg & ~(1 << gpio); 
    2249 +       ar231x_write_reg(AR2315_GPIO_DO, reg); 
    2250 +} 
    2251 + 
    2252 +static int 
    2253 +ar2315_gpio_direction_input(struct gpio_chip *chip, unsigned gpio) 
    2254 +{ 
    2255 +       ar231x_mask_reg(AR2315_GPIO_DIR, 1 << gpio, 0); 
    2256 +       return 0; 
    2257 +} 
    2258 + 
    2259 +static int 
    2260 +ar2315_gpio_direction_output(struct gpio_chip *chip, unsigned gpio, int value) 
    2261 +{ 
    2262 +       ar231x_mask_reg(AR2315_GPIO_DIR, 0, 1 << gpio); 
    2263 +       ar2315_gpio_set_value(chip, gpio, value); 
    2264 +       return 0; 
    2265 +} 
    2266 + 
    2267 +static int ar2315_gpio_to_irq(struct gpio_chip *chip, unsigned gpio) 
    2268 +{ 
    2269 +       return AR231X_GPIO_IRQ_BASE + gpio; 
    2270 +} 
    2271 + 
    2272 +static struct gpio_chip ar2315_gpio_chip = { 
    2273 +       .label                  = "ar2315-gpio", 
    2274 +       .direction_input        = ar2315_gpio_direction_input, 
    2275 +       .direction_output       = ar2315_gpio_direction_output, 
    2276 +       .set                    = ar2315_gpio_set_value, 
    2277 +       .get                    = ar2315_gpio_get_value, 
    2278 +       .to_irq                 = ar2315_gpio_to_irq, 
    2279 +       .base                   = 0, 
    2280 +       .ngpio                  = AR2315_NUM_GPIO, /* 22 */ 
    2281 +}; 
    2282 + 
    2283 +/* end of gpiolib */ 
    22842138+ 
    22852139+static void ar2315_device_reset_set(u32 mask) 
     
    25102364+ 
    25112365+       mips_hpt_frequency = ar2315_cpu_frequency() / 2; 
    2512 +} 
    2513 + 
    2514 +static int __init 
    2515 +ar2315_gpio_init(void) 
    2516 +{ 
    2517 +       int ret = gpiochip_add(&ar2315_gpio_chip); 
    2518 + 
    2519 +       if (ret) { 
    2520 +               pr_err("%s: failed to add gpiochip\n", ar2315_gpio_chip.label); 
    2521 +               return ret; 
    2522 +       } 
    2523 +       pr_info("%s: registered %d GPIOs\n", ar2315_gpio_chip.label, 
    2524 +               ar2315_gpio_chip.ngpio); 
    2525 +       return ret; 
    25262366+} 
    25272367+ 
     
    25582398+               break; 
    25592399+       } 
    2560 +       ar2315_gpio_init(); 
    25612400+       ar231x_board.devid = devid; 
    25622401+} 
  • trunk/target/linux/atheros/patches-3.14/105-ar2315_pci.patch

    r42511 r42512  
    359359--- a/arch/mips/ar231x/Kconfig 
    360360+++ b/arch/mips/ar231x/Kconfig 
    361 @@ -8,3 +8,10 @@ config SOC_AR2315 
    362         bool "Atheros 2315+ support" 
     361@@ -9,3 +9,10 @@ config SOC_AR2315 
    363362        depends on ATHEROS_AR231X 
     363        select GPIO_AR2315 
    364364        default y 
    365365+ 
     
    372372--- a/arch/mips/ar231x/ar2315.c 
    373373+++ b/arch/mips/ar231x/ar2315.c 
    374 @@ -104,6 +104,10 @@ ar2315_irq_dispatch(void) 
     374@@ -77,6 +77,10 @@ ar2315_irq_dispatch(void) 
    375375                do_IRQ(AR2315_IRQ_WLAN0_INTRS); 
    376376        else if (pending & CAUSEF_IP4) 
     
    383383                do_IRQ(AR2315_IRQ_MISC_INTRS); 
    384384        else if (pending & CAUSEF_IP7) 
    385 @@ -568,3 +572,18 @@ ar2315_plat_setup(void) 
     385@@ -458,3 +462,18 @@ ar2315_plat_setup(void) 
    386386        ar231x_serial_setup(AR2315_UART0, AR2315_MISC_IRQ_UART0, 
    387387                            ar2315_apb_frequency()); 
Note: See TracChangeset for help on using the changeset viewer.