First step to upgrade of brcm47xx to kernel version 2.6.25
[openwrt.git] / target / linux / brcm47xx / patches-2.6.25 / 001-ssb-fix-gpio-api.patch
1 Index: linux-2.6.23.16/drivers/ssb/driver_chipcommon.c
2 ===================================================================
3 --- linux-2.6.23.16.orig/drivers/ssb/driver_chipcommon.c        2008-02-19 14:37:06.000000000 +0100
4 +++ linux-2.6.23.16/drivers/ssb/driver_chipcommon.c     2008-02-19 14:37:08.000000000 +0100
5 @@ -39,12 +39,14 @@ static inline void chipco_write32(struct
6         ssb_write32(cc->dev, offset, value);
7  }
8  
9 -static inline void chipco_write32_masked(struct ssb_chipcommon *cc, u16 offset,
10 -                                        u32 mask, u32 value)
11 +static inline u32 chipco_write32_masked(struct ssb_chipcommon *cc, u16 offset,
12 +                                       u32 mask, u32 value)
13  {
14         value &= mask;
15         value |= chipco_read32(cc, offset) & ~mask;
16         chipco_write32(cc, offset, value);
17 +
18 +       return value;
19  }
20  
21  void ssb_chipco_set_clockmode(struct ssb_chipcommon *cc,
22 @@ -355,16 +357,37 @@ u32 ssb_chipco_gpio_in(struct ssb_chipco
23  {
24         return chipco_read32(cc, SSB_CHIPCO_GPIOIN) & mask;
25  }
26 +EXPORT_SYMBOL(ssb_chipco_gpio_in);
27 +
28 +u32 ssb_chipco_gpio_out(struct ssb_chipcommon *cc, u32 mask, u32 value)
29 +{
30 +       return chipco_write32_masked(cc, SSB_CHIPCO_GPIOOUT, mask, value);
31 +}
32 +EXPORT_SYMBOL(ssb_chipco_gpio_out);
33 +
34 +u32 ssb_chipco_gpio_outen(struct ssb_chipcommon *cc, u32 mask, u32 value)
35 +{
36 +       return chipco_write32_masked(cc, SSB_CHIPCO_GPIOOUTEN, mask, value);
37 +}
38 +EXPORT_SYMBOL(ssb_chipco_gpio_outen);
39 +
40 +u32 ssb_chipco_gpio_control(struct ssb_chipcommon *cc, u32 mask, u32 value)
41 +{
42 +       return chipco_write32_masked(cc, SSB_CHIPCO_GPIOCTL, mask, value);
43 +}
44 +EXPORT_SYMBOL(ssb_chipco_gpio_control);
45  
46 -void ssb_chipco_gpio_out(struct ssb_chipcommon *cc, u32 mask, u32 value)
47 +u32 ssb_chipco_gpio_intmask(struct ssb_chipcommon *cc, u32 mask, u32 value)
48  {
49 -       chipco_write32_masked(cc, SSB_CHIPCO_GPIOOUT, mask, value);
50 +       return chipco_write32_masked(cc, SSB_CHIPCO_GPIOIRQ, mask, value);
51  }
52 +EXPORT_SYMBOL(ssb_chipco_gpio_intmask);
53  
54 -void ssb_chipco_gpio_outen(struct ssb_chipcommon *cc, u32 mask, u32 value)
55 +u32 ssb_chipco_gpio_polarity(struct ssb_chipcommon *cc, u32 mask, u32 value)
56  {
57 -       chipco_write32_masked(cc, SSB_CHIPCO_GPIOOUTEN, mask, value);
58 +       return chipco_write32_masked(cc, SSB_CHIPCO_GPIOPOL, mask, value);
59  }
60 +EXPORT_SYMBOL(ssb_chipco_gpio_polarity);
61  
62  #ifdef CONFIG_SSB_SERIAL
63  int ssb_chipco_serial_init(struct ssb_chipcommon *cc,
64 Index: linux-2.6.23.16/drivers/ssb/driver_extif.c
65 ===================================================================
66 --- linux-2.6.23.16.orig/drivers/ssb/driver_extif.c     2008-02-19 14:37:06.000000000 +0100
67 +++ linux-2.6.23.16/drivers/ssb/driver_extif.c  2008-02-19 14:37:08.000000000 +0100
68 @@ -27,12 +27,14 @@ static inline void extif_write32(struct 
69         ssb_write32(extif->dev, offset, value);
70  }
71  
72 -static inline void extif_write32_masked(struct ssb_extif *extif, u16 offset,
73 -                                       u32 mask, u32 value)
74 +static inline u32 extif_write32_masked(struct ssb_extif *extif, u16 offset,
75 +                                      u32 mask, u32 value)
76  {
77         value &= mask;
78         value |= extif_read32(extif, offset) & ~mask;
79         extif_write32(extif, offset, value);
80 +
81 +       return value;
82  }
83  
84  #ifdef CONFIG_SSB_SERIAL
85 @@ -114,16 +116,30 @@ u32 ssb_extif_gpio_in(struct ssb_extif *
86  {
87         return extif_read32(extif, SSB_EXTIF_GPIO_IN) & mask;
88  }
89 +EXPORT_SYMBOL(ssb_extif_gpio_in);
90  
91 -void ssb_extif_gpio_out(struct ssb_extif *extif, u32 mask, u32 value)
92 +u32 ssb_extif_gpio_out(struct ssb_extif *extif, u32 mask, u32 value)
93  {
94         return extif_write32_masked(extif, SSB_EXTIF_GPIO_OUT(0),
95                                    mask, value);
96  }
97 +EXPORT_SYMBOL(ssb_extif_gpio_out);
98  
99 -void ssb_extif_gpio_outen(struct ssb_extif *extif, u32 mask, u32 value)
100 +u32 ssb_extif_gpio_outen(struct ssb_extif *extif, u32 mask, u32 value)
101  {
102         return extif_write32_masked(extif, SSB_EXTIF_GPIO_OUTEN(0),
103                                    mask, value);
104  }
105 +EXPORT_SYMBOL(ssb_extif_gpio_outen);
106 +
107 +u32 ssb_extif_gpio_polarity(struct ssb_extif *extif, u32 mask, u32 value)
108 +{
109 +       return extif_write32_masked(extif, SSB_EXTIF_GPIO_INTPOL, mask, value);
110 +}
111 +EXPORT_SYMBOL(ssb_extif_gpio_polarity);
112  
113 +u32 ssb_extif_gpio_intmask(struct ssb_extif *extif, u32 mask, u32 value)
114 +{
115 +       return extif_write32_masked(extif, SSB_EXTIF_GPIO_INTMASK, mask, value);
116 +}
117 +EXPORT_SYMBOL(ssb_extif_gpio_intmask);
118 Index: linux-2.6.23.16/include/linux/ssb/ssb_driver_chipcommon.h
119 ===================================================================
120 --- linux-2.6.23.16.orig/include/linux/ssb/ssb_driver_chipcommon.h      2008-02-19 14:37:06.000000000 +0100
121 +++ linux-2.6.23.16/include/linux/ssb/ssb_driver_chipcommon.h   2008-02-19 14:37:08.000000000 +0100
122 @@ -382,11 +382,13 @@ extern void ssb_chipco_set_clockmode(str
123  extern void ssb_chipco_watchdog_timer_set(struct ssb_chipcommon *cc,
124                                           u32 ticks);
125  
126 +/* Chipcommon GPIO pin access. */
127  u32 ssb_chipco_gpio_in(struct ssb_chipcommon *cc, u32 mask);
128 -
129 -void ssb_chipco_gpio_out(struct ssb_chipcommon *cc, u32 mask, u32 value);
130 -
131 -void ssb_chipco_gpio_outen(struct ssb_chipcommon *cc, u32 mask, u32 value);
132 +u32 ssb_chipco_gpio_out(struct ssb_chipcommon *cc, u32 mask, u32 value);
133 +u32 ssb_chipco_gpio_outen(struct ssb_chipcommon *cc, u32 mask, u32 value);
134 +u32 ssb_chipco_gpio_control(struct ssb_chipcommon *cc, u32 mask, u32 value);
135 +u32 ssb_chipco_gpio_intmask(struct ssb_chipcommon *cc, u32 mask, u32 value);
136 +u32 ssb_chipco_gpio_polarity(struct ssb_chipcommon *cc, u32 mask, u32 value);
137  
138  #ifdef CONFIG_SSB_SERIAL
139  extern int ssb_chipco_serial_init(struct ssb_chipcommon *cc,
140 Index: linux-2.6.23.16/include/linux/ssb/ssb_driver_extif.h
141 ===================================================================
142 --- linux-2.6.23.16.orig/include/linux/ssb/ssb_driver_extif.h   2008-02-19 14:37:06.000000000 +0100
143 +++ linux-2.6.23.16/include/linux/ssb/ssb_driver_extif.h        2008-02-19 14:37:08.000000000 +0100
144 @@ -171,11 +171,12 @@ extern void ssb_extif_get_clockcontrol(s
145  extern void ssb_extif_timing_init(struct ssb_extif *extif,
146                                   unsigned long ns);
147  
148 +/* Extif GPIO pin access */
149  u32 ssb_extif_gpio_in(struct ssb_extif *extif, u32 mask);
150 -
151 -void ssb_extif_gpio_out(struct ssb_extif *extif, u32 mask, u32 value);
152 -
153 -void ssb_extif_gpio_outen(struct ssb_extif *extif, u32 mask, u32 value);
154 +u32 ssb_extif_gpio_out(struct ssb_extif *extif, u32 mask, u32 value);
155 +u32 ssb_extif_gpio_outen(struct ssb_extif *extif, u32 mask, u32 value);
156 +u32 ssb_extif_gpio_polarity(struct ssb_extif *extif, u32 mask, u32 value);
157 +u32 ssb_extif_gpio_intmask(struct ssb_extif *extif, u32 mask, u32 value);
158  
159  #ifdef CONFIG_SSB_SERIAL
160  extern int ssb_extif_serial_init(struct ssb_extif *extif,