kernel: update bcma and ssb to master-2012-10-18 from wireless-testing
[openwrt.git] / target / linux / brcm47xx / patches-3.3 / 501-bcma-add-gpio-driver.patch
1 --- a/drivers/bcma/driver_chipcommon.c
2 +++ b/drivers/bcma/driver_chipcommon.c
3 @@ -70,6 +70,8 @@ void bcma_core_chipcommon_init(struct bc
4                          (leddc_off << BCMA_CC_GPIOTIMER_OFFTIME_SHIFT)));
5         }
6  
7 +       spin_lock_init(&cc->gpio_lock);
8 +
9         cc->setup_done = true;
10  }
11  
12 @@ -92,34 +94,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;
19 +
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);
23 +
24 +       return res;
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;
33 +
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);
37 +
38 +       return res;
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;
47 +
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);
51 +
52 +       return res;
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;
61 +
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);
65 +
66 +       return res;
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;
75 +
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);
79 +
80 +       return res;
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;
89 +
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);
93 +
94 +       return res;
95  }
96 +EXPORT_SYMBOL_GPL(bcma_chipco_gpio_polarity);
97  
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 @@ -551,6 +551,9 @@ struct bcma_drv_cc {
103         int nr_serial_ports;
104         struct bcma_serial_port serial_ports[4];
105  #endif /* CONFIG_BCMA_DRIVER_MIPS */
106 +
107 +       /* Lock for GPIO register access. */
108 +       spinlock_t gpio_lock;
109  };
110  
111  /* Register access */
112 @@ -581,13 +584,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
117 +
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)
135 +{
136 +       return BCMA_CC_GPIO_LINES;
137 +}
138  
139  /* PMU support */
140  extern void bcma_pmu_init(struct bcma_drv_cc *cc);