Blame view

arch/arm/mach-pxa/pxa3xx.c 11.5 KB
2c8086a5d   eric miao   [ARM] pxa: PXA3xx...
1
2
3
4
5
6
7
  /*
   * linux/arch/arm/mach-pxa/pxa3xx.c
   *
   * code specific to pxa3xx aka Monahans
   *
   * Copyright (C) 2006 Marvell International Ltd.
   *
e9bba8ee6   eric miao   [ARM] 4635/1: pxa...
8
   * 2007-09-02: eric miao <eric.miao@marvell.com>
2c8086a5d   eric miao   [ARM] pxa: PXA3xx...
9
10
11
12
13
14
   *             initial version
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License version 2 as
   * published by the Free Software Foundation.
   */
2c8086a5d   eric miao   [ARM] pxa: PXA3xx...
15
16
17
18
19
20
  #include <linux/module.h>
  #include <linux/kernel.h>
  #include <linux/init.h>
  #include <linux/pm.h>
  #include <linux/platform_device.h>
  #include <linux/irq.h>
7b5dea123   Russell King   [ARM] pxa: Add PX...
21
  #include <linux/io.h>
2eaa03b5b   Rafael J. Wysocki   ARM / PXA: Use st...
22
  #include <linux/syscore_ops.h>
b459396ee   Sebastian Andrzej Siewior   ARM: pxa2xx: reor...
23
  #include <linux/i2c/pxa-i2c.h>
2c8086a5d   eric miao   [ARM] pxa: PXA3xx...
24

851982c1b   Marek Vasut   ARM: pxa: Introdu...
25
  #include <asm/mach/map.h>
2c74a0cef   Russell King   ARM: pm: hide 1st...
26
  #include <asm/suspend.h>
a09e64fbc   Russell King   [ARM] Move includ...
27
28
  #include <mach/hardware.h>
  #include <mach/pxa3xx-regs.h>
afd2fc02a   Russell King   Merge branch 'for...
29
  #include <mach/reset.h>
a09e64fbc   Russell King   [ARM] Move includ...
30
31
32
  #include <mach/ohci.h>
  #include <mach/pm.h>
  #include <mach/dma.h>
ad68bb9f7   Marek Vasut   ARM: pxa: Access ...
33
  #include <mach/smemc.h>
2c8086a5d   eric miao   [ARM] pxa: PXA3xx...
34
35
36
37
  
  #include "generic.h"
  #include "devices.h"
  #include "clock.h"
bf293aec1   Mike Rapoport   [ARM] pxa: add EX...
38
39
  #define PECR_IE(n)	((1 << ((n) * 2)) << 28)
  #define PECR_IS(n)	((1 << ((n) * 2)) << 29)
8c3abc7d9   Russell King   [ARM] pxa: conver...
40
41
42
43
44
45
  static DEFINE_PXA3_CKEN(pxa3xx_ffuart, FFUART, 14857000, 1);
  static DEFINE_PXA3_CKEN(pxa3xx_btuart, BTUART, 14857000, 1);
  static DEFINE_PXA3_CKEN(pxa3xx_stuart, STUART, 14857000, 1);
  static DEFINE_PXA3_CKEN(pxa3xx_i2c, I2C, 32842000, 0);
  static DEFINE_PXA3_CKEN(pxa3xx_udc, UDC, 48000000, 5);
  static DEFINE_PXA3_CKEN(pxa3xx_usbh, USBH, 48000000, 0);
e68750aea   Igor Grinberg   [ARM] pxa: regist...
46
  static DEFINE_PXA3_CKEN(pxa3xx_u2d, USB2, 48000000, 0);
8c3abc7d9   Russell King   [ARM] pxa: conver...
47
48
49
50
51
52
53
54
55
  static DEFINE_PXA3_CKEN(pxa3xx_keypad, KEYPAD, 32768, 0);
  static DEFINE_PXA3_CKEN(pxa3xx_ssp1, SSP1, 13000000, 0);
  static DEFINE_PXA3_CKEN(pxa3xx_ssp2, SSP2, 13000000, 0);
  static DEFINE_PXA3_CKEN(pxa3xx_ssp3, SSP3, 13000000, 0);
  static DEFINE_PXA3_CKEN(pxa3xx_ssp4, SSP4, 13000000, 0);
  static DEFINE_PXA3_CKEN(pxa3xx_pwm0, PWM0, 13000000, 0);
  static DEFINE_PXA3_CKEN(pxa3xx_pwm1, PWM1, 13000000, 0);
  static DEFINE_PXA3_CKEN(pxa3xx_mmc1, MMC1, 19500000, 0);
  static DEFINE_PXA3_CKEN(pxa3xx_mmc2, MMC2, 19500000, 0);
389eda15e   Haojian Zhuang   ARM: pxa: add clk...
56
  static DEFINE_PXA3_CKEN(pxa3xx_gpio, GPIO, 13000000, 0);
8c3abc7d9   Russell King   [ARM] pxa: conver...
57

2e8581e75   Eric Miao   ARM: pxa: replace...
58
  static DEFINE_CK(pxa3xx_lcd, LCD, &clk_pxa3xx_hsio_ops);
c085052bc   Eric Miao   ARM: pxa: add clo...
59
  static DEFINE_CK(pxa3xx_smemc, SMC, &clk_pxa3xx_smemc_ops);
2e8581e75   Eric Miao   ARM: pxa: replace...
60
61
  static DEFINE_CK(pxa3xx_camera, CAMERA, &clk_pxa3xx_hsio_ops);
  static DEFINE_CK(pxa3xx_ac97, AC97, &clk_pxa3xx_ac97_ops);
4029813c8   Eric Miao   ARM: pxa: separat...
62
  static DEFINE_CLK(pxa3xx_pout, &clk_pxa3xx_pout_ops, 13000000, 70);
2e8581e75   Eric Miao   ARM: pxa: replace...
63

8c3abc7d9   Russell King   [ARM] pxa: conver...
64
65
66
  static struct clk_lookup pxa3xx_clkregs[] = {
  	INIT_CLKREG(&clk_pxa3xx_pout, NULL, "CLK_POUT"),
  	/* Power I2C clock is always on */
5c68b0990   Daniel Mack   [ARM] pxa: correc...
67
  	INIT_CLKREG(&clk_dummy, "pxa3xx-pwri2c.1", NULL),
7557c175f   Jett.Zhou   ARM: pxa: add dum...
68
  	INIT_CLKREG(&clk_dummy, "sa1100-rtc", NULL),
8c3abc7d9   Russell King   [ARM] pxa: conver...
69
70
71
72
73
74
75
76
77
78
  	INIT_CLKREG(&clk_pxa3xx_lcd, "pxa2xx-fb", NULL),
  	INIT_CLKREG(&clk_pxa3xx_camera, NULL, "CAMCLK"),
  	INIT_CLKREG(&clk_pxa3xx_ac97, NULL, "AC97CLK"),
  	INIT_CLKREG(&clk_pxa3xx_ffuart, "pxa2xx-uart.0", NULL),
  	INIT_CLKREG(&clk_pxa3xx_btuart, "pxa2xx-uart.1", NULL),
  	INIT_CLKREG(&clk_pxa3xx_stuart, "pxa2xx-uart.2", NULL),
  	INIT_CLKREG(&clk_pxa3xx_stuart, "pxa2xx-ir", "UARTCLK"),
  	INIT_CLKREG(&clk_pxa3xx_i2c, "pxa2xx-i2c.0", NULL),
  	INIT_CLKREG(&clk_pxa3xx_udc, "pxa27x-udc", NULL),
  	INIT_CLKREG(&clk_pxa3xx_usbh, "pxa27x-ohci", NULL),
69f22be7b   Igor Grinberg   ARM: pxa: add U2D...
79
  	INIT_CLKREG(&clk_pxa3xx_u2d, "pxa3xx-u2d", NULL),
8c3abc7d9   Russell King   [ARM] pxa: conver...
80
81
82
83
84
85
86
87
88
  	INIT_CLKREG(&clk_pxa3xx_keypad, "pxa27x-keypad", NULL),
  	INIT_CLKREG(&clk_pxa3xx_ssp1, "pxa27x-ssp.0", NULL),
  	INIT_CLKREG(&clk_pxa3xx_ssp2, "pxa27x-ssp.1", NULL),
  	INIT_CLKREG(&clk_pxa3xx_ssp3, "pxa27x-ssp.2", NULL),
  	INIT_CLKREG(&clk_pxa3xx_ssp4, "pxa27x-ssp.3", NULL),
  	INIT_CLKREG(&clk_pxa3xx_pwm0, "pxa27x-pwm.0", NULL),
  	INIT_CLKREG(&clk_pxa3xx_pwm1, "pxa27x-pwm.1", NULL),
  	INIT_CLKREG(&clk_pxa3xx_mmc1, "pxa2xx-mci.0", NULL),
  	INIT_CLKREG(&clk_pxa3xx_mmc2, "pxa2xx-mci.1", NULL),
c085052bc   Eric Miao   ARM: pxa: add clo...
89
  	INIT_CLKREG(&clk_pxa3xx_smemc, "pxa2xx-pcmcia", NULL),
389eda15e   Haojian Zhuang   ARM: pxa: add clk...
90
  	INIT_CLKREG(&clk_pxa3xx_gpio, "pxa-gpio", NULL),
2c8086a5d   eric miao   [ARM] pxa: PXA3xx...
91
  };
7b5dea123   Russell King   [ARM] pxa: Add PX...
92
  #ifdef CONFIG_PM
7b5dea123   Russell King   [ARM] pxa: Add PX...
93
94
95
96
97
98
  
  #define ISRAM_START	0x5c000000
  #define ISRAM_SIZE	SZ_256K
  
  static void __iomem *sram;
  static unsigned long wakeup_src;
7b5dea123   Russell King   [ARM] pxa: Add PX...
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
  /*
   * Enter a standby mode (S0D1C2 or S0D2C2).  Upon wakeup, the dynamic
   * memory controller has to be reinitialised, so we place some code
   * in the SRAM to perform this function.
   *
   * We disable FIQs across the standby - otherwise, we might receive a
   * FIQ while the SDRAM is unavailable.
   */
  static void pxa3xx_cpu_standby(unsigned int pwrmode)
  {
  	extern const char pm_enter_standby_start[], pm_enter_standby_end[];
  	void (*fn)(unsigned int) = (void __force *)(sram + 0x8000);
  
  	memcpy_toio(sram + 0x8000, pm_enter_standby_start,
  		    pm_enter_standby_end - pm_enter_standby_start);
  
  	AD2D0SR = ~0;
  	AD2D1SR = ~0;
  	AD2D0ER = wakeup_src;
  	AD2D1ER = 0;
  	ASCR = ASCR;
  	ARSR = ARSR;
  
  	local_fiq_disable();
  	fn(pwrmode);
  	local_fiq_enable();
  
  	AD2D0ER = 0;
  	AD2D1ER = 0;
7b5dea123   Russell King   [ARM] pxa: Add PX...
128
  }
c4d1fb627   eric miao   [ARM] pxa: add pr...
129
130
131
132
133
134
135
136
137
138
139
  /*
   * NOTE:  currently, the OBM (OEM Boot Module) binary comes along with
   * PXA3xx development kits assumes that the resuming process continues
   * with the address stored within the first 4 bytes of SDRAM. The PSPR
   * register is used privately by BootROM and OBM, and _must_ be set to
   * 0x5c014000 for the moment.
   */
  static void pxa3xx_cpu_pm_suspend(void)
  {
  	volatile unsigned long *p = (volatile void *)0xc0000000;
  	unsigned long saved_data = *p;
a9503d218   Russell King   ARM: pm: pxa: mov...
140
141
  #ifndef CONFIG_IWMMXT
  	u64 acc0;
c4d1fb627   eric miao   [ARM] pxa: add pr...
142

a9503d218   Russell King   ARM: pm: pxa: mov...
143
144
  	asm volatile("mra %Q0, %R0, acc0" : "=r" (acc0));
  #endif
29cb3cd20   Russell King   ARM: pm: allow su...
145
  	extern int pxa3xx_finish_suspend(unsigned long);
c4d1fb627   eric miao   [ARM] pxa: add pr...
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
  
  	/* resuming from D2 requires the HSIO2/BOOT/TPM clocks enabled */
  	CKENA |= (1 << CKEN_BOOT) | (1 << CKEN_TPM);
  	CKENB |= 1 << (CKEN_HSIO2 & 0x1f);
  
  	/* clear and setup wakeup source */
  	AD3SR = ~0;
  	AD3ER = wakeup_src;
  	ASCR = ASCR;
  	ARSR = ARSR;
  
  	PCFR |= (1u << 13);			/* L1_DIS */
  	PCFR &= ~((1u << 12) | (1u << 1));	/* L0_EN | SL_ROD */
  
  	PSPR = 0x5c014000;
  
  	/* overwrite with the resume address */
4f5ad99bb   Russell King   ARM: pm: convert ...
163
  	*p = virt_to_phys(cpu_resume);
c4d1fb627   eric miao   [ARM] pxa: add pr...
164

2c74a0cef   Russell King   ARM: pm: hide 1st...
165
  	cpu_suspend(0, pxa3xx_finish_suspend);
c4d1fb627   eric miao   [ARM] pxa: add pr...
166
167
168
169
  
  	*p = saved_data;
  
  	AD3ER = 0;
a9503d218   Russell King   ARM: pm: pxa: mov...
170
171
172
173
  
  #ifndef CONFIG_IWMMXT
  	asm volatile("mar acc0, %Q0, %R0" : "=r" (acc0));
  #endif
c4d1fb627   eric miao   [ARM] pxa: add pr...
174
  }
7b5dea123   Russell King   [ARM] pxa: Add PX...
175
176
177
178
179
  static void pxa3xx_cpu_pm_enter(suspend_state_t state)
  {
  	/*
  	 * Don't sleep if no wakeup sources are defined
  	 */
b86a5da8f   Mark Brown   [ARM] 4946/1: pxa...
180
181
182
  	if (wakeup_src == 0) {
  		printk(KERN_ERR "Not suspending: no wakeup sources
  ");
7b5dea123   Russell King   [ARM] pxa: Add PX...
183
  		return;
b86a5da8f   Mark Brown   [ARM] 4946/1: pxa...
184
  	}
7b5dea123   Russell King   [ARM] pxa: Add PX...
185
186
187
188
189
190
191
  
  	switch (state) {
  	case PM_SUSPEND_STANDBY:
  		pxa3xx_cpu_standby(PXA3xx_PM_S0D2C2);
  		break;
  
  	case PM_SUSPEND_MEM:
c4d1fb627   eric miao   [ARM] pxa: add pr...
192
  		pxa3xx_cpu_pm_suspend();
7b5dea123   Russell King   [ARM] pxa: Add PX...
193
194
195
196
197
198
199
200
201
202
  		break;
  	}
  }
  
  static int pxa3xx_cpu_pm_valid(suspend_state_t state)
  {
  	return state == PM_SUSPEND_MEM || state == PM_SUSPEND_STANDBY;
  }
  
  static struct pxa_cpu_pm_fns pxa3xx_cpu_pm_fns = {
7b5dea123   Russell King   [ARM] pxa: Add PX...
203
204
  	.valid		= pxa3xx_cpu_pm_valid,
  	.enter		= pxa3xx_cpu_pm_enter,
2c8086a5d   eric miao   [ARM] pxa: PXA3xx...
205
  };
7b5dea123   Russell King   [ARM] pxa: Add PX...
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
  static void __init pxa3xx_init_pm(void)
  {
  	sram = ioremap(ISRAM_START, ISRAM_SIZE);
  	if (!sram) {
  		printk(KERN_ERR "Unable to map ISRAM: disabling standby/suspend
  ");
  		return;
  	}
  
  	/*
  	 * Since we copy wakeup code into the SRAM, we need to ensure
  	 * that it is preserved over the low power modes.  Note: bit 8
  	 * is undocumented in the developer manual, but must be set.
  	 */
  	AD1R |= ADXR_L2 | ADXR_R0;
  	AD2R |= ADXR_L2 | ADXR_R0;
  	AD3R |= ADXR_L2 | ADXR_R0;
  
  	/*
  	 * Clear the resume enable registers.
  	 */
  	AD1D0ER = 0;
  	AD2D0ER = 0;
  	AD2D1ER = 0;
  	AD3ER = 0;
  
  	pxa_cpu_pm_fns = &pxa3xx_cpu_pm_fns;
  }
a3f4c927d   Lennert Buytenhek   ARM: PXA SoCs: ir...
234
  static int pxa3xx_set_wake(struct irq_data *d, unsigned int on)
7b5dea123   Russell King   [ARM] pxa: Add PX...
235
236
  {
  	unsigned long flags, mask = 0;
a3f4c927d   Lennert Buytenhek   ARM: PXA SoCs: ir...
237
  	switch (d->irq) {
7b5dea123   Russell King   [ARM] pxa: Add PX...
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
  	case IRQ_SSP3:
  		mask = ADXER_MFP_WSSP3;
  		break;
  	case IRQ_MSL:
  		mask = ADXER_WMSL0;
  		break;
  	case IRQ_USBH2:
  	case IRQ_USBH1:
  		mask = ADXER_WUSBH;
  		break;
  	case IRQ_KEYPAD:
  		mask = ADXER_WKP;
  		break;
  	case IRQ_AC97:
  		mask = ADXER_MFP_WAC97;
  		break;
  	case IRQ_USIM:
  		mask = ADXER_WUSIM0;
  		break;
  	case IRQ_SSP2:
  		mask = ADXER_MFP_WSSP2;
  		break;
  	case IRQ_I2C:
  		mask = ADXER_MFP_WI2C;
  		break;
  	case IRQ_STUART:
  		mask = ADXER_MFP_WUART3;
  		break;
  	case IRQ_BTUART:
  		mask = ADXER_MFP_WUART2;
  		break;
  	case IRQ_FFUART:
  		mask = ADXER_MFP_WUART1;
  		break;
  	case IRQ_MMC:
  		mask = ADXER_MFP_WMMC1;
  		break;
  	case IRQ_SSP:
  		mask = ADXER_MFP_WSSP1;
  		break;
  	case IRQ_RTCAlrm:
  		mask = ADXER_WRTC;
  		break;
  	case IRQ_SSP4:
  		mask = ADXER_MFP_WSSP4;
  		break;
  	case IRQ_TSI:
  		mask = ADXER_WTSI;
  		break;
  	case IRQ_USIM2:
  		mask = ADXER_WUSIM1;
  		break;
  	case IRQ_MMC2:
  		mask = ADXER_MFP_WMMC2;
  		break;
  	case IRQ_NAND:
  		mask = ADXER_MFP_WFLASH;
  		break;
  	case IRQ_USB2:
  		mask = ADXER_WUSB2;
  		break;
  	case IRQ_WAKEUP0:
  		mask = ADXER_WEXTWAKE0;
  		break;
  	case IRQ_WAKEUP1:
  		mask = ADXER_WEXTWAKE1;
  		break;
  	case IRQ_MMC3:
  		mask = ADXER_MFP_GEN12;
  		break;
e12177073   Mark Brown   [ARM] 5017/1: pxa...
308
309
  	default:
  		return -EINVAL;
7b5dea123   Russell King   [ARM] pxa: Add PX...
310
311
312
313
314
315
316
317
318
319
320
  	}
  
  	local_irq_save(flags);
  	if (on)
  		wakeup_src |= mask;
  	else
  		wakeup_src &= ~mask;
  	local_irq_restore(flags);
  
  	return 0;
  }
7b5dea123   Russell King   [ARM] pxa: Add PX...
321
322
  #else
  static inline void pxa3xx_init_pm(void) {}
b9e25aced   eric miao   [ARM] pxa: merge ...
323
  #define pxa3xx_set_wake	NULL
7b5dea123   Russell King   [ARM] pxa: Add PX...
324
  #endif
a3f4c927d   Lennert Buytenhek   ARM: PXA SoCs: ir...
325
  static void pxa_ack_ext_wakeup(struct irq_data *d)
bf293aec1   Mike Rapoport   [ARM] pxa: add EX...
326
  {
a3f4c927d   Lennert Buytenhek   ARM: PXA SoCs: ir...
327
  	PECR |= PECR_IS(d->irq - IRQ_WAKEUP0);
bf293aec1   Mike Rapoport   [ARM] pxa: add EX...
328
  }
a3f4c927d   Lennert Buytenhek   ARM: PXA SoCs: ir...
329
  static void pxa_mask_ext_wakeup(struct irq_data *d)
bf293aec1   Mike Rapoport   [ARM] pxa: add EX...
330
  {
5d284e353   Eric Miao   ARM: pxa: avoid a...
331
  	pxa_mask_irq(d);
a3f4c927d   Lennert Buytenhek   ARM: PXA SoCs: ir...
332
  	PECR &= ~PECR_IE(d->irq - IRQ_WAKEUP0);
bf293aec1   Mike Rapoport   [ARM] pxa: add EX...
333
  }
a3f4c927d   Lennert Buytenhek   ARM: PXA SoCs: ir...
334
  static void pxa_unmask_ext_wakeup(struct irq_data *d)
bf293aec1   Mike Rapoport   [ARM] pxa: add EX...
335
  {
5d284e353   Eric Miao   ARM: pxa: avoid a...
336
  	pxa_unmask_irq(d);
a3f4c927d   Lennert Buytenhek   ARM: PXA SoCs: ir...
337
  	PECR |= PECR_IE(d->irq - IRQ_WAKEUP0);
bf293aec1   Mike Rapoport   [ARM] pxa: add EX...
338
  }
a3f4c927d   Lennert Buytenhek   ARM: PXA SoCs: ir...
339
  static int pxa_set_ext_wakeup_type(struct irq_data *d, unsigned int flow_type)
128820965   Igor Grinberg   [ARM] pxa: add se...
340
341
  {
  	if (flow_type & IRQ_TYPE_EDGE_RISING)
a3f4c927d   Lennert Buytenhek   ARM: PXA SoCs: ir...
342
  		PWER |= 1 << (d->irq - IRQ_WAKEUP0);
128820965   Igor Grinberg   [ARM] pxa: add se...
343
344
  
  	if (flow_type & IRQ_TYPE_EDGE_FALLING)
a3f4c927d   Lennert Buytenhek   ARM: PXA SoCs: ir...
345
  		PWER |= 1 << (d->irq - IRQ_WAKEUP0 + 2);
128820965   Igor Grinberg   [ARM] pxa: add se...
346
347
348
  
  	return 0;
  }
bf293aec1   Mike Rapoport   [ARM] pxa: add EX...
349
350
  static struct irq_chip pxa_ext_wakeup_chip = {
  	.name		= "WAKEUP",
a3f4c927d   Lennert Buytenhek   ARM: PXA SoCs: ir...
351
352
353
354
  	.irq_ack	= pxa_ack_ext_wakeup,
  	.irq_mask	= pxa_mask_ext_wakeup,
  	.irq_unmask	= pxa_unmask_ext_wakeup,
  	.irq_set_type	= pxa_set_ext_wakeup_type,
bf293aec1   Mike Rapoport   [ARM] pxa: add EX...
355
  };
157d2644c   Haojian Zhuang   ARM: pxa: change ...
356
357
  static void __init pxa_init_ext_wakeup_irq(int (*fn)(struct irq_data *,
  					   unsigned int))
bf293aec1   Mike Rapoport   [ARM] pxa: add EX...
358
359
360
361
  {
  	int irq;
  
  	for (irq = IRQ_WAKEUP0; irq <= IRQ_WAKEUP1; irq++) {
f38c02f3b   Thomas Gleixner   arm: Fold irq_set...
362
363
  		irq_set_chip_and_handler(irq, &pxa_ext_wakeup_chip,
  					 handle_edge_irq);
bf293aec1   Mike Rapoport   [ARM] pxa: add EX...
364
365
  		set_irq_flags(irq, IRQF_VALID);
  	}
a3f4c927d   Lennert Buytenhek   ARM: PXA SoCs: ir...
366
  	pxa_ext_wakeup_chip.irq_set_wake = fn;
bf293aec1   Mike Rapoport   [ARM] pxa: add EX...
367
  }
2c8086a5d   eric miao   [ARM] pxa: PXA3xx...
368
369
370
371
372
373
374
375
376
  void __init pxa3xx_init_irq(void)
  {
  	/* enable CP6 access */
  	u32 value;
  	__asm__ __volatile__("mrc p15, 0, %0, c15, c1, 0
  ": "=r"(value));
  	value |= (1 << 6);
  	__asm__ __volatile__("mcr p15, 0, %0, c15, c1, 0
  ": :"r"(value));
b9e25aced   eric miao   [ARM] pxa: merge ...
377
  	pxa_init_irq(56, pxa3xx_set_wake);
bf293aec1   Mike Rapoport   [ARM] pxa: add EX...
378
  	pxa_init_ext_wakeup_irq(pxa3xx_set_wake);
2c8086a5d   eric miao   [ARM] pxa: PXA3xx...
379
  }
851982c1b   Marek Vasut   ARM: pxa: Introdu...
380
381
  static struct map_desc pxa3xx_io_desc[] __initdata = {
  	{	/* Mem Ctl */
97b09da4e   Arnd Bergmann   ARM: pxa: use cor...
382
  		.virtual	= (unsigned long)SMEMC_VIRT,
ad68bb9f7   Marek Vasut   ARM: pxa: Access ...
383
  		.pfn		= __phys_to_pfn(PXA3XX_SMEMC_BASE),
851982c1b   Marek Vasut   ARM: pxa: Introdu...
384
385
386
387
388
389
390
391
392
393
394
  		.length		= 0x00200000,
  		.type		= MT_DEVICE
  	}
  };
  
  void __init pxa3xx_map_io(void)
  {
  	pxa_map_io();
  	iotable_init(ARRAY_AND_SIZE(pxa3xx_io_desc));
  	pxa3xx_get_clk_frequency_khz(1);
  }
2c8086a5d   eric miao   [ARM] pxa: PXA3xx...
395
396
397
  /*
   * device registration specific to PXA3xx.
   */
9ba63c4fa   Mike Rapoport   [ARM] 5201/1: PXA...
398
399
  void __init pxa3xx_set_i2c_power_info(struct i2c_pxa_platform_data *info)
  {
147582205   Eric Miao   [ARM] pxa: regist...
400
  	pxa_register_device(&pxa3xx_device_i2c_power, info);
9ba63c4fa   Mike Rapoport   [ARM] 5201/1: PXA...
401
  }
2c8086a5d   eric miao   [ARM] pxa: PXA3xx...
402
  static struct platform_device *devices[] __initdata = {
157d2644c   Haojian Zhuang   ARM: pxa: change ...
403
  	&pxa_device_gpio,
94c35a6b5   Robert Jarzmik   [ARM] pxa: add ud...
404
  	&pxa27x_device_udc,
09a5358d1   Eric Miao   [ARM] pxa: move p...
405
  	&pxa_device_pmu,
2c8086a5d   eric miao   [ARM] pxa: PXA3xx...
406
  	&pxa_device_i2s,
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
407
408
409
410
411
  	&pxa_device_asoc_ssp1,
  	&pxa_device_asoc_ssp2,
  	&pxa_device_asoc_ssp3,
  	&pxa_device_asoc_ssp4,
  	&pxa_device_asoc_platform,
724931465   Robert Jarzmik   [ARM] pxa: add re...
412
  	&sa1100_device_rtc,
2c8086a5d   eric miao   [ARM] pxa: PXA3xx...
413
  	&pxa_device_rtc,
d8e0db111   eric miao   [ARM] pxa: add ss...
414
415
416
417
  	&pxa27x_device_ssp1,
  	&pxa27x_device_ssp2,
  	&pxa27x_device_ssp3,
  	&pxa3xx_device_ssp4,
75540c1ac   eric miao   [ARM] pxa: Add PX...
418
419
  	&pxa27x_device_pwm0,
  	&pxa27x_device_pwm1,
2c8086a5d   eric miao   [ARM] pxa: PXA3xx...
420
421
422
423
  };
  
  static int __init pxa3xx_init(void)
  {
2eaa03b5b   Rafael J. Wysocki   ARM / PXA: Use st...
424
  	int ret = 0;
2c8086a5d   eric miao   [ARM] pxa: PXA3xx...
425
426
  
  	if (cpu_is_pxa3xx()) {
04fef228f   Eric Miao   [ARM] pxa: introd...
427
428
  
  		reset_status = ARSR;
86260f987   Dmitry Krivoschekov   [ARM] 4824/1: pxa...
429
430
431
432
433
434
435
  		/*
  		 * clear RDH bit every time after reset
  		 *
  		 * Note: the last 3 bits DxS are write-1-to-clear so carefully
  		 * preserve them here in case they will be referenced later
  		 */
  		ASCR &= ~(ASCR_RDH | ASCR_D1S | ASCR_D2S | ASCR_D3S);
0a0300dc8   Russell King   ARM: Consolidate ...
436
  		clkdev_add_table(pxa3xx_clkregs, ARRAY_SIZE(pxa3xx_clkregs));
2c8086a5d   eric miao   [ARM] pxa: PXA3xx...
437

fef1f99a0   Eric Miao   [ARM] pxa: allow ...
438
  		if ((ret = pxa_init_dma(IRQ_DMA, 32)))
2c8086a5d   eric miao   [ARM] pxa: PXA3xx...
439
  			return ret;
7b5dea123   Russell King   [ARM] pxa: Add PX...
440
  		pxa3xx_init_pm();
2eaa03b5b   Rafael J. Wysocki   ARM / PXA: Use st...
441
442
443
444
  		register_syscore_ops(&pxa_irq_syscore_ops);
  		register_syscore_ops(&pxa3xx_mfp_syscore_ops);
  		register_syscore_ops(&pxa_gpio_syscore_ops);
  		register_syscore_ops(&pxa3xx_clock_syscore_ops);
c01655049   eric miao   [ARM] pxa: introd...
445
446
  
  		ret = platform_add_devices(devices, ARRAY_SIZE(devices));
2c8086a5d   eric miao   [ARM] pxa: PXA3xx...
447
  	}
c01655049   eric miao   [ARM] pxa: introd...
448
449
  
  	return ret;
2c8086a5d   eric miao   [ARM] pxa: PXA3xx...
450
  }
1c104e0e4   Russell King   [ARM] pxa: initia...
451
  postcore_initcall(pxa3xx_init);