Changeset 33462


Ignore:
Timestamp:
2012-09-19T12:17:51+02:00 (4 years ago)
Author:
hauke
Message:

[brcm47xx]: update gpio patches

Location:
trunk/target/linux/brcm47xx
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/brcm47xx/config-3.3

    r33383 r33462  
    1717CONFIG_BCMA_DEBUG=y 
    1818CONFIG_BCMA_DRIVER_GMAC_CMN=y 
    19 CONFIG_BCMA_DRIVER_GPIO=y 
    2019CONFIG_BCMA_DRIVER_MIPS=y 
    2120CONFIG_BCMA_DRIVER_PCI_HOSTMODE=y 
  • trunk/target/linux/brcm47xx/patches-3.3/501-bcma-add-gpio-driver.patch

    r33001 r33462  
    1 --- a/drivers/bcma/Kconfig 
    2 +++ b/drivers/bcma/Kconfig 
    3 @@ -39,6 +39,11 @@ config BCMA_HOST_SOC 
    4         depends on BCMA_DRIVER_MIPS 
    5         select USB_HCD_BCMA if USB_EHCI_HCD || USB_OHCI_HCD 
     1--- a/drivers/bcma/driver_chipcommon.c 
     2+++ b/drivers/bcma/driver_chipcommon.c 
     3@@ -57,6 +57,8 @@ void bcma_core_chipcommon_init(struct bc 
     4                         (leddc_off << BCMA_CC_GPIOTIMER_OFFTIME_SHIFT))); 
     5        } 
    66  
    7 +config BCMA_DRIVER_GPIO 
    8 +       bool 
    9 +       depends on BCMA_DRIVER_MIPS 
    10 +       default y 
     7+       spin_lock_init(&cc->gpio_lock); 
    118+ 
    12  config BCMA_SFLASH 
    13         bool 
    14         depends on BCMA_DRIVER_MIPS 
    15 --- a/drivers/bcma/Makefile 
    16 +++ b/drivers/bcma/Makefile 
    17 @@ -6,6 +6,7 @@ bcma-y                                  += driver_pci.o 
    18  bcma-$(CONFIG_BCMA_DRIVER_PCI_HOSTMODE)        += driver_pci_host.o 
    19  bcma-$(CONFIG_BCMA_DRIVER_MIPS)                += driver_mips.o 
    20  bcma-$(CONFIG_BCMA_DRIVER_GMAC_CMN)    += driver_gmac_cmn.o 
    21 +bcma-$(CONFIG_BCMA_DRIVER_GPIO)                += driver_gpio.o 
    22  bcma-$(CONFIG_BCMA_HOST_PCI)           += host_pci.o 
    23  bcma-$(CONFIG_BCMA_HOST_SOC)           += host_soc.o 
    24  obj-$(CONFIG_BCMA)                     += bcma.o 
    25 --- /dev/null 
    26 +++ b/drivers/bcma/driver_gpio.c 
    27 @@ -0,0 +1,90 @@ 
    28 +/* 
    29 + * Broadcom specific AMBA 
    30 + * GPIO driver for SoCs 
    31 + * 
    32 + * Copyright 2012, Hauke Mehrtens <hauke@hauke-m.de> 
    33 + * 
    34 + * Licensed under the GNU/GPL. See COPYING for details. 
    35 + */ 
     9        cc->setup_done = true; 
     10 } 
     11  
     12@@ -79,34 +81,81 @@ u32 bcma_chipco_irq_status(struct bcma_d 
     13  
     14 u32 bcma_chipco_gpio_in(struct bcma_drv_cc *cc, u32 mask) 
     15 { 
     16-       return bcma_cc_read32(cc, BCMA_CC_GPIOIN) & mask; 
     17+       unsigned long flags; 
     18+       u32 res; 
    3619+ 
    37 +#include <linux/export.h> 
    38 +#include <linux/bcma/bcma.h> 
    39 +#include <linux/bcma/bcma_driver_gpio.h> 
    40 + 
    41 +u32 bcma_gpio_in(struct bcma_bus *bus, u32 mask) 
    42 +{ 
    43 +       unsigned long flags; 
    44 +       u32 res = 0; 
    45 + 
    46 +       spin_lock_irqsave(&bus->gpio_lock, flags); 
    47 +       res = bcma_chipco_gpio_in(&bus->drv_cc, mask); 
    48 +       spin_unlock_irqrestore(&bus->gpio_lock, flags); 
     20+       spin_lock_irqsave(&cc->gpio_lock, flags); 
     21+       res = bcma_cc_read32(cc, BCMA_CC_GPIOIN) & mask; 
     22+       spin_unlock_irqrestore(&cc->gpio_lock, flags); 
    4923+ 
    5024+       return res; 
    51 +} 
    52 +EXPORT_SYMBOL(bcma_gpio_in); 
     25 } 
     26+EXPORT_SYMBOL_GPL(bcma_chipco_gpio_in); 
     27  
     28 u32 bcma_chipco_gpio_out(struct bcma_drv_cc *cc, u32 mask, u32 value) 
     29 { 
     30-       return bcma_cc_write32_masked(cc, BCMA_CC_GPIOOUT, mask, value); 
     31+       unsigned long flags; 
     32+       u32 res; 
    5333+ 
    54 +u32 bcma_gpio_out(struct bcma_bus *bus, u32 mask, u32 value) 
    55 +{ 
    56 +       unsigned long flags; 
    57 +       u32 res = 0; 
    58 + 
    59 +       spin_lock_irqsave(&bus->gpio_lock, flags); 
    60 +       res = bcma_chipco_gpio_out(&bus->drv_cc, mask, value); 
    61 +       spin_unlock_irqrestore(&bus->gpio_lock, flags); 
     34+       spin_lock_irqsave(&cc->gpio_lock, flags); 
     35+       res = bcma_cc_write32_masked(cc, BCMA_CC_GPIOOUT, mask, value); 
     36+       spin_unlock_irqrestore(&cc->gpio_lock, flags); 
    6237+ 
    6338+       return res; 
    64 +} 
    65 +EXPORT_SYMBOL(bcma_gpio_out); 
     39 } 
     40+EXPORT_SYMBOL_GPL(bcma_chipco_gpio_out); 
     41  
     42 u32 bcma_chipco_gpio_outen(struct bcma_drv_cc *cc, u32 mask, u32 value) 
     43 { 
     44-       return bcma_cc_write32_masked(cc, BCMA_CC_GPIOOUTEN, mask, value); 
     45+       unsigned long flags; 
     46+       u32 res; 
    6647+ 
    67 +u32 bcma_gpio_outen(struct bcma_bus *bus, u32 mask, u32 value) 
    68 +{ 
    69 +       unsigned long flags; 
    70 +       u32 res = 0; 
    71 + 
    72 +       spin_lock_irqsave(&bus->gpio_lock, flags); 
    73 +       res = bcma_chipco_gpio_outen(&bus->drv_cc, mask, value); 
    74 +       spin_unlock_irqrestore(&bus->gpio_lock, flags); 
     48+       spin_lock_irqsave(&cc->gpio_lock, flags); 
     49+       res = bcma_cc_write32_masked(cc, BCMA_CC_GPIOOUTEN, mask, value); 
     50+       spin_unlock_irqrestore(&cc->gpio_lock, flags); 
    7551+ 
    7652+       return res; 
    77 +} 
    78 +EXPORT_SYMBOL(bcma_gpio_outen); 
     53 } 
     54+EXPORT_SYMBOL_GPL(bcma_chipco_gpio_outen); 
     55  
     56 u32 bcma_chipco_gpio_control(struct bcma_drv_cc *cc, u32 mask, u32 value) 
     57 { 
     58-       return bcma_cc_write32_masked(cc, BCMA_CC_GPIOCTL, mask, value); 
     59+       unsigned long flags; 
     60+       u32 res; 
    7961+ 
    80 +u32 bcma_gpio_control(struct bcma_bus *bus, u32 mask, u32 value) 
    81 +{ 
    82 +       unsigned long flags; 
    83 +       u32 res = 0; 
    84 + 
    85 +       spin_lock_irqsave(&bus->gpio_lock, flags); 
    86 +       res = bcma_chipco_gpio_control(&bus->drv_cc, mask, value); 
    87 +       spin_unlock_irqrestore(&bus->gpio_lock, flags); 
     62+       spin_lock_irqsave(&cc->gpio_lock, flags); 
     63+       res = bcma_cc_write32_masked(cc, BCMA_CC_GPIOCTL, mask, value); 
     64+       spin_unlock_irqrestore(&cc->gpio_lock, flags); 
    8865+ 
    8966+       return res; 
    90 +} 
    91 +EXPORT_SYMBOL(bcma_gpio_control); 
     67 } 
     68 EXPORT_SYMBOL_GPL(bcma_chipco_gpio_control); 
     69  
     70 u32 bcma_chipco_gpio_intmask(struct bcma_drv_cc *cc, u32 mask, u32 value) 
     71 { 
     72-       return bcma_cc_write32_masked(cc, BCMA_CC_GPIOIRQ, mask, value); 
     73+       unsigned long flags; 
     74+       u32 res; 
    9275+ 
    93 +u32 bcma_gpio_intmask(struct bcma_bus *bus, u32 mask, u32 value) 
    94 +{ 
    95 +       unsigned long flags; 
    96 +       u32 res = 0; 
    97 + 
    98 +       spin_lock_irqsave(&bus->gpio_lock, flags); 
    99 +       res = bcma_chipco_gpio_intmask(&bus->drv_cc, mask, value); 
    100 +       spin_unlock_irqrestore(&bus->gpio_lock, flags); 
     76+       spin_lock_irqsave(&cc->gpio_lock, flags); 
     77+       res = bcma_cc_write32_masked(cc, BCMA_CC_GPIOIRQ, mask, value); 
     78+       spin_unlock_irqrestore(&cc->gpio_lock, flags); 
    10179+ 
    10280+       return res; 
    103 +} 
    104 +EXPORT_SYMBOL(bcma_gpio_intmask); 
     81 } 
     82+EXPORT_SYMBOL_GPL(bcma_chipco_gpio_intmask); 
     83  
     84 u32 bcma_chipco_gpio_polarity(struct bcma_drv_cc *cc, u32 mask, u32 value) 
     85 { 
     86-       return bcma_cc_write32_masked(cc, BCMA_CC_GPIOPOL, mask, value); 
     87+       unsigned long flags; 
     88+       u32 res; 
    10589+ 
    106 +u32 bcma_gpio_polarity(struct bcma_bus *bus, u32 mask, u32 value) 
    107 +{ 
    108 +       unsigned long flags; 
    109 +       u32 res = 0; 
    110 + 
    111 +       spin_lock_irqsave(&bus->gpio_lock, flags); 
    112 +       res = bcma_chipco_gpio_polarity(&bus->drv_cc, mask, value); 
    113 +       spin_unlock_irqrestore(&bus->gpio_lock, flags); 
     90+       spin_lock_irqsave(&cc->gpio_lock, flags); 
     91+       res = bcma_cc_write32_masked(cc, BCMA_CC_GPIOPOL, mask, value); 
     92+       spin_unlock_irqrestore(&cc->gpio_lock, flags); 
    11493+ 
    11594+       return res; 
    116 +} 
    117 +EXPORT_SYMBOL(bcma_gpio_polarity); 
    118 --- a/drivers/bcma/scan.c 
    119 +++ b/drivers/bcma/scan.c 
    120 @@ -422,6 +422,10 @@ void bcma_init_bus(struct bcma_bus *bus) 
    121         if (bus->init_done) 
    122                 return; 
     95 } 
     96+EXPORT_SYMBOL_GPL(bcma_chipco_gpio_polarity); 
    12397  
    124 +#ifdef CONFIG_BCMA_DRIVER_GPIO 
    125 +       spin_lock_init(&bus->gpio_lock); 
    126 +#endif 
     98 #ifdef CONFIG_BCMA_DRIVER_MIPS 
     99 void bcma_chipco_serial_init(struct bcma_drv_cc *cc) 
     100--- a/include/linux/bcma/bcma_driver_chipcommon.h 
     101+++ b/include/linux/bcma/bcma_driver_chipcommon.h 
     102@@ -494,6 +494,9 @@ struct bcma_drv_cc { 
     103        int nr_serial_ports; 
     104        struct bcma_serial_port serial_ports[4]; 
     105 #endif /* CONFIG_BCMA_DRIVER_MIPS */ 
    127106+ 
    128         INIT_LIST_HEAD(&bus->cores); 
    129         bus->nr_cores = 0; 
    130   
    131 --- a/include/linux/bcma/bcma.h 
    132 +++ b/include/linux/bcma/bcma.h 
    133 @@ -255,6 +255,11 @@ struct bcma_bus { 
    134         struct bcma_drv_mips drv_mips; 
    135         struct bcma_drv_gmac_cmn drv_gmac_cmn; 
    136   
    137 +#ifdef CONFIG_BCMA_DRIVER_GPIO 
    138107+       /* Lock for GPIO register access. */ 
    139108+       spinlock_t gpio_lock; 
    140 +#endif /* CONFIG_BCMA_DRIVER_GPIO */ 
     109 }; 
     110  
     111 /* Register access */ 
     112@@ -523,13 +526,22 @@ void bcma_chipco_irq_mask(struct bcma_dr 
     113  
     114 u32 bcma_chipco_irq_status(struct bcma_drv_cc *cc, u32 mask); 
     115  
     116+#define BCMA_CC_GPIO_LINES     16 
    141117+ 
    142         /* We decided to share SPROM struct with SSB as long as we do not need 
    143          * any hacks for BCMA. This simplifies drivers code. */ 
    144         struct ssb_sprom sprom; 
    145 --- /dev/null 
    146 +++ b/include/linux/bcma/bcma_driver_gpio.h 
    147 @@ -0,0 +1,21 @@ 
    148 +#ifndef LINUX_BCMA_DRIVER_GPIO_H_ 
    149 +#define LINUX_BCMA_DRIVER_GPIO_H_ 
    150 + 
    151 +#include <linux/types.h> 
    152 +#include <linux/bcma/bcma.h> 
    153 + 
    154 +#define BCMA_GPIO_CC_LINES     16 
    155 + 
    156 +u32 bcma_gpio_in(struct bcma_bus *bus, u32 mask); 
    157 +u32 bcma_gpio_out(struct bcma_bus *bus, u32 mask, u32 value); 
    158 +u32 bcma_gpio_outen(struct bcma_bus *bus, u32 mask, u32 value); 
    159 +u32 bcma_gpio_control(struct bcma_bus *bus, u32 mask, u32 value); 
    160 +u32 bcma_gpio_intmask(struct bcma_bus *bus, u32 mask, u32 value); 
    161 +u32 bcma_gpio_polarity(struct bcma_bus *bus, u32 mask, u32 value); 
    162 + 
    163 +static inline int bcma_gpio_count(struct bcma_bus *bus) 
     118 /* Chipcommon GPIO pin access. */ 
     119-u32 bcma_chipco_gpio_in(struct bcma_drv_cc *cc, u32 mask); 
     120-u32 bcma_chipco_gpio_out(struct bcma_drv_cc *cc, u32 mask, u32 value); 
     121-u32 bcma_chipco_gpio_outen(struct bcma_drv_cc *cc, u32 mask, u32 value); 
     122-u32 bcma_chipco_gpio_control(struct bcma_drv_cc *cc, u32 mask, u32 value); 
     123-u32 bcma_chipco_gpio_intmask(struct bcma_drv_cc *cc, u32 mask, u32 value); 
     124-u32 bcma_chipco_gpio_polarity(struct bcma_drv_cc *cc, u32 mask, u32 value); 
     125+extern u32 bcma_chipco_gpio_in(struct bcma_drv_cc *cc, u32 mask); 
     126+extern u32 bcma_chipco_gpio_out(struct bcma_drv_cc *cc, u32 mask, u32 value); 
     127+extern u32 bcma_chipco_gpio_outen(struct bcma_drv_cc *cc, u32 mask, u32 value); 
     128+extern u32 bcma_chipco_gpio_control(struct bcma_drv_cc *cc, u32 mask, 
     129+                                   u32 value); 
     130+extern u32 bcma_chipco_gpio_intmask(struct bcma_drv_cc *cc, u32 mask, 
     131+                                   u32 value); 
     132+extern u32 bcma_chipco_gpio_polarity(struct bcma_drv_cc *cc, u32 mask, 
     133+                                    u32 value); 
     134+static inline int bcma_chipco_gpio_count(void) 
    164135+{ 
    165 +       return BCMA_GPIO_CC_LINES; 
     136+       return BCMA_CC_GPIO_LINES; 
    166137+} 
    167 + 
    168 +#endif /* LINUX_BCMA_DRIVER_GPIO_H_ */ 
     138  
     139 /* PMU support */ 
     140 extern void bcma_pmu_init(struct bcma_drv_cc *cc); 
  • trunk/target/linux/brcm47xx/patches-3.3/502-bcm47xx-rewrite-gpio-handling.patch

    r33209 r33462  
    99        select CEVT_R4K 
    1010        select CSRC_R4K 
    11 @@ -100,7 +101,6 @@ config BCM47XX 
    12         select IRQ_CPU 
     11@@ -101,7 +102,6 @@ config BCM47XX 
     12        select NO_EXCEPT_FILL 
    1313        select SYS_SUPPORTS_32BIT_KERNEL 
    1414        select SYS_SUPPORTS_LITTLE_ENDIAN 
     
    1919--- a/arch/mips/bcm47xx/gpio.c 
    2020+++ b/arch/mips/bcm47xx/gpio.c 
    21 @@ -4,83 +4,150 @@ 
     21@@ -4,83 +4,154 @@ 
    2222  * for more details. 
    2323  * 
     
    3737+#include <linux/ssb/ssb_embedded.h> 
    3838+#include <linux/bcma/bcma.h> 
    39 +#include <linux/bcma/bcma_driver_gpio.h> 
    4039+ 
    4140+#include <bcm47xx.h> 
     
    7776-               if (test_and_set_bit(gpio, gpio_in_use)) 
    7877-                       return -EBUSY; 
    79 +               return bcma_gpio_in(&bcm47xx_bus.bcma.bus, mask); 
     78+               return bcma_chipco_gpio_in(&bcm47xx_bus.bcma.bus.drv_cc, mask); 
    8079+#endif 
    8180+       } 
     
    9493+#ifdef CONFIG_BCM47XX_BCMA 
    9594+       case BCM47XX_BUS_TYPE_BCMA: 
    96 +               return bcma_gpio_out(&bcm47xx_bus.bcma.bus, mask, value); 
     95+               return bcma_chipco_gpio_out(&bcm47xx_bus.bcma.bus.drv_cc, mask, 
     96+                                           value); 
    9797 #endif 
    9898        } 
     
    115115+#ifdef CONFIG_BCM47XX_BCMA 
    116116+       case BCM47XX_BUS_TYPE_BCMA: 
    117 +               return bcma_gpio_outen(&bcm47xx_bus.bcma.bus, mask, value); 
     117+               return bcma_chipco_gpio_outen(&bcm47xx_bus.bcma.bus.drv_cc, 
     118+                                             mask, value); 
    118119+#endif 
    119120+       } 
     
    134135+#ifdef CONFIG_BCM47XX_BCMA 
    135136+       case BCM47XX_BUS_TYPE_BCMA: 
    136 +               return bcma_gpio_control(&bcm47xx_bus.bcma.bus, mask, value); 
     137+               return bcma_chipco_gpio_control(&bcm47xx_bus.bcma.bus.drv_cc, 
     138+                                               mask, value); 
    137139+#endif 
    138140+       } 
     
    154156-               if (gpio >= BCM47XX_CHIPCO_GPIO_LINES) 
    155157-                       return; 
    156 +               return bcma_gpio_intmask(&bcm47xx_bus.bcma.bus, mask, value); 
     158+               return bcma_chipco_gpio_intmask(&bcm47xx_bus.bcma.bus.drv_cc, 
     159+                                               mask, value); 
    157160+#endif 
    158161+       } 
     
    172175+#ifdef CONFIG_BCM47XX_BCMA 
    173176+       case BCM47XX_BUS_TYPE_BCMA: 
    174 +               return bcma_gpio_polarity(&bcm47xx_bus.bcma.bus, mask, value); 
     177+               return bcma_chipco_gpio_polarity(&bcm47xx_bus.bcma.bus.drv_cc, 
     178+                                                mask, value); 
    175179 #endif 
    176180        } 
     
    214218        switch (bcm47xx_bus_type) { 
    215219 #ifdef CONFIG_BCM47XX_SSB 
    216 @@ -99,4 +166,55 @@ int gpio_to_irq(unsigned gpio) 
     220@@ -99,4 +170,55 @@ int gpio_to_irq(unsigned gpio) 
    217221        } 
    218222        return -EINVAL; 
     
    242246+#ifdef CONFIG_BCM47XX_BCMA 
    243247+       case BCM47XX_BUS_TYPE_BCMA: 
    244 +               bcm47xx_gpio_count = bcma_gpio_count(&bcm47xx_bus.bcma.bus); 
     248+               bcm47xx_gpio_count = bcma_chipco_gpio_count(); 
    245249+               break; 
    246250+#endif 
Note: See TracChangeset for help on using the changeset viewer.