aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-pxa
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-pxa')
-rw-r--r--arch/arm/mach-pxa/Kconfig630
-rw-r--r--arch/arm/mach-pxa/Makefile86
-rw-r--r--arch/arm/mach-pxa/balloon3.c365
-rw-r--r--arch/arm/mach-pxa/clock.h1
-rw-r--r--arch/arm/mach-pxa/cm-x270.c146
-rw-r--r--arch/arm/mach-pxa/cm-x2xx.c4
-rw-r--r--arch/arm/mach-pxa/cm-x300.c343
-rw-r--r--arch/arm/mach-pxa/colibri-pxa270.c3
-rw-r--r--arch/arm/mach-pxa/colibri-pxa300.c5
-rw-r--r--arch/arm/mach-pxa/colibri-pxa320.c41
-rw-r--r--arch/arm/mach-pxa/colibri-pxa3xx.c52
-rw-r--r--arch/arm/mach-pxa/corgi.c237
-rw-r--r--arch/arm/mach-pxa/corgi_pm.c4
-rw-r--r--arch/arm/mach-pxa/cpufreq-pxa2xx.c3
-rw-r--r--arch/arm/mach-pxa/cpufreq-pxa3xx.c2
-rw-r--r--arch/arm/mach-pxa/csb726.c59
-rw-r--r--arch/arm/mach-pxa/devices.c57
-rw-r--r--arch/arm/mach-pxa/devices.h2
-rw-r--r--arch/arm/mach-pxa/e330.c3
-rw-r--r--arch/arm/mach-pxa/e350.c3
-rw-r--r--arch/arm/mach-pxa/e400.c3
-rw-r--r--arch/arm/mach-pxa/e740.c4
-rw-r--r--arch/arm/mach-pxa/e750.c4
-rw-r--r--arch/arm/mach-pxa/e800.c3
-rw-r--r--arch/arm/mach-pxa/em-x270.c56
-rw-r--r--arch/arm/mach-pxa/eseries.c39
-rw-r--r--arch/arm/mach-pxa/ezx.c251
-rw-r--r--arch/arm/mach-pxa/generic.h5
-rw-r--r--arch/arm/mach-pxa/gumstix.c10
-rw-r--r--arch/arm/mach-pxa/h5000.c3
-rw-r--r--arch/arm/mach-pxa/himalaya.c3
-rw-r--r--arch/arm/mach-pxa/hx4700.c72
-rw-r--r--arch/arm/mach-pxa/idp.c8
-rw-r--r--arch/arm/mach-pxa/imote2.c9
-rw-r--r--arch/arm/mach-pxa/include/mach/audio.h3
-rw-r--r--arch/arm/mach-pxa/include/mach/balloon3.h134
-rw-r--r--arch/arm/mach-pxa/include/mach/colibri.h6
-rw-r--r--arch/arm/mach-pxa/include/mach/entry-macro.S26
-rw-r--r--arch/arm/mach-pxa/include/mach/hardware.h24
-rw-r--r--arch/arm/mach-pxa/include/mach/irda.h2
-rw-r--r--arch/arm/mach-pxa/include/mach/irqs.h42
-rw-r--r--arch/arm/mach-pxa/include/mach/mfp.h301
-rw-r--r--arch/arm/mach-pxa/include/mach/mmc.h5
-rw-r--r--arch/arm/mach-pxa/include/mach/palmtc.h86
-rw-r--r--arch/arm/mach-pxa/include/mach/palmtreo.h67
-rw-r--r--arch/arm/mach-pxa/include/mach/palmtx.h5
-rw-r--r--arch/arm/mach-pxa/include/mach/pxa27x_keypad.h7
-rw-r--r--arch/arm/mach-pxa/include/mach/pxa3xx-regs.h4
-rw-r--r--arch/arm/mach-pxa/include/mach/pxa3xx_nand.h63
-rw-r--r--arch/arm/mach-pxa/include/mach/pxafb.h6
-rw-r--r--arch/arm/mach-pxa/include/mach/regs-intc.h11
-rw-r--r--arch/arm/mach-pxa/include/mach/regs-u2d.h199
-rw-r--r--arch/arm/mach-pxa/include/mach/treo680.h49
-rw-r--r--arch/arm/mach-pxa/include/mach/uncompress.h2
-rw-r--r--arch/arm/mach-pxa/irq.c19
-rw-r--r--arch/arm/mach-pxa/littleton.c51
-rw-r--r--arch/arm/mach-pxa/lpd270.c4
-rw-r--r--arch/arm/mach-pxa/lubbock.c22
-rw-r--r--arch/arm/mach-pxa/magician.c63
-rw-r--r--arch/arm/mach-pxa/mainstone.c20
-rw-r--r--arch/arm/mach-pxa/mioa701.c87
-rw-r--r--arch/arm/mach-pxa/mp900.c3
-rw-r--r--arch/arm/mach-pxa/palmld.c147
-rw-r--r--arch/arm/mach-pxa/palmt5.c115
-rw-r--r--arch/arm/mach-pxa/palmtc.c441
-rw-r--r--arch/arm/mach-pxa/palmte2.c114
-rw-r--r--arch/arm/mach-pxa/palmtreo.c (renamed from arch/arm/mach-pxa/treo680.c)504
-rw-r--r--arch/arm/mach-pxa/palmtx.c229
-rw-r--r--arch/arm/mach-pxa/palmz72.c120
-rw-r--r--arch/arm/mach-pxa/pcm027.c4
-rw-r--r--arch/arm/mach-pxa/pcm990-baseboard.c75
-rw-r--r--arch/arm/mach-pxa/poodle.c84
-rw-r--r--arch/arm/mach-pxa/pxa25x.c7
-rw-r--r--arch/arm/mach-pxa/pxa27x.c3
-rw-r--r--arch/arm/mach-pxa/pxa2xx.c1
-rw-r--r--arch/arm/mach-pxa/pxa300.c2
-rw-r--r--arch/arm/mach-pxa/pxa320.c2
-rw-r--r--arch/arm/mach-pxa/pxa3xx.c47
-rw-r--r--arch/arm/mach-pxa/pxa930.c19
-rw-r--r--arch/arm/mach-pxa/saar.c105
-rw-r--r--arch/arm/mach-pxa/sharpsl.h4
-rw-r--r--arch/arm/mach-pxa/sharpsl_pm.c116
-rw-r--r--arch/arm/mach-pxa/spitz.c322
-rw-r--r--arch/arm/mach-pxa/spitz_pm.c14
-rw-r--r--arch/arm/mach-pxa/ssp.c73
-rw-r--r--arch/arm/mach-pxa/stargate2.c4
-rw-r--r--arch/arm/mach-pxa/tavorevb.c4
-rw-r--r--arch/arm/mach-pxa/tosa.c96
-rw-r--r--arch/arm/mach-pxa/trizeps4.c8
-rw-r--r--arch/arm/mach-pxa/viper.c15
-rw-r--r--arch/arm/mach-pxa/xcep.c192
-rw-r--r--arch/arm/mach-pxa/zylonite.c9
92 files changed, 4233 insertions, 2470 deletions
diff --git a/arch/arm/mach-pxa/Kconfig b/arch/arm/mach-pxa/Kconfig
index 89c992b8f75b..d89c6adbe8bc 100644
--- a/arch/arm/mach-pxa/Kconfig
+++ b/arch/arm/mach-pxa/Kconfig
@@ -2,29 +2,105 @@ if ARCH_PXA
2 2
3menu "Intel PXA2xx/PXA3xx Implementations" 3menu "Intel PXA2xx/PXA3xx Implementations"
4 4
5if PXA3xx 5comment "Intel/Marvell Dev Platforms (sorted by hardware release time)"
6 6
7menu "Supported PXA3xx Processor Variants" 7config ARCH_LUBBOCK
8 bool "Intel DBPXA250 Development Platform (aka Lubbock)"
9 select PXA25x
10 select SA1111
11 select PXA_HAVE_BOARD_IRQS
8 12
9config CPU_PXA300 13config MACH_MAINSTONE
10 bool "PXA300 (codename Monahans-L)" 14 bool "Intel HCDDBBVA0 Development Platform (aka Mainstone)"
15 select PXA27x
16 select HAVE_PWM
17 select PXA_HAVE_BOARD_IRQS
11 18
12config CPU_PXA310 19config MACH_ZYLONITE
13 bool "PXA310 (codename Monahans-LV)" 20 bool
21 select PXA3xx
22 select PXA_SSP
23 select HAVE_PWM
24 select PXA_HAVE_BOARD_IRQS
25
26config MACH_ZYLONITE300
27 bool "PXA3xx Development Platform (aka Zylonite) PXA300/310"
14 select CPU_PXA300 28 select CPU_PXA300
29 select CPU_PXA310
30 select MACH_ZYLONITE
15 31
16config CPU_PXA320 32config MACH_ZYLONITE320
17 bool "PXA320 (codename Monahans-P)" 33 bool "PXA3xx Development Platform (aka Zylonite) PXA320"
34 select CPU_PXA320
35 select MACH_ZYLONITE
18 36
19config CPU_PXA930 37config MACH_LITTLETON
20 bool "PXA930 (codename Tavor-P)" 38 bool "PXA3xx Form Factor Platform (aka Littleton)"
39 select PXA3xx
40 select PXA_SSP
21 41
22config CPU_PXA935 42config MACH_TAVOREVB
23 bool "PXA935 (codename Tavor-P65)" 43 bool "PXA930 Evaluation Board (aka TavorEVB)"
44 select PXA3xx
45 select CPU_PXA930
24 46
25endmenu 47config MACH_SAAR
48 bool "PXA930 Handheld Platform (aka SAAR)"
49 select PXA3xx
50 select CPU_PXA930
26 51
27endif 52comment "Third Party Dev Platforms (sorted by vendor name)"
53
54config ARCH_PXA_IDP
55 bool "Accelent Xscale IDP"
56 select PXA25x
57
58config ARCH_VIPER
59 bool "Arcom/Eurotech VIPER SBC"
60 select PXA25x
61 select ISA
62 select I2C_GPIO
63 select HAVE_PWM
64 select PXA_HAVE_BOARD_IRQS
65 select PXA_HAVE_ISA_IRQS
66
67config MACH_BALLOON3
68 bool "Balloon 3 board"
69 select PXA27x
70 select IWMMXT
71 select PXA_HAVE_BOARD_IRQS
72
73config MACH_CSB726
74 bool "Enable Cogent CSB726 System On a Module"
75 select PXA27x
76 select IWMMXT
77 help
78 Say Y here if you intend to run this kernel on a Cogent
79 CSB726 System On Module.
80
81config CSB726_CSB701
82 bool "Enable support for CSB701 baseboard"
83 depends on MACH_CSB726
84
85config MACH_ARMCORE
86 bool "CompuLab CM-X255/CM-X270 modules"
87 select PXA27x
88 select IWMMXT
89 select PXA25x
90 select PXA_SSP
91
92config MACH_EM_X270
93 bool "CompuLab EM-x270 platform"
94 select PXA27x
95
96config MACH_EXEDA
97 bool "CompuLab eXeda platform"
98 select PXA27x
99
100config MACH_CM_X300
101 bool "CompuLab CM-X300 modules"
102 select PXA3xx
103 select CPU_PXA300
28 104
29config ARCH_GUMSTIX 105config ARCH_GUMSTIX
30 bool "Gumstix XScale 255 boards" 106 bool "Gumstix XScale 255 boards"
@@ -57,179 +133,24 @@ config MACH_STARGATE2
57 select IWMMXT 133 select IWMMXT
58 select PXA_HAVE_BOARD_IRQS 134 select PXA_HAVE_BOARD_IRQS
59 135
60config ARCH_LUBBOCK 136config MACH_XCEP
61 bool "Intel DBPXA250 Development Platform" 137 bool "Iskratel Electronics XCEP"
62 select PXA25x
63 select SA1111
64 select PXA_HAVE_BOARD_IRQS
65
66config MACH_LOGICPD_PXA270
67 bool "LogicPD PXA270 Card Engine Development Platform"
68 select PXA27x
69 select HAVE_PWM
70 select PXA_HAVE_BOARD_IRQS
71
72config MACH_MAINSTONE
73 bool "Intel HCDDBBVA0 Development Platform"
74 select PXA27x
75 select HAVE_PWM
76 select PXA_HAVE_BOARD_IRQS
77
78config MACH_MP900C
79 bool "Nec Mobilepro 900/c"
80 select PXA25x
81
82config ARCH_PXA_IDP
83 bool "Accelent Xscale IDP"
84 select PXA25x
85
86config PXA_SHARPSL
87 bool "SHARP Zaurus SL-5600, SL-C7xx and SL-Cxx00 Models"
88 select SHARP_SCOOP
89 select SHARP_PARAM
90 help
91 Say Y here if you intend to run this kernel on a
92 Sharp Zaurus SL-5600 (Poodle), SL-C700 (Corgi),
93 SL-C750 (Shepherd), SL-C760 (Husky), SL-C1000 (Akita),
94 SL-C3000 (Spitz), SL-C3100 (Borzoi) or SL-C6000x (Tosa)
95 handheld computer.
96
97config SHARPSL_PM
98 bool
99 select APM_EMULATION
100
101config CORGI_SSP_DEPRECATED
102 bool
103 select PXA_SSP
104 help
105 This option will include corgi_ssp.c and corgi_lcd.c
106 that corgi_ts.c and other legacy drivers (corgi_bl.c
107 and sharpsl_pm.c) may depend on.
108
109config MACH_POODLE
110 bool "Enable Sharp SL-5600 (Poodle) Support"
111 depends on PXA_SHARPSL
112 select PXA25x 138 select PXA25x
113 select SHARP_LOCOMO 139 select MTD
140 select MTD_PARTITIONS
141 select MTD_PHYSMAP
142 select MTD_CFI_INTELEXT
143 select MTD_CFI
144 select MTD_CHAR
145 select SMC91X
114 select PXA_SSP 146 select PXA_SSP
115
116config MACH_CORGI
117 bool "Enable Sharp SL-C700 (Corgi) Support"
118 depends on PXA_SHARPSL
119 select PXA25x
120 select PXA_SHARP_C7xx
121
122config MACH_SHEPHERD
123 bool "Enable Sharp SL-C750 (Shepherd) Support"
124 depends on PXA_SHARPSL
125 select PXA25x
126 select PXA_SHARP_C7xx
127
128config MACH_HUSKY
129 bool "Enable Sharp SL-C760 (Husky) Support"
130 depends on PXA_SHARPSL
131 select PXA25x
132 select PXA_SHARP_C7xx
133
134config MACH_AKITA
135 bool "Enable Sharp SL-1000 (Akita) Support"
136 depends on PXA_SHARPSL
137 select PXA27x
138 select PXA_SHARP_Cxx00
139 select MACH_SPITZ
140 select I2C
141 select I2C_PXA
142
143config MACH_SPITZ
144 bool "Enable Sharp Zaurus SL-3000 (Spitz) Support"
145 depends on PXA_SHARPSL
146 select PXA27x
147 select PXA_SHARP_Cxx00
148
149config MACH_BORZOI
150 bool "Enable Sharp Zaurus SL-3100 (Borzoi) Support"
151 depends on PXA_SHARPSL
152 select PXA27x
153 select PXA_SHARP_Cxx00
154
155config MACH_TOSA
156 bool "Enable Sharp SL-6000x (Tosa) Support"
157 depends on PXA_SHARPSL
158 select PXA25x
159 select PXA_HAVE_BOARD_IRQS
160
161config ARCH_VIPER
162 bool "Arcom/Eurotech VIPER SBC"
163 select PXA25x
164 select ISA
165 select I2C_GPIO
166 select HAVE_PWM
167 select PXA_HAVE_BOARD_IRQS
168 select PXA_HAVE_ISA_IRQS
169
170config ARCH_PXA_ESERIES
171 bool "PXA based Toshiba e-series PDAs"
172 select PXA25x
173 select PXA_HAVE_BOARD_IRQS
174
175config MACH_E330
176 bool "Toshiba e330"
177 default y
178 depends on ARCH_PXA_ESERIES
179 help
180 Say Y here if you intend to run this kernel on a Toshiba
181 e330 family PDA.
182
183config MACH_E350
184 bool "Toshiba e350"
185 default y
186 depends on ARCH_PXA_ESERIES
187 help
188 Say Y here if you intend to run this kernel on a Toshiba
189 e350 family PDA.
190
191config MACH_E740
192 bool "Toshiba e740"
193 default y
194 depends on ARCH_PXA_ESERIES
195 select FB_W100
196 help
197 Say Y here if you intend to run this kernel on a Toshiba
198 e740 family PDA.
199
200config MACH_E750
201 bool "Toshiba e750"
202 default y
203 depends on ARCH_PXA_ESERIES
204 select FB_W100
205 help
206 Say Y here if you intend to run this kernel on a Toshiba
207 e750 family PDA.
208
209config MACH_E400
210 bool "Toshiba e400"
211 default y
212 depends on ARCH_PXA_ESERIES
213 help
214 Say Y here if you intend to run this kernel on a Toshiba
215 e400 family PDA.
216
217config MACH_E800
218 bool "Toshiba e800"
219 default y
220 depends on ARCH_PXA_ESERIES
221 select FB_W100
222 help 147 help
223 Say Y here if you intend to run this kernel on a Toshiba 148 PXA255 based Single Board Computer with SMC 91C111 ethernet chip and 64 MB of flash.
224 e800 family PDA. 149 Tuned for usage in Libera instruments for particle accelerators.
225 150
226config TRIZEPS_PXA 151config TRIZEPS_PXA
227 bool "PXA based Keith und Koep Trizeps DIMM-Modules" 152 bool "PXA based Keith und Koep Trizeps DIMM-Modules"
228 153
229config MACH_H5000
230 bool "HP iPAQ h5000"
231 select PXA25x
232
233config MACH_TRIZEPS4 154config MACH_TRIZEPS4
234 bool "Keith und Koep Trizeps4 DIMM-Module" 155 bool "Keith und Koep Trizeps4 DIMM-Module"
235 depends on TRIZEPS_PXA 156 depends on TRIZEPS_PXA
@@ -263,13 +184,38 @@ config TRIZEPS_PCMCIA
263 help 184 help
264 Enable PCMCIA support for Trizeps modules 185 Enable PCMCIA support for Trizeps modules
265 186
266config MACH_EM_X270 187config MACH_LOGICPD_PXA270
267 bool "CompuLab EM-x270 platform" 188 bool "LogicPD PXA270 Card Engine Development Platform"
268 select PXA27x 189 select PXA27x
190 select HAVE_PWM
191 select PXA_HAVE_BOARD_IRQS
269 192
270config MACH_EXEDA 193config MACH_PCM027
271 bool "CompuLab eXeda platform" 194 bool "Phytec phyCORE-PXA270 CPU module (PCM-027)"
272 select PXA27x 195 select PXA27x
196 select IWMMXT
197 select PXA_SSP
198 select PXA_HAVE_BOARD_IRQS
199
200config MACH_PCM990_BASEBOARD
201 bool "PHYTEC PCM-990 development board"
202 select HAVE_PWM
203 depends on MACH_PCM027
204
205choice
206 prompt "display on pcm990"
207 depends on MACH_PCM990_BASEBOARD
208
209config PCM990_DISPLAY_SHARP
210 bool "sharp lq084v1dg21 stn display"
211
212config PCM990_DISPLAY_NEC
213 bool "nec nl6448bc20_18d tft display"
214
215config PCM990_DISPLAY_NONE
216 bool "no display"
217
218endchoice
273 219
274config MACH_COLIBRI 220config MACH_COLIBRI
275 bool "Toradex Colibri PXA270" 221 bool "Toradex Colibri PXA270"
@@ -279,45 +225,15 @@ config MACH_COLIBRI300
279 bool "Toradex Colibri PXA300/310" 225 bool "Toradex Colibri PXA300/310"
280 select PXA3xx 226 select PXA3xx
281 select CPU_PXA300 227 select CPU_PXA300
228 select CPU_PXA310
229 select HAVE_PWM
282 230
283config MACH_COLIBRI320 231config MACH_COLIBRI320
284 bool "Toradex Colibri PXA320" 232 bool "Toradex Colibri PXA320"
285 select PXA3xx 233 select PXA3xx
286 select CPU_PXA320 234 select CPU_PXA320
287 235
288config MACH_ZYLONITE 236comment "End-user Products (sorted by vendor name)"
289 bool "PXA3xx Development Platform (aka Zylonite)"
290 select PXA3xx
291 select PXA_SSP
292 select HAVE_PWM
293 select PXA_HAVE_BOARD_IRQS
294
295config MACH_LITTLETON
296 bool "PXA3xx Form Factor Platform (aka Littleton)"
297 select PXA3xx
298 select PXA_SSP
299
300config MACH_TAVOREVB
301 bool "PXA930 Evaluation Board (aka TavorEVB)"
302 select PXA3xx
303 select CPU_PXA930
304
305config MACH_SAAR
306 bool "PXA930 Handheld Platform (aka SAAR)"
307 select PXA3xx
308 select CPU_PXA930
309
310config MACH_ARMCORE
311 bool "CompuLab CM-X255/CM-X270 modules"
312 select PXA27x
313 select IWMMXT
314 select PXA25x
315 select PXA_SSP
316
317config MACH_CM_X300
318 bool "CompuLab CM-X300 modules"
319 select PXA3xx
320 select CPU_PXA300
321 237
322config MACH_H4700 238config MACH_H4700
323 bool "HP iPAQ hx4700" 239 bool "HP iPAQ hx4700"
@@ -327,6 +243,15 @@ config MACH_H4700
327 select HAVE_PWM 243 select HAVE_PWM
328 select PXA_HAVE_BOARD_IRQS 244 select PXA_HAVE_BOARD_IRQS
329 245
246config MACH_H5000
247 bool "HP iPAQ h5000"
248 select PXA25x
249
250config MACH_HIMALAYA
251 bool "HTC Himalaya Support"
252 select CPU_PXA26x
253 select FB_W100
254
330config MACH_MAGICIAN 255config MACH_MAGICIAN
331 bool "Enable HTC Magician Support" 256 bool "Enable HTC Magician Support"
332 select PXA27x 257 select PXA27x
@@ -335,11 +260,6 @@ config MACH_MAGICIAN
335 select HAVE_PWM 260 select HAVE_PWM
336 select PXA_HAVE_BOARD_IRQS 261 select PXA_HAVE_BOARD_IRQS
337 262
338config MACH_HIMALAYA
339 bool "HTC Himalaya Support"
340 select CPU_PXA26x
341 select FB_W100
342
343config MACH_MIOA701 263config MACH_MIOA701
344 bool "Mitac Mio A701 Support" 264 bool "Mitac Mio A701 Support"
345 select PXA27x 265 select PXA27x
@@ -351,13 +271,47 @@ config MACH_MIOA701
351 MIO A701. Currently there is only basic support 271 MIO A701. Currently there is only basic support
352 for this PDA. 272 for this PDA.
353 273
354config MACH_PCM027 274config PXA_EZX
355 bool "Phytec phyCORE-PXA270 CPU module (PCM-027)" 275 bool "Motorola EZX Platform"
356 select PXA27x 276 select PXA27x
357 select IWMMXT 277 select IWMMXT
358 select PXA_SSP 278 select HAVE_PWM
359 select PXA_HAVE_BOARD_IRQS 279 select PXA_HAVE_BOARD_IRQS
360 280
281config MACH_EZX_A780
282 bool "Motorola EZX A780"
283 default y
284 depends on PXA_EZX
285
286config MACH_EZX_E680
287 bool "Motorola EZX E680"
288 default y
289 depends on PXA_EZX
290
291config MACH_EZX_A1200
292 bool "Motorola EZX A1200"
293 default y
294 depends on PXA_EZX
295
296config MACH_EZX_A910
297 bool "Motorola EZX A910"
298 default y
299 depends on PXA_EZX
300
301config MACH_EZX_E6
302 bool "Motorola EZX E6"
303 default y
304 depends on PXA_EZX
305
306config MACH_EZX_E2
307 bool "Motorola EZX E2"
308 default y
309 depends on PXA_EZX
310
311config MACH_MP900C
312 bool "Nec Mobilepro 900/c"
313 select PXA25x
314
361config ARCH_PXA_PALM 315config ARCH_PXA_PALM
362 bool "PXA based Palm PDAs" 316 bool "PXA based Palm PDAs"
363 select HAVE_PWM 317 select HAVE_PWM
@@ -371,6 +325,15 @@ config MACH_PALMTE2
371 Say Y here if you intend to run this kernel on a Palm Tungsten|E2 325 Say Y here if you intend to run this kernel on a Palm Tungsten|E2
372 handheld computer. 326 handheld computer.
373 327
328config MACH_PALMTC
329 bool "Palm Tungsten|C"
330 default y
331 depends on ARCH_PXA_PALM
332 select PXA25x
333 help
334 Say Y here if you intend to run this kernel on a Palm Tungsten|C
335 handheld computer.
336
374config MACH_PALMT5 337config MACH_PALMT5
375 bool "Palm Tungsten|T5" 338 bool "Palm Tungsten|T5"
376 default y 339 default y
@@ -401,93 +364,172 @@ config MACH_PALMZ72
401 Say Y here if you intend to run this kernel on Palm Zire 72 364 Say Y here if you intend to run this kernel on Palm Zire 72
402 handheld computer. 365 handheld computer.
403 366
404config MACH_TREO680 367config MACH_PALMLD
405 bool "Palm Treo 680" 368 bool "Palm LifeDrive"
406 default y 369 default y
407 depends on ARCH_PXA_PALM 370 depends on ARCH_PXA_PALM
408 select PXA27x 371 select PXA27x
409 select IWMMXT 372 select IWMMXT
410 help 373 help
411 Say Y here if you intend to run this kernel on Palm Treo 680 374 Say Y here if you intend to run this kernel on a Palm LifeDrive
375 handheld computer.
376
377config PALM_TREO
378 bool
379 depends on ARCH_PXA_PALM
380
381config MACH_CENTRO
382 bool "Palm Centro 685 (GSM)"
383 default y
384 depends on ARCH_PXA_PALM
385 select PXA27x
386 select IWMMXT
387 select PALM_TREO
388 help
389 Say Y here if you intend to run this kernel on Palm Centro 685 (GSM)
412 smartphone. 390 smartphone.
413 391
414config MACH_PALMLD 392config MACH_TREO680
415 bool "Palm LifeDrive" 393 bool "Palm Treo 680"
416 default y 394 default y
417 depends on ARCH_PXA_PALM 395 depends on ARCH_PXA_PALM
418 select PXA27x 396 select PXA27x
419 select IWMMXT 397 select IWMMXT
398 select PALM_TREO
420 help 399 help
421 Say Y here if you intend to run this kernel on a Palm LifeDrive 400 Say Y here if you intend to run this kernel on Palm Treo 680
401 smartphone.
402
403config PXA_SHARPSL
404 bool "SHARP Zaurus SL-5600, SL-C7xx and SL-Cxx00 Models"
405 select SHARP_SCOOP
406 select SHARP_PARAM
407 help
408 Say Y here if you intend to run this kernel on a
409 Sharp Zaurus SL-5600 (Poodle), SL-C700 (Corgi),
410 SL-C750 (Shepherd), SL-C760 (Husky), SL-C1000 (Akita),
411 SL-C3000 (Spitz), SL-C3100 (Borzoi) or SL-C6000x (Tosa)
422 handheld computer. 412 handheld computer.
423 413
424config MACH_PCM990_BASEBOARD 414config SHARPSL_PM
425 bool "PHYTEC PCM-990 development board" 415 bool
426 select HAVE_PWM 416 select APM_EMULATION
427 depends on MACH_PCM027
428 417
429choice 418config CORGI_SSP_DEPRECATED
430 prompt "display on pcm990" 419 bool
431 depends on MACH_PCM990_BASEBOARD 420 select PXA_SSP
421 help
422 This option will include corgi_ssp.c and corgi_lcd.c
423 that corgi_ts.c and other legacy drivers (corgi_bl.c
424 and sharpsl_pm.c) may depend on.
432 425
433config PCM990_DISPLAY_SHARP 426config MACH_POODLE
434 bool "sharp lq084v1dg21 stn display" 427 bool "Enable Sharp SL-5600 (Poodle) Support"
428 depends on PXA_SHARPSL
429 select PXA25x
430 select SHARP_LOCOMO
431 select PXA_SSP
435 432
436config PCM990_DISPLAY_NEC 433config MACH_CORGI
437 bool "nec nl6448bc20_18d tft display" 434 bool "Enable Sharp SL-C700 (Corgi) Support"
435 depends on PXA_SHARPSL
436 select PXA25x
437 select PXA_SHARP_C7xx
438 438
439config PCM990_DISPLAY_NONE 439config MACH_SHEPHERD
440 bool "no display" 440 bool "Enable Sharp SL-C750 (Shepherd) Support"
441 depends on PXA_SHARPSL
442 select PXA25x
443 select PXA_SHARP_C7xx
441 444
442endchoice 445config MACH_HUSKY
446 bool "Enable Sharp SL-C760 (Husky) Support"
447 depends on PXA_SHARPSL
448 select PXA25x
449 select PXA_SHARP_C7xx
443 450
444config MACH_CSB726 451config MACH_AKITA
445 bool "Enable Cogent CSB726 System On a Module" 452 bool "Enable Sharp SL-1000 (Akita) Support"
453 depends on PXA_SHARPSL
446 select PXA27x 454 select PXA27x
447 select IWMMXT 455 select PXA_SHARP_Cxx00
448 help 456 select MACH_SPITZ
449 Say Y here if you intend to run this kernel on a Cogent 457 select I2C
450 CSB726 System On Module. 458 select I2C_PXA
451 459
452config CSB726_CSB701 460config MACH_SPITZ
453 bool "Enable supprot for CSB701 baseboard" 461 bool "Enable Sharp Zaurus SL-3000 (Spitz) Support"
454 depends on MACH_CSB726 462 depends on PXA_SHARPSL
463 select PXA27x
464 select PXA_SHARP_Cxx00
455 465
456config PXA_EZX 466config MACH_BORZOI
457 bool "Motorola EZX Platform" 467 bool "Enable Sharp Zaurus SL-3100 (Borzoi) Support"
468 depends on PXA_SHARPSL
458 select PXA27x 469 select PXA27x
459 select IWMMXT 470 select PXA_SHARP_Cxx00
460 select HAVE_PWM
461 471
462config MACH_EZX_A780 472config MACH_TOSA
463 bool "Motorola EZX A780" 473 bool "Enable Sharp SL-6000x (Tosa) Support"
474 depends on PXA_SHARPSL
475 select PXA25x
476 select PXA_HAVE_BOARD_IRQS
477
478config ARCH_PXA_ESERIES
479 bool "PXA based Toshiba e-series PDAs"
480 select PXA25x
481 select PXA_HAVE_BOARD_IRQS
482
483config MACH_E330
484 bool "Toshiba e330"
464 default y 485 default y
465 depends on PXA_EZX 486 depends on ARCH_PXA_ESERIES
487 help
488 Say Y here if you intend to run this kernel on a Toshiba
489 e330 family PDA.
466 490
467config MACH_EZX_E680 491config MACH_E350
468 bool "Motorola EZX E680" 492 bool "Toshiba e350"
469 default y 493 default y
470 depends on PXA_EZX 494 depends on ARCH_PXA_ESERIES
495 help
496 Say Y here if you intend to run this kernel on a Toshiba
497 e350 family PDA.
471 498
472config MACH_EZX_A1200 499config MACH_E740
473 bool "Motorola EZX A1200" 500 bool "Toshiba e740"
474 default y 501 default y
475 depends on PXA_EZX 502 depends on ARCH_PXA_ESERIES
503 select FB_W100
504 help
505 Say Y here if you intend to run this kernel on a Toshiba
506 e740 family PDA.
476 507
477config MACH_EZX_A910 508config MACH_E750
478 bool "Motorola EZX A910" 509 bool "Toshiba e750"
479 default y 510 default y
480 depends on PXA_EZX 511 depends on ARCH_PXA_ESERIES
512 select FB_W100
513 help
514 Say Y here if you intend to run this kernel on a Toshiba
515 e750 family PDA.
481 516
482config MACH_EZX_E6 517config MACH_E400
483 bool "Motorola EZX E6" 518 bool "Toshiba e400"
484 default y 519 default y
485 depends on PXA_EZX 520 depends on ARCH_PXA_ESERIES
521 help
522 Say Y here if you intend to run this kernel on a Toshiba
523 e400 family PDA.
486 524
487config MACH_EZX_E2 525config MACH_E800
488 bool "Motorola EZX E2" 526 bool "Toshiba e800"
489 default y 527 default y
490 depends on PXA_EZX 528 depends on ARCH_PXA_ESERIES
529 select FB_W100
530 help
531 Say Y here if you intend to run this kernel on a Toshiba
532 e800 family PDA.
491 533
492endmenu 534endmenu
493 535
@@ -515,6 +557,42 @@ config PXA3xx
515 help 557 help
516 Select code specific to PXA3xx variants 558 Select code specific to PXA3xx variants
517 559
560config CPU_PXA300
561 bool
562 select PXA3xx
563 help
564 PXA300 (codename Monahans-L)
565
566config CPU_PXA310
567 bool
568 select CPU_PXA300
569 help
570 PXA310 (codename Monahans-LV)
571
572config CPU_PXA320
573 bool
574 select PXA3xx
575 help
576 PXA320 (codename Monahans-P)
577
578config CPU_PXA930
579 bool
580 select PXA3xx
581 help
582 PXA930 (codename Tavor-P)
583
584config CPU_PXA935
585 bool
586 select CPU_PXA930
587 help
588 PXA935 (codename Tavor-P65)
589
590config CPU_PXA950
591 bool
592 select CPU_PXA930
593 help
594 PXA950 (codename Tavor-PV2)
595
518config PXA_SHARP_C7xx 596config PXA_SHARP_C7xx
519 bool 597 bool
520 select PXA_SSP 598 select PXA_SSP
diff --git a/arch/arm/mach-pxa/Makefile b/arch/arm/mach-pxa/Makefile
index d4c6122a342f..b5d29e60a341 100644
--- a/arch/arm/mach-pxa/Makefile
+++ b/arch/arm/mach-pxa/Makefile
@@ -24,32 +24,63 @@ obj-$(CONFIG_CPU_PXA300) += pxa300.o
24obj-$(CONFIG_CPU_PXA320) += pxa320.o 24obj-$(CONFIG_CPU_PXA320) += pxa320.o
25obj-$(CONFIG_CPU_PXA930) += pxa930.o 25obj-$(CONFIG_CPU_PXA930) += pxa930.o
26 26
27# Specific board support 27# NOTE: keep the order of boards in accordance to their order in Kconfig
28obj-$(CONFIG_ARCH_GUMSTIX) += gumstix.o 28
29obj-$(CONFIG_GUMSTIX_AM200EPD) += am200epd.o 29# Intel/Marvell Dev Platforms
30obj-$(CONFIG_GUMSTIX_AM300EPD) += am300epd.o
31obj-$(CONFIG_ARCH_LUBBOCK) += lubbock.o 30obj-$(CONFIG_ARCH_LUBBOCK) += lubbock.o
32obj-$(CONFIG_MACH_LOGICPD_PXA270) += lpd270.o
33obj-$(CONFIG_MACH_MAINSTONE) += mainstone.o 31obj-$(CONFIG_MACH_MAINSTONE) += mainstone.o
34obj-$(CONFIG_MACH_MP900C) += mp900.o 32obj-$(CONFIG_MACH_ZYLONITE300) += zylonite.o zylonite_pxa300.o
33obj-$(CONFIG_MACH_ZYLONITE320) += zylonite.o zylonite_pxa320.o
34obj-$(CONFIG_MACH_LITTLETON) += littleton.o
35obj-$(CONFIG_MACH_TAVOREVB) += tavorevb.o
36obj-$(CONFIG_MACH_SAAR) += saar.o
37
38# 3rd Party Dev Platforms
35obj-$(CONFIG_ARCH_PXA_IDP) += idp.o 39obj-$(CONFIG_ARCH_PXA_IDP) += idp.o
40obj-$(CONFIG_ARCH_VIPER) += viper.o
41obj-$(CONFIG_MACH_BALLOON3) += balloon3.o
42obj-$(CONFIG_MACH_CSB726) += csb726.o
43obj-$(CONFIG_CSB726_CSB701) += csb701.o
44obj-$(CONFIG_MACH_ARMCORE) += cm-x2xx.o cm-x255.o cm-x270.o
45ifeq ($(CONFIG_PCI),y)
46obj-$(CONFIG_MACH_ARMCORE) += cm-x2xx-pci.o
47endif
48obj-$(CONFIG_MACH_EM_X270) += em-x270.o
49obj-$(CONFIG_MACH_CM_X300) += cm-x300.o
50obj-$(CONFIG_ARCH_GUMSTIX) += gumstix.o
51obj-$(CONFIG_GUMSTIX_AM200EPD) += am200epd.o
52obj-$(CONFIG_GUMSTIX_AM300EPD) += am300epd.o
53obj-$(CONFIG_MACH_INTELMOTE2) += imote2.o
54obj-$(CONFIG_MACH_STARGATE2) += stargate2.o
55obj-$(CONFIG_MACH_XCEP) += xcep.o
36obj-$(CONFIG_MACH_TRIZEPS4) += trizeps4.o 56obj-$(CONFIG_MACH_TRIZEPS4) += trizeps4.o
57obj-$(CONFIG_MACH_LOGICPD_PXA270) += lpd270.o
58obj-$(CONFIG_MACH_PCM027) += pcm027.o
59obj-$(CONFIG_MACH_PCM990_BASEBOARD) += pcm990-baseboard.o
37obj-$(CONFIG_MACH_COLIBRI) += colibri-pxa270.o 60obj-$(CONFIG_MACH_COLIBRI) += colibri-pxa270.o
38obj-$(CONFIG_MACH_COLIBRI300) += colibri-pxa3xx.o colibri-pxa300.o 61obj-$(CONFIG_MACH_COLIBRI300) += colibri-pxa3xx.o colibri-pxa300.o
39obj-$(CONFIG_MACH_COLIBRI320) += colibri-pxa3xx.o colibri-pxa320.o 62obj-$(CONFIG_MACH_COLIBRI320) += colibri-pxa3xx.o colibri-pxa320.o
63
64# End-user Products
65obj-$(CONFIG_MACH_H4700) += hx4700.o
40obj-$(CONFIG_MACH_H5000) += h5000.o 66obj-$(CONFIG_MACH_H5000) += h5000.o
67obj-$(CONFIG_MACH_HIMALAYA) += himalaya.o
68obj-$(CONFIG_MACH_MAGICIAN) += magician.o
69obj-$(CONFIG_MACH_MIOA701) += mioa701.o mioa701_bootresume.o
70obj-$(CONFIG_PXA_EZX) += ezx.o
71obj-$(CONFIG_MACH_MP900C) += mp900.o
72obj-$(CONFIG_MACH_PALMTE2) += palmte2.o
73obj-$(CONFIG_MACH_PALMTC) += palmtc.o
74obj-$(CONFIG_MACH_PALMT5) += palmt5.o
75obj-$(CONFIG_MACH_PALMTX) += palmtx.o
76obj-$(CONFIG_MACH_PALMZ72) += palmz72.o
77obj-$(CONFIG_MACH_PALMLD) += palmld.o
78obj-$(CONFIG_PALM_TREO) += palmtreo.o
41obj-$(CONFIG_PXA_SHARP_C7xx) += corgi.o sharpsl_pm.o corgi_pm.o 79obj-$(CONFIG_PXA_SHARP_C7xx) += corgi.o sharpsl_pm.o corgi_pm.o
42obj-$(CONFIG_PXA_SHARP_Cxx00) += spitz.o sharpsl_pm.o spitz_pm.o 80obj-$(CONFIG_PXA_SHARP_Cxx00) += spitz.o sharpsl_pm.o spitz_pm.o
43obj-$(CONFIG_CORGI_SSP_DEPRECATED) += corgi_ssp.o corgi_lcd.o 81obj-$(CONFIG_CORGI_SSP_DEPRECATED) += corgi_ssp.o corgi_lcd.o
44obj-$(CONFIG_MACH_POODLE) += poodle.o 82obj-$(CONFIG_MACH_POODLE) += poodle.o
45obj-$(CONFIG_MACH_PCM027) += pcm027.o
46obj-$(CONFIG_MACH_PCM990_BASEBOARD) += pcm990-baseboard.o
47obj-$(CONFIG_MACH_TOSA) += tosa.o 83obj-$(CONFIG_MACH_TOSA) += tosa.o
48obj-$(CONFIG_MACH_EM_X270) += em-x270.o
49obj-$(CONFIG_MACH_H4700) += hx4700.o
50obj-$(CONFIG_MACH_MAGICIAN) += magician.o
51obj-$(CONFIG_MACH_HIMALAYA) += himalaya.o
52obj-$(CONFIG_MACH_MIOA701) += mioa701.o mioa701_bootresume.o
53obj-$(CONFIG_ARCH_PXA_ESERIES) += eseries.o 84obj-$(CONFIG_ARCH_PXA_ESERIES) += eseries.o
54obj-$(CONFIG_MACH_E330) += e330.o 85obj-$(CONFIG_MACH_E330) += e330.o
55obj-$(CONFIG_MACH_E350) += e350.o 86obj-$(CONFIG_MACH_E350) += e350.o
@@ -57,31 +88,6 @@ obj-$(CONFIG_MACH_E740) += e740.o
57obj-$(CONFIG_MACH_E750) += e750.o 88obj-$(CONFIG_MACH_E750) += e750.o
58obj-$(CONFIG_MACH_E400) += e400.o 89obj-$(CONFIG_MACH_E400) += e400.o
59obj-$(CONFIG_MACH_E800) += e800.o 90obj-$(CONFIG_MACH_E800) += e800.o
60obj-$(CONFIG_MACH_PALMTE2) += palmte2.o
61obj-$(CONFIG_MACH_PALMT5) += palmt5.o
62obj-$(CONFIG_MACH_PALMTX) += palmtx.o
63obj-$(CONFIG_MACH_PALMLD) += palmld.o
64obj-$(CONFIG_MACH_PALMZ72) += palmz72.o
65obj-$(CONFIG_MACH_TREO680) += treo680.o
66obj-$(CONFIG_ARCH_VIPER) += viper.o
67
68ifeq ($(CONFIG_MACH_ZYLONITE),y)
69 obj-y += zylonite.o
70 obj-$(CONFIG_CPU_PXA300) += zylonite_pxa300.o
71 obj-$(CONFIG_CPU_PXA320) += zylonite_pxa320.o
72endif
73obj-$(CONFIG_MACH_LITTLETON) += littleton.o
74obj-$(CONFIG_MACH_TAVOREVB) += tavorevb.o
75obj-$(CONFIG_MACH_SAAR) += saar.o
76
77obj-$(CONFIG_MACH_ARMCORE) += cm-x2xx.o cm-x255.o cm-x270.o
78obj-$(CONFIG_MACH_CM_X300) += cm-x300.o
79obj-$(CONFIG_PXA_EZX) += ezx.o
80
81obj-$(CONFIG_MACH_INTELMOTE2) += imote2.o
82obj-$(CONFIG_MACH_STARGATE2) += stargate2.o
83obj-$(CONFIG_MACH_CSB726) += csb726.o
84obj-$(CONFIG_CSB726_CSB701) += csb701.o
85 91
86# Support for blinky lights 92# Support for blinky lights
87led-y := leds.o 93led-y := leds.o
@@ -91,8 +97,4 @@ led-$(CONFIG_ARCH_PXA_IDP) += leds-idp.o
91 97
92obj-$(CONFIG_LEDS) += $(led-y) 98obj-$(CONFIG_LEDS) += $(led-y)
93 99
94ifeq ($(CONFIG_PCI),y)
95obj-$(CONFIG_MACH_ARMCORE) += cm-x2xx-pci.o
96endif
97
98obj-$(CONFIG_TOSA_BT) += tosa-bt.o 100obj-$(CONFIG_TOSA_BT) += tosa-bt.o
diff --git a/arch/arm/mach-pxa/balloon3.c b/arch/arm/mach-pxa/balloon3.c
new file mode 100644
index 000000000000..b8cd07ca9380
--- /dev/null
+++ b/arch/arm/mach-pxa/balloon3.c
@@ -0,0 +1,365 @@
1/*
2 * linux/arch/arm/mach-pxa/balloon3.c
3 *
4 * Support for Balloonboard.org Balloon3 board.
5 *
6 * Author: Nick Bane, Wookey, Jonathan McDowell
7 * Created: June, 2006
8 * Copyright: Toby Churchill Ltd
9 * Derived from mainstone.c, by Nico Pitre
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License version 2 as
13 * published by the Free Software Foundation.
14 */
15
16#include <linux/init.h>
17#include <linux/platform_device.h>
18#include <linux/sysdev.h>
19#include <linux/interrupt.h>
20#include <linux/sched.h>
21#include <linux/bitops.h>
22#include <linux/fb.h>
23#include <linux/gpio.h>
24#include <linux/ioport.h>
25#include <linux/mtd/mtd.h>
26#include <linux/mtd/partitions.h>
27#include <linux/types.h>
28
29#include <asm/setup.h>
30#include <asm/mach-types.h>
31#include <asm/irq.h>
32#include <asm/sizes.h>
33
34#include <asm/mach/arch.h>
35#include <asm/mach/map.h>
36#include <asm/mach/irq.h>
37#include <asm/mach/flash.h>
38
39#include <mach/pxa27x.h>
40#include <mach/balloon3.h>
41#include <mach/audio.h>
42#include <mach/pxafb.h>
43#include <mach/mmc.h>
44#include <mach/udc.h>
45#include <mach/pxa27x-udc.h>
46#include <mach/irda.h>
47#include <mach/ohci.h>
48
49#include <plat/i2c.h>
50
51#include "generic.h"
52#include "devices.h"
53
54static unsigned long balloon3_irq_enabled;
55
56static unsigned long balloon3_features_present =
57 (1 << BALLOON3_FEATURE_OHCI) | (1 << BALLOON3_FEATURE_CF) |
58 (1 << BALLOON3_FEATURE_AUDIO) |
59 (1 << BALLOON3_FEATURE_TOPPOLY);
60
61int balloon3_has(enum balloon3_features feature)
62{
63 return (balloon3_features_present & (1 << feature)) ? 1 : 0;
64}
65EXPORT_SYMBOL_GPL(balloon3_has);
66
67int __init parse_balloon3_features(char *arg)
68{
69 if (!arg)
70 return 0;
71
72 return strict_strtoul(arg, 0, &balloon3_features_present);
73}
74early_param("balloon3_features", parse_balloon3_features);
75
76static void balloon3_mask_irq(unsigned int irq)
77{
78 int balloon3_irq = (irq - BALLOON3_IRQ(0));
79 balloon3_irq_enabled &= ~(1 << balloon3_irq);
80 __raw_writel(~balloon3_irq_enabled, BALLOON3_INT_CONTROL_REG);
81}
82
83static void balloon3_unmask_irq(unsigned int irq)
84{
85 int balloon3_irq = (irq - BALLOON3_IRQ(0));
86 balloon3_irq_enabled |= (1 << balloon3_irq);
87 __raw_writel(~balloon3_irq_enabled, BALLOON3_INT_CONTROL_REG);
88}
89
90static struct irq_chip balloon3_irq_chip = {
91 .name = "FPGA",
92 .ack = balloon3_mask_irq,
93 .mask = balloon3_mask_irq,
94 .unmask = balloon3_unmask_irq,
95};
96
97static void balloon3_irq_handler(unsigned int irq, struct irq_desc *desc)
98{
99 unsigned long pending = __raw_readl(BALLOON3_INT_CONTROL_REG) &
100 balloon3_irq_enabled;
101
102 do {
103 /* clear useless edge notification */
104 if (desc->chip->ack)
105 desc->chip->ack(BALLOON3_AUX_NIRQ);
106 while (pending) {
107 irq = BALLOON3_IRQ(0) + __ffs(pending);
108 generic_handle_irq(irq);
109 pending &= pending - 1;
110 }
111 pending = __raw_readl(BALLOON3_INT_CONTROL_REG) &
112 balloon3_irq_enabled;
113 } while (pending);
114}
115
116static void __init balloon3_init_irq(void)
117{
118 int irq;
119
120 pxa27x_init_irq();
121 /* setup extra Balloon3 irqs */
122 for (irq = BALLOON3_IRQ(0); irq <= BALLOON3_IRQ(7); irq++) {
123 set_irq_chip(irq, &balloon3_irq_chip);
124 set_irq_handler(irq, handle_level_irq);
125 set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
126 }
127
128 set_irq_chained_handler(BALLOON3_AUX_NIRQ, balloon3_irq_handler);
129 set_irq_type(BALLOON3_AUX_NIRQ, IRQ_TYPE_EDGE_FALLING);
130
131 pr_debug("%s: chained handler installed - irq %d automatically "
132 "enabled\n", __func__, BALLOON3_AUX_NIRQ);
133}
134
135static void balloon3_backlight_power(int on)
136{
137 pr_debug("%s: power is %s\n", __func__, on ? "on" : "off");
138 gpio_set_value(BALLOON3_GPIO_RUN_BACKLIGHT, on);
139}
140
141static unsigned long balloon3_lcd_pin_config[] = {
142 /* LCD - 16bpp Active TFT */
143 GPIO58_LCD_LDD_0,
144 GPIO59_LCD_LDD_1,
145 GPIO60_LCD_LDD_2,
146 GPIO61_LCD_LDD_3,
147 GPIO62_LCD_LDD_4,
148 GPIO63_LCD_LDD_5,
149 GPIO64_LCD_LDD_6,
150 GPIO65_LCD_LDD_7,
151 GPIO66_LCD_LDD_8,
152 GPIO67_LCD_LDD_9,
153 GPIO68_LCD_LDD_10,
154 GPIO69_LCD_LDD_11,
155 GPIO70_LCD_LDD_12,
156 GPIO71_LCD_LDD_13,
157 GPIO72_LCD_LDD_14,
158 GPIO73_LCD_LDD_15,
159 GPIO74_LCD_FCLK,
160 GPIO75_LCD_LCLK,
161 GPIO76_LCD_PCLK,
162 GPIO77_LCD_BIAS,
163
164 GPIO99_GPIO, /* Backlight */
165};
166
167static struct pxafb_mode_info balloon3_lcd_modes[] = {
168 {
169 .pixclock = 38000,
170 .xres = 480,
171 .yres = 640,
172 .bpp = 16,
173 .hsync_len = 8,
174 .left_margin = 8,
175 .right_margin = 8,
176 .vsync_len = 2,
177 .upper_margin = 4,
178 .lower_margin = 5,
179 .sync = 0,
180 },
181};
182
183static struct pxafb_mach_info balloon3_pxafb_info = {
184 .modes = balloon3_lcd_modes,
185 .num_modes = ARRAY_SIZE(balloon3_lcd_modes),
186 .lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
187 .pxafb_backlight_power = balloon3_backlight_power,
188};
189
190static unsigned long balloon3_mmc_pin_config[] = {
191 GPIO32_MMC_CLK,
192 GPIO92_MMC_DAT_0,
193 GPIO109_MMC_DAT_1,
194 GPIO110_MMC_DAT_2,
195 GPIO111_MMC_DAT_3,
196 GPIO112_MMC_CMD,
197};
198
199static void balloon3_mci_setpower(struct device *dev, unsigned int vdd)
200{
201 struct pxamci_platform_data *p_d = dev->platform_data;
202
203 if ((1 << vdd) & p_d->ocr_mask) {
204 pr_debug("%s: on\n", __func__);
205 /* FIXME something to prod here? */
206 } else {
207 pr_debug("%s: off\n", __func__);
208 /* FIXME something to prod here? */
209 }
210}
211
212static struct pxamci_platform_data balloon3_mci_platform_data = {
213 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34,
214 .setpower = balloon3_mci_setpower,
215};
216
217static int balloon3_udc_is_connected(void)
218{
219 pr_debug("%s: udc connected\n", __func__);
220 return 1;
221}
222
223static void balloon3_udc_command(int cmd)
224{
225 switch (cmd) {
226 case PXA2XX_UDC_CMD_CONNECT:
227 UP2OCR |= (UP2OCR_DPPUE + UP2OCR_DPPUBE);
228 pr_debug("%s: connect\n", __func__);
229 break;
230 case PXA2XX_UDC_CMD_DISCONNECT:
231 UP2OCR &= ~UP2OCR_DPPUE;
232 pr_debug("%s: disconnect\n", __func__);
233 break;
234 }
235}
236
237static struct pxa2xx_udc_mach_info balloon3_udc_info = {
238 .udc_is_connected = balloon3_udc_is_connected,
239 .udc_command = balloon3_udc_command,
240};
241
242static struct pxaficp_platform_data balloon3_ficp_platform_data = {
243 .transceiver_cap = IR_SIRMODE | IR_FIRMODE | IR_OFF,
244};
245
246static unsigned long balloon3_ohci_pin_config[] = {
247 GPIO88_USBH1_PWR,
248 GPIO89_USBH1_PEN,
249};
250
251static struct pxaohci_platform_data balloon3_ohci_platform_data = {
252 .port_mode = PMM_PERPORT_MODE,
253 .flags = ENABLE_PORT_ALL | POWER_CONTROL_LOW | POWER_SENSE_LOW,
254};
255
256static unsigned long balloon3_pin_config[] __initdata = {
257 /* Select BTUART 'COM1/ttyS0' as IO option for pins 42/43/44/45 */
258 GPIO42_BTUART_RXD,
259 GPIO43_BTUART_TXD,
260 GPIO44_BTUART_CTS,
261 GPIO45_BTUART_RTS,
262
263 /* Wakeup GPIO */
264 GPIO1_GPIO | WAKEUP_ON_EDGE_BOTH,
265
266 /* NAND & IDLE LED GPIOs */
267 GPIO9_GPIO,
268 GPIO10_GPIO,
269};
270
271static struct gpio_led balloon3_gpio_leds[] = {
272 {
273 .name = "balloon3:green:idle",
274 .default_trigger = "heartbeat",
275 .gpio = BALLOON3_GPIO_LED_IDLE,
276 .active_low = 1,
277 },
278 {
279 .name = "balloon3:green:nand",
280 .default_trigger = "nand-disk",
281 .gpio = BALLOON3_GPIO_LED_NAND,
282 .active_low = 1,
283 },
284};
285
286static struct gpio_led_platform_data balloon3_gpio_leds_platform_data = {
287 .leds = balloon3_gpio_leds,
288 .num_leds = ARRAY_SIZE(balloon3_gpio_leds),
289};
290
291static struct platform_device balloon3led_device = {
292 .name = "leds-gpio",
293 .id = -1,
294 .dev = {
295 .platform_data = &balloon3_gpio_leds_platform_data,
296 },
297};
298
299static void __init balloon3_init(void)
300{
301 pr_info("Initialising Balloon3\n");
302
303 /* system bus arbiter setting
304 * - Core_Park
305 * - LCD_wt:DMA_wt:CORE_Wt = 2:3:4
306 */
307 ARB_CNTRL = ARB_CORE_PARK | 0x234;
308
309 pxa_set_ffuart_info(NULL);
310 pxa_set_btuart_info(NULL);
311 pxa_set_stuart_info(NULL);
312
313 pxa_set_i2c_info(NULL);
314 if (balloon3_has(BALLOON3_FEATURE_AUDIO))
315 pxa_set_ac97_info(NULL);
316
317 if (balloon3_has(BALLOON3_FEATURE_TOPPOLY)) {
318 pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_lcd_pin_config));
319 gpio_request(BALLOON3_GPIO_RUN_BACKLIGHT,
320 "LCD Backlight Power");
321 gpio_direction_output(BALLOON3_GPIO_RUN_BACKLIGHT, 1);
322 set_pxa_fb_info(&balloon3_pxafb_info);
323 }
324
325 if (balloon3_has(BALLOON3_FEATURE_MMC)) {
326 pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_mmc_pin_config));
327 pxa_set_mci_info(&balloon3_mci_platform_data);
328 }
329 pxa_set_ficp_info(&balloon3_ficp_platform_data);
330 if (balloon3_has(BALLOON3_FEATURE_OHCI)) {
331 pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_ohci_pin_config));
332 pxa_set_ohci_info(&balloon3_ohci_platform_data);
333 }
334 pxa_set_udc_info(&balloon3_udc_info);
335
336 pxa2xx_mfp_config(ARRAY_AND_SIZE(balloon3_pin_config));
337
338 platform_device_register(&balloon3led_device);
339}
340
341static struct map_desc balloon3_io_desc[] __initdata = {
342 { /* CPLD/FPGA */
343 .virtual = BALLOON3_FPGA_VIRT,
344 .pfn = __phys_to_pfn(BALLOON3_FPGA_PHYS),
345 .length = BALLOON3_FPGA_LENGTH,
346 .type = MT_DEVICE,
347 },
348};
349
350static void __init balloon3_map_io(void)
351{
352 pxa_map_io();
353 iotable_init(balloon3_io_desc, ARRAY_SIZE(balloon3_io_desc));
354}
355
356MACHINE_START(BALLOON3, "Balloon3")
357 /* Maintainer: Nick Bane. */
358 .phys_io = 0x40000000,
359 .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
360 .map_io = balloon3_map_io,
361 .init_irq = balloon3_init_irq,
362 .timer = &pxa_timer,
363 .init_machine = balloon3_init,
364 .boot_params = PHYS_OFFSET + 0x100,
365MACHINE_END
diff --git a/arch/arm/mach-pxa/clock.h b/arch/arm/mach-pxa/clock.h
index 5599bceff738..978a3667e90d 100644
--- a/arch/arm/mach-pxa/clock.h
+++ b/arch/arm/mach-pxa/clock.h
@@ -12,7 +12,6 @@ struct clk {
12 unsigned int cken; 12 unsigned int cken;
13 unsigned int delay; 13 unsigned int delay;
14 unsigned int enabled; 14 unsigned int enabled;
15 struct clk *other;
16}; 15};
17 16
18#define INIT_CLKREG(_clk,_devname,_conname) \ 17#define INIT_CLKREG(_clk,_devname,_conname) \
diff --git a/arch/arm/mach-pxa/cm-x270.c b/arch/arm/mach-pxa/cm-x270.c
index 1d2cec25391d..eea78b6c2bc5 100644
--- a/arch/arm/mach-pxa/cm-x270.c
+++ b/arch/arm/mach-pxa/cm-x270.c
@@ -13,13 +13,18 @@
13#include <linux/sysdev.h> 13#include <linux/sysdev.h>
14#include <linux/irq.h> 14#include <linux/irq.h>
15#include <linux/gpio.h> 15#include <linux/gpio.h>
16#include <linux/delay.h>
16 17
17#include <linux/rtc-v3020.h> 18#include <linux/rtc-v3020.h>
18#include <video/mbxfb.h> 19#include <video/mbxfb.h>
19 20
21#include <linux/spi/spi.h>
22#include <linux/spi/libertas_spi.h>
23
20#include <mach/pxa27x.h> 24#include <mach/pxa27x.h>
21#include <mach/ohci.h> 25#include <mach/ohci.h>
22#include <mach/mmc.h> 26#include <mach/mmc.h>
27#include <mach/pxa2xx_spi.h>
23 28
24#include "generic.h" 29#include "generic.h"
25 30
@@ -34,6 +39,10 @@
34/* MMC power enable */ 39/* MMC power enable */
35#define GPIO105_MMC_POWER (105) 40#define GPIO105_MMC_POWER (105)
36 41
42/* WLAN GPIOS */
43#define GPIO19_WLAN_STRAP (19)
44#define GPIO102_WLAN_RST (102)
45
37static unsigned long cmx270_pin_config[] = { 46static unsigned long cmx270_pin_config[] = {
38 /* AC'97 */ 47 /* AC'97 */
39 GPIO28_AC97_BITCLK, 48 GPIO28_AC97_BITCLK,
@@ -94,8 +103,8 @@ static unsigned long cmx270_pin_config[] = {
94 GPIO26_SSP1_RXD, 103 GPIO26_SSP1_RXD,
95 104
96 /* SSP2 */ 105 /* SSP2 */
97 GPIO19_SSP2_SCLK, 106 GPIO19_GPIO, /* SSP2 clock is used as GPIO for Libertas pin-strap */
98 GPIO14_SSP2_SFRM, 107 GPIO14_GPIO,
99 GPIO87_SSP2_TXD, 108 GPIO87_SSP2_TXD,
100 GPIO88_SSP2_RXD, 109 GPIO88_SSP2_RXD,
101 110
@@ -123,6 +132,7 @@ static unsigned long cmx270_pin_config[] = {
123 GPIO0_GPIO | WAKEUP_ON_EDGE_BOTH, 132 GPIO0_GPIO | WAKEUP_ON_EDGE_BOTH,
124 GPIO105_GPIO | MFP_LPM_DRIVE_HIGH, /* MMC/SD power */ 133 GPIO105_GPIO | MFP_LPM_DRIVE_HIGH, /* MMC/SD power */
125 GPIO53_GPIO, /* PC card reset */ 134 GPIO53_GPIO, /* PC card reset */
135 GPIO102_GPIO, /* WLAN reset */
126 136
127 /* NAND controls */ 137 /* NAND controls */
128 GPIO11_GPIO | MFP_LPM_DRIVE_HIGH, /* NAND CE# */ 138 GPIO11_GPIO | MFP_LPM_DRIVE_HIGH, /* NAND CE# */
@@ -131,6 +141,7 @@ static unsigned long cmx270_pin_config[] = {
131 /* interrupts */ 141 /* interrupts */
132 GPIO10_GPIO, /* DM9000 interrupt */ 142 GPIO10_GPIO, /* DM9000 interrupt */
133 GPIO83_GPIO, /* MMC card detect */ 143 GPIO83_GPIO, /* MMC card detect */
144 GPIO95_GPIO, /* WLAN interrupt */
134}; 145};
135 146
136/* V3020 RTC */ 147/* V3020 RTC */
@@ -271,64 +282,114 @@ static inline void cmx270_init_ohci(void) {}
271#endif 282#endif
272 283
273#if defined(CONFIG_MMC) || defined(CONFIG_MMC_MODULE) 284#if defined(CONFIG_MMC) || defined(CONFIG_MMC_MODULE)
274static int cmx270_mci_init(struct device *dev, 285static struct pxamci_platform_data cmx270_mci_platform_data = {
275 irq_handler_t cmx270_detect_int, 286 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34,
276 void *data) 287 .gpio_card_detect = GPIO83_MMC_IRQ,
288 .gpio_card_ro = -1,
289 .gpio_power = GPIO105_MMC_POWER,
290 .gpio_power_invert = 1,
291};
292
293static void __init cmx270_init_mmc(void)
277{ 294{
278 int err; 295 pxa_set_mci_info(&cmx270_mci_platform_data);
296}
297#else
298static inline void cmx270_init_mmc(void) {}
299#endif
300
301#if defined(CONFIG_SPI_PXA2XX) || defined(CONFIG_SPI_PXA2XX_MODULE)
302static struct pxa2xx_spi_master cm_x270_spi_info = {
303 .num_chipselect = 1,
304 .enable_dma = 1,
305};
306
307static struct pxa2xx_spi_chip cm_x270_libertas_chip = {
308 .rx_threshold = 1,
309 .tx_threshold = 1,
310 .timeout = 1000,
311 .gpio_cs = 14,
312};
313
314static unsigned long cm_x270_libertas_pin_config[] = {
315 /* SSP2 */
316 GPIO19_SSP2_SCLK,
317 GPIO14_GPIO,
318 GPIO87_SSP2_TXD,
319 GPIO88_SSP2_RXD,
320
321};
279 322
280 err = gpio_request(GPIO105_MMC_POWER, "MMC/SD power"); 323static int cm_x270_libertas_setup(struct spi_device *spi)
281 if (err) { 324{
282 dev_warn(dev, "power gpio unavailable\n"); 325 int err = gpio_request(GPIO19_WLAN_STRAP, "WLAN STRAP");
326 if (err)
283 return err; 327 return err;
284 }
285 328
286 gpio_direction_output(GPIO105_MMC_POWER, 0); 329 err = gpio_request(GPIO102_WLAN_RST, "WLAN RST");
330 if (err)
331 goto err_free_strap;
287 332
288 err = request_irq(CMX270_MMC_IRQ, cmx270_detect_int, 333 err = gpio_direction_output(GPIO102_WLAN_RST, 0);
289 IRQF_DISABLED | IRQF_TRIGGER_FALLING, 334 if (err)
290 "MMC card detect", data); 335 goto err_free_strap;
291 if (err) { 336 msleep(100);
292 gpio_free(GPIO105_MMC_POWER); 337
293 dev_err(dev, "cmx270_mci_init: MMC/SD: can't" 338 err = gpio_direction_output(GPIO19_WLAN_STRAP, 1);
294 " request MMC card detect IRQ\n"); 339 if (err)
295 } 340 goto err_free_strap;
341 msleep(100);
342
343 pxa2xx_mfp_config(ARRAY_AND_SIZE(cm_x270_libertas_pin_config));
344
345 gpio_set_value(GPIO102_WLAN_RST, 1);
346 msleep(100);
347
348 spi->bits_per_word = 16;
349 spi_setup(spi);
350
351 return 0;
352
353err_free_strap:
354 gpio_free(GPIO19_WLAN_STRAP);
296 355
297 return err; 356 return err;
298} 357}
299 358
300static void cmx270_mci_setpower(struct device *dev, unsigned int vdd) 359static int cm_x270_libertas_teardown(struct spi_device *spi)
301{ 360{
302 struct pxamci_platform_data *p_d = dev->platform_data; 361 gpio_set_value(GPIO102_WLAN_RST, 0);
303 362 gpio_free(GPIO102_WLAN_RST);
304 if ((1 << vdd) & p_d->ocr_mask) { 363 gpio_free(GPIO19_WLAN_STRAP);
305 dev_dbg(dev, "power on\n");
306 gpio_set_value(GPIO105_MMC_POWER, 0);
307 } else {
308 gpio_set_value(GPIO105_MMC_POWER, 1);
309 dev_dbg(dev, "power off\n");
310 }
311}
312 364
313static void cmx270_mci_exit(struct device *dev, void *data) 365 return 0;
314{
315 free_irq(CMX270_MMC_IRQ, data);
316 gpio_free(GPIO105_MMC_POWER);
317} 366}
318 367
319static struct pxamci_platform_data cmx270_mci_platform_data = { 368struct libertas_spi_platform_data cm_x270_libertas_pdata = {
320 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, 369 .use_dummy_writes = 1,
321 .init = cmx270_mci_init, 370 .setup = cm_x270_libertas_setup,
322 .setpower = cmx270_mci_setpower, 371 .teardown = cm_x270_libertas_teardown,
323 .exit = cmx270_mci_exit,
324}; 372};
325 373
326static void __init cmx270_init_mmc(void) 374static struct spi_board_info cm_x270_spi_devices[] __initdata = {
375 {
376 .modalias = "libertas_spi",
377 .max_speed_hz = 13000000,
378 .bus_num = 2,
379 .irq = gpio_to_irq(95),
380 .chip_select = 0,
381 .controller_data = &cm_x270_libertas_chip,
382 .platform_data = &cm_x270_libertas_pdata,
383 },
384};
385
386static void __init cmx270_init_spi(void)
327{ 387{
328 pxa_set_mci_info(&cmx270_mci_platform_data); 388 pxa2xx_set_spi_info(2, &cm_x270_spi_info);
389 spi_register_board_info(ARRAY_AND_SIZE(cm_x270_spi_devices));
329} 390}
330#else 391#else
331static inline void cmx270_init_mmc(void) {} 392static inline void cmx270_init_spi(void) {}
332#endif 393#endif
333 394
334void __init cmx270_init(void) 395void __init cmx270_init(void)
@@ -343,4 +404,5 @@ void __init cmx270_init(void)
343 cmx270_init_mmc(); 404 cmx270_init_mmc();
344 cmx270_init_ohci(); 405 cmx270_init_ohci();
345 cmx270_init_2700G(); 406 cmx270_init_2700G();
407 cmx270_init_spi();
346} 408}
diff --git a/arch/arm/mach-pxa/cm-x2xx.c b/arch/arm/mach-pxa/cm-x2xx.c
index b50ef39eabfc..bff6e78f033d 100644
--- a/arch/arm/mach-pxa/cm-x2xx.c
+++ b/arch/arm/mach-pxa/cm-x2xx.c
@@ -453,6 +453,10 @@ static inline void cmx2xx_init_ac97(void) {}
453 453
454static void __init cmx2xx_init(void) 454static void __init cmx2xx_init(void)
455{ 455{
456 pxa_set_ffuart_info(NULL);
457 pxa_set_btuart_info(NULL);
458 pxa_set_stuart_info(NULL);
459
456 cmx2xx_pm_init(); 460 cmx2xx_pm_init();
457 461
458 if (cpu_is_pxa25x()) 462 if (cpu_is_pxa25x())
diff --git a/arch/arm/mach-pxa/cm-x300.c b/arch/arm/mach-pxa/cm-x300.c
index 465da26591bd..d37cfa132a65 100644
--- a/arch/arm/mach-pxa/cm-x300.c
+++ b/arch/arm/mach-pxa/cm-x300.c
@@ -3,9 +3,10 @@
3 * 3 *
4 * Support for the CompuLab CM-X300 modules 4 * Support for the CompuLab CM-X300 modules
5 * 5 *
6 * Copyright (C) 2008 CompuLab Ltd. 6 * Copyright (C) 2008,2009 CompuLab Ltd.
7 * 7 *
8 * Mike Rapoport <mike@compulab.co.il> 8 * Mike Rapoport <mike@compulab.co.il>
9 * Igor Grinberg <grinberg@compulab.co.il>
9 * 10 *
10 * This program is free software; you can redistribute it and/or modify 11 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as 12 * it under the terms of the GNU General Public License version 2 as
@@ -16,44 +17,55 @@
16#include <linux/kernel.h> 17#include <linux/kernel.h>
17#include <linux/interrupt.h> 18#include <linux/interrupt.h>
18#include <linux/init.h> 19#include <linux/init.h>
20#include <linux/delay.h>
19#include <linux/platform_device.h> 21#include <linux/platform_device.h>
20 22
21#include <linux/gpio.h> 23#include <linux/gpio.h>
22#include <linux/dm9000.h> 24#include <linux/dm9000.h>
23#include <linux/leds.h> 25#include <linux/leds.h>
24#include <linux/rtc-v3020.h> 26#include <linux/rtc-v3020.h>
27#include <linux/pwm_backlight.h>
25 28
26#include <linux/i2c.h> 29#include <linux/i2c.h>
27#include <linux/i2c/pca953x.h> 30#include <linux/i2c/pca953x.h>
28 31
32#include <linux/mfd/da903x.h>
33
34#include <linux/spi/spi.h>
35#include <linux/spi/spi_gpio.h>
36#include <linux/spi/tdo24m.h>
37
29#include <asm/mach-types.h> 38#include <asm/mach-types.h>
30#include <asm/mach/arch.h> 39#include <asm/mach/arch.h>
31#include <asm/setup.h> 40#include <asm/setup.h>
32 41
33#include <mach/pxa300.h> 42#include <mach/pxa300.h>
43#include <mach/pxa27x-udc.h>
34#include <mach/pxafb.h> 44#include <mach/pxafb.h>
35#include <mach/mmc.h> 45#include <mach/mmc.h>
36#include <mach/ohci.h> 46#include <mach/ohci.h>
37#include <plat/i2c.h> 47#include <plat/i2c.h>
38#include <mach/pxa3xx_nand.h> 48#include <plat/pxa3xx_nand.h>
49#include <mach/audio.h>
39 50
40#include <asm/mach/map.h> 51#include <asm/mach/map.h>
41 52
42#include "generic.h" 53#include "generic.h"
54#include "devices.h"
43 55
44#define CM_X300_ETH_PHYS 0x08000010 56#define CM_X300_ETH_PHYS 0x08000010
45 57
46#define GPIO82_MMC2_IRQ (82) 58#define GPIO82_MMC_IRQ (82)
47#define GPIO85_MMC2_WP (85) 59#define GPIO85_MMC_WP (85)
48 60
49#define CM_X300_MMC2_IRQ IRQ_GPIO(GPIO82_MMC2_IRQ) 61#define CM_X300_MMC_IRQ IRQ_GPIO(GPIO82_MMC_IRQ)
50 62
51#define GPIO95_RTC_CS (95) 63#define GPIO95_RTC_CS (95)
52#define GPIO96_RTC_WR (96) 64#define GPIO96_RTC_WR (96)
53#define GPIO97_RTC_RD (97) 65#define GPIO97_RTC_RD (97)
54#define GPIO98_RTC_IO (98) 66#define GPIO98_RTC_IO (98)
55 67
56static mfp_cfg_t cm_x300_mfp_cfg[] __initdata = { 68static mfp_cfg_t cm_x3xx_mfp_cfg[] __initdata = {
57 /* LCD */ 69 /* LCD */
58 GPIO54_LCD_LDD_0, 70 GPIO54_LCD_LDD_0,
59 GPIO55_LCD_LDD_1, 71 GPIO55_LCD_LDD_1,
@@ -137,7 +149,6 @@ static mfp_cfg_t cm_x300_mfp_cfg[] __initdata = {
137 GPIO36_UART1_DTR, 149 GPIO36_UART1_DTR,
138 150
139 /* GPIOs */ 151 /* GPIOs */
140 GPIO79_GPIO, /* LED */
141 GPIO82_GPIO | MFP_PULL_HIGH, /* MMC CD */ 152 GPIO82_GPIO | MFP_PULL_HIGH, /* MMC CD */
142 GPIO85_GPIO, /* MMC WP */ 153 GPIO85_GPIO, /* MMC WP */
143 GPIO99_GPIO, /* Ethernet IRQ */ 154 GPIO99_GPIO, /* Ethernet IRQ */
@@ -151,6 +162,50 @@ static mfp_cfg_t cm_x300_mfp_cfg[] __initdata = {
151 /* Standard I2C */ 162 /* Standard I2C */
152 GPIO21_I2C_SCL, 163 GPIO21_I2C_SCL,
153 GPIO22_I2C_SDA, 164 GPIO22_I2C_SDA,
165
166 /* PWM Backlight */
167 GPIO19_PWM2_OUT,
168};
169
170static mfp_cfg_t cm_x3xx_rev_lt130_mfp_cfg[] __initdata = {
171 /* GPIOs */
172 GPIO79_GPIO, /* LED */
173 GPIO77_GPIO, /* WiFi reset */
174 GPIO78_GPIO, /* BT reset */
175};
176
177static mfp_cfg_t cm_x3xx_rev_ge130_mfp_cfg[] __initdata = {
178 /* GPIOs */
179 GPIO76_GPIO, /* LED */
180 GPIO71_GPIO, /* WiFi reset */
181 GPIO70_GPIO, /* BT reset */
182};
183
184static mfp_cfg_t cm_x310_mfp_cfg[] __initdata = {
185 /* USB PORT 2 */
186 ULPI_STP,
187 ULPI_NXT,
188 ULPI_DIR,
189 GPIO30_ULPI_DATA_OUT_0,
190 GPIO31_ULPI_DATA_OUT_1,
191 GPIO32_ULPI_DATA_OUT_2,
192 GPIO33_ULPI_DATA_OUT_3,
193 GPIO34_ULPI_DATA_OUT_4,
194 GPIO35_ULPI_DATA_OUT_5,
195 GPIO36_ULPI_DATA_OUT_6,
196 GPIO37_ULPI_DATA_OUT_7,
197 GPIO38_ULPI_CLK,
198 /* external PHY reset pin */
199 GPIO127_GPIO,
200
201 /* USB PORT 3 */
202 GPIO77_USB_P3_1,
203 GPIO78_USB_P3_2,
204 GPIO79_USB_P3_3,
205 GPIO80_USB_P3_4,
206 GPIO81_USB_P3_5,
207 GPIO82_USB_P3_6,
208 GPIO0_2_USBH_PEN,
154}; 209};
155 210
156#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE) 211#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
@@ -195,17 +250,18 @@ static void __init cm_x300_init_dm9000(void)
195static inline void cm_x300_init_dm9000(void) {} 250static inline void cm_x300_init_dm9000(void) {}
196#endif 251#endif
197 252
253/* LCD */
198#if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE) 254#if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
199static struct pxafb_mode_info cm_x300_lcd_modes[] = { 255static struct pxafb_mode_info cm_x300_lcd_modes[] = {
200 [0] = { 256 [0] = {
201 .pixclock = 38000, 257 .pixclock = 38250,
202 .bpp = 16, 258 .bpp = 16,
203 .xres = 480, 259 .xres = 480,
204 .yres = 640, 260 .yres = 640,
205 .hsync_len = 8, 261 .hsync_len = 8,
206 .vsync_len = 2, 262 .vsync_len = 2,
207 .left_margin = 8, 263 .left_margin = 8,
208 .upper_margin = 0, 264 .upper_margin = 2,
209 .right_margin = 24, 265 .right_margin = 24,
210 .lower_margin = 4, 266 .lower_margin = 4,
211 .cmap_greyscale = 0, 267 .cmap_greyscale = 0,
@@ -227,7 +283,7 @@ static struct pxafb_mode_info cm_x300_lcd_modes[] = {
227 283
228static struct pxafb_mach_info cm_x300_lcd = { 284static struct pxafb_mach_info cm_x300_lcd = {
229 .modes = cm_x300_lcd_modes, 285 .modes = cm_x300_lcd_modes,
230 .num_modes = 2, 286 .num_modes = ARRAY_SIZE(cm_x300_lcd_modes),
231 .lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL, 287 .lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
232}; 288};
233 289
@@ -239,6 +295,87 @@ static void __init cm_x300_init_lcd(void)
239static inline void cm_x300_init_lcd(void) {} 295static inline void cm_x300_init_lcd(void) {}
240#endif 296#endif
241 297
298#if defined(CONFIG_BACKLIGHT_PWM) || defined(CONFIG_BACKLIGHT_PWM_MODULE)
299static struct platform_pwm_backlight_data cm_x300_backlight_data = {
300 .pwm_id = 2,
301 .max_brightness = 100,
302 .dft_brightness = 100,
303 .pwm_period_ns = 10000,
304};
305
306static struct platform_device cm_x300_backlight_device = {
307 .name = "pwm-backlight",
308 .dev = {
309 .parent = &pxa27x_device_pwm0.dev,
310 .platform_data = &cm_x300_backlight_data,
311 },
312};
313
314static void cm_x300_init_bl(void)
315{
316 platform_device_register(&cm_x300_backlight_device);
317}
318#else
319static inline void cm_x300_init_bl(void) {}
320#endif
321
322#if defined(CONFIG_SPI_GPIO) || defined(CONFIG_SPI_GPIO_MODULE)
323#define GPIO_LCD_BASE (144)
324#define GPIO_LCD_DIN (GPIO_LCD_BASE + 8) /* aux_gpio3_0 */
325#define GPIO_LCD_DOUT (GPIO_LCD_BASE + 9) /* aux_gpio3_1 */
326#define GPIO_LCD_SCL (GPIO_LCD_BASE + 10) /* aux_gpio3_2 */
327#define GPIO_LCD_CS (GPIO_LCD_BASE + 11) /* aux_gpio3_3 */
328#define LCD_SPI_BUS_NUM (1)
329
330static struct spi_gpio_platform_data cm_x300_spi_gpio_pdata = {
331 .sck = GPIO_LCD_SCL,
332 .mosi = GPIO_LCD_DIN,
333 .miso = GPIO_LCD_DOUT,
334 .num_chipselect = 1,
335};
336
337static struct platform_device cm_x300_spi_gpio = {
338 .name = "spi_gpio",
339 .id = LCD_SPI_BUS_NUM,
340 .dev = {
341 .platform_data = &cm_x300_spi_gpio_pdata,
342 },
343};
344
345static struct tdo24m_platform_data cm_x300_tdo24m_pdata = {
346 .model = TDO35S,
347};
348
349static struct spi_board_info cm_x300_spi_devices[] __initdata = {
350 {
351 .modalias = "tdo24m",
352 .max_speed_hz = 1000000,
353 .bus_num = LCD_SPI_BUS_NUM,
354 .chip_select = 0,
355 .controller_data = (void *) GPIO_LCD_CS,
356 .platform_data = &cm_x300_tdo24m_pdata,
357 },
358};
359
360static void __init cm_x300_init_spi(void)
361{
362 spi_register_board_info(cm_x300_spi_devices,
363 ARRAY_SIZE(cm_x300_spi_devices));
364 platform_device_register(&cm_x300_spi_gpio);
365}
366#else
367static inline void cm_x300_init_spi(void) {}
368#endif
369
370#if defined(CONFIG_SND_PXA2XX_LIB_AC97)
371static void __init cm_x300_init_ac97(void)
372{
373 pxa_set_ac97_info(NULL);
374}
375#else
376static inline void cm_x300_init_ac97(void) {}
377#endif
378
242#if defined(CONFIG_MTD_NAND_PXA3xx) || defined(CONFIG_MTD_NAND_PXA3xx_MODULE) 379#if defined(CONFIG_MTD_NAND_PXA3xx) || defined(CONFIG_MTD_NAND_PXA3xx_MODULE)
243static struct mtd_partition cm_x300_nand_partitions[] = { 380static struct mtd_partition cm_x300_nand_partitions[] = {
244 [0] = { 381 [0] = {
@@ -292,82 +429,35 @@ static inline void cm_x300_init_nand(void) {}
292#endif 429#endif
293 430
294#if defined(CONFIG_MMC) || defined(CONFIG_MMC_MODULE) 431#if defined(CONFIG_MMC) || defined(CONFIG_MMC_MODULE)
295/* The first MMC slot of CM-X300 is hardwired to Libertas card and has
296 no detection/ro pins */
297static int cm_x300_mci_init(struct device *dev,
298 irq_handler_t cm_x300_detect_int,
299 void *data)
300{
301 return 0;
302}
303
304static void cm_x300_mci_exit(struct device *dev, void *data)
305{
306}
307
308static struct pxamci_platform_data cm_x300_mci_platform_data = { 432static struct pxamci_platform_data cm_x300_mci_platform_data = {
309 .detect_delay = 20, 433 .detect_delay = 20,
310 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, 434 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34,
311 .init = cm_x300_mci_init, 435 .gpio_card_detect = GPIO82_MMC_IRQ,
312 .exit = cm_x300_mci_exit, 436 .gpio_card_ro = GPIO85_MMC_WP,
437 .gpio_power = -1,
313}; 438};
314 439
315static int cm_x300_mci2_ro(struct device *dev) 440/* The second MMC slot of CM-X300 is hardwired to Libertas card and has
316{ 441 no detection/ro pins */
317 return gpio_get_value(GPIO85_MMC2_WP);
318}
319
320static int cm_x300_mci2_init(struct device *dev, 442static int cm_x300_mci2_init(struct device *dev,
321 irq_handler_t cm_x300_detect_int, 443 irq_handler_t cm_x300_detect_int,
322 void *data) 444 void *data)
323{ 445{
324 int err;
325
326 /*
327 * setup GPIO for CM-X300 MMC controller
328 */
329 err = gpio_request(GPIO82_MMC2_IRQ, "mmc card detect");
330 if (err)
331 goto err_request_cd;
332 gpio_direction_input(GPIO82_MMC2_IRQ);
333
334 err = gpio_request(GPIO85_MMC2_WP, "mmc write protect");
335 if (err)
336 goto err_request_wp;
337 gpio_direction_input(GPIO85_MMC2_WP);
338
339 err = request_irq(CM_X300_MMC2_IRQ, cm_x300_detect_int,
340 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
341 "MMC card detect", data);
342 if (err) {
343 printk(KERN_ERR "%s: MMC/SD/SDIO: "
344 "can't request card detect IRQ\n", __func__);
345 goto err_request_irq;
346 }
347
348 return 0; 446 return 0;
349
350err_request_irq:
351 gpio_free(GPIO85_MMC2_WP);
352err_request_wp:
353 gpio_free(GPIO82_MMC2_IRQ);
354err_request_cd:
355 return err;
356} 447}
357 448
358static void cm_x300_mci2_exit(struct device *dev, void *data) 449static void cm_x300_mci2_exit(struct device *dev, void *data)
359{ 450{
360 free_irq(CM_X300_MMC2_IRQ, data);
361 gpio_free(GPIO82_MMC2_IRQ);
362 gpio_free(GPIO85_MMC2_WP);
363} 451}
364 452
365static struct pxamci_platform_data cm_x300_mci2_platform_data = { 453static struct pxamci_platform_data cm_x300_mci2_platform_data = {
366 .detect_delay = 20, 454 .detect_delay = 20,
367 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, 455 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34,
368 .init = cm_x300_mci2_init, 456 .init = cm_x300_mci2_init,
369 .exit = cm_x300_mci2_exit, 457 .exit = cm_x300_mci2_exit,
370 .get_ro = cm_x300_mci2_ro, 458 .gpio_card_detect = -1,
459 .gpio_card_ro = -1,
460 .gpio_power = -1,
371}; 461};
372 462
373static void __init cm_x300_init_mmc(void) 463static void __init cm_x300_init_mmc(void)
@@ -380,9 +470,19 @@ static inline void cm_x300_init_mmc(void) {}
380#endif 470#endif
381 471
382#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) 472#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
473static int cm_x300_ohci_init(struct device *dev)
474{
475 if (cpu_is_pxa300())
476 UP2OCR = UP2OCR_HXS
477 | UP2OCR_HXOE | UP2OCR_DMPDE | UP2OCR_DPPDE;
478
479 return 0;
480}
481
383static struct pxaohci_platform_data cm_x300_ohci_platform_data = { 482static struct pxaohci_platform_data cm_x300_ohci_platform_data = {
384 .port_mode = PMM_PERPORT_MODE, 483 .port_mode = PMM_PERPORT_MODE,
385 .flags = ENABLE_PORT1 | ENABLE_PORT2 | POWER_CONTROL_LOW, 484 .flags = ENABLE_PORT_ALL | POWER_CONTROL_LOW,
485 .init = cm_x300_ohci_init,
386}; 486};
387 487
388static void __init cm_x300_init_ohci(void) 488static void __init cm_x300_init_ohci(void)
@@ -398,7 +498,6 @@ static struct gpio_led cm_x300_leds[] = {
398 [0] = { 498 [0] = {
399 .name = "cm-x300:green", 499 .name = "cm-x300:green",
400 .default_trigger = "heartbeat", 500 .default_trigger = "heartbeat",
401 .gpio = 79,
402 .active_low = 1, 501 .active_low = 1,
403 }, 502 },
404}; 503};
@@ -418,6 +517,11 @@ static struct platform_device cm_x300_led_device = {
418 517
419static void __init cm_x300_init_leds(void) 518static void __init cm_x300_init_leds(void)
420{ 519{
520 if (system_rev < 130)
521 cm_x300_leds[0].gpio = 79;
522 else
523 cm_x300_leds[0].gpio = 76;
524
421 platform_device_register(&cm_x300_led_device); 525 platform_device_register(&cm_x300_led_device);
422} 526}
423#else 527#else
@@ -480,11 +584,94 @@ static void __init cm_x300_init_rtc(void)
480static inline void cm_x300_init_rtc(void) {} 584static inline void cm_x300_init_rtc(void) {}
481#endif 585#endif
482 586
483static void __init cm_x300_init(void) 587/* DA9030 */
588struct da903x_subdev_info cm_x300_da9030_subdevs[] = {
589 {
590 .name = "da903x-backlight",
591 .id = DA9030_ID_WLED,
592 }
593};
594
595static struct da903x_platform_data cm_x300_da9030_info = {
596 .num_subdevs = ARRAY_SIZE(cm_x300_da9030_subdevs),
597 .subdevs = cm_x300_da9030_subdevs,
598};
599
600static struct i2c_board_info cm_x300_pmic_info = {
601 I2C_BOARD_INFO("da9030", 0x49),
602 .irq = IRQ_GPIO(0),
603 .platform_data = &cm_x300_da9030_info,
604};
605
606static struct i2c_pxa_platform_data cm_x300_pwr_i2c_info = {
607 .use_pio = 1,
608};
609
610static void __init cm_x300_init_da9030(void)
611{
612 pxa3xx_set_i2c_power_info(&cm_x300_pwr_i2c_info);
613 i2c_register_board_info(1, &cm_x300_pmic_info, 1);
614}
615
616static void __init cm_x300_init_wi2wi(void)
617{
618 int bt_reset, wlan_en;
619 int err;
620
621 if (system_rev < 130) {
622 wlan_en = 77;
623 bt_reset = 78;
624 } else {
625 wlan_en = 71;
626 bt_reset = 70;
627 }
628
629 /* Libertas and CSR reset */
630 err = gpio_request(wlan_en, "wlan en");
631 if (err) {
632 pr_err("CM-X300: failed to request wlan en gpio: %d\n", err);
633 } else {
634 gpio_direction_output(wlan_en, 1);
635 gpio_free(wlan_en);
636 }
637
638 err = gpio_request(bt_reset, "bt reset");
639 if (err) {
640 pr_err("CM-X300: failed to request bt reset gpio: %d\n", err);
641 } else {
642 gpio_direction_output(bt_reset, 1);
643 udelay(10);
644 gpio_set_value(bt_reset, 0);
645 udelay(10);
646 gpio_set_value(bt_reset, 1);
647 gpio_free(bt_reset);
648 }
649}
650
651/* MFP */
652static void __init cm_x300_init_mfp(void)
484{ 653{
485 /* board-processor specific GPIO initialization */ 654 /* board-processor specific GPIO initialization */
486 pxa3xx_mfp_config(ARRAY_AND_SIZE(cm_x300_mfp_cfg)); 655 pxa3xx_mfp_config(ARRAY_AND_SIZE(cm_x3xx_mfp_cfg));
656
657 if (system_rev < 130)
658 pxa3xx_mfp_config(ARRAY_AND_SIZE(cm_x3xx_rev_lt130_mfp_cfg));
659 else
660 pxa3xx_mfp_config(ARRAY_AND_SIZE(cm_x3xx_rev_ge130_mfp_cfg));
661
662 if (cpu_is_pxa310())
663 pxa3xx_mfp_config(ARRAY_AND_SIZE(cm_x310_mfp_cfg));
664}
665
666static void __init cm_x300_init(void)
667{
668 cm_x300_init_mfp();
669
670 pxa_set_ffuart_info(NULL);
671 pxa_set_btuart_info(NULL);
672 pxa_set_stuart_info(NULL);
487 673
674 cm_x300_init_da9030();
488 cm_x300_init_dm9000(); 675 cm_x300_init_dm9000();
489 cm_x300_init_lcd(); 676 cm_x300_init_lcd();
490 cm_x300_init_ohci(); 677 cm_x300_init_ohci();
@@ -492,7 +679,11 @@ static void __init cm_x300_init(void)
492 cm_x300_init_nand(); 679 cm_x300_init_nand();
493 cm_x300_init_leds(); 680 cm_x300_init_leds();
494 cm_x300_init_i2c(); 681 cm_x300_init_i2c();
682 cm_x300_init_spi();
495 cm_x300_init_rtc(); 683 cm_x300_init_rtc();
684 cm_x300_init_ac97();
685 cm_x300_init_wi2wi();
686 cm_x300_init_bl();
496} 687}
497 688
498static void __init cm_x300_fixup(struct machine_desc *mdesc, struct tag *tags, 689static void __init cm_x300_fixup(struct machine_desc *mdesc, struct tag *tags,
diff --git a/arch/arm/mach-pxa/colibri-pxa270.c b/arch/arm/mach-pxa/colibri-pxa270.c
index 01bcfaae75bc..061c45316de8 100644
--- a/arch/arm/mach-pxa/colibri-pxa270.c
+++ b/arch/arm/mach-pxa/colibri-pxa270.c
@@ -130,6 +130,9 @@ static struct platform_device *colibri_pxa270_devices[] __initdata = {
130static void __init colibri_pxa270_init(void) 130static void __init colibri_pxa270_init(void)
131{ 131{
132 pxa2xx_mfp_config(ARRAY_AND_SIZE(colibri_pxa270_pin_config)); 132 pxa2xx_mfp_config(ARRAY_AND_SIZE(colibri_pxa270_pin_config));
133 pxa_set_ffuart_info(NULL);
134 pxa_set_btuart_info(NULL);
135 pxa_set_stuart_info(NULL);
133 platform_add_devices(ARRAY_AND_SIZE(colibri_pxa270_devices)); 136 platform_add_devices(ARRAY_AND_SIZE(colibri_pxa270_devices));
134} 137}
135 138
diff --git a/arch/arm/mach-pxa/colibri-pxa300.c b/arch/arm/mach-pxa/colibri-pxa300.c
index 7c9c34c19ae2..45c23fd6df31 100644
--- a/arch/arm/mach-pxa/colibri-pxa300.c
+++ b/arch/arm/mach-pxa/colibri-pxa300.c
@@ -170,8 +170,13 @@ static inline void colibri_pxa310_init_ac97(void) {}
170 170
171void __init colibri_pxa300_init(void) 171void __init colibri_pxa300_init(void)
172{ 172{
173 pxa_set_ffuart_info(NULL);
174 pxa_set_btuart_info(NULL);
175 pxa_set_stuart_info(NULL);
176
173 colibri_pxa300_init_eth(); 177 colibri_pxa300_init_eth();
174 colibri_pxa300_init_ohci(); 178 colibri_pxa300_init_ohci();
179 colibri_pxa3xx_init_nand();
175 colibri_pxa300_init_lcd(); 180 colibri_pxa300_init_lcd();
176 colibri_pxa3xx_init_lcd(mfp_to_gpio(GPIO39_GPIO)); 181 colibri_pxa3xx_init_lcd(mfp_to_gpio(GPIO39_GPIO));
177 colibri_pxa310_init_ac97(); 182 colibri_pxa310_init_ac97();
diff --git a/arch/arm/mach-pxa/colibri-pxa320.c b/arch/arm/mach-pxa/colibri-pxa320.c
index a18d37b3c5e6..ae835fad7d10 100644
--- a/arch/arm/mach-pxa/colibri-pxa320.c
+++ b/arch/arm/mach-pxa/colibri-pxa320.c
@@ -27,6 +27,7 @@
27#include <mach/colibri.h> 27#include <mach/colibri.h>
28#include <mach/pxafb.h> 28#include <mach/pxafb.h>
29#include <mach/ohci.h> 29#include <mach/ohci.h>
30#include <mach/audio.h>
30 31
31#include "generic.h" 32#include "generic.h"
32#include "devices.h" 33#include "devices.h"
@@ -145,7 +146,8 @@ static void __init colibri_pxa320_init_lcd(void)
145static inline void colibri_pxa320_init_lcd(void) {} 146static inline void colibri_pxa320_init_lcd(void) {}
146#endif 147#endif
147 148
148#if defined(SND_AC97_CODEC) || defined(SND_AC97_CODEC_MODULE) 149#if defined(CONFIG_SND_AC97_CODEC) || \
150 defined(CONFIG_SND_AC97_CODEC_MODULE)
149static mfp_cfg_t colibri_pxa320_ac97_pin_config[] __initdata = { 151static mfp_cfg_t colibri_pxa320_ac97_pin_config[] __initdata = {
150 GPIO34_AC97_SYSCLK, 152 GPIO34_AC97_SYSCLK,
151 GPIO35_AC97_SDATA_IN_0, 153 GPIO35_AC97_SDATA_IN_0,
@@ -164,15 +166,52 @@ static inline void __init colibri_pxa320_init_ac97(void)
164static inline void colibri_pxa320_init_ac97(void) {} 166static inline void colibri_pxa320_init_ac97(void) {}
165#endif 167#endif
166 168
169/*
170 * The following configuration is verified to work with the Toradex Orchid
171 * carrier board
172 */
173static mfp_cfg_t colibri_pxa320_uart_pin_config[] __initdata = {
174 /* UART 1 configuration (may be set by bootloader) */
175 GPIO99_UART1_CTS,
176 GPIO104_UART1_RTS,
177 GPIO97_UART1_RXD,
178 GPIO98_UART1_TXD,
179 GPIO101_UART1_DTR,
180 GPIO103_UART1_DSR,
181 GPIO100_UART1_DCD,
182 GPIO102_UART1_RI,
183
184 /* UART 2 configuration */
185 GPIO109_UART2_CTS,
186 GPIO112_UART2_RTS,
187 GPIO110_UART2_RXD,
188 GPIO111_UART2_TXD,
189
190 /* UART 3 configuration */
191 GPIO30_UART3_RXD,
192 GPIO31_UART3_TXD,
193};
194
195static void __init colibri_pxa320_init_uart(void)
196{
197 pxa3xx_mfp_config(ARRAY_AND_SIZE(colibri_pxa320_uart_pin_config));
198}
199
167void __init colibri_pxa320_init(void) 200void __init colibri_pxa320_init(void)
168{ 201{
202 pxa_set_ffuart_info(NULL);
203 pxa_set_btuart_info(NULL);
204 pxa_set_stuart_info(NULL);
205
169 colibri_pxa320_init_eth(); 206 colibri_pxa320_init_eth();
170 colibri_pxa320_init_ohci(); 207 colibri_pxa320_init_ohci();
208 colibri_pxa3xx_init_nand();
171 colibri_pxa320_init_lcd(); 209 colibri_pxa320_init_lcd();
172 colibri_pxa3xx_init_lcd(mfp_to_gpio(GPIO49_GPIO)); 210 colibri_pxa3xx_init_lcd(mfp_to_gpio(GPIO49_GPIO));
173 colibri_pxa320_init_ac97(); 211 colibri_pxa320_init_ac97();
174 colibri_pxa3xx_init_mmc(ARRAY_AND_SIZE(colibri_pxa320_mmc_pin_config), 212 colibri_pxa3xx_init_mmc(ARRAY_AND_SIZE(colibri_pxa320_mmc_pin_config),
175 mfp_to_gpio(MFP_PIN_GPIO28)); 213 mfp_to_gpio(MFP_PIN_GPIO28));
214 colibri_pxa320_init_uart();
176} 215}
177 216
178MACHINE_START(COLIBRI320, "Toradex Colibri PXA320") 217MACHINE_START(COLIBRI320, "Toradex Colibri PXA320")
diff --git a/arch/arm/mach-pxa/colibri-pxa3xx.c b/arch/arm/mach-pxa/colibri-pxa3xx.c
index ea34e34f8cd8..e6c0a2287eb8 100644
--- a/arch/arm/mach-pxa/colibri-pxa3xx.c
+++ b/arch/arm/mach-pxa/colibri-pxa3xx.c
@@ -25,6 +25,7 @@
25#include <mach/colibri.h> 25#include <mach/colibri.h>
26#include <mach/mmc.h> 26#include <mach/mmc.h>
27#include <mach/pxafb.h> 27#include <mach/pxafb.h>
28#include <plat/pxa3xx_nand.h>
28 29
29#include "generic.h" 30#include "generic.h"
30#include "devices.h" 31#include "devices.h"
@@ -95,10 +96,13 @@ static void colibri_pxa3xx_mci_exit(struct device *dev, void *data)
95} 96}
96 97
97static struct pxamci_platform_data colibri_pxa3xx_mci_platform_data = { 98static struct pxamci_platform_data colibri_pxa3xx_mci_platform_data = {
98 .detect_delay = 20, 99 .detect_delay = 20,
99 .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, 100 .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
100 .init = colibri_pxa3xx_mci_init, 101 .init = colibri_pxa3xx_mci_init,
101 .exit = colibri_pxa3xx_mci_exit, 102 .exit = colibri_pxa3xx_mci_exit,
103 .gpio_card_detect = -1,
104 .gpio_card_ro = -1,
105 .gpio_power = -1,
102}; 106};
103 107
104void __init colibri_pxa3xx_init_mmc(mfp_cfg_t *pins, int len, int detect_pin) 108void __init colibri_pxa3xx_init_mmc(mfp_cfg_t *pins, int len, int detect_pin)
@@ -154,3 +158,43 @@ void __init colibri_pxa3xx_init_lcd(int bl_pin)
154} 158}
155#endif 159#endif
156 160
161#if defined(CONFIG_MTD_NAND_PXA3xx) || defined(CONFIG_MTD_NAND_PXA3xx_MODULE)
162static struct mtd_partition colibri_nand_partitions[] = {
163 {
164 .name = "bootloader",
165 .offset = 0,
166 .size = SZ_512K,
167 .mask_flags = MTD_WRITEABLE, /* force read-only */
168 },
169 {
170 .name = "kernel",
171 .offset = MTDPART_OFS_APPEND,
172 .size = SZ_4M,
173 .mask_flags = MTD_WRITEABLE, /* force read-only */
174 },
175 {
176 .name = "reserved",
177 .offset = MTDPART_OFS_APPEND,
178 .size = SZ_1M,
179 .mask_flags = MTD_WRITEABLE, /* force read-only */
180 },
181 {
182 .name = "fs",
183 .offset = MTDPART_OFS_APPEND,
184 .size = MTDPART_SIZ_FULL,
185 },
186};
187
188static struct pxa3xx_nand_platform_data colibri_nand_info = {
189 .enable_arbiter = 1,
190 .keep_config = 1,
191 .parts = colibri_nand_partitions,
192 .nr_parts = ARRAY_SIZE(colibri_nand_partitions),
193};
194
195void __init colibri_pxa3xx_init_nand(void)
196{
197 pxa3xx_set_nand_info(&colibri_nand_info);
198}
199#endif
200
diff --git a/arch/arm/mach-pxa/corgi.c b/arch/arm/mach-pxa/corgi.c
index 5363e1aea3fb..74446cf8ae69 100644
--- a/arch/arm/mach-pxa/corgi.c
+++ b/arch/arm/mach-pxa/corgi.c
@@ -29,6 +29,7 @@
29#include <linux/spi/ads7846.h> 29#include <linux/spi/ads7846.h>
30#include <linux/spi/corgi_lcd.h> 30#include <linux/spi/corgi_lcd.h>
31#include <linux/mtd/sharpsl.h> 31#include <linux/mtd/sharpsl.h>
32#include <linux/input/matrix_keypad.h>
32#include <video/w100fb.h> 33#include <video/w100fb.h>
33 34
34#include <asm/setup.h> 35#include <asm/setup.h>
@@ -104,6 +105,28 @@ static unsigned long corgi_pin_config[] __initdata = {
104 GPIO6_MMC_CLK, 105 GPIO6_MMC_CLK,
105 GPIO8_MMC_CS0, 106 GPIO8_MMC_CS0,
106 107
108 /* GPIO Matrix Keypad */
109 GPIO66_GPIO, /* column 0 */
110 GPIO67_GPIO, /* column 1 */
111 GPIO68_GPIO, /* column 2 */
112 GPIO69_GPIO, /* column 3 */
113 GPIO70_GPIO, /* column 4 */
114 GPIO71_GPIO, /* column 5 */
115 GPIO72_GPIO, /* column 6 */
116 GPIO73_GPIO, /* column 7 */
117 GPIO74_GPIO, /* column 8 */
118 GPIO75_GPIO, /* column 9 */
119 GPIO76_GPIO, /* column 10 */
120 GPIO77_GPIO, /* column 11 */
121 GPIO58_GPIO, /* row 0 */
122 GPIO59_GPIO, /* row 1 */
123 GPIO60_GPIO, /* row 2 */
124 GPIO61_GPIO, /* row 3 */
125 GPIO62_GPIO, /* row 4 */
126 GPIO63_GPIO, /* row 5 */
127 GPIO64_GPIO, /* row 6 */
128 GPIO65_GPIO, /* row 7 */
129
107 /* GPIO */ 130 /* GPIO */
108 GPIO9_GPIO, /* CORGI_GPIO_nSD_DETECT */ 131 GPIO9_GPIO, /* CORGI_GPIO_nSD_DETECT */
109 GPIO7_GPIO, /* CORGI_GPIO_nSD_WP */ 132 GPIO7_GPIO, /* CORGI_GPIO_nSD_WP */
@@ -267,9 +290,115 @@ static struct platform_device corgifb_device = {
267/* 290/*
268 * Corgi Keyboard Device 291 * Corgi Keyboard Device
269 */ 292 */
293#define CORGI_KEY_CALENDER KEY_F1
294#define CORGI_KEY_ADDRESS KEY_F2
295#define CORGI_KEY_FN KEY_F3
296#define CORGI_KEY_CANCEL KEY_F4
297#define CORGI_KEY_OFF KEY_SUSPEND
298#define CORGI_KEY_EXOK KEY_F5
299#define CORGI_KEY_EXCANCEL KEY_F6
300#define CORGI_KEY_EXJOGDOWN KEY_F7
301#define CORGI_KEY_EXJOGUP KEY_F8
302#define CORGI_KEY_JAP1 KEY_LEFTCTRL
303#define CORGI_KEY_JAP2 KEY_LEFTALT
304#define CORGI_KEY_MAIL KEY_F10
305#define CORGI_KEY_OK KEY_F11
306#define CORGI_KEY_MENU KEY_F12
307
308static const uint32_t corgikbd_keymap[] = {
309 KEY(0, 1, KEY_1),
310 KEY(0, 2, KEY_3),
311 KEY(0, 3, KEY_5),
312 KEY(0, 4, KEY_6),
313 KEY(0, 5, KEY_7),
314 KEY(0, 6, KEY_9),
315 KEY(0, 7, KEY_0),
316 KEY(0, 8, KEY_BACKSPACE),
317 KEY(1, 1, KEY_2),
318 KEY(1, 2, KEY_4),
319 KEY(1, 3, KEY_R),
320 KEY(1, 4, KEY_Y),
321 KEY(1, 5, KEY_8),
322 KEY(1, 6, KEY_I),
323 KEY(1, 7, KEY_O),
324 KEY(1, 8, KEY_P),
325 KEY(2, 0, KEY_TAB),
326 KEY(2, 1, KEY_Q),
327 KEY(2, 2, KEY_E),
328 KEY(2, 3, KEY_T),
329 KEY(2, 4, KEY_G),
330 KEY(2, 5, KEY_U),
331 KEY(2, 6, KEY_J),
332 KEY(2, 7, KEY_K),
333 KEY(3, 0, CORGI_KEY_CALENDER),
334 KEY(3, 1, KEY_W),
335 KEY(3, 2, KEY_S),
336 KEY(3, 3, KEY_F),
337 KEY(3, 4, KEY_V),
338 KEY(3, 5, KEY_H),
339 KEY(3, 6, KEY_M),
340 KEY(3, 7, KEY_L),
341 KEY(3, 9, KEY_RIGHTSHIFT),
342 KEY(4, 0, CORGI_KEY_ADDRESS),
343 KEY(4, 1, KEY_A),
344 KEY(4, 2, KEY_D),
345 KEY(4, 3, KEY_C),
346 KEY(4, 4, KEY_B),
347 KEY(4, 5, KEY_N),
348 KEY(4, 6, KEY_DOT),
349 KEY(4, 8, KEY_ENTER),
350 KEY(4, 10, KEY_LEFTSHIFT),
351 KEY(5, 0, CORGI_KEY_MAIL),
352 KEY(5, 1, KEY_Z),
353 KEY(5, 2, KEY_X),
354 KEY(5, 3, KEY_MINUS),
355 KEY(5, 4, KEY_SPACE),
356 KEY(5, 5, KEY_COMMA),
357 KEY(5, 7, KEY_UP),
358 KEY(5, 11, CORGI_KEY_FN),
359 KEY(6, 0, KEY_SYSRQ),
360 KEY(6, 1, CORGI_KEY_JAP1),
361 KEY(6, 2, CORGI_KEY_JAP2),
362 KEY(6, 3, CORGI_KEY_CANCEL),
363 KEY(6, 4, CORGI_KEY_OK),
364 KEY(6, 5, CORGI_KEY_MENU),
365 KEY(6, 6, KEY_LEFT),
366 KEY(6, 7, KEY_DOWN),
367 KEY(6, 8, KEY_RIGHT),
368 KEY(7, 0, CORGI_KEY_OFF),
369 KEY(7, 1, CORGI_KEY_EXOK),
370 KEY(7, 2, CORGI_KEY_EXCANCEL),
371 KEY(7, 3, CORGI_KEY_EXJOGDOWN),
372 KEY(7, 4, CORGI_KEY_EXJOGUP),
373};
374
375static struct matrix_keymap_data corgikbd_keymap_data = {
376 .keymap = corgikbd_keymap,
377 .keymap_size = ARRAY_SIZE(corgikbd_keymap),
378};
379
380static const int corgikbd_row_gpios[] =
381 { 58, 59, 60, 61, 62, 63, 64, 65 };
382static const int corgikbd_col_gpios[] =
383 { 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77 };
384
385static struct matrix_keypad_platform_data corgikbd_pdata = {
386 .keymap_data = &corgikbd_keymap_data,
387 .row_gpios = corgikbd_row_gpios,
388 .col_gpios = corgikbd_col_gpios,
389 .num_row_gpios = ARRAY_SIZE(corgikbd_row_gpios),
390 .num_col_gpios = ARRAY_SIZE(corgikbd_col_gpios),
391 .col_scan_delay_us = 10,
392 .debounce_ms = 10,
393 .wakeup = 1,
394};
395
270static struct platform_device corgikbd_device = { 396static struct platform_device corgikbd_device = {
271 .name = "corgi-keyboard", 397 .name = "matrix-keypad",
272 .id = -1, 398 .id = -1,
399 .dev = {
400 .platform_data = &corgikbd_pdata,
401 },
273}; 402};
274 403
275/* 404/*
@@ -307,111 +436,20 @@ static struct platform_device corgiled_device = {
307 * The card detect interrupt isn't debounced so we delay it by 250ms 436 * The card detect interrupt isn't debounced so we delay it by 250ms
308 * to give the card a chance to fully insert/eject. 437 * to give the card a chance to fully insert/eject.
309 */ 438 */
310static struct pxamci_platform_data corgi_mci_platform_data;
311
312static int corgi_mci_init(struct device *dev, irq_handler_t corgi_detect_int, void *data)
313{
314 int err;
315
316 err = gpio_request(CORGI_GPIO_nSD_DETECT, "nSD_DETECT");
317 if (err)
318 goto err_out;
319
320 err = gpio_request(CORGI_GPIO_nSD_WP, "nSD_WP");
321 if (err)
322 goto err_free_1;
323
324 err = gpio_request(CORGI_GPIO_SD_PWR, "SD_PWR");
325 if (err)
326 goto err_free_2;
327
328 gpio_direction_input(CORGI_GPIO_nSD_DETECT);
329 gpio_direction_input(CORGI_GPIO_nSD_WP);
330 gpio_direction_output(CORGI_GPIO_SD_PWR, 0);
331
332 corgi_mci_platform_data.detect_delay = msecs_to_jiffies(250);
333
334 err = request_irq(CORGI_IRQ_GPIO_nSD_DETECT, corgi_detect_int,
335 IRQF_DISABLED | IRQF_TRIGGER_RISING |
336 IRQF_TRIGGER_FALLING,
337 "MMC card detect", data);
338 if (err) {
339 pr_err("%s: MMC/SD: can't request MMC card detect IRQ\n",
340 __func__);
341 goto err_free_3;
342 }
343 return 0;
344
345err_free_3:
346 gpio_free(CORGI_GPIO_SD_PWR);
347err_free_2:
348 gpio_free(CORGI_GPIO_nSD_WP);
349err_free_1:
350 gpio_free(CORGI_GPIO_nSD_DETECT);
351err_out:
352 return err;
353}
354
355static void corgi_mci_setpower(struct device *dev, unsigned int vdd)
356{
357 struct pxamci_platform_data* p_d = dev->platform_data;
358
359 gpio_set_value(CORGI_GPIO_SD_PWR, ((1 << vdd) & p_d->ocr_mask));
360}
361
362static int corgi_mci_get_ro(struct device *dev)
363{
364 return gpio_get_value(CORGI_GPIO_nSD_WP);
365}
366
367static void corgi_mci_exit(struct device *dev, void *data)
368{
369 free_irq(CORGI_IRQ_GPIO_nSD_DETECT, data);
370 gpio_free(CORGI_GPIO_SD_PWR);
371 gpio_free(CORGI_GPIO_nSD_WP);
372 gpio_free(CORGI_GPIO_nSD_DETECT);
373}
374
375static struct pxamci_platform_data corgi_mci_platform_data = { 439static struct pxamci_platform_data corgi_mci_platform_data = {
376 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, 440 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34,
377 .init = corgi_mci_init, 441 .gpio_card_detect = -1,
378 .get_ro = corgi_mci_get_ro, 442 .gpio_card_ro = CORGI_GPIO_nSD_WP,
379 .setpower = corgi_mci_setpower, 443 .gpio_power = CORGI_GPIO_SD_PWR,
380 .exit = corgi_mci_exit,
381}; 444};
382 445
383 446
384/* 447/*
385 * Irda 448 * Irda
386 */ 449 */
387static void corgi_irda_transceiver_mode(struct device *dev, int mode)
388{
389 gpio_set_value(CORGI_GPIO_IR_ON, mode & IR_OFF);
390 pxa2xx_transceiver_mode(dev, mode);
391}
392
393static int corgi_irda_startup(struct device *dev)
394{
395 int err;
396
397 err = gpio_request(CORGI_GPIO_IR_ON, "IR_ON");
398 if (err)
399 return err;
400
401 gpio_direction_output(CORGI_GPIO_IR_ON, 1);
402 return 0;
403}
404
405static void corgi_irda_shutdown(struct device *dev)
406{
407 gpio_free(CORGI_GPIO_IR_ON);
408}
409
410static struct pxaficp_platform_data corgi_ficp_platform_data = { 450static struct pxaficp_platform_data corgi_ficp_platform_data = {
451 .gpio_pwdown = CORGI_GPIO_IR_ON,
411 .transceiver_cap = IR_SIRMODE | IR_OFF, 452 .transceiver_cap = IR_SIRMODE | IR_OFF,
412 .transceiver_mode = corgi_irda_transceiver_mode,
413 .startup = corgi_irda_startup,
414 .shutdown = corgi_irda_shutdown,
415}; 453};
416 454
417 455
@@ -633,9 +671,14 @@ static void __init corgi_init(void)
633 671
634 pxa2xx_mfp_config(ARRAY_AND_SIZE(corgi_pin_config)); 672 pxa2xx_mfp_config(ARRAY_AND_SIZE(corgi_pin_config));
635 673
674 pxa_set_ffuart_info(NULL);
675 pxa_set_btuart_info(NULL);
676 pxa_set_stuart_info(NULL);
677
636 corgi_init_spi(); 678 corgi_init_spi();
637 679
638 pxa_set_udc_info(&udc_info); 680 pxa_set_udc_info(&udc_info);
681 corgi_mci_platform_data.detect_delay = msecs_to_jiffies(250);
639 pxa_set_mci_info(&corgi_mci_platform_data); 682 pxa_set_mci_info(&corgi_mci_platform_data);
640 pxa_set_ficp_info(&corgi_ficp_platform_data); 683 pxa_set_ficp_info(&corgi_ficp_platform_data);
641 pxa_set_i2c_info(NULL); 684 pxa_set_i2c_info(NULL);
diff --git a/arch/arm/mach-pxa/corgi_pm.c b/arch/arm/mach-pxa/corgi_pm.c
index a093282fe4db..d4a0733e905b 100644
--- a/arch/arm/mach-pxa/corgi_pm.c
+++ b/arch/arm/mach-pxa/corgi_pm.c
@@ -214,8 +214,8 @@ static struct sharpsl_charger_machinfo corgi_pm_machinfo = {
214 .fatal_acin_volt = SHARPSL_FATAL_ACIN_VOLT, 214 .fatal_acin_volt = SHARPSL_FATAL_ACIN_VOLT,
215 .fatal_noacin_volt= SHARPSL_FATAL_NOACIN_VOLT, 215 .fatal_noacin_volt= SHARPSL_FATAL_NOACIN_VOLT,
216 .bat_levels = 40, 216 .bat_levels = 40,
217 .bat_levels_noac = spitz_battery_levels_noac, 217 .bat_levels_noac = sharpsl_battery_levels_noac,
218 .bat_levels_acin = spitz_battery_levels_acin, 218 .bat_levels_acin = sharpsl_battery_levels_acin,
219 .status_high_acin = 188, 219 .status_high_acin = 188,
220 .status_low_acin = 178, 220 .status_low_acin = 178,
221 .status_high_noac = 185, 221 .status_high_noac = 185,
diff --git a/arch/arm/mach-pxa/cpufreq-pxa2xx.c b/arch/arm/mach-pxa/cpufreq-pxa2xx.c
index 3a8ee2272add..9e4d9816726a 100644
--- a/arch/arm/mach-pxa/cpufreq-pxa2xx.c
+++ b/arch/arm/mach-pxa/cpufreq-pxa2xx.c
@@ -155,7 +155,7 @@ MODULE_PARM_DESC(pxa255_turbo_table, "Selects the frequency table (0 = run table
155 155
156static pxa_freqs_t pxa27x_freqs[] = { 156static pxa_freqs_t pxa27x_freqs[] = {
157 {104000, 104000, PXA27x_CCCR(1, 8, 2), 0, CCLKCFG2(1, 0, 1), 900000, 1705000 }, 157 {104000, 104000, PXA27x_CCCR(1, 8, 2), 0, CCLKCFG2(1, 0, 1), 900000, 1705000 },
158 {156000, 104000, PXA27x_CCCR(1, 8, 6), 0, CCLKCFG2(1, 1, 1), 1000000, 1705000 }, 158 {156000, 104000, PXA27x_CCCR(1, 8, 3), 0, CCLKCFG2(1, 0, 1), 1000000, 1705000 },
159 {208000, 208000, PXA27x_CCCR(0, 16, 2), 1, CCLKCFG2(0, 0, 1), 1180000, 1705000 }, 159 {208000, 208000, PXA27x_CCCR(0, 16, 2), 1, CCLKCFG2(0, 0, 1), 1180000, 1705000 },
160 {312000, 208000, PXA27x_CCCR(1, 16, 3), 1, CCLKCFG2(1, 0, 1), 1250000, 1705000 }, 160 {312000, 208000, PXA27x_CCCR(1, 16, 3), 1, CCLKCFG2(1, 0, 1), 1250000, 1705000 },
161 {416000, 208000, PXA27x_CCCR(1, 16, 4), 1, CCLKCFG2(1, 0, 1), 1350000, 1705000 }, 161 {416000, 208000, PXA27x_CCCR(1, 16, 4), 1, CCLKCFG2(1, 0, 1), 1350000, 1705000 },
@@ -447,6 +447,7 @@ static __init int pxa_cpufreq_init(struct cpufreq_policy *policy)
447 pxa27x_freq_table[i].frequency = freq; 447 pxa27x_freq_table[i].frequency = freq;
448 pxa27x_freq_table[i].index = i; 448 pxa27x_freq_table[i].index = i;
449 } 449 }
450 pxa27x_freq_table[i].index = i;
450 pxa27x_freq_table[i].frequency = CPUFREQ_TABLE_END; 451 pxa27x_freq_table[i].frequency = CPUFREQ_TABLE_END;
451 452
452 /* 453 /*
diff --git a/arch/arm/mach-pxa/cpufreq-pxa3xx.c b/arch/arm/mach-pxa/cpufreq-pxa3xx.c
index 67f34a8d8e60..149cdd9aee4d 100644
--- a/arch/arm/mach-pxa/cpufreq-pxa3xx.c
+++ b/arch/arm/mach-pxa/cpufreq-pxa3xx.c
@@ -102,7 +102,7 @@ static int setup_freqs_table(struct cpufreq_policy *policy,
102 table[i].index = i; 102 table[i].index = i;
103 table[i].frequency = freqs[i].cpufreq_mhz * 1000; 103 table[i].frequency = freqs[i].cpufreq_mhz * 1000;
104 } 104 }
105 table[num].frequency = i; 105 table[num].index = i;
106 table[num].frequency = CPUFREQ_TABLE_END; 106 table[num].frequency = CPUFREQ_TABLE_END;
107 107
108 pxa3xx_freqs = freqs; 108 pxa3xx_freqs = freqs;
diff --git a/arch/arm/mach-pxa/csb726.c b/arch/arm/mach-pxa/csb726.c
index 7d3e1b46e550..88575b87bd33 100644
--- a/arch/arm/mach-pxa/csb726.c
+++ b/arch/arm/mach-pxa/csb726.c
@@ -130,61 +130,17 @@ static struct pxamci_platform_data csb726_mci_data;
130static int csb726_mci_init(struct device *dev, 130static int csb726_mci_init(struct device *dev,
131 irq_handler_t detect, void *data) 131 irq_handler_t detect, void *data)
132{ 132{
133 int err;
134
135 csb726_mci_data.detect_delay = msecs_to_jiffies(500); 133 csb726_mci_data.detect_delay = msecs_to_jiffies(500);
136
137 err = gpio_request(CSB726_GPIO_MMC_DETECT, "MMC detect");
138 if (err)
139 goto err_det_req;
140
141 err = gpio_direction_input(CSB726_GPIO_MMC_DETECT);
142 if (err)
143 goto err_det_dir;
144
145 err = gpio_request(CSB726_GPIO_MMC_RO, "MMC ro");
146 if (err)
147 goto err_ro_req;
148
149 err = gpio_direction_input(CSB726_GPIO_MMC_RO);
150 if (err)
151 goto err_ro_dir;
152
153 err = request_irq(gpio_to_irq(CSB726_GPIO_MMC_DETECT), detect,
154 IRQF_DISABLED, "MMC card detect", data);
155 if (err)
156 goto err_irq;
157
158 return 0; 134 return 0;
159
160err_irq:
161err_ro_dir:
162 gpio_free(CSB726_GPIO_MMC_RO);
163err_ro_req:
164err_det_dir:
165 gpio_free(CSB726_GPIO_MMC_DETECT);
166err_det_req:
167 return err;
168}
169
170static int csb726_mci_get_ro(struct device *dev)
171{
172 return gpio_get_value(CSB726_GPIO_MMC_RO);
173}
174
175static void csb726_mci_exit(struct device *dev, void *data)
176{
177 free_irq(gpio_to_irq(CSB726_GPIO_MMC_DETECT), data);
178 gpio_free(CSB726_GPIO_MMC_RO);
179 gpio_free(CSB726_GPIO_MMC_DETECT);
180} 135}
181 136
182static struct pxamci_platform_data csb726_mci = { 137static struct pxamci_platform_data csb726_mci = {
183 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, 138 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34,
184 .init = csb726_mci_init, 139 .init = csb726_mci_init,
185 .get_ro = csb726_mci_get_ro,
186 /* FIXME setpower */ 140 /* FIXME setpower */
187 .exit = csb726_mci_exit, 141 .gpio_card_detect = CSB726_GPIO_MMC_DETECT,
142 .gpio_card_ro = CSB726_GPIO_MMC_RO,
143 .gpio_power = -1,
188}; 144};
189 145
190static struct pxaohci_platform_data csb726_ohci_platform_data = { 146static struct pxaohci_platform_data csb726_ohci_platform_data = {
@@ -282,7 +238,7 @@ static struct resource csb726_lan_resources[] = {
282}; 238};
283 239
284struct smsc911x_platform_config csb726_lan_config = { 240struct smsc911x_platform_config csb726_lan_config = {
285 .irq_type = SMSC911X_IRQ_POLARITY_ACTIVE_LOW, 241 .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
286 .irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL, 242 .irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL,
287 .flags = SMSC911X_USE_32BIT, 243 .flags = SMSC911X_USE_32BIT,
288 .phy_interface = PHY_INTERFACE_MODE_MII, 244 .phy_interface = PHY_INTERFACE_MODE_MII,
@@ -312,6 +268,9 @@ static void __init csb726_init(void)
312/* MSC2 = 0x06697ff4; *//* none/SM501 */ 268/* MSC2 = 0x06697ff4; *//* none/SM501 */
313 MSC2 = (MSC2 & ~0xffff) | 0x7ff4; /* SM501 */ 269 MSC2 = (MSC2 & ~0xffff) | 0x7ff4; /* SM501 */
314 270
271 pxa_set_ffuart_info(NULL);
272 pxa_set_btuart_info(NULL);
273 pxa_set_stuart_info(NULL);
315 pxa_set_i2c_info(NULL); 274 pxa_set_i2c_info(NULL);
316 pxa27x_set_i2c_power_info(NULL); 275 pxa27x_set_i2c_power_info(NULL);
317 pxa_set_mci_info(&csb726_mci); 276 pxa_set_mci_info(&csb726_mci);
diff --git a/arch/arm/mach-pxa/devices.c b/arch/arm/mach-pxa/devices.c
index ecc08f360b68..3395463bb5a6 100644
--- a/arch/arm/mach-pxa/devices.c
+++ b/arch/arm/mach-pxa/devices.c
@@ -4,17 +4,18 @@
4#include <linux/platform_device.h> 4#include <linux/platform_device.h>
5#include <linux/dma-mapping.h> 5#include <linux/dma-mapping.h>
6 6
7#include <mach/hardware.h>
7#include <mach/udc.h> 8#include <mach/udc.h>
8#include <mach/pxafb.h> 9#include <mach/pxafb.h>
9#include <mach/mmc.h> 10#include <mach/mmc.h>
10#include <mach/irda.h> 11#include <mach/irda.h>
11#include <plat/i2c.h>
12#include <mach/ohci.h> 12#include <mach/ohci.h>
13#include <mach/pxa27x_keypad.h> 13#include <mach/pxa27x_keypad.h>
14#include <mach/pxa2xx_spi.h> 14#include <mach/pxa2xx_spi.h>
15#include <mach/camera.h> 15#include <mach/camera.h>
16#include <mach/audio.h> 16#include <mach/audio.h>
17#include <mach/pxa3xx_nand.h> 17#include <plat/i2c.h>
18#include <plat/pxa3xx_nand.h>
18 19
19#include "devices.h" 20#include "devices.h"
20#include "generic.h" 21#include "generic.h"
@@ -167,13 +168,18 @@ static struct resource pxa_resource_ffuart[] = {
167 } 168 }
168}; 169};
169 170
170struct platform_device pxa_device_ffuart= { 171struct platform_device pxa_device_ffuart = {
171 .name = "pxa2xx-uart", 172 .name = "pxa2xx-uart",
172 .id = 0, 173 .id = 0,
173 .resource = pxa_resource_ffuart, 174 .resource = pxa_resource_ffuart,
174 .num_resources = ARRAY_SIZE(pxa_resource_ffuart), 175 .num_resources = ARRAY_SIZE(pxa_resource_ffuart),
175}; 176};
176 177
178void __init pxa_set_ffuart_info(void *info)
179{
180 pxa_register_device(&pxa_device_ffuart, info);
181}
182
177static struct resource pxa_resource_btuart[] = { 183static struct resource pxa_resource_btuart[] = {
178 { 184 {
179 .start = 0x40200000, 185 .start = 0x40200000,
@@ -193,6 +199,11 @@ struct platform_device pxa_device_btuart = {
193 .num_resources = ARRAY_SIZE(pxa_resource_btuart), 199 .num_resources = ARRAY_SIZE(pxa_resource_btuart),
194}; 200};
195 201
202void __init pxa_set_btuart_info(void *info)
203{
204 pxa_register_device(&pxa_device_btuart, info);
205}
206
196static struct resource pxa_resource_stuart[] = { 207static struct resource pxa_resource_stuart[] = {
197 { 208 {
198 .start = 0x40700000, 209 .start = 0x40700000,
@@ -212,6 +223,11 @@ struct platform_device pxa_device_stuart = {
212 .num_resources = ARRAY_SIZE(pxa_resource_stuart), 223 .num_resources = ARRAY_SIZE(pxa_resource_stuart),
213}; 224};
214 225
226void __init pxa_set_stuart_info(void *info)
227{
228 pxa_register_device(&pxa_device_stuart, info);
229}
230
215static struct resource pxa_resource_hwuart[] = { 231static struct resource pxa_resource_hwuart[] = {
216 { 232 {
217 .start = 0x41600000, 233 .start = 0x41600000,
@@ -231,6 +247,14 @@ struct platform_device pxa_device_hwuart = {
231 .num_resources = ARRAY_SIZE(pxa_resource_hwuart), 247 .num_resources = ARRAY_SIZE(pxa_resource_hwuart),
232}; 248};
233 249
250void __init pxa_set_hwuart_info(void *info)
251{
252 if (cpu_is_pxa255())
253 pxa_register_device(&pxa_device_hwuart, info);
254 else
255 pr_info("UART: Ignoring attempt to register HWUART on non-PXA255 hardware");
256}
257
234static struct resource pxai2c_resources[] = { 258static struct resource pxai2c_resources[] = {
235 { 259 {
236 .start = 0x40301680, 260 .start = 0x40301680,
@@ -935,6 +959,33 @@ void __init pxa3xx_set_nand_info(struct pxa3xx_nand_platform_data *info)
935{ 959{
936 pxa_register_device(&pxa3xx_device_nand, info); 960 pxa_register_device(&pxa3xx_device_nand, info);
937} 961}
962
963static struct resource pxa3xx_resources_gcu[] = {
964 {
965 .start = 0x54000000,
966 .end = 0x54000fff,
967 .flags = IORESOURCE_MEM,
968 },
969 {
970 .start = IRQ_GCU,
971 .end = IRQ_GCU,
972 .flags = IORESOURCE_IRQ,
973 },
974};
975
976static u64 pxa3xx_gcu_dmamask = DMA_BIT_MASK(32);
977
978struct platform_device pxa3xx_device_gcu = {
979 .name = "pxa3xx-gcu",
980 .id = -1,
981 .num_resources = ARRAY_SIZE(pxa3xx_resources_gcu),
982 .resource = pxa3xx_resources_gcu,
983 .dev = {
984 .dma_mask = &pxa3xx_gcu_dmamask,
985 .coherent_dma_mask = 0xffffffff,
986 },
987};
988
938#endif /* CONFIG_PXA3xx */ 989#endif /* CONFIG_PXA3xx */
939 990
940/* pxa2xx-spi platform-device ID equals respective SSP platform-device ID + 1. 991/* pxa2xx-spi platform-device ID equals respective SSP platform-device ID + 1.
diff --git a/arch/arm/mach-pxa/devices.h b/arch/arm/mach-pxa/devices.h
index ecc24a4dca6d..93817d99761e 100644
--- a/arch/arm/mach-pxa/devices.h
+++ b/arch/arm/mach-pxa/devices.h
@@ -35,4 +35,6 @@ extern struct platform_device pxa27x_device_pwm1;
35extern struct platform_device pxa3xx_device_nand; 35extern struct platform_device pxa3xx_device_nand;
36extern struct platform_device pxa3xx_device_i2c_power; 36extern struct platform_device pxa3xx_device_i2c_power;
37 37
38extern struct platform_device pxa3xx_device_gcu;
39
38void __init pxa_register_device(struct platform_device *dev, void *data); 40void __init pxa_register_device(struct platform_device *dev, void *data);
diff --git a/arch/arm/mach-pxa/e330.c b/arch/arm/mach-pxa/e330.c
index 74d3f8987c5c..8fde3387279d 100644
--- a/arch/arm/mach-pxa/e330.c
+++ b/arch/arm/mach-pxa/e330.c
@@ -55,6 +55,9 @@ static struct platform_device *devices[] __initdata = {
55 55
56static void __init e330_init(void) 56static void __init e330_init(void)
57{ 57{
58 pxa_set_ffuart_info(NULL);
59 pxa_set_btuart_info(NULL);
60 pxa_set_stuart_info(NULL);
58 eseries_register_clks(); 61 eseries_register_clks();
59 eseries_get_tmio_gpios(); 62 eseries_get_tmio_gpios();
60 platform_add_devices(devices, ARRAY_SIZE(devices)); 63 platform_add_devices(devices, ARRAY_SIZE(devices));
diff --git a/arch/arm/mach-pxa/e350.c b/arch/arm/mach-pxa/e350.c
index 080036272131..f50f055f5720 100644
--- a/arch/arm/mach-pxa/e350.c
+++ b/arch/arm/mach-pxa/e350.c
@@ -56,6 +56,9 @@ static struct platform_device *devices[] __initdata = {
56 56
57static void __init e350_init(void) 57static void __init e350_init(void)
58{ 58{
59 pxa_set_ffuart_info(NULL);
60 pxa_set_btuart_info(NULL);
61 pxa_set_stuart_info(NULL);
59 eseries_register_clks(); 62 eseries_register_clks();
60 eseries_get_tmio_gpios(); 63 eseries_get_tmio_gpios();
61 platform_add_devices(devices, ARRAY_SIZE(devices)); 64 platform_add_devices(devices, ARRAY_SIZE(devices));
diff --git a/arch/arm/mach-pxa/e400.c b/arch/arm/mach-pxa/e400.c
index ed9c0c3f64a2..55b950f12844 100644
--- a/arch/arm/mach-pxa/e400.c
+++ b/arch/arm/mach-pxa/e400.c
@@ -130,6 +130,9 @@ static struct platform_device *devices[] __initdata = {
130static void __init e400_init(void) 130static void __init e400_init(void)
131{ 131{
132 pxa2xx_mfp_config(ARRAY_AND_SIZE(e400_pin_config)); 132 pxa2xx_mfp_config(ARRAY_AND_SIZE(e400_pin_config));
133 pxa_set_ffuart_info(NULL);
134 pxa_set_btuart_info(NULL);
135 pxa_set_stuart_info(NULL);
133 /* Fixme - e400 may have a switched clock */ 136 /* Fixme - e400 may have a switched clock */
134 eseries_register_clks(); 137 eseries_register_clks();
135 eseries_get_tmio_gpios(); 138 eseries_get_tmio_gpios();
diff --git a/arch/arm/mach-pxa/e740.c b/arch/arm/mach-pxa/e740.c
index a36fc17f671d..94b23a9e3877 100644
--- a/arch/arm/mach-pxa/e740.c
+++ b/arch/arm/mach-pxa/e740.c
@@ -192,6 +192,9 @@ static struct platform_device *devices[] __initdata = {
192static void __init e740_init(void) 192static void __init e740_init(void)
193{ 193{
194 pxa2xx_mfp_config(ARRAY_AND_SIZE(e740_pin_config)); 194 pxa2xx_mfp_config(ARRAY_AND_SIZE(e740_pin_config));
195 pxa_set_ffuart_info(NULL);
196 pxa_set_btuart_info(NULL);
197 pxa_set_stuart_info(NULL);
195 eseries_register_clks(); 198 eseries_register_clks();
196 clk_add_alias("CLK_CK48M", e740_t7l66xb_device.name, 199 clk_add_alias("CLK_CK48M", e740_t7l66xb_device.name,
197 "UDCCLK", &pxa25x_device_udc.dev), 200 "UDCCLK", &pxa25x_device_udc.dev),
@@ -199,7 +202,6 @@ static void __init e740_init(void)
199 platform_add_devices(devices, ARRAY_SIZE(devices)); 202 platform_add_devices(devices, ARRAY_SIZE(devices));
200 pxa_set_udc_info(&e7xx_udc_mach_info); 203 pxa_set_udc_info(&e7xx_udc_mach_info);
201 pxa_set_ac97_info(NULL); 204 pxa_set_ac97_info(NULL);
202 e7xx_irda_init();
203 pxa_set_ficp_info(&e7xx_ficp_platform_data); 205 pxa_set_ficp_info(&e7xx_ficp_platform_data);
204} 206}
205 207
diff --git a/arch/arm/mach-pxa/e750.c b/arch/arm/mach-pxa/e750.c
index 1d00110590e5..5eccbce73a33 100644
--- a/arch/arm/mach-pxa/e750.c
+++ b/arch/arm/mach-pxa/e750.c
@@ -194,13 +194,15 @@ static struct platform_device *devices[] __initdata = {
194static void __init e750_init(void) 194static void __init e750_init(void)
195{ 195{
196 pxa2xx_mfp_config(ARRAY_AND_SIZE(e750_pin_config)); 196 pxa2xx_mfp_config(ARRAY_AND_SIZE(e750_pin_config));
197 pxa_set_ffuart_info(NULL);
198 pxa_set_btuart_info(NULL);
199 pxa_set_stuart_info(NULL);
197 clk_add_alias("CLK_CK3P6MI", e750_tc6393xb_device.name, 200 clk_add_alias("CLK_CK3P6MI", e750_tc6393xb_device.name,
198 "GPIO11_CLK", NULL), 201 "GPIO11_CLK", NULL),
199 eseries_get_tmio_gpios(); 202 eseries_get_tmio_gpios();
200 platform_add_devices(devices, ARRAY_SIZE(devices)); 203 platform_add_devices(devices, ARRAY_SIZE(devices));
201 pxa_set_udc_info(&e7xx_udc_mach_info); 204 pxa_set_udc_info(&e7xx_udc_mach_info);
202 pxa_set_ac97_info(NULL); 205 pxa_set_ac97_info(NULL);
203 e7xx_irda_init();
204 pxa_set_ficp_info(&e7xx_ficp_platform_data); 206 pxa_set_ficp_info(&e7xx_ficp_platform_data);
205} 207}
206 208
diff --git a/arch/arm/mach-pxa/e800.c b/arch/arm/mach-pxa/e800.c
index 9866c7b9e784..aad129bed199 100644
--- a/arch/arm/mach-pxa/e800.c
+++ b/arch/arm/mach-pxa/e800.c
@@ -195,6 +195,9 @@ static struct platform_device *devices[] __initdata = {
195 195
196static void __init e800_init(void) 196static void __init e800_init(void)
197{ 197{
198 pxa_set_ffuart_info(NULL);
199 pxa_set_btuart_info(NULL);
200 pxa_set_stuart_info(NULL);
198 clk_add_alias("CLK_CK3P6MI", e800_tc6393xb_device.name, 201 clk_add_alias("CLK_CK3P6MI", e800_tc6393xb_device.name,
199 "GPIO11_CLK", NULL), 202 "GPIO11_CLK", NULL),
200 eseries_get_tmio_gpios(); 203 eseries_get_tmio_gpios();
diff --git a/arch/arm/mach-pxa/em-x270.c b/arch/arm/mach-pxa/em-x270.c
index 9cd09465a0e8..1c0de808b54d 100644
--- a/arch/arm/mach-pxa/em-x270.c
+++ b/arch/arm/mach-pxa/em-x270.c
@@ -646,13 +646,16 @@ static int em_x270_mci_get_ro(struct device *dev)
646} 646}
647 647
648static struct pxamci_platform_data em_x270_mci_platform_data = { 648static struct pxamci_platform_data em_x270_mci_platform_data = {
649 .ocr_mask = MMC_VDD_20_21|MMC_VDD_21_22|MMC_VDD_22_23| 649 .ocr_mask = MMC_VDD_20_21|MMC_VDD_21_22|MMC_VDD_22_23|
650 MMC_VDD_24_25|MMC_VDD_25_26|MMC_VDD_26_27| 650 MMC_VDD_24_25|MMC_VDD_25_26|MMC_VDD_26_27|
651 MMC_VDD_27_28|MMC_VDD_28_29|MMC_VDD_29_30| 651 MMC_VDD_27_28|MMC_VDD_28_29|MMC_VDD_29_30|
652 MMC_VDD_30_31|MMC_VDD_31_32, 652 MMC_VDD_30_31|MMC_VDD_31_32,
653 .init = em_x270_mci_init, 653 .init = em_x270_mci_init,
654 .setpower = em_x270_mci_setpower, 654 .setpower = em_x270_mci_setpower,
655 .exit = em_x270_mci_exit, 655 .exit = em_x270_mci_exit,
656 .gpio_card_detect = -1,
657 .gpio_card_ro = -1,
658 .gpio_power = -1,
656}; 659};
657 660
658static void __init em_x270_init_mmc(void) 661static void __init em_x270_init_mmc(void)
@@ -964,7 +967,7 @@ static inline void em_x270_init_gpio_keys(void) {}
964#if defined(CONFIG_VIDEO_PXA27x) || defined(CONFIG_VIDEO_PXA27x_MODULE) 967#if defined(CONFIG_VIDEO_PXA27x) || defined(CONFIG_VIDEO_PXA27x_MODULE)
965static struct regulator *em_x270_camera_ldo; 968static struct regulator *em_x270_camera_ldo;
966 969
967static int em_x270_sensor_init(struct device *dev) 970static int em_x270_sensor_init(void)
968{ 971{
969 int ret; 972 int ret;
970 973
@@ -993,7 +996,6 @@ static int em_x270_sensor_init(struct device *dev)
993} 996}
994 997
995struct pxacamera_platform_data em_x270_camera_platform_data = { 998struct pxacamera_platform_data em_x270_camera_platform_data = {
996 .init = em_x270_sensor_init,
997 .flags = PXA_CAMERA_MASTER | PXA_CAMERA_DATAWIDTH_8 | 999 .flags = PXA_CAMERA_MASTER | PXA_CAMERA_DATAWIDTH_8 |
998 PXA_CAMERA_PCLK_EN | PXA_CAMERA_MCLK_EN, 1000 PXA_CAMERA_PCLK_EN | PXA_CAMERA_MCLK_EN,
999 .mclk_10khz = 2600, 1001 .mclk_10khz = 2600,
@@ -1022,22 +1024,34 @@ static int em_x270_sensor_power(struct device *dev, int on)
1022 return 0; 1024 return 0;
1023} 1025}
1024 1026
1025static struct soc_camera_link iclink = {
1026 .bus_id = 0,
1027 .power = em_x270_sensor_power,
1028};
1029
1030static struct i2c_board_info em_x270_i2c_cam_info[] = { 1027static struct i2c_board_info em_x270_i2c_cam_info[] = {
1031 { 1028 {
1032 I2C_BOARD_INFO("mt9m111", 0x48), 1029 I2C_BOARD_INFO("mt9m111", 0x48),
1030 },
1031};
1032
1033static struct soc_camera_link iclink = {
1034 .bus_id = 0,
1035 .power = em_x270_sensor_power,
1036 .board_info = &em_x270_i2c_cam_info[0],
1037 .i2c_adapter_id = 0,
1038 .module_name = "mt9m111",
1039};
1040
1041static struct platform_device em_x270_camera = {
1042 .name = "soc-camera-pdrv",
1043 .id = -1,
1044 .dev = {
1033 .platform_data = &iclink, 1045 .platform_data = &iclink,
1034 }, 1046 },
1035}; 1047};
1036 1048
1037static void __init em_x270_init_camera(void) 1049static void __init em_x270_init_camera(void)
1038{ 1050{
1039 i2c_register_board_info(0, ARRAY_AND_SIZE(em_x270_i2c_cam_info)); 1051 if (em_x270_sensor_init() == 0) {
1040 pxa_set_camera_info(&em_x270_camera_platform_data); 1052 pxa_set_camera_info(&em_x270_camera_platform_data);
1053 platform_device_register(&em_x270_camera);
1054 }
1041} 1055}
1042#else 1056#else
1043static inline void em_x270_init_camera(void) {} 1057static inline void em_x270_init_camera(void) {}
@@ -1103,6 +1117,7 @@ REGULATOR_CONSUMER(ldo5, NULL, "vcc cam");
1103REGULATOR_CONSUMER(ldo10, &pxa_device_mci.dev, "vcc sdio"); 1117REGULATOR_CONSUMER(ldo10, &pxa_device_mci.dev, "vcc sdio");
1104REGULATOR_CONSUMER(ldo12, NULL, "vcc usb"); 1118REGULATOR_CONSUMER(ldo12, NULL, "vcc usb");
1105REGULATOR_CONSUMER(ldo19, &em_x270_gprs_userspace_consumer.dev, "vcc gprs"); 1119REGULATOR_CONSUMER(ldo19, &em_x270_gprs_userspace_consumer.dev, "vcc gprs");
1120REGULATOR_CONSUMER(buck2, NULL, "vcc_core");
1106 1121
1107#define REGULATOR_INIT(_ldo, _min_uV, _max_uV, _ops_mask) \ 1122#define REGULATOR_INIT(_ldo, _min_uV, _max_uV, _ops_mask) \
1108 static struct regulator_init_data _ldo##_data = { \ 1123 static struct regulator_init_data _ldo##_data = { \
@@ -1125,6 +1140,7 @@ REGULATOR_INIT(ldo10, 2000000, 3200000,
1125 REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE); 1140 REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE);
1126REGULATOR_INIT(ldo12, 3000000, 3000000, REGULATOR_CHANGE_STATUS); 1141REGULATOR_INIT(ldo12, 3000000, 3000000, REGULATOR_CHANGE_STATUS);
1127REGULATOR_INIT(ldo19, 3200000, 3200000, REGULATOR_CHANGE_STATUS); 1142REGULATOR_INIT(ldo19, 3200000, 3200000, REGULATOR_CHANGE_STATUS);
1143REGULATOR_INIT(buck2, 1000000, 1650000, REGULATOR_CHANGE_VOLTAGE);
1128 1144
1129struct led_info em_x270_led_info = { 1145struct led_info em_x270_led_info = {
1130 .name = "em-x270:orange", 1146 .name = "em-x270:orange",
@@ -1194,6 +1210,8 @@ struct da903x_subdev_info em_x270_da9030_subdevs[] = {
1194 DA9030_LDO(12), 1210 DA9030_LDO(12),
1195 DA9030_LDO(19), 1211 DA9030_LDO(19),
1196 1212
1213 DA9030_SUBDEV(regulator, BUCK2, &buck2_data),
1214
1197 DA9030_SUBDEV(led, LED_PC, &em_x270_led_info), 1215 DA9030_SUBDEV(led, LED_PC, &em_x270_led_info),
1198 DA9030_SUBDEV(backlight, WLED, &em_x270_led_info), 1216 DA9030_SUBDEV(backlight, WLED, &em_x270_led_info),
1199 DA9030_SUBDEV(battery, BAT, &em_x270_batterty_info), 1217 DA9030_SUBDEV(battery, BAT, &em_x270_batterty_info),
@@ -1245,7 +1263,6 @@ static void __init em_x270_init_i2c(void)
1245 1263
1246static void __init em_x270_module_init(void) 1264static void __init em_x270_module_init(void)
1247{ 1265{
1248 pr_info("%s\n", __func__);
1249 pxa2xx_mfp_config(ARRAY_AND_SIZE(em_x270_pin_config)); 1266 pxa2xx_mfp_config(ARRAY_AND_SIZE(em_x270_pin_config));
1250 1267
1251 mmc_cd = GPIO13_MMC_CD; 1268 mmc_cd = GPIO13_MMC_CD;
@@ -1257,7 +1274,6 @@ static void __init em_x270_module_init(void)
1257 1274
1258static void __init em_x270_exeda_init(void) 1275static void __init em_x270_exeda_init(void)
1259{ 1276{
1260 pr_info("%s\n", __func__);
1261 pxa2xx_mfp_config(ARRAY_AND_SIZE(exeda_pin_config)); 1277 pxa2xx_mfp_config(ARRAY_AND_SIZE(exeda_pin_config));
1262 1278
1263 mmc_cd = GPIO114_MMC_CD; 1279 mmc_cd = GPIO114_MMC_CD;
@@ -1271,6 +1287,10 @@ static void __init em_x270_init(void)
1271{ 1287{
1272 pxa2xx_mfp_config(ARRAY_AND_SIZE(common_pin_config)); 1288 pxa2xx_mfp_config(ARRAY_AND_SIZE(common_pin_config));
1273 1289
1290 pxa_set_ffuart_info(NULL);
1291 pxa_set_btuart_info(NULL);
1292 pxa_set_stuart_info(NULL);
1293
1274#ifdef CONFIG_PM 1294#ifdef CONFIG_PM
1275 pxa27x_set_pwrmode(PWRMODE_DEEPSLEEP); 1295 pxa27x_set_pwrmode(PWRMODE_DEEPSLEEP);
1276#endif 1296#endif
diff --git a/arch/arm/mach-pxa/eseries.c b/arch/arm/mach-pxa/eseries.c
index c60dadf847a6..91417f035069 100644
--- a/arch/arm/mach-pxa/eseries.c
+++ b/arch/arm/mach-pxa/eseries.c
@@ -47,44 +47,9 @@ struct pxa2xx_udc_mach_info e7xx_udc_mach_info = {
47 .gpio_pullup_inverted = 1 47 .gpio_pullup_inverted = 1
48}; 48};
49 49
50static void e7xx_irda_transceiver_mode(struct device *dev, int mode)
51{
52 if (mode & IR_OFF) {
53 gpio_set_value(GPIO_E7XX_IR_OFF, 1);
54 pxa2xx_transceiver_mode(dev, mode);
55 } else {
56 pxa2xx_transceiver_mode(dev, mode);
57 gpio_set_value(GPIO_E7XX_IR_OFF, 0);
58 }
59}
60
61int e7xx_irda_init(void)
62{
63 int ret;
64
65 ret = gpio_request(GPIO_E7XX_IR_OFF, "IrDA power");
66 if (ret)
67 goto out;
68
69 ret = gpio_direction_output(GPIO_E7XX_IR_OFF, 0);
70 if (ret)
71 goto out;
72
73 e7xx_irda_transceiver_mode(NULL, IR_SIRMODE | IR_OFF);
74out:
75 return ret;
76}
77
78static void e7xx_irda_shutdown(struct device *dev)
79{
80 e7xx_irda_transceiver_mode(dev, IR_SIRMODE | IR_OFF);
81 gpio_free(GPIO_E7XX_IR_OFF);
82}
83
84struct pxaficp_platform_data e7xx_ficp_platform_data = { 50struct pxaficp_platform_data e7xx_ficp_platform_data = {
85 .transceiver_cap = IR_SIRMODE | IR_OFF, 51 .gpio_pwdown = GPIO_E7XX_IR_OFF,
86 .transceiver_mode = e7xx_irda_transceiver_mode, 52 .transceiver_cap = IR_SIRMODE | IR_OFF,
87 .shutdown = e7xx_irda_shutdown,
88}; 53};
89 54
90int eseries_tmio_enable(struct platform_device *dev) 55int eseries_tmio_enable(struct platform_device *dev)
diff --git a/arch/arm/mach-pxa/ezx.c b/arch/arm/mach-pxa/ezx.c
index 588b265e5755..626c82b13970 100644
--- a/arch/arm/mach-pxa/ezx.c
+++ b/arch/arm/mach-pxa/ezx.c
@@ -17,7 +17,11 @@
17#include <linux/delay.h> 17#include <linux/delay.h>
18#include <linux/pwm_backlight.h> 18#include <linux/pwm_backlight.h>
19#include <linux/input.h> 19#include <linux/input.h>
20#include <linux/gpio.h>
20#include <linux/gpio_keys.h> 21#include <linux/gpio_keys.h>
22#include <linux/leds-lp3944.h>
23
24#include <media/soc_camera.h>
21 25
22#include <asm/setup.h> 26#include <asm/setup.h>
23#include <asm/mach-types.h> 27#include <asm/mach-types.h>
@@ -29,6 +33,7 @@
29#include <plat/i2c.h> 33#include <plat/i2c.h>
30#include <mach/hardware.h> 34#include <mach/hardware.h>
31#include <mach/pxa27x_keypad.h> 35#include <mach/pxa27x_keypad.h>
36#include <mach/camera.h>
32 37
33#include "devices.h" 38#include "devices.h"
34#include "generic.h" 39#include "generic.h"
@@ -38,6 +43,9 @@
38#define GPIO15_A910_FLIP_LID 15 43#define GPIO15_A910_FLIP_LID 15
39#define GPIO12_E680_LOCK_SWITCH 12 44#define GPIO12_E680_LOCK_SWITCH 12
40#define GPIO15_E6_LOCK_SWITCH 15 45#define GPIO15_E6_LOCK_SWITCH 15
46#define GPIO50_nCAM_EN 50
47#define GPIO19_GEN1_CAM_RST 19
48#define GPIO28_GEN2_CAM_RST 28
41 49
42static struct platform_pwm_backlight_data ezx_backlight_data = { 50static struct platform_pwm_backlight_data ezx_backlight_data = {
43 .pwm_id = 0, 51 .pwm_id = 0,
@@ -191,8 +199,8 @@ static unsigned long gen1_pin_config[] __initdata = {
191 GPIO94_CIF_DD_5, 199 GPIO94_CIF_DD_5,
192 GPIO17_CIF_DD_6, 200 GPIO17_CIF_DD_6,
193 GPIO108_CIF_DD_7, 201 GPIO108_CIF_DD_7,
194 GPIO50_GPIO, /* CAM_EN */ 202 GPIO50_GPIO | MFP_LPM_DRIVE_HIGH, /* CAM_EN */
195 GPIO19_GPIO, /* CAM_RST */ 203 GPIO19_GPIO | MFP_LPM_DRIVE_HIGH, /* CAM_RST */
196 204
197 /* EMU */ 205 /* EMU */
198 GPIO120_GPIO, /* EMU_MUX1 */ 206 GPIO120_GPIO, /* EMU_MUX1 */
@@ -248,8 +256,8 @@ static unsigned long gen2_pin_config[] __initdata = {
248 GPIO48_CIF_DD_5, 256 GPIO48_CIF_DD_5,
249 GPIO93_CIF_DD_6, 257 GPIO93_CIF_DD_6,
250 GPIO12_CIF_DD_7, 258 GPIO12_CIF_DD_7,
251 GPIO50_GPIO, /* CAM_EN */ 259 GPIO50_GPIO | MFP_LPM_DRIVE_HIGH, /* CAM_EN */
252 GPIO28_GPIO, /* CAM_RST */ 260 GPIO28_GPIO | MFP_LPM_DRIVE_HIGH, /* CAM_RST */
253 GPIO17_GPIO, /* CAM_FLASH */ 261 GPIO17_GPIO, /* CAM_FLASH */
254}; 262};
255#endif 263#endif
@@ -683,6 +691,81 @@ static struct platform_device a780_gpio_keys = {
683 }, 691 },
684}; 692};
685 693
694/* camera */
695static int a780_camera_init(void)
696{
697 int err;
698
699 /*
700 * GPIO50_nCAM_EN is active low
701 * GPIO19_GEN1_CAM_RST is active on rising edge
702 */
703 err = gpio_request(GPIO50_nCAM_EN, "nCAM_EN");
704 if (err) {
705 pr_err("%s: Failed to request nCAM_EN\n", __func__);
706 goto fail;
707 }
708
709 err = gpio_request(GPIO19_GEN1_CAM_RST, "CAM_RST");
710 if (err) {
711 pr_err("%s: Failed to request CAM_RST\n", __func__);
712 goto fail_gpio_cam_rst;
713 }
714
715 gpio_direction_output(GPIO50_nCAM_EN, 1);
716 gpio_direction_output(GPIO19_GEN1_CAM_RST, 0);
717
718 return 0;
719
720fail_gpio_cam_rst:
721 gpio_free(GPIO50_nCAM_EN);
722fail:
723 return err;
724}
725
726static int a780_camera_power(struct device *dev, int on)
727{
728 gpio_set_value(GPIO50_nCAM_EN, !on);
729 return 0;
730}
731
732static int a780_camera_reset(struct device *dev)
733{
734 gpio_set_value(GPIO19_GEN1_CAM_RST, 0);
735 msleep(10);
736 gpio_set_value(GPIO19_GEN1_CAM_RST, 1);
737
738 return 0;
739}
740
741struct pxacamera_platform_data a780_pxacamera_platform_data = {
742 .flags = PXA_CAMERA_MASTER | PXA_CAMERA_DATAWIDTH_8 |
743 PXA_CAMERA_PCLK_EN | PXA_CAMERA_MCLK_EN,
744 .mclk_10khz = 5000,
745};
746
747static struct i2c_board_info a780_camera_i2c_board_info = {
748 I2C_BOARD_INFO("mt9m111", 0x5d),
749};
750
751static struct soc_camera_link a780_iclink = {
752 .bus_id = 0,
753 .flags = SOCAM_SENSOR_INVERT_PCLK,
754 .i2c_adapter_id = 0,
755 .board_info = &a780_camera_i2c_board_info,
756 .module_name = "mt9m111",
757 .power = a780_camera_power,
758 .reset = a780_camera_reset,
759};
760
761static struct platform_device a780_camera = {
762 .name = "soc-camera-pdrv",
763 .id = 0,
764 .dev = {
765 .platform_data = &a780_iclink,
766 },
767};
768
686static struct platform_device *a780_devices[] __initdata = { 769static struct platform_device *a780_devices[] __initdata = {
687 &a780_gpio_keys, 770 &a780_gpio_keys,
688}; 771};
@@ -693,12 +776,21 @@ static void __init a780_init(void)
693 pxa2xx_mfp_config(ARRAY_AND_SIZE(gen1_pin_config)); 776 pxa2xx_mfp_config(ARRAY_AND_SIZE(gen1_pin_config));
694 pxa2xx_mfp_config(ARRAY_AND_SIZE(a780_pin_config)); 777 pxa2xx_mfp_config(ARRAY_AND_SIZE(a780_pin_config));
695 778
779 pxa_set_ffuart_info(NULL);
780 pxa_set_btuart_info(NULL);
781 pxa_set_stuart_info(NULL);
782
696 pxa_set_i2c_info(NULL); 783 pxa_set_i2c_info(NULL);
697 784
698 set_pxa_fb_info(&ezx_fb_info_1); 785 set_pxa_fb_info(&ezx_fb_info_1);
699 786
700 pxa_set_keypad_info(&a780_keypad_platform_data); 787 pxa_set_keypad_info(&a780_keypad_platform_data);
701 788
789 if (a780_camera_init() == 0) {
790 pxa_set_camera_info(&a780_pxacamera_platform_data);
791 platform_device_register(&a780_camera);
792 }
793
702 platform_add_devices(ARRAY_AND_SIZE(ezx_devices)); 794 platform_add_devices(ARRAY_AND_SIZE(ezx_devices));
703 platform_add_devices(ARRAY_AND_SIZE(a780_devices)); 795 platform_add_devices(ARRAY_AND_SIZE(a780_devices));
704} 796}
@@ -754,6 +846,10 @@ static void __init e680_init(void)
754 pxa2xx_mfp_config(ARRAY_AND_SIZE(gen1_pin_config)); 846 pxa2xx_mfp_config(ARRAY_AND_SIZE(gen1_pin_config));
755 pxa2xx_mfp_config(ARRAY_AND_SIZE(e680_pin_config)); 847 pxa2xx_mfp_config(ARRAY_AND_SIZE(e680_pin_config));
756 848
849 pxa_set_ffuart_info(NULL);
850 pxa_set_btuart_info(NULL);
851 pxa_set_stuart_info(NULL);
852
757 pxa_set_i2c_info(NULL); 853 pxa_set_i2c_info(NULL);
758 i2c_register_board_info(0, ARRAY_AND_SIZE(e680_i2c_board_info)); 854 i2c_register_board_info(0, ARRAY_AND_SIZE(e680_i2c_board_info));
759 855
@@ -816,6 +912,10 @@ static void __init a1200_init(void)
816 pxa2xx_mfp_config(ARRAY_AND_SIZE(gen2_pin_config)); 912 pxa2xx_mfp_config(ARRAY_AND_SIZE(gen2_pin_config));
817 pxa2xx_mfp_config(ARRAY_AND_SIZE(a1200_pin_config)); 913 pxa2xx_mfp_config(ARRAY_AND_SIZE(a1200_pin_config));
818 914
915 pxa_set_ffuart_info(NULL);
916 pxa_set_btuart_info(NULL);
917 pxa_set_stuart_info(NULL);
918
819 pxa_set_i2c_info(NULL); 919 pxa_set_i2c_info(NULL);
820 i2c_register_board_info(0, ARRAY_AND_SIZE(a1200_i2c_board_info)); 920 i2c_register_board_info(0, ARRAY_AND_SIZE(a1200_i2c_board_info));
821 921
@@ -864,6 +964,131 @@ static struct platform_device a910_gpio_keys = {
864 }, 964 },
865}; 965};
866 966
967/* camera */
968static int a910_camera_init(void)
969{
970 int err;
971
972 /*
973 * GPIO50_nCAM_EN is active low
974 * GPIO28_GEN2_CAM_RST is active on rising edge
975 */
976 err = gpio_request(GPIO50_nCAM_EN, "nCAM_EN");
977 if (err) {
978 pr_err("%s: Failed to request nCAM_EN\n", __func__);
979 goto fail;
980 }
981
982 err = gpio_request(GPIO28_GEN2_CAM_RST, "CAM_RST");
983 if (err) {
984 pr_err("%s: Failed to request CAM_RST\n", __func__);
985 goto fail_gpio_cam_rst;
986 }
987
988 gpio_direction_output(GPIO50_nCAM_EN, 1);
989 gpio_direction_output(GPIO28_GEN2_CAM_RST, 0);
990
991 return 0;
992
993fail_gpio_cam_rst:
994 gpio_free(GPIO50_nCAM_EN);
995fail:
996 return err;
997}
998
999static int a910_camera_power(struct device *dev, int on)
1000{
1001 gpio_set_value(GPIO50_nCAM_EN, !on);
1002 return 0;
1003}
1004
1005static int a910_camera_reset(struct device *dev)
1006{
1007 gpio_set_value(GPIO28_GEN2_CAM_RST, 0);
1008 msleep(10);
1009 gpio_set_value(GPIO28_GEN2_CAM_RST, 1);
1010
1011 return 0;
1012}
1013
1014struct pxacamera_platform_data a910_pxacamera_platform_data = {
1015 .flags = PXA_CAMERA_MASTER | PXA_CAMERA_DATAWIDTH_8 |
1016 PXA_CAMERA_PCLK_EN | PXA_CAMERA_MCLK_EN,
1017 .mclk_10khz = 5000,
1018};
1019
1020static struct i2c_board_info a910_camera_i2c_board_info = {
1021 I2C_BOARD_INFO("mt9m111", 0x5d),
1022};
1023
1024static struct soc_camera_link a910_iclink = {
1025 .bus_id = 0,
1026 .i2c_adapter_id = 0,
1027 .board_info = &a910_camera_i2c_board_info,
1028 .module_name = "mt9m111",
1029 .power = a910_camera_power,
1030 .reset = a910_camera_reset,
1031};
1032
1033static struct platform_device a910_camera = {
1034 .name = "soc-camera-pdrv",
1035 .id = 0,
1036 .dev = {
1037 .platform_data = &a910_iclink,
1038 },
1039};
1040
1041/* leds-lp3944 */
1042static struct lp3944_platform_data a910_lp3944_leds = {
1043 .leds_size = LP3944_LEDS_MAX,
1044 .leds = {
1045 [0] = {
1046 .name = "a910:red:",
1047 .status = LP3944_LED_STATUS_OFF,
1048 .type = LP3944_LED_TYPE_LED,
1049 },
1050 [1] = {
1051 .name = "a910:green:",
1052 .status = LP3944_LED_STATUS_OFF,
1053 .type = LP3944_LED_TYPE_LED,
1054 },
1055 [2] {
1056 .name = "a910:blue:",
1057 .status = LP3944_LED_STATUS_OFF,
1058 .type = LP3944_LED_TYPE_LED,
1059 },
1060 /* Leds 3 and 4 are used as display power switches */
1061 [3] = {
1062 .name = "a910::cli_display",
1063 .status = LP3944_LED_STATUS_OFF,
1064 .type = LP3944_LED_TYPE_LED_INVERTED
1065 },
1066 [4] = {
1067 .name = "a910::main_display",
1068 .status = LP3944_LED_STATUS_ON,
1069 .type = LP3944_LED_TYPE_LED_INVERTED
1070 },
1071 [5] = { .type = LP3944_LED_TYPE_NONE },
1072 [6] = {
1073 .name = "a910::torch",
1074 .status = LP3944_LED_STATUS_OFF,
1075 .type = LP3944_LED_TYPE_LED,
1076 },
1077 [7] = {
1078 .name = "a910::flash",
1079 .status = LP3944_LED_STATUS_OFF,
1080 .type = LP3944_LED_TYPE_LED_INVERTED,
1081 },
1082 },
1083};
1084
1085static struct i2c_board_info __initdata a910_i2c_board_info[] = {
1086 {
1087 I2C_BOARD_INFO("lp3944", 0x60),
1088 .platform_data = &a910_lp3944_leds,
1089 },
1090};
1091
867static struct platform_device *a910_devices[] __initdata = { 1092static struct platform_device *a910_devices[] __initdata = {
868 &a910_gpio_keys, 1093 &a910_gpio_keys,
869}; 1094};
@@ -874,12 +1099,22 @@ static void __init a910_init(void)
874 pxa2xx_mfp_config(ARRAY_AND_SIZE(gen2_pin_config)); 1099 pxa2xx_mfp_config(ARRAY_AND_SIZE(gen2_pin_config));
875 pxa2xx_mfp_config(ARRAY_AND_SIZE(a910_pin_config)); 1100 pxa2xx_mfp_config(ARRAY_AND_SIZE(a910_pin_config));
876 1101
1102 pxa_set_ffuart_info(NULL);
1103 pxa_set_btuart_info(NULL);
1104 pxa_set_stuart_info(NULL);
1105
877 pxa_set_i2c_info(NULL); 1106 pxa_set_i2c_info(NULL);
1107 i2c_register_board_info(0, ARRAY_AND_SIZE(a910_i2c_board_info));
878 1108
879 set_pxa_fb_info(&ezx_fb_info_2); 1109 set_pxa_fb_info(&ezx_fb_info_2);
880 1110
881 pxa_set_keypad_info(&a910_keypad_platform_data); 1111 pxa_set_keypad_info(&a910_keypad_platform_data);
882 1112
1113 if (a910_camera_init() == 0) {
1114 pxa_set_camera_info(&a910_pxacamera_platform_data);
1115 platform_device_register(&a910_camera);
1116 }
1117
883 platform_add_devices(ARRAY_AND_SIZE(ezx_devices)); 1118 platform_add_devices(ARRAY_AND_SIZE(ezx_devices));
884 platform_add_devices(ARRAY_AND_SIZE(a910_devices)); 1119 platform_add_devices(ARRAY_AND_SIZE(a910_devices));
885} 1120}
@@ -935,6 +1170,10 @@ static void __init e6_init(void)
935 pxa2xx_mfp_config(ARRAY_AND_SIZE(gen2_pin_config)); 1170 pxa2xx_mfp_config(ARRAY_AND_SIZE(gen2_pin_config));
936 pxa2xx_mfp_config(ARRAY_AND_SIZE(e6_pin_config)); 1171 pxa2xx_mfp_config(ARRAY_AND_SIZE(e6_pin_config));
937 1172
1173 pxa_set_ffuart_info(NULL);
1174 pxa_set_btuart_info(NULL);
1175 pxa_set_stuart_info(NULL);
1176
938 pxa_set_i2c_info(NULL); 1177 pxa_set_i2c_info(NULL);
939 i2c_register_board_info(0, ARRAY_AND_SIZE(e6_i2c_board_info)); 1178 i2c_register_board_info(0, ARRAY_AND_SIZE(e6_i2c_board_info));
940 1179
@@ -971,6 +1210,10 @@ static void __init e2_init(void)
971 pxa2xx_mfp_config(ARRAY_AND_SIZE(gen2_pin_config)); 1210 pxa2xx_mfp_config(ARRAY_AND_SIZE(gen2_pin_config));
972 pxa2xx_mfp_config(ARRAY_AND_SIZE(e2_pin_config)); 1211 pxa2xx_mfp_config(ARRAY_AND_SIZE(e2_pin_config));
973 1212
1213 pxa_set_ffuart_info(NULL);
1214 pxa_set_btuart_info(NULL);
1215 pxa_set_stuart_info(NULL);
1216
974 pxa_set_i2c_info(NULL); 1217 pxa_set_i2c_info(NULL);
975 i2c_register_board_info(0, ARRAY_AND_SIZE(e2_i2c_board_info)); 1218 i2c_register_board_info(0, ARRAY_AND_SIZE(e2_i2c_board_info));
976 1219
diff --git a/arch/arm/mach-pxa/generic.h b/arch/arm/mach-pxa/generic.h
index 485fede83d97..890fb90a672f 100644
--- a/arch/arm/mach-pxa/generic.h
+++ b/arch/arm/mach-pxa/generic.h
@@ -67,3 +67,8 @@ extern struct sysdev_class pxa_irq_sysclass;
67extern struct sysdev_class pxa_gpio_sysclass; 67extern struct sysdev_class pxa_gpio_sysclass;
68extern struct sysdev_class pxa2xx_mfp_sysclass; 68extern struct sysdev_class pxa2xx_mfp_sysclass;
69extern struct sysdev_class pxa3xx_mfp_sysclass; 69extern struct sysdev_class pxa3xx_mfp_sysclass;
70
71void __init pxa_set_ffuart_info(void *info);
72void __init pxa_set_btuart_info(void *info);
73void __init pxa_set_stuart_info(void *info);
74void __init pxa_set_hwuart_info(void *info);
diff --git a/arch/arm/mach-pxa/gumstix.c b/arch/arm/mach-pxa/gumstix.c
index ca9912ea78d9..96c345129135 100644
--- a/arch/arm/mach-pxa/gumstix.c
+++ b/arch/arm/mach-pxa/gumstix.c
@@ -88,7 +88,10 @@ static struct platform_device *devices[] __initdata = {
88 88
89#ifdef CONFIG_MMC_PXA 89#ifdef CONFIG_MMC_PXA
90static struct pxamci_platform_data gumstix_mci_platform_data = { 90static struct pxamci_platform_data gumstix_mci_platform_data = {
91 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, 91 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34,
92 .gpio_card_detect = -1,
93 .gpio_card_ro = -1,
94 .gpio_power = -1,
92}; 95};
93 96
94static void __init gumstix_mmc_init(void) 97static void __init gumstix_mmc_init(void)
@@ -208,6 +211,11 @@ static void __init gumstix_init(void)
208{ 211{
209 pxa2xx_mfp_config(ARRAY_AND_SIZE(gumstix_pin_config)); 212 pxa2xx_mfp_config(ARRAY_AND_SIZE(gumstix_pin_config));
210 213
214 pxa_set_ffuart_info(NULL);
215 pxa_set_btuart_info(NULL);
216 pxa_set_stuart_info(NULL);
217 pxa_set_hwuart_info(NULL);
218
211 gumstix_bluetooth_init(); 219 gumstix_bluetooth_init();
212 gumstix_udc_init(); 220 gumstix_udc_init();
213 gumstix_mmc_init(); 221 gumstix_mmc_init();
diff --git a/arch/arm/mach-pxa/h5000.c b/arch/arm/mach-pxa/h5000.c
index f3d220c32e07..c1cab0871c99 100644
--- a/arch/arm/mach-pxa/h5000.c
+++ b/arch/arm/mach-pxa/h5000.c
@@ -193,6 +193,9 @@ static void __init h5000_init(void)
193 fix_msc(); 193 fix_msc();
194 194
195 pxa2xx_mfp_config(ARRAY_AND_SIZE(h5000_pin_config)); 195 pxa2xx_mfp_config(ARRAY_AND_SIZE(h5000_pin_config));
196 pxa_set_ffuart_info(NULL);
197 pxa_set_btuart_info(NULL);
198 pxa_set_stuart_info(NULL);
196 pxa_set_udc_info(&h5000_udc_mach_info); 199 pxa_set_udc_info(&h5000_udc_mach_info);
197 platform_add_devices(ARRAY_AND_SIZE(devices)); 200 platform_add_devices(ARRAY_AND_SIZE(devices));
198} 201}
diff --git a/arch/arm/mach-pxa/himalaya.c b/arch/arm/mach-pxa/himalaya.c
index cea99fe65b97..f9a2e4b0f090 100644
--- a/arch/arm/mach-pxa/himalaya.c
+++ b/arch/arm/mach-pxa/himalaya.c
@@ -150,6 +150,9 @@ static void __init himalaya_lcd_init(void)
150 150
151static void __init himalaya_init(void) 151static void __init himalaya_init(void)
152{ 152{
153 pxa_set_ffuart_info(NULL);
154 pxa_set_btuart_info(NULL);
155 pxa_set_stuart_info(NULL);
153 himalaya_lcd_init(); 156 himalaya_lcd_init();
154 platform_add_devices(devices, ARRAY_SIZE(devices)); 157 platform_add_devices(devices, ARRAY_SIZE(devices));
155} 158}
diff --git a/arch/arm/mach-pxa/hx4700.c b/arch/arm/mach-pxa/hx4700.c
index 81359d574f88..848c861dd23f 100644
--- a/arch/arm/mach-pxa/hx4700.c
+++ b/arch/arm/mach-pxa/hx4700.c
@@ -45,6 +45,7 @@
45#include <mach/irda.h> 45#include <mach/irda.h>
46#include <mach/pxa2xx_spi.h> 46#include <mach/pxa2xx_spi.h>
47 47
48#include <video/platform_lcd.h>
48#include <video/w100fb.h> 49#include <video/w100fb.h>
49 50
50#include "devices.h" 51#include "devices.h"
@@ -174,14 +175,9 @@ static int hx4700_gpio_request(struct gpio_ress *gpios, int size)
174 * IRDA 175 * IRDA
175 */ 176 */
176 177
177static void irda_transceiver_mode(struct device *dev, int mode)
178{
179 gpio_set_value(GPIO105_HX4700_nIR_ON, mode & IR_OFF);
180}
181
182static struct pxaficp_platform_data ficp_info = { 178static struct pxaficp_platform_data ficp_info = {
183 .transceiver_cap = IR_SIRMODE | IR_OFF, 179 .gpio_pwdown = GPIO105_HX4700_nIR_ON,
184 .transceiver_mode = irda_transceiver_mode, 180 .transceiver_cap = IR_SIRMODE | IR_OFF,
185}; 181};
186 182
187/* 183/*
@@ -368,8 +364,6 @@ static struct platform_device egpio = {
368 * LCD - Sony display connected to ATI Imageon w3220 364 * LCD - Sony display connected to ATI Imageon w3220
369 */ 365 */
370 366
371static int lcd_power;
372
373static void sony_lcd_init(void) 367static void sony_lcd_init(void)
374{ 368{
375 gpio_set_value(GPIO84_HX4700_LCD_SQN, 1); 369 gpio_set_value(GPIO84_HX4700_LCD_SQN, 1);
@@ -410,35 +404,6 @@ static void sony_lcd_off(void)
410 gpio_set_value(GPIO110_HX4700_LCD_LVDD_3V3_ON, 0); 404 gpio_set_value(GPIO110_HX4700_LCD_LVDD_3V3_ON, 0);
411} 405}
412 406
413static int hx4700_lcd_set_power(struct lcd_device *ldev, int level)
414{
415 switch (level) {
416 case FB_BLANK_UNBLANK:
417 sony_lcd_init();
418 break;
419 case FB_BLANK_NORMAL:
420 case FB_BLANK_VSYNC_SUSPEND:
421 case FB_BLANK_HSYNC_SUSPEND:
422 case FB_BLANK_POWERDOWN:
423 sony_lcd_off();
424 break;
425 }
426 lcd_power = level;
427 return 0;
428}
429
430static int hx4700_lcd_get_power(struct lcd_device *lm)
431{
432 return lcd_power;
433}
434
435static struct lcd_ops hx4700_lcd_ops = {
436 .get_power = hx4700_lcd_get_power,
437 .set_power = hx4700_lcd_set_power,
438};
439
440static struct lcd_device *hx4700_lcd_device;
441
442#ifdef CONFIG_PM 407#ifdef CONFIG_PM
443static void w3220_lcd_suspend(struct w100fb_par *wfb) 408static void w3220_lcd_suspend(struct w100fb_par *wfb)
444{ 409{
@@ -573,6 +538,27 @@ static struct platform_device w3220 = {
573 .resource = w3220_resources, 538 .resource = w3220_resources,
574}; 539};
575 540
541static void hx4700_lcd_set_power(struct plat_lcd_data *pd, unsigned int power)
542{
543 if (power)
544 sony_lcd_init();
545 else
546 sony_lcd_off();
547}
548
549static struct plat_lcd_data hx4700_lcd_data = {
550 .set_power = hx4700_lcd_set_power,
551};
552
553static struct platform_device hx4700_lcd = {
554 .name = "platform-lcd",
555 .id = -1,
556 .dev = {
557 .platform_data = &hx4700_lcd_data,
558 .parent = &w3220.dev,
559 },
560};
561
576/* 562/*
577 * Backlight 563 * Backlight
578 */ 564 */
@@ -618,7 +604,7 @@ static struct platform_device gpio_vbus = {
618static const struct ads7846_platform_data tsc2046_info = { 604static const struct ads7846_platform_data tsc2046_info = {
619 .model = 7846, 605 .model = 7846,
620 .vref_delay_usecs = 100, 606 .vref_delay_usecs = 100,
621 .pressure_max = 512, 607 .pressure_max = 1024,
622 .debounce_max = 10, 608 .debounce_max = 10,
623 .debounce_tol = 3, 609 .debounce_tol = 3,
624 .debounce_rep = 1, 610 .debounce_rep = 1,
@@ -834,6 +820,7 @@ static struct platform_device *devices[] __initdata = {
834 &gpio_keys, 820 &gpio_keys,
835 &backlight, 821 &backlight,
836 &w3220, 822 &w3220,
823 &hx4700_lcd,
837 &egpio, 824 &egpio,
838 &bq24022, 825 &bq24022,
839 &gpio_vbus, 826 &gpio_vbus,
@@ -863,6 +850,10 @@ static void __init hx4700_init(void)
863 pxa2xx_mfp_config(ARRAY_AND_SIZE(hx4700_pin_config)); 850 pxa2xx_mfp_config(ARRAY_AND_SIZE(hx4700_pin_config));
864 hx4700_gpio_request(ARRAY_AND_SIZE(global_gpios)); 851 hx4700_gpio_request(ARRAY_AND_SIZE(global_gpios));
865 852
853 pxa_set_ffuart_info(NULL);
854 pxa_set_btuart_info(NULL);
855 pxa_set_stuart_info(NULL);
856
866 platform_add_devices(devices, ARRAY_SIZE(devices)); 857 platform_add_devices(devices, ARRAY_SIZE(devices));
867 858
868 pxa_set_ficp_info(&ficp_info); 859 pxa_set_ficp_info(&ficp_info);
@@ -872,9 +863,6 @@ static void __init hx4700_init(void)
872 pxa2xx_set_spi_info(2, &pxa_ssp2_master_info); 863 pxa2xx_set_spi_info(2, &pxa_ssp2_master_info);
873 spi_register_board_info(ARRAY_AND_SIZE(tsc2046_board_info)); 864 spi_register_board_info(ARRAY_AND_SIZE(tsc2046_board_info));
874 865
875 hx4700_lcd_device = lcd_device_register("w100fb", NULL,
876 (void *)&w3220_info, &hx4700_lcd_ops);
877
878 gpio_set_value(GPIO71_HX4700_ASIC3_nRESET, 0); 866 gpio_set_value(GPIO71_HX4700_ASIC3_nRESET, 0);
879 mdelay(10); 867 mdelay(10);
880 gpio_set_value(GPIO71_HX4700_ASIC3_nRESET, 1); 868 gpio_set_value(GPIO71_HX4700_ASIC3_nRESET, 1);
diff --git a/arch/arm/mach-pxa/idp.c b/arch/arm/mach-pxa/idp.c
index b6243b59d9be..5c9e11d74f49 100644
--- a/arch/arm/mach-pxa/idp.c
+++ b/arch/arm/mach-pxa/idp.c
@@ -168,7 +168,10 @@ static struct pxafb_mach_info sharp_lm8v31 = {
168}; 168};
169 169
170static struct pxamci_platform_data idp_mci_platform_data = { 170static struct pxamci_platform_data idp_mci_platform_data = {
171 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, 171 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34,
172 .gpio_card_detect = -1,
173 .gpio_card_ro = -1,
174 .gpio_power = -1,
172}; 175};
173 176
174static void __init idp_init(void) 177static void __init idp_init(void)
@@ -176,6 +179,9 @@ static void __init idp_init(void)
176 printk("idp_init()\n"); 179 printk("idp_init()\n");
177 180
178 pxa2xx_mfp_config(ARRAY_AND_SIZE(idp_pin_config)); 181 pxa2xx_mfp_config(ARRAY_AND_SIZE(idp_pin_config));
182 pxa_set_ffuart_info(NULL);
183 pxa_set_btuart_info(NULL);
184 pxa_set_stuart_info(NULL);
179 185
180 platform_device_register(&smc91x_device); 186 platform_device_register(&smc91x_device);
181 //platform_device_register(&mst_audio_device); 187 //platform_device_register(&mst_audio_device);
diff --git a/arch/arm/mach-pxa/imote2.c b/arch/arm/mach-pxa/imote2.c
index 961807dc6467..5b0862df61ab 100644
--- a/arch/arm/mach-pxa/imote2.c
+++ b/arch/arm/mach-pxa/imote2.c
@@ -389,6 +389,9 @@ static int imote2_mci_get_ro(struct device *dev)
389static struct pxamci_platform_data imote2_mci_platform_data = { 389static struct pxamci_platform_data imote2_mci_platform_data = {
390 .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, /* default anyway */ 390 .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, /* default anyway */
391 .get_ro = imote2_mci_get_ro, 391 .get_ro = imote2_mci_get_ro,
392 .gpio_card_detect = -1,
393 .gpio_card_ro = -1,
394 .gpio_power = -1,
392}; 395};
393 396
394static struct mtd_partition imote2flash_partitions[] = { 397static struct mtd_partition imote2flash_partitions[] = {
@@ -551,8 +554,12 @@ static struct i2c_pxa_platform_data i2c_pdata = {
551 554
552static void __init imote2_init(void) 555static void __init imote2_init(void)
553{ 556{
554
555 pxa2xx_mfp_config(ARRAY_AND_SIZE(imote2_pin_config)); 557 pxa2xx_mfp_config(ARRAY_AND_SIZE(imote2_pin_config));
558
559 pxa_set_ffuart_info(NULL);
560 pxa_set_btuart_info(NULL);
561 pxa_set_stuart_info(NULL);
562
556 /* SPI chip select directions - all other directions should 563 /* SPI chip select directions - all other directions should
557 * be handled by drivers.*/ 564 * be handled by drivers.*/
558 gpio_direction_output(37, 0); 565 gpio_direction_output(37, 0);
diff --git a/arch/arm/mach-pxa/include/mach/audio.h b/arch/arm/mach-pxa/include/mach/audio.h
index 16eb02552d5d..a3449e35a6f5 100644
--- a/arch/arm/mach-pxa/include/mach/audio.h
+++ b/arch/arm/mach-pxa/include/mach/audio.h
@@ -3,10 +3,12 @@
3 3
4#include <sound/core.h> 4#include <sound/core.h>
5#include <sound/pcm.h> 5#include <sound/pcm.h>
6#include <sound/ac97_codec.h>
6 7
7/* 8/*
8 * @reset_gpio: AC97 reset gpio (normally gpio113 or gpio95) 9 * @reset_gpio: AC97 reset gpio (normally gpio113 or gpio95)
9 * a -1 value means no gpio will be used for reset 10 * a -1 value means no gpio will be used for reset
11 * @codec_pdata: AC97 codec platform_data
10 12
11 * reset_gpio should only be specified for pxa27x CPUs where a silicon 13 * reset_gpio should only be specified for pxa27x CPUs where a silicon
12 * bug prevents correct operation of the reset line. If not specified, 14 * bug prevents correct operation of the reset line. If not specified,
@@ -20,6 +22,7 @@ typedef struct {
20 void (*resume)(void *); 22 void (*resume)(void *);
21 void *priv; 23 void *priv;
22 int reset_gpio; 24 int reset_gpio;
25 void *codec_pdata[AC97_BUS_MAX_DEVICES];
23} pxa2xx_audio_ops_t; 26} pxa2xx_audio_ops_t;
24 27
25extern void pxa_set_ac97_info(pxa2xx_audio_ops_t *ops); 28extern void pxa_set_ac97_info(pxa2xx_audio_ops_t *ops);
diff --git a/arch/arm/mach-pxa/include/mach/balloon3.h b/arch/arm/mach-pxa/include/mach/balloon3.h
new file mode 100644
index 000000000000..bfec09b1814b
--- /dev/null
+++ b/arch/arm/mach-pxa/include/mach/balloon3.h
@@ -0,0 +1,134 @@
1/*
2 * linux/include/asm-arm/arch-pxa/balloon3.h
3 *
4 * Authors: Nick Bane and Wookey
5 * Created: Oct, 2005
6 * Copyright: Toby Churchill Ltd
7 * Cribbed from mainstone.c, by Nicholas Pitre
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
12 */
13
14#ifndef ASM_ARCH_BALLOON3_H
15#define ASM_ARCH_BALLOON3_H
16
17enum balloon3_features {
18 BALLOON3_FEATURE_OHCI,
19 BALLOON3_FEATURE_MMC,
20 BALLOON3_FEATURE_CF,
21 BALLOON3_FEATURE_AUDIO,
22 BALLOON3_FEATURE_TOPPOLY,
23};
24
25#define BALLOON3_FPGA_PHYS PXA_CS4_PHYS
26#define BALLOON3_FPGA_VIRT (0xf1000000) /* as per balloon2 */
27#define BALLOON3_FPGA_LENGTH 0x01000000
28
29/* FPGA/CPLD registers */
30#define BALLOON3_PCMCIA0_REG (BALLOON3_FPGA_VIRT + 0x00e00008)
31/* fixme - same for now */
32#define BALLOON3_PCMCIA1_REG (BALLOON3_FPGA_VIRT + 0x00e00008)
33#define BALLOON3_NANDIO_IO_REG (BALLOON3_FPGA_VIRT + 0x00e00000)
34/* fpga/cpld interrupt control register */
35#define BALLOON3_INT_CONTROL_REG (BALLOON3_FPGA_VIRT + 0x00e0000C)
36#define BALLOON3_NANDIO_CTL2_REG (BALLOON3_FPGA_VIRT + 0x00e00010)
37#define BALLOON3_NANDIO_CTL_REG (BALLOON3_FPGA_VIRT + 0x00e00014)
38#define BALLOON3_VERSION_REG (BALLOON3_FPGA_VIRT + 0x00e0001c)
39
40#define BALLOON3_SAMOSA_ADDR_REG (BALLOON3_FPGA_VIRT + 0x00c00000)
41#define BALLOON3_SAMOSA_DATA_REG (BALLOON3_FPGA_VIRT + 0x00c00004)
42#define BALLOON3_SAMOSA_STATUS_REG (BALLOON3_FPGA_VIRT + 0x00c0001c)
43
44/* GPIOs for irqs */
45#define BALLOON3_GPIO_AUX_NIRQ (94)
46#define BALLOON3_GPIO_CODEC_IRQ (95)
47
48/* Timer and Idle LED locations */
49#define BALLOON3_GPIO_LED_NAND (9)
50#define BALLOON3_GPIO_LED_IDLE (10)
51
52/* backlight control */
53#define BALLOON3_GPIO_RUN_BACKLIGHT (99)
54
55#define BALLOON3_GPIO_S0_CD (105)
56
57/* FPGA Interrupt Mask/Acknowledge Register */
58#define BALLOON3_INT_S0_IRQ (1 << 0) /* PCMCIA 0 IRQ */
59#define BALLOON3_INT_S0_STSCHG (1 << 1) /* PCMCIA 0 status changed */
60
61/* CF Status Register */
62#define BALLOON3_PCMCIA_nIRQ (1 << 0) /* IRQ / ready signal */
63#define BALLOON3_PCMCIA_nSTSCHG_BVD1 (1 << 1)
64 /* VDD sense / card status changed */
65
66/* CF control register (write) */
67#define BALLOON3_PCMCIA_RESET (1 << 0) /* Card reset signal */
68#define BALLOON3_PCMCIA_ENABLE (1 << 1)
69#define BALLOON3_PCMCIA_ADD_ENABLE (1 << 2)
70
71/* CPLD (and FPGA) interface definitions */
72#define CPLD_LCD0_DATA_SET 0x00
73#define CPLD_LCD0_DATA_CLR 0x10
74#define CPLD_LCD0_COMMAND_SET 0x01
75#define CPLD_LCD0_COMMAND_CLR 0x11
76#define CPLD_LCD1_DATA_SET 0x02
77#define CPLD_LCD1_DATA_CLR 0x12
78#define CPLD_LCD1_COMMAND_SET 0x03
79#define CPLD_LCD1_COMMAND_CLR 0x13
80
81#define CPLD_MISC_SET 0x07
82#define CPLD_MISC_CLR 0x17
83#define CPLD_MISC_LOON_NRESET_BIT 0
84#define CPLD_MISC_LOON_UNSUSP_BIT 1
85#define CPLD_MISC_RUN_5V_BIT 2
86#define CPLD_MISC_CHG_D0_BIT 3
87#define CPLD_MISC_CHG_D1_BIT 4
88#define CPLD_MISC_DAC_NCS_BIT 5
89
90#define CPLD_LCD_SET 0x08
91#define CPLD_LCD_CLR 0x18
92#define CPLD_LCD_BACKLIGHT_EN_0_BIT 0
93#define CPLD_LCD_BACKLIGHT_EN_1_BIT 1
94#define CPLD_LCD_LED_RED_BIT 4
95#define CPLD_LCD_LED_GREEN_BIT 5
96#define CPLD_LCD_NRESET_BIT 7
97
98#define CPLD_LCD_RO_SET 0x09
99#define CPLD_LCD_RO_CLR 0x19
100#define CPLD_LCD_RO_LCD0_nWAIT_BIT 0
101#define CPLD_LCD_RO_LCD1_nWAIT_BIT 1
102
103#define CPLD_SERIAL_SET 0x0a
104#define CPLD_SERIAL_CLR 0x1a
105#define CPLD_SERIAL_GSM_RI_BIT 0
106#define CPLD_SERIAL_GSM_CTS_BIT 1
107#define CPLD_SERIAL_GSM_DTR_BIT 2
108#define CPLD_SERIAL_LPR_CTS_BIT 3
109#define CPLD_SERIAL_TC232_CTS_BIT 4
110#define CPLD_SERIAL_TC232_DSR_BIT 5
111
112#define CPLD_SROUTING_SET 0x0b
113#define CPLD_SROUTING_CLR 0x1b
114#define CPLD_SROUTING_MSP430_LPR 0
115#define CPLD_SROUTING_MSP430_TC232 1
116#define CPLD_SROUTING_MSP430_GSM 2
117#define CPLD_SROUTING_LOON_LPR (0 << 4)
118#define CPLD_SROUTING_LOON_TC232 (1 << 4)
119#define CPLD_SROUTING_LOON_GSM (2 << 4)
120
121#define CPLD_AROUTING_SET 0x0c
122#define CPLD_AROUTING_CLR 0x1c
123#define CPLD_AROUTING_MIC2PHONE_BIT 0
124#define CPLD_AROUTING_PHONE2INT_BIT 1
125#define CPLD_AROUTING_PHONE2EXT_BIT 2
126#define CPLD_AROUTING_LOONL2INT_BIT 3
127#define CPLD_AROUTING_LOONL2EXT_BIT 4
128#define CPLD_AROUTING_LOONR2PHONE_BIT 5
129#define CPLD_AROUTING_LOONR2INT_BIT 6
130#define CPLD_AROUTING_LOONR2EXT_BIT 7
131
132extern int balloon3_has(enum balloon3_features feature);
133
134#endif
diff --git a/arch/arm/mach-pxa/include/mach/colibri.h b/arch/arm/mach-pxa/include/mach/colibri.h
index a88d7caff0d1..811743c56147 100644
--- a/arch/arm/mach-pxa/include/mach/colibri.h
+++ b/arch/arm/mach-pxa/include/mach/colibri.h
@@ -23,6 +23,12 @@ static inline void colibri_pxa3xx_init_lcd(int bl_pin) {}
23extern void colibri_pxa3xx_init_eth(struct ax_plat_data *plat_data); 23extern void colibri_pxa3xx_init_eth(struct ax_plat_data *plat_data);
24#endif 24#endif
25 25
26#if defined(CONFIG_MTD_NAND_PXA3xx) || defined(CONFIG_MTD_NAND_PXA3xx_MODULE)
27extern void colibri_pxa3xx_init_nand(void);
28#else
29static inline void colibri_pxa3xx_init_nand(void) {}
30#endif
31
26/* physical memory regions */ 32/* physical memory regions */
27#define COLIBRI_SDRAM_BASE 0xa0000000 /* SDRAM region */ 33#define COLIBRI_SDRAM_BASE 0xa0000000 /* SDRAM region */
28 34
diff --git a/arch/arm/mach-pxa/include/mach/entry-macro.S b/arch/arm/mach-pxa/include/mach/entry-macro.S
index f6b4bf3e73d2..a73bc86a3c26 100644
--- a/arch/arm/mach-pxa/include/mach/entry-macro.S
+++ b/arch/arm/mach-pxa/include/mach/entry-macro.S
@@ -24,34 +24,28 @@
24 mov \tmp, \tmp, lsr #13 24 mov \tmp, \tmp, lsr #13
25 and \tmp, \tmp, #0x7 @ Core G 25 and \tmp, \tmp, #0x7 @ Core G
26 cmp \tmp, #1 26 cmp \tmp, #1
27 bhi 1004f 27 bhi 1002f
28 28
29 @ Core Generation 1 (PXA25x)
29 mov \base, #io_p2v(0x40000000) @ IIR Ctl = 0x40d00000 30 mov \base, #io_p2v(0x40000000) @ IIR Ctl = 0x40d00000
30 add \base, \base, #0x00d00000 31 add \base, \base, #0x00d00000
31 ldr \irqstat, [\base, #0] @ ICIP 32 ldr \irqstat, [\base, #0] @ ICIP
32 ldr \irqnr, [\base, #4] @ ICMR 33 ldr \irqnr, [\base, #4] @ ICMR
33 b 1002f
34 34
351004:
36 mrc p6, 0, \irqstat, c6, c0, 0 @ ICIP2
37 mrc p6, 0, \irqnr, c7, c0, 0 @ ICMR2
38 ands \irqnr, \irqstat, \irqnr 35 ands \irqnr, \irqstat, \irqnr
39 beq 1003f 36 beq 1001f
40 rsb \irqstat, \irqnr, #0 37 rsb \irqstat, \irqnr, #0
41 and \irqstat, \irqstat, \irqnr 38 and \irqstat, \irqstat, \irqnr
42 clz \irqnr, \irqstat 39 clz \irqnr, \irqstat
43 rsb \irqnr, \irqnr, #31 40 rsb \irqnr, \irqnr, #(31 + PXA_IRQ(0))
44 add \irqnr, \irqnr, #(32 + PXA_IRQ(0))
45 b 1001f 41 b 1001f
461003:
47 mrc p6, 0, \irqstat, c0, c0, 0 @ ICIP
48 mrc p6, 0, \irqnr, c1, c0, 0 @ ICMR
491002: 421002:
50 ands \irqnr, \irqstat, \irqnr 43 @ Core Generation 2 (PXA27x) or Core Generation 3 (PXA3xx)
44 mrc p6, 0, \irqstat, c5, c0, 0 @ ICHP
45 tst \irqstat, #0x80000000
51 beq 1001f 46 beq 1001f
52 rsb \irqstat, \irqnr, #0 47 bic \irqstat, \irqstat, #0x80000000
53 and \irqstat, \irqstat, \irqnr 48 mov \irqnr, \irqstat, lsr #16
54 clz \irqnr, \irqstat 49 add \irqnr, \irqnr, #(PXA_IRQ(0))
55 rsb \irqnr, \irqnr, #(31 + PXA_IRQ(0))
561001: 501001:
57 .endm 51 .endm
diff --git a/arch/arm/mach-pxa/include/mach/hardware.h b/arch/arm/mach-pxa/include/mach/hardware.h
index 16ab79547dae..50f1297bf5ac 100644
--- a/arch/arm/mach-pxa/include/mach/hardware.h
+++ b/arch/arm/mach-pxa/include/mach/hardware.h
@@ -105,6 +105,7 @@
105 * 105 *
106 * PXA935 A0 0x56056931 0x1E653013 106 * PXA935 A0 0x56056931 0x1E653013
107 * PXA935 B0 0x56056936 0x6E653013 107 * PXA935 B0 0x56056936 0x6E653013
108 * PXA935 B1 0x56056938 0x8E653013
108 */ 109 */
109#ifdef CONFIG_PXA25x 110#ifdef CONFIG_PXA25x
110#define __cpu_is_pxa210(id) \ 111#define __cpu_is_pxa210(id) \
@@ -197,6 +198,16 @@
197#define __cpu_is_pxa935(id) (0) 198#define __cpu_is_pxa935(id) (0)
198#endif 199#endif
199 200
201#ifdef CONFIG_CPU_PXA950
202#define __cpu_is_pxa950(id) \
203 ({ \
204 unsigned int _id = (id) >> 4 & 0xfff; \
205 id == 0x697; \
206 })
207#else
208#define __cpu_is_pxa950(id) (0)
209#endif
210
200#define cpu_is_pxa210() \ 211#define cpu_is_pxa210() \
201 ({ \ 212 ({ \
202 __cpu_is_pxa210(read_cpuid_id()); \ 213 __cpu_is_pxa210(read_cpuid_id()); \
@@ -249,6 +260,13 @@
249 __cpu_is_pxa935(id); \ 260 __cpu_is_pxa935(id); \
250 }) 261 })
251 262
263#define cpu_is_pxa950() \
264 ({ \
265 unsigned int id = read_cpuid(CPUID_ID); \
266 __cpu_is_pxa950(id); \
267 })
268
269
252/* 270/*
253 * CPUID Core Generation Bit 271 * CPUID Core Generation Bit
254 * <= 0x2 for pxa21x/pxa25x/pxa26x/pxa27x 272 * <= 0x2 for pxa21x/pxa25x/pxa26x/pxa27x
@@ -266,7 +284,7 @@
266 _id == 0x3; \ 284 _id == 0x3; \
267 }) 285 })
268 286
269#define __cpu_is_pxa9xx(id) \ 287#define __cpu_is_pxa93x(id) \
270 ({ \ 288 ({ \
271 unsigned int _id = (id) >> 4 & 0xfff; \ 289 unsigned int _id = (id) >> 4 & 0xfff; \
272 _id == 0x683 || _id == 0x693; \ 290 _id == 0x683 || _id == 0x693; \
@@ -282,9 +300,9 @@
282 __cpu_is_pxa3xx(read_cpuid_id()); \ 300 __cpu_is_pxa3xx(read_cpuid_id()); \
283 }) 301 })
284 302
285#define cpu_is_pxa9xx() \ 303#define cpu_is_pxa93x() \
286 ({ \ 304 ({ \
287 __cpu_is_pxa9xx(read_cpuid_id()); \ 305 __cpu_is_pxa93x(read_cpuid_id()); \
288 }) 306 })
289/* 307/*
290 * return current memory and LCD clock frequency in units of 10kHz 308 * return current memory and LCD clock frequency in units of 10kHz
diff --git a/arch/arm/mach-pxa/include/mach/irda.h b/arch/arm/mach-pxa/include/mach/irda.h
index 0a50c3c763df..3cd41f77dda4 100644
--- a/arch/arm/mach-pxa/include/mach/irda.h
+++ b/arch/arm/mach-pxa/include/mach/irda.h
@@ -12,6 +12,8 @@ struct pxaficp_platform_data {
12 void (*transceiver_mode)(struct device *dev, int mode); 12 void (*transceiver_mode)(struct device *dev, int mode);
13 int (*startup)(struct device *dev); 13 int (*startup)(struct device *dev);
14 void (*shutdown)(struct device *dev); 14 void (*shutdown)(struct device *dev);
15 int gpio_pwdown; /* powerdown GPIO for the IrDA chip */
16 bool gpio_pwdown_inverted; /* gpio_pwdown is inverted */
15}; 17};
16 18
17extern void pxa_set_ficp_info(struct pxaficp_platform_data *info); 19extern void pxa_set_ficp_info(struct pxaficp_platform_data *info);
diff --git a/arch/arm/mach-pxa/include/mach/irqs.h b/arch/arm/mach-pxa/include/mach/irqs.h
index 6a1d95993342..3677a9af9c87 100644
--- a/arch/arm/mach-pxa/include/mach/irqs.h
+++ b/arch/arm/mach-pxa/include/mach/irqs.h
@@ -68,9 +68,10 @@
68#ifdef CONFIG_PXA3xx 68#ifdef CONFIG_PXA3xx
69#define IRQ_SSP4 PXA_IRQ(13) /* SSP4 service request */ 69#define IRQ_SSP4 PXA_IRQ(13) /* SSP4 service request */
70#define IRQ_CIR PXA_IRQ(34) /* Consumer IR */ 70#define IRQ_CIR PXA_IRQ(34) /* Consumer IR */
71#define IRQ_COMM_WDT PXA_IRQ(35) /* Comm WDT interrupt */
71#define IRQ_TSI PXA_IRQ(36) /* Touch Screen Interface (PXA320) */ 72#define IRQ_TSI PXA_IRQ(36) /* Touch Screen Interface (PXA320) */
72#define IRQ_USIM2 PXA_IRQ(38) /* USIM2 Controller */ 73#define IRQ_USIM2 PXA_IRQ(38) /* USIM2 Controller */
73#define IRQ_GRPHICS PXA_IRQ(39) /* Graphics Controller */ 74#define IRQ_GCU PXA_IRQ(39) /* Graphics Controller */
74#define IRQ_MMC2 PXA_IRQ(41) /* MMC2 Controller */ 75#define IRQ_MMC2 PXA_IRQ(41) /* MMC2 Controller */
75#define IRQ_1WIRE PXA_IRQ(44) /* 1-Wire Controller */ 76#define IRQ_1WIRE PXA_IRQ(44) /* 1-Wire Controller */
76#define IRQ_NAND PXA_IRQ(45) /* NAND Controller */ 77#define IRQ_NAND PXA_IRQ(45) /* NAND Controller */
@@ -81,8 +82,31 @@
81#define IRQ_MMC3 PXA_IRQ(55) /* MMC3 Controller (PXA310) */ 82#define IRQ_MMC3 PXA_IRQ(55) /* MMC3 Controller (PXA310) */
82#endif 83#endif
83 84
84#define PXA_GPIO_IRQ_BASE PXA_IRQ(64) 85#ifdef CONFIG_CPU_PXA935
85#define PXA_GPIO_IRQ_NUM (128) 86#define IRQ_U2O PXA_IRQ(64) /* USB OTG 2.0 Controller (PXA935) */
87#define IRQ_U2H PXA_IRQ(65) /* USB Host 2.0 Controller (PXA935) */
88
89#define IRQ_MMC3_PXA935 PXA_IRQ(72) /* MMC3 Controller (PXA935) */
90#define IRQ_MMC4_PXA935 PXA_IRQ(73) /* MMC4 Controller (PXA935) */
91#define IRQ_MMC5_PXA935 PXA_IRQ(74) /* MMC5 Controller (PXA935) */
92
93#define IRQ_U2P PXA_IRQ(93) /* USB PHY D+/D- Lines (PXA935) */
94#endif
95
96#ifdef CONFIG_CPU_PXA930
97#define IRQ_ENHROT PXA_IRQ(37) /* Enhanced Rotary (PXA930) */
98#define IRQ_ACIPC0 PXA_IRQ(5)
99#define IRQ_ACIPC1 PXA_IRQ(40)
100#define IRQ_ACIPC2 PXA_IRQ(19)
101#define IRQ_TRKBALL PXA_IRQ(43) /* Track Ball */
102#endif
103
104#ifdef CONFIG_CPU_PXA950
105#define IRQ_GC500 PXA_IRQ(70) /* Graphics Controller (PXA950) */
106#endif
107
108#define PXA_GPIO_IRQ_BASE PXA_IRQ(96)
109#define PXA_GPIO_IRQ_NUM (192)
86 110
87#define GPIO_2_x_TO_IRQ(x) (PXA_GPIO_IRQ_BASE + (x)) 111#define GPIO_2_x_TO_IRQ(x) (PXA_GPIO_IRQ_BASE + (x))
88#define IRQ_GPIO(x) (((x) < 2) ? (IRQ_GPIO0 + (x)) : GPIO_2_x_TO_IRQ(x)) 112#define IRQ_GPIO(x) (((x) < 2) ? (IRQ_GPIO0 + (x)) : GPIO_2_x_TO_IRQ(x))
@@ -105,6 +129,8 @@
105#define IRQ_BOARD_END (IRQ_BOARD_START + 70) 129#define IRQ_BOARD_END (IRQ_BOARD_START + 70)
106#elif defined(CONFIG_MACH_ZYLONITE) 130#elif defined(CONFIG_MACH_ZYLONITE)
107#define IRQ_BOARD_END (IRQ_BOARD_START + 32) 131#define IRQ_BOARD_END (IRQ_BOARD_START + 32)
132#elif defined(CONFIG_PXA_EZX)
133#define IRQ_BOARD_END (IRQ_BOARD_START + 23)
108#else 134#else
109#define IRQ_BOARD_END (IRQ_BOARD_START + 16) 135#define IRQ_BOARD_END (IRQ_BOARD_START + 16)
110#endif 136#endif
@@ -237,6 +263,16 @@
237#define MAINSTONE_S1_STSCHG_IRQ MAINSTONE_IRQ(14) 263#define MAINSTONE_S1_STSCHG_IRQ MAINSTONE_IRQ(14)
238#define MAINSTONE_S1_IRQ MAINSTONE_IRQ(15) 264#define MAINSTONE_S1_IRQ MAINSTONE_IRQ(15)
239 265
266/* Balloon3 Interrupts */
267#define BALLOON3_IRQ(x) (IRQ_BOARD_START + (x))
268
269#define BALLOON3_BP_CF_NRDY_IRQ BALLOON3_IRQ(0)
270#define BALLOON3_BP_NSTSCHG_IRQ BALLOON3_IRQ(1)
271
272#define BALLOON3_AUX_NIRQ IRQ_GPIO(BALLOON3_GPIO_AUX_NIRQ)
273#define BALLOON3_CODEC_IRQ IRQ_GPIO(BALLOON3_GPIO_CODEC_IRQ)
274#define BALLOON3_S0_CD_IRQ IRQ_GPIO(BALLOON3_GPIO_S0_CD)
275
240/* LoCoMo Interrupts (CONFIG_SHARP_LOCOMO) */ 276/* LoCoMo Interrupts (CONFIG_SHARP_LOCOMO) */
241#define IRQ_LOCOMO_KEY_BASE (IRQ_BOARD_START + 0) 277#define IRQ_LOCOMO_KEY_BASE (IRQ_BOARD_START + 0)
242#define IRQ_LOCOMO_GPIO_BASE (IRQ_BOARD_START + 1) 278#define IRQ_LOCOMO_GPIO_BASE (IRQ_BOARD_START + 1)
diff --git a/arch/arm/mach-pxa/include/mach/mfp.h b/arch/arm/mach-pxa/include/mach/mfp.h
index 482185053a92..271e249ae34f 100644
--- a/arch/arm/mach-pxa/include/mach/mfp.h
+++ b/arch/arm/mach-pxa/include/mach/mfp.h
@@ -16,305 +16,6 @@
16#ifndef __ASM_ARCH_MFP_H 16#ifndef __ASM_ARCH_MFP_H
17#define __ASM_ARCH_MFP_H 17#define __ASM_ARCH_MFP_H
18 18
19#define mfp_to_gpio(m) ((m) % 128) 19#include <plat/mfp.h>
20
21/* list of all the configurable MFP pins */
22enum {
23 MFP_PIN_INVALID = -1,
24
25 MFP_PIN_GPIO0 = 0,
26 MFP_PIN_GPIO1,
27 MFP_PIN_GPIO2,
28 MFP_PIN_GPIO3,
29 MFP_PIN_GPIO4,
30 MFP_PIN_GPIO5,
31 MFP_PIN_GPIO6,
32 MFP_PIN_GPIO7,
33 MFP_PIN_GPIO8,
34 MFP_PIN_GPIO9,
35 MFP_PIN_GPIO10,
36 MFP_PIN_GPIO11,
37 MFP_PIN_GPIO12,
38 MFP_PIN_GPIO13,
39 MFP_PIN_GPIO14,
40 MFP_PIN_GPIO15,
41 MFP_PIN_GPIO16,
42 MFP_PIN_GPIO17,
43 MFP_PIN_GPIO18,
44 MFP_PIN_GPIO19,
45 MFP_PIN_GPIO20,
46 MFP_PIN_GPIO21,
47 MFP_PIN_GPIO22,
48 MFP_PIN_GPIO23,
49 MFP_PIN_GPIO24,
50 MFP_PIN_GPIO25,
51 MFP_PIN_GPIO26,
52 MFP_PIN_GPIO27,
53 MFP_PIN_GPIO28,
54 MFP_PIN_GPIO29,
55 MFP_PIN_GPIO30,
56 MFP_PIN_GPIO31,
57 MFP_PIN_GPIO32,
58 MFP_PIN_GPIO33,
59 MFP_PIN_GPIO34,
60 MFP_PIN_GPIO35,
61 MFP_PIN_GPIO36,
62 MFP_PIN_GPIO37,
63 MFP_PIN_GPIO38,
64 MFP_PIN_GPIO39,
65 MFP_PIN_GPIO40,
66 MFP_PIN_GPIO41,
67 MFP_PIN_GPIO42,
68 MFP_PIN_GPIO43,
69 MFP_PIN_GPIO44,
70 MFP_PIN_GPIO45,
71 MFP_PIN_GPIO46,
72 MFP_PIN_GPIO47,
73 MFP_PIN_GPIO48,
74 MFP_PIN_GPIO49,
75 MFP_PIN_GPIO50,
76 MFP_PIN_GPIO51,
77 MFP_PIN_GPIO52,
78 MFP_PIN_GPIO53,
79 MFP_PIN_GPIO54,
80 MFP_PIN_GPIO55,
81 MFP_PIN_GPIO56,
82 MFP_PIN_GPIO57,
83 MFP_PIN_GPIO58,
84 MFP_PIN_GPIO59,
85 MFP_PIN_GPIO60,
86 MFP_PIN_GPIO61,
87 MFP_PIN_GPIO62,
88 MFP_PIN_GPIO63,
89 MFP_PIN_GPIO64,
90 MFP_PIN_GPIO65,
91 MFP_PIN_GPIO66,
92 MFP_PIN_GPIO67,
93 MFP_PIN_GPIO68,
94 MFP_PIN_GPIO69,
95 MFP_PIN_GPIO70,
96 MFP_PIN_GPIO71,
97 MFP_PIN_GPIO72,
98 MFP_PIN_GPIO73,
99 MFP_PIN_GPIO74,
100 MFP_PIN_GPIO75,
101 MFP_PIN_GPIO76,
102 MFP_PIN_GPIO77,
103 MFP_PIN_GPIO78,
104 MFP_PIN_GPIO79,
105 MFP_PIN_GPIO80,
106 MFP_PIN_GPIO81,
107 MFP_PIN_GPIO82,
108 MFP_PIN_GPIO83,
109 MFP_PIN_GPIO84,
110 MFP_PIN_GPIO85,
111 MFP_PIN_GPIO86,
112 MFP_PIN_GPIO87,
113 MFP_PIN_GPIO88,
114 MFP_PIN_GPIO89,
115 MFP_PIN_GPIO90,
116 MFP_PIN_GPIO91,
117 MFP_PIN_GPIO92,
118 MFP_PIN_GPIO93,
119 MFP_PIN_GPIO94,
120 MFP_PIN_GPIO95,
121 MFP_PIN_GPIO96,
122 MFP_PIN_GPIO97,
123 MFP_PIN_GPIO98,
124 MFP_PIN_GPIO99,
125 MFP_PIN_GPIO100,
126 MFP_PIN_GPIO101,
127 MFP_PIN_GPIO102,
128 MFP_PIN_GPIO103,
129 MFP_PIN_GPIO104,
130 MFP_PIN_GPIO105,
131 MFP_PIN_GPIO106,
132 MFP_PIN_GPIO107,
133 MFP_PIN_GPIO108,
134 MFP_PIN_GPIO109,
135 MFP_PIN_GPIO110,
136 MFP_PIN_GPIO111,
137 MFP_PIN_GPIO112,
138 MFP_PIN_GPIO113,
139 MFP_PIN_GPIO114,
140 MFP_PIN_GPIO115,
141 MFP_PIN_GPIO116,
142 MFP_PIN_GPIO117,
143 MFP_PIN_GPIO118,
144 MFP_PIN_GPIO119,
145 MFP_PIN_GPIO120,
146 MFP_PIN_GPIO121,
147 MFP_PIN_GPIO122,
148 MFP_PIN_GPIO123,
149 MFP_PIN_GPIO124,
150 MFP_PIN_GPIO125,
151 MFP_PIN_GPIO126,
152 MFP_PIN_GPIO127,
153 MFP_PIN_GPIO0_2,
154 MFP_PIN_GPIO1_2,
155 MFP_PIN_GPIO2_2,
156 MFP_PIN_GPIO3_2,
157 MFP_PIN_GPIO4_2,
158 MFP_PIN_GPIO5_2,
159 MFP_PIN_GPIO6_2,
160 MFP_PIN_GPIO7_2,
161 MFP_PIN_GPIO8_2,
162 MFP_PIN_GPIO9_2,
163 MFP_PIN_GPIO10_2,
164 MFP_PIN_GPIO11_2,
165 MFP_PIN_GPIO12_2,
166 MFP_PIN_GPIO13_2,
167 MFP_PIN_GPIO14_2,
168 MFP_PIN_GPIO15_2,
169 MFP_PIN_GPIO16_2,
170 MFP_PIN_GPIO17_2,
171
172 MFP_PIN_ULPI_STP,
173 MFP_PIN_ULPI_NXT,
174 MFP_PIN_ULPI_DIR,
175
176 MFP_PIN_nXCVREN,
177 MFP_PIN_DF_CLE_nOE,
178 MFP_PIN_DF_nADV1_ALE,
179 MFP_PIN_DF_SCLK_E,
180 MFP_PIN_DF_SCLK_S,
181 MFP_PIN_nBE0,
182 MFP_PIN_nBE1,
183 MFP_PIN_DF_nADV2_ALE,
184 MFP_PIN_DF_INT_RnB,
185 MFP_PIN_DF_nCS0,
186 MFP_PIN_DF_nCS1,
187 MFP_PIN_nLUA,
188 MFP_PIN_nLLA,
189 MFP_PIN_DF_nWE,
190 MFP_PIN_DF_ALE_nWE,
191 MFP_PIN_DF_nRE_nOE,
192 MFP_PIN_DF_ADDR0,
193 MFP_PIN_DF_ADDR1,
194 MFP_PIN_DF_ADDR2,
195 MFP_PIN_DF_ADDR3,
196 MFP_PIN_DF_IO0,
197 MFP_PIN_DF_IO1,
198 MFP_PIN_DF_IO2,
199 MFP_PIN_DF_IO3,
200 MFP_PIN_DF_IO4,
201 MFP_PIN_DF_IO5,
202 MFP_PIN_DF_IO6,
203 MFP_PIN_DF_IO7,
204 MFP_PIN_DF_IO8,
205 MFP_PIN_DF_IO9,
206 MFP_PIN_DF_IO10,
207 MFP_PIN_DF_IO11,
208 MFP_PIN_DF_IO12,
209 MFP_PIN_DF_IO13,
210 MFP_PIN_DF_IO14,
211 MFP_PIN_DF_IO15,
212
213 /* additional pins on PXA930 */
214 MFP_PIN_GSIM_UIO,
215 MFP_PIN_GSIM_UCLK,
216 MFP_PIN_GSIM_UDET,
217 MFP_PIN_GSIM_nURST,
218 MFP_PIN_PMIC_INT,
219 MFP_PIN_RDY,
220
221 MFP_PIN_MAX,
222};
223
224/*
225 * a possible MFP configuration is represented by a 32-bit integer
226 *
227 * bit 0.. 9 - MFP Pin Number (1024 Pins Maximum)
228 * bit 10..12 - Alternate Function Selection
229 * bit 13..15 - Drive Strength
230 * bit 16..18 - Low Power Mode State
231 * bit 19..20 - Low Power Mode Edge Detection
232 * bit 21..22 - Run Mode Pull State
233 *
234 * to facilitate the definition, the following macros are provided
235 *
236 * MFP_CFG_DEFAULT - default MFP configuration value, with
237 * alternate function = 0,
238 * drive strength = fast 3mA (MFP_DS03X)
239 * low power mode = default
240 * edge detection = none
241 *
242 * MFP_CFG - default MFPR value with alternate function
243 * MFP_CFG_DRV - default MFPR value with alternate function and
244 * pin drive strength
245 * MFP_CFG_LPM - default MFPR value with alternate function and
246 * low power mode
247 * MFP_CFG_X - default MFPR value with alternate function,
248 * pin drive strength and low power mode
249 */
250
251typedef unsigned long mfp_cfg_t;
252
253#define MFP_PIN(x) ((x) & 0x3ff)
254
255#define MFP_AF0 (0x0 << 10)
256#define MFP_AF1 (0x1 << 10)
257#define MFP_AF2 (0x2 << 10)
258#define MFP_AF3 (0x3 << 10)
259#define MFP_AF4 (0x4 << 10)
260#define MFP_AF5 (0x5 << 10)
261#define MFP_AF6 (0x6 << 10)
262#define MFP_AF7 (0x7 << 10)
263#define MFP_AF_MASK (0x7 << 10)
264#define MFP_AF(x) (((x) >> 10) & 0x7)
265
266#define MFP_DS01X (0x0 << 13)
267#define MFP_DS02X (0x1 << 13)
268#define MFP_DS03X (0x2 << 13)
269#define MFP_DS04X (0x3 << 13)
270#define MFP_DS06X (0x4 << 13)
271#define MFP_DS08X (0x5 << 13)
272#define MFP_DS10X (0x6 << 13)
273#define MFP_DS13X (0x7 << 13)
274#define MFP_DS_MASK (0x7 << 13)
275#define MFP_DS(x) (((x) >> 13) & 0x7)
276
277#define MFP_LPM_DEFAULT (0x0 << 16)
278#define MFP_LPM_DRIVE_LOW (0x1 << 16)
279#define MFP_LPM_DRIVE_HIGH (0x2 << 16)
280#define MFP_LPM_PULL_LOW (0x3 << 16)
281#define MFP_LPM_PULL_HIGH (0x4 << 16)
282#define MFP_LPM_FLOAT (0x5 << 16)
283#define MFP_LPM_INPUT (0x6 << 16)
284#define MFP_LPM_STATE_MASK (0x7 << 16)
285#define MFP_LPM_STATE(x) (((x) >> 16) & 0x7)
286
287#define MFP_LPM_EDGE_NONE (0x0 << 19)
288#define MFP_LPM_EDGE_RISE (0x1 << 19)
289#define MFP_LPM_EDGE_FALL (0x2 << 19)
290#define MFP_LPM_EDGE_BOTH (0x3 << 19)
291#define MFP_LPM_EDGE_MASK (0x3 << 19)
292#define MFP_LPM_EDGE(x) (((x) >> 19) & 0x3)
293
294#define MFP_PULL_NONE (0x0 << 21)
295#define MFP_PULL_LOW (0x1 << 21)
296#define MFP_PULL_HIGH (0x2 << 21)
297#define MFP_PULL_BOTH (0x3 << 21)
298#define MFP_PULL_MASK (0x3 << 21)
299#define MFP_PULL(x) (((x) >> 21) & 0x3)
300
301#define MFP_CFG_DEFAULT (MFP_AF0 | MFP_DS03X | MFP_LPM_DEFAULT |\
302 MFP_LPM_EDGE_NONE | MFP_PULL_NONE)
303
304#define MFP_CFG(pin, af) \
305 ((MFP_CFG_DEFAULT & ~MFP_AF_MASK) |\
306 (MFP_PIN(MFP_PIN_##pin) | MFP_##af))
307
308#define MFP_CFG_DRV(pin, af, drv) \
309 ((MFP_CFG_DEFAULT & ~(MFP_AF_MASK | MFP_DS_MASK)) |\
310 (MFP_PIN(MFP_PIN_##pin) | MFP_##af | MFP_##drv))
311
312#define MFP_CFG_LPM(pin, af, lpm) \
313 ((MFP_CFG_DEFAULT & ~(MFP_AF_MASK | MFP_LPM_STATE_MASK)) |\
314 (MFP_PIN(MFP_PIN_##pin) | MFP_##af | MFP_LPM_##lpm))
315
316#define MFP_CFG_X(pin, af, drv, lpm) \
317 ((MFP_CFG_DEFAULT & ~(MFP_AF_MASK | MFP_DS_MASK | MFP_LPM_STATE_MASK)) |\
318 (MFP_PIN(MFP_PIN_##pin) | MFP_##af | MFP_##drv | MFP_LPM_##lpm))
319 20
320#endif /* __ASM_ARCH_MFP_H */ 21#endif /* __ASM_ARCH_MFP_H */
diff --git a/arch/arm/mach-pxa/include/mach/mmc.h b/arch/arm/mach-pxa/include/mach/mmc.h
index 6d1304c9270f..02a69dc2ee63 100644
--- a/arch/arm/mach-pxa/include/mach/mmc.h
+++ b/arch/arm/mach-pxa/include/mach/mmc.h
@@ -14,6 +14,11 @@ struct pxamci_platform_data {
14 int (*get_ro)(struct device *); 14 int (*get_ro)(struct device *);
15 void (*setpower)(struct device *, unsigned int); 15 void (*setpower)(struct device *, unsigned int);
16 void (*exit)(struct device *, void *); 16 void (*exit)(struct device *, void *);
17 int gpio_card_detect; /* gpio detecting card insertion */
18 int gpio_card_ro; /* gpio detecting read only toggle */
19 bool gpio_card_ro_invert; /* gpio ro is inverted */
20 int gpio_power; /* gpio powering up MMC bus */
21 bool gpio_power_invert; /* gpio power is inverted */
17}; 22};
18 23
19extern void pxa_set_mci_info(struct pxamci_platform_data *info); 24extern void pxa_set_mci_info(struct pxamci_platform_data *info);
diff --git a/arch/arm/mach-pxa/include/mach/palmtc.h b/arch/arm/mach-pxa/include/mach/palmtc.h
new file mode 100644
index 000000000000..3dc9b074ab46
--- /dev/null
+++ b/arch/arm/mach-pxa/include/mach/palmtc.h
@@ -0,0 +1,86 @@
1/*
2 * linux/include/asm-arm/arch-pxa/palmtc-gpio.h
3 *
4 * GPIOs and interrupts for Palm Tungsten|C Handheld Computer
5 *
6 * Authors: Alex Osborne <bobofdoom@gmail.com>
7 * Marek Vasut <marek.vasut@gmail.com>
8 * Holger Bocklet <bitz.email@gmx.net>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 * published by the Free Software Foundation.
13 *
14 */
15
16#ifndef _INCLUDE_PALMTC_H_
17#define _INCLUDE_PALMTC_H_
18
19/** HERE ARE GPIOs **/
20
21/* GPIOs */
22#define GPIO_NR_PALMTC_EARPHONE_DETECT 2
23#define GPIO_NR_PALMTC_CRADLE_DETECT 5
24#define GPIO_NR_PALMTC_HOTSYNC_BUTTON 7
25
26/* SD/MMC */
27#define GPIO_NR_PALMTC_SD_DETECT_N 12
28#define GPIO_NR_PALMTC_SD_POWER 32
29#define GPIO_NR_PALMTC_SD_READONLY 54
30
31/* WLAN */
32#define GPIO_NR_PALMTC_PCMCIA_READY 13
33#define GPIO_NR_PALMTC_PCMCIA_PWRREADY 14
34#define GPIO_NR_PALMTC_PCMCIA_POWER1 15
35#define GPIO_NR_PALMTC_PCMCIA_POWER2 33
36#define GPIO_NR_PALMTC_PCMCIA_POWER3 55
37#define GPIO_NR_PALMTC_PCMCIA_RESET 78
38
39/* UDC */
40#define GPIO_NR_PALMTC_USB_DETECT_N 4
41#define GPIO_NR_PALMTC_USB_POWER 36
42
43/* LCD/BACKLIGHT */
44#define GPIO_NR_PALMTC_BL_POWER 16
45#define GPIO_NR_PALMTC_LCD_POWER 44
46#define GPIO_NR_PALMTC_LCD_BLANK 38
47
48/* UART */
49#define GPIO_NR_PALMTC_RS232_POWER 37
50
51/* IRDA */
52#define GPIO_NR_PALMTC_IR_DISABLE 45
53
54/* IRQs */
55#define IRQ_GPIO_PALMTC_SD_DETECT_N IRQ_GPIO(GPIO_NR_PALMTC_SD_DETECT_N)
56#define IRQ_GPIO_PALMTC_WLAN_READY IRQ_GPIO(GPIO_NR_PALMTC_WLAN_READY)
57
58/* UCB1400 GPIOs */
59#define GPIO_NR_PALMTC_POWER_DETECT (0x80 | 0x00)
60#define GPIO_NR_PALMTC_HEADPHONE_DETECT (0x80 | 0x01)
61#define GPIO_NR_PALMTC_SPEAKER_ENABLE (0x80 | 0x03)
62#define GPIO_NR_PALMTC_VIBRA_POWER (0x80 | 0x05)
63#define GPIO_NR_PALMTC_LED_POWER (0x80 | 0x07)
64
65/** HERE ARE INIT VALUES **/
66#define PALMTC_UCB1400_GPIO_OFFSET 0x80
67
68/* BATTERY */
69#define PALMTC_BAT_MAX_VOLTAGE 4000 /* 4.00V maximum voltage */
70#define PALMTC_BAT_MIN_VOLTAGE 3550 /* 3.55V critical voltage */
71#define PALMTC_BAT_MAX_CURRENT 0 /* unknokn */
72#define PALMTC_BAT_MIN_CURRENT 0 /* unknown */
73#define PALMTC_BAT_MAX_CHARGE 1 /* unknown */
74#define PALMTC_BAT_MIN_CHARGE 1 /* unknown */
75#define PALMTC_MAX_LIFE_MINS 240 /* on-life in minutes */
76
77#define PALMTC_BAT_MEASURE_DELAY (HZ * 1)
78
79/* BACKLIGHT */
80#define PALMTC_MAX_INTENSITY 0xFE
81#define PALMTC_DEFAULT_INTENSITY 0x7E
82#define PALMTC_LIMIT_MASK 0x7F
83#define PALMTC_PRESCALER 0x3F
84#define PALMTC_PERIOD_NS 3500
85
86#endif
diff --git a/arch/arm/mach-pxa/include/mach/palmtreo.h b/arch/arm/mach-pxa/include/mach/palmtreo.h
new file mode 100644
index 000000000000..2d3f14e3be29
--- /dev/null
+++ b/arch/arm/mach-pxa/include/mach/palmtreo.h
@@ -0,0 +1,67 @@
1/*
2 * GPIOs and interrupts for Palm Treo smartphones
3 *
4 * currently supported:
5 * Palm Treo 680 (GSM)
6 * Palm Centro 685 (GSM)
7 *
8 * Author: Tomas Cech <sleep_walker@suse.cz>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 * published by the Free Software Foundation.
13 *
14 * find more info at www.hackndev.com
15 *
16 */
17
18#ifndef _INCLUDE_TREO_H_
19#define _INCLUDE_TREO_H_
20
21/* GPIOs */
22#define GPIO_NR_TREO_POWER_DETECT 0
23#define GPIO_NR_TREO_AMP_EN 27
24#define GPIO_NR_TREO_GREEN_LED 20
25#define GPIO_NR_TREO_RED_LED 79
26#define GPIO_NR_TREO_SD_DETECT_N 113
27#define GPIO_NR_TREO_EP_DETECT_N 116
28#define GPIO_NR_TREO_USB_DETECT 1
29#define GPIO_NR_TREO_USB_PULLUP 114
30#define GPIO_NR_TREO_GSM_POWER 40
31#define GPIO_NR_TREO_GSM_RESET 87
32#define GPIO_NR_TREO_GSM_WAKE 57
33#define GPIO_NR_TREO_GSM_HOST_WAKE 14
34#define GPIO_NR_TREO_GSM_TRIGGER 10
35#define GPIO_NR_TREO_IR_EN 115
36#define GPIO_NR_TREO_IR_TXD 47
37#define GPIO_NR_TREO_BL_POWER 38
38#define GPIO_NR_TREO_LCD_POWER 25
39
40/* Treo680 specific GPIOs */
41#ifdef CONFIG_MACH_TREO680
42#define GPIO_NR_TREO680_SD_READONLY 33
43#define GPIO_NR_TREO680_SD_POWER 42
44#define GPIO_NR_TREO680_VIBRATE_EN 44
45#define GPIO_NR_TREO680_KEYB_BL 24
46#define GPIO_NR_TREO680_BT_EN 43
47#endif /* CONFIG_MACH_TREO680 */
48
49/* Centro685 specific GPIOs */
50#define GPIO_NR_CENTRO_SD_POWER 21
51#define GPIO_NR_CENTRO_VIBRATE_EN 22
52#define GPIO_NR_CENTRO_KEYB_BL 33
53#define GPIO_NR_CENTRO_BT_EN 80
54
55/* Various addresses */
56#define TREO_PHYS_RAM_START 0xa0000000
57#define TREO_PHYS_IO_START 0x40000000
58#define TREO_STR_BASE 0xa2000000
59
60/* BACKLIGHT */
61#define TREO_MAX_INTENSITY 254
62#define TREO_DEFAULT_INTENSITY 160
63#define TREO_LIMIT_MASK 0x7F
64#define TREO_PRESCALER 63
65#define TREO_PERIOD_NS 3500
66
67#endif
diff --git a/arch/arm/mach-pxa/include/mach/palmtx.h b/arch/arm/mach-pxa/include/mach/palmtx.h
index e74082c872e1..1be0db6ed55e 100644
--- a/arch/arm/mach-pxa/include/mach/palmtx.h
+++ b/arch/arm/mach-pxa/include/mach/palmtx.h
@@ -82,6 +82,11 @@
82#define PALMTX_PHYS_FLASH_START PXA_CS0_PHYS /* ChipSelect 0 */ 82#define PALMTX_PHYS_FLASH_START PXA_CS0_PHYS /* ChipSelect 0 */
83#define PALMTX_PHYS_NAND_START PXA_CS1_PHYS /* ChipSelect 1 */ 83#define PALMTX_PHYS_NAND_START PXA_CS1_PHYS /* ChipSelect 1 */
84 84
85#define PALMTX_NAND_ALE_PHYS (PALMTX_PHYS_NAND_START | (1 << 24))
86#define PALMTX_NAND_CLE_PHYS (PALMTX_PHYS_NAND_START | (1 << 25))
87#define PALMTX_NAND_ALE_VIRT 0xff100000
88#define PALMTX_NAND_CLE_VIRT 0xff200000
89
85/* TOUCHSCREEN */ 90/* TOUCHSCREEN */
86#define AC97_LINK_FRAME 21 91#define AC97_LINK_FRAME 21
87 92
diff --git a/arch/arm/mach-pxa/include/mach/pxa27x_keypad.h b/arch/arm/mach-pxa/include/mach/pxa27x_keypad.h
index d5a48a96dea7..7b4eadc6df3a 100644
--- a/arch/arm/mach-pxa/include/mach/pxa27x_keypad.h
+++ b/arch/arm/mach-pxa/include/mach/pxa27x_keypad.h
@@ -2,9 +2,12 @@
2#define __ASM_ARCH_PXA27x_KEYPAD_H 2#define __ASM_ARCH_PXA27x_KEYPAD_H
3 3
4#include <linux/input.h> 4#include <linux/input.h>
5#include <linux/input/matrix_keypad.h>
5 6
6#define MAX_MATRIX_KEY_ROWS (8) 7#define MAX_MATRIX_KEY_ROWS (8)
7#define MAX_MATRIX_KEY_COLS (8) 8#define MAX_MATRIX_KEY_COLS (8)
9#define MATRIX_ROW_SHIFT (3)
10#define MAX_DIRECT_KEY_NUM (8)
8 11
9/* pxa3xx keypad platform specific parameters 12/* pxa3xx keypad platform specific parameters
10 * 13 *
@@ -33,7 +36,7 @@ struct pxa27x_keypad_platform_data {
33 36
34 /* direct keys */ 37 /* direct keys */
35 int direct_key_num; 38 int direct_key_num;
36 unsigned int direct_key_map[8]; 39 unsigned int direct_key_map[MAX_DIRECT_KEY_NUM];
37 40
38 /* rotary encoders 0 */ 41 /* rotary encoders 0 */
39 int enable_rotary0; 42 int enable_rotary0;
@@ -51,8 +54,6 @@ struct pxa27x_keypad_platform_data {
51 unsigned int debounce_interval; 54 unsigned int debounce_interval;
52}; 55};
53 56
54#define KEY(row, col, val) (((row) << 28) | ((col) << 24) | (val))
55
56extern void pxa_set_keypad_info(struct pxa27x_keypad_platform_data *info); 57extern void pxa_set_keypad_info(struct pxa27x_keypad_platform_data *info);
57 58
58#endif /* __ASM_ARCH_PXA27x_KEYPAD_H */ 59#endif /* __ASM_ARCH_PXA27x_KEYPAD_H */
diff --git a/arch/arm/mach-pxa/include/mach/pxa3xx-regs.h b/arch/arm/mach-pxa/include/mach/pxa3xx-regs.h
index 7d1a059b3d43..e91d63cfe811 100644
--- a/arch/arm/mach-pxa/include/mach/pxa3xx-regs.h
+++ b/arch/arm/mach-pxa/include/mach/pxa3xx-regs.h
@@ -208,7 +208,7 @@
208#define CKEN_MVED 43 /* < MVED clock enable */ 208#define CKEN_MVED 43 /* < MVED clock enable */
209 209
210/* Note: GCU clock enable bit differs on PXA300/PXA310 and PXA320 */ 210/* Note: GCU clock enable bit differs on PXA300/PXA310 and PXA320 */
211#define PXA300_CKEN_GRAPHICS 42 /* Graphics controller clock enable */ 211#define CKEN_PXA300_GCU 42 /* Graphics controller clock enable */
212#define PXA320_CKEN_GRAPHICS 7 /* Graphics controller clock enable */ 212#define CKEN_PXA320_GCU 7 /* Graphics controller clock enable */
213 213
214#endif /* __ASM_ARCH_PXA3XX_REGS_H */ 214#endif /* __ASM_ARCH_PXA3XX_REGS_H */
diff --git a/arch/arm/mach-pxa/include/mach/pxa3xx_nand.h b/arch/arm/mach-pxa/include/mach/pxa3xx_nand.h
deleted file mode 100644
index 3478eae32d8a..000000000000
--- a/arch/arm/mach-pxa/include/mach/pxa3xx_nand.h
+++ /dev/null
@@ -1,63 +0,0 @@
1#ifndef __ASM_ARCH_PXA3XX_NAND_H
2#define __ASM_ARCH_PXA3XX_NAND_H
3
4#include <linux/mtd/mtd.h>
5#include <linux/mtd/partitions.h>
6
7struct pxa3xx_nand_timing {
8 unsigned int tCH; /* Enable signal hold time */
9 unsigned int tCS; /* Enable signal setup time */
10 unsigned int tWH; /* ND_nWE high duration */
11 unsigned int tWP; /* ND_nWE pulse time */
12 unsigned int tRH; /* ND_nRE high duration */
13 unsigned int tRP; /* ND_nRE pulse width */
14 unsigned int tR; /* ND_nWE high to ND_nRE low for read */
15 unsigned int tWHR; /* ND_nWE high to ND_nRE low for status read */
16 unsigned int tAR; /* ND_ALE low to ND_nRE low delay */
17};
18
19struct pxa3xx_nand_cmdset {
20 uint16_t read1;
21 uint16_t read2;
22 uint16_t program;
23 uint16_t read_status;
24 uint16_t read_id;
25 uint16_t erase;
26 uint16_t reset;
27 uint16_t lock;
28 uint16_t unlock;
29 uint16_t lock_status;
30};
31
32struct pxa3xx_nand_flash {
33 const struct pxa3xx_nand_timing *timing; /* NAND Flash timing */
34 const struct pxa3xx_nand_cmdset *cmdset;
35
36 uint32_t page_per_block;/* Pages per block (PG_PER_BLK) */
37 uint32_t page_size; /* Page size in bytes (PAGE_SZ) */
38 uint32_t flash_width; /* Width of Flash memory (DWIDTH_M) */
39 uint32_t dfc_width; /* Width of flash controller(DWIDTH_C) */
40 uint32_t num_blocks; /* Number of physical blocks in Flash */
41 uint32_t chip_id;
42};
43
44struct pxa3xx_nand_platform_data {
45
46 /* the data flash bus is shared between the Static Memory
47 * Controller and the Data Flash Controller, the arbiter
48 * controls the ownership of the bus
49 */
50 int enable_arbiter;
51
52 /* allow platform code to keep OBM/bootloader defined NFC config */
53 int keep_config;
54
55 const struct mtd_partition *parts;
56 unsigned int nr_parts;
57
58 const struct pxa3xx_nand_flash * flash;
59 size_t num_flash;
60};
61
62extern void pxa3xx_set_nand_info(struct pxa3xx_nand_platform_data *info);
63#endif /* __ASM_ARCH_PXA3XX_NAND_H */
diff --git a/arch/arm/mach-pxa/include/mach/pxafb.h b/arch/arm/mach-pxa/include/mach/pxafb.h
index 6932720ba04e..160ec83f51a6 100644
--- a/arch/arm/mach-pxa/include/mach/pxafb.h
+++ b/arch/arm/mach-pxa/include/mach/pxafb.h
@@ -76,7 +76,8 @@ struct pxafb_mode_info {
76 u_char bpp; 76 u_char bpp;
77 u_int cmap_greyscale:1, 77 u_int cmap_greyscale:1,
78 depth:8, 78 depth:8,
79 unused:23; 79 transparency:1,
80 unused:22;
80 81
81 /* Parallel Mode Timing */ 82 /* Parallel Mode Timing */
82 u_char hsync_len; 83 u_char hsync_len;
@@ -118,7 +119,8 @@ struct pxafb_mach_info {
118 u_int fixed_modes:1, 119 u_int fixed_modes:1,
119 cmap_inverse:1, 120 cmap_inverse:1,
120 cmap_static:1, 121 cmap_static:1,
121 unused:29; 122 acceleration_enabled:1,
123 unused:28;
122 124
123 /* The following should be defined in LCCR0 125 /* The following should be defined in LCCR0
124 * LCCR0_Act or LCCR0_Pas Active or Passive 126 * LCCR0_Act or LCCR0_Pas Active or Passive
diff --git a/arch/arm/mach-pxa/include/mach/regs-intc.h b/arch/arm/mach-pxa/include/mach/regs-intc.h
index ad23e74b762f..68464ce1c1ea 100644
--- a/arch/arm/mach-pxa/include/mach/regs-intc.h
+++ b/arch/arm/mach-pxa/include/mach/regs-intc.h
@@ -13,6 +13,7 @@
13#define ICFP __REG(0x40D0000C) /* Interrupt Controller FIQ Pending Register */ 13#define ICFP __REG(0x40D0000C) /* Interrupt Controller FIQ Pending Register */
14#define ICPR __REG(0x40D00010) /* Interrupt Controller Pending Register */ 14#define ICPR __REG(0x40D00010) /* Interrupt Controller Pending Register */
15#define ICCR __REG(0x40D00014) /* Interrupt Controller Control Register */ 15#define ICCR __REG(0x40D00014) /* Interrupt Controller Control Register */
16#define ICHP __REG(0x40D00018) /* Interrupt Controller Highest Priority Register */
16 17
17#define ICIP2 __REG(0x40D0009C) /* Interrupt Controller IRQ Pending Register 2 */ 18#define ICIP2 __REG(0x40D0009C) /* Interrupt Controller IRQ Pending Register 2 */
18#define ICMR2 __REG(0x40D000A0) /* Interrupt Controller Mask Register 2 */ 19#define ICMR2 __REG(0x40D000A0) /* Interrupt Controller Mask Register 2 */
@@ -20,4 +21,14 @@
20#define ICFP2 __REG(0x40D000A8) /* Interrupt Controller FIQ Pending Register 2 */ 21#define ICFP2 __REG(0x40D000A8) /* Interrupt Controller FIQ Pending Register 2 */
21#define ICPR2 __REG(0x40D000AC) /* Interrupt Controller Pending Register 2 */ 22#define ICPR2 __REG(0x40D000AC) /* Interrupt Controller Pending Register 2 */
22 23
24#define ICIP3 __REG(0x40D00130) /* Interrupt Controller IRQ Pending Register 3 */
25#define ICMR3 __REG(0x40D00134) /* Interrupt Controller Mask Register 3 */
26#define ICLR3 __REG(0x40D00138) /* Interrupt Controller Level Register 3 */
27#define ICFP3 __REG(0x40D0013C) /* Interrupt Controller FIQ Pending Register 3 */
28#define ICPR3 __REG(0x40D00140) /* Interrupt Controller Pending Register 3 */
29
30#define IPR(x) __REG(0x40D0001C + (x < 32 ? (x << 2) \
31 : (x < 64 ? (0x94 + ((x - 32) << 2)) \
32 : (0x128 + ((x - 64) << 2)))))
33
23#endif /* __ASM_MACH_REGS_INTC_H */ 34#endif /* __ASM_MACH_REGS_INTC_H */
diff --git a/arch/arm/mach-pxa/include/mach/regs-u2d.h b/arch/arm/mach-pxa/include/mach/regs-u2d.h
new file mode 100644
index 000000000000..44b0b20b69a4
--- /dev/null
+++ b/arch/arm/mach-pxa/include/mach/regs-u2d.h
@@ -0,0 +1,199 @@
1#ifndef __ASM_ARCH_PXA3xx_U2D_H
2#define __ASM_ARCH_PXA3xx_U2D_H
3
4#include <mach/bitfield.h>
5
6/*
7 * USB2 device controller registers and bits definitions
8 */
9#define U2DCR (0x0000) /* U2D Control Register */
10#define U2DCR_NDC (1 << 31) /* NAK During Config */
11#define U2DCR_HSTC (0x7 << 28) /* High Speed Timeout Calibration */
12#define U2DCR_SPEOREN (1 << 27) /* Short Packet EOR INTR generation Enable */
13#define U2DCR_FSTC (0x7 << 24) /* Full Speed Timeout Calibration */
14#define U2DCR_UCLKOVR (1 << 22) /* UTM Clock Override */
15#define U2DCR_ABP (1 << 21) /* Application Bus Power */
16#define U2DCR_ADD (1 << 20) /* Application Device Disconnect */
17#define U2DCR_CC (1 << 19) /* Configuration Change */
18#define U2DCR_HS (1 << 18) /* High Speed USB Detection */
19#define U2DCR_SMAC (1 << 17) /* Switch Endpoint Memory to Active Configuration */
20#define U2DCR_DWRE (1 << 16) /* Device Remote Wake-up Feature */
21#define U2DCR_ACN (0xf << 12) /* Active U2D Configuration Number */
22#define U2DCR_AIN (0xf << 8) /* Active U2D Interface Number */
23#define U2DCR_AAISN (0xf << 4) /* Active U2D Alternate Interface Setting Number */
24#define U2DCR_EMCE (1 << 3) /* Endpoint Memory Configuration Error */
25#define U2DCR_UDR (1 << 2) /* U2D Resume */
26#define U2DCR_UDA (1 << 1) /* U2D Active */
27#define U2DCR_UDE (1 << 0) /* U2D Enable */
28
29#define U2DICR (0x0004) /* U2D Interrupt Control Register */
30#define U2DISR (0x000C) /* U2D Interrupt Status Register */
31#define U2DINT_CC (1 << 31) /* Interrupt - Configuration Change */
32#define U2DINT_SOF (1 << 30) /* Interrupt - SOF */
33#define U2DINT_USOF (1 << 29) /* Interrupt - micro SOF */
34#define U2DINT_RU (1 << 28) /* Interrupt - Resume */
35#define U2DINT_SU (1 << 27) /* Interrupt - Suspend */
36#define U2DINT_RS (1 << 26) /* Interrupt - Reset */
37#define U2DINT_DPE (1 << 25) /* Interrupt - Data Packet Error */
38#define U2DINT_FIFOERR (0x4) /* Interrupt - endpoint FIFO error */
39#define U2DINT_PACKETCMP (0x2) /* Interrupt - endpoint packet complete */
40#define U2DINT_SPACKETCMP (0x1) /* Interrupt - endpoint short packet complete */
41
42#define U2DFNR (0x0014) /* U2D Frame Number Register */
43
44#define U2DINT(n, intr) (((intr) & 0x07) << (((n) & 0x07) * 3))
45#define U2DICR2 (0x0008) /* U2D Interrupt Control Register 2 */
46#define U2DISR2 (0x0010) /* U2D Interrupt Status Register 2 */
47
48#define U2DOTGCR (0x0020) /* U2D OTG Control Register */
49#define U2DOTGCR_OTGEN (1 << 31) /* On-The-Go Enable */
50#define U2DOTGCR_AALTHNP (1 << 30) /* A-device Alternate Host Negotiation Protocal Port Support */
51#define U2DOTGCR_AHNP (1 << 29) /* A-device Host Negotiation Protocal Support */
52#define U2DOTGCR_BHNP (1 << 28) /* B-device Host Negotiation Protocal Enable */
53
54#ifdef CONFIG_CPU_PXA930
55#define U2DOTGCR_LPA (1 << 15) /* ULPI low power mode active */
56#define U2DOTGCR_IESI (1 << 13) /* OTG interrupt Enable */
57#define U2DOTGCR_ISSI (1 << 12) /* OTG interrupt status */
58#endif
59
60#define U2DOTGCR_CKAF (1 << 5) /* Carkit Mode Alternate Function Select */
61#define U2DOTGCR_UTMID (1 << 4) /* UTMI Interface Disable */
62#define U2DOTGCR_ULAF (1 << 3) /* ULPI Mode Alternate Function Select */
63#define U2DOTGCR_SMAF (1 << 2) /* Serial Mode Alternate Function Select */
64#define U2DOTGCR_RTSM (1 << 1) /* Return to Synchronous Mode (ULPI Mode) */
65#define U2DOTGCR_ULE (1 << 0) /* ULPI Wrapper Enable */
66
67#define U2DOTGICR (0x0024) /* U2D OTG Interrupt Control Register */
68#define U2DOTGISR (0x0028) /* U2D OTG Interrupt Status Register */
69
70#define U2DOTGINT_SF (1 << 17) /* OTG Set Feature Command Received */
71#define U2DOTGINT_SI (1 << 16) /* OTG Interrupt */
72#define U2DOTGINT_RLS1 (1 << 14) /* RXCMD Linestate[1] Change Interrupt Rise */
73#define U2DOTGINT_RLS0 (1 << 13) /* RXCMD Linestate[0] Change Interrupt Rise */
74#define U2DOTGINT_RID (1 << 12) /* RXCMD OTG ID Change Interrupt Rise */
75#define U2DOTGINT_RSE (1 << 11) /* RXCMD OTG Session End Interrupt Rise */
76#define U2DOTGINT_RSV (1 << 10) /* RXCMD OTG Session Valid Interrupt Rise */
77#define U2DOTGINT_RVV (1 << 9) /* RXCMD OTG Vbus Valid Interrupt Rise */
78#define U2DOTGINT_RCK (1 << 8) /* RXCMD Carkit Interrupt Rise */
79#define U2DOTGINT_FLS1 (1 << 6) /* RXCMD Linestate[1] Change Interrupt Fall */
80#define U2DOTGINT_FLS0 (1 << 5) /* RXCMD Linestate[0] Change Interrupt Fall */
81#define U2DOTGINT_FID (1 << 4) /* RXCMD OTG ID Change Interrupt Fall */
82#define U2DOTGINT_FSE (1 << 3) /* RXCMD OTG Session End Interrupt Fall */
83#define U2DOTGINT_FSV (1 << 2) /* RXCMD OTG Session Valid Interrupt Fall */
84#define U2DOTGINT_FVV (1 << 1) /* RXCMD OTG Vbus Valid Interrupt Fall */
85#define U2DOTGINT_FCK (1 << 0) /* RXCMD Carkit Interrupt Fall */
86
87#define U2DOTGUSR (0x002C) /* U2D OTG ULPI Status Register */
88#define U2DOTGUSR_LPA (1 << 31) /* ULPI Low Power Mode Active */
89#define U2DOTGUSR_S6A (1 << 30) /* ULPI Serial Mode (6-pin) Active */
90#define U2DOTGUSR_S3A (1 << 29) /* ULPI Serial Mode (3-pin) Active */
91#define U2DOTGUSR_CKA (1 << 28) /* ULPI Car Kit Mode Active */
92#define U2DOTGUSR_LS1 (1 << 6) /* RXCMD Linestate 1 Status */
93#define U2DOTGUSR_LS0 (1 << 5) /* RXCMD Linestate 0 Status */
94#define U2DOTGUSR_ID (1 << 4) /* OTG IDGnd Status */
95#define U2DOTGUSR_SE (1 << 3) /* OTG Session End Status */
96#define U2DOTGUSR_SV (1 << 2) /* OTG Session Valid Status */
97#define U2DOTGUSR_VV (1 << 1) /* OTG Vbus Valid Status */
98#define U2DOTGUSR_CK (1 << 0) /* Carkit Interrupt Status */
99
100#define U2DOTGUCR (0x0030) /* U2D OTG ULPI Control Register */
101#define U2DOTGUCR_RUN (1 << 25) /* RUN */
102#define U2DOTGUCR_RNW (1 << 24) /* Read or Write operation */
103#define U2DOTGUCR_ADDR (0x3f << 16) /* Address of the ULPI PHY register */
104#define U2DOTGUCR_WDATA (0xff << 8) /* The data for a WRITE command */
105#define U2DOTGUCR_RDATA (0xff << 0) /* The data for a READ command */
106
107#define U2DP3CR (0x0034) /* U2D Port 3 Control Register */
108#define U2DP3CR_P2SS (0x3 << 8) /* Host Port 2 Serial Mode Select */
109#define U2DP3CR_P3SS (0x7 << 4) /* Host Port 3 Serial Mode Select */
110#define U2DP3CR_VPVMBEN (0x1 << 2) /* Host Port 3 Vp/Vm Block Enable */
111#define U2DP3CR_CFG (0x3 << 0) /* Host Port 3 Configuration */
112
113#define U2DCSR0 (0x0100) /* U2D Control/Status Register - Endpoint 0 */
114#define U2DCSR0_IPA (1 << 8) /* IN Packet Adjusted */
115#define U2DCSR0_SA (1 << 7) /* SETUP Active */
116#define U2DCSR0_RNE (1 << 6) /* Receive FIFO Not Empty */
117#define U2DCSR0_FST (1 << 5) /* Force Stall */
118#define U2DCSR0_SST (1 << 4) /* Send Stall */
119#define U2DCSR0_DME (1 << 3) /* DMA Enable */
120#define U2DCSR0_FTF (1 << 2) /* Flush Transmit FIFO */
121#define U2DCSR0_IPR (1 << 1) /* IN Packet Ready */
122#define U2DCSR0_OPC (1 << 0) /* OUT Packet Complete */
123
124#define U2DCSR(x) (0x0100 + ((x) << 2)) /* U2D Control/Status Register - Endpoint x */
125#define U2DCSR_BF (1 << 10) /* Buffer Full, for OUT eps */
126#define U2DCSR_BE (1 << 10) /* Buffer Empty, for IN eps */
127#define U2DCSR_DPE (1 << 9) /* Data Packet Error, for ISO eps only */
128#define U2DCSR_FEF (1 << 8) /* Flush Endpoint FIFO */
129#define U2DCSR_SP (1 << 7) /* Short Packet Control/Status, for OUT eps only, readonly */
130#define U2DCSR_BNE (1 << 6) /* Buffer Not Empty, for OUT eps */
131#define U2DCSR_BNF (1 << 6) /* Buffer Not Full, for IN eps */
132#define U2DCSR_FST (1 << 5) /* Force STALL, write 1 set */
133#define U2DCSR_SST (1 << 4) /* Sent STALL, write 1 clear */
134#define U2DCSR_DME (1 << 3) /* DMA Enable */
135#define U2DCSR_TRN (1 << 2) /* Tx/Rx NAK, write 1 clear */
136#define U2DCSR_PC (1 << 1) /* Packet Complete, write 1 clear */
137#define U2DCSR_FS (1 << 0) /* FIFO needs Service */
138
139#define U2DBCR0 (0x0200) /* U2D Byte Count Register - Endpoint 0 */
140#define U2DBCR(x) (0x0200 + ((x) << 2)) /* U2D Byte Count Register - Endpoint x */
141
142#define U2DDR0 (0x0300) /* U2D Data Register - Endpoint 0 */
143
144#define U2DEPCR(x) (0x0400 + ((x) << 2)) /* U2D Configuration Register - Endpoint x */
145#define U2DEPCR_EE (1 << 0) /* Endpoint Enable */
146#define U2DEPCR_BS_MASK (0x3FE) /* Buffer Size, BS*8=FIFO size, max 8184B = 8KB */
147
148#define U2DSCA (0x0500) /* U2D Setup Command Address */
149#define U2DSCA_VALUE (0x0120)
150
151#define U2DEN0 (0x0504) /* U2D Endpoint Information Register - Endpoint 0 */
152#define U2DEN(x) (0x0504 + ((x) << 2)) /* U2D Endpoint Information Register - Endpoint x */
153
154/* U2DMA registers */
155#define U2DMACSR0 (0x1000) /* U2DMA Control/Status Register - Channel 0 */
156#define U2DMACSR(x) (0x1000 + ((x) << 2)) /* U2DMA Control/Status Register - Channel x */
157#define U2DMACSR_RUN (1 << 31) /* Run Bit (read / write) */
158#define U2DMACSR_STOPIRQEN (1 << 29) /* Stop Interrupt Enable (read / write) */
159#define U2DMACSR_EORIRQEN (1 << 28) /* End of Receive Interrupt Enable (R/W) */
160#define U2DMACSR_EORJMPEN (1 << 27) /* Jump to next descriptor on EOR */
161#define U2DMACSR_EORSTOPEN (1 << 26) /* STOP on an EOR */
162#define U2DMACSR_RASIRQEN (1 << 23) /* Request After Cnannel Stopped Interrupt Enable */
163#define U2DMACSR_MASKRUN (1 << 22) /* Mask Run */
164#define U2DMACSR_SCEMC (3 << 18) /* System Bus Split Completion Error Message Class */
165#define U2DMACSR_SCEMI (0x1f << 13) /* System Bus Split Completion Error Message Index */
166#define U2DMACSR_BUSERRTYPE (7 << 10) /* PX Bus Error Type */
167#define U2DMACSR_EORINTR (1 << 9) /* End Of Receive */
168#define U2DMACSR_REQPEND (1 << 8) /* Request Pending */
169#define U2DMACSR_RASINTR (1 << 4) /* Request After Channel Stopped (read / write 1 clear) */#define U2DMACSR_STOPINTR (1 << 3) /* Stop Interrupt (read only) */
170#define U2DMACSR_ENDINTR (1 << 2) /* End Interrupt (read / write 1 clear) */
171#define U2DMACSR_STARTINTR (1 << 1) /* Start Interrupt (read / write 1 clear) */
172#define U2DMACSR_BUSERRINTR (1 << 0) /* Bus Error Interrupt (read / write 1 clear) */
173
174#define U2DMACR (0x1080) /* U2DMA Control Register */
175#define U2DMAINT (0x10F0) /* U2DMA Interrupt Register */
176
177#define U2DMABR0 (0x1100) /* U2DMA Branch Register - Channel 0 */
178#define U2DMABR(x) (0x1100 + (x) << 2) /* U2DMA Branch Register - Channel x */
179
180#define U2DMADADR0 (0x1200) /* U2DMA Descriptor Address Register - Channel 0 */
181#define U2DMADADR(x) (0x1200 + (x) * 0x10) /* U2DMA Descriptor Address Register - Channel x */
182
183#define U2DMADADR_STOP (1U << 0)
184
185#define U2DMASADR0 (0x1204) /* U2DMA Source Address Register - Channel 0 */
186#define U2DMASADR(x) (0x1204 + (x) * 0x10) /* U2DMA Source Address Register - Channel x */
187#define U2DMATADR0 (0x1208) /* U2DMA Target Address Register - Channel 0 */
188#define U2DMATADR(x) (0x1208 + (x) * 0x10) /* U2DMA Target Address Register - Channel x */
189
190#define U2DMACMDR0 (0x120C) /* U2DMA Command Address Register - Channel 0 */
191#define U2DMACMDR(x) (0x120C + (x) * 0x10) /* U2DMA Command Address Register - Channel x */
192
193#define U2DMACMDR_XFRDIS (1 << 31) /* Transfer Direction */
194#define U2DMACMDR_STARTIRQEN (1 << 22) /* Start Interrupt Enable */
195#define U2DMACMDR_ENDIRQEN (1 << 21) /* End Interrupt Enable */
196#define U2DMACMDR_PACKCOMP (1 << 13) /* Packet Complete */
197#define U2DMACMDR_LEN (0x07ff) /* length mask (max = 2K - 1) */
198
199#endif /* __ASM_ARCH_PXA3xx_U2D_H */
diff --git a/arch/arm/mach-pxa/include/mach/treo680.h b/arch/arm/mach-pxa/include/mach/treo680.h
deleted file mode 100644
index af443b24d99a..000000000000
--- a/arch/arm/mach-pxa/include/mach/treo680.h
+++ /dev/null
@@ -1,49 +0,0 @@
1/*
2 * GPIOs and interrupts for Palm Treo 680 smartphone
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 *
8 */
9
10#ifndef _INCLUDE_TREO680_H_
11#define _INCLUDE_TREO680_H_
12
13/* GPIOs */
14#define GPIO_NR_TREO680_POWER_DETECT 0
15#define GPIO_NR_TREO680_AMP_EN 27
16#define GPIO_NR_TREO680_KEYB_BL 24
17#define GPIO_NR_TREO680_VIBRATE_EN 44
18#define GPIO_NR_TREO680_GREEN_LED 20
19#define GPIO_NR_TREO680_RED_LED 79
20#define GPIO_NR_TREO680_SD_DETECT_N 113
21#define GPIO_NR_TREO680_SD_READONLY 33
22#define GPIO_NR_TREO680_EP_DETECT_N 116
23#define GPIO_NR_TREO680_SD_POWER 42
24#define GPIO_NR_TREO680_USB_DETECT 1
25#define GPIO_NR_TREO680_USB_PULLUP 114
26#define GPIO_NR_TREO680_GSM_POWER 40
27#define GPIO_NR_TREO680_GSM_RESET 87
28#define GPIO_NR_TREO680_GSM_WAKE 57
29#define GPIO_NR_TREO680_GSM_HOST_WAKE 14
30#define GPIO_NR_TREO680_GSM_TRIGGER 10
31#define GPIO_NR_TREO680_BT_EN 43
32#define GPIO_NR_TREO680_IR_EN 115
33#define GPIO_NR_TREO680_IR_TXD 47
34#define GPIO_NR_TREO680_BL_POWER 38
35#define GPIO_NR_TREO680_LCD_POWER 25
36
37/* Various addresses */
38#define TREO680_PHYS_RAM_START 0xa0000000
39#define TREO680_PHYS_IO_START 0x40000000
40#define TREO680_STR_BASE 0xa2000000
41
42/* BACKLIGHT */
43#define TREO680_MAX_INTENSITY 254
44#define TREO680_DEFAULT_INTENSITY 160
45#define TREO680_LIMIT_MASK 0x7F
46#define TREO680_PRESCALER 63
47#define TREO680_PERIOD_NS 3500
48
49#endif
diff --git a/arch/arm/mach-pxa/include/mach/uncompress.h b/arch/arm/mach-pxa/include/mach/uncompress.h
index b54749413e96..237734b5b1be 100644
--- a/arch/arm/mach-pxa/include/mach/uncompress.h
+++ b/arch/arm/mach-pxa/include/mach/uncompress.h
@@ -37,7 +37,7 @@ static inline void arch_decomp_setup(void)
37{ 37{
38 if (machine_is_littleton() || machine_is_intelmote2() 38 if (machine_is_littleton() || machine_is_intelmote2()
39 || machine_is_csb726() || machine_is_stargate2() 39 || machine_is_csb726() || machine_is_stargate2()
40 || machine_is_cm_x300()) 40 || machine_is_cm_x300() || machine_is_balloon3())
41 UART = STUART; 41 UART = STUART;
42} 42}
43 43
diff --git a/arch/arm/mach-pxa/irq.c b/arch/arm/mach-pxa/irq.c
index f6e0300e4f64..6112af431fa4 100644
--- a/arch/arm/mach-pxa/irq.c
+++ b/arch/arm/mach-pxa/irq.c
@@ -25,6 +25,8 @@
25 25
26#include "generic.h" 26#include "generic.h"
27 27
28#define MAX_INTERNAL_IRQS 128
29
28#define IRQ_BIT(n) (((n) - PXA_IRQ(0)) & 0x1f) 30#define IRQ_BIT(n) (((n) - PXA_IRQ(0)) & 0x1f)
29#define _ICMR(n) (*((((n) - PXA_IRQ(0)) & ~0x1f) ? &ICMR2 : &ICMR)) 31#define _ICMR(n) (*((((n) - PXA_IRQ(0)) & ~0x1f) ? &ICMR2 : &ICMR))
30#define _ICLR(n) (*((((n) - PXA_IRQ(0)) & ~0x1f) ? &ICLR2 : &ICLR)) 32#define _ICLR(n) (*((((n) - PXA_IRQ(0)) & ~0x1f) ? &ICLR2 : &ICLR))
@@ -120,7 +122,9 @@ static void __init pxa_init_low_gpio_irq(set_wake_t fn)
120 122
121void __init pxa_init_irq(int irq_nr, set_wake_t fn) 123void __init pxa_init_irq(int irq_nr, set_wake_t fn)
122{ 124{
123 int irq; 125 int irq, i;
126
127 BUG_ON(irq_nr > MAX_INTERNAL_IRQS);
124 128
125 pxa_internal_irq_nr = irq_nr; 129 pxa_internal_irq_nr = irq_nr;
126 130
@@ -129,6 +133,12 @@ void __init pxa_init_irq(int irq_nr, set_wake_t fn)
129 _ICLR(irq) = 0; /* all IRQs are IRQ, not FIQ */ 133 _ICLR(irq) = 0; /* all IRQs are IRQ, not FIQ */
130 } 134 }
131 135
136 /* initialize interrupt priority */
137 if (cpu_is_pxa27x() || cpu_is_pxa3xx()) {
138 for (i = 0; i < irq_nr; i++)
139 IPR(i) = i | (1 << 31);
140 }
141
132 /* only unmasked interrupts kick us out of idle */ 142 /* only unmasked interrupts kick us out of idle */
133 ICCR = 1; 143 ICCR = 1;
134 144
@@ -143,7 +153,8 @@ void __init pxa_init_irq(int irq_nr, set_wake_t fn)
143} 153}
144 154
145#ifdef CONFIG_PM 155#ifdef CONFIG_PM
146static unsigned long saved_icmr[2]; 156static unsigned long saved_icmr[MAX_INTERNAL_IRQS/32];
157static unsigned long saved_ipr[MAX_INTERNAL_IRQS];
147 158
148static int pxa_irq_suspend(struct sys_device *dev, pm_message_t state) 159static int pxa_irq_suspend(struct sys_device *dev, pm_message_t state)
149{ 160{
@@ -153,6 +164,8 @@ static int pxa_irq_suspend(struct sys_device *dev, pm_message_t state)
153 saved_icmr[i] = _ICMR(irq); 164 saved_icmr[i] = _ICMR(irq);
154 _ICMR(irq) = 0; 165 _ICMR(irq) = 0;
155 } 166 }
167 for (i = 0; i < pxa_internal_irq_nr; i++)
168 saved_ipr[i] = IPR(i);
156 169
157 return 0; 170 return 0;
158} 171}
@@ -165,6 +178,8 @@ static int pxa_irq_resume(struct sys_device *dev)
165 _ICMR(irq) = saved_icmr[i]; 178 _ICMR(irq) = saved_icmr[i];
166 _ICLR(irq) = 0; 179 _ICLR(irq) = 0;
167 } 180 }
181 for (i = 0; i < pxa_internal_irq_nr; i++)
182 IPR(i) = saved_ipr[i];
168 183
169 ICCR = 1; 184 ICCR = 1;
170 return 0; 185 return 0;
diff --git a/arch/arm/mach-pxa/littleton.c b/arch/arm/mach-pxa/littleton.c
index 55b3788fd1ae..f28c1715b910 100644
--- a/arch/arm/mach-pxa/littleton.c
+++ b/arch/arm/mach-pxa/littleton.c
@@ -44,10 +44,10 @@
44#include <mach/ssp.h> 44#include <mach/ssp.h>
45#include <mach/mmc.h> 45#include <mach/mmc.h>
46#include <mach/pxa2xx_spi.h> 46#include <mach/pxa2xx_spi.h>
47#include <plat/i2c.h>
48#include <mach/pxa27x_keypad.h> 47#include <mach/pxa27x_keypad.h>
49#include <mach/pxa3xx_nand.h>
50#include <mach/littleton.h> 48#include <mach/littleton.h>
49#include <plat/i2c.h>
50#include <plat/pxa3xx_nand.h>
51 51
52#include "generic.h" 52#include "generic.h"
53 53
@@ -265,45 +265,12 @@ static inline void littleton_init_keypad(void) {}
265#endif 265#endif
266 266
267#if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE) 267#if defined(CONFIG_MMC_PXA) || defined(CONFIG_MMC_PXA_MODULE)
268static int littleton_mci_init(struct device *dev,
269 irq_handler_t littleton_detect_int, void *data)
270{
271 int err, gpio_cd = GPIO_MMC1_CARD_DETECT;
272
273 err = gpio_request(gpio_cd, "mmc card detect");
274 if (err)
275 goto err_request_cd;
276
277 gpio_direction_input(gpio_cd);
278
279 err = request_irq(gpio_to_irq(gpio_cd), littleton_detect_int,
280 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
281 "mmc card detect", data);
282 if (err) {
283 dev_err(dev, "failed to request card detect IRQ\n");
284 goto err_request_irq;
285 }
286 return 0;
287
288err_request_irq:
289 gpio_free(gpio_cd);
290err_request_cd:
291 return err;
292}
293
294static void littleton_mci_exit(struct device *dev, void *data)
295{
296 int gpio_cd = GPIO_MMC1_CARD_DETECT;
297
298 free_irq(gpio_to_irq(gpio_cd), data);
299 gpio_free(gpio_cd);
300}
301
302static struct pxamci_platform_data littleton_mci_platform_data = { 268static struct pxamci_platform_data littleton_mci_platform_data = {
303 .detect_delay = 20, 269 .detect_delay = 20,
304 .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, 270 .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
305 .init = littleton_mci_init, 271 .gpio_card_detect = GPIO_MMC1_CARD_DETECT,
306 .exit = littleton_mci_exit, 272 .gpio_card_ro = -1,
273 .gpio_power = -1,
307}; 274};
308 275
309static void __init littleton_init_mmc(void) 276static void __init littleton_init_mmc(void)
@@ -446,6 +413,10 @@ static void __init littleton_init(void)
446 /* initialize MFP configurations */ 413 /* initialize MFP configurations */
447 pxa3xx_mfp_config(ARRAY_AND_SIZE(littleton_mfp_cfg)); 414 pxa3xx_mfp_config(ARRAY_AND_SIZE(littleton_mfp_cfg));
448 415
416 pxa_set_ffuart_info(NULL);
417 pxa_set_btuart_info(NULL);
418 pxa_set_stuart_info(NULL);
419
449 /* 420 /*
450 * Note: we depend bootloader set the correct 421 * Note: we depend bootloader set the correct
451 * value to MSC register for SMC91x. 422 * value to MSC register for SMC91x.
diff --git a/arch/arm/mach-pxa/lpd270.c b/arch/arm/mach-pxa/lpd270.c
index d64395f26a3e..1373c22dbb83 100644
--- a/arch/arm/mach-pxa/lpd270.c
+++ b/arch/arm/mach-pxa/lpd270.c
@@ -455,6 +455,10 @@ static void __init lpd270_init(void)
455{ 455{
456 pxa2xx_mfp_config(ARRAY_AND_SIZE(lpd270_pin_config)); 456 pxa2xx_mfp_config(ARRAY_AND_SIZE(lpd270_pin_config));
457 457
458 pxa_set_ffuart_info(NULL);
459 pxa_set_btuart_info(NULL);
460 pxa_set_stuart_info(NULL);
461
458 lpd270_flash_data[0].width = (BOOT_DEF & 1) ? 2 : 4; 462 lpd270_flash_data[0].width = (BOOT_DEF & 1) ? 2 : 4;
459 lpd270_flash_data[1].width = 4; 463 lpd270_flash_data[1].width = 4;
460 464
diff --git a/arch/arm/mach-pxa/lubbock.c b/arch/arm/mach-pxa/lubbock.c
index f04c8333dff7..98ee7e590299 100644
--- a/arch/arm/mach-pxa/lubbock.c
+++ b/arch/arm/mach-pxa/lubbock.c
@@ -482,11 +482,14 @@ static void lubbock_mci_exit(struct device *dev, void *data)
482} 482}
483 483
484static struct pxamci_platform_data lubbock_mci_platform_data = { 484static struct pxamci_platform_data lubbock_mci_platform_data = {
485 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, 485 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34,
486 .detect_delay = 1, 486 .detect_delay = 1,
487 .init = lubbock_mci_init, 487 .init = lubbock_mci_init,
488 .get_ro = lubbock_mci_get_ro, 488 .get_ro = lubbock_mci_get_ro,
489 .exit = lubbock_mci_exit, 489 .exit = lubbock_mci_exit,
490 .gpio_card_detect = -1,
491 .gpio_card_ro = -1,
492 .gpio_power = -1,
490}; 493};
491 494
492static void lubbock_irda_transceiver_mode(struct device *dev, int mode) 495static void lubbock_irda_transceiver_mode(struct device *dev, int mode)
@@ -504,8 +507,9 @@ static void lubbock_irda_transceiver_mode(struct device *dev, int mode)
504} 507}
505 508
506static struct pxaficp_platform_data lubbock_ficp_platform_data = { 509static struct pxaficp_platform_data lubbock_ficp_platform_data = {
507 .transceiver_cap = IR_SIRMODE | IR_FIRMODE, 510 .gpio_pwdown = -1,
508 .transceiver_mode = lubbock_irda_transceiver_mode, 511 .transceiver_cap = IR_SIRMODE | IR_FIRMODE,
512 .transceiver_mode = lubbock_irda_transceiver_mode,
509}; 513};
510 514
511static void __init lubbock_init(void) 515static void __init lubbock_init(void)
@@ -514,6 +518,10 @@ static void __init lubbock_init(void)
514 518
515 pxa2xx_mfp_config(ARRAY_AND_SIZE(lubbock_pin_config)); 519 pxa2xx_mfp_config(ARRAY_AND_SIZE(lubbock_pin_config));
516 520
521 pxa_set_ffuart_info(NULL);
522 pxa_set_btuart_info(NULL);
523 pxa_set_stuart_info(NULL);
524
517 clk_add_alias("SA1111_CLK", NULL, "GPIO11_CLK", NULL); 525 clk_add_alias("SA1111_CLK", NULL, "GPIO11_CLK", NULL);
518 pxa_set_udc_info(&udc_info); 526 pxa_set_udc_info(&udc_info);
519 set_pxa_fb_info(&sharp_lm8v31); 527 set_pxa_fb_info(&sharp_lm8v31);
diff --git a/arch/arm/mach-pxa/magician.c b/arch/arm/mach-pxa/magician.c
index ca39669cffc5..8a38d604dc77 100644
--- a/arch/arm/mach-pxa/magician.c
+++ b/arch/arm/mach-pxa/magician.c
@@ -140,15 +140,9 @@ static unsigned long magician_pin_config[] __initdata = {
140 * IRDA 140 * IRDA
141 */ 141 */
142 142
143static void magician_irda_transceiver_mode(struct device *dev, int mode)
144{
145 gpio_set_value(GPIO83_MAGICIAN_nIR_EN, mode & IR_OFF);
146 pxa2xx_transceiver_mode(dev, mode);
147}
148
149static struct pxaficp_platform_data magician_ficp_info = { 143static struct pxaficp_platform_data magician_ficp_info = {
150 .transceiver_cap = IR_SIRMODE | IR_OFF, 144 .gpio_pwdown = GPIO83_MAGICIAN_nIR_EN,
151 .transceiver_mode = magician_irda_transceiver_mode, 145 .transceiver_cap = IR_SIRMODE | IR_OFF,
152}; 146};
153 147
154/* 148/*
@@ -651,55 +645,24 @@ static struct platform_device bq24022 = {
651static int magician_mci_init(struct device *dev, 645static int magician_mci_init(struct device *dev,
652 irq_handler_t detect_irq, void *data) 646 irq_handler_t detect_irq, void *data)
653{ 647{
654 int err; 648 return request_irq(IRQ_MAGICIAN_SD, detect_irq,
655
656 err = request_irq(IRQ_MAGICIAN_SD, detect_irq,
657 IRQF_DISABLED | IRQF_SAMPLE_RANDOM, 649 IRQF_DISABLED | IRQF_SAMPLE_RANDOM,
658 "MMC card detect", data); 650 "mmc card detect", data);
659 if (err)
660 goto err_request_irq;
661 err = gpio_request(EGPIO_MAGICIAN_SD_POWER, "SD_POWER");
662 if (err)
663 goto err_request_power;
664 err = gpio_request(EGPIO_MAGICIAN_nSD_READONLY, "nSD_READONLY");
665 if (err)
666 goto err_request_readonly;
667
668 return 0;
669
670err_request_readonly:
671 gpio_free(EGPIO_MAGICIAN_SD_POWER);
672err_request_power:
673 free_irq(IRQ_MAGICIAN_SD, data);
674err_request_irq:
675 return err;
676}
677
678static void magician_mci_setpower(struct device *dev, unsigned int vdd)
679{
680 struct pxamci_platform_data *pdata = dev->platform_data;
681
682 gpio_set_value(EGPIO_MAGICIAN_SD_POWER, (1 << vdd) & pdata->ocr_mask);
683}
684
685static int magician_mci_get_ro(struct device *dev)
686{
687 return (!gpio_get_value(EGPIO_MAGICIAN_nSD_READONLY));
688} 651}
689 652
690static void magician_mci_exit(struct device *dev, void *data) 653static void magician_mci_exit(struct device *dev, void *data)
691{ 654{
692 gpio_free(EGPIO_MAGICIAN_nSD_READONLY);
693 gpio_free(EGPIO_MAGICIAN_SD_POWER);
694 free_irq(IRQ_MAGICIAN_SD, data); 655 free_irq(IRQ_MAGICIAN_SD, data);
695} 656}
696 657
697static struct pxamci_platform_data magician_mci_info = { 658static struct pxamci_platform_data magician_mci_info = {
698 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, 659 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34,
699 .init = magician_mci_init, 660 .init = magician_mci_init,
700 .get_ro = magician_mci_get_ro, 661 .exit = magician_mci_exit,
701 .setpower = magician_mci_setpower, 662 .gpio_card_detect = -1,
702 .exit = magician_mci_exit, 663 .gpio_card_ro = EGPIO_MAGICIAN_nSD_READONLY,
664 .gpio_card_ro_invert = 1,
665 .gpio_power = EGPIO_MAGICIAN_SD_POWER,
703}; 666};
704 667
705 668
@@ -779,6 +742,10 @@ static void __init magician_init(void)
779 742
780 pxa2xx_mfp_config(ARRAY_AND_SIZE(magician_pin_config)); 743 pxa2xx_mfp_config(ARRAY_AND_SIZE(magician_pin_config));
781 744
745 pxa_set_ffuart_info(NULL);
746 pxa_set_btuart_info(NULL);
747 pxa_set_stuart_info(NULL);
748
782 platform_add_devices(ARRAY_AND_SIZE(devices)); 749 platform_add_devices(ARRAY_AND_SIZE(devices));
783 750
784 err = gpio_request(GPIO83_MAGICIAN_nIR_EN, "nIR_EN"); 751 err = gpio_request(GPIO83_MAGICIAN_nIR_EN, "nIR_EN");
diff --git a/arch/arm/mach-pxa/mainstone.c b/arch/arm/mach-pxa/mainstone.c
index f4dabf0273ca..851ee0fc32e2 100644
--- a/arch/arm/mach-pxa/mainstone.c
+++ b/arch/arm/mach-pxa/mainstone.c
@@ -450,10 +450,13 @@ static void mainstone_mci_exit(struct device *dev, void *data)
450} 450}
451 451
452static struct pxamci_platform_data mainstone_mci_platform_data = { 452static struct pxamci_platform_data mainstone_mci_platform_data = {
453 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, 453 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34,
454 .init = mainstone_mci_init, 454 .init = mainstone_mci_init,
455 .setpower = mainstone_mci_setpower, 455 .setpower = mainstone_mci_setpower,
456 .exit = mainstone_mci_exit, 456 .exit = mainstone_mci_exit,
457 .gpio_card_detect = -1,
458 .gpio_card_ro = -1,
459 .gpio_power = -1,
457}; 460};
458 461
459static void mainstone_irda_transceiver_mode(struct device *dev, int mode) 462static void mainstone_irda_transceiver_mode(struct device *dev, int mode)
@@ -476,8 +479,9 @@ static void mainstone_irda_transceiver_mode(struct device *dev, int mode)
476} 479}
477 480
478static struct pxaficp_platform_data mainstone_ficp_platform_data = { 481static struct pxaficp_platform_data mainstone_ficp_platform_data = {
479 .transceiver_cap = IR_SIRMODE | IR_FIRMODE | IR_OFF, 482 .gpio_pwdown = -1,
480 .transceiver_mode = mainstone_irda_transceiver_mode, 483 .transceiver_cap = IR_SIRMODE | IR_FIRMODE | IR_OFF,
484 .transceiver_mode = mainstone_irda_transceiver_mode,
481}; 485};
482 486
483static struct gpio_keys_button gpio_keys_button[] = { 487static struct gpio_keys_button gpio_keys_button[] = {
@@ -572,6 +576,10 @@ static void __init mainstone_init(void)
572 576
573 pxa2xx_mfp_config(ARRAY_AND_SIZE(mainstone_pin_config)); 577 pxa2xx_mfp_config(ARRAY_AND_SIZE(mainstone_pin_config));
574 578
579 pxa_set_ffuart_info(NULL);
580 pxa_set_btuart_info(NULL);
581 pxa_set_stuart_info(NULL);
582
575 mst_flash_data[0].width = (BOOT_DEF & 1) ? 2 : 4; 583 mst_flash_data[0].width = (BOOT_DEF & 1) ? 2 : 4;
576 mst_flash_data[1].width = 4; 584 mst_flash_data[1].width = 4;
577 585
diff --git a/arch/arm/mach-pxa/mioa701.c b/arch/arm/mach-pxa/mioa701.c
index 2d28132c725b..2466a44d8fda 100644
--- a/arch/arm/mach-pxa/mioa701.c
+++ b/arch/arm/mach-pxa/mioa701.c
@@ -434,72 +434,15 @@ struct gpio_vbus_mach_info gpio_vbus_data = {
434/* 434/*
435 * SDIO/MMC Card controller 435 * SDIO/MMC Card controller
436 */ 436 */
437static void mci_setpower(struct device *dev, unsigned int vdd)
438{
439 struct pxamci_platform_data *p_d = dev->platform_data;
440
441 if ((1 << vdd) & p_d->ocr_mask)
442 gpio_set_value(GPIO91_SDIO_EN, 1); /* enable SDIO power */
443 else
444 gpio_set_value(GPIO91_SDIO_EN, 0); /* disable SDIO power */
445}
446
447static int mci_get_ro(struct device *dev)
448{
449 return gpio_get_value(GPIO78_SDIO_RO);
450}
451
452struct gpio_ress mci_gpios[] = {
453 MIO_GPIO_IN(GPIO78_SDIO_RO, "SDIO readonly detect"),
454 MIO_GPIO_IN(GPIO15_SDIO_INSERT, "SDIO insertion detect"),
455 MIO_GPIO_OUT(GPIO91_SDIO_EN, 0, "SDIO power enable")
456};
457
458static void mci_exit(struct device *dev, void *data)
459{
460 mio_gpio_free(ARRAY_AND_SIZE(mci_gpios));
461 free_irq(gpio_to_irq(GPIO15_SDIO_INSERT), data);
462}
463
464static struct pxamci_platform_data mioa701_mci_info;
465
466/** 437/**
467 * The card detect interrupt isn't debounced so we delay it by 250ms 438 * The card detect interrupt isn't debounced so we delay it by 250ms
468 * to give the card a chance to fully insert/eject. 439 * to give the card a chance to fully insert/eject.
469 */ 440 */
470static int mci_init(struct device *dev, irq_handler_t detect_int, void *data)
471{
472 int rc;
473 int irq = gpio_to_irq(GPIO15_SDIO_INSERT);
474
475 rc = mio_gpio_request(ARRAY_AND_SIZE(mci_gpios));
476 if (rc)
477 goto err_gpio;
478 /* enable RE/FE interrupt on card insertion and removal */
479 rc = request_irq(irq, detect_int,
480 IRQF_DISABLED | IRQF_TRIGGER_RISING |
481 IRQF_TRIGGER_FALLING,
482 "MMC card detect", data);
483 if (rc)
484 goto err_irq;
485
486 mioa701_mci_info.detect_delay = msecs_to_jiffies(250);
487 return 0;
488
489err_irq:
490 dev_err(dev, "mioa701_mci_init: MMC/SD:"
491 " can't request MMC card detect IRQ\n");
492 mio_gpio_free(ARRAY_AND_SIZE(mci_gpios));
493err_gpio:
494 return rc;
495}
496
497static struct pxamci_platform_data mioa701_mci_info = { 441static struct pxamci_platform_data mioa701_mci_info = {
498 .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, 442 .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
499 .init = mci_init, 443 .gpio_card_detect = GPIO15_SDIO_INSERT,
500 .get_ro = mci_get_ro, 444 .gpio_card_ro = GPIO78_SDIO_RO,
501 .setpower = mci_setpower, 445 .gpio_power = GPIO91_SDIO_EN,
502 .exit = mci_exit,
503}; 446};
504 447
505/* FlashRAM */ 448/* FlashRAM */
@@ -765,19 +708,20 @@ static struct i2c_board_info __initdata mioa701_pi2c_devices[] = {
765 }, 708 },
766}; 709};
767 710
768static struct soc_camera_link iclink = {
769 .bus_id = 0, /* Must match id in pxa27x_device_camera in device.c */
770};
771
772/* Board I2C devices. */ 711/* Board I2C devices. */
773static struct i2c_board_info __initdata mioa701_i2c_devices[] = { 712static struct i2c_board_info __initdata mioa701_i2c_devices[] = {
774 { 713 {
775 /* Must initialize before the camera(s) */
776 I2C_BOARD_INFO("mt9m111", 0x5d), 714 I2C_BOARD_INFO("mt9m111", 0x5d),
777 .platform_data = &iclink,
778 }, 715 },
779}; 716};
780 717
718static struct soc_camera_link iclink = {
719 .bus_id = 0, /* Match id in pxa27x_device_camera in device.c */
720 .board_info = &mioa701_i2c_devices[0],
721 .i2c_adapter_id = 0,
722 .module_name = "mt9m111",
723};
724
781struct i2c_pxa_platform_data i2c_pdata = { 725struct i2c_pxa_platform_data i2c_pdata = {
782 .fast_mode = 1, 726 .fast_mode = 1,
783}; 727};
@@ -811,6 +755,7 @@ MIO_SIMPLE_DEV(pxa2xx_pcm, "pxa2xx-pcm", NULL)
811MIO_SIMPLE_DEV(mioa701_sound, "mioa701-wm9713", NULL) 755MIO_SIMPLE_DEV(mioa701_sound, "mioa701-wm9713", NULL)
812MIO_SIMPLE_DEV(mioa701_board, "mioa701-board", NULL) 756MIO_SIMPLE_DEV(mioa701_board, "mioa701-board", NULL)
813MIO_SIMPLE_DEV(gpio_vbus, "gpio-vbus", &gpio_vbus_data); 757MIO_SIMPLE_DEV(gpio_vbus, "gpio-vbus", &gpio_vbus_data);
758MIO_SIMPLE_DEV(mioa701_camera, "soc-camera-pdrv",&iclink);
814 759
815static struct platform_device *devices[] __initdata = { 760static struct platform_device *devices[] __initdata = {
816 &mioa701_gpio_keys, 761 &mioa701_gpio_keys,
@@ -821,6 +766,7 @@ static struct platform_device *devices[] __initdata = {
821 &power_dev, 766 &power_dev,
822 &strataflash, 767 &strataflash,
823 &gpio_vbus, 768 &gpio_vbus,
769 &mioa701_camera,
824 &mioa701_board, 770 &mioa701_board,
825}; 771};
826 772
@@ -841,7 +787,7 @@ static void mioa701_restart(char c, const char *cmd)
841static struct gpio_ress global_gpios[] = { 787static struct gpio_ress global_gpios[] = {
842 MIO_GPIO_OUT(GPIO9_CHARGE_EN, 1, "Charger enable"), 788 MIO_GPIO_OUT(GPIO9_CHARGE_EN, 1, "Charger enable"),
843 MIO_GPIO_OUT(GPIO18_POWEROFF, 0, "Power Off"), 789 MIO_GPIO_OUT(GPIO18_POWEROFF, 0, "Power Off"),
844 MIO_GPIO_OUT(GPIO87_LCD_POWER, 0, "LCD Power") 790 MIO_GPIO_OUT(GPIO87_LCD_POWER, 0, "LCD Power"),
845}; 791};
846 792
847static void __init mioa701_machine_init(void) 793static void __init mioa701_machine_init(void)
@@ -852,9 +798,13 @@ static void __init mioa701_machine_init(void)
852 UP2OCR = UP2OCR_HXOE; 798 UP2OCR = UP2OCR_HXOE;
853 799
854 pxa2xx_mfp_config(ARRAY_AND_SIZE(mioa701_pin_config)); 800 pxa2xx_mfp_config(ARRAY_AND_SIZE(mioa701_pin_config));
801 pxa_set_ffuart_info(NULL);
802 pxa_set_btuart_info(NULL);
803 pxa_set_stuart_info(NULL);
855 mio_gpio_request(ARRAY_AND_SIZE(global_gpios)); 804 mio_gpio_request(ARRAY_AND_SIZE(global_gpios));
856 bootstrap_init(); 805 bootstrap_init();
857 set_pxa_fb_info(&mioa701_pxafb_info); 806 set_pxa_fb_info(&mioa701_pxafb_info);
807 mioa701_mci_info.detect_delay = msecs_to_jiffies(250);
858 pxa_set_mci_info(&mioa701_mci_info); 808 pxa_set_mci_info(&mioa701_mci_info);
859 pxa_set_keypad_info(&mioa701_keypad_info); 809 pxa_set_keypad_info(&mioa701_keypad_info);
860 wm97xx_bat_set_pdata(&mioa701_battery_data); 810 wm97xx_bat_set_pdata(&mioa701_battery_data);
@@ -869,7 +819,6 @@ static void __init mioa701_machine_init(void)
869 pxa_set_i2c_info(&i2c_pdata); 819 pxa_set_i2c_info(&i2c_pdata);
870 pxa27x_set_i2c_power_info(NULL); 820 pxa27x_set_i2c_power_info(NULL);
871 pxa_set_camera_info(&mioa701_pxacamera_platform_data); 821 pxa_set_camera_info(&mioa701_pxacamera_platform_data);
872 i2c_register_board_info(0, ARRAY_AND_SIZE(mioa701_i2c_devices));
873} 822}
874 823
875static void mioa701_machine_exit(void) 824static void mioa701_machine_exit(void)
diff --git a/arch/arm/mach-pxa/mp900.c b/arch/arm/mach-pxa/mp900.c
index a65713ce019e..6d4503927a76 100644
--- a/arch/arm/mach-pxa/mp900.c
+++ b/arch/arm/mach-pxa/mp900.c
@@ -84,6 +84,9 @@ static struct platform_device *devices[] __initdata = {
84static void __init mp900c_init(void) 84static void __init mp900c_init(void)
85{ 85{
86 printk(KERN_INFO "MobilePro 900/C machine init\n"); 86 printk(KERN_INFO "MobilePro 900/C machine init\n");
87 pxa_set_ffuart_info(NULL);
88 pxa_set_btuart_info(NULL);
89 pxa_set_stuart_info(NULL);
87 platform_add_devices(devices, ARRAY_SIZE(devices)); 90 platform_add_devices(devices, ARRAY_SIZE(devices));
88} 91}
89 92
diff --git a/arch/arm/mach-pxa/palmld.c b/arch/arm/mach-pxa/palmld.c
index 169fcc18154e..59140217890a 100644
--- a/arch/arm/mach-pxa/palmld.c
+++ b/arch/arm/mach-pxa/palmld.c
@@ -25,6 +25,9 @@
25#include <linux/wm97xx_batt.h> 25#include <linux/wm97xx_batt.h>
26#include <linux/power_supply.h> 26#include <linux/power_supply.h>
27#include <linux/sysdev.h> 27#include <linux/sysdev.h>
28#include <linux/mtd/mtd.h>
29#include <linux/mtd/partitions.h>
30#include <linux/mtd/physmap.h>
28 31
29#include <asm/mach-types.h> 32#include <asm/mach-types.h>
30#include <asm/mach/arch.h> 33#include <asm/mach/arch.h>
@@ -141,85 +144,50 @@ static unsigned long palmld_pin_config[] __initdata = {
141}; 144};
142 145
143/****************************************************************************** 146/******************************************************************************
144 * SD/MMC card controller 147 * NOR Flash
145 ******************************************************************************/ 148 ******************************************************************************/
146static int palmld_mci_init(struct device *dev, irq_handler_t palmld_detect_int, 149static struct mtd_partition palmld_partitions[] = {
147 void *data) 150 {
148{ 151 .name = "Flash",
149 int err = 0; 152 .offset = 0x00000000,
150 153 .size = MTDPART_SIZ_FULL,
151 /* Setup an interrupt for detecting card insert/remove events */ 154 .mask_flags = 0
152 err = gpio_request(GPIO_NR_PALMLD_SD_DETECT_N, "SD IRQ");
153 if (err)
154 goto err;
155 err = gpio_direction_input(GPIO_NR_PALMLD_SD_DETECT_N);
156 if (err)
157 goto err2;
158 err = request_irq(gpio_to_irq(GPIO_NR_PALMLD_SD_DETECT_N),
159 palmld_detect_int, IRQF_DISABLED | IRQF_SAMPLE_RANDOM |
160 IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
161 "SD/MMC card detect", data);
162 if (err) {
163 printk(KERN_ERR "%s: cannot request SD/MMC card detect IRQ\n",
164 __func__);
165 goto err2;
166 } 155 }
156};
167 157
168 err = gpio_request(GPIO_NR_PALMLD_SD_POWER, "SD_POWER"); 158static struct physmap_flash_data palmld_flash_data[] = {
169 if (err) 159 {
170 goto err3; 160 .width = 2, /* bankwidth in bytes */
171 err = gpio_direction_output(GPIO_NR_PALMLD_SD_POWER, 0); 161 .parts = palmld_partitions,
172 if (err) 162 .nr_parts = ARRAY_SIZE(palmld_partitions)
173 goto err4; 163 }
174 164};
175 err = gpio_request(GPIO_NR_PALMLD_SD_READONLY, "SD_READONLY");
176 if (err)
177 goto err4;
178 err = gpio_direction_input(GPIO_NR_PALMLD_SD_READONLY);
179 if (err)
180 goto err5;
181
182 printk(KERN_DEBUG "%s: irq registered\n", __func__);
183
184 return 0;
185
186err5:
187 gpio_free(GPIO_NR_PALMLD_SD_READONLY);
188err4:
189 gpio_free(GPIO_NR_PALMLD_SD_POWER);
190err3:
191 free_irq(gpio_to_irq(GPIO_NR_PALMLD_SD_DETECT_N), data);
192err2:
193 gpio_free(GPIO_NR_PALMLD_SD_DETECT_N);
194err:
195 return err;
196}
197
198static void palmld_mci_exit(struct device *dev, void *data)
199{
200 gpio_free(GPIO_NR_PALMLD_SD_READONLY);
201 gpio_free(GPIO_NR_PALMLD_SD_POWER);
202 free_irq(gpio_to_irq(GPIO_NR_PALMLD_SD_DETECT_N), data);
203 gpio_free(GPIO_NR_PALMLD_SD_DETECT_N);
204}
205 165
206static void palmld_mci_power(struct device *dev, unsigned int vdd) 166static struct resource palmld_flash_resource = {
207{ 167 .start = PXA_CS0_PHYS,
208 struct pxamci_platform_data *p_d = dev->platform_data; 168 .end = PXA_CS0_PHYS + SZ_4M - 1,
209 gpio_set_value(GPIO_NR_PALMLD_SD_POWER, p_d->ocr_mask & (1 << vdd)); 169 .flags = IORESOURCE_MEM,
210} 170};
211 171
212static int palmld_mci_get_ro(struct device *dev) 172static struct platform_device palmld_flash = {
213{ 173 .name = "physmap-flash",
214 return gpio_get_value(GPIO_NR_PALMLD_SD_READONLY); 174 .id = 0,
215} 175 .resource = &palmld_flash_resource,
176 .num_resources = 1,
177 .dev = {
178 .platform_data = palmld_flash_data,
179 },
180};
216 181
182/******************************************************************************
183 * SD/MMC card controller
184 ******************************************************************************/
217static struct pxamci_platform_data palmld_mci_platform_data = { 185static struct pxamci_platform_data palmld_mci_platform_data = {
218 .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, 186 .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
219 .setpower = palmld_mci_power, 187 .gpio_card_detect = GPIO_NR_PALMLD_SD_DETECT_N,
220 .get_ro = palmld_mci_get_ro, 188 .gpio_card_ro = GPIO_NR_PALMLD_SD_READONLY,
221 .init = palmld_mci_init, 189 .gpio_power = GPIO_NR_PALMLD_SD_POWER,
222 .exit = palmld_mci_exit, 190 .detect_delay = 20,
223}; 191};
224 192
225/****************************************************************************** 193/******************************************************************************
@@ -336,35 +304,9 @@ static struct platform_device palmld_backlight = {
336/****************************************************************************** 304/******************************************************************************
337 * IrDA 305 * IrDA
338 ******************************************************************************/ 306 ******************************************************************************/
339static int palmld_irda_startup(struct device *dev)
340{
341 int err;
342 err = gpio_request(GPIO_NR_PALMLD_IR_DISABLE, "IR DISABLE");
343 if (err)
344 goto err;
345 err = gpio_direction_output(GPIO_NR_PALMLD_IR_DISABLE, 1);
346 if (err)
347 gpio_free(GPIO_NR_PALMLD_IR_DISABLE);
348err:
349 return err;
350}
351
352static void palmld_irda_shutdown(struct device *dev)
353{
354 gpio_free(GPIO_NR_PALMLD_IR_DISABLE);
355}
356
357static void palmld_irda_transceiver_mode(struct device *dev, int mode)
358{
359 gpio_set_value(GPIO_NR_PALMLD_IR_DISABLE, mode & IR_OFF);
360 pxa2xx_transceiver_mode(dev, mode);
361}
362
363static struct pxaficp_platform_data palmld_ficp_platform_data = { 307static struct pxaficp_platform_data palmld_ficp_platform_data = {
364 .startup = palmld_irda_startup, 308 .gpio_pwdown = GPIO_NR_PALMLD_IR_DISABLE,
365 .shutdown = palmld_irda_shutdown, 309 .transceiver_cap = IR_SIRMODE | IR_OFF,
366 .transceiver_cap = IR_SIRMODE | IR_FIRMODE | IR_OFF,
367 .transceiver_mode = palmld_irda_transceiver_mode,
368}; 310};
369 311
370/****************************************************************************** 312/******************************************************************************
@@ -560,6 +502,7 @@ static struct platform_device *devices[] __initdata = {
560 &power_supply, 502 &power_supply,
561 &palmld_asoc, 503 &palmld_asoc,
562 &palmld_hdd, 504 &palmld_hdd,
505 &palmld_flash,
563}; 506};
564 507
565static struct map_desc palmld_io_desc[] __initdata = { 508static struct map_desc palmld_io_desc[] __initdata = {
@@ -587,6 +530,10 @@ static void __init palmld_init(void)
587{ 530{
588 pxa2xx_mfp_config(ARRAY_AND_SIZE(palmld_pin_config)); 531 pxa2xx_mfp_config(ARRAY_AND_SIZE(palmld_pin_config));
589 532
533 pxa_set_ffuart_info(NULL);
534 pxa_set_btuart_info(NULL);
535 pxa_set_stuart_info(NULL);
536
590 palmld_pm_init(); 537 palmld_pm_init();
591 set_pxa_fb_info(&palmld_lcd_screen); 538 set_pxa_fb_info(&palmld_lcd_screen);
592 pxa_set_mci_info(&palmld_mci_platform_data); 539 pxa_set_mci_info(&palmld_mci_platform_data);
diff --git a/arch/arm/mach-pxa/palmt5.c b/arch/arm/mach-pxa/palmt5.c
index 33f726ff55e5..7f89ca20f13a 100644
--- a/arch/arm/mach-pxa/palmt5.c
+++ b/arch/arm/mach-pxa/palmt5.c
@@ -124,83 +124,12 @@ static unsigned long palmt5_pin_config[] __initdata = {
124/****************************************************************************** 124/******************************************************************************
125 * SD/MMC card controller 125 * SD/MMC card controller
126 ******************************************************************************/ 126 ******************************************************************************/
127static int palmt5_mci_init(struct device *dev, irq_handler_t palmt5_detect_int,
128 void *data)
129{
130 int err = 0;
131
132 /* Setup an interrupt for detecting card insert/remove events */
133 err = gpio_request(GPIO_NR_PALMT5_SD_DETECT_N, "SD IRQ");
134 if (err)
135 goto err;
136 err = gpio_direction_input(GPIO_NR_PALMT5_SD_DETECT_N);
137 if (err)
138 goto err2;
139 err = request_irq(gpio_to_irq(GPIO_NR_PALMT5_SD_DETECT_N),
140 palmt5_detect_int, IRQF_DISABLED | IRQF_SAMPLE_RANDOM |
141 IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
142 "SD/MMC card detect", data);
143 if (err) {
144 printk(KERN_ERR "%s: cannot request SD/MMC card detect IRQ\n",
145 __func__);
146 goto err2;
147 }
148
149 err = gpio_request(GPIO_NR_PALMT5_SD_POWER, "SD_POWER");
150 if (err)
151 goto err3;
152 err = gpio_direction_output(GPIO_NR_PALMT5_SD_POWER, 0);
153 if (err)
154 goto err4;
155
156 err = gpio_request(GPIO_NR_PALMT5_SD_READONLY, "SD_READONLY");
157 if (err)
158 goto err4;
159 err = gpio_direction_input(GPIO_NR_PALMT5_SD_READONLY);
160 if (err)
161 goto err5;
162
163 printk(KERN_DEBUG "%s: irq registered\n", __func__);
164
165 return 0;
166
167err5:
168 gpio_free(GPIO_NR_PALMT5_SD_READONLY);
169err4:
170 gpio_free(GPIO_NR_PALMT5_SD_POWER);
171err3:
172 free_irq(gpio_to_irq(GPIO_NR_PALMT5_SD_DETECT_N), data);
173err2:
174 gpio_free(GPIO_NR_PALMT5_SD_DETECT_N);
175err:
176 return err;
177}
178
179static void palmt5_mci_exit(struct device *dev, void *data)
180{
181 gpio_free(GPIO_NR_PALMT5_SD_READONLY);
182 gpio_free(GPIO_NR_PALMT5_SD_POWER);
183 free_irq(IRQ_GPIO_PALMT5_SD_DETECT_N, data);
184 gpio_free(GPIO_NR_PALMT5_SD_DETECT_N);
185}
186
187static void palmt5_mci_power(struct device *dev, unsigned int vdd)
188{
189 struct pxamci_platform_data *p_d = dev->platform_data;
190 gpio_set_value(GPIO_NR_PALMT5_SD_POWER, p_d->ocr_mask & (1 << vdd));
191}
192
193static int palmt5_mci_get_ro(struct device *dev)
194{
195 return gpio_get_value(GPIO_NR_PALMT5_SD_READONLY);
196}
197
198static struct pxamci_platform_data palmt5_mci_platform_data = { 127static struct pxamci_platform_data palmt5_mci_platform_data = {
199 .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, 128 .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
200 .setpower = palmt5_mci_power, 129 .gpio_card_detect = GPIO_NR_PALMT5_SD_DETECT_N,
201 .get_ro = palmt5_mci_get_ro, 130 .gpio_card_ro = GPIO_NR_PALMT5_SD_READONLY,
202 .init = palmt5_mci_init, 131 .gpio_power = GPIO_NR_PALMT5_SD_POWER,
203 .exit = palmt5_mci_exit, 132 .detect_delay = 20,
204}; 133};
205 134
206/****************************************************************************** 135/******************************************************************************
@@ -314,35 +243,9 @@ static struct platform_device palmt5_backlight = {
314/****************************************************************************** 243/******************************************************************************
315 * IrDA 244 * IrDA
316 ******************************************************************************/ 245 ******************************************************************************/
317static int palmt5_irda_startup(struct device *dev)
318{
319 int err;
320 err = gpio_request(GPIO_NR_PALMT5_IR_DISABLE, "IR DISABLE");
321 if (err)
322 goto err;
323 err = gpio_direction_output(GPIO_NR_PALMT5_IR_DISABLE, 1);
324 if (err)
325 gpio_free(GPIO_NR_PALMT5_IR_DISABLE);
326err:
327 return err;
328}
329
330static void palmt5_irda_shutdown(struct device *dev)
331{
332 gpio_free(GPIO_NR_PALMT5_IR_DISABLE);
333}
334
335static void palmt5_irda_transceiver_mode(struct device *dev, int mode)
336{
337 gpio_set_value(GPIO_NR_PALMT5_IR_DISABLE, mode & IR_OFF);
338 pxa2xx_transceiver_mode(dev, mode);
339}
340
341static struct pxaficp_platform_data palmt5_ficp_platform_data = { 246static struct pxaficp_platform_data palmt5_ficp_platform_data = {
342 .startup = palmt5_irda_startup, 247 .gpio_pwdown = GPIO_NR_PALMT5_IR_DISABLE,
343 .shutdown = palmt5_irda_shutdown, 248 .transceiver_cap = IR_SIRMODE | IR_OFF,
344 .transceiver_cap = IR_SIRMODE | IR_FIRMODE | IR_OFF,
345 .transceiver_mode = palmt5_irda_transceiver_mode,
346}; 249};
347 250
348/****************************************************************************** 251/******************************************************************************
@@ -516,6 +419,10 @@ static void __init palmt5_init(void)
516{ 419{
517 pxa2xx_mfp_config(ARRAY_AND_SIZE(palmt5_pin_config)); 420 pxa2xx_mfp_config(ARRAY_AND_SIZE(palmt5_pin_config));
518 421
422 pxa_set_ffuart_info(NULL);
423 pxa_set_btuart_info(NULL);
424 pxa_set_stuart_info(NULL);
425
519 palmt5_pm_init(); 426 palmt5_pm_init();
520 set_pxa_fb_info(&palmt5_lcd_screen); 427 set_pxa_fb_info(&palmt5_lcd_screen);
521 pxa_set_mci_info(&palmt5_mci_platform_data); 428 pxa_set_mci_info(&palmt5_mci_platform_data);
diff --git a/arch/arm/mach-pxa/palmtc.c b/arch/arm/mach-pxa/palmtc.c
new file mode 100644
index 000000000000..308417592007
--- /dev/null
+++ b/arch/arm/mach-pxa/palmtc.c
@@ -0,0 +1,441 @@
1/*
2 * linux/arch/arm/mach-pxa/palmtc.c
3 *
4 * Support for the Palm Tungsten|C
5 *
6 * Author: Marek Vasut <marek.vasut@gmail.com>
7 *
8 * Based on work of:
9 * Petr Blaha <p3t3@centrum.cz>
10 * Chetan S. Kumar <shivakumar.chetan@gmail.com>
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License version 2 as
14 * published by the Free Software Foundation.
15 */
16
17#include <linux/platform_device.h>
18#include <linux/delay.h>
19#include <linux/irq.h>
20#include <linux/input.h>
21#include <linux/pwm_backlight.h>
22#include <linux/gpio.h>
23#include <linux/input/matrix_keypad.h>
24#include <linux/ucb1400.h>
25#include <linux/power_supply.h>
26#include <linux/gpio_keys.h>
27#include <linux/mtd/physmap.h>
28
29#include <asm/mach-types.h>
30#include <asm/mach/arch.h>
31#include <asm/mach/map.h>
32
33#include <mach/audio.h>
34#include <mach/palmtc.h>
35#include <mach/mmc.h>
36#include <mach/pxafb.h>
37#include <mach/mfp-pxa25x.h>
38#include <mach/irda.h>
39#include <mach/udc.h>
40#include <mach/pxa2xx-regs.h>
41
42#include "generic.h"
43#include "devices.h"
44
45/******************************************************************************
46 * Pin configuration
47 ******************************************************************************/
48static unsigned long palmtc_pin_config[] __initdata = {
49 /* MMC */
50 GPIO6_MMC_CLK,
51 GPIO8_MMC_CS0,
52 GPIO12_GPIO, /* detect */
53 GPIO32_GPIO, /* power */
54 GPIO54_GPIO, /* r/o switch */
55
56 /* PCMCIA */
57 GPIO52_nPCE_1,
58 GPIO53_nPCE_2,
59 GPIO50_nPIOR,
60 GPIO51_nPIOW,
61 GPIO49_nPWE,
62 GPIO48_nPOE,
63 GPIO52_nPCE_1,
64 GPIO53_nPCE_2,
65 GPIO57_nIOIS16,
66 GPIO56_nPWAIT,
67
68 /* AC97 */
69 GPIO28_AC97_BITCLK,
70 GPIO29_AC97_SDATA_IN_0,
71 GPIO30_AC97_SDATA_OUT,
72 GPIO31_AC97_SYNC,
73
74 /* IrDA */
75 GPIO45_GPIO, /* ir disable */
76 GPIO46_FICP_RXD,
77 GPIO47_FICP_TXD,
78
79 /* PWM */
80 GPIO17_PWM1_OUT,
81
82 /* USB */
83 GPIO4_GPIO, /* detect */
84 GPIO36_GPIO, /* pullup */
85
86 /* LCD */
87 GPIO58_LCD_LDD_0,
88 GPIO59_LCD_LDD_1,
89 GPIO60_LCD_LDD_2,
90 GPIO61_LCD_LDD_3,
91 GPIO62_LCD_LDD_4,
92 GPIO63_LCD_LDD_5,
93 GPIO64_LCD_LDD_6,
94 GPIO65_LCD_LDD_7,
95 GPIO66_LCD_LDD_8,
96 GPIO67_LCD_LDD_9,
97 GPIO68_LCD_LDD_10,
98 GPIO69_LCD_LDD_11,
99 GPIO70_LCD_LDD_12,
100 GPIO71_LCD_LDD_13,
101 GPIO72_LCD_LDD_14,
102 GPIO73_LCD_LDD_15,
103 GPIO74_LCD_FCLK,
104 GPIO75_LCD_LCLK,
105 GPIO76_LCD_PCLK,
106 GPIO77_LCD_BIAS,
107
108 /* MATRIX KEYPAD */
109 GPIO0_GPIO | WAKEUP_ON_EDGE_BOTH, /* in 0 */
110 GPIO9_GPIO | WAKEUP_ON_EDGE_BOTH, /* in 1 */
111 GPIO10_GPIO | WAKEUP_ON_EDGE_BOTH, /* in 2 */
112 GPIO11_GPIO | WAKEUP_ON_EDGE_BOTH, /* in 3 */
113 GPIO18_GPIO | MFP_LPM_DRIVE_LOW, /* out 0 */
114 GPIO19_GPIO | MFP_LPM_DRIVE_LOW, /* out 1 */
115 GPIO20_GPIO | MFP_LPM_DRIVE_LOW, /* out 2 */
116 GPIO21_GPIO | MFP_LPM_DRIVE_LOW, /* out 3 */
117 GPIO22_GPIO | MFP_LPM_DRIVE_LOW, /* out 4 */
118 GPIO23_GPIO | MFP_LPM_DRIVE_LOW, /* out 5 */
119 GPIO24_GPIO | MFP_LPM_DRIVE_LOW, /* out 6 */
120 GPIO25_GPIO | MFP_LPM_DRIVE_LOW, /* out 7 */
121 GPIO26_GPIO | MFP_LPM_DRIVE_LOW, /* out 8 */
122 GPIO27_GPIO | MFP_LPM_DRIVE_LOW, /* out 9 */
123 GPIO79_GPIO | MFP_LPM_DRIVE_LOW, /* out 10 */
124 GPIO80_GPIO | MFP_LPM_DRIVE_LOW, /* out 11 */
125
126 /* PXA GPIO KEYS */
127 GPIO7_GPIO | WAKEUP_ON_EDGE_BOTH, /* hotsync button on cradle */
128
129 /* MISC */
130 GPIO1_RST, /* reset */
131 GPIO2_GPIO, /* earphone detect */
132 GPIO16_GPIO, /* backlight switch */
133};
134
135/******************************************************************************
136 * SD/MMC card controller
137 ******************************************************************************/
138static struct pxamci_platform_data palmtc_mci_platform_data = {
139 .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
140 .gpio_power = GPIO_NR_PALMTC_SD_POWER,
141 .gpio_card_ro = GPIO_NR_PALMTC_SD_READONLY,
142 .gpio_card_detect = GPIO_NR_PALMTC_SD_DETECT_N,
143 .detect_delay = 20,
144};
145
146/******************************************************************************
147 * GPIO keys
148 ******************************************************************************/
149static struct gpio_keys_button palmtc_pxa_buttons[] = {
150 {KEY_F8, GPIO_NR_PALMTC_HOTSYNC_BUTTON, 1, "HotSync Button", EV_KEY, 1},
151};
152
153static struct gpio_keys_platform_data palmtc_pxa_keys_data = {
154 .buttons = palmtc_pxa_buttons,
155 .nbuttons = ARRAY_SIZE(palmtc_pxa_buttons),
156};
157
158static struct platform_device palmtc_pxa_keys = {
159 .name = "gpio-keys",
160 .id = -1,
161 .dev = {
162 .platform_data = &palmtc_pxa_keys_data,
163 },
164};
165
166/******************************************************************************
167 * Backlight
168 ******************************************************************************/
169static int palmtc_backlight_init(struct device *dev)
170{
171 int ret;
172
173 ret = gpio_request(GPIO_NR_PALMTC_BL_POWER, "BL POWER");
174 if (ret)
175 goto err;
176 ret = gpio_direction_output(GPIO_NR_PALMTC_BL_POWER, 1);
177 if (ret)
178 goto err2;
179
180 return 0;
181
182err2:
183 gpio_free(GPIO_NR_PALMTC_BL_POWER);
184err:
185 return ret;
186}
187
188static int palmtc_backlight_notify(int brightness)
189{
190 /* backlight is on when GPIO16 AF0 is high */
191 gpio_set_value(GPIO_NR_PALMTC_BL_POWER, brightness);
192 return brightness;
193}
194
195static void palmtc_backlight_exit(struct device *dev)
196{
197 gpio_free(GPIO_NR_PALMTC_BL_POWER);
198}
199
200static struct platform_pwm_backlight_data palmtc_backlight_data = {
201 .pwm_id = 1,
202 .max_brightness = PALMTC_MAX_INTENSITY,
203 .dft_brightness = PALMTC_MAX_INTENSITY,
204 .pwm_period_ns = PALMTC_PERIOD_NS,
205 .init = palmtc_backlight_init,
206 .notify = palmtc_backlight_notify,
207 .exit = palmtc_backlight_exit,
208};
209
210static struct platform_device palmtc_backlight = {
211 .name = "pwm-backlight",
212 .dev = {
213 .parent = &pxa25x_device_pwm1.dev,
214 .platform_data = &palmtc_backlight_data,
215 },
216};
217
218/******************************************************************************
219 * IrDA
220 ******************************************************************************/
221static struct pxaficp_platform_data palmtc_ficp_platform_data = {
222 .gpio_pwdown = GPIO_NR_PALMTC_IR_DISABLE,
223 .transceiver_cap = IR_SIRMODE | IR_OFF,
224};
225
226/******************************************************************************
227 * Keyboard
228 ******************************************************************************/
229static const uint32_t palmtc_matrix_keys[] = {
230 KEY(0, 0, KEY_F1),
231 KEY(0, 1, KEY_X),
232 KEY(0, 2, KEY_POWER),
233 KEY(0, 3, KEY_TAB),
234 KEY(0, 4, KEY_A),
235 KEY(0, 5, KEY_Q),
236 KEY(0, 6, KEY_LEFTSHIFT),
237 KEY(0, 7, KEY_Z),
238 KEY(0, 8, KEY_S),
239 KEY(0, 9, KEY_W),
240 KEY(0, 10, KEY_E),
241 KEY(0, 11, KEY_UP),
242
243 KEY(1, 0, KEY_F2),
244 KEY(1, 1, KEY_DOWN),
245 KEY(1, 3, KEY_D),
246 KEY(1, 4, KEY_C),
247 KEY(1, 5, KEY_F),
248 KEY(1, 6, KEY_R),
249 KEY(1, 7, KEY_SPACE),
250 KEY(1, 8, KEY_V),
251 KEY(1, 9, KEY_G),
252 KEY(1, 10, KEY_T),
253 KEY(1, 11, KEY_LEFT),
254
255 KEY(2, 0, KEY_F3),
256 KEY(2, 1, KEY_LEFTCTRL),
257 KEY(2, 3, KEY_H),
258 KEY(2, 4, KEY_Y),
259 KEY(2, 5, KEY_N),
260 KEY(2, 6, KEY_J),
261 KEY(2, 7, KEY_U),
262 KEY(2, 8, KEY_M),
263 KEY(2, 9, KEY_K),
264 KEY(2, 10, KEY_I),
265 KEY(2, 11, KEY_RIGHT),
266
267 KEY(3, 0, KEY_F4),
268 KEY(3, 1, KEY_ENTER),
269 KEY(3, 3, KEY_DOT),
270 KEY(3, 4, KEY_L),
271 KEY(3, 5, KEY_O),
272 KEY(3, 6, KEY_LEFTALT),
273 KEY(3, 7, KEY_ENTER),
274 KEY(3, 8, KEY_BACKSPACE),
275 KEY(3, 9, KEY_P),
276 KEY(3, 10, KEY_B),
277 KEY(3, 11, KEY_FN),
278};
279
280const struct matrix_keymap_data palmtc_keymap_data = {
281 .keymap = palmtc_matrix_keys,
282 .keymap_size = ARRAY_SIZE(palmtc_matrix_keys),
283};
284
285const static unsigned int palmtc_keypad_row_gpios[] = {
286 0, 9, 10, 11
287};
288
289const static unsigned int palmtc_keypad_col_gpios[] = {
290 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 79, 80
291};
292
293static struct matrix_keypad_platform_data palmtc_keypad_platform_data = {
294 .keymap_data = &palmtc_keymap_data,
295 .row_gpios = palmtc_keypad_row_gpios,
296 .num_row_gpios = ARRAY_SIZE(palmtc_keypad_row_gpios),
297 .col_gpios = palmtc_keypad_col_gpios,
298 .num_col_gpios = ARRAY_SIZE(palmtc_keypad_col_gpios),
299 .active_low = 1,
300
301 .debounce_ms = 20,
302 .col_scan_delay_us = 5,
303};
304
305static struct platform_device palmtc_keyboard = {
306 .name = "matrix-keypad",
307 .id = -1,
308 .dev = {
309 .platform_data = &palmtc_keypad_platform_data,
310 },
311};
312
313/******************************************************************************
314 * UDC
315 ******************************************************************************/
316static struct pxa2xx_udc_mach_info palmtc_udc_info __initdata = {
317 .gpio_vbus = GPIO_NR_PALMTC_USB_DETECT_N,
318 .gpio_vbus_inverted = 1,
319 .gpio_pullup = GPIO_NR_PALMTC_USB_POWER,
320};
321
322/******************************************************************************
323 * Touchscreen / Battery / GPIO-extender
324 ******************************************************************************/
325static struct platform_device palmtc_ucb1400_core = {
326 .name = "ucb1400_core",
327 .id = -1,
328};
329
330/******************************************************************************
331 * NOR Flash
332 ******************************************************************************/
333static struct resource palmtc_flash_resource = {
334 .start = PXA_CS0_PHYS,
335 .end = PXA_CS0_PHYS + SZ_16M - 1,
336 .flags = IORESOURCE_MEM,
337};
338
339static struct mtd_partition palmtc_flash_parts[] = {
340 {
341 .name = "U-Boot Bootloader",
342 .offset = 0x0,
343 .size = 0x40000,
344 },
345 {
346 .name = "Linux Kernel",
347 .offset = 0x40000,
348 .size = 0x2c0000,
349 },
350 {
351 .name = "Filesystem",
352 .offset = 0x300000,
353 .size = 0xcc0000,
354 },
355 {
356 .name = "U-Boot Environment",
357 .offset = 0xfc0000,
358 .size = MTDPART_SIZ_FULL,
359 },
360};
361
362static struct physmap_flash_data palmtc_flash_data = {
363 .width = 4,
364 .parts = palmtc_flash_parts,
365 .nr_parts = ARRAY_SIZE(palmtc_flash_parts),
366};
367
368static struct platform_device palmtc_flash = {
369 .name = "physmap-flash",
370 .id = -1,
371 .resource = &palmtc_flash_resource,
372 .num_resources = 1,
373 .dev = {
374 .platform_data = &palmtc_flash_data,
375 },
376};
377
378/******************************************************************************
379 * Framebuffer
380 ******************************************************************************/
381static struct pxafb_mode_info palmtc_lcd_modes[] = {
382{
383 .pixclock = 115384,
384 .xres = 320,
385 .yres = 320,
386 .bpp = 16,
387
388 .left_margin = 27,
389 .right_margin = 7,
390 .upper_margin = 7,
391 .lower_margin = 8,
392
393 .hsync_len = 6,
394 .vsync_len = 1,
395},
396};
397
398static struct pxafb_mach_info palmtc_lcd_screen = {
399 .modes = palmtc_lcd_modes,
400 .num_modes = ARRAY_SIZE(palmtc_lcd_modes),
401 .lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
402};
403
404/******************************************************************************
405 * Machine init
406 ******************************************************************************/
407static struct platform_device *devices[] __initdata = {
408 &palmtc_backlight,
409 &palmtc_ucb1400_core,
410 &palmtc_keyboard,
411 &palmtc_pxa_keys,
412 &palmtc_flash,
413};
414
415static void __init palmtc_init(void)
416{
417 pxa2xx_mfp_config(ARRAY_AND_SIZE(palmtc_pin_config));
418
419 pxa_set_ffuart_info(NULL);
420 pxa_set_btuart_info(NULL);
421 pxa_set_stuart_info(NULL);
422 pxa_set_hwuart_info(NULL);
423
424 set_pxa_fb_info(&palmtc_lcd_screen);
425 pxa_set_mci_info(&palmtc_mci_platform_data);
426 pxa_set_udc_info(&palmtc_udc_info);
427 pxa_set_ac97_info(NULL);
428 pxa_set_ficp_info(&palmtc_ficp_platform_data);
429
430 platform_add_devices(devices, ARRAY_SIZE(devices));
431};
432
433MACHINE_START(PALMTC, "Palm Tungsten|C")
434 .phys_io = 0x40000000,
435 .boot_params = 0xa0000100,
436 .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
437 .map_io = pxa_map_io,
438 .init_irq = pxa25x_init_irq,
439 .timer = &pxa_timer,
440 .init_machine = palmtc_init
441MACHINE_END
diff --git a/arch/arm/mach-pxa/palmte2.c b/arch/arm/mach-pxa/palmte2.c
index d823b09801df..265d62bae7de 100644
--- a/arch/arm/mach-pxa/palmte2.c
+++ b/arch/arm/mach-pxa/palmte2.c
@@ -117,83 +117,11 @@ static unsigned long palmte2_pin_config[] __initdata = {
117/****************************************************************************** 117/******************************************************************************
118 * SD/MMC card controller 118 * SD/MMC card controller
119 ******************************************************************************/ 119 ******************************************************************************/
120static int palmte2_mci_init(struct device *dev,
121 irq_handler_t palmte2_detect_int, void *data)
122{
123 int err = 0;
124
125 /* Setup an interrupt for detecting card insert/remove events */
126 err = gpio_request(GPIO_NR_PALMTE2_SD_DETECT_N, "SD IRQ");
127 if (err)
128 goto err;
129 err = gpio_direction_input(GPIO_NR_PALMTE2_SD_DETECT_N);
130 if (err)
131 goto err2;
132 err = request_irq(gpio_to_irq(GPIO_NR_PALMTE2_SD_DETECT_N),
133 palmte2_detect_int, IRQF_DISABLED | IRQF_SAMPLE_RANDOM |
134 IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
135 "SD/MMC card detect", data);
136 if (err) {
137 printk(KERN_ERR "%s: cannot request SD/MMC card detect IRQ\n",
138 __func__);
139 goto err2;
140 }
141
142 err = gpio_request(GPIO_NR_PALMTE2_SD_POWER, "SD_POWER");
143 if (err)
144 goto err3;
145 err = gpio_direction_output(GPIO_NR_PALMTE2_SD_POWER, 0);
146 if (err)
147 goto err4;
148
149 err = gpio_request(GPIO_NR_PALMTE2_SD_READONLY, "SD_READONLY");
150 if (err)
151 goto err4;
152 err = gpio_direction_input(GPIO_NR_PALMTE2_SD_READONLY);
153 if (err)
154 goto err5;
155
156 printk(KERN_DEBUG "%s: irq registered\n", __func__);
157
158 return 0;
159
160err5:
161 gpio_free(GPIO_NR_PALMTE2_SD_READONLY);
162err4:
163 gpio_free(GPIO_NR_PALMTE2_SD_POWER);
164err3:
165 free_irq(gpio_to_irq(GPIO_NR_PALMTE2_SD_DETECT_N), data);
166err2:
167 gpio_free(GPIO_NR_PALMTE2_SD_DETECT_N);
168err:
169 return err;
170}
171
172static void palmte2_mci_exit(struct device *dev, void *data)
173{
174 gpio_free(GPIO_NR_PALMTE2_SD_READONLY);
175 gpio_free(GPIO_NR_PALMTE2_SD_POWER);
176 free_irq(gpio_to_irq(GPIO_NR_PALMTE2_SD_DETECT_N), data);
177 gpio_free(GPIO_NR_PALMTE2_SD_DETECT_N);
178}
179
180static void palmte2_mci_power(struct device *dev, unsigned int vdd)
181{
182 struct pxamci_platform_data *p_d = dev->platform_data;
183 gpio_set_value(GPIO_NR_PALMTE2_SD_POWER, p_d->ocr_mask & (1 << vdd));
184}
185
186static int palmte2_mci_get_ro(struct device *dev)
187{
188 return gpio_get_value(GPIO_NR_PALMTE2_SD_READONLY);
189}
190
191static struct pxamci_platform_data palmte2_mci_platform_data = { 120static struct pxamci_platform_data palmte2_mci_platform_data = {
192 .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, 121 .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
193 .setpower = palmte2_mci_power, 122 .gpio_card_detect = GPIO_NR_PALMTE2_SD_DETECT_N,
194 .get_ro = palmte2_mci_get_ro, 123 .gpio_card_ro = GPIO_NR_PALMTE2_SD_READONLY,
195 .init = palmte2_mci_init, 124 .gpio_power = GPIO_NR_PALMTE2_SD_POWER,
196 .exit = palmte2_mci_exit,
197}; 125};
198 126
199/****************************************************************************** 127/******************************************************************************
@@ -287,35 +215,9 @@ static struct platform_device palmte2_backlight = {
287/****************************************************************************** 215/******************************************************************************
288 * IrDA 216 * IrDA
289 ******************************************************************************/ 217 ******************************************************************************/
290static int palmte2_irda_startup(struct device *dev)
291{
292 int err;
293 err = gpio_request(GPIO_NR_PALMTE2_IR_DISABLE, "IR DISABLE");
294 if (err)
295 goto err;
296 err = gpio_direction_output(GPIO_NR_PALMTE2_IR_DISABLE, 1);
297 if (err)
298 gpio_free(GPIO_NR_PALMTE2_IR_DISABLE);
299err:
300 return err;
301}
302
303static void palmte2_irda_shutdown(struct device *dev)
304{
305 gpio_free(GPIO_NR_PALMTE2_IR_DISABLE);
306}
307
308static void palmte2_irda_transceiver_mode(struct device *dev, int mode)
309{
310 gpio_set_value(GPIO_NR_PALMTE2_IR_DISABLE, mode & IR_OFF);
311 pxa2xx_transceiver_mode(dev, mode);
312}
313
314static struct pxaficp_platform_data palmte2_ficp_platform_data = { 218static struct pxaficp_platform_data palmte2_ficp_platform_data = {
315 .startup = palmte2_irda_startup, 219 .gpio_pwdown = GPIO_NR_PALMTE2_IR_DISABLE,
316 .shutdown = palmte2_irda_shutdown, 220 .transceiver_cap = IR_SIRMODE | IR_OFF,
317 .transceiver_cap = IR_SIRMODE | IR_FIRMODE | IR_OFF,
318 .transceiver_mode = palmte2_irda_transceiver_mode,
319}; 221};
320 222
321/****************************************************************************** 223/******************************************************************************
@@ -471,6 +373,10 @@ static void __init palmte2_init(void)
471{ 373{
472 pxa2xx_mfp_config(ARRAY_AND_SIZE(palmte2_pin_config)); 374 pxa2xx_mfp_config(ARRAY_AND_SIZE(palmte2_pin_config));
473 375
376 pxa_set_ffuart_info(NULL);
377 pxa_set_btuart_info(NULL);
378 pxa_set_stuart_info(NULL);
379
474 set_pxa_fb_info(&palmte2_lcd_screen); 380 set_pxa_fb_info(&palmte2_lcd_screen);
475 pxa_set_mci_info(&palmte2_mci_platform_data); 381 pxa_set_mci_info(&palmte2_mci_platform_data);
476 palmte2_udc_init(); 382 palmte2_udc_init();
diff --git a/arch/arm/mach-pxa/treo680.c b/arch/arm/mach-pxa/palmtreo.c
index 753ec4df17b9..606eb7e8a17e 100644
--- a/arch/arm/mach-pxa/treo680.c
+++ b/arch/arm/mach-pxa/palmtreo.c
@@ -1,5 +1,9 @@
1/* 1/*
2 * Hardware definitions for Palm Treo 680 2 * Hardware definitions for Palm Treo smartphones
3 *
4 * currently supported:
5 * Palm Treo 680 (GSM)
6 * Palm Centro 685 (GSM)
3 * 7 *
4 * Author: Tomas Cech <sleep_walker@suse.cz> 8 * Author: Tomas Cech <sleep_walker@suse.cz>
5 * 9 *
@@ -31,7 +35,7 @@
31#include <mach/pxa27x.h> 35#include <mach/pxa27x.h>
32#include <mach/pxa27x-udc.h> 36#include <mach/pxa27x-udc.h>
33#include <mach/audio.h> 37#include <mach/audio.h>
34#include <mach/treo680.h> 38#include <mach/palmtreo.h>
35#include <mach/mmc.h> 39#include <mach/mmc.h>
36#include <mach/pxafb.h> 40#include <mach/pxafb.h>
37#include <mach/irda.h> 41#include <mach/irda.h>
@@ -50,7 +54,7 @@
50/****************************************************************************** 54/******************************************************************************
51 * Pin configuration 55 * Pin configuration
52 ******************************************************************************/ 56 ******************************************************************************/
53static unsigned long treo680_pin_config[] __initdata = { 57static unsigned long treo_pin_config[] __initdata = {
54 /* MMC */ 58 /* MMC */
55 GPIO32_MMC_CLK, 59 GPIO32_MMC_CLK,
56 GPIO92_MMC_DAT_0, 60 GPIO92_MMC_DAT_0,
@@ -58,7 +62,6 @@ static unsigned long treo680_pin_config[] __initdata = {
58 GPIO110_MMC_DAT_2, 62 GPIO110_MMC_DAT_2,
59 GPIO111_MMC_DAT_3, 63 GPIO111_MMC_DAT_3,
60 GPIO112_MMC_CMD, 64 GPIO112_MMC_CMD,
61 GPIO33_GPIO, /* SD read only */
62 GPIO113_GPIO, /* SD detect */ 65 GPIO113_GPIO, /* SD detect */
63 66
64 /* AC97 */ 67 /* AC97 */
@@ -80,12 +83,10 @@ static unsigned long treo680_pin_config[] __initdata = {
80 GPIO1_GPIO | WAKEUP_ON_EDGE_BOTH, /* usb detect */ 83 GPIO1_GPIO | WAKEUP_ON_EDGE_BOTH, /* usb detect */
81 84
82 /* MATRIX KEYPAD */ 85 /* MATRIX KEYPAD */
83 GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH,
84 GPIO101_KP_MKIN_1, 86 GPIO101_KP_MKIN_1,
85 GPIO102_KP_MKIN_2, 87 GPIO102_KP_MKIN_2,
86 GPIO97_KP_MKIN_3, 88 GPIO97_KP_MKIN_3,
87 GPIO98_KP_MKIN_4, 89 GPIO98_KP_MKIN_4,
88 GPIO99_KP_MKIN_5,
89 GPIO91_KP_MKIN_6, 90 GPIO91_KP_MKIN_6,
90 GPIO13_KP_MKIN_7, 91 GPIO13_KP_MKIN_7,
91 GPIO103_KP_MKOUT_0 | MFP_LPM_DRIVE_HIGH, 92 GPIO103_KP_MKOUT_0 | MFP_LPM_DRIVE_HIGH,
@@ -150,95 +151,57 @@ static unsigned long treo680_pin_config[] __initdata = {
150 GPIO11_GPIO | WAKEUP_ON_EDGE_BOTH, /* bluetooth host wake up */ 151 GPIO11_GPIO | WAKEUP_ON_EDGE_BOTH, /* bluetooth host wake up */
151}; 152};
152 153
154#ifdef CONFIG_MACH_TREO680
155static unsigned long treo680_pin_config[] __initdata = {
156 GPIO33_GPIO, /* SD read only */
157
158 /* MATRIX KEYPAD - different wake up source */
159 GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH,
160 GPIO99_KP_MKIN_5,
161};
162#endif /* CONFIG_MACH_TREO680 */
163
164#ifdef CONFIG_MACH_CENTRO
165static unsigned long centro685_pin_config[] __initdata = {
166 /* Bluetooth attached to BT UART*/
167 MFP_CFG_OUT(GPIO80, AF0, DRIVE_LOW), /* power: LOW = off */
168 GPIO42_BTUART_RXD,
169 GPIO43_BTUART_TXD,
170 GPIO44_BTUART_CTS,
171 GPIO45_BTUART_RTS,
172
173 /* MATRIX KEYPAD - different wake up source */
174 GPIO100_KP_MKIN_0,
175 GPIO99_KP_MKIN_5 | WAKEUP_ON_LEVEL_HIGH,
176};
177#endif /* CONFIG_MACH_CENTRO */
178
153/****************************************************************************** 179/******************************************************************************
154 * SD/MMC card controller 180 * SD/MMC card controller
155 ******************************************************************************/ 181 ******************************************************************************/
156static int treo680_mci_init(struct device *dev, 182#ifdef CONFIG_MACH_TREO680
157 irq_handler_t treo680_detect_int, void *data)
158{
159 int err = 0;
160
161 /* Setup an interrupt for detecting card insert/remove events */
162 err = gpio_request(GPIO_NR_TREO680_SD_DETECT_N, "SD IRQ");
163
164 if (err)
165 goto err;
166
167 err = gpio_direction_input(GPIO_NR_TREO680_SD_DETECT_N);
168 if (err)
169 goto err2;
170
171 err = request_irq(gpio_to_irq(GPIO_NR_TREO680_SD_DETECT_N),
172 treo680_detect_int, IRQF_DISABLED | IRQF_SAMPLE_RANDOM |
173 IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
174 "SD/MMC card detect", data);
175
176 if (err) {
177 dev_err(dev, "%s: cannot request SD/MMC card detect IRQ\n",
178 __func__);
179 goto err2;
180 }
181
182 err = gpio_request(GPIO_NR_TREO680_SD_POWER, "SD_POWER");
183 if (err)
184 goto err3;
185
186 err = gpio_direction_output(GPIO_NR_TREO680_SD_POWER, 1);
187 if (err)
188 goto err4;
189
190 err = gpio_request(GPIO_NR_TREO680_SD_READONLY, "SD_READONLY");
191 if (err)
192 goto err4;
193
194 err = gpio_direction_input(GPIO_NR_TREO680_SD_READONLY);
195 if (err)
196 goto err5;
197
198 return 0;
199
200err5:
201 gpio_free(GPIO_NR_TREO680_SD_READONLY);
202err4:
203 gpio_free(GPIO_NR_TREO680_SD_POWER);
204err3:
205 free_irq(gpio_to_irq(GPIO_NR_TREO680_SD_DETECT_N), data);
206err2:
207 gpio_free(GPIO_NR_TREO680_SD_DETECT_N);
208err:
209 return err;
210}
211
212static void treo680_mci_exit(struct device *dev, void *data)
213{
214 gpio_free(GPIO_NR_TREO680_SD_READONLY);
215 gpio_free(GPIO_NR_TREO680_SD_POWER);
216 free_irq(gpio_to_irq(GPIO_NR_TREO680_SD_DETECT_N), data);
217 gpio_free(GPIO_NR_TREO680_SD_DETECT_N);
218}
219
220static void treo680_mci_power(struct device *dev, unsigned int vdd)
221{
222 struct pxamci_platform_data *p_d = dev->platform_data;
223 gpio_set_value(GPIO_NR_TREO680_SD_POWER, p_d->ocr_mask & (1 << vdd));
224}
225
226static int treo680_mci_get_ro(struct device *dev)
227{
228 return gpio_get_value(GPIO_NR_TREO680_SD_READONLY);
229}
230
231static struct pxamci_platform_data treo680_mci_platform_data = { 183static struct pxamci_platform_data treo680_mci_platform_data = {
232 .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, 184 .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
233 .setpower = treo680_mci_power, 185 .gpio_card_detect = GPIO_NR_TREO_SD_DETECT_N,
234 .get_ro = treo680_mci_get_ro, 186 .gpio_card_ro = GPIO_NR_TREO680_SD_READONLY,
235 .init = treo680_mci_init, 187 .gpio_power = GPIO_NR_TREO680_SD_POWER,
236 .exit = treo680_mci_exit, 188};
189#endif /* CONFIG_MACH_TREO680 */
190
191#ifdef CONFIG_MACH_CENTRO
192static struct pxamci_platform_data centro_mci_platform_data = {
193 .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
194 .gpio_card_detect = GPIO_NR_TREO_SD_DETECT_N,
195 .gpio_card_ro = -1,
196 .gpio_power = GPIO_NR_CENTRO_SD_POWER,
197 .gpio_power_invert = 1,
237}; 198};
199#endif /* CONFIG_MACH_CENTRO */
238 200
239/****************************************************************************** 201/******************************************************************************
240 * GPIO keyboard 202 * GPIO keyboard
241 ******************************************************************************/ 203 ******************************************************************************/
204#ifdef CONFIG_MACH_TREO680
242static unsigned int treo680_matrix_keys[] = { 205static unsigned int treo680_matrix_keys[] = {
243 KEY(0, 0, KEY_F8), /* Red/Off/Power */ 206 KEY(0, 0, KEY_F8), /* Red/Off/Power */
244 KEY(0, 1, KEY_LEFT), 207 KEY(0, 1, KEY_LEFT),
@@ -308,135 +271,167 @@ static struct pxa27x_keypad_platform_data treo680_keypad_platform_data = {
308 271
309 .debounce_interval = 30, 272 .debounce_interval = 30,
310}; 273};
274#endif /* CONFIG_MACH_TREO680 */
275
276#ifdef CONFIG_MACH_CENTRO
277static unsigned int centro_matrix_keys[] = {
278 KEY(0, 0, KEY_F9), /* Home */
279 KEY(0, 1, KEY_LEFT),
280 KEY(0, 2, KEY_LEFTCTRL), /* Alternate */
281 KEY(0, 3, KEY_L),
282 KEY(0, 4, KEY_A),
283 KEY(0, 5, KEY_Q),
284 KEY(0, 6, KEY_P),
285
286 KEY(1, 0, KEY_RIGHTCTRL), /* Menu */
287 KEY(1, 1, KEY_RIGHT),
288 KEY(1, 2, KEY_LEFTSHIFT), /* Left shift */
289 KEY(1, 3, KEY_Z),
290 KEY(1, 4, KEY_S),
291 KEY(1, 5, KEY_W),
292
293 KEY(2, 0, KEY_F1), /* Phone */
294 KEY(2, 1, KEY_UP),
295 KEY(2, 2, KEY_0),
296 KEY(2, 3, KEY_X),
297 KEY(2, 4, KEY_D),
298 KEY(2, 5, KEY_E),
299
300 KEY(3, 0, KEY_F10), /* Calendar */
301 KEY(3, 1, KEY_DOWN),
302 KEY(3, 2, KEY_SPACE),
303 KEY(3, 3, KEY_C),
304 KEY(3, 4, KEY_F),
305 KEY(3, 5, KEY_R),
306
307 KEY(4, 0, KEY_F12), /* Mail */
308 KEY(4, 1, KEY_KPENTER),
309 KEY(4, 2, KEY_RIGHTALT), /* Alt */
310 KEY(4, 3, KEY_V),
311 KEY(4, 4, KEY_G),
312 KEY(4, 5, KEY_T),
313
314 KEY(5, 0, KEY_F8), /* Red/Off/Power */
315 KEY(5, 1, KEY_PAGEUP), /* Side up */
316 KEY(5, 2, KEY_DOT),
317 KEY(5, 3, KEY_B),
318 KEY(5, 4, KEY_H),
319 KEY(5, 5, KEY_Y),
320
321 KEY(6, 0, KEY_TAB), /* Side Activate */
322 KEY(6, 1, KEY_PAGEDOWN), /* Side down */
323 KEY(6, 2, KEY_ENTER),
324 KEY(6, 3, KEY_N),
325 KEY(6, 4, KEY_J),
326 KEY(6, 5, KEY_U),
327
328 KEY(7, 0, KEY_F6), /* Green/Call */
329 KEY(7, 1, KEY_O),
330 KEY(7, 2, KEY_BACKSPACE),
331 KEY(7, 3, KEY_M),
332 KEY(7, 4, KEY_K),
333 KEY(7, 5, KEY_I),
334};
335
336static struct pxa27x_keypad_platform_data centro_keypad_platform_data = {
337 .matrix_key_rows = 8,
338 .matrix_key_cols = 7,
339 .matrix_key_map = centro_matrix_keys,
340 .matrix_key_map_size = ARRAY_SIZE(centro_matrix_keys),
341 .direct_key_map = { KEY_CONNECT },
342 .direct_key_num = 1,
343
344 .debounce_interval = 30,
345};
346#endif /* CONFIG_MACH_CENTRO */
311 347
312/****************************************************************************** 348/******************************************************************************
313 * aSoC audio 349 * aSoC audio
314 ******************************************************************************/ 350 ******************************************************************************/
315 351
316static pxa2xx_audio_ops_t treo680_ac97_pdata = { 352static pxa2xx_audio_ops_t treo_ac97_pdata = {
317 .reset_gpio = 95, 353 .reset_gpio = 95,
318}; 354};
319 355
320/****************************************************************************** 356/******************************************************************************
321 * Backlight 357 * Backlight
322 ******************************************************************************/ 358 ******************************************************************************/
323static int treo680_backlight_init(struct device *dev) 359static int treo_backlight_init(struct device *dev)
324{ 360{
325 int ret; 361 int ret;
326 362
327 ret = gpio_request(GPIO_NR_TREO680_BL_POWER, "BL POWER"); 363 ret = gpio_request(GPIO_NR_TREO_BL_POWER, "BL POWER");
328 if (ret) 364 if (ret)
329 goto err; 365 goto err;
330 ret = gpio_direction_output(GPIO_NR_TREO680_BL_POWER, 0); 366 ret = gpio_direction_output(GPIO_NR_TREO_BL_POWER, 0);
331 if (ret)
332 goto err2;
333 ret = gpio_request(GPIO_NR_TREO680_LCD_POWER, "LCD POWER");
334 if (ret) 367 if (ret)
335 goto err2; 368 goto err2;
336 ret = gpio_direction_output(GPIO_NR_TREO680_LCD_POWER, 0);
337 if (ret)
338 goto err3;
339 369
340 return 0; 370 return 0;
341err3: 371
342 gpio_free(GPIO_NR_TREO680_LCD_POWER);
343err2: 372err2:
344 gpio_free(GPIO_NR_TREO680_BL_POWER); 373 gpio_free(GPIO_NR_TREO_BL_POWER);
345err: 374err:
346 return ret; 375 return ret;
347} 376}
348 377
349static int treo680_backlight_notify(int brightness) 378static int treo_backlight_notify(int brightness)
350{ 379{
351 gpio_set_value(GPIO_NR_TREO680_BL_POWER, brightness); 380 gpio_set_value(GPIO_NR_TREO_BL_POWER, brightness);
352 return TREO680_MAX_INTENSITY - brightness; 381 return TREO_MAX_INTENSITY - brightness;
353}; 382};
354 383
355static void treo680_backlight_exit(struct device *dev) 384static void treo_backlight_exit(struct device *dev)
356{ 385{
357 gpio_free(GPIO_NR_TREO680_BL_POWER); 386 gpio_free(GPIO_NR_TREO_BL_POWER);
358 gpio_free(GPIO_NR_TREO680_LCD_POWER);
359} 387}
360 388
361static struct platform_pwm_backlight_data treo680_backlight_data = { 389static struct platform_pwm_backlight_data treo_backlight_data = {
362 .pwm_id = 0, 390 .pwm_id = 0,
363 .max_brightness = TREO680_MAX_INTENSITY, 391 .max_brightness = TREO_MAX_INTENSITY,
364 .dft_brightness = TREO680_DEFAULT_INTENSITY, 392 .dft_brightness = TREO_DEFAULT_INTENSITY,
365 .pwm_period_ns = TREO680_PERIOD_NS, 393 .pwm_period_ns = TREO_PERIOD_NS,
366 .init = treo680_backlight_init, 394 .init = treo_backlight_init,
367 .notify = treo680_backlight_notify, 395 .notify = treo_backlight_notify,
368 .exit = treo680_backlight_exit, 396 .exit = treo_backlight_exit,
369}; 397};
370 398
371static struct platform_device treo680_backlight = { 399static struct platform_device treo_backlight = {
372 .name = "pwm-backlight", 400 .name = "pwm-backlight",
373 .dev = { 401 .dev = {
374 .parent = &pxa27x_device_pwm0.dev, 402 .parent = &pxa27x_device_pwm0.dev,
375 .platform_data = &treo680_backlight_data, 403 .platform_data = &treo_backlight_data,
376 }, 404 },
377}; 405};
378 406
379/****************************************************************************** 407/******************************************************************************
380 * IrDA 408 * IrDA
381 ******************************************************************************/ 409 ******************************************************************************/
382static void treo680_transceiver_mode(struct device *dev, int mode) 410static struct pxaficp_platform_data treo_ficp_info = {
383{ 411 .gpio_pwdown = GPIO_NR_TREO_IR_EN,
384 gpio_set_value(GPIO_NR_TREO680_IR_EN, mode & IR_OFF); 412 .transceiver_cap = IR_SIRMODE | IR_OFF,
385 pxa2xx_transceiver_mode(dev, mode);
386}
387
388static int treo680_irda_startup(struct device *dev)
389{
390 int err;
391
392 err = gpio_request(GPIO_NR_TREO680_IR_EN, "Ir port disable");
393 if (err)
394 goto err1;
395
396 err = gpio_direction_output(GPIO_NR_TREO680_IR_EN, 1);
397 if (err)
398 goto err2;
399
400 return 0;
401
402err2:
403 dev_err(dev, "treo680_irda: cannot change IR gpio direction\n");
404 gpio_free(GPIO_NR_TREO680_IR_EN);
405err1:
406 dev_err(dev, "treo680_irda: cannot allocate IR gpio\n");
407 return err;
408}
409
410static void treo680_irda_shutdown(struct device *dev)
411{
412 gpio_free(GPIO_NR_TREO680_IR_EN);
413}
414
415static struct pxaficp_platform_data treo680_ficp_info = {
416 .transceiver_cap = IR_FIRMODE | IR_SIRMODE | IR_OFF,
417 .startup = treo680_irda_startup,
418 .shutdown = treo680_irda_shutdown,
419 .transceiver_mode = treo680_transceiver_mode,
420}; 413};
421 414
422/****************************************************************************** 415/******************************************************************************
423 * UDC 416 * UDC
424 ******************************************************************************/ 417 ******************************************************************************/
425static struct pxa2xx_udc_mach_info treo680_udc_info __initdata = { 418static struct pxa2xx_udc_mach_info treo_udc_info __initdata = {
426 .gpio_vbus = GPIO_NR_TREO680_USB_DETECT, 419 .gpio_vbus = GPIO_NR_TREO_USB_DETECT,
427 .gpio_vbus_inverted = 1, 420 .gpio_vbus_inverted = 1,
428 .gpio_pullup = GPIO_NR_TREO680_USB_PULLUP, 421 .gpio_pullup = GPIO_NR_TREO_USB_PULLUP,
429}; 422};
430 423
431 424
432/****************************************************************************** 425/******************************************************************************
433 * USB host 426 * USB host
434 ******************************************************************************/ 427 ******************************************************************************/
428#ifdef CONFIG_MACH_TREO680
435static struct pxaohci_platform_data treo680_ohci_info = { 429static struct pxaohci_platform_data treo680_ohci_info = {
436 .port_mode = PMM_PERPORT_MODE, 430 .port_mode = PMM_PERPORT_MODE,
437 .flags = ENABLE_PORT1 | ENABLE_PORT3, 431 .flags = ENABLE_PORT1 | ENABLE_PORT3,
438 .power_budget = 0, 432 .power_budget = 0,
439}; 433};
434#endif /* CONFIG_MACH_TREO680 */
440 435
441/****************************************************************************** 436/******************************************************************************
442 * Power supply 437 * Power supply
@@ -445,41 +440,41 @@ static int power_supply_init(struct device *dev)
445{ 440{
446 int ret; 441 int ret;
447 442
448 ret = gpio_request(GPIO_NR_TREO680_POWER_DETECT, "CABLE_STATE_AC"); 443 ret = gpio_request(GPIO_NR_TREO_POWER_DETECT, "CABLE_STATE_AC");
449 if (ret) 444 if (ret)
450 goto err1; 445 goto err1;
451 ret = gpio_direction_input(GPIO_NR_TREO680_POWER_DETECT); 446 ret = gpio_direction_input(GPIO_NR_TREO_POWER_DETECT);
452 if (ret) 447 if (ret)
453 goto err2; 448 goto err2;
454 449
455 return 0; 450 return 0;
456 451
457err2: 452err2:
458 gpio_free(GPIO_NR_TREO680_POWER_DETECT); 453 gpio_free(GPIO_NR_TREO_POWER_DETECT);
459err1: 454err1:
460 return ret; 455 return ret;
461} 456}
462 457
463static int treo680_is_ac_online(void) 458static int treo_is_ac_online(void)
464{ 459{
465 return gpio_get_value(GPIO_NR_TREO680_POWER_DETECT); 460 return gpio_get_value(GPIO_NR_TREO_POWER_DETECT);
466} 461}
467 462
468static void power_supply_exit(struct device *dev) 463static void power_supply_exit(struct device *dev)
469{ 464{
470 gpio_free(GPIO_NR_TREO680_POWER_DETECT); 465 gpio_free(GPIO_NR_TREO_POWER_DETECT);
471} 466}
472 467
473static char *treo680_supplicants[] = { 468static char *treo_supplicants[] = {
474 "main-battery", 469 "main-battery",
475}; 470};
476 471
477static struct pda_power_pdata power_supply_info = { 472static struct pda_power_pdata power_supply_info = {
478 .init = power_supply_init, 473 .init = power_supply_init,
479 .is_ac_online = treo680_is_ac_online, 474 .is_ac_online = treo_is_ac_online,
480 .exit = power_supply_exit, 475 .exit = power_supply_exit,
481 .supplied_to = treo680_supplicants, 476 .supplied_to = treo_supplicants,
482 .num_supplicants = ARRAY_SIZE(treo680_supplicants), 477 .num_supplicants = ARRAY_SIZE(treo_supplicants),
483}; 478};
484 479
485static struct platform_device power_supply = { 480static struct platform_device power_supply = {
@@ -493,7 +488,8 @@ static struct platform_device power_supply = {
493/****************************************************************************** 488/******************************************************************************
494 * Vibra and LEDs 489 * Vibra and LEDs
495 ******************************************************************************/ 490 ******************************************************************************/
496static struct gpio_led gpio_leds[] = { 491#ifdef CONFIG_MACH_TREO680
492static struct gpio_led treo680_gpio_leds[] = {
497 { 493 {
498 .name = "treo680:vibra:vibra", 494 .name = "treo680:vibra:vibra",
499 .default_trigger = "none", 495 .default_trigger = "none",
@@ -502,34 +498,68 @@ static struct gpio_led gpio_leds[] = {
502 { 498 {
503 .name = "treo680:green:led", 499 .name = "treo680:green:led",
504 .default_trigger = "mmc0", 500 .default_trigger = "mmc0",
505 .gpio = GPIO_NR_TREO680_GREEN_LED, 501 .gpio = GPIO_NR_TREO_GREEN_LED,
506 }, 502 },
507 { 503 {
508 .name = "treo680:keybbl:keybbl", 504 .name = "treo680:white:keybbl",
509 .default_trigger = "none", 505 .default_trigger = "none",
510 .gpio = GPIO_NR_TREO680_KEYB_BL, 506 .gpio = GPIO_NR_TREO680_KEYB_BL,
511 }, 507 },
512}; 508};
513 509
514static struct gpio_led_platform_data gpio_led_info = { 510static struct gpio_led_platform_data treo680_gpio_led_info = {
515 .leds = gpio_leds, 511 .leds = treo680_gpio_leds,
516 .num_leds = ARRAY_SIZE(gpio_leds), 512 .num_leds = ARRAY_SIZE(treo680_gpio_leds),
517}; 513};
518 514
519static struct platform_device treo680_leds = { 515static struct platform_device treo680_leds = {
520 .name = "leds-gpio", 516 .name = "leds-gpio",
521 .id = -1, 517 .id = -1,
522 .dev = { 518 .dev = {
523 .platform_data = &gpio_led_info, 519 .platform_data = &treo680_gpio_led_info,
524 } 520 }
525}; 521};
522#endif /* CONFIG_MACH_TREO680 */
523
524#ifdef CONFIG_MACH_CENTRO
525static struct gpio_led centro_gpio_leds[] = {
526 {
527 .name = "centro:vibra:vibra",
528 .default_trigger = "none",
529 .gpio = GPIO_NR_CENTRO_VIBRATE_EN,
530 },
531 {
532 .name = "centro:green:led",
533 .default_trigger = "mmc0",
534 .gpio = GPIO_NR_TREO_GREEN_LED,
535 },
536 {
537 .name = "centro:white:keybbl",
538 .default_trigger = "none",
539 .active_low = 1,
540 .gpio = GPIO_NR_CENTRO_KEYB_BL,
541 },
542};
543
544static struct gpio_led_platform_data centro_gpio_led_info = {
545 .leds = centro_gpio_leds,
546 .num_leds = ARRAY_SIZE(centro_gpio_leds),
547};
526 548
549static struct platform_device centro_leds = {
550 .name = "leds-gpio",
551 .id = -1,
552 .dev = {
553 .platform_data = &centro_gpio_led_info,
554 }
555};
556#endif /* CONFIG_MACH_CENTRO */
527 557
528/****************************************************************************** 558/******************************************************************************
529 * Framebuffer 559 * Framebuffer
530 ******************************************************************************/ 560 ******************************************************************************/
531/* TODO: add support for 324x324 */ 561/* TODO: add support for 324x324 */
532static struct pxafb_mode_info treo680_lcd_modes[] = { 562static struct pxafb_mode_info treo_lcd_modes[] = {
533{ 563{
534 .pixclock = 86538, 564 .pixclock = 86538,
535 .xres = 320, 565 .xres = 320,
@@ -546,16 +576,21 @@ static struct pxafb_mode_info treo680_lcd_modes[] = {
546}, 576},
547}; 577};
548 578
549static struct pxafb_mach_info treo680_lcd_screen = { 579static void treo_lcd_power(int on, struct fb_var_screeninfo *info)
550 .modes = treo680_lcd_modes, 580{
551 .num_modes = ARRAY_SIZE(treo680_lcd_modes), 581 gpio_set_value(GPIO_NR_TREO_BL_POWER, on);
582}
583
584static struct pxafb_mach_info treo_lcd_screen = {
585 .modes = treo_lcd_modes,
586 .num_modes = ARRAY_SIZE(treo_lcd_modes),
552 .lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL, 587 .lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
553}; 588};
554 589
555/****************************************************************************** 590/******************************************************************************
556 * Power management - standby 591 * Power management - standby
557 ******************************************************************************/ 592 ******************************************************************************/
558static void __init treo680_pm_init(void) 593static void __init treo_pm_init(void)
559{ 594{
560 static u32 resume[] = { 595 static u32 resume[] = {
561 0xe3a00101, /* mov r0, #0x40000000 */ 596 0xe3a00101, /* mov r0, #0x40000000 */
@@ -564,49 +599,118 @@ static void __init treo680_pm_init(void)
564 }; 599 };
565 600
566 /* this is where the bootloader jumps */ 601 /* this is where the bootloader jumps */
567 memcpy(phys_to_virt(TREO680_STR_BASE), resume, sizeof(resume)); 602 memcpy(phys_to_virt(TREO_STR_BASE), resume, sizeof(resume));
568} 603}
569 604
570/****************************************************************************** 605/******************************************************************************
571 * Machine init 606 * Machine init
572 ******************************************************************************/ 607 ******************************************************************************/
573static struct platform_device *devices[] __initdata = { 608static struct platform_device *treo_devices[] __initdata = {
574 &treo680_backlight, 609 &treo_backlight,
575 &treo680_leds,
576 &power_supply, 610 &power_supply,
577}; 611};
578 612
613#ifdef CONFIG_MACH_TREO680
614static struct platform_device *treo680_devices[] __initdata = {
615 &treo680_leds,
616};
617#endif /* CONFIG_MACH_TREO680 */
618
619#ifdef CONFIG_MACH_CENTRO
620static struct platform_device *centro_devices[] __initdata = {
621 &centro_leds,
622};
623#endif /* CONFIG_MACH_CENTRO */
624
579/* setup udc GPIOs initial state */ 625/* setup udc GPIOs initial state */
580static void __init treo680_udc_init(void) 626static void __init treo_udc_init(void)
581{ 627{
582 if (!gpio_request(GPIO_NR_TREO680_USB_PULLUP, "UDC Vbus")) { 628 if (!gpio_request(GPIO_NR_TREO_USB_PULLUP, "UDC Vbus")) {
583 gpio_direction_output(GPIO_NR_TREO680_USB_PULLUP, 1); 629 gpio_direction_output(GPIO_NR_TREO_USB_PULLUP, 1);
584 gpio_free(GPIO_NR_TREO680_USB_PULLUP); 630 gpio_free(GPIO_NR_TREO_USB_PULLUP);
585 } 631 }
586} 632}
587 633
634static void __init treo_lcd_power_init(void)
635{
636 int ret;
637
638 ret = gpio_request(GPIO_NR_TREO_LCD_POWER, "LCD POWER");
639 if (ret) {
640 pr_err("Treo680: LCD power GPIO request failed!\n");
641 return;
642 }
643
644 ret = gpio_direction_output(GPIO_NR_TREO_LCD_POWER, 0);
645 if (ret) {
646 pr_err("Treo680: setting LCD power GPIO direction failed!\n");
647 gpio_free(GPIO_NR_TREO_LCD_POWER);
648 return;
649 }
650
651 treo_lcd_screen.pxafb_lcd_power = treo_lcd_power;
652}
653
654static void __init treo_init(void)
655{
656 pxa_set_ffuart_info(NULL);
657 pxa_set_btuart_info(NULL);
658 pxa_set_stuart_info(NULL);
659
660 treo_pm_init();
661 pxa2xx_mfp_config(ARRAY_AND_SIZE(treo_pin_config));
662 treo_lcd_power_init();
663 set_pxa_fb_info(&treo_lcd_screen);
664 treo_udc_init();
665 pxa_set_udc_info(&treo_udc_info);
666 pxa_set_ac97_info(&treo_ac97_pdata);
667 pxa_set_ficp_info(&treo_ficp_info);
668
669 platform_add_devices(ARRAY_AND_SIZE(treo_devices));
670}
671
672#ifdef CONFIG_MACH_TREO680
588static void __init treo680_init(void) 673static void __init treo680_init(void)
589{ 674{
590 treo680_pm_init(); 675 treo_init();
591 pxa2xx_mfp_config(ARRAY_AND_SIZE(treo680_pin_config)); 676 pxa2xx_mfp_config(ARRAY_AND_SIZE(treo680_pin_config));
592 pxa_set_keypad_info(&treo680_keypad_platform_data);
593 set_pxa_fb_info(&treo680_lcd_screen);
594 pxa_set_mci_info(&treo680_mci_platform_data); 677 pxa_set_mci_info(&treo680_mci_platform_data);
595 treo680_udc_init(); 678 pxa_set_keypad_info(&treo680_keypad_platform_data);
596 pxa_set_udc_info(&treo680_udc_info);
597 pxa_set_ac97_info(&treo680_ac97_pdata);
598 pxa_set_ficp_info(&treo680_ficp_info);
599 pxa_set_ohci_info(&treo680_ohci_info); 679 pxa_set_ohci_info(&treo680_ohci_info);
600 680
601 platform_add_devices(devices, ARRAY_SIZE(devices)); 681 platform_add_devices(ARRAY_AND_SIZE(treo680_devices));
602} 682}
603 683
604MACHINE_START(TREO680, "Palm Treo 680") 684MACHINE_START(TREO680, "Palm Treo 680")
605 .phys_io = TREO680_PHYS_IO_START, 685 .phys_io = TREO_PHYS_IO_START,
606 .io_pg_offst = io_p2v(0x40000000), 686 .io_pg_offst = io_p2v(0x40000000),
607 .boot_params = 0xa0000100, 687 .boot_params = 0xa0000100,
608 .map_io = pxa_map_io, 688 .map_io = pxa_map_io,
609 .init_irq = pxa27x_init_irq, 689 .init_irq = pxa27x_init_irq,
610 .timer = &pxa_timer, 690 .timer = &pxa_timer,
611 .init_machine = treo680_init, 691 .init_machine = treo680_init,
692MACHINE_END
693#endif /* CONFIG_MACH_TREO680 */
694
695#ifdef CONFIG_MACH_CENTRO
696static void __init centro_init(void)
697{
698 treo_init();
699 pxa2xx_mfp_config(ARRAY_AND_SIZE(centro685_pin_config));
700 pxa_set_mci_info(&centro_mci_platform_data);
701
702 pxa_set_keypad_info(&centro_keypad_platform_data);
703
704 platform_add_devices(ARRAY_AND_SIZE(centro_devices));
705}
706
707MACHINE_START(CENTRO, "Palm Centro 685")
708 .phys_io = TREO_PHYS_IO_START,
709 .io_pg_offst = io_p2v(0x40000000),
710 .boot_params = 0xa0000100,
711 .map_io = pxa_map_io,
712 .init_irq = pxa27x_init_irq,
713 .timer = &pxa_timer,
714 .init_machine = centro_init,
612MACHINE_END 715MACHINE_END
716#endif /* CONFIG_MACH_CENTRO */
diff --git a/arch/arm/mach-pxa/palmtx.c b/arch/arm/mach-pxa/palmtx.c
index 83d020879581..7bf18c2f002f 100644
--- a/arch/arm/mach-pxa/palmtx.c
+++ b/arch/arm/mach-pxa/palmtx.c
@@ -28,6 +28,10 @@
28#include <linux/wm97xx_batt.h> 28#include <linux/wm97xx_batt.h>
29#include <linux/power_supply.h> 29#include <linux/power_supply.h>
30#include <linux/usb/gpio_vbus.h> 30#include <linux/usb/gpio_vbus.h>
31#include <linux/mtd/nand.h>
32#include <linux/mtd/partitions.h>
33#include <linux/mtd/mtd.h>
34#include <linux/mtd/physmap.h>
31 35
32#include <asm/mach-types.h> 36#include <asm/mach-types.h>
33#include <asm/mach/arch.h> 37#include <asm/mach/arch.h>
@@ -131,6 +135,10 @@ static unsigned long palmtx_pin_config[] __initdata = {
131 GPIO34_FFUART_RXD, 135 GPIO34_FFUART_RXD,
132 GPIO39_FFUART_TXD, 136 GPIO39_FFUART_TXD,
133 137
138 /* NAND */
139 GPIO15_nCS_1,
140 GPIO18_RDY,
141
134 /* MISC. */ 142 /* MISC. */
135 GPIO10_GPIO, /* hotsync button */ 143 GPIO10_GPIO, /* hotsync button */
136 GPIO12_GPIO, /* power detect */ 144 GPIO12_GPIO, /* power detect */
@@ -138,85 +146,50 @@ static unsigned long palmtx_pin_config[] __initdata = {
138}; 146};
139 147
140/****************************************************************************** 148/******************************************************************************
141 * SD/MMC card controller 149 * NOR Flash
142 ******************************************************************************/ 150 ******************************************************************************/
143static int palmtx_mci_init(struct device *dev, irq_handler_t palmtx_detect_int, 151static struct mtd_partition palmtx_partitions[] = {
144 void *data) 152 {
145{ 153 .name = "Flash",
146 int err = 0; 154 .offset = 0x00000000,
147 155 .size = MTDPART_SIZ_FULL,
148 /* Setup an interrupt for detecting card insert/remove events */ 156 .mask_flags = 0
149 err = gpio_request(GPIO_NR_PALMTX_SD_DETECT_N, "SD IRQ");
150 if (err)
151 goto err;
152 err = gpio_direction_input(GPIO_NR_PALMTX_SD_DETECT_N);
153 if (err)
154 goto err2;
155 err = request_irq(gpio_to_irq(GPIO_NR_PALMTX_SD_DETECT_N),
156 palmtx_detect_int, IRQF_DISABLED | IRQF_SAMPLE_RANDOM |
157 IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
158 "SD/MMC card detect", data);
159 if (err) {
160 printk(KERN_ERR "%s: cannot request SD/MMC card detect IRQ\n",
161 __func__);
162 goto err2;
163 } 157 }
158};
164 159
165 err = gpio_request(GPIO_NR_PALMTX_SD_POWER, "SD_POWER"); 160static struct physmap_flash_data palmtx_flash_data[] = {
166 if (err) 161 {
167 goto err3; 162 .width = 2, /* bankwidth in bytes */
168 err = gpio_direction_output(GPIO_NR_PALMTX_SD_POWER, 0); 163 .parts = palmtx_partitions,
169 if (err) 164 .nr_parts = ARRAY_SIZE(palmtx_partitions)
170 goto err4; 165 }
171 166};
172 err = gpio_request(GPIO_NR_PALMTX_SD_READONLY, "SD_READONLY");
173 if (err)
174 goto err4;
175 err = gpio_direction_input(GPIO_NR_PALMTX_SD_READONLY);
176 if (err)
177 goto err5;
178
179 printk(KERN_DEBUG "%s: irq registered\n", __func__);
180
181 return 0;
182
183err5:
184 gpio_free(GPIO_NR_PALMTX_SD_READONLY);
185err4:
186 gpio_free(GPIO_NR_PALMTX_SD_POWER);
187err3:
188 free_irq(gpio_to_irq(GPIO_NR_PALMTX_SD_DETECT_N), data);
189err2:
190 gpio_free(GPIO_NR_PALMTX_SD_DETECT_N);
191err:
192 return err;
193}
194
195static void palmtx_mci_exit(struct device *dev, void *data)
196{
197 gpio_free(GPIO_NR_PALMTX_SD_READONLY);
198 gpio_free(GPIO_NR_PALMTX_SD_POWER);
199 free_irq(gpio_to_irq(GPIO_NR_PALMTX_SD_DETECT_N), data);
200 gpio_free(GPIO_NR_PALMTX_SD_DETECT_N);
201}
202 167
203static void palmtx_mci_power(struct device *dev, unsigned int vdd) 168static struct resource palmtx_flash_resource = {
204{ 169 .start = PXA_CS0_PHYS,
205 struct pxamci_platform_data *p_d = dev->platform_data; 170 .end = PXA_CS0_PHYS + SZ_8M - 1,
206 gpio_set_value(GPIO_NR_PALMTX_SD_POWER, p_d->ocr_mask & (1 << vdd)); 171 .flags = IORESOURCE_MEM,
207} 172};
208 173
209static int palmtx_mci_get_ro(struct device *dev) 174static struct platform_device palmtx_flash = {
210{ 175 .name = "physmap-flash",
211 return gpio_get_value(GPIO_NR_PALMTX_SD_READONLY); 176 .id = 0,
212} 177 .resource = &palmtx_flash_resource,
178 .num_resources = 1,
179 .dev = {
180 .platform_data = palmtx_flash_data,
181 },
182};
213 183
184/******************************************************************************
185 * SD/MMC card controller
186 ******************************************************************************/
214static struct pxamci_platform_data palmtx_mci_platform_data = { 187static struct pxamci_platform_data palmtx_mci_platform_data = {
215 .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, 188 .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
216 .setpower = palmtx_mci_power, 189 .gpio_card_detect = GPIO_NR_PALMTX_SD_DETECT_N,
217 .get_ro = palmtx_mci_get_ro, 190 .gpio_card_ro = GPIO_NR_PALMTX_SD_READONLY,
218 .init = palmtx_mci_init, 191 .gpio_power = GPIO_NR_PALMTX_SD_POWER,
219 .exit = palmtx_mci_exit, 192 .detect_delay = 20,
220}; 193};
221 194
222/****************************************************************************** 195/******************************************************************************
@@ -330,35 +303,9 @@ static struct platform_device palmtx_backlight = {
330/****************************************************************************** 303/******************************************************************************
331 * IrDA 304 * IrDA
332 ******************************************************************************/ 305 ******************************************************************************/
333static int palmtx_irda_startup(struct device *dev)
334{
335 int err;
336 err = gpio_request(GPIO_NR_PALMTX_IR_DISABLE, "IR DISABLE");
337 if (err)
338 goto err;
339 err = gpio_direction_output(GPIO_NR_PALMTX_IR_DISABLE, 1);
340 if (err)
341 gpio_free(GPIO_NR_PALMTX_IR_DISABLE);
342err:
343 return err;
344}
345
346static void palmtx_irda_shutdown(struct device *dev)
347{
348 gpio_free(GPIO_NR_PALMTX_IR_DISABLE);
349}
350
351static void palmtx_irda_transceiver_mode(struct device *dev, int mode)
352{
353 gpio_set_value(GPIO_NR_PALMTX_IR_DISABLE, mode & IR_OFF);
354 pxa2xx_transceiver_mode(dev, mode);
355}
356
357static struct pxaficp_platform_data palmtx_ficp_platform_data = { 306static struct pxaficp_platform_data palmtx_ficp_platform_data = {
358 .startup = palmtx_irda_startup, 307 .gpio_pwdown = GPIO_NR_PALMTX_IR_DISABLE,
359 .shutdown = palmtx_irda_shutdown, 308 .transceiver_cap = IR_SIRMODE | IR_OFF,
360 .transceiver_cap = IR_SIRMODE | IR_FIRMODE | IR_OFF,
361 .transceiver_mode = palmtx_irda_transceiver_mode,
362}; 309};
363 310
364/****************************************************************************** 311/******************************************************************************
@@ -493,6 +440,68 @@ static struct pxafb_mach_info palmtx_lcd_screen = {
493}; 440};
494 441
495/****************************************************************************** 442/******************************************************************************
443 * NAND Flash
444 ******************************************************************************/
445static void palmtx_nand_cmd_ctl(struct mtd_info *mtd, int cmd,
446 unsigned int ctrl)
447{
448 struct nand_chip *this = mtd->priv;
449 unsigned long nandaddr = (unsigned long)this->IO_ADDR_W;
450
451 if (cmd == NAND_CMD_NONE)
452 return;
453
454 if (ctrl & NAND_CLE)
455 writeb(cmd, PALMTX_NAND_CLE_VIRT);
456 else if (ctrl & NAND_ALE)
457 writeb(cmd, PALMTX_NAND_ALE_VIRT);
458 else
459 writeb(cmd, nandaddr);
460}
461
462static struct mtd_partition palmtx_partition_info[] = {
463 [0] = {
464 .name = "palmtx-0",
465 .offset = 0,
466 .size = MTDPART_SIZ_FULL
467 },
468};
469
470static const char *palmtx_part_probes[] = { "cmdlinepart", NULL };
471
472struct platform_nand_data palmtx_nand_platdata = {
473 .chip = {
474 .nr_chips = 1,
475 .chip_offset = 0,
476 .nr_partitions = ARRAY_SIZE(palmtx_partition_info),
477 .partitions = palmtx_partition_info,
478 .chip_delay = 20,
479 .part_probe_types = palmtx_part_probes,
480 },
481 .ctrl = {
482 .cmd_ctrl = palmtx_nand_cmd_ctl,
483 },
484};
485
486static struct resource palmtx_nand_resource[] = {
487 [0] = {
488 .start = PXA_CS1_PHYS,
489 .end = PXA_CS1_PHYS + SZ_1M - 1,
490 .flags = IORESOURCE_MEM,
491 },
492};
493
494static struct platform_device palmtx_nand = {
495 .name = "gen_nand",
496 .num_resources = ARRAY_SIZE(palmtx_nand_resource),
497 .resource = palmtx_nand_resource,
498 .id = -1,
499 .dev = {
500 .platform_data = &palmtx_nand_platdata,
501 }
502};
503
504/******************************************************************************
496 * Power management - standby 505 * Power management - standby
497 ******************************************************************************/ 506 ******************************************************************************/
498static void __init palmtx_pm_init(void) 507static void __init palmtx_pm_init(void)
@@ -518,6 +527,8 @@ static struct platform_device *devices[] __initdata = {
518 &power_supply, 527 &power_supply,
519 &palmtx_asoc, 528 &palmtx_asoc,
520 &palmtx_gpio_vbus, 529 &palmtx_gpio_vbus,
530 &palmtx_flash,
531 &palmtx_nand,
521}; 532};
522 533
523static struct map_desc palmtx_io_desc[] __initdata = { 534static struct map_desc palmtx_io_desc[] __initdata = {
@@ -525,8 +536,18 @@ static struct map_desc palmtx_io_desc[] __initdata = {
525 .virtual = PALMTX_PCMCIA_VIRT, 536 .virtual = PALMTX_PCMCIA_VIRT,
526 .pfn = __phys_to_pfn(PALMTX_PCMCIA_PHYS), 537 .pfn = __phys_to_pfn(PALMTX_PCMCIA_PHYS),
527 .length = PALMTX_PCMCIA_SIZE, 538 .length = PALMTX_PCMCIA_SIZE,
528 .type = MT_DEVICE 539 .type = MT_DEVICE,
529}, 540}, {
541 .virtual = PALMTX_NAND_ALE_VIRT,
542 .pfn = __phys_to_pfn(PALMTX_NAND_ALE_PHYS),
543 .length = SZ_1M,
544 .type = MT_DEVICE,
545}, {
546 .virtual = PALMTX_NAND_CLE_VIRT,
547 .pfn = __phys_to_pfn(PALMTX_NAND_CLE_PHYS),
548 .length = SZ_1M,
549 .type = MT_DEVICE,
550}
530}; 551};
531 552
532static void __init palmtx_map_io(void) 553static void __init palmtx_map_io(void)
@@ -549,6 +570,10 @@ static void __init palmtx_init(void)
549{ 570{
550 pxa2xx_mfp_config(ARRAY_AND_SIZE(palmtx_pin_config)); 571 pxa2xx_mfp_config(ARRAY_AND_SIZE(palmtx_pin_config));
551 572
573 pxa_set_ffuart_info(NULL);
574 pxa_set_btuart_info(NULL);
575 pxa_set_stuart_info(NULL);
576
552 palmtx_pm_init(); 577 palmtx_pm_init();
553 set_pxa_fb_info(&palmtx_lcd_screen); 578 set_pxa_fb_info(&palmtx_lcd_screen);
554 pxa_set_mci_info(&palmtx_mci_platform_data); 579 pxa_set_mci_info(&palmtx_mci_platform_data);
diff --git a/arch/arm/mach-pxa/palmz72.c b/arch/arm/mach-pxa/palmz72.c
index c3645aa3fa3d..d787ac7cfdd8 100644
--- a/arch/arm/mach-pxa/palmz72.c
+++ b/arch/arm/mach-pxa/palmz72.c
@@ -129,88 +129,14 @@ static unsigned long palmz72_pin_config[] __initdata = {
129/****************************************************************************** 129/******************************************************************************
130 * SD/MMC card controller 130 * SD/MMC card controller
131 ******************************************************************************/ 131 ******************************************************************************/
132static int palmz72_mci_init(struct device *dev, 132/* SD_POWER is not actually power, but it is more like chip
133 irq_handler_t palmz72_detect_int, void *data) 133 * select, i.e. it is inverted */
134{
135 int err = 0;
136
137 /* Setup an interrupt for detecting card insert/remove events */
138 err = gpio_request(GPIO_NR_PALMZ72_SD_DETECT_N, "SD IRQ");
139 if (err)
140 goto err;
141 err = gpio_direction_input(GPIO_NR_PALMZ72_SD_DETECT_N);
142 if (err)
143 goto err2;
144 err = request_irq(gpio_to_irq(GPIO_NR_PALMZ72_SD_DETECT_N),
145 palmz72_detect_int, IRQF_DISABLED | IRQF_SAMPLE_RANDOM |
146 IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
147 "SD/MMC card detect", data);
148 if (err) {
149 printk(KERN_ERR "%s: cannot request SD/MMC card detect IRQ\n",
150 __func__);
151 goto err2;
152 }
153
154 /* SD_POWER is not actually power, but it is more like chip
155 * select, i.e. it is inverted */
156
157 err = gpio_request(GPIO_NR_PALMZ72_SD_POWER_N, "SD_POWER");
158 if (err)
159 goto err3;
160 err = gpio_direction_output(GPIO_NR_PALMZ72_SD_POWER_N, 0);
161 if (err)
162 goto err4;
163 err = gpio_request(GPIO_NR_PALMZ72_SD_RO, "SD_RO");
164 if (err)
165 goto err4;
166 err = gpio_direction_input(GPIO_NR_PALMZ72_SD_RO);
167 if (err)
168 goto err5;
169
170 printk(KERN_DEBUG "%s: irq registered\n", __func__);
171
172 return 0;
173
174err5:
175 gpio_free(GPIO_NR_PALMZ72_SD_RO);
176err4:
177 gpio_free(GPIO_NR_PALMZ72_SD_POWER_N);
178err3:
179 free_irq(gpio_to_irq(GPIO_NR_PALMZ72_SD_DETECT_N), data);
180err2:
181 gpio_free(GPIO_NR_PALMZ72_SD_DETECT_N);
182err:
183 return err;
184}
185
186static void palmz72_mci_exit(struct device *dev, void *data)
187{
188 gpio_free(GPIO_NR_PALMZ72_SD_POWER_N);
189 free_irq(gpio_to_irq(GPIO_NR_PALMZ72_SD_DETECT_N), data);
190 gpio_free(GPIO_NR_PALMZ72_SD_DETECT_N);
191 gpio_free(GPIO_NR_PALMZ72_SD_RO);
192}
193
194static void palmz72_mci_power(struct device *dev, unsigned int vdd)
195{
196 struct pxamci_platform_data *p_d = dev->platform_data;
197 if (p_d->ocr_mask & (1 << vdd))
198 gpio_set_value(GPIO_NR_PALMZ72_SD_POWER_N, 0);
199 else
200 gpio_set_value(GPIO_NR_PALMZ72_SD_POWER_N, 1);
201}
202
203static int palmz72_mci_ro(struct device *dev)
204{
205 return gpio_get_value(GPIO_NR_PALMZ72_SD_RO);
206}
207
208static struct pxamci_platform_data palmz72_mci_platform_data = { 134static struct pxamci_platform_data palmz72_mci_platform_data = {
209 .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, 135 .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
210 .setpower = palmz72_mci_power, 136 .gpio_card_detect = GPIO_NR_PALMZ72_SD_DETECT_N,
211 .get_ro = palmz72_mci_ro, 137 .gpio_card_ro = GPIO_NR_PALMZ72_SD_RO,
212 .init = palmz72_mci_init, 138 .gpio_power = GPIO_NR_PALMZ72_SD_POWER_N,
213 .exit = palmz72_mci_exit, 139 .gpio_power_invert = 1,
214}; 140};
215 141
216/****************************************************************************** 142/******************************************************************************
@@ -304,35 +230,9 @@ static struct platform_device palmz72_backlight = {
304/****************************************************************************** 230/******************************************************************************
305 * IrDA 231 * IrDA
306 ******************************************************************************/ 232 ******************************************************************************/
307static int palmz72_irda_startup(struct device *dev)
308{
309 int err;
310 err = gpio_request(GPIO_NR_PALMZ72_IR_DISABLE, "IR DISABLE");
311 if (err)
312 goto err;
313 err = gpio_direction_output(GPIO_NR_PALMZ72_IR_DISABLE, 1);
314 if (err)
315 gpio_free(GPIO_NR_PALMZ72_IR_DISABLE);
316err:
317 return err;
318}
319
320static void palmz72_irda_shutdown(struct device *dev)
321{
322 gpio_free(GPIO_NR_PALMZ72_IR_DISABLE);
323}
324
325static void palmz72_irda_transceiver_mode(struct device *dev, int mode)
326{
327 gpio_set_value(GPIO_NR_PALMZ72_IR_DISABLE, mode & IR_OFF);
328 pxa2xx_transceiver_mode(dev, mode);
329}
330
331static struct pxaficp_platform_data palmz72_ficp_platform_data = { 233static struct pxaficp_platform_data palmz72_ficp_platform_data = {
332 .startup = palmz72_irda_startup, 234 .gpio_pwdown = GPIO_NR_PALMZ72_IR_DISABLE,
333 .shutdown = palmz72_irda_shutdown,
334 .transceiver_cap = IR_SIRMODE | IR_OFF, 235 .transceiver_cap = IR_SIRMODE | IR_OFF,
335 .transceiver_mode = palmz72_irda_transceiver_mode,
336}; 236};
337 237
338/****************************************************************************** 238/******************************************************************************
@@ -591,6 +491,10 @@ static void __init palmz72_init(void)
591{ 491{
592 pxa2xx_mfp_config(ARRAY_AND_SIZE(palmz72_pin_config)); 492 pxa2xx_mfp_config(ARRAY_AND_SIZE(palmz72_pin_config));
593 493
494 pxa_set_ffuart_info(NULL);
495 pxa_set_btuart_info(NULL);
496 pxa_set_stuart_info(NULL);
497
594 set_pxa_fb_info(&palmz72_lcd_screen); 498 set_pxa_fb_info(&palmz72_lcd_screen);
595 pxa_set_mci_info(&palmz72_mci_platform_data); 499 pxa_set_mci_info(&palmz72_mci_platform_data);
596 palmz72_udc_init(); 500 palmz72_udc_init();
diff --git a/arch/arm/mach-pxa/pcm027.c b/arch/arm/mach-pxa/pcm027.c
index 6abfa2979c61..2190af066470 100644
--- a/arch/arm/mach-pxa/pcm027.c
+++ b/arch/arm/mach-pxa/pcm027.c
@@ -227,6 +227,10 @@ static void __init pcm027_init(void)
227 227
228 pxa2xx_mfp_config(pcm027_pin_config, ARRAY_SIZE(pcm027_pin_config)); 228 pxa2xx_mfp_config(pcm027_pin_config, ARRAY_SIZE(pcm027_pin_config));
229 229
230 pxa_set_ffuart_info(NULL);
231 pxa_set_btuart_info(NULL);
232 pxa_set_stuart_info(NULL);
233
230 platform_add_devices(devices, ARRAY_SIZE(devices)); 234 platform_add_devices(devices, ARRAY_SIZE(devices));
231 235
232 /* at last call the baseboard to initialize itself */ 236 /* at last call the baseboard to initialize itself */
diff --git a/arch/arm/mach-pxa/pcm990-baseboard.c b/arch/arm/mach-pxa/pcm990-baseboard.c
index 01791d74e08e..d5255ae74fe3 100644
--- a/arch/arm/mach-pxa/pcm990-baseboard.c
+++ b/arch/arm/mach-pxa/pcm990-baseboard.c
@@ -321,11 +321,14 @@ static void pcm990_mci_exit(struct device *dev, void *data)
321#define MSECS_PER_JIFFY (1000/HZ) 321#define MSECS_PER_JIFFY (1000/HZ)
322 322
323static struct pxamci_platform_data pcm990_mci_platform_data = { 323static struct pxamci_platform_data pcm990_mci_platform_data = {
324 .detect_delay = 250 / MSECS_PER_JIFFY, 324 .detect_delay = 250 / MSECS_PER_JIFFY,
325 .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, 325 .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
326 .init = pcm990_mci_init, 326 .init = pcm990_mci_init,
327 .setpower = pcm990_mci_setpower, 327 .setpower = pcm990_mci_setpower,
328 .exit = pcm990_mci_exit, 328 .exit = pcm990_mci_exit,
329 .gpio_card_detect = -1,
330 .gpio_card_ro = -1,
331 .gpio_power = -1,
329}; 332};
330 333
331static struct pxaohci_platform_data pcm990_ohci_platform_data = { 334static struct pxaohci_platform_data pcm990_ohci_platform_data = {
@@ -356,19 +359,12 @@ static unsigned long pcm990_camera_pin_config[] = {
356 GPIO44_CIF_LV, 359 GPIO44_CIF_LV,
357}; 360};
358 361
359static int pcm990_pxacamera_init(struct device *dev)
360{
361 pxa2xx_mfp_config(ARRAY_AND_SIZE(pcm990_camera_pin_config));
362 return 0;
363}
364
365/* 362/*
366 * CICR4: PCLK_EN: Pixel clock is supplied by the sensor 363 * CICR4: PCLK_EN: Pixel clock is supplied by the sensor
367 * MCLK_EN: Master clock is generated by PXA 364 * MCLK_EN: Master clock is generated by PXA
368 * PCP: Data sampled on the falling edge of pixel clock 365 * PCP: Data sampled on the falling edge of pixel clock
369 */ 366 */
370struct pxacamera_platform_data pcm990_pxacamera_platform_data = { 367struct pxacamera_platform_data pcm990_pxacamera_platform_data = {
371 .init = pcm990_pxacamera_init,
372 .flags = PXA_CAMERA_MASTER | PXA_CAMERA_DATAWIDTH_8 | PXA_CAMERA_DATAWIDTH_10 | 368 .flags = PXA_CAMERA_MASTER | PXA_CAMERA_DATAWIDTH_8 | PXA_CAMERA_DATAWIDTH_10 |
373 PXA_CAMERA_PCLK_EN | PXA_CAMERA_MCLK_EN/* | PXA_CAMERA_PCP*/, 369 PXA_CAMERA_PCLK_EN | PXA_CAMERA_MCLK_EN/* | PXA_CAMERA_PCP*/,
374 .mclk_10khz = 1000, 370 .mclk_10khz = 1000,
@@ -427,25 +423,56 @@ static void pcm990_camera_free_bus(struct soc_camera_link *link)
427 gpio_bus_switch = -EINVAL; 423 gpio_bus_switch = -EINVAL;
428} 424}
429 425
430static struct soc_camera_link iclink = {
431 .bus_id = 0, /* Must match with the camera ID above */
432 .query_bus_param = pcm990_camera_query_bus_param,
433 .set_bus_param = pcm990_camera_set_bus_param,
434 .free_bus = pcm990_camera_free_bus,
435};
436
437/* Board I2C devices. */ 426/* Board I2C devices. */
438static struct i2c_board_info __initdata pcm990_i2c_devices[] = { 427static struct i2c_board_info __initdata pcm990_i2c_devices[] = {
439 { 428 {
440 /* Must initialize before the camera(s) */ 429 /* Must initialize before the camera(s) */
441 I2C_BOARD_INFO("pca9536", 0x41), 430 I2C_BOARD_INFO("pca9536", 0x41),
442 .platform_data = &pca9536_data, 431 .platform_data = &pca9536_data,
443 }, { 432 },
433};
434
435static struct i2c_board_info pcm990_camera_i2c[] = {
436 {
444 I2C_BOARD_INFO("mt9v022", 0x48), 437 I2C_BOARD_INFO("mt9v022", 0x48),
445 .platform_data = &iclink, /* With extender */
446 }, { 438 }, {
447 I2C_BOARD_INFO("mt9m001", 0x5d), 439 I2C_BOARD_INFO("mt9m001", 0x5d),
448 .platform_data = &iclink, /* With extender */ 440 },
441};
442
443static struct soc_camera_link iclink[] = {
444 {
445 .bus_id = 0, /* Must match with the camera ID */
446 .board_info = &pcm990_camera_i2c[0],
447 .i2c_adapter_id = 0,
448 .query_bus_param = pcm990_camera_query_bus_param,
449 .set_bus_param = pcm990_camera_set_bus_param,
450 .free_bus = pcm990_camera_free_bus,
451 .module_name = "mt9v022",
452 }, {
453 .bus_id = 0, /* Must match with the camera ID */
454 .board_info = &pcm990_camera_i2c[1],
455 .i2c_adapter_id = 0,
456 .query_bus_param = pcm990_camera_query_bus_param,
457 .set_bus_param = pcm990_camera_set_bus_param,
458 .free_bus = pcm990_camera_free_bus,
459 .module_name = "mt9m001",
460 },
461};
462
463static struct platform_device pcm990_camera[] = {
464 {
465 .name = "soc-camera-pdrv",
466 .id = 0,
467 .dev = {
468 .platform_data = &iclink[0],
469 },
470 }, {
471 .name = "soc-camera-pdrv",
472 .id = 1,
473 .dev = {
474 .platform_data = &iclink[1],
475 },
449 }, 476 },
450}; 477};
451#endif /* CONFIG_VIDEO_PXA27x ||CONFIG_VIDEO_PXA27x_MODULE */ 478#endif /* CONFIG_VIDEO_PXA27x ||CONFIG_VIDEO_PXA27x_MODULE */
@@ -498,9 +525,13 @@ void __init pcm990_baseboard_init(void)
498 pxa_set_ac97_info(NULL); 525 pxa_set_ac97_info(NULL);
499 526
500#if defined(CONFIG_VIDEO_PXA27x) || defined(CONFIG_VIDEO_PXA27x_MODULE) 527#if defined(CONFIG_VIDEO_PXA27x) || defined(CONFIG_VIDEO_PXA27x_MODULE)
528 pxa2xx_mfp_config(ARRAY_AND_SIZE(pcm990_camera_pin_config));
501 pxa_set_camera_info(&pcm990_pxacamera_platform_data); 529 pxa_set_camera_info(&pcm990_pxacamera_platform_data);
502 530
503 i2c_register_board_info(0, ARRAY_AND_SIZE(pcm990_i2c_devices)); 531 i2c_register_board_info(0, ARRAY_AND_SIZE(pcm990_i2c_devices));
532
533 platform_device_register(&pcm990_camera[0]);
534 platform_device_register(&pcm990_camera[1]);
504#endif 535#endif
505 536
506 printk(KERN_INFO "PCM-990 Evaluation baseboard initialized\n"); 537 printk(KERN_INFO "PCM-990 Evaluation baseboard initialized\n");
diff --git a/arch/arm/mach-pxa/poodle.c b/arch/arm/mach-pxa/poodle.c
index 9352d4a34837..e5eeb3a62d01 100644
--- a/arch/arm/mach-pxa/poodle.c
+++ b/arch/arm/mach-pxa/poodle.c
@@ -245,20 +245,10 @@ static inline void poodle_init_spi(void) {}
245 * The card detect interrupt isn't debounced so we delay it by 250ms 245 * The card detect interrupt isn't debounced so we delay it by 250ms
246 * to give the card a chance to fully insert/eject. 246 * to give the card a chance to fully insert/eject.
247 */ 247 */
248static struct pxamci_platform_data poodle_mci_platform_data;
249
250static int poodle_mci_init(struct device *dev, irq_handler_t poodle_detect_int, void *data) 248static int poodle_mci_init(struct device *dev, irq_handler_t poodle_detect_int, void *data)
251{ 249{
252 int err; 250 int err;
253 251
254 err = gpio_request(POODLE_GPIO_nSD_DETECT, "nSD_DETECT");
255 if (err)
256 goto err_out;
257
258 err = gpio_request(POODLE_GPIO_nSD_WP, "nSD_WP");
259 if (err)
260 goto err_free_1;
261
262 err = gpio_request(POODLE_GPIO_SD_PWR, "SD_PWR"); 252 err = gpio_request(POODLE_GPIO_SD_PWR, "SD_PWR");
263 if (err) 253 if (err)
264 goto err_free_2; 254 goto err_free_2;
@@ -267,34 +257,14 @@ static int poodle_mci_init(struct device *dev, irq_handler_t poodle_detect_int,
267 if (err) 257 if (err)
268 goto err_free_3; 258 goto err_free_3;
269 259
270 gpio_direction_input(POODLE_GPIO_nSD_DETECT);
271 gpio_direction_input(POODLE_GPIO_nSD_WP);
272
273 gpio_direction_output(POODLE_GPIO_SD_PWR, 0); 260 gpio_direction_output(POODLE_GPIO_SD_PWR, 0);
274 gpio_direction_output(POODLE_GPIO_SD_PWR1, 0); 261 gpio_direction_output(POODLE_GPIO_SD_PWR1, 0);
275 262
276 poodle_mci_platform_data.detect_delay = msecs_to_jiffies(250);
277
278 err = request_irq(POODLE_IRQ_GPIO_nSD_DETECT, poodle_detect_int,
279 IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
280 "MMC card detect", data);
281 if (err) {
282 pr_err("%s: MMC/SD: can't request MMC card detect IRQ\n",
283 __func__);
284 goto err_free_4;
285 }
286
287 return 0; 263 return 0;
288 264
289err_free_4:
290 gpio_free(POODLE_GPIO_SD_PWR1);
291err_free_3: 265err_free_3:
292 gpio_free(POODLE_GPIO_SD_PWR); 266 gpio_free(POODLE_GPIO_SD_PWR);
293err_free_2: 267err_free_2:
294 gpio_free(POODLE_GPIO_nSD_WP);
295err_free_1:
296 gpio_free(POODLE_GPIO_nSD_DETECT);
297err_out:
298 return err; 268 return err;
299} 269}
300 270
@@ -312,62 +282,29 @@ static void poodle_mci_setpower(struct device *dev, unsigned int vdd)
312 } 282 }
313} 283}
314 284
315static int poodle_mci_get_ro(struct device *dev)
316{
317 return !!gpio_get_value(POODLE_GPIO_nSD_WP);
318 return GPLR(POODLE_GPIO_nSD_WP) & GPIO_bit(POODLE_GPIO_nSD_WP);
319}
320
321
322static void poodle_mci_exit(struct device *dev, void *data) 285static void poodle_mci_exit(struct device *dev, void *data)
323{ 286{
324 free_irq(POODLE_IRQ_GPIO_nSD_DETECT, data);
325 gpio_free(POODLE_GPIO_SD_PWR1); 287 gpio_free(POODLE_GPIO_SD_PWR1);
326 gpio_free(POODLE_GPIO_SD_PWR); 288 gpio_free(POODLE_GPIO_SD_PWR);
327 gpio_free(POODLE_GPIO_nSD_WP);
328 gpio_free(POODLE_GPIO_nSD_DETECT);
329} 289}
330 290
331static struct pxamci_platform_data poodle_mci_platform_data = { 291static struct pxamci_platform_data poodle_mci_platform_data = {
332 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, 292 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34,
333 .init = poodle_mci_init, 293 .init = poodle_mci_init,
334 .get_ro = poodle_mci_get_ro, 294 .setpower = poodle_mci_setpower,
335 .setpower = poodle_mci_setpower, 295 .exit = poodle_mci_exit,
336 .exit = poodle_mci_exit, 296 .gpio_card_detect = POODLE_IRQ_GPIO_nSD_DETECT,
297 .gpio_card_ro = POODLE_GPIO_nSD_WP,
298 .gpio_power = -1,
337}; 299};
338 300
339 301
340/* 302/*
341 * Irda 303 * Irda
342 */ 304 */
343static void poodle_irda_transceiver_mode(struct device *dev, int mode)
344{
345 gpio_set_value(POODLE_GPIO_IR_ON, mode & IR_OFF);
346 pxa2xx_transceiver_mode(dev, mode);
347}
348
349static int poodle_irda_startup(struct device *dev)
350{
351 int err;
352
353 err = gpio_request(POODLE_GPIO_IR_ON, "IR_ON");
354 if (err)
355 return err;
356
357 gpio_direction_output(POODLE_GPIO_IR_ON, 1);
358 return 0;
359}
360
361static void poodle_irda_shutdown(struct device *dev)
362{
363 gpio_free(POODLE_GPIO_IR_ON);
364}
365
366static struct pxaficp_platform_data poodle_ficp_platform_data = { 305static struct pxaficp_platform_data poodle_ficp_platform_data = {
306 .gpio_pwdown = POODLE_GPIO_IR_ON,
367 .transceiver_cap = IR_SIRMODE | IR_OFF, 307 .transceiver_cap = IR_SIRMODE | IR_OFF,
368 .transceiver_mode = poodle_irda_transceiver_mode,
369 .startup = poodle_irda_startup,
370 .shutdown = poodle_irda_shutdown,
371}; 308};
372 309
373 310
@@ -512,6 +449,10 @@ static void __init poodle_init(void)
512 449
513 pxa2xx_mfp_config(ARRAY_AND_SIZE(poodle_pin_config)); 450 pxa2xx_mfp_config(ARRAY_AND_SIZE(poodle_pin_config));
514 451
452 pxa_set_ffuart_info(NULL);
453 pxa_set_btuart_info(NULL);
454 pxa_set_stuart_info(NULL);
455
515 platform_scoop_config = &poodle_pcmcia_config; 456 platform_scoop_config = &poodle_pcmcia_config;
516 457
517 ret = platform_add_devices(devices, ARRAY_SIZE(devices)); 458 ret = platform_add_devices(devices, ARRAY_SIZE(devices));
@@ -521,6 +462,7 @@ static void __init poodle_init(void)
521 set_pxa_fb_parent(&poodle_locomo_device.dev); 462 set_pxa_fb_parent(&poodle_locomo_device.dev);
522 set_pxa_fb_info(&poodle_fb_info); 463 set_pxa_fb_info(&poodle_fb_info);
523 pxa_set_udc_info(&udc_info); 464 pxa_set_udc_info(&udc_info);
465 poodle_mci_platform_data.detect_delay = msecs_to_jiffies(250);
524 pxa_set_mci_info(&poodle_mci_platform_data); 466 pxa_set_mci_info(&poodle_mci_platform_data);
525 pxa_set_ficp_info(&poodle_ficp_platform_data); 467 pxa_set_ficp_info(&poodle_ficp_platform_data);
526 pxa_set_i2c_info(NULL); 468 pxa_set_i2c_info(NULL);
diff --git a/arch/arm/mach-pxa/pxa25x.c b/arch/arm/mach-pxa/pxa25x.c
index 77c2693cfeef..2c1b0b70d01d 100644
--- a/arch/arm/mach-pxa/pxa25x.c
+++ b/arch/arm/mach-pxa/pxa25x.c
@@ -322,9 +322,6 @@ void __init pxa26x_init_irq(void)
322 322
323static struct platform_device *pxa25x_devices[] __initdata = { 323static struct platform_device *pxa25x_devices[] __initdata = {
324 &pxa25x_device_udc, 324 &pxa25x_device_udc,
325 &pxa_device_ffuart,
326 &pxa_device_btuart,
327 &pxa_device_stuart,
328 &pxa_device_i2s, 325 &pxa_device_i2s,
329 &sa1100_device_rtc, 326 &sa1100_device_rtc,
330 &pxa25x_device_ssp, 327 &pxa25x_device_ssp,
@@ -372,10 +369,8 @@ static int __init pxa25x_init(void)
372 } 369 }
373 370
374 /* Only add HWUART for PXA255/26x; PXA210/250 do not have it. */ 371 /* Only add HWUART for PXA255/26x; PXA210/250 do not have it. */
375 if (cpu_is_pxa255()) { 372 if (cpu_is_pxa255())
376 clks_register(&pxa25x_hwuart_clkreg, 1); 373 clks_register(&pxa25x_hwuart_clkreg, 1);
377 ret = platform_device_register(&pxa_device_hwuart);
378 }
379 374
380 return ret; 375 return ret;
381} 376}
diff --git a/arch/arm/mach-pxa/pxa27x.c b/arch/arm/mach-pxa/pxa27x.c
index ec68cc16b4e3..6a0b73167e03 100644
--- a/arch/arm/mach-pxa/pxa27x.c
+++ b/arch/arm/mach-pxa/pxa27x.c
@@ -364,9 +364,6 @@ void __init pxa27x_set_i2c_power_info(struct i2c_pxa_platform_data *info)
364 364
365static struct platform_device *devices[] __initdata = { 365static struct platform_device *devices[] __initdata = {
366 &pxa27x_device_udc, 366 &pxa27x_device_udc,
367 &pxa_device_ffuart,
368 &pxa_device_btuart,
369 &pxa_device_stuart,
370 &pxa_device_i2s, 367 &pxa_device_i2s,
371 &sa1100_device_rtc, 368 &sa1100_device_rtc,
372 &pxa_device_rtc, 369 &pxa_device_rtc,
diff --git a/arch/arm/mach-pxa/pxa2xx.c b/arch/arm/mach-pxa/pxa2xx.c
index 2f3394f85917..868270421b8c 100644
--- a/arch/arm/mach-pxa/pxa2xx.c
+++ b/arch/arm/mach-pxa/pxa2xx.c
@@ -52,3 +52,4 @@ void pxa2xx_transceiver_mode(struct device *dev, int mode)
52 } else 52 } else
53 BUG(); 53 BUG();
54} 54}
55EXPORT_SYMBOL_GPL(pxa2xx_transceiver_mode);
diff --git a/arch/arm/mach-pxa/pxa300.c b/arch/arm/mach-pxa/pxa300.c
index 4ba6d21f851c..f4af6e2bef89 100644
--- a/arch/arm/mach-pxa/pxa300.c
+++ b/arch/arm/mach-pxa/pxa300.c
@@ -84,9 +84,11 @@ static struct mfp_addr_map pxa310_mfp_addr_map[] __initdata = {
84}; 84};
85 85
86static DEFINE_PXA3_CKEN(common_nand, NAND, 156000000, 0); 86static DEFINE_PXA3_CKEN(common_nand, NAND, 156000000, 0);
87static DEFINE_PXA3_CKEN(gcu, PXA300_GCU, 0, 0);
87 88
88static struct clk_lookup common_clkregs[] = { 89static struct clk_lookup common_clkregs[] = {
89 INIT_CLKREG(&clk_common_nand, "pxa3xx-nand", NULL), 90 INIT_CLKREG(&clk_common_nand, "pxa3xx-nand", NULL),
91 INIT_CLKREG(&clk_gcu, "pxa3xx-gcu", NULL),
90}; 92};
91 93
92static DEFINE_PXA3_CKEN(pxa310_mmc3, MMC3, 19500000, 0); 94static DEFINE_PXA3_CKEN(pxa310_mmc3, MMC3, 19500000, 0);
diff --git a/arch/arm/mach-pxa/pxa320.c b/arch/arm/mach-pxa/pxa320.c
index 8b3d97efadab..c7373e74a109 100644
--- a/arch/arm/mach-pxa/pxa320.c
+++ b/arch/arm/mach-pxa/pxa320.c
@@ -78,9 +78,11 @@ static struct mfp_addr_map pxa320_mfp_addr_map[] __initdata = {
78}; 78};
79 79
80static DEFINE_PXA3_CKEN(pxa320_nand, NAND, 104000000, 0); 80static DEFINE_PXA3_CKEN(pxa320_nand, NAND, 104000000, 0);
81static DEFINE_PXA3_CKEN(gcu, PXA320_GCU, 0, 0);
81 82
82static struct clk_lookup pxa320_clkregs[] = { 83static struct clk_lookup pxa320_clkregs[] = {
83 INIT_CLKREG(&clk_pxa320_nand, "pxa3xx-nand", NULL), 84 INIT_CLKREG(&clk_pxa320_nand, "pxa3xx-nand", NULL),
85 INIT_CLKREG(&clk_gcu, "pxa3xx-gcu", NULL),
84}; 86};
85 87
86static int __init pxa320_init(void) 88static int __init pxa320_init(void)
diff --git a/arch/arm/mach-pxa/pxa3xx.c b/arch/arm/mach-pxa/pxa3xx.c
index 09b7b1a10cad..fcb0721f4669 100644
--- a/arch/arm/mach-pxa/pxa3xx.c
+++ b/arch/arm/mach-pxa/pxa3xx.c
@@ -30,6 +30,7 @@
30#include <mach/pm.h> 30#include <mach/pm.h>
31#include <mach/dma.h> 31#include <mach/dma.h>
32#include <mach/ssp.h> 32#include <mach/ssp.h>
33#include <mach/regs-intc.h>
33#include <plat/i2c.h> 34#include <plat/i2c.h>
34 35
35#include "generic.h" 36#include "generic.h"
@@ -45,6 +46,9 @@
45#define ACCR_D0CS (1 << 26) 46#define ACCR_D0CS (1 << 26)
46#define ACCR_PCCE (1 << 11) 47#define ACCR_PCCE (1 << 11)
47 48
49#define PECR_IE(n) ((1 << ((n) * 2)) << 28)
50#define PECR_IS(n) ((1 << ((n) * 2)) << 29)
51
48/* crystal frequency to static memory controller multiplier (SMCFS) */ 52/* crystal frequency to static memory controller multiplier (SMCFS) */
49static unsigned char smcfs_mult[8] = { 6, 0, 8, 0, 0, 16, }; 53static unsigned char smcfs_mult[8] = { 6, 0, 8, 0, 0, 16, };
50 54
@@ -237,6 +241,7 @@ static DEFINE_PXA3_CKEN(pxa3xx_stuart, STUART, 14857000, 1);
237static DEFINE_PXA3_CKEN(pxa3xx_i2c, I2C, 32842000, 0); 241static DEFINE_PXA3_CKEN(pxa3xx_i2c, I2C, 32842000, 0);
238static DEFINE_PXA3_CKEN(pxa3xx_udc, UDC, 48000000, 5); 242static DEFINE_PXA3_CKEN(pxa3xx_udc, UDC, 48000000, 5);
239static DEFINE_PXA3_CKEN(pxa3xx_usbh, USBH, 48000000, 0); 243static DEFINE_PXA3_CKEN(pxa3xx_usbh, USBH, 48000000, 0);
244static DEFINE_PXA3_CKEN(pxa3xx_u2d, USB2, 48000000, 0);
240static DEFINE_PXA3_CKEN(pxa3xx_keypad, KEYPAD, 32768, 0); 245static DEFINE_PXA3_CKEN(pxa3xx_keypad, KEYPAD, 32768, 0);
241static DEFINE_PXA3_CKEN(pxa3xx_ssp1, SSP1, 13000000, 0); 246static DEFINE_PXA3_CKEN(pxa3xx_ssp1, SSP1, 13000000, 0);
242static DEFINE_PXA3_CKEN(pxa3xx_ssp2, SSP2, 13000000, 0); 247static DEFINE_PXA3_CKEN(pxa3xx_ssp2, SSP2, 13000000, 0);
@@ -261,6 +266,7 @@ static struct clk_lookup pxa3xx_clkregs[] = {
261 INIT_CLKREG(&clk_pxa3xx_i2c, "pxa2xx-i2c.0", NULL), 266 INIT_CLKREG(&clk_pxa3xx_i2c, "pxa2xx-i2c.0", NULL),
262 INIT_CLKREG(&clk_pxa3xx_udc, "pxa27x-udc", NULL), 267 INIT_CLKREG(&clk_pxa3xx_udc, "pxa27x-udc", NULL),
263 INIT_CLKREG(&clk_pxa3xx_usbh, "pxa27x-ohci", NULL), 268 INIT_CLKREG(&clk_pxa3xx_usbh, "pxa27x-ohci", NULL),
269 INIT_CLKREG(&clk_pxa3xx_u2d, NULL, "U2DCLK"),
264 INIT_CLKREG(&clk_pxa3xx_keypad, "pxa27x-keypad", NULL), 270 INIT_CLKREG(&clk_pxa3xx_keypad, "pxa27x-keypad", NULL),
265 INIT_CLKREG(&clk_pxa3xx_ssp1, "pxa27x-ssp.0", NULL), 271 INIT_CLKREG(&clk_pxa3xx_ssp1, "pxa27x-ssp.0", NULL),
266 INIT_CLKREG(&clk_pxa3xx_ssp2, "pxa27x-ssp.1", NULL), 272 INIT_CLKREG(&clk_pxa3xx_ssp2, "pxa27x-ssp.1", NULL),
@@ -530,6 +536,43 @@ static inline void pxa3xx_init_pm(void) {}
530#define pxa3xx_set_wake NULL 536#define pxa3xx_set_wake NULL
531#endif 537#endif
532 538
539static void pxa_ack_ext_wakeup(unsigned int irq)
540{
541 PECR |= PECR_IS(irq - IRQ_WAKEUP0);
542}
543
544static void pxa_mask_ext_wakeup(unsigned int irq)
545{
546 ICMR2 &= ~(1 << ((irq - PXA_IRQ(0)) & 0x1f));
547 PECR &= ~PECR_IE(irq - IRQ_WAKEUP0);
548}
549
550static void pxa_unmask_ext_wakeup(unsigned int irq)
551{
552 ICMR2 |= 1 << ((irq - PXA_IRQ(0)) & 0x1f);
553 PECR |= PECR_IE(irq - IRQ_WAKEUP0);
554}
555
556static struct irq_chip pxa_ext_wakeup_chip = {
557 .name = "WAKEUP",
558 .ack = pxa_ack_ext_wakeup,
559 .mask = pxa_mask_ext_wakeup,
560 .unmask = pxa_unmask_ext_wakeup,
561};
562
563static void __init pxa_init_ext_wakeup_irq(set_wake_t fn)
564{
565 int irq;
566
567 for (irq = IRQ_WAKEUP0; irq <= IRQ_WAKEUP1; irq++) {
568 set_irq_chip(irq, &pxa_ext_wakeup_chip);
569 set_irq_handler(irq, handle_edge_irq);
570 set_irq_flags(irq, IRQF_VALID);
571 }
572
573 pxa_ext_wakeup_chip.set_wake = fn;
574}
575
533void __init pxa3xx_init_irq(void) 576void __init pxa3xx_init_irq(void)
534{ 577{
535 /* enable CP6 access */ 578 /* enable CP6 access */
@@ -539,6 +582,7 @@ void __init pxa3xx_init_irq(void)
539 __asm__ __volatile__("mcr p15, 0, %0, c15, c1, 0\n": :"r"(value)); 582 __asm__ __volatile__("mcr p15, 0, %0, c15, c1, 0\n": :"r"(value));
540 583
541 pxa_init_irq(56, pxa3xx_set_wake); 584 pxa_init_irq(56, pxa3xx_set_wake);
585 pxa_init_ext_wakeup_irq(pxa3xx_set_wake);
542 pxa_init_gpio(IRQ_GPIO_2_x, 2, 127, NULL); 586 pxa_init_gpio(IRQ_GPIO_2_x, 2, 127, NULL);
543} 587}
544 588
@@ -553,9 +597,6 @@ void __init pxa3xx_set_i2c_power_info(struct i2c_pxa_platform_data *info)
553 597
554static struct platform_device *devices[] __initdata = { 598static struct platform_device *devices[] __initdata = {
555 &pxa27x_device_udc, 599 &pxa27x_device_udc,
556 &pxa_device_ffuart,
557 &pxa_device_btuart,
558 &pxa_device_stuart,
559 &pxa_device_i2s, 600 &pxa_device_i2s,
560 &sa1100_device_rtc, 601 &sa1100_device_rtc,
561 &pxa_device_rtc, 602 &pxa_device_rtc,
diff --git a/arch/arm/mach-pxa/pxa930.c b/arch/arm/mach-pxa/pxa930.c
index 71131742fffd..064292008288 100644
--- a/arch/arm/mach-pxa/pxa930.c
+++ b/arch/arm/mach-pxa/pxa930.c
@@ -176,13 +176,30 @@ static struct mfp_addr_map pxa930_mfp_addr_map[] __initdata = {
176 MFP_ADDR_END, 176 MFP_ADDR_END,
177}; 177};
178 178
179static struct mfp_addr_map pxa935_mfp_addr_map[] __initdata = {
180 MFP_ADDR(GPIO159, 0x0524),
181 MFP_ADDR(GPIO163, 0x0534),
182 MFP_ADDR(GPIO167, 0x0544),
183 MFP_ADDR(GPIO168, 0x0548),
184 MFP_ADDR(GPIO169, 0x054c),
185 MFP_ADDR(GPIO170, 0x0550),
186 MFP_ADDR(GPIO171, 0x0554),
187 MFP_ADDR(GPIO172, 0x0558),
188 MFP_ADDR(GPIO173, 0x055c),
189
190 MFP_ADDR_END,
191};
192
179static int __init pxa930_init(void) 193static int __init pxa930_init(void)
180{ 194{
181 if (cpu_is_pxa930()) { 195 if (cpu_is_pxa930() || cpu_is_pxa935()) {
182 mfp_init_base(io_p2v(MFPR_BASE)); 196 mfp_init_base(io_p2v(MFPR_BASE));
183 mfp_init_addr(pxa930_mfp_addr_map); 197 mfp_init_addr(pxa930_mfp_addr_map);
184 } 198 }
185 199
200 if (cpu_is_pxa935())
201 mfp_init_addr(pxa935_mfp_addr_map);
202
186 return 0; 203 return 0;
187} 204}
188 205
diff --git a/arch/arm/mach-pxa/saar.c b/arch/arm/mach-pxa/saar.c
index 8241a63ea589..115b6f234bdd 100644
--- a/arch/arm/mach-pxa/saar.c
+++ b/arch/arm/mach-pxa/saar.c
@@ -22,9 +22,13 @@
22#include <linux/i2c.h> 22#include <linux/i2c.h>
23#include <linux/smc91x.h> 23#include <linux/smc91x.h>
24#include <linux/mfd/da903x.h> 24#include <linux/mfd/da903x.h>
25#include <linux/mtd/mtd.h>
26#include <linux/mtd/partitions.h>
27#include <linux/mtd/onenand.h>
25 28
26#include <asm/mach-types.h> 29#include <asm/mach-types.h>
27#include <asm/mach/arch.h> 30#include <asm/mach/arch.h>
31#include <asm/mach/flash.h>
28 32
29#include <mach/pxa930.h> 33#include <mach/pxa930.h>
30#include <plat/i2c.h> 34#include <plat/i2c.h>
@@ -33,7 +37,7 @@
33#include "devices.h" 37#include "devices.h"
34#include "generic.h" 38#include "generic.h"
35 39
36#define GPIO_LCD_RESET (16) 40#define GPIO_LCD_RESET (16)
37 41
38/* SAAR MFP configurations */ 42/* SAAR MFP configurations */
39static mfp_cfg_t saar_mfp_cfg[] __initdata = { 43static mfp_cfg_t saar_mfp_cfg[] __initdata = {
@@ -56,6 +60,31 @@ static mfp_cfg_t saar_mfp_cfg[] __initdata = {
56 /* Ethernet */ 60 /* Ethernet */
57 DF_nCS1_nCS3, 61 DF_nCS1_nCS3,
58 GPIO97_GPIO, 62 GPIO97_GPIO,
63
64 /* DFI */
65 DF_INT_RnB_ND_INT_RnB,
66 DF_nRE_nOE_ND_nRE,
67 DF_nWE_ND_nWE,
68 DF_CLE_nOE_ND_CLE,
69 DF_nADV1_ALE_ND_ALE,
70 DF_nADV2_ALE_nCS3,
71 DF_nCS0_ND_nCS0,
72 DF_IO0_ND_IO0,
73 DF_IO1_ND_IO1,
74 DF_IO2_ND_IO2,
75 DF_IO3_ND_IO3,
76 DF_IO4_ND_IO4,
77 DF_IO5_ND_IO5,
78 DF_IO6_ND_IO6,
79 DF_IO7_ND_IO7,
80 DF_IO8_ND_IO8,
81 DF_IO9_ND_IO9,
82 DF_IO10_ND_IO10,
83 DF_IO11_ND_IO11,
84 DF_IO12_ND_IO12,
85 DF_IO13_ND_IO13,
86 DF_IO14_ND_IO14,
87 DF_IO15_ND_IO15,
59}; 88};
60 89
61#define SAAR_ETH_PHYS (0x14000000) 90#define SAAR_ETH_PHYS (0x14000000)
@@ -451,10 +480,15 @@ static inline void saar_init_lcd(void) {}
451#endif 480#endif
452 481
453#if defined(CONFIG_I2C_PXA) || defined(CONFIG_I2C_PXA_MODULE) 482#if defined(CONFIG_I2C_PXA) || defined(CONFIG_I2C_PXA_MODULE)
483static struct da9034_backlight_pdata saar_da9034_backlight = {
484 .output_current = 4, /* 4mA */
485};
486
454static struct da903x_subdev_info saar_da9034_subdevs[] = { 487static struct da903x_subdev_info saar_da9034_subdevs[] = {
455 [0] = { 488 [0] = {
456 .name = "da903x-backlight", 489 .name = "da903x-backlight",
457 .id = DA9034_ID_WLED, 490 .id = DA9034_ID_WLED,
491 .platform_data = &saar_da9034_backlight,
458 }, 492 },
459}; 493};
460 494
@@ -480,12 +514,81 @@ static void __init saar_init_i2c(void)
480#else 514#else
481static inline void saar_init_i2c(void) {} 515static inline void saar_init_i2c(void) {}
482#endif 516#endif
517
518#if defined(CONFIG_MTD_ONENAND) || defined(CONFIG_MTD_ONENAND_MODULE)
519static struct mtd_partition saar_onenand_partitions[] = {
520 {
521 .name = "bootloader",
522 .offset = 0,
523 .size = SZ_1M,
524 .mask_flags = MTD_WRITEABLE,
525 }, {
526 .name = "reserved",
527 .offset = MTDPART_OFS_APPEND,
528 .size = SZ_128K,
529 .mask_flags = MTD_WRITEABLE,
530 }, {
531 .name = "reserved",
532 .offset = MTDPART_OFS_APPEND,
533 .size = SZ_8M,
534 .mask_flags = MTD_WRITEABLE,
535 }, {
536 .name = "kernel",
537 .offset = MTDPART_OFS_APPEND,
538 .size = (SZ_2M + SZ_1M),
539 .mask_flags = 0,
540 }, {
541 .name = "filesystem",
542 .offset = MTDPART_OFS_APPEND,
543 .size = SZ_48M,
544 .mask_flags = 0,
545 }
546};
547
548static struct onenand_platform_data saar_onenand_info = {
549 .parts = saar_onenand_partitions,
550 .nr_parts = ARRAY_SIZE(saar_onenand_partitions),
551};
552
553#define SMC_CS0_PHYS_BASE (0x10000000)
554
555static struct resource saar_resource_onenand[] = {
556 [0] = {
557 .start = SMC_CS0_PHYS_BASE,
558 .end = SMC_CS0_PHYS_BASE + SZ_1M,
559 .flags = IORESOURCE_MEM,
560 },
561};
562
563static struct platform_device saar_device_onenand = {
564 .name = "onenand-flash",
565 .id = -1,
566 .dev = {
567 .platform_data = &saar_onenand_info,
568 },
569 .resource = saar_resource_onenand,
570 .num_resources = ARRAY_SIZE(saar_resource_onenand),
571};
572
573static void __init saar_init_onenand(void)
574{
575 platform_device_register(&saar_device_onenand);
576}
577#else
578static void __init saar_init_onenand(void) {}
579#endif
580
483static void __init saar_init(void) 581static void __init saar_init(void)
484{ 582{
485 /* initialize MFP configurations */ 583 /* initialize MFP configurations */
486 pxa3xx_mfp_config(ARRAY_AND_SIZE(saar_mfp_cfg)); 584 pxa3xx_mfp_config(ARRAY_AND_SIZE(saar_mfp_cfg));
487 585
586 pxa_set_ffuart_info(NULL);
587 pxa_set_btuart_info(NULL);
588 pxa_set_stuart_info(NULL);
589
488 platform_device_register(&smc91x_device); 590 platform_device_register(&smc91x_device);
591 saar_init_onenand();
489 592
490 saar_init_i2c(); 593 saar_init_i2c();
491 saar_init_lcd(); 594 saar_init_lcd();
diff --git a/arch/arm/mach-pxa/sharpsl.h b/arch/arm/mach-pxa/sharpsl.h
index 55259f4756c8..1439785d3979 100644
--- a/arch/arm/mach-pxa/sharpsl.h
+++ b/arch/arm/mach-pxa/sharpsl.h
@@ -42,8 +42,8 @@ void corgi_lcdtg_hw_init(int mode);
42#define MAX1111_BATT_TEMP 2u 42#define MAX1111_BATT_TEMP 2u
43#define MAX1111_ACIN_VOLT 6u 43#define MAX1111_ACIN_VOLT 6u
44 44
45extern struct battery_thresh spitz_battery_levels_acin[]; 45extern struct battery_thresh sharpsl_battery_levels_acin[];
46extern struct battery_thresh spitz_battery_levels_noac[]; 46extern struct battery_thresh sharpsl_battery_levels_noac[];
47int sharpsl_pm_pxa_read_max1111(int channel); 47int sharpsl_pm_pxa_read_max1111(int channel);
48 48
49 49
diff --git a/arch/arm/mach-pxa/sharpsl_pm.c b/arch/arm/mach-pxa/sharpsl_pm.c
index 2546c066cd6e..67229a1ef55c 100644
--- a/arch/arm/mach-pxa/sharpsl_pm.c
+++ b/arch/arm/mach-pxa/sharpsl_pm.c
@@ -78,7 +78,7 @@ DEFINE_LED_TRIGGER(sharpsl_charge_led_trigger);
78 78
79 79
80 80
81struct battery_thresh spitz_battery_levels_acin[] = { 81struct battery_thresh sharpsl_battery_levels_acin[] = {
82 { 213, 100}, 82 { 213, 100},
83 { 212, 98}, 83 { 212, 98},
84 { 211, 95}, 84 { 211, 95},
@@ -121,7 +121,7 @@ struct battery_thresh spitz_battery_levels_acin[] = {
121 { 0, 0}, 121 { 0, 0},
122}; 122};
123 123
124struct battery_thresh spitz_battery_levels_noac[] = { 124struct battery_thresh sharpsl_battery_levels_noac[] = {
125 { 213, 100}, 125 { 213, 100},
126 { 212, 98}, 126 { 212, 98},
127 { 211, 95}, 127 { 211, 95},
@@ -165,19 +165,20 @@ struct battery_thresh spitz_battery_levels_noac[] = {
165}; 165};
166 166
167/* MAX1111 Commands */ 167/* MAX1111 Commands */
168#define MAXCTRL_PD0 1u << 0 168#define MAXCTRL_PD0 (1u << 0)
169#define MAXCTRL_PD1 1u << 1 169#define MAXCTRL_PD1 (1u << 1)
170#define MAXCTRL_SGL 1u << 2 170#define MAXCTRL_SGL (1u << 2)
171#define MAXCTRL_UNI 1u << 3 171#define MAXCTRL_UNI (1u << 3)
172#define MAXCTRL_SEL_SH 4 172#define MAXCTRL_SEL_SH 4
173#define MAXCTRL_STR 1u << 7 173#define MAXCTRL_STR (1u << 7)
174 174
175/* 175/*
176 * Read MAX1111 ADC 176 * Read MAX1111 ADC
177 */ 177 */
178int sharpsl_pm_pxa_read_max1111(int channel) 178int sharpsl_pm_pxa_read_max1111(int channel)
179{ 179{
180 if (machine_is_tosa()) // Ugly, better move this function into another module 180 /* Ugly, better move this function into another module */
181 if (machine_is_tosa())
181 return 0; 182 return 0;
182 183
183#ifdef CONFIG_CORGI_SSP_DEPRECATED 184#ifdef CONFIG_CORGI_SSP_DEPRECATED
@@ -238,7 +239,7 @@ EXPORT_SYMBOL(sharpsl_battery_kick);
238 239
239static void sharpsl_battery_thread(struct work_struct *private_) 240static void sharpsl_battery_thread(struct work_struct *private_)
240{ 241{
241 int voltage, percent, apm_status, i = 0; 242 int voltage, percent, apm_status, i;
242 243
243 if (!sharpsl_pm.machinfo) 244 if (!sharpsl_pm.machinfo)
244 return; 245 return;
@@ -250,15 +251,14 @@ static void sharpsl_battery_thread(struct work_struct *private_)
250 && time_after(jiffies, sharpsl_pm.charge_start_time + SHARPSL_CHARGE_ON_TIME_INTERVAL)) 251 && time_after(jiffies, sharpsl_pm.charge_start_time + SHARPSL_CHARGE_ON_TIME_INTERVAL))
251 schedule_delayed_work(&toggle_charger, 0); 252 schedule_delayed_work(&toggle_charger, 0);
252 253
253 while(1) { 254 for (i = 0; i < 5; i++) {
254 voltage = sharpsl_pm.machinfo->read_devdata(SHARPSL_BATT_VOLT); 255 voltage = sharpsl_pm.machinfo->read_devdata(SHARPSL_BATT_VOLT);
255 256 if (voltage > 0)
256 if (voltage > 0) break;
257 if (i++ > 5) {
258 voltage = sharpsl_pm.machinfo->bat_levels_noac[0].voltage;
259 dev_warn(sharpsl_pm.dev, "Warning: Cannot read main battery!\n");
260 break; 257 break;
261 } 258 }
259 if (voltage <= 0) {
260 voltage = sharpsl_pm.machinfo->bat_levels_noac[0].voltage;
261 dev_warn(sharpsl_pm.dev, "Warning: Cannot read main battery!\n");
262 } 262 }
263 263
264 voltage = sharpsl_average_value(voltage); 264 voltage = sharpsl_average_value(voltage);
@@ -266,8 +266,10 @@ static void sharpsl_battery_thread(struct work_struct *private_)
266 percent = get_percentage(voltage); 266 percent = get_percentage(voltage);
267 267
268 /* At low battery voltages, the voltage has a tendency to start 268 /* At low battery voltages, the voltage has a tendency to start
269 creeping back up so we try to avoid this here */ 269 creeping back up so we try to avoid this here */
270 if ((sharpsl_pm.battstat.ac_status == APM_AC_ONLINE) || (apm_status == APM_BATTERY_STATUS_HIGH) || percent <= sharpsl_pm.battstat.mainbat_percent) { 270 if ((sharpsl_pm.battstat.ac_status == APM_AC_ONLINE)
271 || (apm_status == APM_BATTERY_STATUS_HIGH)
272 || percent <= sharpsl_pm.battstat.mainbat_percent) {
271 sharpsl_pm.battstat.mainbat_voltage = voltage; 273 sharpsl_pm.battstat.mainbat_voltage = voltage;
272 sharpsl_pm.battstat.mainbat_status = apm_status; 274 sharpsl_pm.battstat.mainbat_status = apm_status;
273 sharpsl_pm.battstat.mainbat_percent = percent; 275 sharpsl_pm.battstat.mainbat_percent = percent;
@@ -279,8 +281,8 @@ static void sharpsl_battery_thread(struct work_struct *private_)
279#ifdef CONFIG_BACKLIGHT_CORGI 281#ifdef CONFIG_BACKLIGHT_CORGI
280 /* If battery is low. limit backlight intensity to save power. */ 282 /* If battery is low. limit backlight intensity to save power. */
281 if ((sharpsl_pm.battstat.ac_status != APM_AC_ONLINE) 283 if ((sharpsl_pm.battstat.ac_status != APM_AC_ONLINE)
282 && ((sharpsl_pm.battstat.mainbat_status == APM_BATTERY_STATUS_LOW) || 284 && ((sharpsl_pm.battstat.mainbat_status == APM_BATTERY_STATUS_LOW)
283 (sharpsl_pm.battstat.mainbat_status == APM_BATTERY_STATUS_CRITICAL))) { 285 || (sharpsl_pm.battstat.mainbat_status == APM_BATTERY_STATUS_CRITICAL))) {
284 if (!(sharpsl_pm.flags & SHARPSL_BL_LIMIT)) { 286 if (!(sharpsl_pm.flags & SHARPSL_BL_LIMIT)) {
285 sharpsl_pm.machinfo->backlight_limit(1); 287 sharpsl_pm.machinfo->backlight_limit(1);
286 sharpsl_pm.flags |= SHARPSL_BL_LIMIT; 288 sharpsl_pm.flags |= SHARPSL_BL_LIMIT;
@@ -293,8 +295,8 @@ static void sharpsl_battery_thread(struct work_struct *private_)
293 295
294 /* Suspend if critical battery level */ 296 /* Suspend if critical battery level */
295 if ((sharpsl_pm.battstat.ac_status != APM_AC_ONLINE) 297 if ((sharpsl_pm.battstat.ac_status != APM_AC_ONLINE)
296 && (sharpsl_pm.battstat.mainbat_status == APM_BATTERY_STATUS_CRITICAL) 298 && (sharpsl_pm.battstat.mainbat_status == APM_BATTERY_STATUS_CRITICAL)
297 && !(sharpsl_pm.flags & SHARPSL_APM_QUEUED)) { 299 && !(sharpsl_pm.flags & SHARPSL_APM_QUEUED)) {
298 sharpsl_pm.flags |= SHARPSL_APM_QUEUED; 300 sharpsl_pm.flags |= SHARPSL_APM_QUEUED;
299 dev_err(sharpsl_pm.dev, "Fatal Off\n"); 301 dev_err(sharpsl_pm.dev, "Fatal Off\n");
300 apm_queue_event(APM_CRITICAL_SUSPEND); 302 apm_queue_event(APM_CRITICAL_SUSPEND);
@@ -346,7 +348,7 @@ static void sharpsl_charge_error(void)
346 348
347static void sharpsl_charge_toggle(struct work_struct *private_) 349static void sharpsl_charge_toggle(struct work_struct *private_)
348{ 350{
349 dev_dbg(sharpsl_pm.dev, "Toogling Charger at time: %lx\n", jiffies); 351 dev_dbg(sharpsl_pm.dev, "Toggling Charger at time: %lx\n", jiffies);
350 352
351 if (!sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_ACIN)) { 353 if (!sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_ACIN)) {
352 sharpsl_charge_off(); 354 sharpsl_charge_off();
@@ -368,7 +370,7 @@ static void sharpsl_ac_timer(unsigned long data)
368{ 370{
369 int acin = sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_ACIN); 371 int acin = sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_ACIN);
370 372
371 dev_dbg(sharpsl_pm.dev, "AC Status: %d\n",acin); 373 dev_dbg(sharpsl_pm.dev, "AC Status: %d\n", acin);
372 374
373 sharpsl_average_clear(); 375 sharpsl_average_clear();
374 if (acin && (sharpsl_pm.charge_mode != CHRG_ON)) 376 if (acin && (sharpsl_pm.charge_mode != CHRG_ON))
@@ -472,14 +474,14 @@ static int sharpsl_average_value(int ad)
472 sharpsl_ad[sharpsl_ad_index] = ad; 474 sharpsl_ad[sharpsl_ad_index] = ad;
473 sharpsl_ad_index++; 475 sharpsl_ad_index++;
474 if (sharpsl_ad_index >= SHARPSL_CNV_VALUE_NUM) { 476 if (sharpsl_ad_index >= SHARPSL_CNV_VALUE_NUM) {
475 for (i=0; i < (SHARPSL_CNV_VALUE_NUM-1); i++) 477 for (i = 0; i < (SHARPSL_CNV_VALUE_NUM-1); i++)
476 sharpsl_ad[i] = sharpsl_ad[i+1]; 478 sharpsl_ad[i] = sharpsl_ad[i+1];
477 sharpsl_ad_index = SHARPSL_CNV_VALUE_NUM - 1; 479 sharpsl_ad_index = SHARPSL_CNV_VALUE_NUM - 1;
478 } 480 }
479 for (i=0; i < sharpsl_ad_index; i++) 481 for (i = 0; i < sharpsl_ad_index; i++)
480 ad_val += sharpsl_ad[i]; 482 ad_val += sharpsl_ad[i];
481 483
482 return (ad_val / sharpsl_ad_index); 484 return ad_val / sharpsl_ad_index;
483} 485}
484 486
485/* 487/*
@@ -492,8 +494,8 @@ static int get_select_val(int *val)
492 494
493 /* Find MAX val */ 495 /* Find MAX val */
494 temp = val[0]; 496 temp = val[0];
495 j=0; 497 j = 0;
496 for (i=1; i<5; i++) { 498 for (i = 1; i < 5; i++) {
497 if (temp < val[i]) { 499 if (temp < val[i]) {
498 temp = val[i]; 500 temp = val[i];
499 j = i; 501 j = i;
@@ -502,21 +504,21 @@ static int get_select_val(int *val)
502 504
503 /* Find MIN val */ 505 /* Find MIN val */
504 temp = val[4]; 506 temp = val[4];
505 k=4; 507 k = 4;
506 for (i=3; i>=0; i--) { 508 for (i = 3; i >= 0; i--) {
507 if (temp > val[i]) { 509 if (temp > val[i]) {
508 temp = val[i]; 510 temp = val[i];
509 k = i; 511 k = i;
510 } 512 }
511 } 513 }
512 514
513 for (i=0; i<5; i++) 515 for (i = 0; i < 5; i++)
514 if (i != j && i != k ) 516 if (i != j && i != k)
515 sum += val[i]; 517 sum += val[i];
516 518
517 dev_dbg(sharpsl_pm.dev, "Average: %d from values: %d, %d, %d, %d, %d\n", sum/3, val[0], val[1], val[2], val[3], val[4]); 519 dev_dbg(sharpsl_pm.dev, "Average: %d from values: %d, %d, %d, %d, %d\n", sum/3, val[0], val[1], val[2], val[3], val[4]);
518 520
519 return (sum/3); 521 return sum/3;
520} 522}
521 523
522static int sharpsl_check_battery_temp(void) 524static int sharpsl_check_battery_temp(void)
@@ -524,7 +526,7 @@ static int sharpsl_check_battery_temp(void)
524 int val, i, buff[5]; 526 int val, i, buff[5];
525 527
526 /* Check battery temperature */ 528 /* Check battery temperature */
527 for (i=0; i<5; i++) { 529 for (i = 0; i < 5; i++) {
528 mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_TEMP); 530 mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_TEMP);
529 sharpsl_pm.machinfo->measure_temp(1); 531 sharpsl_pm.machinfo->measure_temp(1);
530 mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_TEMP); 532 mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_TEMP);
@@ -557,7 +559,7 @@ static int sharpsl_check_battery_voltage(void)
557 sharpsl_pm.machinfo->discharge1(1); 559 sharpsl_pm.machinfo->discharge1(1);
558 560
559 /* Check battery voltage */ 561 /* Check battery voltage */
560 for (i=0; i<5; i++) { 562 for (i = 0; i < 5; i++) {
561 buff[i] = sharpsl_pm.machinfo->read_devdata(SHARPSL_BATT_VOLT); 563 buff[i] = sharpsl_pm.machinfo->read_devdata(SHARPSL_BATT_VOLT);
562 mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_VOLT); 564 mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_VOLT);
563 } 565 }
@@ -581,16 +583,16 @@ static int sharpsl_ac_check(void)
581{ 583{
582 int temp, i, buff[5]; 584 int temp, i, buff[5];
583 585
584 for (i=0; i<5; i++) { 586 for (i = 0; i < 5; i++) {
585 buff[i] = sharpsl_pm.machinfo->read_devdata(SHARPSL_ACIN_VOLT); 587 buff[i] = sharpsl_pm.machinfo->read_devdata(SHARPSL_ACIN_VOLT);
586 mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_ACIN); 588 mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_ACIN);
587 } 589 }
588 590
589 temp = get_select_val(buff); 591 temp = get_select_val(buff);
590 dev_dbg(sharpsl_pm.dev, "AC Voltage: %d\n",temp); 592 dev_dbg(sharpsl_pm.dev, "AC Voltage: %d\n", temp);
591 593
592 if ((temp > sharpsl_pm.machinfo->charge_acin_high) || (temp < sharpsl_pm.machinfo->charge_acin_low)) { 594 if ((temp > sharpsl_pm.machinfo->charge_acin_high) || (temp < sharpsl_pm.machinfo->charge_acin_low)) {
593 dev_err(sharpsl_pm.dev, "Error: AC check failed.\n"); 595 dev_err(sharpsl_pm.dev, "Error: AC check failed: voltage %d.\n", temp);
594 return -1; 596 return -1;
595 } 597 }
596 598
@@ -624,9 +626,9 @@ static int sharpsl_pm_resume(struct platform_device *pdev)
624 626
625static void corgi_goto_sleep(unsigned long alarm_time, unsigned int alarm_enable, suspend_state_t state) 627static void corgi_goto_sleep(unsigned long alarm_time, unsigned int alarm_enable, suspend_state_t state)
626{ 628{
627 dev_dbg(sharpsl_pm.dev, "Time is: %08x\n",RCNR); 629 dev_dbg(sharpsl_pm.dev, "Time is: %08x\n", RCNR);
628 630
629 dev_dbg(sharpsl_pm.dev, "Offline Charge Activate = %d\n",sharpsl_pm.flags & SHARPSL_DO_OFFLINE_CHRG); 631 dev_dbg(sharpsl_pm.dev, "Offline Charge Activate = %d\n", sharpsl_pm.flags & SHARPSL_DO_OFFLINE_CHRG);
630 /* not charging and AC-IN! */ 632 /* not charging and AC-IN! */
631 633
632 if ((sharpsl_pm.flags & SHARPSL_DO_OFFLINE_CHRG) && (sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_ACIN))) { 634 if ((sharpsl_pm.flags & SHARPSL_DO_OFFLINE_CHRG) && (sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_ACIN))) {
@@ -644,12 +646,12 @@ static void corgi_goto_sleep(unsigned long alarm_time, unsigned int alarm_enable
644 if ((sharpsl_pm.charge_mode == CHRG_ON) && ((alarm_enable && ((alarm_time - RCNR) > (SHARPSL_BATCHK_TIME_SUSPEND + 30))) || !alarm_enable)) { 646 if ((sharpsl_pm.charge_mode == CHRG_ON) && ((alarm_enable && ((alarm_time - RCNR) > (SHARPSL_BATCHK_TIME_SUSPEND + 30))) || !alarm_enable)) {
645 RTSR &= RTSR_ALE; 647 RTSR &= RTSR_ALE;
646 RTAR = RCNR + SHARPSL_BATCHK_TIME_SUSPEND; 648 RTAR = RCNR + SHARPSL_BATCHK_TIME_SUSPEND;
647 dev_dbg(sharpsl_pm.dev, "Charging alarm at: %08x\n",RTAR); 649 dev_dbg(sharpsl_pm.dev, "Charging alarm at: %08x\n", RTAR);
648 sharpsl_pm.flags |= SHARPSL_ALARM_ACTIVE; 650 sharpsl_pm.flags |= SHARPSL_ALARM_ACTIVE;
649 } else if (alarm_enable) { 651 } else if (alarm_enable) {
650 RTSR &= RTSR_ALE; 652 RTSR &= RTSR_ALE;
651 RTAR = alarm_time; 653 RTAR = alarm_time;
652 dev_dbg(sharpsl_pm.dev, "User alarm at: %08x\n",RTAR); 654 dev_dbg(sharpsl_pm.dev, "User alarm at: %08x\n", RTAR);
653 } else { 655 } else {
654 dev_dbg(sharpsl_pm.dev, "No alarms set.\n"); 656 dev_dbg(sharpsl_pm.dev, "No alarms set.\n");
655 } 657 }
@@ -658,19 +660,18 @@ static void corgi_goto_sleep(unsigned long alarm_time, unsigned int alarm_enable
658 660
659 sharpsl_pm.machinfo->postsuspend(); 661 sharpsl_pm.machinfo->postsuspend();
660 662
661 dev_dbg(sharpsl_pm.dev, "Corgi woken up from suspend: %08x\n",PEDR); 663 dev_dbg(sharpsl_pm.dev, "Corgi woken up from suspend: %08x\n", PEDR);
662} 664}
663 665
664static int corgi_enter_suspend(unsigned long alarm_time, unsigned int alarm_enable, suspend_state_t state) 666static int corgi_enter_suspend(unsigned long alarm_time, unsigned int alarm_enable, suspend_state_t state)
665{ 667{
666 if (!sharpsl_pm.machinfo->should_wakeup(!(sharpsl_pm.flags & SHARPSL_ALARM_ACTIVE) && alarm_enable) ) 668 if (!sharpsl_pm.machinfo->should_wakeup(!(sharpsl_pm.flags & SHARPSL_ALARM_ACTIVE) && alarm_enable)) {
667 {
668 if (!(sharpsl_pm.flags & SHARPSL_ALARM_ACTIVE)) { 669 if (!(sharpsl_pm.flags & SHARPSL_ALARM_ACTIVE)) {
669 dev_dbg(sharpsl_pm.dev, "No user triggered wakeup events and not charging. Strange. Suspend.\n"); 670 dev_dbg(sharpsl_pm.dev, "No user triggered wakeup events and not charging. Strange. Suspend.\n");
670 corgi_goto_sleep(alarm_time, alarm_enable, state); 671 corgi_goto_sleep(alarm_time, alarm_enable, state);
671 return 1; 672 return 1;
672 } 673 }
673 if(sharpsl_off_charge_battery()) { 674 if (sharpsl_off_charge_battery()) {
674 dev_dbg(sharpsl_pm.dev, "Charging. Suspend...\n"); 675 dev_dbg(sharpsl_pm.dev, "Charging. Suspend...\n");
675 corgi_goto_sleep(alarm_time, alarm_enable, state); 676 corgi_goto_sleep(alarm_time, alarm_enable, state);
676 return 1; 677 return 1;
@@ -678,8 +679,8 @@ static int corgi_enter_suspend(unsigned long alarm_time, unsigned int alarm_enab
678 dev_dbg(sharpsl_pm.dev, "User triggered wakeup in offline charger.\n"); 679 dev_dbg(sharpsl_pm.dev, "User triggered wakeup in offline charger.\n");
679 } 680 }
680 681
681 if ((!sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_LOCK)) || (sharpsl_fatal_check() < 0) ) 682 if ((!sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_LOCK)) ||
682 { 683 (!sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_FATAL))) {
683 dev_err(sharpsl_pm.dev, "Fatal condition. Suspend.\n"); 684 dev_err(sharpsl_pm.dev, "Fatal condition. Suspend.\n");
684 corgi_goto_sleep(alarm_time, alarm_enable, state); 685 corgi_goto_sleep(alarm_time, alarm_enable, state);
685 return 1; 686 return 1;
@@ -697,7 +698,7 @@ static int corgi_pxa_pm_enter(suspend_state_t state)
697 698
698 corgi_goto_sleep(alarm_time, alarm_status, state); 699 corgi_goto_sleep(alarm_time, alarm_status, state);
699 700
700 while (corgi_enter_suspend(alarm_time,alarm_status,state)) 701 while (corgi_enter_suspend(alarm_time, alarm_status, state))
701 {} 702 {}
702 703
703 if (sharpsl_pm.machinfo->earlyresume) 704 if (sharpsl_pm.machinfo->earlyresume)
@@ -732,7 +733,7 @@ static int sharpsl_fatal_check(void)
732 sharpsl_pm.machinfo->discharge1(1); 733 sharpsl_pm.machinfo->discharge1(1);
733 734
734 /* Check battery : check inserting battery ? */ 735 /* Check battery : check inserting battery ? */
735 for (i=0; i<5; i++) { 736 for (i = 0; i < 5; i++) {
736 buff[i] = sharpsl_pm.machinfo->read_devdata(SHARPSL_BATT_VOLT); 737 buff[i] = sharpsl_pm.machinfo->read_devdata(SHARPSL_BATT_VOLT);
737 mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_VOLT); 738 mdelay(SHARPSL_CHECK_BATTERY_WAIT_TIME_VOLT);
738 } 739 }
@@ -812,7 +813,7 @@ static int sharpsl_off_charge_battery(void)
812 mdelay(SHARPSL_CHARGE_CO_CHECK_TIME); 813 mdelay(SHARPSL_CHARGE_CO_CHECK_TIME);
813 814
814 time = RCNR; 815 time = RCNR;
815 while(1) { 816 while (1) {
816 /* Check if any wakeup event had occurred */ 817 /* Check if any wakeup event had occurred */
817 if (sharpsl_pm.machinfo->charger_wakeup() != 0) 818 if (sharpsl_pm.machinfo->charger_wakeup() != 0)
818 return 0; 819 return 0;
@@ -835,9 +836,9 @@ static int sharpsl_off_charge_battery(void)
835 mdelay(SHARPSL_CHARGE_CO_CHECK_TIME); 836 mdelay(SHARPSL_CHARGE_CO_CHECK_TIME);
836 837
837 time = RCNR; 838 time = RCNR;
838 while(1) { 839 while (1) {
839 /* Check if any wakeup event had occurred */ 840 /* Check if any wakeup event had occurred */
840 if (sharpsl_pm.machinfo->charger_wakeup() != 0) 841 if (sharpsl_pm.machinfo->charger_wakeup())
841 return 0; 842 return 0;
842 /* Check for timeout */ 843 /* Check for timeout */
843 if ((RCNR-time) > SHARPSL_WAIT_CO_TIME) { 844 if ((RCNR-time) > SHARPSL_WAIT_CO_TIME) {
@@ -864,12 +865,12 @@ static int sharpsl_off_charge_battery(void)
864 865
865static ssize_t battery_percentage_show(struct device *dev, struct device_attribute *attr, char *buf) 866static ssize_t battery_percentage_show(struct device *dev, struct device_attribute *attr, char *buf)
866{ 867{
867 return sprintf(buf, "%d\n",sharpsl_pm.battstat.mainbat_percent); 868 return sprintf(buf, "%d\n", sharpsl_pm.battstat.mainbat_percent);
868} 869}
869 870
870static ssize_t battery_voltage_show(struct device *dev, struct device_attribute *attr, char *buf) 871static ssize_t battery_voltage_show(struct device *dev, struct device_attribute *attr, char *buf)
871{ 872{
872 return sprintf(buf, "%d\n",sharpsl_pm.battstat.mainbat_voltage); 873 return sprintf(buf, "%d\n", sharpsl_pm.battstat.mainbat_voltage);
873} 874}
874 875
875static DEVICE_ATTR(battery_percentage, 0444, battery_percentage_show, NULL); 876static DEVICE_ATTR(battery_percentage, 0444, battery_percentage_show, NULL);
@@ -943,8 +944,7 @@ static int __init sharpsl_pm_probe(struct platform_device *pdev)
943 } 944 }
944 } 945 }
945 946
946 if (sharpsl_pm.machinfo->batfull_irq) 947 if (sharpsl_pm.machinfo->batfull_irq) {
947 {
948 /* Register interrupt handler. */ 948 /* Register interrupt handler. */
949 if (request_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_batfull), sharpsl_chrg_full_isr, IRQF_DISABLED | IRQF_TRIGGER_RISING, "CO", sharpsl_chrg_full_isr)) { 949 if (request_irq(IRQ_GPIO(sharpsl_pm.machinfo->gpio_batfull), sharpsl_chrg_full_isr, IRQF_DISABLED | IRQF_TRIGGER_RISING, "CO", sharpsl_chrg_full_isr)) {
950 dev_err(sharpsl_pm.dev, "Could not get irq %d.\n", IRQ_GPIO(sharpsl_pm.machinfo->gpio_batfull)); 950 dev_err(sharpsl_pm.dev, "Could not get irq %d.\n", IRQ_GPIO(sharpsl_pm.machinfo->gpio_batfull));
diff --git a/arch/arm/mach-pxa/spitz.c b/arch/arm/mach-pxa/spitz.c
index dda310fe71c8..4b50f144fa48 100644
--- a/arch/arm/mach-pxa/spitz.c
+++ b/arch/arm/mach-pxa/spitz.c
@@ -15,6 +15,7 @@
15#include <linux/kernel.h> 15#include <linux/kernel.h>
16#include <linux/platform_device.h> 16#include <linux/platform_device.h>
17#include <linux/delay.h> 17#include <linux/delay.h>
18#include <linux/gpio_keys.h>
18#include <linux/gpio.h> 19#include <linux/gpio.h>
19#include <linux/leds.h> 20#include <linux/leds.h>
20#include <linux/mtd/physmap.h> 21#include <linux/mtd/physmap.h>
@@ -24,6 +25,7 @@
24#include <linux/spi/ads7846.h> 25#include <linux/spi/ads7846.h>
25#include <linux/spi/corgi_lcd.h> 26#include <linux/spi/corgi_lcd.h>
26#include <linux/mtd/sharpsl.h> 27#include <linux/mtd/sharpsl.h>
28#include <linux/input/matrix_keypad.h>
27 29
28#include <asm/setup.h> 30#include <asm/setup.h>
29#include <asm/mach-types.h> 31#include <asm/mach-types.h>
@@ -111,6 +113,26 @@ static unsigned long spitz_pin_config[] __initdata = {
111 GPIO105_GPIO, /* SPITZ_GPIO_CF_IRQ */ 113 GPIO105_GPIO, /* SPITZ_GPIO_CF_IRQ */
112 GPIO106_GPIO, /* SPITZ_GPIO_CF2_IRQ */ 114 GPIO106_GPIO, /* SPITZ_GPIO_CF2_IRQ */
113 115
116 /* GPIO matrix keypad */
117 GPIO88_GPIO, /* column 0 */
118 GPIO23_GPIO, /* column 1 */
119 GPIO24_GPIO, /* column 2 */
120 GPIO25_GPIO, /* column 3 */
121 GPIO26_GPIO, /* column 4 */
122 GPIO27_GPIO, /* column 5 */
123 GPIO52_GPIO, /* column 6 */
124 GPIO103_GPIO, /* column 7 */
125 GPIO107_GPIO, /* column 8 */
126 GPIO108_GPIO, /* column 9 */
127 GPIO114_GPIO, /* column 10 */
128 GPIO12_GPIO, /* row 0 */
129 GPIO17_GPIO, /* row 1 */
130 GPIO91_GPIO, /* row 2 */
131 GPIO34_GPIO, /* row 3 */
132 GPIO36_GPIO, /* row 4 */
133 GPIO38_GPIO, /* row 5 */
134 GPIO39_GPIO, /* row 6 */
135
114 /* I2C */ 136 /* I2C */
115 GPIO117_I2C_SCL, 137 GPIO117_I2C_SCL,
116 GPIO118_I2C_SDA, 138 GPIO118_I2C_SDA,
@@ -242,9 +264,152 @@ EXPORT_SYMBOL(spitzscoop2_device);
242/* 264/*
243 * Spitz Keyboard Device 265 * Spitz Keyboard Device
244 */ 266 */
267#define SPITZ_KEY_CALENDAR KEY_F1
268#define SPITZ_KEY_ADDRESS KEY_F2
269#define SPITZ_KEY_FN KEY_F3
270#define SPITZ_KEY_CANCEL KEY_F4
271#define SPITZ_KEY_EXOK KEY_F5
272#define SPITZ_KEY_EXCANCEL KEY_F6
273#define SPITZ_KEY_EXJOGDOWN KEY_F7
274#define SPITZ_KEY_EXJOGUP KEY_F8
275#define SPITZ_KEY_JAP1 KEY_LEFTALT
276#define SPITZ_KEY_JAP2 KEY_RIGHTCTRL
277#define SPITZ_KEY_SYNC KEY_F9
278#define SPITZ_KEY_MAIL KEY_F10
279#define SPITZ_KEY_OK KEY_F11
280#define SPITZ_KEY_MENU KEY_F12
281
282static const uint32_t spitzkbd_keymap[] = {
283 KEY(0, 0, KEY_LEFTCTRL),
284 KEY(0, 1, KEY_1),
285 KEY(0, 2, KEY_3),
286 KEY(0, 3, KEY_5),
287 KEY(0, 4, KEY_6),
288 KEY(0, 5, KEY_7),
289 KEY(0, 6, KEY_9),
290 KEY(0, 7, KEY_0),
291 KEY(0, 8, KEY_BACKSPACE),
292 KEY(0, 9, SPITZ_KEY_EXOK), /* EXOK */
293 KEY(0, 10, SPITZ_KEY_EXCANCEL), /* EXCANCEL */
294 KEY(1, 1, KEY_2),
295 KEY(1, 2, KEY_4),
296 KEY(1, 3, KEY_R),
297 KEY(1, 4, KEY_Y),
298 KEY(1, 5, KEY_8),
299 KEY(1, 6, KEY_I),
300 KEY(1, 7, KEY_O),
301 KEY(1, 8, KEY_P),
302 KEY(1, 9, SPITZ_KEY_EXJOGDOWN), /* EXJOGDOWN */
303 KEY(1, 10, SPITZ_KEY_EXJOGUP), /* EXJOGUP */
304 KEY(2, 0, KEY_TAB),
305 KEY(2, 1, KEY_Q),
306 KEY(2, 2, KEY_E),
307 KEY(2, 3, KEY_T),
308 KEY(2, 4, KEY_G),
309 KEY(2, 5, KEY_U),
310 KEY(2, 6, KEY_J),
311 KEY(2, 7, KEY_K),
312 KEY(3, 0, SPITZ_KEY_ADDRESS), /* ADDRESS */
313 KEY(3, 1, KEY_W),
314 KEY(3, 2, KEY_S),
315 KEY(3, 3, KEY_F),
316 KEY(3, 4, KEY_V),
317 KEY(3, 5, KEY_H),
318 KEY(3, 6, KEY_M),
319 KEY(3, 7, KEY_L),
320 KEY(3, 9, KEY_RIGHTSHIFT),
321 KEY(4, 0, SPITZ_KEY_CALENDAR), /* CALENDAR */
322 KEY(4, 1, KEY_A),
323 KEY(4, 2, KEY_D),
324 KEY(4, 3, KEY_C),
325 KEY(4, 4, KEY_B),
326 KEY(4, 5, KEY_N),
327 KEY(4, 6, KEY_DOT),
328 KEY(4, 8, KEY_ENTER),
329 KEY(4, 9, KEY_LEFTSHIFT),
330 KEY(5, 0, SPITZ_KEY_MAIL), /* MAIL */
331 KEY(5, 1, KEY_Z),
332 KEY(5, 2, KEY_X),
333 KEY(5, 3, KEY_MINUS),
334 KEY(5, 4, KEY_SPACE),
335 KEY(5, 5, KEY_COMMA),
336 KEY(5, 7, KEY_UP),
337 KEY(5, 10, SPITZ_KEY_FN), /* FN */
338 KEY(6, 0, KEY_SYSRQ),
339 KEY(6, 1, SPITZ_KEY_JAP1), /* JAP1 */
340 KEY(6, 2, SPITZ_KEY_JAP2), /* JAP2 */
341 KEY(6, 3, SPITZ_KEY_CANCEL), /* CANCEL */
342 KEY(6, 4, SPITZ_KEY_OK), /* OK */
343 KEY(6, 5, SPITZ_KEY_MENU), /* MENU */
344 KEY(6, 6, KEY_LEFT),
345 KEY(6, 7, KEY_DOWN),
346 KEY(6, 8, KEY_RIGHT),
347};
348
349static const struct matrix_keymap_data spitzkbd_keymap_data = {
350 .keymap = spitzkbd_keymap,
351 .keymap_size = ARRAY_SIZE(spitzkbd_keymap),
352};
353
354static const uint32_t spitzkbd_row_gpios[] =
355 { 12, 17, 91, 34, 36, 38, 39 };
356static const uint32_t spitzkbd_col_gpios[] =
357 { 88, 23, 24, 25, 26, 27, 52, 103, 107, 108, 114 };
358
359static struct matrix_keypad_platform_data spitzkbd_pdata = {
360 .keymap_data = &spitzkbd_keymap_data,
361 .row_gpios = spitzkbd_row_gpios,
362 .col_gpios = spitzkbd_col_gpios,
363 .num_row_gpios = ARRAY_SIZE(spitzkbd_row_gpios),
364 .num_col_gpios = ARRAY_SIZE(spitzkbd_col_gpios),
365 .col_scan_delay_us = 10,
366 .debounce_ms = 10,
367 .wakeup = 1,
368};
369
245static struct platform_device spitzkbd_device = { 370static struct platform_device spitzkbd_device = {
246 .name = "spitz-keyboard", 371 .name = "matrix-keypad",
247 .id = -1, 372 .id = -1,
373 .dev = {
374 .platform_data = &spitzkbd_pdata,
375 },
376};
377
378
379static struct gpio_keys_button spitz_gpio_keys[] = {
380 {
381 .type = EV_PWR,
382 .code = KEY_SUSPEND,
383 .gpio = SPITZ_GPIO_ON_KEY,
384 .desc = "On/Off",
385 .wakeup = 1,
386 },
387 /* Two buttons detecting the lid state */
388 {
389 .type = EV_SW,
390 .code = 0,
391 .gpio = SPITZ_GPIO_SWA,
392 .desc = "Display Down",
393 },
394 {
395 .type = EV_SW,
396 .code = 1,
397 .gpio = SPITZ_GPIO_SWB,
398 .desc = "Lid Closed",
399 },
400};
401
402static struct gpio_keys_platform_data spitz_gpio_keys_platform_data = {
403 .buttons = spitz_gpio_keys,
404 .nbuttons = ARRAY_SIZE(spitz_gpio_keys),
405};
406
407static struct platform_device spitz_gpio_keys_device = {
408 .name = "gpio-keys",
409 .id = -1,
410 .dev = {
411 .platform_data = &spitz_gpio_keys_platform_data,
412 },
248}; 413};
249 414
250 415
@@ -296,6 +461,7 @@ static struct ads7846_platform_data spitz_ads7846_info = {
296 .vref_delay_usecs = 100, 461 .vref_delay_usecs = 100,
297 .x_plate_ohms = 419, 462 .x_plate_ohms = 419,
298 .y_plate_ohms = 486, 463 .y_plate_ohms = 486,
464 .pressure_max = 1024,
299 .gpio_pendown = SPITZ_GPIO_TP_INT, 465 .gpio_pendown = SPITZ_GPIO_TP_INT,
300 .wait_for_sync = spitz_wait_for_hsync, 466 .wait_for_sync = spitz_wait_for_hsync,
301}; 467};
@@ -378,45 +544,6 @@ static inline void spitz_init_spi(void) {}
378 * The card detect interrupt isn't debounced so we delay it by 250ms 544 * The card detect interrupt isn't debounced so we delay it by 250ms
379 * to give the card a chance to fully insert/eject. 545 * to give the card a chance to fully insert/eject.
380 */ 546 */
381
382static struct pxamci_platform_data spitz_mci_platform_data;
383
384static int spitz_mci_init(struct device *dev, irq_handler_t spitz_detect_int, void *data)
385{
386 int err;
387
388 err = gpio_request(SPITZ_GPIO_nSD_DETECT, "nSD_DETECT");
389 if (err)
390 goto err_out;
391
392 err = gpio_request(SPITZ_GPIO_nSD_WP, "nSD_WP");
393 if (err)
394 goto err_free_1;
395
396 gpio_direction_input(SPITZ_GPIO_nSD_DETECT);
397 gpio_direction_input(SPITZ_GPIO_nSD_WP);
398
399 spitz_mci_platform_data.detect_delay = msecs_to_jiffies(250);
400
401 err = request_irq(SPITZ_IRQ_GPIO_nSD_DETECT, spitz_detect_int,
402 IRQF_DISABLED | IRQF_TRIGGER_RISING |
403 IRQF_TRIGGER_FALLING,
404 "MMC card detect", data);
405 if (err) {
406 pr_err("%s: MMC/SD: can't request MMC card detect IRQ\n",
407 __func__);
408 goto err_free_2;
409 }
410 return 0;
411
412err_free_2:
413 gpio_free(SPITZ_GPIO_nSD_WP);
414err_free_1:
415 gpio_free(SPITZ_GPIO_nSD_DETECT);
416err_out:
417 return err;
418}
419
420static void spitz_mci_setpower(struct device *dev, unsigned int vdd) 547static void spitz_mci_setpower(struct device *dev, unsigned int vdd)
421{ 548{
422 struct pxamci_platform_data* p_d = dev->platform_data; 549 struct pxamci_platform_data* p_d = dev->platform_data;
@@ -427,24 +554,12 @@ static void spitz_mci_setpower(struct device *dev, unsigned int vdd)
427 spitz_card_pwr_ctrl(SPITZ_PWR_SD, 0x0000); 554 spitz_card_pwr_ctrl(SPITZ_PWR_SD, 0x0000);
428} 555}
429 556
430static int spitz_mci_get_ro(struct device *dev)
431{
432 return gpio_get_value(SPITZ_GPIO_nSD_WP);
433}
434
435static void spitz_mci_exit(struct device *dev, void *data)
436{
437 free_irq(SPITZ_IRQ_GPIO_nSD_DETECT, data);
438 gpio_free(SPITZ_GPIO_nSD_WP);
439 gpio_free(SPITZ_GPIO_nSD_DETECT);
440}
441
442static struct pxamci_platform_data spitz_mci_platform_data = { 557static struct pxamci_platform_data spitz_mci_platform_data = {
443 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, 558 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34,
444 .init = spitz_mci_init, 559 .setpower = spitz_mci_setpower,
445 .get_ro = spitz_mci_get_ro, 560 .gpio_card_detect = SPITZ_GPIO_nSD_DETECT,
446 .setpower = spitz_mci_setpower, 561 .gpio_card_ro = SPITZ_GPIO_nSD_WP,
447 .exit = spitz_mci_exit, 562 .gpio_power = -1,
448}; 563};
449 564
450 565
@@ -484,50 +599,10 @@ static struct pxaohci_platform_data spitz_ohci_platform_data = {
484/* 599/*
485 * Irda 600 * Irda
486 */ 601 */
487static int spitz_irda_startup(struct device *dev)
488{
489 int rc;
490
491 rc = gpio_request(SPITZ_GPIO_IR_ON, "IrDA on");
492 if (rc)
493 goto err;
494
495 rc = gpio_direction_output(SPITZ_GPIO_IR_ON, 1);
496 if (rc)
497 goto err_dir;
498
499 return 0;
500
501err_dir:
502 gpio_free(SPITZ_GPIO_IR_ON);
503err:
504 return rc;
505}
506
507static void spitz_irda_shutdown(struct device *dev)
508{
509 gpio_free(SPITZ_GPIO_IR_ON);
510}
511
512static void spitz_irda_transceiver_mode(struct device *dev, int mode)
513{
514 gpio_set_value(SPITZ_GPIO_IR_ON, mode & IR_OFF);
515 pxa2xx_transceiver_mode(dev, mode);
516}
517
518#ifdef CONFIG_MACH_AKITA
519static void akita_irda_transceiver_mode(struct device *dev, int mode)
520{
521 gpio_set_value(AKITA_GPIO_IR_ON, mode & IR_OFF);
522 pxa2xx_transceiver_mode(dev, mode);
523}
524#endif
525 602
526static struct pxaficp_platform_data spitz_ficp_platform_data = { 603static struct pxaficp_platform_data spitz_ficp_platform_data = {
604/* .gpio_pwdown is set in spitz_init() and akita_init() accordingly */
527 .transceiver_cap = IR_SIRMODE | IR_OFF, 605 .transceiver_cap = IR_SIRMODE | IR_OFF,
528 .transceiver_mode = spitz_irda_transceiver_mode,
529 .startup = spitz_irda_startup,
530 .shutdown = spitz_irda_shutdown,
531}; 606};
532 607
533 608
@@ -652,6 +727,7 @@ static struct platform_device sharpsl_rom_device = {
652static struct platform_device *devices[] __initdata = { 727static struct platform_device *devices[] __initdata = {
653 &spitzscoop_device, 728 &spitzscoop_device,
654 &spitzkbd_device, 729 &spitzkbd_device,
730 &spitz_gpio_keys_device,
655 &spitzled_device, 731 &spitzled_device,
656 &sharpsl_nand_device, 732 &sharpsl_nand_device,
657 &sharpsl_rom_device, 733 &sharpsl_rom_device,
@@ -692,9 +768,14 @@ static void __init common_init(void)
692 768
693 pxa2xx_mfp_config(ARRAY_AND_SIZE(spitz_pin_config)); 769 pxa2xx_mfp_config(ARRAY_AND_SIZE(spitz_pin_config));
694 770
771 pxa_set_ffuart_info(NULL);
772 pxa_set_btuart_info(NULL);
773 pxa_set_stuart_info(NULL);
774
695 spitz_init_spi(); 775 spitz_init_spi();
696 776
697 platform_add_devices(devices, ARRAY_SIZE(devices)); 777 platform_add_devices(devices, ARRAY_SIZE(devices));
778 spitz_mci_platform_data.detect_delay = msecs_to_jiffies(250);
698 pxa_set_mci_info(&spitz_mci_platform_data); 779 pxa_set_mci_info(&spitz_mci_platform_data);
699 pxa_set_ohci_info(&spitz_ohci_platform_data); 780 pxa_set_ohci_info(&spitz_ohci_platform_data);
700 pxa_set_ficp_info(&spitz_ficp_platform_data); 781 pxa_set_ficp_info(&spitz_ficp_platform_data);
@@ -702,9 +783,36 @@ static void __init common_init(void)
702 pxa_set_i2c_info(NULL); 783 pxa_set_i2c_info(NULL);
703} 784}
704 785
786#if defined(CONFIG_MACH_AKITA) || defined(CONFIG_MACH_BORZOI)
787static struct nand_bbt_descr sharpsl_akita_bbt = {
788 .options = 0,
789 .offs = 4,
790 .len = 1,
791 .pattern = scan_ff_pattern
792};
793
794static struct nand_ecclayout akita_oobinfo = {
795 .eccbytes = 24,
796 .eccpos = {
797 0x5, 0x1, 0x2, 0x3, 0x6, 0x7, 0x15, 0x11,
798 0x12, 0x13, 0x16, 0x17, 0x25, 0x21, 0x22, 0x23,
799 0x26, 0x27, 0x35, 0x31, 0x32, 0x33, 0x36, 0x37},
800 .oobfree = {{0x08, 0x09}}
801};
802#endif
803
705#if defined(CONFIG_MACH_SPITZ) || defined(CONFIG_MACH_BORZOI) 804#if defined(CONFIG_MACH_SPITZ) || defined(CONFIG_MACH_BORZOI)
706static void __init spitz_init(void) 805static void __init spitz_init(void)
707{ 806{
807 spitz_ficp_platform_data.gpio_pwdown = SPITZ_GPIO_IR_ON;
808
809#ifdef CONFIG_MACH_BORZOI
810 if (machine_is_borzoi()) {
811 sharpsl_nand_platform_data.badblock_pattern = &sharpsl_akita_bbt;
812 sharpsl_nand_platform_data.ecc_layout = &akita_oobinfo;
813 }
814#endif
815
708 platform_scoop_config = &spitz_pcmcia_config; 816 platform_scoop_config = &spitz_pcmcia_config;
709 817
710 common_init(); 818 common_init();
@@ -729,25 +837,9 @@ static struct i2c_board_info akita_i2c_board_info[] = {
729 }, 837 },
730}; 838};
731 839
732static struct nand_bbt_descr sharpsl_akita_bbt = {
733 .options = 0,
734 .offs = 4,
735 .len = 1,
736 .pattern = scan_ff_pattern
737};
738
739static struct nand_ecclayout akita_oobinfo = {
740 .eccbytes = 24,
741 .eccpos = {
742 0x5, 0x1, 0x2, 0x3, 0x6, 0x7, 0x15, 0x11,
743 0x12, 0x13, 0x16, 0x17, 0x25, 0x21, 0x22, 0x23,
744 0x26, 0x27, 0x35, 0x31, 0x32, 0x33, 0x36, 0x37},
745 .oobfree = {{0x08, 0x09}}
746};
747
748static void __init akita_init(void) 840static void __init akita_init(void)
749{ 841{
750 spitz_ficp_platform_data.transceiver_mode = akita_irda_transceiver_mode; 842 spitz_ficp_platform_data.gpio_pwdown = AKITA_GPIO_IR_ON;
751 843
752 sharpsl_nand_platform_data.badblock_pattern = &sharpsl_akita_bbt; 844 sharpsl_nand_platform_data.badblock_pattern = &sharpsl_akita_bbt;
753 sharpsl_nand_platform_data.ecc_layout = &akita_oobinfo; 845 sharpsl_nand_platform_data.ecc_layout = &akita_oobinfo;
diff --git a/arch/arm/mach-pxa/spitz_pm.c b/arch/arm/mach-pxa/spitz_pm.c
index 724ffb030317..fc5a70c40358 100644
--- a/arch/arm/mach-pxa/spitz_pm.c
+++ b/arch/arm/mach-pxa/spitz_pm.c
@@ -103,7 +103,7 @@ static void spitz_presuspend(void)
103 PFER = GPIO_bit(SPITZ_GPIO_KEY_INT) | GPIO_bit(SPITZ_GPIO_RESET); 103 PFER = GPIO_bit(SPITZ_GPIO_KEY_INT) | GPIO_bit(SPITZ_GPIO_RESET);
104 PWER = GPIO_bit(SPITZ_GPIO_KEY_INT) | GPIO_bit(SPITZ_GPIO_RESET) | PWER_RTC; 104 PWER = GPIO_bit(SPITZ_GPIO_KEY_INT) | GPIO_bit(SPITZ_GPIO_RESET) | PWER_RTC;
105 PKWR = GPIO_bit(SPITZ_GPIO_SYNC) | GPIO_bit(SPITZ_GPIO_KEY_INT) | GPIO_bit(SPITZ_GPIO_RESET); 105 PKWR = GPIO_bit(SPITZ_GPIO_SYNC) | GPIO_bit(SPITZ_GPIO_KEY_INT) | GPIO_bit(SPITZ_GPIO_RESET);
106 PKSR = 0xffffffff; // clear 106 PKSR = 0xffffffff; /* clear */
107 107
108 /* nRESET_OUT Disable */ 108 /* nRESET_OUT Disable */
109 PSLR |= PSLR_SL_ROD; 109 PSLR |= PSLR_SL_ROD;
@@ -149,7 +149,7 @@ static int spitz_should_wakeup(unsigned int resume_on_alarm)
149 if (resume_on_alarm && (PEDR & PWER_RTC)) 149 if (resume_on_alarm && (PEDR & PWER_RTC))
150 is_resume |= PWER_RTC; 150 is_resume |= PWER_RTC;
151 151
152 dev_dbg(sharpsl_pm.dev, "is_resume: %x\n",is_resume); 152 dev_dbg(sharpsl_pm.dev, "is_resume: %x\n", is_resume);
153 return is_resume; 153 return is_resume;
154} 154}
155 155
@@ -160,7 +160,7 @@ static unsigned long spitz_charger_wakeup(void)
160 160
161unsigned long spitzpm_read_devdata(int type) 161unsigned long spitzpm_read_devdata(int type)
162{ 162{
163 switch(type) { 163 switch (type) {
164 case SHARPSL_STATUS_ACIN: 164 case SHARPSL_STATUS_ACIN:
165 return (((~GPLR(SPITZ_GPIO_AC_IN)) & GPIO_bit(SPITZ_GPIO_AC_IN)) != 0); 165 return (((~GPLR(SPITZ_GPIO_AC_IN)) & GPIO_bit(SPITZ_GPIO_AC_IN)) != 0);
166 case SHARPSL_STATUS_LOCK: 166 case SHARPSL_STATUS_LOCK:
@@ -199,7 +199,7 @@ struct sharpsl_charger_machinfo spitz_pm_machinfo = {
199#if defined(CONFIG_LCD_CORGI) 199#if defined(CONFIG_LCD_CORGI)
200 .backlight_limit = corgi_lcd_limit_intensity, 200 .backlight_limit = corgi_lcd_limit_intensity,
201#elif defined(CONFIG_BACKLIGHT_CORGI) 201#elif defined(CONFIG_BACKLIGHT_CORGI)
202 .backlight_limit = corgibl_limit_intensity, 202 .backlight_limit = corgibl_limit_intensity,
203#endif 203#endif
204 .charge_on_volt = SHARPSL_CHARGE_ON_VOLT, 204 .charge_on_volt = SHARPSL_CHARGE_ON_VOLT,
205 .charge_on_temp = SHARPSL_CHARGE_ON_TEMP, 205 .charge_on_temp = SHARPSL_CHARGE_ON_TEMP,
@@ -208,8 +208,8 @@ struct sharpsl_charger_machinfo spitz_pm_machinfo = {
208 .fatal_acin_volt = SHARPSL_FATAL_ACIN_VOLT, 208 .fatal_acin_volt = SHARPSL_FATAL_ACIN_VOLT,
209 .fatal_noacin_volt= SHARPSL_FATAL_NOACIN_VOLT, 209 .fatal_noacin_volt= SHARPSL_FATAL_NOACIN_VOLT,
210 .bat_levels = 40, 210 .bat_levels = 40,
211 .bat_levels_noac = spitz_battery_levels_noac, 211 .bat_levels_noac = sharpsl_battery_levels_noac,
212 .bat_levels_acin = spitz_battery_levels_acin, 212 .bat_levels_acin = sharpsl_battery_levels_acin,
213 .status_high_acin = 188, 213 .status_high_acin = 188,
214 .status_low_acin = 178, 214 .status_low_acin = 178,
215 .status_high_noac = 185, 215 .status_high_noac = 185,
@@ -241,7 +241,7 @@ static int __devinit spitzpm_init(void)
241 241
242static void spitzpm_exit(void) 242static void spitzpm_exit(void)
243{ 243{
244 platform_device_unregister(spitzpm_device); 244 platform_device_unregister(spitzpm_device);
245} 245}
246 246
247module_init(spitzpm_init); 247module_init(spitzpm_init);
diff --git a/arch/arm/mach-pxa/ssp.c b/arch/arm/mach-pxa/ssp.c
index 965e38c6bafe..9ebe658590fa 100644
--- a/arch/arm/mach-pxa/ssp.c
+++ b/arch/arm/mach-pxa/ssp.c
@@ -342,8 +342,9 @@ void ssp_free(struct ssp_device *ssp)
342} 342}
343EXPORT_SYMBOL(ssp_free); 343EXPORT_SYMBOL(ssp_free);
344 344
345static int __devinit ssp_probe(struct platform_device *pdev, int type) 345static int __devinit ssp_probe(struct platform_device *pdev)
346{ 346{
347 const struct platform_device_id *id = platform_get_device_id(pdev);
347 struct resource *res; 348 struct resource *res;
348 struct ssp_device *ssp; 349 struct ssp_device *ssp;
349 int ret = 0; 350 int ret = 0;
@@ -413,7 +414,7 @@ static int __devinit ssp_probe(struct platform_device *pdev, int type)
413 */ 414 */
414 ssp->port_id = pdev->id + 1; 415 ssp->port_id = pdev->id + 1;
415 ssp->use_count = 0; 416 ssp->use_count = 0;
416 ssp->type = type; 417 ssp->type = (int)id->driver_data;
417 418
418 mutex_lock(&ssp_lock); 419 mutex_lock(&ssp_lock);
419 list_add(&ssp->node, &ssp_list); 420 list_add(&ssp->node, &ssp_list);
@@ -457,75 +458,31 @@ static int __devexit ssp_remove(struct platform_device *pdev)
457 return 0; 458 return 0;
458} 459}
459 460
460static int __devinit pxa25x_ssp_probe(struct platform_device *pdev) 461static const struct platform_device_id ssp_id_table[] = {
461{ 462 { "pxa25x-ssp", PXA25x_SSP },
462 return ssp_probe(pdev, PXA25x_SSP); 463 { "pxa25x-nssp", PXA25x_NSSP },
463} 464 { "pxa27x-ssp", PXA27x_SSP },
464 465 { },
465static int __devinit pxa25x_nssp_probe(struct platform_device *pdev)
466{
467 return ssp_probe(pdev, PXA25x_NSSP);
468}
469
470static int __devinit pxa27x_ssp_probe(struct platform_device *pdev)
471{
472 return ssp_probe(pdev, PXA27x_SSP);
473}
474
475static struct platform_driver pxa25x_ssp_driver = {
476 .driver = {
477 .name = "pxa25x-ssp",
478 },
479 .probe = pxa25x_ssp_probe,
480 .remove = __devexit_p(ssp_remove),
481}; 466};
482 467
483static struct platform_driver pxa25x_nssp_driver = { 468static struct platform_driver ssp_driver = {
484 .driver = { 469 .probe = ssp_probe,
485 .name = "pxa25x-nssp",
486 },
487 .probe = pxa25x_nssp_probe,
488 .remove = __devexit_p(ssp_remove), 470 .remove = __devexit_p(ssp_remove),
489};
490
491static struct platform_driver pxa27x_ssp_driver = {
492 .driver = { 471 .driver = {
493 .name = "pxa27x-ssp", 472 .owner = THIS_MODULE,
473 .name = "pxa2xx-ssp",
494 }, 474 },
495 .probe = pxa27x_ssp_probe, 475 .id_table = ssp_id_table,
496 .remove = __devexit_p(ssp_remove),
497}; 476};
498 477
499static int __init pxa_ssp_init(void) 478static int __init pxa_ssp_init(void)
500{ 479{
501 int ret = 0; 480 return platform_driver_register(&ssp_driver);
502
503 ret = platform_driver_register(&pxa25x_ssp_driver);
504 if (ret) {
505 printk(KERN_ERR "failed to register pxa25x_ssp_driver");
506 return ret;
507 }
508
509 ret = platform_driver_register(&pxa25x_nssp_driver);
510 if (ret) {
511 printk(KERN_ERR "failed to register pxa25x_nssp_driver");
512 return ret;
513 }
514
515 ret = platform_driver_register(&pxa27x_ssp_driver);
516 if (ret) {
517 printk(KERN_ERR "failed to register pxa27x_ssp_driver");
518 return ret;
519 }
520
521 return ret;
522} 481}
523 482
524static void __exit pxa_ssp_exit(void) 483static void __exit pxa_ssp_exit(void)
525{ 484{
526 platform_driver_unregister(&pxa25x_ssp_driver); 485 platform_driver_unregister(&ssp_driver);
527 platform_driver_unregister(&pxa25x_nssp_driver);
528 platform_driver_unregister(&pxa27x_ssp_driver);
529} 486}
530 487
531arch_initcall(pxa_ssp_init); 488arch_initcall(pxa_ssp_init);
diff --git a/arch/arm/mach-pxa/stargate2.c b/arch/arm/mach-pxa/stargate2.c
index 3b205b69f3fb..a98a434f0111 100644
--- a/arch/arm/mach-pxa/stargate2.c
+++ b/arch/arm/mach-pxa/stargate2.c
@@ -760,6 +760,10 @@ static void __init stargate2_init(void)
760 760
761 pxa2xx_mfp_config(ARRAY_AND_SIZE(stargate2_pin_config)); 761 pxa2xx_mfp_config(ARRAY_AND_SIZE(stargate2_pin_config));
762 762
763 pxa_set_ffuart_info(NULL);
764 pxa_set_btuart_info(NULL);
765 pxa_set_stuart_info(NULL);
766
763 /* spi chip selects */ 767 /* spi chip selects */
764 gpio_direction_output(37, 0); 768 gpio_direction_output(37, 0);
765 gpio_direction_output(24, 0); 769 gpio_direction_output(24, 0);
diff --git a/arch/arm/mach-pxa/tavorevb.c b/arch/arm/mach-pxa/tavorevb.c
index b75353a2ec75..f02dcb5b4e97 100644
--- a/arch/arm/mach-pxa/tavorevb.c
+++ b/arch/arm/mach-pxa/tavorevb.c
@@ -477,6 +477,10 @@ static void __init tavorevb_init(void)
477 /* initialize MFP configurations */ 477 /* initialize MFP configurations */
478 pxa3xx_mfp_config(ARRAY_AND_SIZE(tavorevb_mfp_cfg)); 478 pxa3xx_mfp_config(ARRAY_AND_SIZE(tavorevb_mfp_cfg));
479 479
480 pxa_set_ffuart_info(NULL);
481 pxa_set_btuart_info(NULL);
482 pxa_set_stuart_info(NULL);
483
480 platform_device_register(&smc91x_device); 484 platform_device_register(&smc91x_device);
481 485
482 tavorevb_init_lcd(); 486 tavorevb_init_lcd();
diff --git a/arch/arm/mach-pxa/tosa.c b/arch/arm/mach-pxa/tosa.c
index 117ad5920e53..c854c168a451 100644
--- a/arch/arm/mach-pxa/tosa.c
+++ b/arch/arm/mach-pxa/tosa.c
@@ -247,49 +247,10 @@ static struct pxa2xx_udc_mach_info udc_info __initdata = {
247/* 247/*
248 * MMC/SD Device 248 * MMC/SD Device
249 */ 249 */
250static struct pxamci_platform_data tosa_mci_platform_data;
251
252static int tosa_mci_init(struct device *dev, irq_handler_t tosa_detect_int, void *data) 250static int tosa_mci_init(struct device *dev, irq_handler_t tosa_detect_int, void *data)
253{ 251{
254 int err; 252 int err;
255 253
256 tosa_mci_platform_data.detect_delay = msecs_to_jiffies(250);
257
258 err = gpio_request(TOSA_GPIO_nSD_DETECT, "MMC/SD card detect");
259 if (err) {
260 printk(KERN_ERR "tosa_mci_init: can't request nSD_DETECT gpio\n");
261 goto err_gpio_detect;
262 }
263 err = gpio_direction_input(TOSA_GPIO_nSD_DETECT);
264 if (err)
265 goto err_gpio_detect_dir;
266
267 err = request_irq(TOSA_IRQ_GPIO_nSD_DETECT, tosa_detect_int,
268 IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
269 "MMC/SD card detect", data);
270 if (err) {
271 printk(KERN_ERR "tosa_mci_init: MMC/SD: can't request MMC card detect IRQ\n");
272 goto err_irq;
273 }
274
275 err = gpio_request(TOSA_GPIO_SD_WP, "SD Write Protect");
276 if (err) {
277 printk(KERN_ERR "tosa_mci_init: can't request SD_WP gpio\n");
278 goto err_gpio_wp;
279 }
280 err = gpio_direction_input(TOSA_GPIO_SD_WP);
281 if (err)
282 goto err_gpio_wp_dir;
283
284 err = gpio_request(TOSA_GPIO_PWR_ON, "SD Power");
285 if (err) {
286 printk(KERN_ERR "tosa_mci_init: can't request SD_PWR gpio\n");
287 goto err_gpio_pwr;
288 }
289 err = gpio_direction_output(TOSA_GPIO_PWR_ON, 0);
290 if (err)
291 goto err_gpio_pwr_dir;
292
293 err = gpio_request(TOSA_GPIO_nSD_INT, "SD Int"); 254 err = gpio_request(TOSA_GPIO_nSD_INT, "SD Int");
294 if (err) { 255 if (err) {
295 printk(KERN_ERR "tosa_mci_init: can't request SD_PWR gpio\n"); 256 printk(KERN_ERR "tosa_mci_init: can't request SD_PWR gpio\n");
@@ -304,51 +265,21 @@ static int tosa_mci_init(struct device *dev, irq_handler_t tosa_detect_int, void
304err_gpio_int_dir: 265err_gpio_int_dir:
305 gpio_free(TOSA_GPIO_nSD_INT); 266 gpio_free(TOSA_GPIO_nSD_INT);
306err_gpio_int: 267err_gpio_int:
307err_gpio_pwr_dir:
308 gpio_free(TOSA_GPIO_PWR_ON);
309err_gpio_pwr:
310err_gpio_wp_dir:
311 gpio_free(TOSA_GPIO_SD_WP);
312err_gpio_wp:
313 free_irq(TOSA_IRQ_GPIO_nSD_DETECT, data);
314err_irq:
315err_gpio_detect_dir:
316 gpio_free(TOSA_GPIO_nSD_DETECT);
317err_gpio_detect:
318 return err; 268 return err;
319} 269}
320 270
321static void tosa_mci_setpower(struct device *dev, unsigned int vdd)
322{
323 struct pxamci_platform_data* p_d = dev->platform_data;
324
325 if (( 1 << vdd) & p_d->ocr_mask) {
326 gpio_set_value(TOSA_GPIO_PWR_ON, 1);
327 } else {
328 gpio_set_value(TOSA_GPIO_PWR_ON, 0);
329 }
330}
331
332static int tosa_mci_get_ro(struct device *dev)
333{
334 return gpio_get_value(TOSA_GPIO_SD_WP);
335}
336
337static void tosa_mci_exit(struct device *dev, void *data) 271static void tosa_mci_exit(struct device *dev, void *data)
338{ 272{
339 gpio_free(TOSA_GPIO_nSD_INT); 273 gpio_free(TOSA_GPIO_nSD_INT);
340 gpio_free(TOSA_GPIO_PWR_ON);
341 gpio_free(TOSA_GPIO_SD_WP);
342 free_irq(TOSA_IRQ_GPIO_nSD_DETECT, data);
343 gpio_free(TOSA_GPIO_nSD_DETECT);
344} 274}
345 275
346static struct pxamci_platform_data tosa_mci_platform_data = { 276static struct pxamci_platform_data tosa_mci_platform_data = {
347 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34, 277 .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34,
348 .init = tosa_mci_init, 278 .init = tosa_mci_init,
349 .get_ro = tosa_mci_get_ro, 279 .exit = tosa_mci_exit,
350 .setpower = tosa_mci_setpower, 280 .gpio_card_detect = TOSA_GPIO_nSD_DETECT,
351 .exit = tosa_mci_exit, 281 .gpio_card_ro = TOSA_GPIO_SD_WP,
282 .gpio_power = TOSA_GPIO_PWR_ON,
352}; 283};
353 284
354/* 285/*
@@ -406,10 +337,11 @@ static void tosa_irda_shutdown(struct device *dev)
406} 337}
407 338
408static struct pxaficp_platform_data tosa_ficp_platform_data = { 339static struct pxaficp_platform_data tosa_ficp_platform_data = {
409 .transceiver_cap = IR_SIRMODE | IR_OFF, 340 .gpio_pwdown = -1,
410 .transceiver_mode = tosa_irda_transceiver_mode, 341 .transceiver_cap = IR_SIRMODE | IR_OFF,
411 .startup = tosa_irda_startup, 342 .transceiver_mode = tosa_irda_transceiver_mode,
412 .shutdown = tosa_irda_shutdown, 343 .startup = tosa_irda_startup,
344 .shutdown = tosa_irda_shutdown,
413}; 345};
414 346
415/* 347/*
@@ -893,6 +825,11 @@ static void __init tosa_init(void)
893 int dummy; 825 int dummy;
894 826
895 pxa2xx_mfp_config(ARRAY_AND_SIZE(tosa_pin_config)); 827 pxa2xx_mfp_config(ARRAY_AND_SIZE(tosa_pin_config));
828
829 pxa_set_ffuart_info(NULL);
830 pxa_set_btuart_info(NULL);
831 pxa_set_stuart_info(NULL);
832
896 gpio_set_wake(MFP_PIN_GPIO1, 1); 833 gpio_set_wake(MFP_PIN_GPIO1, 1);
897 /* We can't pass to gpio-keys since it will drop the Reset altfunc */ 834 /* We can't pass to gpio-keys since it will drop the Reset altfunc */
898 835
@@ -910,6 +847,7 @@ static void __init tosa_init(void)
910 dummy = gpiochip_reserve(TOSA_SCOOP_JC_GPIO_BASE, 12); 847 dummy = gpiochip_reserve(TOSA_SCOOP_JC_GPIO_BASE, 12);
911 dummy = gpiochip_reserve(TOSA_TC6393XB_GPIO_BASE, 16); 848 dummy = gpiochip_reserve(TOSA_TC6393XB_GPIO_BASE, 16);
912 849
850 tosa_mci_platform_data.detect_delay = msecs_to_jiffies(250);
913 pxa_set_mci_info(&tosa_mci_platform_data); 851 pxa_set_mci_info(&tosa_mci_platform_data);
914 pxa_set_udc_info(&udc_info); 852 pxa_set_udc_info(&udc_info);
915 pxa_set_ficp_info(&tosa_ficp_platform_data); 853 pxa_set_ficp_info(&tosa_ficp_platform_data);
diff --git a/arch/arm/mach-pxa/trizeps4.c b/arch/arm/mach-pxa/trizeps4.c
index 825f540176d2..0aa858ebc573 100644
--- a/arch/arm/mach-pxa/trizeps4.c
+++ b/arch/arm/mach-pxa/trizeps4.c
@@ -367,6 +367,9 @@ static struct pxamci_platform_data trizeps4_mci_platform_data = {
367 .exit = trizeps4_mci_exit, 367 .exit = trizeps4_mci_exit,
368 .get_ro = NULL, /* write-protection not supported */ 368 .get_ro = NULL, /* write-protection not supported */
369 .setpower = NULL, /* power-switching not supported */ 369 .setpower = NULL, /* power-switching not supported */
370 .gpio_card_detect = -1,
371 .gpio_card_ro = -1,
372 .gpio_power = -1,
370}; 373};
371 374
372/**************************************************************************** 375/****************************************************************************
@@ -412,6 +415,7 @@ static void trizeps4_irda_transceiver_mode(struct device *dev, int mode)
412} 415}
413 416
414static struct pxaficp_platform_data trizeps4_ficp_platform_data = { 417static struct pxaficp_platform_data trizeps4_ficp_platform_data = {
418 .gpio_pwdown = -1,
415 .transceiver_cap = IR_SIRMODE | IR_FIRMODE | IR_OFF, 419 .transceiver_cap = IR_SIRMODE | IR_FIRMODE | IR_OFF,
416 .transceiver_mode = trizeps4_irda_transceiver_mode, 420 .transceiver_mode = trizeps4_irda_transceiver_mode,
417 .startup = trizeps4_irda_startup, 421 .startup = trizeps4_irda_startup,
@@ -520,6 +524,10 @@ static void __init trizeps4_init(void)
520 ARRAY_SIZE(trizeps4_devices)); 524 ARRAY_SIZE(trizeps4_devices));
521 } 525 }
522 526
527 pxa_set_ffuart_info(NULL);
528 pxa_set_btuart_info(NULL);
529 pxa_set_stuart_info(NULL);
530
523 if (0) /* dont know how to determine LCD */ 531 if (0) /* dont know how to determine LCD */
524 set_pxa_fb_info(&sharp_lcd); 532 set_pxa_fb_info(&sharp_lcd);
525 else 533 else
diff --git a/arch/arm/mach-pxa/viper.c b/arch/arm/mach-pxa/viper.c
index d33c232b686c..cf0d71b7797e 100644
--- a/arch/arm/mach-pxa/viper.c
+++ b/arch/arm/mach-pxa/viper.c
@@ -301,15 +301,6 @@ static void __init viper_init_irq(void)
301 set_irq_chained_handler(gpio_to_irq(VIPER_CPLD_GPIO), 301 set_irq_chained_handler(gpio_to_irq(VIPER_CPLD_GPIO),
302 viper_irq_handler); 302 viper_irq_handler);
303 set_irq_type(gpio_to_irq(VIPER_CPLD_GPIO), IRQ_TYPE_EDGE_BOTH); 303 set_irq_type(gpio_to_irq(VIPER_CPLD_GPIO), IRQ_TYPE_EDGE_BOTH);
304
305#ifndef CONFIG_SERIAL_PXA
306 /*
307 * 8250 doesn't support IRQ_TYPE being passed as part
308 * of the plat_serial8250_port structure...
309 */
310 set_irq_type(gpio_to_irq(VIPER_UARTA_GPIO), IRQ_TYPE_EDGE_RISING);
311 set_irq_type(gpio_to_irq(VIPER_UARTB_GPIO), IRQ_TYPE_EDGE_RISING);
312#endif
313} 304}
314 305
315/* Flat Panel */ 306/* Flat Panel */
@@ -539,6 +530,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
539 { 530 {
540 .mapbase = VIPER_UARTA_PHYS, 531 .mapbase = VIPER_UARTA_PHYS,
541 .irq = gpio_to_irq(VIPER_UARTA_GPIO), 532 .irq = gpio_to_irq(VIPER_UARTA_GPIO),
533 .irqflags = IRQF_TRIGGER_RISING,
542 .uartclk = 1843200, 534 .uartclk = 1843200,
543 .regshift = 1, 535 .regshift = 1,
544 .iotype = UPIO_MEM, 536 .iotype = UPIO_MEM,
@@ -548,6 +540,7 @@ static struct plat_serial8250_port serial_platform_data[] = {
548 { 540 {
549 .mapbase = VIPER_UARTB_PHYS, 541 .mapbase = VIPER_UARTB_PHYS,
550 .irq = gpio_to_irq(VIPER_UARTB_GPIO), 542 .irq = gpio_to_irq(VIPER_UARTB_GPIO),
543 .irqflags = IRQF_TRIGGER_RISING,
551 .uartclk = 1843200, 544 .uartclk = 1843200,
552 .regshift = 1, 545 .regshift = 1,
553 .iotype = UPIO_MEM, 546 .iotype = UPIO_MEM,
@@ -908,6 +901,10 @@ static void __init viper_init(void)
908 901
909 pxa2xx_mfp_config(ARRAY_AND_SIZE(viper_pin_config)); 902 pxa2xx_mfp_config(ARRAY_AND_SIZE(viper_pin_config));
910 903
904 pxa_set_ffuart_info(NULL);
905 pxa_set_btuart_info(NULL);
906 pxa_set_stuart_info(NULL);
907
911 /* Wake-up serial console */ 908 /* Wake-up serial console */
912 viper_init_serial_gpio(); 909 viper_init_serial_gpio();
913 910
diff --git a/arch/arm/mach-pxa/xcep.c b/arch/arm/mach-pxa/xcep.c
new file mode 100644
index 000000000000..d3b4e3f2e033
--- /dev/null
+++ b/arch/arm/mach-pxa/xcep.c
@@ -0,0 +1,192 @@
1/* linux/arch/arm/mach-pxa/xcep.c
2 *
3 * Support for the Iskratel Electronics XCEP platform as used in
4 * the Libera instruments from Instrumentation Technologies.
5 *
6 * Author: Ales Bardorfer <ales@i-tech.si>
7 * Contributions by: Abbott, MG (Michael) <michael.abbott@diamond.ac.uk>
8 * Contributions by: Matej Kenda <matej.kenda@i-tech.si>
9 * Created: June 2006
10 * Copyright: (C) 2006-2009 Instrumentation Technologies
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License version 2 as
14 * published by the Free Software Foundation.
15 */
16
17#include <linux/platform_device.h>
18#include <linux/i2c.h>
19#include <linux/smc91x.h>
20#include <linux/mtd/mtd.h>
21#include <linux/mtd/partitions.h>
22#include <linux/mtd/physmap.h>
23
24#include <asm/mach-types.h>
25#include <asm/mach/arch.h>
26#include <asm/mach/irq.h>
27#include <asm/mach/map.h>
28
29#include <plat/i2c.h>
30
31#include <mach/hardware.h>
32#include <mach/pxa2xx-regs.h>
33#include <mach/mfp-pxa25x.h>
34
35#include "generic.h"
36
37#define XCEP_ETH_PHYS (PXA_CS3_PHYS + 0x00000300)
38#define XCEP_ETH_PHYS_END (PXA_CS3_PHYS + 0x000fffff)
39#define XCEP_ETH_ATTR (PXA_CS3_PHYS + 0x02000000)
40#define XCEP_ETH_ATTR_END (PXA_CS3_PHYS + 0x020fffff)
41#define XCEP_ETH_IRQ IRQ_GPIO0
42
43/* XCEP CPLD base */
44#define XCEP_CPLD_BASE 0xf0000000
45
46
47/* Flash partitions. */
48
49static struct mtd_partition xcep_partitions[] = {
50 {
51 .name = "Bootloader",
52 .size = 0x00040000,
53 .offset = 0,
54 .mask_flags = MTD_WRITEABLE
55 }, {
56 .name = "Bootloader ENV",
57 .size = 0x00040000,
58 .offset = 0x00040000,
59 .mask_flags = MTD_WRITEABLE
60 }, {
61 .name = "Kernel",
62 .size = 0x00100000,
63 .offset = 0x00080000,
64 }, {
65 .name = "Rescue fs",
66 .size = 0x00280000,
67 .offset = 0x00180000,
68 }, {
69 .name = "Filesystem",
70 .size = MTDPART_SIZ_FULL,
71 .offset = 0x00400000
72 }
73};
74
75static struct physmap_flash_data xcep_flash_data[] = {
76 {
77 .width = 4, /* bankwidth in bytes */
78 .parts = xcep_partitions,
79 .nr_parts = ARRAY_SIZE(xcep_partitions)
80 }
81};
82
83static struct resource flash_resource = {
84 .start = PXA_CS0_PHYS,
85 .end = PXA_CS0_PHYS + SZ_32M - 1,
86 .flags = IORESOURCE_MEM,
87};
88
89static struct platform_device flash_device = {
90 .name = "physmap-flash",
91 .id = 0,
92 .dev = {
93 .platform_data = xcep_flash_data,
94 },
95 .resource = &flash_resource,
96 .num_resources = 1,
97};
98
99
100
101/* SMC LAN91C111 network controller. */
102
103static struct resource smc91x_resources[] = {
104 [0] = {
105 .name = "smc91x-regs",
106 .start = XCEP_ETH_PHYS,
107 .end = XCEP_ETH_PHYS_END,
108 .flags = IORESOURCE_MEM,
109 },
110 [1] = {
111 .start = XCEP_ETH_IRQ,
112 .end = XCEP_ETH_IRQ,
113 .flags = IORESOURCE_IRQ,
114 },
115 [2] = {
116 .name = "smc91x-attrib",
117 .start = XCEP_ETH_ATTR,
118 .end = XCEP_ETH_ATTR_END,
119 .flags = IORESOURCE_MEM,
120 },
121};
122
123static struct smc91x_platdata xcep_smc91x_info = {
124 .flags = SMC91X_USE_32BIT | SMC91X_NOWAIT | SMC91X_USE_DMA,
125};
126
127static struct platform_device smc91x_device = {
128 .name = "smc91x",
129 .id = -1,
130 .num_resources = ARRAY_SIZE(smc91x_resources),
131 .resource = smc91x_resources,
132 .dev = {
133 .platform_data = &xcep_smc91x_info,
134 },
135};
136
137
138static struct platform_device *devices[] __initdata = {
139 &flash_device,
140 &smc91x_device,
141};
142
143
144/* We have to state that there are HWMON devices on the I2C bus on XCEP.
145 * Drivers for HWMON verify capabilities of the adapter when loading and
146 * refuse to attach if the adapter doesn't support HWMON class of devices.
147 * See also Documentation/i2c/porting-clients. */
148static struct i2c_pxa_platform_data xcep_i2c_platform_data = {
149 .class = I2C_CLASS_HWMON
150};
151
152
153static mfp_cfg_t xcep_pin_config[] __initdata = {
154 GPIO79_nCS_3, /* SMC 91C111 chip select. */
155 GPIO80_nCS_4, /* CPLD chip select. */
156 /* SSP communication to MSP430 */
157 GPIO23_SSP1_SCLK,
158 GPIO24_SSP1_SFRM,
159 GPIO25_SSP1_TXD,
160 GPIO26_SSP1_RXD,
161 GPIO27_SSP1_EXTCLK
162};
163
164static void __init xcep_init(void)
165{
166 pxa2xx_mfp_config(ARRAY_AND_SIZE(xcep_pin_config));
167
168 pxa_set_ffuart_info(NULL);
169 pxa_set_btuart_info(NULL);
170 pxa_set_stuart_info(NULL);
171 pxa_set_hwuart_info(NULL);
172
173 /* See Intel XScale Developer's Guide for details */
174 /* Set RDF and RDN to appropriate values (chip select 3 (smc91x)) */
175 MSC1 = (MSC1 & 0xffff) | 0xD5540000;
176 /* Set RDF and RDN to appropriate values (chip select 5 (fpga)) */
177 MSC2 = (MSC2 & 0xffff) | 0x72A00000;
178
179 platform_add_devices(ARRAY_AND_SIZE(devices));
180 pxa_set_i2c_info(&xcep_i2c_platform_data);
181}
182
183MACHINE_START(XCEP, "Iskratel XCEP")
184 .phys_io = 0x40000000,
185 .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
186 .boot_params = 0xa0000100,
187 .init_machine = xcep_init,
188 .map_io = pxa_map_io,
189 .init_irq = pxa25x_init_irq,
190 .timer = &pxa_timer,
191MACHINE_END
192
diff --git a/arch/arm/mach-pxa/zylonite.c b/arch/arm/mach-pxa/zylonite.c
index 218d2001f1df..b66e9e2d06e7 100644
--- a/arch/arm/mach-pxa/zylonite.c
+++ b/arch/arm/mach-pxa/zylonite.c
@@ -31,7 +31,7 @@
31#include <mach/mmc.h> 31#include <mach/mmc.h>
32#include <mach/ohci.h> 32#include <mach/ohci.h>
33#include <mach/pxa27x_keypad.h> 33#include <mach/pxa27x_keypad.h>
34#include <mach/pxa3xx_nand.h> 34#include <plat/pxa3xx_nand.h>
35 35
36#include "devices.h" 36#include "devices.h"
37#include "generic.h" 37#include "generic.h"
@@ -290,6 +290,9 @@ static struct pxamci_platform_data zylonite_mci_platform_data = {
290 .init = zylonite_mci_init, 290 .init = zylonite_mci_init,
291 .exit = zylonite_mci_exit, 291 .exit = zylonite_mci_exit,
292 .get_ro = zylonite_mci_ro, 292 .get_ro = zylonite_mci_ro,
293 .gpio_card_detect = -1,
294 .gpio_card_ro = -1,
295 .gpio_power = -1,
293}; 296};
294 297
295static struct pxamci_platform_data zylonite_mci2_platform_data = { 298static struct pxamci_platform_data zylonite_mci2_platform_data = {
@@ -441,6 +444,10 @@ static inline void zylonite_init_ohci(void) {}
441 444
442static void __init zylonite_init(void) 445static void __init zylonite_init(void)
443{ 446{
447 pxa_set_ffuart_info(NULL);
448 pxa_set_btuart_info(NULL);
449 pxa_set_stuart_info(NULL);
450
444 /* board-processor specific initialization */ 451 /* board-processor specific initialization */
445 zylonite_pxa300_init(); 452 zylonite_pxa300_init();
446 zylonite_pxa320_init(); 453 zylonite_pxa320_init();