diff options
Diffstat (limited to 'arch/arm/mach-pxa')
26 files changed, 729 insertions, 189 deletions
diff --git a/arch/arm/mach-pxa/Kconfig b/arch/arm/mach-pxa/Kconfig index 5da7a6820492..914bb33dab92 100644 --- a/arch/arm/mach-pxa/Kconfig +++ b/arch/arm/mach-pxa/Kconfig | |||
@@ -20,8 +20,7 @@ endmenu | |||
20 | 20 | ||
21 | endif | 21 | endif |
22 | 22 | ||
23 | choice | 23 | menu "Select target boards" |
24 | prompt "Select target board" | ||
25 | 24 | ||
26 | config ARCH_GUMSTIX | 25 | config ARCH_GUMSTIX |
27 | bool "Gumstix XScale boards" | 26 | bool "Gumstix XScale boards" |
@@ -37,10 +36,12 @@ config ARCH_LUBBOCK | |||
37 | config MACH_LOGICPD_PXA270 | 36 | config MACH_LOGICPD_PXA270 |
38 | bool "LogicPD PXA270 Card Engine Development Platform" | 37 | bool "LogicPD PXA270 Card Engine Development Platform" |
39 | select PXA27x | 38 | select PXA27x |
39 | select HAVE_PWM | ||
40 | 40 | ||
41 | config MACH_MAINSTONE | 41 | config MACH_MAINSTONE |
42 | bool "Intel HCDDBBVA0 Development Platform" | 42 | bool "Intel HCDDBBVA0 Development Platform" |
43 | select PXA27x | 43 | select PXA27x |
44 | select HAVE_PWM | ||
44 | 45 | ||
45 | config ARCH_PXA_IDP | 46 | config ARCH_PXA_IDP |
46 | bool "Accelent Xscale IDP" | 47 | bool "Accelent Xscale IDP" |
@@ -116,6 +117,7 @@ config MACH_COLIBRI | |||
116 | config MACH_ZYLONITE | 117 | config MACH_ZYLONITE |
117 | bool "PXA3xx Development Platform" | 118 | bool "PXA3xx Development Platform" |
118 | select PXA3xx | 119 | select PXA3xx |
120 | select HAVE_PWM | ||
119 | 121 | ||
120 | config MACH_LITTLETON | 122 | config MACH_LITTLETON |
121 | bool "PXA3xx Form Factor Platform (aka Littleton)" | 123 | bool "PXA3xx Form Factor Platform (aka Littleton)" |
@@ -138,7 +140,7 @@ config MACH_PCM027 | |||
138 | select PXA27x | 140 | select PXA27x |
139 | select IWMMXT | 141 | select IWMMXT |
140 | 142 | ||
141 | endchoice | 143 | endmenu |
142 | 144 | ||
143 | choice | 145 | choice |
144 | prompt "Used baseboard" | 146 | prompt "Used baseboard" |
@@ -146,25 +148,24 @@ choice | |||
146 | 148 | ||
147 | config MACH_PCM990_BASEBOARD | 149 | config MACH_PCM990_BASEBOARD |
148 | bool "PHYTEC PCM-990 development board" | 150 | bool "PHYTEC PCM-990 development board" |
151 | select HAVE_PWM | ||
149 | 152 | ||
150 | endchoice | 153 | endchoice |
151 | 154 | ||
152 | if PXA_SHARPSL | ||
153 | |||
154 | choice | 155 | choice |
155 | prompt "Select target Sharp Zaurus device range" | 156 | prompt "display on pcm990" |
157 | depends on MACH_PCM990_BASEBOARD | ||
156 | 158 | ||
157 | config PXA_SHARPSL_25x | 159 | config PCM990_DISPLAY_SHARP |
158 | bool "Sharp PXA25x models (SL-5600, SL-C7xx and SL-C6000x)" | 160 | bool "sharp lq084v1dg21 stn display" |
159 | select PXA25x | ||
160 | 161 | ||
161 | config PXA_SHARPSL_27x | 162 | config PCM990_DISPLAY_NEC |
162 | bool "Sharp PXA270 models (SL-Cxx00)" | 163 | bool "nec nl6448bc20_18d tft display" |
163 | select PXA27x | ||
164 | 164 | ||
165 | endchoice | 165 | config PCM990_DISPLAY_NONE |
166 | bool "no display" | ||
166 | 167 | ||
167 | endif | 168 | endchoice |
168 | 169 | ||
169 | if ARCH_GUMSTIX | 170 | if ARCH_GUMSTIX |
170 | 171 | ||
@@ -199,28 +200,33 @@ endmenu | |||
199 | 200 | ||
200 | config MACH_POODLE | 201 | config MACH_POODLE |
201 | bool "Enable Sharp SL-5600 (Poodle) Support" | 202 | bool "Enable Sharp SL-5600 (Poodle) Support" |
202 | depends on PXA_SHARPSL_25x | 203 | depends on PXA_SHARPSL |
204 | select PXA25x | ||
203 | select SHARP_LOCOMO | 205 | select SHARP_LOCOMO |
204 | select PXA_SSP | 206 | select PXA_SSP |
205 | 207 | ||
206 | config MACH_CORGI | 208 | config MACH_CORGI |
207 | bool "Enable Sharp SL-C700 (Corgi) Support" | 209 | bool "Enable Sharp SL-C700 (Corgi) Support" |
208 | depends on PXA_SHARPSL_25x | 210 | depends on PXA_SHARPSL |
211 | select PXA25x | ||
209 | select PXA_SHARP_C7xx | 212 | select PXA_SHARP_C7xx |
210 | 213 | ||
211 | config MACH_SHEPHERD | 214 | config MACH_SHEPHERD |
212 | bool "Enable Sharp SL-C750 (Shepherd) Support" | 215 | bool "Enable Sharp SL-C750 (Shepherd) Support" |
213 | depends on PXA_SHARPSL_25x | 216 | depends on PXA_SHARPSL |
217 | select PXA25x | ||
214 | select PXA_SHARP_C7xx | 218 | select PXA_SHARP_C7xx |
215 | 219 | ||
216 | config MACH_HUSKY | 220 | config MACH_HUSKY |
217 | bool "Enable Sharp SL-C760 (Husky) Support" | 221 | bool "Enable Sharp SL-C760 (Husky) Support" |
218 | depends on PXA_SHARPSL_25x | 222 | depends on PXA_SHARPSL |
223 | select PXA25x | ||
219 | select PXA_SHARP_C7xx | 224 | select PXA_SHARP_C7xx |
220 | 225 | ||
221 | config MACH_AKITA | 226 | config MACH_AKITA |
222 | bool "Enable Sharp SL-1000 (Akita) Support" | 227 | bool "Enable Sharp SL-1000 (Akita) Support" |
223 | depends on PXA_SHARPSL_27x | 228 | depends on PXA_SHARPSL |
229 | select PXA27x | ||
224 | select PXA_SHARP_Cxx00 | 230 | select PXA_SHARP_Cxx00 |
225 | select MACH_SPITZ | 231 | select MACH_SPITZ |
226 | select I2C | 232 | select I2C |
@@ -228,17 +234,20 @@ config MACH_AKITA | |||
228 | 234 | ||
229 | config MACH_SPITZ | 235 | config MACH_SPITZ |
230 | bool "Enable Sharp Zaurus SL-3000 (Spitz) Support" | 236 | bool "Enable Sharp Zaurus SL-3000 (Spitz) Support" |
231 | depends on PXA_SHARPSL_27x | 237 | depends on PXA_SHARPSL |
238 | select PXA27x | ||
232 | select PXA_SHARP_Cxx00 | 239 | select PXA_SHARP_Cxx00 |
233 | 240 | ||
234 | config MACH_BORZOI | 241 | config MACH_BORZOI |
235 | bool "Enable Sharp Zaurus SL-3100 (Borzoi) Support" | 242 | bool "Enable Sharp Zaurus SL-3100 (Borzoi) Support" |
236 | depends on PXA_SHARPSL_27x | 243 | depends on PXA_SHARPSL |
244 | select PXA27x | ||
237 | select PXA_SHARP_Cxx00 | 245 | select PXA_SHARP_Cxx00 |
238 | 246 | ||
239 | config MACH_TOSA | 247 | config MACH_TOSA |
240 | bool "Enable Sharp SL-6000x (Tosa) Support" | 248 | bool "Enable Sharp SL-6000x (Tosa) Support" |
241 | depends on PXA_SHARPSL_25x | 249 | depends on PXA_SHARPSL |
250 | select PXA25x | ||
242 | 251 | ||
243 | config PXA25x | 252 | config PXA25x |
244 | bool | 253 | bool |
@@ -273,4 +282,10 @@ config PXA_SSP | |||
273 | tristate | 282 | tristate |
274 | help | 283 | help |
275 | Enable support for PXA2xx SSP ports | 284 | Enable support for PXA2xx SSP ports |
285 | |||
286 | config PXA_PWM | ||
287 | tristate | ||
288 | default BACKLIGHT_PWM | ||
289 | help | ||
290 | Enable support for PXA2xx/PXA3xx PWM controllers | ||
276 | endif | 291 | endif |
diff --git a/arch/arm/mach-pxa/Makefile b/arch/arm/mach-pxa/Makefile index 0e6d05bb81aa..02cbc3cfbe01 100644 --- a/arch/arm/mach-pxa/Makefile +++ b/arch/arm/mach-pxa/Makefile | |||
@@ -10,6 +10,7 @@ obj-$(CONFIG_CPU_FREQ) += cpu-pxa.o | |||
10 | 10 | ||
11 | # Generic drivers that other drivers may depend upon | 11 | # Generic drivers that other drivers may depend upon |
12 | obj-$(CONFIG_PXA_SSP) += ssp.o | 12 | obj-$(CONFIG_PXA_SSP) += ssp.o |
13 | obj-$(CONFIG_PXA_PWM) += pwm.o | ||
13 | 14 | ||
14 | # SoC-specific code | 15 | # SoC-specific code |
15 | obj-$(CONFIG_PXA25x) += mfp-pxa2xx.o pxa25x.o | 16 | obj-$(CONFIG_PXA25x) += mfp-pxa2xx.o pxa25x.o |
diff --git a/arch/arm/mach-pxa/clock.c b/arch/arm/mach-pxa/clock.c index 68afc396b4a1..b4d04955dcb0 100644 --- a/arch/arm/mach-pxa/clock.c +++ b/arch/arm/mach-pxa/clock.c | |||
@@ -12,7 +12,7 @@ | |||
12 | #include <linux/platform_device.h> | 12 | #include <linux/platform_device.h> |
13 | #include <linux/delay.h> | 13 | #include <linux/delay.h> |
14 | 14 | ||
15 | #include <asm/arch/pxa-regs.h> | 15 | #include <asm/arch/pxa2xx-regs.h> |
16 | #include <asm/arch/pxa2xx-gpio.h> | 16 | #include <asm/arch/pxa2xx-gpio.h> |
17 | #include <asm/hardware.h> | 17 | #include <asm/hardware.h> |
18 | 18 | ||
diff --git a/arch/arm/mach-pxa/cm-x270-pci.c b/arch/arm/mach-pxa/cm-x270-pci.c index ac7f05f9f3eb..319c9ff3ab9a 100644 --- a/arch/arm/mach-pxa/cm-x270-pci.c +++ b/arch/arm/mach-pxa/cm-x270-pci.c | |||
@@ -41,18 +41,20 @@ void __init cmx270_pci_adjust_zones(int node, unsigned long *zone_size, | |||
41 | { | 41 | { |
42 | unsigned int sz = SZ_64M >> PAGE_SHIFT; | 42 | unsigned int sz = SZ_64M >> PAGE_SHIFT; |
43 | 43 | ||
44 | pr_info("Adjusting zones for CM-x270\n"); | 44 | if (machine_is_armcore()) { |
45 | 45 | pr_info("Adjusting zones for CM-x270\n"); | |
46 | /* | 46 | |
47 | * Only adjust if > 64M on current system | 47 | /* |
48 | */ | 48 | * Only adjust if > 64M on current system |
49 | if (node || (zone_size[0] <= sz)) | 49 | */ |
50 | return; | 50 | if (node || (zone_size[0] <= sz)) |
51 | 51 | return; | |
52 | zone_size[1] = zone_size[0] - sz; | 52 | |
53 | zone_size[0] = sz; | 53 | zone_size[1] = zone_size[0] - sz; |
54 | zhole_size[1] = zhole_size[0]; | 54 | zone_size[0] = sz; |
55 | zhole_size[0] = 0; | 55 | zhole_size[1] = zhole_size[0]; |
56 | zhole_size[0] = 0; | ||
57 | } | ||
56 | } | 58 | } |
57 | 59 | ||
58 | static void cmx270_it8152_irq_demux(unsigned int irq, struct irq_desc *desc) | 60 | static void cmx270_it8152_irq_demux(unsigned int irq, struct irq_desc *desc) |
diff --git a/arch/arm/mach-pxa/corgi.c b/arch/arm/mach-pxa/corgi.c index b757dd756655..b37671b71886 100644 --- a/arch/arm/mach-pxa/corgi.c +++ b/arch/arm/mach-pxa/corgi.c | |||
@@ -36,6 +36,7 @@ | |||
36 | #include <asm/mach/irq.h> | 36 | #include <asm/mach/irq.h> |
37 | 37 | ||
38 | #include <asm/arch/pxa-regs.h> | 38 | #include <asm/arch/pxa-regs.h> |
39 | #include <asm/arch/pxa2xx-regs.h> | ||
39 | #include <asm/arch/pxa2xx-gpio.h> | 40 | #include <asm/arch/pxa2xx-gpio.h> |
40 | #include <asm/arch/irda.h> | 41 | #include <asm/arch/irda.h> |
41 | #include <asm/arch/mmc.h> | 42 | #include <asm/arch/mmc.h> |
diff --git a/arch/arm/mach-pxa/corgi_pm.c b/arch/arm/mach-pxa/corgi_pm.c index 0a85f706e887..e91c0f26c412 100644 --- a/arch/arm/mach-pxa/corgi_pm.c +++ b/arch/arm/mach-pxa/corgi_pm.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <asm/arch/sharpsl.h> | 26 | #include <asm/arch/sharpsl.h> |
27 | #include <asm/arch/corgi.h> | 27 | #include <asm/arch/corgi.h> |
28 | #include <asm/arch/pxa-regs.h> | 28 | #include <asm/arch/pxa-regs.h> |
29 | #include <asm/arch/pxa2xx-regs.h> | ||
29 | #include <asm/arch/pxa2xx-gpio.h> | 30 | #include <asm/arch/pxa2xx-gpio.h> |
30 | #include "sharpsl.h" | 31 | #include "sharpsl.h" |
31 | 32 | ||
@@ -204,7 +205,9 @@ static struct sharpsl_charger_machinfo corgi_pm_machinfo = { | |||
204 | .read_devdata = corgipm_read_devdata, | 205 | .read_devdata = corgipm_read_devdata, |
205 | .charger_wakeup = corgi_charger_wakeup, | 206 | .charger_wakeup = corgi_charger_wakeup, |
206 | .should_wakeup = corgi_should_wakeup, | 207 | .should_wakeup = corgi_should_wakeup, |
208 | #ifdef CONFIG_BACKLIGHT_CORGI | ||
207 | .backlight_limit = corgibl_limit_intensity, | 209 | .backlight_limit = corgibl_limit_intensity, |
210 | #endif | ||
208 | .charge_on_volt = SHARPSL_CHARGE_ON_VOLT, | 211 | .charge_on_volt = SHARPSL_CHARGE_ON_VOLT, |
209 | .charge_on_temp = SHARPSL_CHARGE_ON_TEMP, | 212 | .charge_on_temp = SHARPSL_CHARGE_ON_TEMP, |
210 | .charge_acin_high = SHARPSL_CHARGE_ON_ACIN_HIGH, | 213 | .charge_acin_high = SHARPSL_CHARGE_ON_ACIN_HIGH, |
@@ -226,6 +229,10 @@ static int __devinit corgipm_init(void) | |||
226 | { | 229 | { |
227 | int ret; | 230 | int ret; |
228 | 231 | ||
232 | if (!machine_is_corgi() && !machine_is_shepherd() | ||
233 | && !machine_is_husky()) | ||
234 | return -ENODEV; | ||
235 | |||
229 | corgipm_device = platform_device_alloc("sharpsl-pm", -1); | 236 | corgipm_device = platform_device_alloc("sharpsl-pm", -1); |
230 | if (!corgipm_device) | 237 | if (!corgipm_device) |
231 | return -ENOMEM; | 238 | return -ENOMEM; |
diff --git a/arch/arm/mach-pxa/devices.c b/arch/arm/mach-pxa/devices.c index d6c05b6eab35..4a1eebb42e49 100644 --- a/arch/arm/mach-pxa/devices.c +++ b/arch/arm/mach-pxa/devices.c | |||
@@ -10,11 +10,13 @@ | |||
10 | #include <asm/arch/mmc.h> | 10 | #include <asm/arch/mmc.h> |
11 | #include <asm/arch/irda.h> | 11 | #include <asm/arch/irda.h> |
12 | #include <asm/arch/i2c.h> | 12 | #include <asm/arch/i2c.h> |
13 | #include <asm/arch/mfp-pxa27x.h> | ||
13 | #include <asm/arch/ohci.h> | 14 | #include <asm/arch/ohci.h> |
14 | #include <asm/arch/pxa27x_keypad.h> | 15 | #include <asm/arch/pxa27x_keypad.h> |
15 | #include <asm/arch/camera.h> | 16 | #include <asm/arch/camera.h> |
16 | 17 | ||
17 | #include "devices.h" | 18 | #include "devices.h" |
19 | #include "generic.h" | ||
18 | 20 | ||
19 | void __init pxa_register_device(struct platform_device *dev, void *data) | 21 | void __init pxa_register_device(struct platform_device *dev, void *data) |
20 | { | 22 | { |
@@ -233,8 +235,15 @@ struct platform_device pxa_device_i2c = { | |||
233 | .num_resources = ARRAY_SIZE(pxai2c_resources), | 235 | .num_resources = ARRAY_SIZE(pxai2c_resources), |
234 | }; | 236 | }; |
235 | 237 | ||
238 | static unsigned long pxa27x_i2c_mfp_cfg[] = { | ||
239 | GPIO117_I2C_SCL, | ||
240 | GPIO118_I2C_SDA, | ||
241 | }; | ||
242 | |||
236 | void __init pxa_set_i2c_info(struct i2c_pxa_platform_data *info) | 243 | void __init pxa_set_i2c_info(struct i2c_pxa_platform_data *info) |
237 | { | 244 | { |
245 | if (cpu_is_pxa27x()) | ||
246 | pxa2xx_mfp_config(ARRAY_AND_SIZE(pxa27x_i2c_mfp_cfg)); | ||
238 | pxa_register_device(&pxa_device_i2c, info); | 247 | pxa_register_device(&pxa_device_i2c, info); |
239 | } | 248 | } |
240 | 249 | ||
@@ -280,6 +289,36 @@ struct platform_device pxa_device_rtc = { | |||
280 | 289 | ||
281 | #ifdef CONFIG_PXA25x | 290 | #ifdef CONFIG_PXA25x |
282 | 291 | ||
292 | static struct resource pxa25x_resource_pwm0[] = { | ||
293 | [0] = { | ||
294 | .start = 0x40b00000, | ||
295 | .end = 0x40b0000f, | ||
296 | .flags = IORESOURCE_MEM, | ||
297 | }, | ||
298 | }; | ||
299 | |||
300 | struct platform_device pxa25x_device_pwm0 = { | ||
301 | .name = "pxa25x-pwm", | ||
302 | .id = 0, | ||
303 | .resource = pxa25x_resource_pwm0, | ||
304 | .num_resources = ARRAY_SIZE(pxa25x_resource_pwm0), | ||
305 | }; | ||
306 | |||
307 | static struct resource pxa25x_resource_pwm1[] = { | ||
308 | [0] = { | ||
309 | .start = 0x40c00000, | ||
310 | .end = 0x40c0000f, | ||
311 | .flags = IORESOURCE_MEM, | ||
312 | }, | ||
313 | }; | ||
314 | |||
315 | struct platform_device pxa25x_device_pwm1 = { | ||
316 | .name = "pxa25x-pwm", | ||
317 | .id = 1, | ||
318 | .resource = pxa25x_resource_pwm1, | ||
319 | .num_resources = ARRAY_SIZE(pxa25x_resource_pwm1), | ||
320 | }; | ||
321 | |||
283 | static u64 pxa25x_ssp_dma_mask = DMA_BIT_MASK(32); | 322 | static u64 pxa25x_ssp_dma_mask = DMA_BIT_MASK(32); |
284 | 323 | ||
285 | static struct resource pxa25x_resource_ssp[] = { | 324 | static struct resource pxa25x_resource_ssp[] = { |
@@ -568,6 +607,36 @@ struct platform_device pxa27x_device_ssp3 = { | |||
568 | .num_resources = ARRAY_SIZE(pxa27x_resource_ssp3), | 607 | .num_resources = ARRAY_SIZE(pxa27x_resource_ssp3), |
569 | }; | 608 | }; |
570 | 609 | ||
610 | static struct resource pxa27x_resource_pwm0[] = { | ||
611 | [0] = { | ||
612 | .start = 0x40b00000, | ||
613 | .end = 0x40b0001f, | ||
614 | .flags = IORESOURCE_MEM, | ||
615 | }, | ||
616 | }; | ||
617 | |||
618 | struct platform_device pxa27x_device_pwm0 = { | ||
619 | .name = "pxa27x-pwm", | ||
620 | .id = 0, | ||
621 | .resource = pxa27x_resource_pwm0, | ||
622 | .num_resources = ARRAY_SIZE(pxa27x_resource_pwm0), | ||
623 | }; | ||
624 | |||
625 | static struct resource pxa27x_resource_pwm1[] = { | ||
626 | [0] = { | ||
627 | .start = 0x40c00000, | ||
628 | .end = 0x40c0001f, | ||
629 | .flags = IORESOURCE_MEM, | ||
630 | }, | ||
631 | }; | ||
632 | |||
633 | struct platform_device pxa27x_device_pwm1 = { | ||
634 | .name = "pxa27x-pwm", | ||
635 | .id = 1, | ||
636 | .resource = pxa27x_resource_pwm1, | ||
637 | .num_resources = ARRAY_SIZE(pxa27x_resource_pwm1), | ||
638 | }; | ||
639 | |||
571 | static struct resource pxa27x_resource_camera[] = { | 640 | static struct resource pxa27x_resource_camera[] = { |
572 | [0] = { | 641 | [0] = { |
573 | .start = 0x50000000, | 642 | .start = 0x50000000, |
diff --git a/arch/arm/mach-pxa/devices.h b/arch/arm/mach-pxa/devices.h index fcab017f27ee..e620a3373d42 100644 --- a/arch/arm/mach-pxa/devices.h +++ b/arch/arm/mach-pxa/devices.h | |||
@@ -24,4 +24,9 @@ extern struct platform_device pxa27x_device_ssp2; | |||
24 | extern struct platform_device pxa27x_device_ssp3; | 24 | extern struct platform_device pxa27x_device_ssp3; |
25 | extern struct platform_device pxa3xx_device_ssp4; | 25 | extern struct platform_device pxa3xx_device_ssp4; |
26 | 26 | ||
27 | extern struct platform_device pxa25x_device_pwm0; | ||
28 | extern struct platform_device pxa25x_device_pwm1; | ||
29 | extern struct platform_device pxa27x_device_pwm0; | ||
30 | extern struct platform_device pxa27x_device_pwm1; | ||
31 | |||
27 | void __init pxa_register_device(struct platform_device *dev, void *data); | 32 | void __init pxa_register_device(struct platform_device *dev, void *data); |
diff --git a/arch/arm/mach-pxa/em-x270.c b/arch/arm/mach-pxa/em-x270.c index edc4f07a230d..1269ac991505 100644 --- a/arch/arm/mach-pxa/em-x270.c +++ b/arch/arm/mach-pxa/em-x270.c | |||
@@ -24,6 +24,7 @@ | |||
24 | 24 | ||
25 | #include <asm/arch/pxa-regs.h> | 25 | #include <asm/arch/pxa-regs.h> |
26 | #include <asm/arch/pxa2xx-gpio.h> | 26 | #include <asm/arch/pxa2xx-gpio.h> |
27 | #include <asm/arch/pxa27x-udc.h> | ||
27 | #include <asm/arch/pxafb.h> | 28 | #include <asm/arch/pxafb.h> |
28 | #include <asm/arch/ohci.h> | 29 | #include <asm/arch/ohci.h> |
29 | #include <asm/arch/mmc.h> | 30 | #include <asm/arch/mmc.h> |
diff --git a/arch/arm/mach-pxa/generic.c b/arch/arm/mach-pxa/generic.c index 44617938f3f1..c2f102339f57 100644 --- a/arch/arm/mach-pxa/generic.c +++ b/arch/arm/mach-pxa/generic.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <asm/mach/map.h> | 26 | #include <asm/mach/map.h> |
27 | 27 | ||
28 | #include <asm/arch/pxa-regs.h> | 28 | #include <asm/arch/pxa-regs.h> |
29 | #include <asm/arch/pxa2xx-regs.h> /* for __pxa_set_cken */ | ||
29 | 30 | ||
30 | #include "generic.h" | 31 | #include "generic.h" |
31 | 32 | ||
diff --git a/arch/arm/mach-pxa/lpd270.c b/arch/arm/mach-pxa/lpd270.c index a20e4b1649d6..183b587672a6 100644 --- a/arch/arm/mach-pxa/lpd270.c +++ b/arch/arm/mach-pxa/lpd270.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <linux/ioport.h> | 23 | #include <linux/ioport.h> |
24 | #include <linux/mtd/mtd.h> | 24 | #include <linux/mtd/mtd.h> |
25 | #include <linux/mtd/partitions.h> | 25 | #include <linux/mtd/partitions.h> |
26 | #include <linux/pwm_backlight.h> | ||
26 | 27 | ||
27 | #include <asm/types.h> | 28 | #include <asm/types.h> |
28 | #include <asm/setup.h> | 29 | #include <asm/setup.h> |
@@ -134,9 +135,12 @@ static struct sys_device lpd270_irq_device = { | |||
134 | 135 | ||
135 | static int __init lpd270_irq_device_init(void) | 136 | static int __init lpd270_irq_device_init(void) |
136 | { | 137 | { |
137 | int ret = sysdev_class_register(&lpd270_irq_sysclass); | 138 | int ret = -ENODEV; |
138 | if (ret == 0) | 139 | if (machine_is_logicpd_pxa270()) { |
139 | ret = sysdev_register(&lpd270_irq_device); | 140 | ret = sysdev_class_register(&lpd270_irq_sysclass); |
141 | if (ret == 0) | ||
142 | ret = sysdev_register(&lpd270_irq_device); | ||
143 | } | ||
140 | return ret; | 144 | return ret; |
141 | } | 145 | } |
142 | 146 | ||
@@ -233,21 +237,20 @@ static struct platform_device lpd270_flash_device[2] = { | |||
233 | }, | 237 | }, |
234 | }; | 238 | }; |
235 | 239 | ||
236 | static void lpd270_backlight_power(int on) | 240 | static struct platform_pwm_backlight_data lpd270_backlight_data = { |
237 | { | 241 | .pwm_id = 0, |
238 | if (on) { | 242 | .max_brightness = 1, |
239 | pxa_gpio_mode(GPIO16_PWM0_MD); | 243 | .dft_brightness = 1, |
240 | pxa_set_cken(CKEN_PWM0, 1); | 244 | .pwm_period_ns = 78770, |
241 | PWM_CTRL0 = 0; | 245 | }; |
242 | PWM_PWDUTY0 = 0x3ff; | 246 | |
243 | PWM_PERVAL0 = 0x3ff; | 247 | static struct platform_device lpd270_backlight_device = { |
244 | } else { | 248 | .name = "pwm-backlight", |
245 | PWM_CTRL0 = 0; | 249 | .dev = { |
246 | PWM_PWDUTY0 = 0x0; | 250 | .parent = &pxa27x_device_pwm0.dev, |
247 | PWM_PERVAL0 = 0x3FF; | 251 | .platform_data = &lpd270_backlight_data, |
248 | pxa_set_cken(CKEN_PWM0, 0); | 252 | }, |
249 | } | 253 | }; |
250 | } | ||
251 | 254 | ||
252 | /* 5.7" TFT QVGA (LoLo display number 1) */ | 255 | /* 5.7" TFT QVGA (LoLo display number 1) */ |
253 | static struct pxafb_mode_info sharp_lq057q3dc02_mode = { | 256 | static struct pxafb_mode_info sharp_lq057q3dc02_mode = { |
@@ -269,7 +272,6 @@ static struct pxafb_mach_info sharp_lq057q3dc02 = { | |||
269 | .num_modes = 1, | 272 | .num_modes = 1, |
270 | .lccr0 = 0x07800080, | 273 | .lccr0 = 0x07800080, |
271 | .lccr3 = 0x00400000, | 274 | .lccr3 = 0x00400000, |
272 | .pxafb_backlight_power = lpd270_backlight_power, | ||
273 | }; | 275 | }; |
274 | 276 | ||
275 | /* 12.1" TFT SVGA (LoLo display number 2) */ | 277 | /* 12.1" TFT SVGA (LoLo display number 2) */ |
@@ -292,7 +294,6 @@ static struct pxafb_mach_info sharp_lq121s1dg31 = { | |||
292 | .num_modes = 1, | 294 | .num_modes = 1, |
293 | .lccr0 = 0x07800080, | 295 | .lccr0 = 0x07800080, |
294 | .lccr3 = 0x00400000, | 296 | .lccr3 = 0x00400000, |
295 | .pxafb_backlight_power = lpd270_backlight_power, | ||
296 | }; | 297 | }; |
297 | 298 | ||
298 | /* 3.6" TFT QVGA (LoLo display number 3) */ | 299 | /* 3.6" TFT QVGA (LoLo display number 3) */ |
@@ -315,7 +316,6 @@ static struct pxafb_mach_info sharp_lq036q1da01 = { | |||
315 | .num_modes = 1, | 316 | .num_modes = 1, |
316 | .lccr0 = 0x07800080, | 317 | .lccr0 = 0x07800080, |
317 | .lccr3 = 0x00400000, | 318 | .lccr3 = 0x00400000, |
318 | .pxafb_backlight_power = lpd270_backlight_power, | ||
319 | }; | 319 | }; |
320 | 320 | ||
321 | /* 6.4" TFT VGA (LoLo display number 5) */ | 321 | /* 6.4" TFT VGA (LoLo display number 5) */ |
@@ -338,7 +338,6 @@ static struct pxafb_mach_info sharp_lq64d343 = { | |||
338 | .num_modes = 1, | 338 | .num_modes = 1, |
339 | .lccr0 = 0x07800080, | 339 | .lccr0 = 0x07800080, |
340 | .lccr3 = 0x00400000, | 340 | .lccr3 = 0x00400000, |
341 | .pxafb_backlight_power = lpd270_backlight_power, | ||
342 | }; | 341 | }; |
343 | 342 | ||
344 | /* 10.4" TFT VGA (LoLo display number 7) */ | 343 | /* 10.4" TFT VGA (LoLo display number 7) */ |
@@ -361,7 +360,6 @@ static struct pxafb_mach_info sharp_lq10d368 = { | |||
361 | .num_modes = 1, | 360 | .num_modes = 1, |
362 | .lccr0 = 0x07800080, | 361 | .lccr0 = 0x07800080, |
363 | .lccr3 = 0x00400000, | 362 | .lccr3 = 0x00400000, |
364 | .pxafb_backlight_power = lpd270_backlight_power, | ||
365 | }; | 363 | }; |
366 | 364 | ||
367 | /* 3.5" TFT QVGA (LoLo display number 8) */ | 365 | /* 3.5" TFT QVGA (LoLo display number 8) */ |
@@ -384,7 +382,6 @@ static struct pxafb_mach_info sharp_lq035q7db02_20 = { | |||
384 | .num_modes = 1, | 382 | .num_modes = 1, |
385 | .lccr0 = 0x07800080, | 383 | .lccr0 = 0x07800080, |
386 | .lccr3 = 0x00400000, | 384 | .lccr3 = 0x00400000, |
387 | .pxafb_backlight_power = lpd270_backlight_power, | ||
388 | }; | 385 | }; |
389 | 386 | ||
390 | static struct pxafb_mach_info *lpd270_lcd_to_use; | 387 | static struct pxafb_mach_info *lpd270_lcd_to_use; |
@@ -414,6 +411,7 @@ __setup("lcd=", lpd270_set_lcd); | |||
414 | 411 | ||
415 | static struct platform_device *platform_devices[] __initdata = { | 412 | static struct platform_device *platform_devices[] __initdata = { |
416 | &smc91x_device, | 413 | &smc91x_device, |
414 | &lpd270_backlight_device, | ||
417 | &lpd270_audio_device, | 415 | &lpd270_audio_device, |
418 | &lpd270_flash_device[0], | 416 | &lpd270_flash_device[0], |
419 | &lpd270_flash_device[1], | 417 | &lpd270_flash_device[1], |
@@ -454,6 +452,7 @@ static void __init lpd270_init(void) | |||
454 | * On LogicPD PXA270, we route AC97_SYSCLK via GPIO45. | 452 | * On LogicPD PXA270, we route AC97_SYSCLK via GPIO45. |
455 | */ | 453 | */ |
456 | pxa_gpio_mode(GPIO45_SYSCLK_AC97_MD); | 454 | pxa_gpio_mode(GPIO45_SYSCLK_AC97_MD); |
455 | pxa_gpio_mode(GPIO16_PWM0_MD); | ||
457 | 456 | ||
458 | platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices)); | 457 | platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices)); |
459 | 458 | ||
diff --git a/arch/arm/mach-pxa/magician.c b/arch/arm/mach-pxa/magician.c index badba064dc04..01b2fa790217 100644 --- a/arch/arm/mach-pxa/magician.c +++ b/arch/arm/mach-pxa/magician.c | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <linux/mtd/map.h> | 25 | #include <linux/mtd/map.h> |
26 | #include <linux/mtd/physmap.h> | 26 | #include <linux/mtd/physmap.h> |
27 | #include <linux/pda_power.h> | 27 | #include <linux/pda_power.h> |
28 | #include <linux/pwm_backlight.h> | ||
28 | 29 | ||
29 | #include <asm/gpio.h> | 30 | #include <asm/gpio.h> |
30 | #include <asm/hardware.h> | 31 | #include <asm/hardware.h> |
@@ -33,12 +34,14 @@ | |||
33 | #include <asm/arch/magician.h> | 34 | #include <asm/arch/magician.h> |
34 | #include <asm/arch/mfp-pxa27x.h> | 35 | #include <asm/arch/mfp-pxa27x.h> |
35 | #include <asm/arch/pxa-regs.h> | 36 | #include <asm/arch/pxa-regs.h> |
37 | #include <asm/arch/pxa2xx-regs.h> | ||
36 | #include <asm/arch/pxafb.h> | 38 | #include <asm/arch/pxafb.h> |
37 | #include <asm/arch/i2c.h> | 39 | #include <asm/arch/i2c.h> |
38 | #include <asm/arch/mmc.h> | 40 | #include <asm/arch/mmc.h> |
39 | #include <asm/arch/irda.h> | 41 | #include <asm/arch/irda.h> |
40 | #include <asm/arch/ohci.h> | 42 | #include <asm/arch/ohci.h> |
41 | 43 | ||
44 | #include "devices.h" | ||
42 | #include "generic.h" | 45 | #include "generic.h" |
43 | 46 | ||
44 | static unsigned long magician_pin_config[] = { | 47 | static unsigned long magician_pin_config[] = { |
@@ -348,40 +351,58 @@ static struct pxafb_mach_info samsung_info = { | |||
348 | * Backlight | 351 | * Backlight |
349 | */ | 352 | */ |
350 | 353 | ||
351 | static void magician_set_bl_intensity(int intensity) | 354 | static int magician_backlight_init(struct device *dev) |
352 | { | 355 | { |
353 | if (intensity) { | 356 | int ret; |
354 | PWM_CTRL0 = 1; | 357 | |
355 | PWM_PERVAL0 = 0xc8; | 358 | ret = gpio_request(EGPIO_MAGICIAN_BL_POWER, "BL_POWER"); |
356 | if (intensity > 0xc7) { | 359 | if (ret) |
357 | PWM_PWDUTY0 = intensity - 0x48; | 360 | goto err; |
358 | gpio_set_value(EGPIO_MAGICIAN_BL_POWER2, 1); | 361 | ret = gpio_request(EGPIO_MAGICIAN_BL_POWER2, "BL_POWER2"); |
359 | } else { | 362 | if (ret) |
360 | PWM_PWDUTY0 = intensity; | 363 | goto err2; |
361 | gpio_set_value(EGPIO_MAGICIAN_BL_POWER2, 0); | 364 | return 0; |
362 | } | 365 | |
363 | gpio_set_value(EGPIO_MAGICIAN_BL_POWER, 1); | 366 | err2: |
364 | pxa_set_cken(CKEN_PWM0, 1); | 367 | gpio_free(EGPIO_MAGICIAN_BL_POWER); |
368 | err: | ||
369 | return ret; | ||
370 | } | ||
371 | |||
372 | static int magician_backlight_notify(int brightness) | ||
373 | { | ||
374 | gpio_set_value(EGPIO_MAGICIAN_BL_POWER, brightness); | ||
375 | if (brightness >= 200) { | ||
376 | gpio_set_value(EGPIO_MAGICIAN_BL_POWER2, 1); | ||
377 | return brightness - 72; | ||
365 | } else { | 378 | } else { |
366 | /* PWM_PWDUTY0 = intensity; */ | 379 | gpio_set_value(EGPIO_MAGICIAN_BL_POWER2, 0); |
367 | gpio_set_value(EGPIO_MAGICIAN_BL_POWER, 0); | 380 | return brightness; |
368 | pxa_set_cken(CKEN_PWM0, 0); | ||
369 | } | 381 | } |
370 | } | 382 | } |
371 | 383 | ||
372 | static struct generic_bl_info backlight_info = { | 384 | static void magician_backlight_exit(struct device *dev) |
373 | .default_intensity = 0x64, | 385 | { |
374 | .limit_mask = 0x0b, | 386 | gpio_free(EGPIO_MAGICIAN_BL_POWER); |
375 | .max_intensity = 0xc7+0x48, | 387 | gpio_free(EGPIO_MAGICIAN_BL_POWER2); |
376 | .set_bl_intensity = magician_set_bl_intensity, | 388 | } |
389 | |||
390 | static struct platform_pwm_backlight_data backlight_data = { | ||
391 | .pwm_id = 0, | ||
392 | .max_brightness = 272, | ||
393 | .dft_brightness = 100, | ||
394 | .pwm_period_ns = 30923, | ||
395 | .init = magician_backlight_init, | ||
396 | .notify = magician_backlight_notify, | ||
397 | .exit = magician_backlight_exit, | ||
377 | }; | 398 | }; |
378 | 399 | ||
379 | static struct platform_device backlight = { | 400 | static struct platform_device backlight = { |
380 | .name = "generic-bl", | 401 | .name = "pwm-backlight", |
381 | .dev = { | 402 | .dev = { |
382 | .platform_data = &backlight_info, | 403 | .parent = &pxa27x_device_pwm0.dev, |
404 | .platform_data = &backlight_data, | ||
383 | }, | 405 | }, |
384 | .id = -1, | ||
385 | }; | 406 | }; |
386 | 407 | ||
387 | /* | 408 | /* |
diff --git a/arch/arm/mach-pxa/mainstone.c b/arch/arm/mach-pxa/mainstone.c index 7399fb34da4e..266594426e8b 100644 --- a/arch/arm/mach-pxa/mainstone.c +++ b/arch/arm/mach-pxa/mainstone.c | |||
@@ -23,9 +23,9 @@ | |||
23 | #include <linux/ioport.h> | 23 | #include <linux/ioport.h> |
24 | #include <linux/mtd/mtd.h> | 24 | #include <linux/mtd/mtd.h> |
25 | #include <linux/mtd/partitions.h> | 25 | #include <linux/mtd/partitions.h> |
26 | #include <linux/backlight.h> | ||
27 | #include <linux/input.h> | 26 | #include <linux/input.h> |
28 | #include <linux/gpio_keys.h> | 27 | #include <linux/gpio_keys.h> |
28 | #include <linux/pwm_backlight.h> | ||
29 | 29 | ||
30 | #include <asm/types.h> | 30 | #include <asm/types.h> |
31 | #include <asm/setup.h> | 31 | #include <asm/setup.h> |
@@ -349,56 +349,27 @@ static struct platform_device mst_flash_device[2] = { | |||
349 | }, | 349 | }, |
350 | }; | 350 | }; |
351 | 351 | ||
352 | #ifdef CONFIG_BACKLIGHT_CLASS_DEVICE | 352 | #if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE) |
353 | static int mainstone_backlight_update_status(struct backlight_device *bl) | 353 | static struct platform_pwm_backlight_data mainstone_backlight_data = { |
354 | { | 354 | .pwm_id = 0, |
355 | int brightness = bl->props.brightness; | 355 | .max_brightness = 1023, |
356 | 356 | .dft_brightness = 1023, | |
357 | if (bl->props.power != FB_BLANK_UNBLANK || | 357 | .pwm_period_ns = 78770, |
358 | bl->props.fb_blank != FB_BLANK_UNBLANK) | 358 | }; |
359 | brightness = 0; | ||
360 | |||
361 | if (brightness != 0) | ||
362 | pxa_set_cken(CKEN_PWM0, 1); | ||
363 | |||
364 | PWM_CTRL0 = 0; | ||
365 | PWM_PWDUTY0 = brightness; | ||
366 | PWM_PERVAL0 = bl->props.max_brightness; | ||
367 | |||
368 | if (brightness == 0) | ||
369 | pxa_set_cken(CKEN_PWM0, 0); | ||
370 | return 0; /* pointless return value */ | ||
371 | } | ||
372 | |||
373 | static int mainstone_backlight_get_brightness(struct backlight_device *bl) | ||
374 | { | ||
375 | return PWM_PWDUTY0; | ||
376 | } | ||
377 | 359 | ||
378 | static /*const*/ struct backlight_ops mainstone_backlight_ops = { | 360 | static struct platform_device mainstone_backlight_device = { |
379 | .update_status = mainstone_backlight_update_status, | 361 | .name = "pwm-backlight", |
380 | .get_brightness = mainstone_backlight_get_brightness, | 362 | .dev = { |
363 | .parent = &pxa27x_device_pwm0.dev, | ||
364 | .platform_data = &mainstone_backlight_data, | ||
365 | }, | ||
381 | }; | 366 | }; |
382 | 367 | ||
383 | static void __init mainstone_backlight_register(void) | 368 | static void __init mainstone_backlight_register(void) |
384 | { | 369 | { |
385 | struct backlight_device *bl; | 370 | int ret = platform_device_register(&mainstone_backlight_device); |
386 | 371 | if (ret) | |
387 | bl = backlight_device_register("mainstone-bl", &pxa_device_fb.dev, | 372 | printk(KERN_ERR "mainstone: failed to register backlight device: %d\n", ret); |
388 | NULL, &mainstone_backlight_ops); | ||
389 | if (IS_ERR(bl)) { | ||
390 | printk(KERN_ERR "mainstone: unable to register backlight: %ld\n", | ||
391 | PTR_ERR(bl)); | ||
392 | return; | ||
393 | } | ||
394 | |||
395 | /* | ||
396 | * broken design - register-then-setup interfaces are | ||
397 | * utterly broken by definition. | ||
398 | */ | ||
399 | bl->props.max_brightness = 1023; | ||
400 | bl->props.brightness = 1023; | ||
401 | backlight_update_status(bl); | ||
402 | } | 373 | } |
403 | #else | 374 | #else |
404 | #define mainstone_backlight_register() do { } while (0) | 375 | #define mainstone_backlight_register() do { } while (0) |
diff --git a/arch/arm/mach-pxa/mfp-pxa2xx.c b/arch/arm/mach-pxa/mfp-pxa2xx.c index 22097a1707cc..d1cdb4ecb0b8 100644 --- a/arch/arm/mach-pxa/mfp-pxa2xx.c +++ b/arch/arm/mach-pxa/mfp-pxa2xx.c | |||
@@ -20,6 +20,7 @@ | |||
20 | 20 | ||
21 | #include <asm/arch/hardware.h> | 21 | #include <asm/arch/hardware.h> |
22 | #include <asm/arch/pxa-regs.h> | 22 | #include <asm/arch/pxa-regs.h> |
23 | #include <asm/arch/pxa2xx-regs.h> | ||
23 | #include <asm/arch/mfp-pxa2xx.h> | 24 | #include <asm/arch/mfp-pxa2xx.h> |
24 | 25 | ||
25 | #include "generic.h" | 26 | #include "generic.h" |
diff --git a/arch/arm/mach-pxa/pcm990-baseboard.c b/arch/arm/mach-pxa/pcm990-baseboard.c index 49d951db0f3d..2564e16e4e2f 100644 --- a/arch/arm/mach-pxa/pcm990-baseboard.c +++ b/arch/arm/mach-pxa/pcm990-baseboard.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/platform_device.h> | 24 | #include <linux/platform_device.h> |
25 | #include <linux/ide.h> | 25 | #include <linux/ide.h> |
26 | #include <linux/i2c.h> | 26 | #include <linux/i2c.h> |
27 | #include <linux/pwm_backlight.h> | ||
27 | 28 | ||
28 | #include <media/soc_camera.h> | 29 | #include <media/soc_camera.h> |
29 | 30 | ||
@@ -36,9 +37,99 @@ | |||
36 | #include <asm/arch/mmc.h> | 37 | #include <asm/arch/mmc.h> |
37 | #include <asm/arch/ohci.h> | 38 | #include <asm/arch/ohci.h> |
38 | #include <asm/arch/pcm990_baseboard.h> | 39 | #include <asm/arch/pcm990_baseboard.h> |
40 | #include <asm/arch/pxafb.h> | ||
41 | |||
42 | #include "devices.h" | ||
43 | |||
44 | /* | ||
45 | * pcm990_lcd_power - control power supply to the LCD | ||
46 | * @on: 0 = switch off, 1 = switch on | ||
47 | * | ||
48 | * Called by the pxafb driver | ||
49 | */ | ||
50 | #ifndef CONFIG_PCM990_DISPLAY_NONE | ||
51 | static void pcm990_lcd_power(int on, struct fb_var_screeninfo *var) | ||
52 | { | ||
53 | if (on) { | ||
54 | /* enable LCD-Latches | ||
55 | * power on LCD | ||
56 | */ | ||
57 | __PCM990_CTRL_REG(PCM990_CTRL_PHYS + PCM990_CTRL_REG3) = | ||
58 | PCM990_CTRL_LCDPWR + PCM990_CTRL_LCDON; | ||
59 | } else { | ||
60 | /* disable LCD-Latches | ||
61 | * power off LCD | ||
62 | */ | ||
63 | __PCM990_CTRL_REG(PCM990_CTRL_PHYS + PCM990_CTRL_REG3) = 0x00; | ||
64 | } | ||
65 | } | ||
66 | #endif | ||
67 | |||
68 | #if defined(CONFIG_PCM990_DISPLAY_SHARP) | ||
69 | static struct pxafb_mode_info fb_info_sharp_lq084v1dg21 = { | ||
70 | .pixclock = 28000, | ||
71 | .xres = 640, | ||
72 | .yres = 480, | ||
73 | .bpp = 16, | ||
74 | .hsync_len = 20, | ||
75 | .left_margin = 103, | ||
76 | .right_margin = 47, | ||
77 | .vsync_len = 6, | ||
78 | .upper_margin = 28, | ||
79 | .lower_margin = 5, | ||
80 | .sync = 0, | ||
81 | .cmap_greyscale = 0, | ||
82 | }; | ||
83 | |||
84 | static struct pxafb_mach_info pcm990_fbinfo __initdata = { | ||
85 | .modes = &fb_info_sharp_lq084v1dg21, | ||
86 | .num_modes = 1, | ||
87 | .lccr0 = LCCR0_PAS, | ||
88 | .lccr3 = LCCR3_PCP, | ||
89 | .pxafb_lcd_power = pcm990_lcd_power, | ||
90 | }; | ||
91 | #elif defined(CONFIG_PCM990_DISPLAY_NEC) | ||
92 | struct pxafb_mode_info fb_info_nec_nl6448bc20_18d = { | ||
93 | .pixclock = 39720, | ||
94 | .xres = 640, | ||
95 | .yres = 480, | ||
96 | .bpp = 16, | ||
97 | .hsync_len = 32, | ||
98 | .left_margin = 16, | ||
99 | .right_margin = 48, | ||
100 | .vsync_len = 2, | ||
101 | .upper_margin = 12, | ||
102 | .lower_margin = 17, | ||
103 | .sync = 0, | ||
104 | .cmap_greyscale = 0, | ||
105 | }; | ||
106 | |||
107 | static struct pxafb_mach_info pcm990_fbinfo __initdata = { | ||
108 | .modes = &fb_info_nec_nl6448bc20_18d, | ||
109 | .num_modes = 1, | ||
110 | .lccr0 = LCCR0_Act, | ||
111 | .lccr3 = LCCR3_PixFlEdg, | ||
112 | .pxafb_lcd_power = pcm990_lcd_power, | ||
113 | }; | ||
114 | #endif | ||
115 | |||
116 | static struct platform_pwm_backlight_data pcm990_backlight_data = { | ||
117 | .pwm_id = 0, | ||
118 | .max_brightness = 1023, | ||
119 | .dft_brightness = 1023, | ||
120 | .pwm_period_ns = 78770, | ||
121 | }; | ||
122 | |||
123 | static struct platform_device pcm990_backlight_device = { | ||
124 | .name = "pwm-backlight", | ||
125 | .dev = { | ||
126 | .parent = &pxa27x_device_pwm0.dev, | ||
127 | .platform_data = &pcm990_backlight_data, | ||
128 | }, | ||
129 | }; | ||
39 | 130 | ||
40 | /* | 131 | /* |
41 | * The PCM-990 development baseboard uses PCM-027's hardeware in the | 132 | * The PCM-990 development baseboard uses PCM-027's hardware in the |
42 | * following way: | 133 | * following way: |
43 | * | 134 | * |
44 | * - LCD support is in use | 135 | * - LCD support is in use |
@@ -393,6 +484,12 @@ void __init pcm990_baseboard_init(void) | |||
393 | /* register CPLD's IRQ controller */ | 484 | /* register CPLD's IRQ controller */ |
394 | pcm990_init_irq(); | 485 | pcm990_init_irq(); |
395 | 486 | ||
487 | #ifndef CONFIG_PCM990_DISPLAY_NONE | ||
488 | set_pxa_fb_info(&pcm990_fbinfo); | ||
489 | #endif | ||
490 | pxa_gpio_mode(GPIO16_PWM0_MD); | ||
491 | platform_device_register(&pcm990_backlight_device); | ||
492 | |||
396 | platform_device_register(&pxa27x_device_ac97); | 493 | platform_device_register(&pxa27x_device_ac97); |
397 | 494 | ||
398 | /* MMC */ | 495 | /* MMC */ |
diff --git a/arch/arm/mach-pxa/poodle.c b/arch/arm/mach-pxa/poodle.c index 0b30f25cff3c..f81c10cafd48 100644 --- a/arch/arm/mach-pxa/poodle.c +++ b/arch/arm/mach-pxa/poodle.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include <asm/mach/irq.h> | 32 | #include <asm/mach/irq.h> |
33 | 33 | ||
34 | #include <asm/arch/pxa-regs.h> | 34 | #include <asm/arch/pxa-regs.h> |
35 | #include <asm/arch/pxa2xx-regs.h> | ||
35 | #include <asm/arch/pxa2xx-gpio.h> | 36 | #include <asm/arch/pxa2xx-gpio.h> |
36 | #include <asm/arch/mmc.h> | 37 | #include <asm/arch/mmc.h> |
37 | #include <asm/arch/udc.h> | 38 | #include <asm/arch/udc.h> |
diff --git a/arch/arm/mach-pxa/pwm.c b/arch/arm/mach-pxa/pwm.c new file mode 100644 index 000000000000..ce28cd9fed16 --- /dev/null +++ b/arch/arm/mach-pxa/pwm.c | |||
@@ -0,0 +1,319 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/mach-pxa/pwm.c | ||
3 | * | ||
4 | * simple driver for PWM (Pulse Width Modulator) controller | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | * | ||
10 | * 2008-02-13 initial version | ||
11 | * eric miao <eric.miao@marvell.com> | ||
12 | */ | ||
13 | |||
14 | #include <linux/module.h> | ||
15 | #include <linux/kernel.h> | ||
16 | #include <linux/platform_device.h> | ||
17 | #include <linux/err.h> | ||
18 | #include <linux/clk.h> | ||
19 | #include <linux/io.h> | ||
20 | #include <linux/pwm.h> | ||
21 | |||
22 | #include <asm/div64.h> | ||
23 | #include <asm/arch/pxa-regs.h> | ||
24 | |||
25 | /* PWM registers and bits definitions */ | ||
26 | #define PWMCR (0x00) | ||
27 | #define PWMDCR (0x04) | ||
28 | #define PWMPCR (0x08) | ||
29 | |||
30 | #define PWMCR_SD (1 << 6) | ||
31 | #define PWMDCR_FD (1 << 10) | ||
32 | |||
33 | struct pwm_device { | ||
34 | struct list_head node; | ||
35 | struct platform_device *pdev; | ||
36 | |||
37 | const char *label; | ||
38 | struct clk *clk; | ||
39 | int clk_enabled; | ||
40 | void __iomem *mmio_base; | ||
41 | |||
42 | unsigned int use_count; | ||
43 | unsigned int pwm_id; | ||
44 | }; | ||
45 | |||
46 | /* | ||
47 | * period_ns = 10^9 * (PRESCALE + 1) * (PV + 1) / PWM_CLK_RATE | ||
48 | * duty_ns = 10^9 * (PRESCALE + 1) * DC / PWM_CLK_RATE | ||
49 | */ | ||
50 | int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns) | ||
51 | { | ||
52 | unsigned long long c; | ||
53 | unsigned long period_cycles, prescale, pv, dc; | ||
54 | |||
55 | if (pwm == NULL || period_ns == 0 || duty_ns > period_ns) | ||
56 | return -EINVAL; | ||
57 | |||
58 | c = clk_get_rate(pwm->clk); | ||
59 | c = c * period_ns; | ||
60 | do_div(c, 1000000000); | ||
61 | period_cycles = c; | ||
62 | |||
63 | if (period_cycles < 0) | ||
64 | period_cycles = 1; | ||
65 | prescale = (period_cycles - 1) / 1024; | ||
66 | pv = period_cycles / (prescale + 1) - 1; | ||
67 | |||
68 | if (prescale > 63) | ||
69 | return -EINVAL; | ||
70 | |||
71 | if (duty_ns == period_ns) | ||
72 | dc = PWMDCR_FD; | ||
73 | else | ||
74 | dc = (pv + 1) * duty_ns / period_ns; | ||
75 | |||
76 | /* NOTE: the clock to PWM has to be enabled first | ||
77 | * before writing to the registers | ||
78 | */ | ||
79 | clk_enable(pwm->clk); | ||
80 | __raw_writel(prescale, pwm->mmio_base + PWMCR); | ||
81 | __raw_writel(dc, pwm->mmio_base + PWMDCR); | ||
82 | __raw_writel(pv, pwm->mmio_base + PWMPCR); | ||
83 | clk_disable(pwm->clk); | ||
84 | |||
85 | return 0; | ||
86 | } | ||
87 | EXPORT_SYMBOL(pwm_config); | ||
88 | |||
89 | int pwm_enable(struct pwm_device *pwm) | ||
90 | { | ||
91 | int rc = 0; | ||
92 | |||
93 | if (!pwm->clk_enabled) { | ||
94 | rc = clk_enable(pwm->clk); | ||
95 | if (!rc) | ||
96 | pwm->clk_enabled = 1; | ||
97 | } | ||
98 | return rc; | ||
99 | } | ||
100 | EXPORT_SYMBOL(pwm_enable); | ||
101 | |||
102 | void pwm_disable(struct pwm_device *pwm) | ||
103 | { | ||
104 | if (pwm->clk_enabled) { | ||
105 | clk_disable(pwm->clk); | ||
106 | pwm->clk_enabled = 0; | ||
107 | } | ||
108 | } | ||
109 | EXPORT_SYMBOL(pwm_disable); | ||
110 | |||
111 | static DEFINE_MUTEX(pwm_lock); | ||
112 | static LIST_HEAD(pwm_list); | ||
113 | |||
114 | struct pwm_device *pwm_request(int pwm_id, const char *label) | ||
115 | { | ||
116 | struct pwm_device *pwm; | ||
117 | int found = 0; | ||
118 | |||
119 | mutex_lock(&pwm_lock); | ||
120 | |||
121 | list_for_each_entry(pwm, &pwm_list, node) { | ||
122 | if (pwm->pwm_id == pwm_id) { | ||
123 | found = 1; | ||
124 | break; | ||
125 | } | ||
126 | } | ||
127 | |||
128 | if (found) { | ||
129 | if (pwm->use_count == 0) { | ||
130 | pwm->use_count++; | ||
131 | pwm->label = label; | ||
132 | } else | ||
133 | pwm = ERR_PTR(-EBUSY); | ||
134 | } else | ||
135 | pwm = ERR_PTR(-ENOENT); | ||
136 | |||
137 | mutex_unlock(&pwm_lock); | ||
138 | return pwm; | ||
139 | } | ||
140 | EXPORT_SYMBOL(pwm_request); | ||
141 | |||
142 | void pwm_free(struct pwm_device *pwm) | ||
143 | { | ||
144 | mutex_lock(&pwm_lock); | ||
145 | |||
146 | if (pwm->use_count) { | ||
147 | pwm->use_count--; | ||
148 | pwm->label = NULL; | ||
149 | } else | ||
150 | pr_warning("PWM device already freed\n"); | ||
151 | |||
152 | mutex_unlock(&pwm_lock); | ||
153 | } | ||
154 | EXPORT_SYMBOL(pwm_free); | ||
155 | |||
156 | static inline void __add_pwm(struct pwm_device *pwm) | ||
157 | { | ||
158 | mutex_lock(&pwm_lock); | ||
159 | list_add_tail(&pwm->node, &pwm_list); | ||
160 | mutex_unlock(&pwm_lock); | ||
161 | } | ||
162 | |||
163 | static struct pwm_device *pwm_probe(struct platform_device *pdev, | ||
164 | unsigned int pwm_id, struct pwm_device *parent_pwm) | ||
165 | { | ||
166 | struct pwm_device *pwm; | ||
167 | struct resource *r; | ||
168 | int ret = 0; | ||
169 | |||
170 | pwm = kzalloc(sizeof(struct pwm_device), GFP_KERNEL); | ||
171 | if (pwm == NULL) { | ||
172 | dev_err(&pdev->dev, "failed to allocate memory\n"); | ||
173 | return ERR_PTR(-ENOMEM); | ||
174 | } | ||
175 | |||
176 | pwm->clk = clk_get(&pdev->dev, "PWMCLK"); | ||
177 | if (IS_ERR(pwm->clk)) { | ||
178 | ret = PTR_ERR(pwm->clk); | ||
179 | goto err_free; | ||
180 | } | ||
181 | pwm->clk_enabled = 0; | ||
182 | |||
183 | pwm->use_count = 0; | ||
184 | pwm->pwm_id = pwm_id; | ||
185 | pwm->pdev = pdev; | ||
186 | |||
187 | if (parent_pwm != NULL) { | ||
188 | /* registers for the second PWM has offset of 0x10 */ | ||
189 | pwm->mmio_base = parent_pwm->mmio_base + 0x10; | ||
190 | __add_pwm(pwm); | ||
191 | return pwm; | ||
192 | } | ||
193 | |||
194 | r = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
195 | if (r == NULL) { | ||
196 | dev_err(&pdev->dev, "no memory resource defined\n"); | ||
197 | ret = -ENODEV; | ||
198 | goto err_free_clk; | ||
199 | } | ||
200 | |||
201 | r = request_mem_region(r->start, r->end - r->start + 1, pdev->name); | ||
202 | if (r == NULL) { | ||
203 | dev_err(&pdev->dev, "failed to request memory resource\n"); | ||
204 | ret = -EBUSY; | ||
205 | goto err_free_clk; | ||
206 | } | ||
207 | |||
208 | pwm->mmio_base = ioremap(r->start, r->end - r->start + 1); | ||
209 | if (pwm->mmio_base == NULL) { | ||
210 | dev_err(&pdev->dev, "failed to ioremap() registers\n"); | ||
211 | ret = -ENODEV; | ||
212 | goto err_free_mem; | ||
213 | } | ||
214 | |||
215 | __add_pwm(pwm); | ||
216 | platform_set_drvdata(pdev, pwm); | ||
217 | return pwm; | ||
218 | |||
219 | err_free_mem: | ||
220 | release_mem_region(r->start, r->end - r->start + 1); | ||
221 | err_free_clk: | ||
222 | clk_put(pwm->clk); | ||
223 | err_free: | ||
224 | kfree(pwm); | ||
225 | return ERR_PTR(ret); | ||
226 | } | ||
227 | |||
228 | static int __devinit pxa25x_pwm_probe(struct platform_device *pdev) | ||
229 | { | ||
230 | struct pwm_device *pwm = pwm_probe(pdev, pdev->id, NULL); | ||
231 | |||
232 | if (IS_ERR(pwm)) | ||
233 | return PTR_ERR(pwm); | ||
234 | |||
235 | return 0; | ||
236 | } | ||
237 | |||
238 | static int __devinit pxa27x_pwm_probe(struct platform_device *pdev) | ||
239 | { | ||
240 | struct pwm_device *pwm; | ||
241 | |||
242 | pwm = pwm_probe(pdev, pdev->id, NULL); | ||
243 | if (IS_ERR(pwm)) | ||
244 | return PTR_ERR(pwm); | ||
245 | |||
246 | pwm = pwm_probe(pdev, pdev->id + 2, pwm); | ||
247 | if (IS_ERR(pwm)) | ||
248 | return PTR_ERR(pwm); | ||
249 | |||
250 | return 0; | ||
251 | } | ||
252 | |||
253 | static int __devexit pwm_remove(struct platform_device *pdev) | ||
254 | { | ||
255 | struct pwm_device *pwm; | ||
256 | struct resource *r; | ||
257 | |||
258 | pwm = platform_get_drvdata(pdev); | ||
259 | if (pwm == NULL) | ||
260 | return -ENODEV; | ||
261 | |||
262 | mutex_lock(&pwm_lock); | ||
263 | list_del(&pwm->node); | ||
264 | mutex_unlock(&pwm_lock); | ||
265 | |||
266 | iounmap(pwm->mmio_base); | ||
267 | |||
268 | r = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
269 | release_mem_region(r->start, r->end - r->start + 1); | ||
270 | |||
271 | clk_put(pwm->clk); | ||
272 | kfree(pwm); | ||
273 | return 0; | ||
274 | } | ||
275 | |||
276 | static struct platform_driver pxa25x_pwm_driver = { | ||
277 | .driver = { | ||
278 | .name = "pxa25x-pwm", | ||
279 | }, | ||
280 | .probe = pxa25x_pwm_probe, | ||
281 | .remove = __devexit_p(pwm_remove), | ||
282 | }; | ||
283 | |||
284 | static struct platform_driver pxa27x_pwm_driver = { | ||
285 | .driver = { | ||
286 | .name = "pxa27x-pwm", | ||
287 | }, | ||
288 | .probe = pxa27x_pwm_probe, | ||
289 | .remove = __devexit_p(pwm_remove), | ||
290 | }; | ||
291 | |||
292 | static int __init pwm_init(void) | ||
293 | { | ||
294 | int ret = 0; | ||
295 | |||
296 | ret = platform_driver_register(&pxa25x_pwm_driver); | ||
297 | if (ret) { | ||
298 | printk(KERN_ERR "failed to register pxa25x_pwm_driver\n"); | ||
299 | return ret; | ||
300 | } | ||
301 | |||
302 | ret = platform_driver_register(&pxa27x_pwm_driver); | ||
303 | if (ret) { | ||
304 | printk(KERN_ERR "failed to register pxa27x_pwm_driver\n"); | ||
305 | return ret; | ||
306 | } | ||
307 | |||
308 | return ret; | ||
309 | } | ||
310 | arch_initcall(pwm_init); | ||
311 | |||
312 | static void __exit pwm_exit(void) | ||
313 | { | ||
314 | platform_driver_unregister(&pxa25x_pwm_driver); | ||
315 | platform_driver_unregister(&pxa27x_pwm_driver); | ||
316 | } | ||
317 | module_exit(pwm_exit); | ||
318 | |||
319 | MODULE_LICENSE("GPL v2"); | ||
diff --git a/arch/arm/mach-pxa/pxa25x.c b/arch/arm/mach-pxa/pxa25x.c index 09ee131d24a1..a1a7dd23ce5a 100644 --- a/arch/arm/mach-pxa/pxa25x.c +++ b/arch/arm/mach-pxa/pxa25x.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <asm/hardware.h> | 26 | #include <asm/hardware.h> |
27 | #include <asm/arch/irqs.h> | 27 | #include <asm/arch/irqs.h> |
28 | #include <asm/arch/pxa-regs.h> | 28 | #include <asm/arch/pxa-regs.h> |
29 | #include <asm/arch/pxa2xx-regs.h> | ||
29 | #include <asm/arch/mfp-pxa25x.h> | 30 | #include <asm/arch/mfp-pxa25x.h> |
30 | #include <asm/arch/pm.h> | 31 | #include <asm/arch/pm.h> |
31 | #include <asm/arch/dma.h> | 32 | #include <asm/arch/dma.h> |
@@ -133,12 +134,12 @@ static struct clk pxa25x_clks[] = { | |||
133 | INIT_CKEN("SSPCLK", SSP, 3686400, 0, &pxa25x_device_ssp.dev), | 134 | INIT_CKEN("SSPCLK", SSP, 3686400, 0, &pxa25x_device_ssp.dev), |
134 | INIT_CKEN("SSPCLK", NSSP, 3686400, 0, &pxa25x_device_nssp.dev), | 135 | INIT_CKEN("SSPCLK", NSSP, 3686400, 0, &pxa25x_device_nssp.dev), |
135 | INIT_CKEN("SSPCLK", ASSP, 3686400, 0, &pxa25x_device_assp.dev), | 136 | INIT_CKEN("SSPCLK", ASSP, 3686400, 0, &pxa25x_device_assp.dev), |
137 | INIT_CKEN("PWMCLK", PWM0, 3686400, 0, &pxa25x_device_pwm0.dev), | ||
138 | INIT_CKEN("PWMCLK", PWM1, 3686400, 0, &pxa25x_device_pwm1.dev), | ||
136 | 139 | ||
137 | INIT_CKEN("AC97CLK", AC97, 24576000, 0, NULL), | 140 | INIT_CKEN("AC97CLK", AC97, 24576000, 0, NULL), |
138 | 141 | ||
139 | /* | 142 | /* |
140 | INIT_CKEN("PWMCLK", PWM0, 3686400, 0, NULL), | ||
141 | INIT_CKEN("PWMCLK", PWM0, 3686400, 0, NULL), | ||
142 | INIT_CKEN("I2SCLK", I2S, 14745600, 0, NULL), | 143 | INIT_CKEN("I2SCLK", I2S, 14745600, 0, NULL), |
143 | */ | 144 | */ |
144 | INIT_CKEN("FICPCLK", FICP, 47923000, 0, NULL), | 145 | INIT_CKEN("FICPCLK", FICP, 47923000, 0, NULL), |
@@ -275,6 +276,8 @@ static struct platform_device *pxa25x_devices[] __initdata = { | |||
275 | &pxa25x_device_ssp, | 276 | &pxa25x_device_ssp, |
276 | &pxa25x_device_nssp, | 277 | &pxa25x_device_nssp, |
277 | &pxa25x_device_assp, | 278 | &pxa25x_device_assp, |
279 | &pxa25x_device_pwm0, | ||
280 | &pxa25x_device_pwm1, | ||
278 | }; | 281 | }; |
279 | 282 | ||
280 | static struct sys_device pxa25x_sysdev[] = { | 283 | static struct sys_device pxa25x_sysdev[] = { |
diff --git a/arch/arm/mach-pxa/pxa27x.c b/arch/arm/mach-pxa/pxa27x.c index 7e945836e129..4d7afae352a1 100644 --- a/arch/arm/mach-pxa/pxa27x.c +++ b/arch/arm/mach-pxa/pxa27x.c | |||
@@ -157,12 +157,13 @@ static struct clk pxa27x_clks[] = { | |||
157 | INIT_CKEN("SSPCLK", SSP1, 13000000, 0, &pxa27x_device_ssp1.dev), | 157 | INIT_CKEN("SSPCLK", SSP1, 13000000, 0, &pxa27x_device_ssp1.dev), |
158 | INIT_CKEN("SSPCLK", SSP2, 13000000, 0, &pxa27x_device_ssp2.dev), | 158 | INIT_CKEN("SSPCLK", SSP2, 13000000, 0, &pxa27x_device_ssp2.dev), |
159 | INIT_CKEN("SSPCLK", SSP3, 13000000, 0, &pxa27x_device_ssp3.dev), | 159 | INIT_CKEN("SSPCLK", SSP3, 13000000, 0, &pxa27x_device_ssp3.dev), |
160 | INIT_CKEN("PWMCLK", PWM0, 13000000, 0, &pxa27x_device_pwm0.dev), | ||
161 | INIT_CKEN("PWMCLK", PWM1, 13000000, 0, &pxa27x_device_pwm1.dev), | ||
160 | 162 | ||
161 | INIT_CKEN("AC97CLK", AC97, 24576000, 0, NULL), | 163 | INIT_CKEN("AC97CLK", AC97, 24576000, 0, NULL), |
162 | INIT_CKEN("AC97CONFCLK", AC97CONF, 24576000, 0, NULL), | 164 | INIT_CKEN("AC97CONFCLK", AC97CONF, 24576000, 0, NULL), |
163 | 165 | ||
164 | /* | 166 | /* |
165 | INIT_CKEN("PWMCLK", PWM0, 13000000, 0, NULL), | ||
166 | INIT_CKEN("MSLCLK", MSL, 48000000, 0, NULL), | 167 | INIT_CKEN("MSLCLK", MSL, 48000000, 0, NULL), |
167 | INIT_CKEN("USIMCLK", USIM, 48000000, 0, NULL), | 168 | INIT_CKEN("USIMCLK", USIM, 48000000, 0, NULL), |
168 | INIT_CKEN("MSTKCLK", MEMSTK, 19500000, 0, NULL), | 169 | INIT_CKEN("MSTKCLK", MEMSTK, 19500000, 0, NULL), |
@@ -349,11 +350,14 @@ struct platform_device pxa27x_device_i2c_power = { | |||
349 | 350 | ||
350 | void __init pxa_set_i2c_power_info(struct i2c_pxa_platform_data *info) | 351 | void __init pxa_set_i2c_power_info(struct i2c_pxa_platform_data *info) |
351 | { | 352 | { |
353 | local_irq_disable(); | ||
354 | PCFR |= PCFR_PI2CEN; | ||
355 | local_irq_enable(); | ||
352 | pxa27x_device_i2c_power.dev.platform_data = info; | 356 | pxa27x_device_i2c_power.dev.platform_data = info; |
353 | } | 357 | } |
354 | 358 | ||
355 | static struct platform_device *devices[] __initdata = { | 359 | static struct platform_device *devices[] __initdata = { |
356 | &pxa_device_udc, | 360 | /* &pxa_device_udc, The UDC driver is PXA25x only */ |
357 | &pxa_device_ffuart, | 361 | &pxa_device_ffuart, |
358 | &pxa_device_btuart, | 362 | &pxa_device_btuart, |
359 | &pxa_device_stuart, | 363 | &pxa_device_stuart, |
@@ -363,6 +367,8 @@ static struct platform_device *devices[] __initdata = { | |||
363 | &pxa27x_device_ssp1, | 367 | &pxa27x_device_ssp1, |
364 | &pxa27x_device_ssp2, | 368 | &pxa27x_device_ssp2, |
365 | &pxa27x_device_ssp3, | 369 | &pxa27x_device_ssp3, |
370 | &pxa27x_device_pwm0, | ||
371 | &pxa27x_device_pwm1, | ||
366 | }; | 372 | }; |
367 | 373 | ||
368 | static struct sys_device pxa27x_sysdev[] = { | 374 | static struct sys_device pxa27x_sysdev[] = { |
diff --git a/arch/arm/mach-pxa/pxa3xx.c b/arch/arm/mach-pxa/pxa3xx.c index 644550bfa330..d26a9b02a559 100644 --- a/arch/arm/mach-pxa/pxa3xx.c +++ b/arch/arm/mach-pxa/pxa3xx.c | |||
@@ -239,6 +239,8 @@ static struct clk pxa3xx_clks[] = { | |||
239 | PXA3xx_CKEN("SSPCLK", SSP2, 13000000, 0, &pxa27x_device_ssp2.dev), | 239 | PXA3xx_CKEN("SSPCLK", SSP2, 13000000, 0, &pxa27x_device_ssp2.dev), |
240 | PXA3xx_CKEN("SSPCLK", SSP3, 13000000, 0, &pxa27x_device_ssp3.dev), | 240 | PXA3xx_CKEN("SSPCLK", SSP3, 13000000, 0, &pxa27x_device_ssp3.dev), |
241 | PXA3xx_CKEN("SSPCLK", SSP4, 13000000, 0, &pxa3xx_device_ssp4.dev), | 241 | PXA3xx_CKEN("SSPCLK", SSP4, 13000000, 0, &pxa3xx_device_ssp4.dev), |
242 | PXA3xx_CKEN("PWMCLK", PWM0, 13000000, 0, &pxa27x_device_pwm0.dev), | ||
243 | PXA3xx_CKEN("PWMCLK", PWM1, 13000000, 0, &pxa27x_device_pwm1.dev), | ||
242 | 244 | ||
243 | PXA3xx_CKEN("MMCCLK", MMC1, 19500000, 0, &pxa_device_mci.dev), | 245 | PXA3xx_CKEN("MMCCLK", MMC1, 19500000, 0, &pxa_device_mci.dev), |
244 | PXA3xx_CKEN("MMCCLK", MMC2, 19500000, 0, &pxa3xx_device_mci2.dev), | 246 | PXA3xx_CKEN("MMCCLK", MMC2, 19500000, 0, &pxa3xx_device_mci2.dev), |
@@ -520,7 +522,7 @@ void __init pxa3xx_init_irq(void) | |||
520 | */ | 522 | */ |
521 | 523 | ||
522 | static struct platform_device *devices[] __initdata = { | 524 | static struct platform_device *devices[] __initdata = { |
523 | &pxa_device_udc, | 525 | /* &pxa_device_udc, The UDC driver is PXA25x only */ |
524 | &pxa_device_ffuart, | 526 | &pxa_device_ffuart, |
525 | &pxa_device_btuart, | 527 | &pxa_device_btuart, |
526 | &pxa_device_stuart, | 528 | &pxa_device_stuart, |
@@ -530,6 +532,8 @@ static struct platform_device *devices[] __initdata = { | |||
530 | &pxa27x_device_ssp2, | 532 | &pxa27x_device_ssp2, |
531 | &pxa27x_device_ssp3, | 533 | &pxa27x_device_ssp3, |
532 | &pxa3xx_device_ssp4, | 534 | &pxa3xx_device_ssp4, |
535 | &pxa27x_device_pwm0, | ||
536 | &pxa27x_device_pwm1, | ||
533 | }; | 537 | }; |
534 | 538 | ||
535 | static struct sys_device pxa3xx_sysdev[] = { | 539 | static struct sys_device pxa3xx_sysdev[] = { |
diff --git a/arch/arm/mach-pxa/spitz_pm.c b/arch/arm/mach-pxa/spitz_pm.c index 23f050feb208..360354084ae4 100644 --- a/arch/arm/mach-pxa/spitz_pm.c +++ b/arch/arm/mach-pxa/spitz_pm.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <asm/arch/sharpsl.h> | 26 | #include <asm/arch/sharpsl.h> |
27 | #include <asm/arch/spitz.h> | 27 | #include <asm/arch/spitz.h> |
28 | #include <asm/arch/pxa-regs.h> | 28 | #include <asm/arch/pxa-regs.h> |
29 | #include <asm/arch/pxa2xx-regs.h> | ||
29 | #include <asm/arch/pxa2xx-gpio.h> | 30 | #include <asm/arch/pxa2xx-gpio.h> |
30 | #include "sharpsl.h" | 31 | #include "sharpsl.h" |
31 | 32 | ||
@@ -207,7 +208,9 @@ struct sharpsl_charger_machinfo spitz_pm_machinfo = { | |||
207 | .read_devdata = spitzpm_read_devdata, | 208 | .read_devdata = spitzpm_read_devdata, |
208 | .charger_wakeup = spitz_charger_wakeup, | 209 | .charger_wakeup = spitz_charger_wakeup, |
209 | .should_wakeup = spitz_should_wakeup, | 210 | .should_wakeup = spitz_should_wakeup, |
211 | #ifdef CONFIG_BACKLIGHT_CORGI | ||
210 | .backlight_limit = corgibl_limit_intensity, | 212 | .backlight_limit = corgibl_limit_intensity, |
213 | #endif | ||
211 | .charge_on_volt = SHARPSL_CHARGE_ON_VOLT, | 214 | .charge_on_volt = SHARPSL_CHARGE_ON_VOLT, |
212 | .charge_on_temp = SHARPSL_CHARGE_ON_TEMP, | 215 | .charge_on_temp = SHARPSL_CHARGE_ON_TEMP, |
213 | .charge_acin_high = SHARPSL_CHARGE_ON_ACIN_HIGH, | 216 | .charge_acin_high = SHARPSL_CHARGE_ON_ACIN_HIGH, |
@@ -229,6 +232,10 @@ static int __devinit spitzpm_init(void) | |||
229 | { | 232 | { |
230 | int ret; | 233 | int ret; |
231 | 234 | ||
235 | if (!machine_is_spitz() && !machine_is_akita() | ||
236 | && !machine_is_borzoi()) | ||
237 | return -ENODEV; | ||
238 | |||
232 | spitzpm_device = platform_device_alloc("sharpsl-pm", -1); | 239 | spitzpm_device = platform_device_alloc("sharpsl-pm", -1); |
233 | if (!spitzpm_device) | 240 | if (!spitzpm_device) |
234 | return -ENOMEM; | 241 | return -ENOMEM; |
diff --git a/arch/arm/mach-pxa/standby.S b/arch/arm/mach-pxa/standby.S index 167412e6bec8..40bb70eff3fe 100644 --- a/arch/arm/mach-pxa/standby.S +++ b/arch/arm/mach-pxa/standby.S | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <asm/hardware.h> | 14 | #include <asm/hardware.h> |
15 | 15 | ||
16 | #include <asm/arch/pxa-regs.h> | 16 | #include <asm/arch/pxa-regs.h> |
17 | #include <asm/arch/pxa2xx-regs.h> | ||
17 | 18 | ||
18 | .text | 19 | .text |
19 | 20 | ||
@@ -35,20 +36,20 @@ ENTRY(pxa_cpu_standby) | |||
35 | 36 | ||
36 | #ifdef CONFIG_PXA3xx | 37 | #ifdef CONFIG_PXA3xx |
37 | 38 | ||
38 | #define MDCNFG 0x0000 | 39 | #define PXA3_MDCNFG 0x0000 |
39 | #define MDCNFG_DMCEN (1 << 30) | 40 | #define PXA3_MDCNFG_DMCEN (1 << 30) |
40 | #define DDR_HCAL 0x0060 | 41 | #define PXA3_DDR_HCAL 0x0060 |
41 | #define DDR_HCAL_HCRNG 0x1f | 42 | #define PXA3_DDR_HCAL_HCRNG 0x1f |
42 | #define DDR_HCAL_HCPROG (1 << 28) | 43 | #define PXA3_DDR_HCAL_HCPROG (1 << 28) |
43 | #define DDR_HCAL_HCEN (1 << 31) | 44 | #define PXA3_DDR_HCAL_HCEN (1 << 31) |
44 | #define DMCIER 0x0070 | 45 | #define PXA3_DMCIER 0x0070 |
45 | #define DMCIER_EDLP (1 << 29) | 46 | #define PXA3_DMCIER_EDLP (1 << 29) |
46 | #define DMCISR 0x0078 | 47 | #define PXA3_DMCISR 0x0078 |
47 | #define RCOMP 0x0100 | 48 | #define PXA3_RCOMP 0x0100 |
48 | #define RCOMP_SWEVAL (1 << 31) | 49 | #define PXA3_RCOMP_SWEVAL (1 << 31) |
49 | 50 | ||
50 | ENTRY(pm_enter_standby_start) | 51 | ENTRY(pm_enter_standby_start) |
51 | mov r1, #0xf6000000 @ DMEMC_REG_BASE (MDCNFG) | 52 | mov r1, #0xf6000000 @ DMEMC_REG_BASE (PXA3_MDCNFG) |
52 | add r1, r1, #0x00100000 | 53 | add r1, r1, #0x00100000 |
53 | 54 | ||
54 | /* | 55 | /* |
@@ -59,54 +60,54 @@ ENTRY(pm_enter_standby_start) | |||
59 | * This also means that only the dynamic memory controller | 60 | * This also means that only the dynamic memory controller |
60 | * can be reliably accessed in the code following standby. | 61 | * can be reliably accessed in the code following standby. |
61 | */ | 62 | */ |
62 | ldr r2, [r1] @ Dummy read MDCNFG | 63 | ldr r2, [r1] @ Dummy read PXA3_MDCNFG |
63 | 64 | ||
64 | mcr p14, 0, r0, c7, c0, 0 | 65 | mcr p14, 0, r0, c7, c0, 0 |
65 | .rept 8 | 66 | .rept 8 |
66 | nop | 67 | nop |
67 | .endr | 68 | .endr |
68 | 69 | ||
69 | ldr r0, [r1, #DDR_HCAL] @ Clear (and wait for) HCEN | 70 | ldr r0, [r1, #PXA3_DDR_HCAL] @ Clear (and wait for) HCEN |
70 | bic r0, r0, #DDR_HCAL_HCEN | 71 | bic r0, r0, #PXA3_DDR_HCAL_HCEN |
71 | str r0, [r1, #DDR_HCAL] | 72 | str r0, [r1, #PXA3_DDR_HCAL] |
72 | 1: ldr r0, [r1, #DDR_HCAL] | 73 | 1: ldr r0, [r1, #PXA3_DDR_HCAL] |
73 | tst r0, #DDR_HCAL_HCEN | 74 | tst r0, #PXA3_DDR_HCAL_HCEN |
74 | bne 1b | 75 | bne 1b |
75 | 76 | ||
76 | ldr r0, [r1, #RCOMP] @ Initiate RCOMP | 77 | ldr r0, [r1, #PXA3_RCOMP] @ Initiate RCOMP |
77 | orr r0, r0, #RCOMP_SWEVAL | 78 | orr r0, r0, #PXA3_RCOMP_SWEVAL |
78 | str r0, [r1, #RCOMP] | 79 | str r0, [r1, #PXA3_RCOMP] |
79 | 80 | ||
80 | mov r0, #~0 @ Clear interrupts | 81 | mov r0, #~0 @ Clear interrupts |
81 | str r0, [r1, #DMCISR] | 82 | str r0, [r1, #PXA3_DMCISR] |
82 | 83 | ||
83 | ldr r0, [r1, #DMCIER] @ set DMIER[EDLP] | 84 | ldr r0, [r1, #PXA3_DMCIER] @ set DMIER[EDLP] |
84 | orr r0, r0, #DMCIER_EDLP | 85 | orr r0, r0, #PXA3_DMCIER_EDLP |
85 | str r0, [r1, #DMCIER] | 86 | str r0, [r1, #PXA3_DMCIER] |
86 | 87 | ||
87 | ldr r0, [r1, #DDR_HCAL] @ clear HCRNG, set HCPROG, HCEN | 88 | ldr r0, [r1, #PXA3_DDR_HCAL] @ clear HCRNG, set HCPROG, HCEN |
88 | bic r0, r0, #DDR_HCAL_HCRNG | 89 | bic r0, r0, #PXA3_DDR_HCAL_HCRNG |
89 | orr r0, r0, #DDR_HCAL_HCEN | DDR_HCAL_HCPROG | 90 | orr r0, r0, #PXA3_DDR_HCAL_HCEN | PXA3_DDR_HCAL_HCPROG |
90 | str r0, [r1, #DDR_HCAL] | 91 | str r0, [r1, #PXA3_DDR_HCAL] |
91 | 92 | ||
92 | 1: ldr r0, [r1, #DMCISR] | 93 | 1: ldr r0, [r1, #PXA3_DMCISR] |
93 | tst r0, #DMCIER_EDLP | 94 | tst r0, #PXA3_DMCIER_EDLP |
94 | beq 1b | 95 | beq 1b |
95 | 96 | ||
96 | ldr r0, [r1, #MDCNFG] @ set MDCNFG[DMCEN] | 97 | ldr r0, [r1, #PXA3_MDCNFG] @ set PXA3_MDCNFG[DMCEN] |
97 | orr r0, r0, #MDCNFG_DMCEN | 98 | orr r0, r0, #PXA3_MDCNFG_DMCEN |
98 | str r0, [r1, #MDCNFG] | 99 | str r0, [r1, #PXA3_MDCNFG] |
99 | 1: ldr r0, [r1, #MDCNFG] | 100 | 1: ldr r0, [r1, #PXA3_MDCNFG] |
100 | tst r0, #MDCNFG_DMCEN | 101 | tst r0, #PXA3_MDCNFG_DMCEN |
101 | beq 1b | 102 | beq 1b |
102 | 103 | ||
103 | ldr r0, [r1, #DDR_HCAL] @ set DDR_HCAL[HCRNG] | 104 | ldr r0, [r1, #PXA3_DDR_HCAL] @ set PXA3_DDR_HCAL[HCRNG] |
104 | orr r0, r0, #2 @ HCRNG | 105 | orr r0, r0, #2 @ HCRNG |
105 | str r0, [r1, #DDR_HCAL] | 106 | str r0, [r1, #PXA3_DDR_HCAL] |
106 | 107 | ||
107 | ldr r0, [r1, #DMCIER] @ Clear the interrupt | 108 | ldr r0, [r1, #PXA3_DMCIER] @ Clear the interrupt |
108 | bic r0, r0, #0x20000000 | 109 | bic r0, r0, #0x20000000 |
109 | str r0, [r1, #DMCIER] | 110 | str r0, [r1, #PXA3_DMCIER] |
110 | 111 | ||
111 | mov pc, lr | 112 | mov pc, lr |
112 | ENTRY(pm_enter_standby_end) | 113 | ENTRY(pm_enter_standby_end) |
diff --git a/arch/arm/mach-pxa/trizeps4.c b/arch/arm/mach-pxa/trizeps4.c index 931885d86b91..bc7c465ef32b 100644 --- a/arch/arm/mach-pxa/trizeps4.c +++ b/arch/arm/mach-pxa/trizeps4.c | |||
@@ -41,6 +41,7 @@ | |||
41 | #include <asm/mach/flash.h> | 41 | #include <asm/mach/flash.h> |
42 | 42 | ||
43 | #include <asm/arch/pxa-regs.h> | 43 | #include <asm/arch/pxa-regs.h> |
44 | #include <asm/arch/pxa2xx-regs.h> | ||
44 | #include <asm/arch/pxa2xx-gpio.h> | 45 | #include <asm/arch/pxa2xx-gpio.h> |
45 | #include <asm/arch/trizeps4.h> | 46 | #include <asm/arch/trizeps4.h> |
46 | #include <asm/arch/audio.h> | 47 | #include <asm/arch/audio.h> |
@@ -487,6 +488,7 @@ static void __init trizeps4_map_io(void) | |||
487 | ConXS_BCR = trizeps_conxs_bcr; | 488 | ConXS_BCR = trizeps_conxs_bcr; |
488 | #endif | 489 | #endif |
489 | 490 | ||
491 | #warning FIXME - accessing PM registers directly is deprecated | ||
490 | PWER = 0x00000002; | 492 | PWER = 0x00000002; |
491 | PFER = 0x00000000; | 493 | PFER = 0x00000000; |
492 | PRER = 0x00000002; | 494 | PRER = 0x00000002; |
diff --git a/arch/arm/mach-pxa/zylonite.c b/arch/arm/mach-pxa/zylonite.c index 4a0028087ea6..b13bb9385138 100644 --- a/arch/arm/mach-pxa/zylonite.c +++ b/arch/arm/mach-pxa/zylonite.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/interrupt.h> | 18 | #include <linux/interrupt.h> |
19 | #include <linux/init.h> | 19 | #include <linux/init.h> |
20 | #include <linux/platform_device.h> | 20 | #include <linux/platform_device.h> |
21 | #include <linux/pwm_backlight.h> | ||
21 | 22 | ||
22 | #include <asm/mach-types.h> | 23 | #include <asm/mach-types.h> |
23 | #include <asm/mach/arch.h> | 24 | #include <asm/mach/arch.h> |
@@ -28,12 +29,12 @@ | |||
28 | #include <asm/arch/mmc.h> | 29 | #include <asm/arch/mmc.h> |
29 | #include <asm/arch/pxa27x_keypad.h> | 30 | #include <asm/arch/pxa27x_keypad.h> |
30 | 31 | ||
32 | #include "devices.h" | ||
31 | #include "generic.h" | 33 | #include "generic.h" |
32 | 34 | ||
33 | #define MAX_SLOTS 3 | 35 | #define MAX_SLOTS 3 |
34 | struct platform_mmc_slot zylonite_mmc_slot[MAX_SLOTS]; | 36 | struct platform_mmc_slot zylonite_mmc_slot[MAX_SLOTS]; |
35 | 37 | ||
36 | int gpio_backlight; | ||
37 | int gpio_eth_irq; | 38 | int gpio_eth_irq; |
38 | 39 | ||
39 | int wm9713_irq; | 40 | int wm9713_irq; |
@@ -62,10 +63,20 @@ static struct platform_device smc91x_device = { | |||
62 | }; | 63 | }; |
63 | 64 | ||
64 | #if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE) | 65 | #if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE) |
65 | static void zylonite_backlight_power(int on) | 66 | static struct platform_pwm_backlight_data zylonite_backlight_data = { |
66 | { | 67 | .pwm_id = 3, |
67 | gpio_set_value(gpio_backlight, on); | 68 | .max_brightness = 100, |
68 | } | 69 | .dft_brightness = 100, |
70 | .pwm_period_ns = 10000, | ||
71 | }; | ||
72 | |||
73 | static struct platform_device zylonite_backlight_device = { | ||
74 | .name = "pwm-backlight", | ||
75 | .dev = { | ||
76 | .parent = &pxa27x_device_pwm1.dev, | ||
77 | .platform_data = &zylonite_backlight_data, | ||
78 | }, | ||
79 | }; | ||
69 | 80 | ||
70 | static struct pxafb_mode_info toshiba_ltm035a776c_mode = { | 81 | static struct pxafb_mode_info toshiba_ltm035a776c_mode = { |
71 | .pixclock = 110000, | 82 | .pixclock = 110000, |
@@ -98,7 +109,6 @@ static struct pxafb_mode_info toshiba_ltm04c380k_mode = { | |||
98 | static struct pxafb_mach_info zylonite_toshiba_lcd_info = { | 109 | static struct pxafb_mach_info zylonite_toshiba_lcd_info = { |
99 | .num_modes = 1, | 110 | .num_modes = 1, |
100 | .lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL, | 111 | .lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL, |
101 | .pxafb_backlight_power = zylonite_backlight_power, | ||
102 | }; | 112 | }; |
103 | 113 | ||
104 | static struct pxafb_mode_info sharp_ls037_modes[] = { | 114 | static struct pxafb_mode_info sharp_ls037_modes[] = { |
@@ -134,13 +144,11 @@ static struct pxafb_mach_info zylonite_sharp_lcd_info = { | |||
134 | .modes = sharp_ls037_modes, | 144 | .modes = sharp_ls037_modes, |
135 | .num_modes = 2, | 145 | .num_modes = 2, |
136 | .lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL, | 146 | .lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL, |
137 | .pxafb_backlight_power = zylonite_backlight_power, | ||
138 | }; | 147 | }; |
139 | 148 | ||
140 | static void __init zylonite_init_lcd(void) | 149 | static void __init zylonite_init_lcd(void) |
141 | { | 150 | { |
142 | /* backlight GPIO: output, default on */ | 151 | platform_device_register(&zylonite_backlight_device); |
143 | gpio_direction_output(gpio_backlight, 1); | ||
144 | 152 | ||
145 | if (lcd_id & 0x20) { | 153 | if (lcd_id & 0x20) { |
146 | set_pxa_fb_info(&zylonite_sharp_lcd_info); | 154 | set_pxa_fb_info(&zylonite_sharp_lcd_info); |
diff --git a/arch/arm/mach-pxa/zylonite_pxa300.c b/arch/arm/mach-pxa/zylonite_pxa300.c index 324fb9daae28..6f7ae972b8db 100644 --- a/arch/arm/mach-pxa/zylonite_pxa300.c +++ b/arch/arm/mach-pxa/zylonite_pxa300.c | |||
@@ -50,6 +50,7 @@ static mfp_cfg_t common_mfp_cfg[] __initdata = { | |||
50 | GPIO75_LCD_BIAS, | 50 | GPIO75_LCD_BIAS, |
51 | GPIO76_LCD_VSYNC, | 51 | GPIO76_LCD_VSYNC, |
52 | GPIO127_LCD_CS_N, | 52 | GPIO127_LCD_CS_N, |
53 | GPIO20_PWM3_OUT, /* backlight */ | ||
53 | 54 | ||
54 | /* BTUART */ | 55 | /* BTUART */ |
55 | GPIO111_UART2_RTS, | 56 | GPIO111_UART2_RTS, |
@@ -200,9 +201,6 @@ void __init zylonite_pxa300_init(void) | |||
200 | /* detect LCD panel */ | 201 | /* detect LCD panel */ |
201 | zylonite_detect_lcd_panel(); | 202 | zylonite_detect_lcd_panel(); |
202 | 203 | ||
203 | /* GPIO pin assignment */ | ||
204 | gpio_backlight = mfp_to_gpio(MFP_PIN_GPIO20); | ||
205 | |||
206 | /* MMC card detect & write protect for controller 0 */ | 204 | /* MMC card detect & write protect for controller 0 */ |
207 | zylonite_mmc_slot[0].gpio_cd = EXT_GPIO(0); | 205 | zylonite_mmc_slot[0].gpio_cd = EXT_GPIO(0); |
208 | zylonite_mmc_slot[0].gpio_wp = EXT_GPIO(2); | 206 | zylonite_mmc_slot[0].gpio_wp = EXT_GPIO(2); |
diff --git a/arch/arm/mach-pxa/zylonite_pxa320.c b/arch/arm/mach-pxa/zylonite_pxa320.c index 193d07903b06..2b4fc34919ac 100644 --- a/arch/arm/mach-pxa/zylonite_pxa320.c +++ b/arch/arm/mach-pxa/zylonite_pxa320.c | |||
@@ -49,6 +49,7 @@ static mfp_cfg_t mfp_cfg[] __initdata = { | |||
49 | GPIO15_2_LCD_LCLK, | 49 | GPIO15_2_LCD_LCLK, |
50 | GPIO16_2_LCD_PCLK, | 50 | GPIO16_2_LCD_PCLK, |
51 | GPIO17_2_LCD_BIAS, | 51 | GPIO17_2_LCD_BIAS, |
52 | GPIO14_PWM3_OUT, /* backlight */ | ||
52 | 53 | ||
53 | /* FFUART */ | 54 | /* FFUART */ |
54 | GPIO41_UART1_RXD | MFP_LPM_EDGE_FALL, | 55 | GPIO41_UART1_RXD | MFP_LPM_EDGE_FALL, |
@@ -187,7 +188,6 @@ void __init zylonite_pxa320_init(void) | |||
187 | zylonite_detect_lcd_panel(); | 188 | zylonite_detect_lcd_panel(); |
188 | 189 | ||
189 | /* GPIO pin assignment */ | 190 | /* GPIO pin assignment */ |
190 | gpio_backlight = mfp_to_gpio(MFP_PIN_GPIO14); | ||
191 | gpio_eth_irq = mfp_to_gpio(MFP_PIN_GPIO9); | 191 | gpio_eth_irq = mfp_to_gpio(MFP_PIN_GPIO9); |
192 | 192 | ||
193 | /* MMC card detect & write protect for controller 0 */ | 193 | /* MMC card detect & write protect for controller 0 */ |