diff options
Diffstat (limited to 'arch/arm/mach-pxa')
-rw-r--r-- | arch/arm/mach-pxa/clock.c | 15 | ||||
-rw-r--r-- | arch/arm/mach-pxa/corgi.c | 7 | ||||
-rw-r--r-- | arch/arm/mach-pxa/devices.h | 11 | ||||
-rw-r--r-- | arch/arm/mach-pxa/dma.c | 44 | ||||
-rw-r--r-- | arch/arm/mach-pxa/generic.c | 93 | ||||
-rw-r--r-- | arch/arm/mach-pxa/generic.h | 6 | ||||
-rw-r--r-- | arch/arm/mach-pxa/idp.c | 3 | ||||
-rw-r--r-- | arch/arm/mach-pxa/irq.c | 106 | ||||
-rw-r--r-- | arch/arm/mach-pxa/lpd270.c | 3 | ||||
-rw-r--r-- | arch/arm/mach-pxa/lubbock.c | 3 | ||||
-rw-r--r-- | arch/arm/mach-pxa/mainstone.c | 3 | ||||
-rw-r--r-- | arch/arm/mach-pxa/pm.c | 47 | ||||
-rw-r--r-- | arch/arm/mach-pxa/poodle.c | 3 | ||||
-rw-r--r-- | arch/arm/mach-pxa/pxa25x.c | 62 | ||||
-rw-r--r-- | arch/arm/mach-pxa/pxa27x.c | 78 | ||||
-rw-r--r-- | arch/arm/mach-pxa/spitz.c | 7 | ||||
-rw-r--r-- | arch/arm/mach-pxa/time.c | 9 | ||||
-rw-r--r-- | arch/arm/mach-pxa/tosa.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-pxa/trizeps4.c | 3 |
19 files changed, 258 insertions, 249 deletions
diff --git a/arch/arm/mach-pxa/clock.c b/arch/arm/mach-pxa/clock.c index 8f7c90a0593b..34a31caa6f9d 100644 --- a/arch/arm/mach-pxa/clock.c +++ b/arch/arm/mach-pxa/clock.c | |||
@@ -12,7 +12,6 @@ | |||
12 | 12 | ||
13 | #include <asm/arch/pxa-regs.h> | 13 | #include <asm/arch/pxa-regs.h> |
14 | #include <asm/hardware.h> | 14 | #include <asm/hardware.h> |
15 | #include <asm/semaphore.h> | ||
16 | 15 | ||
17 | struct clk { | 16 | struct clk { |
18 | struct list_head node; | 17 | struct list_head node; |
@@ -25,21 +24,21 @@ struct clk { | |||
25 | }; | 24 | }; |
26 | 25 | ||
27 | static LIST_HEAD(clocks); | 26 | static LIST_HEAD(clocks); |
28 | static DECLARE_MUTEX(clocks_sem); | 27 | static DEFINE_MUTEX(clocks_mutex); |
29 | static DEFINE_SPINLOCK(clocks_lock); | 28 | static DEFINE_SPINLOCK(clocks_lock); |
30 | 29 | ||
31 | struct clk *clk_get(struct device *dev, const char *id) | 30 | struct clk *clk_get(struct device *dev, const char *id) |
32 | { | 31 | { |
33 | struct clk *p, *clk = ERR_PTR(-ENOENT); | 32 | struct clk *p, *clk = ERR_PTR(-ENOENT); |
34 | 33 | ||
35 | down(&clocks_sem); | 34 | mutex_lock(&clocks_mutex); |
36 | list_for_each_entry(p, &clocks, node) { | 35 | list_for_each_entry(p, &clocks, node) { |
37 | if (strcmp(id, p->name) == 0 && try_module_get(p->owner)) { | 36 | if (strcmp(id, p->name) == 0 && try_module_get(p->owner)) { |
38 | clk = p; | 37 | clk = p; |
39 | break; | 38 | break; |
40 | } | 39 | } |
41 | } | 40 | } |
42 | up(&clocks_sem); | 41 | mutex_unlock(&clocks_mutex); |
43 | 42 | ||
44 | return clk; | 43 | return clk; |
45 | } | 44 | } |
@@ -101,18 +100,18 @@ static struct clk clk_gpio27 = { | |||
101 | 100 | ||
102 | int clk_register(struct clk *clk) | 101 | int clk_register(struct clk *clk) |
103 | { | 102 | { |
104 | down(&clocks_sem); | 103 | mutex_lock(&clocks_mutex); |
105 | list_add(&clk->node, &clocks); | 104 | list_add(&clk->node, &clocks); |
106 | up(&clocks_sem); | 105 | mutex_unlock(&clocks_mutex); |
107 | return 0; | 106 | return 0; |
108 | } | 107 | } |
109 | EXPORT_SYMBOL(clk_register); | 108 | EXPORT_SYMBOL(clk_register); |
110 | 109 | ||
111 | void clk_unregister(struct clk *clk) | 110 | void clk_unregister(struct clk *clk) |
112 | { | 111 | { |
113 | down(&clocks_sem); | 112 | mutex_lock(&clocks_mutex); |
114 | list_del(&clk->node); | 113 | list_del(&clk->node); |
115 | up(&clocks_sem); | 114 | mutex_unlock(&clocks_mutex); |
116 | } | 115 | } |
117 | EXPORT_SYMBOL(clk_unregister); | 116 | EXPORT_SYMBOL(clk_unregister); |
118 | 117 | ||
diff --git a/arch/arm/mach-pxa/corgi.c b/arch/arm/mach-pxa/corgi.c index a1a900d16665..aab27297b3c6 100644 --- a/arch/arm/mach-pxa/corgi.c +++ b/arch/arm/mach-pxa/corgi.c | |||
@@ -44,6 +44,7 @@ | |||
44 | #include <asm/hardware/scoop.h> | 44 | #include <asm/hardware/scoop.h> |
45 | 45 | ||
46 | #include "generic.h" | 46 | #include "generic.h" |
47 | #include "devices.h" | ||
47 | #include "sharpsl.h" | 48 | #include "sharpsl.h" |
48 | 49 | ||
49 | 50 | ||
@@ -368,7 +369,7 @@ MACHINE_START(CORGI, "SHARP Corgi") | |||
368 | .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, | 369 | .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, |
369 | .fixup = fixup_corgi, | 370 | .fixup = fixup_corgi, |
370 | .map_io = pxa_map_io, | 371 | .map_io = pxa_map_io, |
371 | .init_irq = pxa_init_irq, | 372 | .init_irq = pxa25x_init_irq, |
372 | .init_machine = corgi_init, | 373 | .init_machine = corgi_init, |
373 | .timer = &pxa_timer, | 374 | .timer = &pxa_timer, |
374 | MACHINE_END | 375 | MACHINE_END |
@@ -380,7 +381,7 @@ MACHINE_START(SHEPHERD, "SHARP Shepherd") | |||
380 | .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, | 381 | .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, |
381 | .fixup = fixup_corgi, | 382 | .fixup = fixup_corgi, |
382 | .map_io = pxa_map_io, | 383 | .map_io = pxa_map_io, |
383 | .init_irq = pxa_init_irq, | 384 | .init_irq = pxa25x_init_irq, |
384 | .init_machine = corgi_init, | 385 | .init_machine = corgi_init, |
385 | .timer = &pxa_timer, | 386 | .timer = &pxa_timer, |
386 | MACHINE_END | 387 | MACHINE_END |
@@ -392,7 +393,7 @@ MACHINE_START(HUSKY, "SHARP Husky") | |||
392 | .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, | 393 | .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, |
393 | .fixup = fixup_corgi, | 394 | .fixup = fixup_corgi, |
394 | .map_io = pxa_map_io, | 395 | .map_io = pxa_map_io, |
395 | .init_irq = pxa_init_irq, | 396 | .init_irq = pxa25x_init_irq, |
396 | .init_machine = corgi_init, | 397 | .init_machine = corgi_init, |
397 | .timer = &pxa_timer, | 398 | .timer = &pxa_timer, |
398 | MACHINE_END | 399 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/devices.h b/arch/arm/mach-pxa/devices.h new file mode 100644 index 000000000000..9a6faff8e5a7 --- /dev/null +++ b/arch/arm/mach-pxa/devices.h | |||
@@ -0,0 +1,11 @@ | |||
1 | extern struct platform_device pxamci_device; | ||
2 | extern struct platform_device pxaudc_device; | ||
3 | extern struct platform_device pxafb_device; | ||
4 | extern struct platform_device ffuart_device; | ||
5 | extern struct platform_device btuart_device; | ||
6 | extern struct platform_device stuart_device; | ||
7 | extern struct platform_device hwuart_device; | ||
8 | extern struct platform_device pxai2c_device; | ||
9 | extern struct platform_device pxai2s_device; | ||
10 | extern struct platform_device pxaficp_device; | ||
11 | extern struct platform_device pxartc_device; | ||
diff --git a/arch/arm/mach-pxa/dma.c b/arch/arm/mach-pxa/dma.c index 4440babe7b97..93c4f31f127f 100644 --- a/arch/arm/mach-pxa/dma.c +++ b/arch/arm/mach-pxa/dma.c | |||
@@ -25,12 +25,15 @@ | |||
25 | 25 | ||
26 | #include <asm/arch/pxa-regs.h> | 26 | #include <asm/arch/pxa-regs.h> |
27 | 27 | ||
28 | static struct dma_channel { | 28 | struct dma_channel { |
29 | char *name; | 29 | char *name; |
30 | pxa_dma_prio prio; | ||
30 | void (*irq_handler)(int, void *); | 31 | void (*irq_handler)(int, void *); |
31 | void *data; | 32 | void *data; |
32 | } dma_channels[PXA_DMA_CHANNELS]; | 33 | }; |
33 | 34 | ||
35 | static struct dma_channel *dma_channels; | ||
36 | static int num_dma_channels; | ||
34 | 37 | ||
35 | int pxa_request_dma (char *name, pxa_dma_prio prio, | 38 | int pxa_request_dma (char *name, pxa_dma_prio prio, |
36 | void (*irq_handler)(int, void *), | 39 | void (*irq_handler)(int, void *), |
@@ -47,8 +50,9 @@ int pxa_request_dma (char *name, pxa_dma_prio prio, | |||
47 | 50 | ||
48 | do { | 51 | do { |
49 | /* try grabbing a DMA channel with the requested priority */ | 52 | /* try grabbing a DMA channel with the requested priority */ |
50 | pxa_for_each_dma_prio (i, prio) { | 53 | for (i = 0; i < num_dma_channels; i++) { |
51 | if (!dma_channels[i].name) { | 54 | if ((dma_channels[i].prio == prio) && |
55 | !dma_channels[i].name) { | ||
52 | found = 1; | 56 | found = 1; |
53 | break; | 57 | break; |
54 | } | 58 | } |
@@ -91,7 +95,7 @@ static irqreturn_t dma_irq_handler(int irq, void *dev_id) | |||
91 | { | 95 | { |
92 | int i, dint = DINT; | 96 | int i, dint = DINT; |
93 | 97 | ||
94 | for (i = 0; i < PXA_DMA_CHANNELS; i++) { | 98 | for (i = 0; i < num_dma_channels; i++) { |
95 | if (dint & (1 << i)) { | 99 | if (dint & (1 << i)) { |
96 | struct dma_channel *channel = &dma_channels[i]; | 100 | struct dma_channel *channel = &dma_channels[i]; |
97 | if (channel->name && channel->irq_handler) { | 101 | if (channel->name && channel->irq_handler) { |
@@ -109,18 +113,32 @@ static irqreturn_t dma_irq_handler(int irq, void *dev_id) | |||
109 | return IRQ_HANDLED; | 113 | return IRQ_HANDLED; |
110 | } | 114 | } |
111 | 115 | ||
112 | static int __init pxa_dma_init (void) | 116 | int __init pxa_init_dma(int num_ch) |
113 | { | 117 | { |
114 | int ret; | 118 | int i, ret; |
115 | 119 | ||
116 | ret = request_irq (IRQ_DMA, dma_irq_handler, 0, "DMA", NULL); | 120 | dma_channels = kzalloc(sizeof(struct dma_channel) * num_ch, GFP_KERNEL); |
117 | if (ret) | 121 | if (dma_channels == NULL) |
122 | return -ENOMEM; | ||
123 | |||
124 | ret = request_irq(IRQ_DMA, dma_irq_handler, IRQF_DISABLED, "DMA", NULL); | ||
125 | if (ret) { | ||
118 | printk (KERN_CRIT "Wow! Can't register IRQ for DMA\n"); | 126 | printk (KERN_CRIT "Wow! Can't register IRQ for DMA\n"); |
119 | return ret; | 127 | kfree(dma_channels); |
120 | } | 128 | return ret; |
129 | } | ||
121 | 130 | ||
122 | arch_initcall(pxa_dma_init); | 131 | /* dma channel priorities on pxa2xx processors: |
132 | * ch 0 - 3, 16 - 19 <--> (0) DMA_PRIO_HIGH | ||
133 | * ch 4 - 7, 20 - 23 <--> (1) DMA_PRIO_MEDIUM | ||
134 | * ch 8 - 15, 24 - 31 <--> (2) DMA_PRIO_LOW | ||
135 | */ | ||
136 | for (i = 0; i < num_ch; i++) | ||
137 | dma_channels[i].prio = min((i & 0xf) >> 2, DMA_PRIO_LOW); | ||
138 | |||
139 | num_dma_channels = num_ch; | ||
140 | return 0; | ||
141 | } | ||
123 | 142 | ||
124 | EXPORT_SYMBOL(pxa_request_dma); | 143 | EXPORT_SYMBOL(pxa_request_dma); |
125 | EXPORT_SYMBOL(pxa_free_dma); | 144 | EXPORT_SYMBOL(pxa_free_dma); |
126 | |||
diff --git a/arch/arm/mach-pxa/generic.c b/arch/arm/mach-pxa/generic.c index 64b08b744f9f..296539b6359c 100644 --- a/arch/arm/mach-pxa/generic.c +++ b/arch/arm/mach-pxa/generic.c | |||
@@ -43,6 +43,7 @@ | |||
43 | #include <asm/arch/irda.h> | 43 | #include <asm/arch/irda.h> |
44 | #include <asm/arch/i2c.h> | 44 | #include <asm/arch/i2c.h> |
45 | 45 | ||
46 | #include "devices.h" | ||
46 | #include "generic.h" | 47 | #include "generic.h" |
47 | 48 | ||
48 | /* | 49 | /* |
@@ -242,7 +243,7 @@ static struct resource pxamci_resources[] = { | |||
242 | 243 | ||
243 | static u64 pxamci_dmamask = 0xffffffffUL; | 244 | static u64 pxamci_dmamask = 0xffffffffUL; |
244 | 245 | ||
245 | static struct platform_device pxamci_device = { | 246 | struct platform_device pxamci_device = { |
246 | .name = "pxa2xx-mci", | 247 | .name = "pxa2xx-mci", |
247 | .id = -1, | 248 | .id = -1, |
248 | .dev = { | 249 | .dev = { |
@@ -281,7 +282,7 @@ static struct resource pxa2xx_udc_resources[] = { | |||
281 | 282 | ||
282 | static u64 udc_dma_mask = ~(u32)0; | 283 | static u64 udc_dma_mask = ~(u32)0; |
283 | 284 | ||
284 | static struct platform_device udc_device = { | 285 | struct platform_device pxaudc_device = { |
285 | .name = "pxa2xx-udc", | 286 | .name = "pxa2xx-udc", |
286 | .id = -1, | 287 | .id = -1, |
287 | .resource = pxa2xx_udc_resources, | 288 | .resource = pxa2xx_udc_resources, |
@@ -307,7 +308,7 @@ static struct resource pxafb_resources[] = { | |||
307 | 308 | ||
308 | static u64 fb_dma_mask = ~(u64)0; | 309 | static u64 fb_dma_mask = ~(u64)0; |
309 | 310 | ||
310 | static struct platform_device pxafb_device = { | 311 | struct platform_device pxafb_device = { |
311 | .name = "pxa2xx-fb", | 312 | .name = "pxa2xx-fb", |
312 | .id = -1, | 313 | .id = -1, |
313 | .dev = { | 314 | .dev = { |
@@ -328,24 +329,24 @@ void __init set_pxa_fb_parent(struct device *parent_dev) | |||
328 | pxafb_device.dev.parent = parent_dev; | 329 | pxafb_device.dev.parent = parent_dev; |
329 | } | 330 | } |
330 | 331 | ||
331 | static struct platform_device ffuart_device = { | 332 | struct platform_device ffuart_device = { |
332 | .name = "pxa2xx-uart", | 333 | .name = "pxa2xx-uart", |
333 | .id = 0, | 334 | .id = 0, |
334 | }; | 335 | }; |
335 | static struct platform_device btuart_device = { | 336 | struct platform_device btuart_device = { |
336 | .name = "pxa2xx-uart", | 337 | .name = "pxa2xx-uart", |
337 | .id = 1, | 338 | .id = 1, |
338 | }; | 339 | }; |
339 | static struct platform_device stuart_device = { | 340 | struct platform_device stuart_device = { |
340 | .name = "pxa2xx-uart", | 341 | .name = "pxa2xx-uart", |
341 | .id = 2, | 342 | .id = 2, |
342 | }; | 343 | }; |
343 | static struct platform_device hwuart_device = { | 344 | struct platform_device hwuart_device = { |
344 | .name = "pxa2xx-uart", | 345 | .name = "pxa2xx-uart", |
345 | .id = 3, | 346 | .id = 3, |
346 | }; | 347 | }; |
347 | 348 | ||
348 | static struct resource i2c_resources[] = { | 349 | static struct resource pxai2c_resources[] = { |
349 | { | 350 | { |
350 | .start = 0x40301680, | 351 | .start = 0x40301680, |
351 | .end = 0x403016a3, | 352 | .end = 0x403016a3, |
@@ -357,40 +358,19 @@ static struct resource i2c_resources[] = { | |||
357 | }, | 358 | }, |
358 | }; | 359 | }; |
359 | 360 | ||
360 | static struct platform_device i2c_device = { | 361 | struct platform_device pxai2c_device = { |
361 | .name = "pxa2xx-i2c", | 362 | .name = "pxa2xx-i2c", |
362 | .id = 0, | 363 | .id = 0, |
363 | .resource = i2c_resources, | 364 | .resource = pxai2c_resources, |
364 | .num_resources = ARRAY_SIZE(i2c_resources), | 365 | .num_resources = ARRAY_SIZE(pxai2c_resources), |
365 | }; | 366 | }; |
366 | 367 | ||
367 | #ifdef CONFIG_PXA27x | ||
368 | static struct resource i2c_power_resources[] = { | ||
369 | { | ||
370 | .start = 0x40f00180, | ||
371 | .end = 0x40f001a3, | ||
372 | .flags = IORESOURCE_MEM, | ||
373 | }, { | ||
374 | .start = IRQ_PWRI2C, | ||
375 | .end = IRQ_PWRI2C, | ||
376 | .flags = IORESOURCE_IRQ, | ||
377 | }, | ||
378 | }; | ||
379 | |||
380 | static struct platform_device i2c_power_device = { | ||
381 | .name = "pxa2xx-i2c", | ||
382 | .id = 1, | ||
383 | .resource = i2c_power_resources, | ||
384 | .num_resources = ARRAY_SIZE(i2c_resources), | ||
385 | }; | ||
386 | #endif | ||
387 | |||
388 | void __init pxa_set_i2c_info(struct i2c_pxa_platform_data *info) | 368 | void __init pxa_set_i2c_info(struct i2c_pxa_platform_data *info) |
389 | { | 369 | { |
390 | i2c_device.dev.platform_data = info; | 370 | pxai2c_device.dev.platform_data = info; |
391 | } | 371 | } |
392 | 372 | ||
393 | static struct resource i2s_resources[] = { | 373 | static struct resource pxai2s_resources[] = { |
394 | { | 374 | { |
395 | .start = 0x40400000, | 375 | .start = 0x40400000, |
396 | .end = 0x40400083, | 376 | .end = 0x40400083, |
@@ -402,16 +382,16 @@ static struct resource i2s_resources[] = { | |||
402 | }, | 382 | }, |
403 | }; | 383 | }; |
404 | 384 | ||
405 | static struct platform_device i2s_device = { | 385 | struct platform_device pxai2s_device = { |
406 | .name = "pxa2xx-i2s", | 386 | .name = "pxa2xx-i2s", |
407 | .id = -1, | 387 | .id = -1, |
408 | .resource = i2s_resources, | 388 | .resource = pxai2s_resources, |
409 | .num_resources = ARRAY_SIZE(i2s_resources), | 389 | .num_resources = ARRAY_SIZE(pxai2s_resources), |
410 | }; | 390 | }; |
411 | 391 | ||
412 | static u64 pxaficp_dmamask = ~(u32)0; | 392 | static u64 pxaficp_dmamask = ~(u32)0; |
413 | 393 | ||
414 | static struct platform_device pxaficp_device = { | 394 | struct platform_device pxaficp_device = { |
415 | .name = "pxa2xx-ir", | 395 | .name = "pxa2xx-ir", |
416 | .id = -1, | 396 | .id = -1, |
417 | .dev = { | 397 | .dev = { |
@@ -425,42 +405,7 @@ void __init pxa_set_ficp_info(struct pxaficp_platform_data *info) | |||
425 | pxaficp_device.dev.platform_data = info; | 405 | pxaficp_device.dev.platform_data = info; |
426 | } | 406 | } |
427 | 407 | ||
428 | static struct platform_device pxartc_device = { | 408 | struct platform_device pxartc_device = { |
429 | .name = "sa1100-rtc", | 409 | .name = "sa1100-rtc", |
430 | .id = -1, | 410 | .id = -1, |
431 | }; | 411 | }; |
432 | |||
433 | static struct platform_device *devices[] __initdata = { | ||
434 | &pxamci_device, | ||
435 | &udc_device, | ||
436 | &pxafb_device, | ||
437 | &ffuart_device, | ||
438 | &btuart_device, | ||
439 | &stuart_device, | ||
440 | &pxaficp_device, | ||
441 | &i2c_device, | ||
442 | #ifdef CONFIG_PXA27x | ||
443 | &i2c_power_device, | ||
444 | #endif | ||
445 | &i2s_device, | ||
446 | &pxartc_device, | ||
447 | }; | ||
448 | |||
449 | static int __init pxa_init(void) | ||
450 | { | ||
451 | int cpuid, ret; | ||
452 | |||
453 | ret = platform_add_devices(devices, ARRAY_SIZE(devices)); | ||
454 | if (ret) | ||
455 | return ret; | ||
456 | |||
457 | /* Only add HWUART for PXA255/26x; PXA210/250/27x do not have it. */ | ||
458 | cpuid = read_cpuid(CPUID_ID); | ||
459 | if (((cpuid >> 4) & 0xfff) == 0x2d0 || | ||
460 | ((cpuid >> 4) & 0xfff) == 0x290) | ||
461 | ret = platform_device_register(&hwuart_device); | ||
462 | |||
463 | return ret; | ||
464 | } | ||
465 | |||
466 | subsys_initcall(pxa_init); | ||
diff --git a/arch/arm/mach-pxa/generic.h b/arch/arm/mach-pxa/generic.h index e54a8dd63c17..91ab2ad8b34b 100644 --- a/arch/arm/mach-pxa/generic.h +++ b/arch/arm/mach-pxa/generic.h | |||
@@ -12,8 +12,12 @@ | |||
12 | struct sys_timer; | 12 | struct sys_timer; |
13 | 13 | ||
14 | extern struct sys_timer pxa_timer; | 14 | extern struct sys_timer pxa_timer; |
15 | extern void __init pxa_init_irq_low(void); | ||
16 | extern void __init pxa_init_irq_high(void); | ||
17 | extern void __init pxa_init_irq_gpio(int gpio_nr); | ||
18 | extern void __init pxa25x_init_irq(void); | ||
19 | extern void __init pxa27x_init_irq(void); | ||
15 | extern void __init pxa_map_io(void); | 20 | extern void __init pxa_map_io(void); |
16 | extern void __init pxa_init_irq(void); | ||
17 | 21 | ||
18 | extern unsigned int get_clk_frequency_khz(int info); | 22 | extern unsigned int get_clk_frequency_khz(int info); |
19 | 23 | ||
diff --git a/arch/arm/mach-pxa/idp.c b/arch/arm/mach-pxa/idp.c index 64df44043a65..465108da2851 100644 --- a/arch/arm/mach-pxa/idp.c +++ b/arch/arm/mach-pxa/idp.c | |||
@@ -38,6 +38,7 @@ | |||
38 | #include <asm/arch/mmc.h> | 38 | #include <asm/arch/mmc.h> |
39 | 39 | ||
40 | #include "generic.h" | 40 | #include "generic.h" |
41 | #include "devices.h" | ||
41 | 42 | ||
42 | /* TODO: | 43 | /* TODO: |
43 | * - add pxa2xx_audio_ops_t device structure | 44 | * - add pxa2xx_audio_ops_t device structure |
@@ -152,7 +153,7 @@ static void __init idp_init(void) | |||
152 | static void __init idp_init_irq(void) | 153 | static void __init idp_init_irq(void) |
153 | { | 154 | { |
154 | 155 | ||
155 | pxa_init_irq(); | 156 | pxa25x_init_irq(); |
156 | 157 | ||
157 | set_irq_type(TOUCH_PANEL_IRQ, TOUCH_PANEL_IRQ_EDGE); | 158 | set_irq_type(TOUCH_PANEL_IRQ, TOUCH_PANEL_IRQ_EDGE); |
158 | } | 159 | } |
diff --git a/arch/arm/mach-pxa/irq.c b/arch/arm/mach-pxa/irq.c index 4619d5fe606c..4b867b0789d5 100644 --- a/arch/arm/mach-pxa/irq.c +++ b/arch/arm/mach-pxa/irq.c | |||
@@ -30,12 +30,12 @@ | |||
30 | 30 | ||
31 | static void pxa_mask_low_irq(unsigned int irq) | 31 | static void pxa_mask_low_irq(unsigned int irq) |
32 | { | 32 | { |
33 | ICMR &= ~(1 << (irq + PXA_IRQ_SKIP)); | 33 | ICMR &= ~(1 << irq); |
34 | } | 34 | } |
35 | 35 | ||
36 | static void pxa_unmask_low_irq(unsigned int irq) | 36 | static void pxa_unmask_low_irq(unsigned int irq) |
37 | { | 37 | { |
38 | ICMR |= (1 << (irq + PXA_IRQ_SKIP)); | 38 | ICMR |= (1 << irq); |
39 | } | 39 | } |
40 | 40 | ||
41 | static int pxa_set_wake(unsigned int irq, unsigned int on) | 41 | static int pxa_set_wake(unsigned int irq, unsigned int on) |
@@ -67,7 +67,27 @@ static struct irq_chip pxa_internal_chip_low = { | |||
67 | .set_wake = pxa_set_wake, | 67 | .set_wake = pxa_set_wake, |
68 | }; | 68 | }; |
69 | 69 | ||
70 | #if PXA_INTERNAL_IRQS > 32 | 70 | void __init pxa_init_irq_low(void) |
71 | { | ||
72 | int irq; | ||
73 | |||
74 | /* disable all IRQs */ | ||
75 | ICMR = 0; | ||
76 | |||
77 | /* all IRQs are IRQ, not FIQ */ | ||
78 | ICLR = 0; | ||
79 | |||
80 | /* only unmasked interrupts kick us out of idle */ | ||
81 | ICCR = 1; | ||
82 | |||
83 | for (irq = PXA_IRQ(0); irq <= PXA_IRQ(31); irq++) { | ||
84 | set_irq_chip(irq, &pxa_internal_chip_low); | ||
85 | set_irq_handler(irq, handle_level_irq); | ||
86 | set_irq_flags(irq, IRQF_VALID); | ||
87 | } | ||
88 | } | ||
89 | |||
90 | #ifdef CONFIG_PXA27x | ||
71 | 91 | ||
72 | /* | 92 | /* |
73 | * This is for the second set of internal IRQs as found on the PXA27x. | 93 | * This is for the second set of internal IRQs as found on the PXA27x. |
@@ -75,12 +95,12 @@ static struct irq_chip pxa_internal_chip_low = { | |||
75 | 95 | ||
76 | static void pxa_mask_high_irq(unsigned int irq) | 96 | static void pxa_mask_high_irq(unsigned int irq) |
77 | { | 97 | { |
78 | ICMR2 &= ~(1 << (irq - 32 + PXA_IRQ_SKIP)); | 98 | ICMR2 &= ~(1 << (irq - 32)); |
79 | } | 99 | } |
80 | 100 | ||
81 | static void pxa_unmask_high_irq(unsigned int irq) | 101 | static void pxa_unmask_high_irq(unsigned int irq) |
82 | { | 102 | { |
83 | ICMR2 |= (1 << (irq - 32 + PXA_IRQ_SKIP)); | 103 | ICMR2 |= (1 << (irq - 32)); |
84 | } | 104 | } |
85 | 105 | ||
86 | static struct irq_chip pxa_internal_chip_high = { | 106 | static struct irq_chip pxa_internal_chip_high = { |
@@ -90,6 +110,19 @@ static struct irq_chip pxa_internal_chip_high = { | |||
90 | .unmask = pxa_unmask_high_irq, | 110 | .unmask = pxa_unmask_high_irq, |
91 | }; | 111 | }; |
92 | 112 | ||
113 | void __init pxa_init_irq_high(void) | ||
114 | { | ||
115 | int irq; | ||
116 | |||
117 | ICMR2 = 0; | ||
118 | ICLR2 = 0; | ||
119 | |||
120 | for (irq = PXA_IRQ(32); irq < PXA_IRQ(64); irq++) { | ||
121 | set_irq_chip(irq, &pxa_internal_chip_high); | ||
122 | set_irq_handler(irq, handle_level_irq); | ||
123 | set_irq_flags(irq, IRQF_VALID); | ||
124 | } | ||
125 | } | ||
93 | #endif | 126 | #endif |
94 | 127 | ||
95 | /* Note that if an input/irq line ever gets changed to an output during | 128 | /* Note that if an input/irq line ever gets changed to an output during |
@@ -217,7 +250,7 @@ static void pxa_gpio_demux_handler(unsigned int irq, struct irq_desc *desc) | |||
217 | do { | 250 | do { |
218 | loop = 0; | 251 | loop = 0; |
219 | 252 | ||
220 | mask = GEDR0 & ~3; | 253 | mask = GEDR0 & GPIO_IRQ_mask[0] & ~3; |
221 | if (mask) { | 254 | if (mask) { |
222 | GEDR0 = mask; | 255 | GEDR0 = mask; |
223 | irq = IRQ_GPIO(2); | 256 | irq = IRQ_GPIO(2); |
@@ -233,7 +266,7 @@ static void pxa_gpio_demux_handler(unsigned int irq, struct irq_desc *desc) | |||
233 | loop = 1; | 266 | loop = 1; |
234 | } | 267 | } |
235 | 268 | ||
236 | mask = GEDR1; | 269 | mask = GEDR1 & GPIO_IRQ_mask[1]; |
237 | if (mask) { | 270 | if (mask) { |
238 | GEDR1 = mask; | 271 | GEDR1 = mask; |
239 | irq = IRQ_GPIO(32); | 272 | irq = IRQ_GPIO(32); |
@@ -248,7 +281,7 @@ static void pxa_gpio_demux_handler(unsigned int irq, struct irq_desc *desc) | |||
248 | loop = 1; | 281 | loop = 1; |
249 | } | 282 | } |
250 | 283 | ||
251 | mask = GEDR2; | 284 | mask = GEDR2 & GPIO_IRQ_mask[2]; |
252 | if (mask) { | 285 | if (mask) { |
253 | GEDR2 = mask; | 286 | GEDR2 = mask; |
254 | irq = IRQ_GPIO(64); | 287 | irq = IRQ_GPIO(64); |
@@ -263,8 +296,7 @@ static void pxa_gpio_demux_handler(unsigned int irq, struct irq_desc *desc) | |||
263 | loop = 1; | 296 | loop = 1; |
264 | } | 297 | } |
265 | 298 | ||
266 | #if PXA_LAST_GPIO >= 96 | 299 | mask = GEDR3 & GPIO_IRQ_mask[3]; |
267 | mask = GEDR3; | ||
268 | if (mask) { | 300 | if (mask) { |
269 | GEDR3 = mask; | 301 | GEDR3 = mask; |
270 | irq = IRQ_GPIO(96); | 302 | irq = IRQ_GPIO(96); |
@@ -278,7 +310,6 @@ static void pxa_gpio_demux_handler(unsigned int irq, struct irq_desc *desc) | |||
278 | } while (mask); | 310 | } while (mask); |
279 | loop = 1; | 311 | loop = 1; |
280 | } | 312 | } |
281 | #endif | ||
282 | } while (loop); | 313 | } while (loop); |
283 | } | 314 | } |
284 | 315 | ||
@@ -314,64 +345,27 @@ static struct irq_chip pxa_muxed_gpio_chip = { | |||
314 | .set_wake = pxa_set_gpio_wake, | 345 | .set_wake = pxa_set_gpio_wake, |
315 | }; | 346 | }; |
316 | 347 | ||
317 | 348 | void __init pxa_init_irq_gpio(int gpio_nr) | |
318 | void __init pxa_init_irq(void) | ||
319 | { | 349 | { |
320 | int irq; | 350 | int irq, i; |
321 | |||
322 | /* disable all IRQs */ | ||
323 | ICMR = 0; | ||
324 | |||
325 | /* all IRQs are IRQ, not FIQ */ | ||
326 | ICLR = 0; | ||
327 | 351 | ||
328 | /* clear all GPIO edge detects */ | 352 | /* clear all GPIO edge detects */ |
329 | GFER0 = 0; | 353 | for (i = 0; i < gpio_nr; i += 32) { |
330 | GFER1 = 0; | 354 | GFER(i) = 0; |
331 | GFER2 = 0; | 355 | GRER(i) = 0; |
332 | GRER0 = 0; | 356 | GEDR(i) = GEDR(i); |
333 | GRER1 = 0; | 357 | } |
334 | GRER2 = 0; | ||
335 | GEDR0 = GEDR0; | ||
336 | GEDR1 = GEDR1; | ||
337 | GEDR2 = GEDR2; | ||
338 | |||
339 | #ifdef CONFIG_PXA27x | ||
340 | /* And similarly for the extra regs on the PXA27x */ | ||
341 | ICMR2 = 0; | ||
342 | ICLR2 = 0; | ||
343 | GFER3 = 0; | ||
344 | GRER3 = 0; | ||
345 | GEDR3 = GEDR3; | ||
346 | #endif | ||
347 | |||
348 | /* only unmasked interrupts kick us out of idle */ | ||
349 | ICCR = 1; | ||
350 | 358 | ||
351 | /* GPIO 0 and 1 must have their mask bit always set */ | 359 | /* GPIO 0 and 1 must have their mask bit always set */ |
352 | GPIO_IRQ_mask[0] = 3; | 360 | GPIO_IRQ_mask[0] = 3; |
353 | 361 | ||
354 | for (irq = PXA_IRQ(PXA_IRQ_SKIP); irq <= PXA_IRQ(31); irq++) { | ||
355 | set_irq_chip(irq, &pxa_internal_chip_low); | ||
356 | set_irq_handler(irq, handle_level_irq); | ||
357 | set_irq_flags(irq, IRQF_VALID); | ||
358 | } | ||
359 | |||
360 | #if PXA_INTERNAL_IRQS > 32 | ||
361 | for (irq = PXA_IRQ(32); irq < PXA_IRQ(PXA_INTERNAL_IRQS); irq++) { | ||
362 | set_irq_chip(irq, &pxa_internal_chip_high); | ||
363 | set_irq_handler(irq, handle_level_irq); | ||
364 | set_irq_flags(irq, IRQF_VALID); | ||
365 | } | ||
366 | #endif | ||
367 | |||
368 | for (irq = IRQ_GPIO0; irq <= IRQ_GPIO1; irq++) { | 362 | for (irq = IRQ_GPIO0; irq <= IRQ_GPIO1; irq++) { |
369 | set_irq_chip(irq, &pxa_low_gpio_chip); | 363 | set_irq_chip(irq, &pxa_low_gpio_chip); |
370 | set_irq_handler(irq, handle_edge_irq); | 364 | set_irq_handler(irq, handle_edge_irq); |
371 | set_irq_flags(irq, IRQF_VALID | IRQF_PROBE); | 365 | set_irq_flags(irq, IRQF_VALID | IRQF_PROBE); |
372 | } | 366 | } |
373 | 367 | ||
374 | for (irq = IRQ_GPIO(2); irq <= IRQ_GPIO(PXA_LAST_GPIO); irq++) { | 368 | for (irq = IRQ_GPIO(2); irq <= IRQ_GPIO(gpio_nr); irq++) { |
375 | set_irq_chip(irq, &pxa_muxed_gpio_chip); | 369 | set_irq_chip(irq, &pxa_muxed_gpio_chip); |
376 | set_irq_handler(irq, handle_edge_irq); | 370 | set_irq_handler(irq, handle_edge_irq); |
377 | set_irq_flags(irq, IRQF_VALID | IRQF_PROBE); | 371 | set_irq_flags(irq, IRQF_VALID | IRQF_PROBE); |
diff --git a/arch/arm/mach-pxa/lpd270.c b/arch/arm/mach-pxa/lpd270.c index e3097664ffe1..26116440a7c9 100644 --- a/arch/arm/mach-pxa/lpd270.c +++ b/arch/arm/mach-pxa/lpd270.c | |||
@@ -46,6 +46,7 @@ | |||
46 | #include <asm/arch/ohci.h> | 46 | #include <asm/arch/ohci.h> |
47 | 47 | ||
48 | #include "generic.h" | 48 | #include "generic.h" |
49 | #include "devices.h" | ||
49 | 50 | ||
50 | 51 | ||
51 | static unsigned int lpd270_irq_enabled; | 52 | static unsigned int lpd270_irq_enabled; |
@@ -97,7 +98,7 @@ static void __init lpd270_init_irq(void) | |||
97 | { | 98 | { |
98 | int irq; | 99 | int irq; |
99 | 100 | ||
100 | pxa_init_irq(); | 101 | pxa27x_init_irq(); |
101 | 102 | ||
102 | __raw_writew(0, LPD270_INT_MASK); | 103 | __raw_writew(0, LPD270_INT_MASK); |
103 | __raw_writew(0, LPD270_INT_STATUS); | 104 | __raw_writew(0, LPD270_INT_STATUS); |
diff --git a/arch/arm/mach-pxa/lubbock.c b/arch/arm/mach-pxa/lubbock.c index 6377b2e29ff0..e70048fd00a5 100644 --- a/arch/arm/mach-pxa/lubbock.c +++ b/arch/arm/mach-pxa/lubbock.c | |||
@@ -48,6 +48,7 @@ | |||
48 | #include <asm/arch/mmc.h> | 48 | #include <asm/arch/mmc.h> |
49 | 49 | ||
50 | #include "generic.h" | 50 | #include "generic.h" |
51 | #include "devices.h" | ||
51 | 52 | ||
52 | 53 | ||
53 | #define LUB_MISC_WR __LUB_REG(LUBBOCK_FPGA_PHYS + 0x080) | 54 | #define LUB_MISC_WR __LUB_REG(LUBBOCK_FPGA_PHYS + 0x080) |
@@ -103,7 +104,7 @@ static void __init lubbock_init_irq(void) | |||
103 | { | 104 | { |
104 | int irq; | 105 | int irq; |
105 | 106 | ||
106 | pxa_init_irq(); | 107 | pxa25x_init_irq(); |
107 | 108 | ||
108 | /* setup extra lubbock irqs */ | 109 | /* setup extra lubbock irqs */ |
109 | for (irq = LUBBOCK_IRQ(0); irq <= LUBBOCK_LAST_IRQ; irq++) { | 110 | for (irq = LUBBOCK_IRQ(0); irq <= LUBBOCK_LAST_IRQ; irq++) { |
diff --git a/arch/arm/mach-pxa/mainstone.c b/arch/arm/mach-pxa/mainstone.c index ed99a81b98f3..b02c79c7e6a3 100644 --- a/arch/arm/mach-pxa/mainstone.c +++ b/arch/arm/mach-pxa/mainstone.c | |||
@@ -46,6 +46,7 @@ | |||
46 | #include <asm/arch/ohci.h> | 46 | #include <asm/arch/ohci.h> |
47 | 47 | ||
48 | #include "generic.h" | 48 | #include "generic.h" |
49 | #include "devices.h" | ||
49 | 50 | ||
50 | 51 | ||
51 | static unsigned long mainstone_irq_enabled; | 52 | static unsigned long mainstone_irq_enabled; |
@@ -89,7 +90,7 @@ static void __init mainstone_init_irq(void) | |||
89 | { | 90 | { |
90 | int irq; | 91 | int irq; |
91 | 92 | ||
92 | pxa_init_irq(); | 93 | pxa27x_init_irq(); |
93 | 94 | ||
94 | /* setup extra Mainstone irqs */ | 95 | /* setup extra Mainstone irqs */ |
95 | for(irq = MAINSTONE_IRQ(0); irq <= MAINSTONE_IRQ(15); irq++) { | 96 | for(irq = MAINSTONE_IRQ(0); irq <= MAINSTONE_IRQ(15); irq++) { |
diff --git a/arch/arm/mach-pxa/pm.c b/arch/arm/mach-pxa/pm.c index 6bf15ae73848..e66dbc26add1 100644 --- a/arch/arm/mach-pxa/pm.c +++ b/arch/arm/mach-pxa/pm.c | |||
@@ -77,7 +77,6 @@ int pxa_pm_enter(suspend_state_t state) | |||
77 | { | 77 | { |
78 | unsigned long sleep_save[SLEEP_SAVE_SIZE]; | 78 | unsigned long sleep_save[SLEEP_SAVE_SIZE]; |
79 | unsigned long checksum = 0; | 79 | unsigned long checksum = 0; |
80 | struct timespec delta, rtc; | ||
81 | int i; | 80 | int i; |
82 | extern void pxa_cpu_pm_enter(suspend_state_t state); | 81 | extern void pxa_cpu_pm_enter(suspend_state_t state); |
83 | 82 | ||
@@ -87,11 +86,6 @@ int pxa_pm_enter(suspend_state_t state) | |||
87 | iwmmxt_task_disable(NULL); | 86 | iwmmxt_task_disable(NULL); |
88 | #endif | 87 | #endif |
89 | 88 | ||
90 | /* preserve current time */ | ||
91 | rtc.tv_sec = RCNR; | ||
92 | rtc.tv_nsec = 0; | ||
93 | save_time_delta(&delta, &rtc); | ||
94 | |||
95 | SAVE(GPLR0); SAVE(GPLR1); SAVE(GPLR2); | 89 | SAVE(GPLR0); SAVE(GPLR1); SAVE(GPLR2); |
96 | SAVE(GPDR0); SAVE(GPDR1); SAVE(GPDR2); | 90 | SAVE(GPDR0); SAVE(GPDR1); SAVE(GPDR2); |
97 | SAVE(GRER0); SAVE(GRER1); SAVE(GRER2); | 91 | SAVE(GRER0); SAVE(GRER1); SAVE(GRER2); |
@@ -183,10 +177,6 @@ int pxa_pm_enter(suspend_state_t state) | |||
183 | 177 | ||
184 | RESTORE(PSTR); | 178 | RESTORE(PSTR); |
185 | 179 | ||
186 | /* restore current time */ | ||
187 | rtc.tv_sec = RCNR; | ||
188 | restore_time_delta(&delta, &rtc); | ||
189 | |||
190 | #ifdef DEBUG | 180 | #ifdef DEBUG |
191 | printk(KERN_DEBUG "*** made it back from resume\n"); | 181 | printk(KERN_DEBUG "*** made it back from resume\n"); |
192 | #endif | 182 | #endif |
@@ -200,40 +190,3 @@ unsigned long sleep_phys_sp(void *sp) | |||
200 | { | 190 | { |
201 | return virt_to_phys(sp); | 191 | return virt_to_phys(sp); |
202 | } | 192 | } |
203 | |||
204 | /* | ||
205 | * Called after processes are frozen, but before we shut down devices. | ||
206 | */ | ||
207 | int pxa_pm_prepare(suspend_state_t state) | ||
208 | { | ||
209 | extern int pxa_cpu_pm_prepare(suspend_state_t state); | ||
210 | |||
211 | return pxa_cpu_pm_prepare(state); | ||
212 | } | ||
213 | |||
214 | EXPORT_SYMBOL_GPL(pxa_pm_prepare); | ||
215 | |||
216 | /* | ||
217 | * Called after devices are re-setup, but before processes are thawed. | ||
218 | */ | ||
219 | int pxa_pm_finish(suspend_state_t state) | ||
220 | { | ||
221 | return 0; | ||
222 | } | ||
223 | |||
224 | EXPORT_SYMBOL_GPL(pxa_pm_finish); | ||
225 | |||
226 | static struct pm_ops pxa_pm_ops = { | ||
227 | .prepare = pxa_pm_prepare, | ||
228 | .enter = pxa_pm_enter, | ||
229 | .finish = pxa_pm_finish, | ||
230 | .valid = pm_valid_only_mem, | ||
231 | }; | ||
232 | |||
233 | static int __init pxa_pm_init(void) | ||
234 | { | ||
235 | pm_set_ops(&pxa_pm_ops); | ||
236 | return 0; | ||
237 | } | ||
238 | |||
239 | device_initcall(pxa_pm_init); | ||
diff --git a/arch/arm/mach-pxa/poodle.c b/arch/arm/mach-pxa/poodle.c index 34fb80b37023..655668d4d0e9 100644 --- a/arch/arm/mach-pxa/poodle.c +++ b/arch/arm/mach-pxa/poodle.c | |||
@@ -45,6 +45,7 @@ | |||
45 | #include <asm/mach/sharpsl_param.h> | 45 | #include <asm/mach/sharpsl_param.h> |
46 | 46 | ||
47 | #include "generic.h" | 47 | #include "generic.h" |
48 | #include "devices.h" | ||
48 | #include "sharpsl.h" | 49 | #include "sharpsl.h" |
49 | 50 | ||
50 | static struct resource poodle_scoop_resources[] = { | 51 | static struct resource poodle_scoop_resources[] = { |
@@ -412,7 +413,7 @@ MACHINE_START(POODLE, "SHARP Poodle") | |||
412 | .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, | 413 | .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, |
413 | .fixup = fixup_poodle, | 414 | .fixup = fixup_poodle, |
414 | .map_io = pxa_map_io, | 415 | .map_io = pxa_map_io, |
415 | .init_irq = pxa_init_irq, | 416 | .init_irq = pxa25x_init_irq, |
416 | .timer = &pxa_timer, | 417 | .timer = &pxa_timer, |
417 | .init_machine = poodle_init, | 418 | .init_machine = poodle_init, |
418 | MACHINE_END | 419 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/pxa25x.c b/arch/arm/mach-pxa/pxa25x.c index c1f21739bf71..f36ca448338e 100644 --- a/arch/arm/mach-pxa/pxa25x.c +++ b/arch/arm/mach-pxa/pxa25x.c | |||
@@ -19,12 +19,17 @@ | |||
19 | #include <linux/module.h> | 19 | #include <linux/module.h> |
20 | #include <linux/kernel.h> | 20 | #include <linux/kernel.h> |
21 | #include <linux/init.h> | 21 | #include <linux/init.h> |
22 | #include <linux/platform_device.h> | ||
22 | #include <linux/pm.h> | 23 | #include <linux/pm.h> |
23 | 24 | ||
24 | #include <asm/hardware.h> | 25 | #include <asm/hardware.h> |
26 | #include <asm/arch/irqs.h> | ||
25 | #include <asm/arch/pxa-regs.h> | 27 | #include <asm/arch/pxa-regs.h> |
28 | #include <asm/arch/pm.h> | ||
29 | #include <asm/arch/dma.h> | ||
26 | 30 | ||
27 | #include "generic.h" | 31 | #include "generic.h" |
32 | #include "devices.h" | ||
28 | 33 | ||
29 | /* | 34 | /* |
30 | * Various clock factors driven by the CCCR register. | 35 | * Various clock factors driven by the CCCR register. |
@@ -105,18 +110,6 @@ EXPORT_SYMBOL(get_lcdclk_frequency_10khz); | |||
105 | 110 | ||
106 | #ifdef CONFIG_PM | 111 | #ifdef CONFIG_PM |
107 | 112 | ||
108 | int pxa_cpu_pm_prepare(suspend_state_t state) | ||
109 | { | ||
110 | switch (state) { | ||
111 | case PM_SUSPEND_MEM: | ||
112 | break; | ||
113 | default: | ||
114 | return -EINVAL; | ||
115 | } | ||
116 | |||
117 | return 0; | ||
118 | } | ||
119 | |||
120 | void pxa_cpu_pm_enter(suspend_state_t state) | 113 | void pxa_cpu_pm_enter(suspend_state_t state) |
121 | { | 114 | { |
122 | extern void pxa_cpu_suspend(unsigned int); | 115 | extern void pxa_cpu_suspend(unsigned int); |
@@ -133,4 +126,49 @@ void pxa_cpu_pm_enter(suspend_state_t state) | |||
133 | } | 126 | } |
134 | } | 127 | } |
135 | 128 | ||
129 | static struct pm_ops pxa25x_pm_ops = { | ||
130 | .enter = pxa_pm_enter, | ||
131 | .valid = pm_valid_only_mem, | ||
132 | }; | ||
133 | #endif | ||
134 | |||
135 | void __init pxa25x_init_irq(void) | ||
136 | { | ||
137 | pxa_init_irq_low(); | ||
138 | pxa_init_irq_gpio(85); | ||
139 | } | ||
140 | |||
141 | static struct platform_device *pxa25x_devices[] __initdata = { | ||
142 | &pxamci_device, | ||
143 | &pxaudc_device, | ||
144 | &pxafb_device, | ||
145 | &ffuart_device, | ||
146 | &btuart_device, | ||
147 | &stuart_device, | ||
148 | &pxai2c_device, | ||
149 | &pxai2s_device, | ||
150 | &pxaficp_device, | ||
151 | &pxartc_device, | ||
152 | }; | ||
153 | |||
154 | static int __init pxa25x_init(void) | ||
155 | { | ||
156 | int ret = 0; | ||
157 | |||
158 | if (cpu_is_pxa21x() || cpu_is_pxa25x()) { | ||
159 | if ((ret = pxa_init_dma(16))) | ||
160 | return ret; | ||
161 | #ifdef CONFIG_PM | ||
162 | pm_set_ops(&pxa25x_pm_ops); | ||
136 | #endif | 163 | #endif |
164 | ret = platform_add_devices(pxa25x_devices, | ||
165 | ARRAY_SIZE(pxa25x_devices)); | ||
166 | } | ||
167 | /* Only add HWUART for PXA255/26x; PXA210/250/27x do not have it. */ | ||
168 | if (cpu_is_pxa25x()) | ||
169 | ret = platform_device_register(&hwuart_device); | ||
170 | |||
171 | return ret; | ||
172 | } | ||
173 | |||
174 | subsys_initcall(pxa25x_init); | ||
diff --git a/arch/arm/mach-pxa/pxa27x.c b/arch/arm/mach-pxa/pxa27x.c index 1939acc3f9f7..aa5bb02c897b 100644 --- a/arch/arm/mach-pxa/pxa27x.c +++ b/arch/arm/mach-pxa/pxa27x.c | |||
@@ -19,10 +19,14 @@ | |||
19 | 19 | ||
20 | #include <asm/hardware.h> | 20 | #include <asm/hardware.h> |
21 | #include <asm/irq.h> | 21 | #include <asm/irq.h> |
22 | #include <asm/arch/irqs.h> | ||
22 | #include <asm/arch/pxa-regs.h> | 23 | #include <asm/arch/pxa-regs.h> |
23 | #include <asm/arch/ohci.h> | 24 | #include <asm/arch/ohci.h> |
25 | #include <asm/arch/pm.h> | ||
26 | #include <asm/arch/dma.h> | ||
24 | 27 | ||
25 | #include "generic.h" | 28 | #include "generic.h" |
29 | #include "devices.h" | ||
26 | 30 | ||
27 | /* Crystal clock: 13MHz */ | 31 | /* Crystal clock: 13MHz */ |
28 | #define BASE_CLK 13000000 | 32 | #define BASE_CLK 13000000 |
@@ -122,17 +126,6 @@ EXPORT_SYMBOL(get_lcdclk_frequency_10khz); | |||
122 | 126 | ||
123 | #ifdef CONFIG_PM | 127 | #ifdef CONFIG_PM |
124 | 128 | ||
125 | int pxa_cpu_pm_prepare(suspend_state_t state) | ||
126 | { | ||
127 | switch (state) { | ||
128 | case PM_SUSPEND_MEM: | ||
129 | case PM_SUSPEND_STANDBY: | ||
130 | return 0; | ||
131 | default: | ||
132 | return -EINVAL; | ||
133 | } | ||
134 | } | ||
135 | |||
136 | void pxa_cpu_pm_enter(suspend_state_t state) | 129 | void pxa_cpu_pm_enter(suspend_state_t state) |
137 | { | 130 | { |
138 | extern void pxa_cpu_standby(void); | 131 | extern void pxa_cpu_standby(void); |
@@ -162,6 +155,15 @@ void pxa_cpu_pm_enter(suspend_state_t state) | |||
162 | } | 155 | } |
163 | } | 156 | } |
164 | 157 | ||
158 | static int pxa27x_pm_valid(suspend_state_t state) | ||
159 | { | ||
160 | return state == PM_SUSPEND_MEM || state == PM_SUSPEND_STANDBY; | ||
161 | } | ||
162 | |||
163 | static struct pm_ops pxa27x_pm_ops = { | ||
164 | .enter = pxa_pm_enter, | ||
165 | .valid = pxa27x_pm_valid, | ||
166 | }; | ||
165 | #endif | 167 | #endif |
166 | 168 | ||
167 | /* | 169 | /* |
@@ -183,7 +185,7 @@ static struct resource pxa27x_ohci_resources[] = { | |||
183 | }, | 185 | }, |
184 | }; | 186 | }; |
185 | 187 | ||
186 | static struct platform_device ohci_device = { | 188 | static struct platform_device pxaohci_device = { |
187 | .name = "pxa27x-ohci", | 189 | .name = "pxa27x-ohci", |
188 | .id = -1, | 190 | .id = -1, |
189 | .dev = { | 191 | .dev = { |
@@ -196,16 +198,62 @@ static struct platform_device ohci_device = { | |||
196 | 198 | ||
197 | void __init pxa_set_ohci_info(struct pxaohci_platform_data *info) | 199 | void __init pxa_set_ohci_info(struct pxaohci_platform_data *info) |
198 | { | 200 | { |
199 | ohci_device.dev.platform_data = info; | 201 | pxaohci_device.dev.platform_data = info; |
200 | } | 202 | } |
201 | 203 | ||
204 | static struct resource i2c_power_resources[] = { | ||
205 | { | ||
206 | .start = 0x40f00180, | ||
207 | .end = 0x40f001a3, | ||
208 | .flags = IORESOURCE_MEM, | ||
209 | }, { | ||
210 | .start = IRQ_PWRI2C, | ||
211 | .end = IRQ_PWRI2C, | ||
212 | .flags = IORESOURCE_IRQ, | ||
213 | }, | ||
214 | }; | ||
215 | |||
216 | static struct platform_device pxai2c_power_device = { | ||
217 | .name = "pxa2xx-i2c", | ||
218 | .id = 1, | ||
219 | .resource = i2c_power_resources, | ||
220 | .num_resources = ARRAY_SIZE(i2c_power_resources), | ||
221 | }; | ||
222 | |||
202 | static struct platform_device *devices[] __initdata = { | 223 | static struct platform_device *devices[] __initdata = { |
203 | &ohci_device, | 224 | &pxamci_device, |
225 | &pxaudc_device, | ||
226 | &pxafb_device, | ||
227 | &ffuart_device, | ||
228 | &btuart_device, | ||
229 | &stuart_device, | ||
230 | &pxai2c_device, | ||
231 | &pxai2c_power_device, | ||
232 | &pxai2s_device, | ||
233 | &pxaficp_device, | ||
234 | &pxartc_device, | ||
235 | &pxaohci_device, | ||
204 | }; | 236 | }; |
205 | 237 | ||
238 | void __init pxa27x_init_irq(void) | ||
239 | { | ||
240 | pxa_init_irq_low(); | ||
241 | pxa_init_irq_high(); | ||
242 | pxa_init_irq_gpio(128); | ||
243 | } | ||
244 | |||
206 | static int __init pxa27x_init(void) | 245 | static int __init pxa27x_init(void) |
207 | { | 246 | { |
208 | return platform_add_devices(devices, ARRAY_SIZE(devices)); | 247 | int ret = 0; |
248 | if (cpu_is_pxa27x()) { | ||
249 | if ((ret = pxa_init_dma(32))) | ||
250 | return ret; | ||
251 | #ifdef CONFIG_PM | ||
252 | pm_set_ops(&pxa27x_pm_ops); | ||
253 | #endif | ||
254 | ret = platform_add_devices(devices, ARRAY_SIZE(devices)); | ||
255 | } | ||
256 | return ret; | ||
209 | } | 257 | } |
210 | 258 | ||
211 | subsys_initcall(pxa27x_init); | 259 | subsys_initcall(pxa27x_init); |
diff --git a/arch/arm/mach-pxa/spitz.c b/arch/arm/mach-pxa/spitz.c index 3cbac63bed3c..bae47e145de8 100644 --- a/arch/arm/mach-pxa/spitz.c +++ b/arch/arm/mach-pxa/spitz.c | |||
@@ -48,6 +48,7 @@ | |||
48 | #include <asm/hardware/scoop.h> | 48 | #include <asm/hardware/scoop.h> |
49 | 49 | ||
50 | #include "generic.h" | 50 | #include "generic.h" |
51 | #include "devices.h" | ||
51 | #include "sharpsl.h" | 52 | #include "sharpsl.h" |
52 | 53 | ||
53 | /* | 54 | /* |
@@ -560,7 +561,7 @@ MACHINE_START(SPITZ, "SHARP Spitz") | |||
560 | .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, | 561 | .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, |
561 | .fixup = fixup_spitz, | 562 | .fixup = fixup_spitz, |
562 | .map_io = pxa_map_io, | 563 | .map_io = pxa_map_io, |
563 | .init_irq = pxa_init_irq, | 564 | .init_irq = pxa27x_init_irq, |
564 | .init_machine = spitz_init, | 565 | .init_machine = spitz_init, |
565 | .timer = &pxa_timer, | 566 | .timer = &pxa_timer, |
566 | MACHINE_END | 567 | MACHINE_END |
@@ -572,7 +573,7 @@ MACHINE_START(BORZOI, "SHARP Borzoi") | |||
572 | .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, | 573 | .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, |
573 | .fixup = fixup_spitz, | 574 | .fixup = fixup_spitz, |
574 | .map_io = pxa_map_io, | 575 | .map_io = pxa_map_io, |
575 | .init_irq = pxa_init_irq, | 576 | .init_irq = pxa27x_init_irq, |
576 | .init_machine = spitz_init, | 577 | .init_machine = spitz_init, |
577 | .timer = &pxa_timer, | 578 | .timer = &pxa_timer, |
578 | MACHINE_END | 579 | MACHINE_END |
@@ -584,7 +585,7 @@ MACHINE_START(AKITA, "SHARP Akita") | |||
584 | .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, | 585 | .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, |
585 | .fixup = fixup_spitz, | 586 | .fixup = fixup_spitz, |
586 | .map_io = pxa_map_io, | 587 | .map_io = pxa_map_io, |
587 | .init_irq = pxa_init_irq, | 588 | .init_irq = pxa27x_init_irq, |
588 | .init_machine = akita_init, | 589 | .init_machine = akita_init, |
589 | .timer = &pxa_timer, | 590 | .timer = &pxa_timer, |
590 | MACHINE_END | 591 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/time.c b/arch/arm/mach-pxa/time.c index 5248abe334d2..6f91fd2d061a 100644 --- a/arch/arm/mach-pxa/time.c +++ b/arch/arm/mach-pxa/time.c | |||
@@ -30,11 +30,6 @@ | |||
30 | #include <asm/arch/pxa-regs.h> | 30 | #include <asm/arch/pxa-regs.h> |
31 | 31 | ||
32 | 32 | ||
33 | static inline unsigned long pxa_get_rtc_time(void) | ||
34 | { | ||
35 | return RCNR; | ||
36 | } | ||
37 | |||
38 | static int pxa_set_rtc(void) | 33 | static int pxa_set_rtc(void) |
39 | { | 34 | { |
40 | unsigned long current_time = xtime.tv_sec; | 35 | unsigned long current_time = xtime.tv_sec; |
@@ -122,10 +117,6 @@ static void __init pxa_timer_init(void) | |||
122 | 117 | ||
123 | set_rtc = pxa_set_rtc; | 118 | set_rtc = pxa_set_rtc; |
124 | 119 | ||
125 | tv.tv_nsec = 0; | ||
126 | tv.tv_sec = pxa_get_rtc_time(); | ||
127 | do_settimeofday(&tv); | ||
128 | |||
129 | OIER = 0; /* disable any timer interrupts */ | 120 | OIER = 0; /* disable any timer interrupts */ |
130 | OSSR = 0xf; /* clear status on all timers */ | 121 | OSSR = 0xf; /* clear status on all timers */ |
131 | setup_irq(IRQ_OST0, &pxa_timer_irq); | 122 | setup_irq(IRQ_OST0, &pxa_timer_irq); |
diff --git a/arch/arm/mach-pxa/tosa.c b/arch/arm/mach-pxa/tosa.c index 72738771fb57..240fd042083d 100644 --- a/arch/arm/mach-pxa/tosa.c +++ b/arch/arm/mach-pxa/tosa.c | |||
@@ -42,7 +42,7 @@ | |||
42 | #include <asm/mach/sharpsl_param.h> | 42 | #include <asm/mach/sharpsl_param.h> |
43 | 43 | ||
44 | #include "generic.h" | 44 | #include "generic.h" |
45 | 45 | #include "devices.h" | |
46 | 46 | ||
47 | /* | 47 | /* |
48 | * SCOOP Device | 48 | * SCOOP Device |
@@ -332,7 +332,7 @@ MACHINE_START(TOSA, "SHARP Tosa") | |||
332 | .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, | 332 | .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc, |
333 | .fixup = fixup_tosa, | 333 | .fixup = fixup_tosa, |
334 | .map_io = pxa_map_io, | 334 | .map_io = pxa_map_io, |
335 | .init_irq = pxa_init_irq, | 335 | .init_irq = pxa25x_init_irq, |
336 | .init_machine = tosa_init, | 336 | .init_machine = tosa_init, |
337 | .timer = &pxa_timer, | 337 | .timer = &pxa_timer, |
338 | MACHINE_END | 338 | MACHINE_END |
diff --git a/arch/arm/mach-pxa/trizeps4.c b/arch/arm/mach-pxa/trizeps4.c index 28c79bd0a3a0..e4ba43bdf85d 100644 --- a/arch/arm/mach-pxa/trizeps4.c +++ b/arch/arm/mach-pxa/trizeps4.c | |||
@@ -49,6 +49,7 @@ | |||
49 | #include <asm/arch/ohci.h> | 49 | #include <asm/arch/ohci.h> |
50 | 50 | ||
51 | #include "generic.h" | 51 | #include "generic.h" |
52 | #include "devices.h" | ||
52 | 53 | ||
53 | /******************************************************************************************** | 54 | /******************************************************************************************** |
54 | * ONBOARD FLASH | 55 | * ONBOARD FLASH |
@@ -503,7 +504,7 @@ MACHINE_START(TRIZEPS4, "Keith und Koep Trizeps IV module") | |||
503 | .boot_params = TRIZEPS4_SDRAM_BASE + 0x100, | 504 | .boot_params = TRIZEPS4_SDRAM_BASE + 0x100, |
504 | .init_machine = trizeps4_init, | 505 | .init_machine = trizeps4_init, |
505 | .map_io = trizeps4_map_io, | 506 | .map_io = trizeps4_map_io, |
506 | .init_irq = pxa_init_irq, | 507 | .init_irq = pxa27x_init_irq, |
507 | .timer = &pxa_timer, | 508 | .timer = &pxa_timer, |
508 | MACHINE_END | 509 | MACHINE_END |
509 | 510 | ||