Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
setup-sh73a0.c
Go to the documentation of this file.
1 /*
2  * sh73a0 processor support
3  *
4  * Copyright (C) 2010 Takashi Yoshii
5  * Copyright (C) 2010 Magnus Damm
6  * Copyright (C) 2008 Yoshihiro Shimoda
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; version 2 of the License.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 #include <linux/kernel.h>
22 #include <linux/init.h>
23 #include <linux/interrupt.h>
24 #include <linux/irq.h>
25 #include <linux/platform_device.h>
26 #include <linux/delay.h>
27 #include <linux/input.h>
28 #include <linux/io.h>
29 #include <linux/serial_sci.h>
30 #include <linux/sh_dma.h>
31 #include <linux/sh_intc.h>
32 #include <linux/sh_timer.h>
33 #include <mach/dma-register.h>
34 #include <mach/hardware.h>
35 #include <mach/irqs.h>
36 #include <mach/sh73a0.h>
37 #include <mach/common.h>
38 #include <asm/mach-types.h>
39 #include <asm/mach/map.h>
40 #include <asm/mach/arch.h>
41 #include <asm/mach/time.h>
42 
43 static struct map_desc sh73a0_io_desc[] __initdata = {
44  /* create a 1:1 entity map for 0xe6xxxxxx
45  * used by CPGA, INTC and PFC.
46  */
47  {
48  .virtual = 0xe6000000,
49  .pfn = __phys_to_pfn(0xe6000000),
50  .length = 256 << 20,
51  .type = MT_DEVICE_NONSHARED
52  },
53 };
54 
56 {
57  iotable_init(sh73a0_io_desc, ARRAY_SIZE(sh73a0_io_desc));
58 }
59 
60 static struct plat_sci_port scif0_platform_data = {
61  .mapbase = 0xe6c40000,
62  .flags = UPF_BOOT_AUTOCONF,
63  .scscr = SCSCR_RE | SCSCR_TE,
64  .scbrr_algo_id = SCBRR_ALGO_4,
65  .type = PORT_SCIFA,
66  .irqs = { gic_spi(72), gic_spi(72),
67  gic_spi(72), gic_spi(72) },
68 };
69 
70 static struct platform_device scif0_device = {
71  .name = "sh-sci",
72  .id = 0,
73  .dev = {
74  .platform_data = &scif0_platform_data,
75  },
76 };
77 
78 static struct plat_sci_port scif1_platform_data = {
79  .mapbase = 0xe6c50000,
80  .flags = UPF_BOOT_AUTOCONF,
81  .scscr = SCSCR_RE | SCSCR_TE,
82  .scbrr_algo_id = SCBRR_ALGO_4,
83  .type = PORT_SCIFA,
84  .irqs = { gic_spi(73), gic_spi(73),
85  gic_spi(73), gic_spi(73) },
86 };
87 
88 static struct platform_device scif1_device = {
89  .name = "sh-sci",
90  .id = 1,
91  .dev = {
92  .platform_data = &scif1_platform_data,
93  },
94 };
95 
96 static struct plat_sci_port scif2_platform_data = {
97  .mapbase = 0xe6c60000,
98  .flags = UPF_BOOT_AUTOCONF,
99  .scscr = SCSCR_RE | SCSCR_TE,
100  .scbrr_algo_id = SCBRR_ALGO_4,
101  .type = PORT_SCIFA,
102  .irqs = { gic_spi(74), gic_spi(74),
103  gic_spi(74), gic_spi(74) },
104 };
105 
106 static struct platform_device scif2_device = {
107  .name = "sh-sci",
108  .id = 2,
109  .dev = {
110  .platform_data = &scif2_platform_data,
111  },
112 };
113 
114 static struct plat_sci_port scif3_platform_data = {
115  .mapbase = 0xe6c70000,
116  .flags = UPF_BOOT_AUTOCONF,
117  .scscr = SCSCR_RE | SCSCR_TE,
118  .scbrr_algo_id = SCBRR_ALGO_4,
119  .type = PORT_SCIFA,
120  .irqs = { gic_spi(75), gic_spi(75),
121  gic_spi(75), gic_spi(75) },
122 };
123 
124 static struct platform_device scif3_device = {
125  .name = "sh-sci",
126  .id = 3,
127  .dev = {
128  .platform_data = &scif3_platform_data,
129  },
130 };
131 
132 static struct plat_sci_port scif4_platform_data = {
133  .mapbase = 0xe6c80000,
134  .flags = UPF_BOOT_AUTOCONF,
135  .scscr = SCSCR_RE | SCSCR_TE,
136  .scbrr_algo_id = SCBRR_ALGO_4,
137  .type = PORT_SCIFA,
138  .irqs = { gic_spi(78), gic_spi(78),
139  gic_spi(78), gic_spi(78) },
140 };
141 
142 static struct platform_device scif4_device = {
143  .name = "sh-sci",
144  .id = 4,
145  .dev = {
146  .platform_data = &scif4_platform_data,
147  },
148 };
149 
150 static struct plat_sci_port scif5_platform_data = {
151  .mapbase = 0xe6cb0000,
152  .flags = UPF_BOOT_AUTOCONF,
153  .scscr = SCSCR_RE | SCSCR_TE,
154  .scbrr_algo_id = SCBRR_ALGO_4,
155  .type = PORT_SCIFA,
156  .irqs = { gic_spi(79), gic_spi(79),
157  gic_spi(79), gic_spi(79) },
158 };
159 
160 static struct platform_device scif5_device = {
161  .name = "sh-sci",
162  .id = 5,
163  .dev = {
164  .platform_data = &scif5_platform_data,
165  },
166 };
167 
168 static struct plat_sci_port scif6_platform_data = {
169  .mapbase = 0xe6cc0000,
170  .flags = UPF_BOOT_AUTOCONF,
171  .scscr = SCSCR_RE | SCSCR_TE,
172  .scbrr_algo_id = SCBRR_ALGO_4,
173  .type = PORT_SCIFA,
174  .irqs = { gic_spi(156), gic_spi(156),
175  gic_spi(156), gic_spi(156) },
176 };
177 
178 static struct platform_device scif6_device = {
179  .name = "sh-sci",
180  .id = 6,
181  .dev = {
182  .platform_data = &scif6_platform_data,
183  },
184 };
185 
186 static struct plat_sci_port scif7_platform_data = {
187  .mapbase = 0xe6cd0000,
188  .flags = UPF_BOOT_AUTOCONF,
189  .scscr = SCSCR_RE | SCSCR_TE,
190  .scbrr_algo_id = SCBRR_ALGO_4,
191  .type = PORT_SCIFA,
192  .irqs = { gic_spi(143), gic_spi(143),
193  gic_spi(143), gic_spi(143) },
194 };
195 
196 static struct platform_device scif7_device = {
197  .name = "sh-sci",
198  .id = 7,
199  .dev = {
200  .platform_data = &scif7_platform_data,
201  },
202 };
203 
204 static struct plat_sci_port scif8_platform_data = {
205  .mapbase = 0xe6c30000,
206  .flags = UPF_BOOT_AUTOCONF,
207  .scscr = SCSCR_RE | SCSCR_TE,
208  .scbrr_algo_id = SCBRR_ALGO_4,
209  .type = PORT_SCIFB,
210  .irqs = { gic_spi(80), gic_spi(80),
211  gic_spi(80), gic_spi(80) },
212 };
213 
214 static struct platform_device scif8_device = {
215  .name = "sh-sci",
216  .id = 8,
217  .dev = {
218  .platform_data = &scif8_platform_data,
219  },
220 };
221 
222 static struct sh_timer_config cmt10_platform_data = {
223  .name = "CMT10",
224  .channel_offset = 0x10,
225  .timer_bit = 0,
226  .clockevent_rating = 125,
227  .clocksource_rating = 125,
228 };
229 
230 static struct resource cmt10_resources[] = {
231  [0] = {
232  .name = "CMT10",
233  .start = 0xe6138010,
234  .end = 0xe613801b,
235  .flags = IORESOURCE_MEM,
236  },
237  [1] = {
238  .start = gic_spi(65),
239  .flags = IORESOURCE_IRQ,
240  },
241 };
242 
243 static struct platform_device cmt10_device = {
244  .name = "sh_cmt",
245  .id = 10,
246  .dev = {
247  .platform_data = &cmt10_platform_data,
248  },
249  .resource = cmt10_resources,
250  .num_resources = ARRAY_SIZE(cmt10_resources),
251 };
252 
253 /* TMU */
254 static struct sh_timer_config tmu00_platform_data = {
255  .name = "TMU00",
256  .channel_offset = 0x4,
257  .timer_bit = 0,
258  .clockevent_rating = 200,
259 };
260 
261 static struct resource tmu00_resources[] = {
262  [0] = {
263  .name = "TMU00",
264  .start = 0xfff60008,
265  .end = 0xfff60013,
266  .flags = IORESOURCE_MEM,
267  },
268  [1] = {
269  .start = intcs_evt2irq(0x0e80), /* TMU0_TUNI00 */
270  .flags = IORESOURCE_IRQ,
271  },
272 };
273 
274 static struct platform_device tmu00_device = {
275  .name = "sh_tmu",
276  .id = 0,
277  .dev = {
278  .platform_data = &tmu00_platform_data,
279  },
280  .resource = tmu00_resources,
281  .num_resources = ARRAY_SIZE(tmu00_resources),
282 };
283 
284 static struct sh_timer_config tmu01_platform_data = {
285  .name = "TMU01",
286  .channel_offset = 0x10,
287  .timer_bit = 1,
288  .clocksource_rating = 200,
289 };
290 
291 static struct resource tmu01_resources[] = {
292  [0] = {
293  .name = "TMU01",
294  .start = 0xfff60014,
295  .end = 0xfff6001f,
296  .flags = IORESOURCE_MEM,
297  },
298  [1] = {
299  .start = intcs_evt2irq(0x0ea0), /* TMU0_TUNI01 */
300  .flags = IORESOURCE_IRQ,
301  },
302 };
303 
304 static struct platform_device tmu01_device = {
305  .name = "sh_tmu",
306  .id = 1,
307  .dev = {
308  .platform_data = &tmu01_platform_data,
309  },
310  .resource = tmu01_resources,
311  .num_resources = ARRAY_SIZE(tmu01_resources),
312 };
313 
314 static struct resource i2c0_resources[] = {
315  [0] = {
316  .name = "IIC0",
317  .start = 0xe6820000,
318  .end = 0xe6820425 - 1,
319  .flags = IORESOURCE_MEM,
320  },
321  [1] = {
322  .start = gic_spi(167),
323  .end = gic_spi(170),
324  .flags = IORESOURCE_IRQ,
325  },
326 };
327 
328 static struct resource i2c1_resources[] = {
329  [0] = {
330  .name = "IIC1",
331  .start = 0xe6822000,
332  .end = 0xe6822425 - 1,
333  .flags = IORESOURCE_MEM,
334  },
335  [1] = {
336  .start = gic_spi(51),
337  .end = gic_spi(54),
338  .flags = IORESOURCE_IRQ,
339  },
340 };
341 
342 static struct resource i2c2_resources[] = {
343  [0] = {
344  .name = "IIC2",
345  .start = 0xe6824000,
346  .end = 0xe6824425 - 1,
347  .flags = IORESOURCE_MEM,
348  },
349  [1] = {
350  .start = gic_spi(171),
351  .end = gic_spi(174),
352  .flags = IORESOURCE_IRQ,
353  },
354 };
355 
356 static struct resource i2c3_resources[] = {
357  [0] = {
358  .name = "IIC3",
359  .start = 0xe6826000,
360  .end = 0xe6826425 - 1,
361  .flags = IORESOURCE_MEM,
362  },
363  [1] = {
364  .start = gic_spi(183),
365  .end = gic_spi(186),
366  .flags = IORESOURCE_IRQ,
367  },
368 };
369 
370 static struct resource i2c4_resources[] = {
371  [0] = {
372  .name = "IIC4",
373  .start = 0xe6828000,
374  .end = 0xe6828425 - 1,
375  .flags = IORESOURCE_MEM,
376  },
377  [1] = {
378  .start = gic_spi(187),
379  .end = gic_spi(190),
380  .flags = IORESOURCE_IRQ,
381  },
382 };
383 
384 static struct platform_device i2c0_device = {
385  .name = "i2c-sh_mobile",
386  .id = 0,
387  .resource = i2c0_resources,
388  .num_resources = ARRAY_SIZE(i2c0_resources),
389 };
390 
391 static struct platform_device i2c1_device = {
392  .name = "i2c-sh_mobile",
393  .id = 1,
394  .resource = i2c1_resources,
395  .num_resources = ARRAY_SIZE(i2c1_resources),
396 };
397 
398 static struct platform_device i2c2_device = {
399  .name = "i2c-sh_mobile",
400  .id = 2,
401  .resource = i2c2_resources,
402  .num_resources = ARRAY_SIZE(i2c2_resources),
403 };
404 
405 static struct platform_device i2c3_device = {
406  .name = "i2c-sh_mobile",
407  .id = 3,
408  .resource = i2c3_resources,
409  .num_resources = ARRAY_SIZE(i2c3_resources),
410 };
411 
412 static struct platform_device i2c4_device = {
413  .name = "i2c-sh_mobile",
414  .id = 4,
415  .resource = i2c4_resources,
416  .num_resources = ARRAY_SIZE(i2c4_resources),
417 };
418 
419 static const struct sh_dmae_slave_config sh73a0_dmae_slaves[] = {
420  {
421  .slave_id = SHDMA_SLAVE_SCIF0_TX,
422  .addr = 0xe6c40020,
423  .chcr = CHCR_TX(XMIT_SZ_8BIT),
424  .mid_rid = 0x21,
425  }, {
426  .slave_id = SHDMA_SLAVE_SCIF0_RX,
427  .addr = 0xe6c40024,
428  .chcr = CHCR_RX(XMIT_SZ_8BIT),
429  .mid_rid = 0x22,
430  }, {
431  .slave_id = SHDMA_SLAVE_SCIF1_TX,
432  .addr = 0xe6c50020,
433  .chcr = CHCR_TX(XMIT_SZ_8BIT),
434  .mid_rid = 0x25,
435  }, {
436  .slave_id = SHDMA_SLAVE_SCIF1_RX,
437  .addr = 0xe6c50024,
438  .chcr = CHCR_RX(XMIT_SZ_8BIT),
439  .mid_rid = 0x26,
440  }, {
441  .slave_id = SHDMA_SLAVE_SCIF2_TX,
442  .addr = 0xe6c60020,
443  .chcr = CHCR_TX(XMIT_SZ_8BIT),
444  .mid_rid = 0x29,
445  }, {
446  .slave_id = SHDMA_SLAVE_SCIF2_RX,
447  .addr = 0xe6c60024,
448  .chcr = CHCR_RX(XMIT_SZ_8BIT),
449  .mid_rid = 0x2a,
450  }, {
451  .slave_id = SHDMA_SLAVE_SCIF3_TX,
452  .addr = 0xe6c70020,
453  .chcr = CHCR_TX(XMIT_SZ_8BIT),
454  .mid_rid = 0x2d,
455  }, {
456  .slave_id = SHDMA_SLAVE_SCIF3_RX,
457  .addr = 0xe6c70024,
458  .chcr = CHCR_RX(XMIT_SZ_8BIT),
459  .mid_rid = 0x2e,
460  }, {
461  .slave_id = SHDMA_SLAVE_SCIF4_TX,
462  .addr = 0xe6c80020,
463  .chcr = CHCR_TX(XMIT_SZ_8BIT),
464  .mid_rid = 0x39,
465  }, {
466  .slave_id = SHDMA_SLAVE_SCIF4_RX,
467  .addr = 0xe6c80024,
468  .chcr = CHCR_RX(XMIT_SZ_8BIT),
469  .mid_rid = 0x3a,
470  }, {
471  .slave_id = SHDMA_SLAVE_SCIF5_TX,
472  .addr = 0xe6cb0020,
473  .chcr = CHCR_TX(XMIT_SZ_8BIT),
474  .mid_rid = 0x35,
475  }, {
476  .slave_id = SHDMA_SLAVE_SCIF5_RX,
477  .addr = 0xe6cb0024,
478  .chcr = CHCR_RX(XMIT_SZ_8BIT),
479  .mid_rid = 0x36,
480  }, {
481  .slave_id = SHDMA_SLAVE_SCIF6_TX,
482  .addr = 0xe6cc0020,
483  .chcr = CHCR_TX(XMIT_SZ_8BIT),
484  .mid_rid = 0x1d,
485  }, {
486  .slave_id = SHDMA_SLAVE_SCIF6_RX,
487  .addr = 0xe6cc0024,
488  .chcr = CHCR_RX(XMIT_SZ_8BIT),
489  .mid_rid = 0x1e,
490  }, {
491  .slave_id = SHDMA_SLAVE_SCIF7_TX,
492  .addr = 0xe6cd0020,
493  .chcr = CHCR_TX(XMIT_SZ_8BIT),
494  .mid_rid = 0x19,
495  }, {
496  .slave_id = SHDMA_SLAVE_SCIF7_RX,
497  .addr = 0xe6cd0024,
498  .chcr = CHCR_RX(XMIT_SZ_8BIT),
499  .mid_rid = 0x1a,
500  }, {
501  .slave_id = SHDMA_SLAVE_SCIF8_TX,
502  .addr = 0xe6c30040,
503  .chcr = CHCR_TX(XMIT_SZ_8BIT),
504  .mid_rid = 0x3d,
505  }, {
506  .slave_id = SHDMA_SLAVE_SCIF8_RX,
507  .addr = 0xe6c30060,
508  .chcr = CHCR_RX(XMIT_SZ_8BIT),
509  .mid_rid = 0x3e,
510  }, {
511  .slave_id = SHDMA_SLAVE_SDHI0_TX,
512  .addr = 0xee100030,
513  .chcr = CHCR_TX(XMIT_SZ_16BIT),
514  .mid_rid = 0xc1,
515  }, {
516  .slave_id = SHDMA_SLAVE_SDHI0_RX,
517  .addr = 0xee100030,
518  .chcr = CHCR_RX(XMIT_SZ_16BIT),
519  .mid_rid = 0xc2,
520  }, {
521  .slave_id = SHDMA_SLAVE_SDHI1_TX,
522  .addr = 0xee120030,
523  .chcr = CHCR_TX(XMIT_SZ_16BIT),
524  .mid_rid = 0xc9,
525  }, {
526  .slave_id = SHDMA_SLAVE_SDHI1_RX,
527  .addr = 0xee120030,
528  .chcr = CHCR_RX(XMIT_SZ_16BIT),
529  .mid_rid = 0xca,
530  }, {
531  .slave_id = SHDMA_SLAVE_SDHI2_TX,
532  .addr = 0xee140030,
533  .chcr = CHCR_TX(XMIT_SZ_16BIT),
534  .mid_rid = 0xcd,
535  }, {
536  .slave_id = SHDMA_SLAVE_SDHI2_RX,
537  .addr = 0xee140030,
538  .chcr = CHCR_RX(XMIT_SZ_16BIT),
539  .mid_rid = 0xce,
540  }, {
541  .slave_id = SHDMA_SLAVE_MMCIF_TX,
542  .addr = 0xe6bd0034,
543  .chcr = CHCR_TX(XMIT_SZ_32BIT),
544  .mid_rid = 0xd1,
545  }, {
546  .slave_id = SHDMA_SLAVE_MMCIF_RX,
547  .addr = 0xe6bd0034,
548  .chcr = CHCR_RX(XMIT_SZ_32BIT),
549  .mid_rid = 0xd2,
550  },
551 };
552 
553 #define DMAE_CHANNEL(_offset) \
554  { \
555  .offset = _offset - 0x20, \
556  .dmars = _offset - 0x20 + 0x40, \
557  }
558 
559 static const struct sh_dmae_channel sh73a0_dmae_channels[] = {
560  DMAE_CHANNEL(0x8000),
561  DMAE_CHANNEL(0x8080),
562  DMAE_CHANNEL(0x8100),
563  DMAE_CHANNEL(0x8180),
564  DMAE_CHANNEL(0x8200),
565  DMAE_CHANNEL(0x8280),
566  DMAE_CHANNEL(0x8300),
567  DMAE_CHANNEL(0x8380),
568  DMAE_CHANNEL(0x8400),
569  DMAE_CHANNEL(0x8480),
570  DMAE_CHANNEL(0x8500),
571  DMAE_CHANNEL(0x8580),
572  DMAE_CHANNEL(0x8600),
573  DMAE_CHANNEL(0x8680),
574  DMAE_CHANNEL(0x8700),
575  DMAE_CHANNEL(0x8780),
576  DMAE_CHANNEL(0x8800),
577  DMAE_CHANNEL(0x8880),
578  DMAE_CHANNEL(0x8900),
579  DMAE_CHANNEL(0x8980),
580 };
581 
582 static struct sh_dmae_pdata sh73a0_dmae_platform_data = {
583  .slave = sh73a0_dmae_slaves,
584  .slave_num = ARRAY_SIZE(sh73a0_dmae_slaves),
585  .channel = sh73a0_dmae_channels,
586  .channel_num = ARRAY_SIZE(sh73a0_dmae_channels),
587  .ts_low_shift = TS_LOW_SHIFT,
588  .ts_low_mask = TS_LOW_BIT << TS_LOW_SHIFT,
589  .ts_high_shift = TS_HI_SHIFT,
590  .ts_high_mask = TS_HI_BIT << TS_HI_SHIFT,
591  .ts_shift = dma_ts_shift,
592  .ts_shift_num = ARRAY_SIZE(dma_ts_shift),
593  .dmaor_init = DMAOR_DME,
594 };
595 
596 static struct resource sh73a0_dmae_resources[] = {
597  {
598  /* Registers including DMAOR and channels including DMARSx */
599  .start = 0xfe000020,
600  .end = 0xfe008a00 - 1,
601  .flags = IORESOURCE_MEM,
602  },
603  {
604  .name = "error_irq",
605  .start = gic_spi(129),
606  .end = gic_spi(129),
607  .flags = IORESOURCE_IRQ,
608  },
609  {
610  /* IRQ for channels 0-19 */
611  .start = gic_spi(109),
612  .end = gic_spi(128),
613  .flags = IORESOURCE_IRQ,
614  },
615 };
616 
617 static struct platform_device dma0_device = {
618  .name = "sh-dma-engine",
619  .id = 0,
620  .resource = sh73a0_dmae_resources,
621  .num_resources = ARRAY_SIZE(sh73a0_dmae_resources),
622  .dev = {
623  .platform_data = &sh73a0_dmae_platform_data,
624  },
625 };
626 
627 /* MPDMAC */
628 static const struct sh_dmae_slave_config sh73a0_mpdma_slaves[] = {
629  {
630  .slave_id = SHDMA_SLAVE_FSI2A_RX,
631  .addr = 0xec230020,
632  .chcr = CHCR_RX(XMIT_SZ_32BIT),
633  .mid_rid = 0xd6, /* CHECK ME */
634  }, {
635  .slave_id = SHDMA_SLAVE_FSI2A_TX,
636  .addr = 0xec230024,
637  .chcr = CHCR_TX(XMIT_SZ_32BIT),
638  .mid_rid = 0xd5, /* CHECK ME */
639  }, {
640  .slave_id = SHDMA_SLAVE_FSI2C_RX,
641  .addr = 0xec230060,
642  .chcr = CHCR_RX(XMIT_SZ_32BIT),
643  .mid_rid = 0xda, /* CHECK ME */
644  }, {
645  .slave_id = SHDMA_SLAVE_FSI2C_TX,
646  .addr = 0xec230064,
647  .chcr = CHCR_TX(XMIT_SZ_32BIT),
648  .mid_rid = 0xd9, /* CHECK ME */
649  }, {
650  .slave_id = SHDMA_SLAVE_FSI2B_RX,
651  .addr = 0xec240020,
652  .chcr = CHCR_RX(XMIT_SZ_32BIT),
653  .mid_rid = 0x8e, /* CHECK ME */
654  }, {
655  .slave_id = SHDMA_SLAVE_FSI2B_TX,
656  .addr = 0xec240024,
657  .chcr = CHCR_RX(XMIT_SZ_32BIT),
658  .mid_rid = 0x8d, /* CHECK ME */
659  }, {
660  .slave_id = SHDMA_SLAVE_FSI2D_RX,
661  .addr = 0xec240060,
662  .chcr = CHCR_RX(XMIT_SZ_32BIT),
663  .mid_rid = 0x9a, /* CHECK ME */
664  },
665 };
666 
667 #define MPDMA_CHANNEL(a, b, c) \
668 { \
669  .offset = a, \
670  .dmars = b, \
671  .dmars_bit = c, \
672  .chclr_offset = (0x220 - 0x20) + a \
673 }
674 
675 static const struct sh_dmae_channel sh73a0_mpdma_channels[] = {
676  MPDMA_CHANNEL(0x00, 0, 0),
677  MPDMA_CHANNEL(0x10, 0, 8),
678  MPDMA_CHANNEL(0x20, 4, 0),
679  MPDMA_CHANNEL(0x30, 4, 8),
680  MPDMA_CHANNEL(0x50, 8, 0),
681  MPDMA_CHANNEL(0x70, 8, 8),
682 };
683 
684 static struct sh_dmae_pdata sh73a0_mpdma_platform_data = {
685  .slave = sh73a0_mpdma_slaves,
686  .slave_num = ARRAY_SIZE(sh73a0_mpdma_slaves),
687  .channel = sh73a0_mpdma_channels,
688  .channel_num = ARRAY_SIZE(sh73a0_mpdma_channels),
689  .ts_low_shift = TS_LOW_SHIFT,
690  .ts_low_mask = TS_LOW_BIT << TS_LOW_SHIFT,
691  .ts_high_shift = TS_HI_SHIFT,
692  .ts_high_mask = TS_HI_BIT << TS_HI_SHIFT,
693  .ts_shift = dma_ts_shift,
694  .ts_shift_num = ARRAY_SIZE(dma_ts_shift),
695  .dmaor_init = DMAOR_DME,
696  .chclr_present = 1,
697 };
698 
699 /* Resource order important! */
700 static struct resource sh73a0_mpdma_resources[] = {
701  {
702  /* Channel registers and DMAOR */
703  .start = 0xec618020,
704  .end = 0xec61828f,
705  .flags = IORESOURCE_MEM,
706  },
707  {
708  /* DMARSx */
709  .start = 0xec619000,
710  .end = 0xec61900b,
711  .flags = IORESOURCE_MEM,
712  },
713  {
714  .name = "error_irq",
715  .start = gic_spi(181),
716  .end = gic_spi(181),
717  .flags = IORESOURCE_IRQ,
718  },
719  {
720  /* IRQ for channels 0-5 */
721  .start = gic_spi(175),
722  .end = gic_spi(180),
723  .flags = IORESOURCE_IRQ,
724  },
725 };
726 
727 static struct platform_device mpdma0_device = {
728  .name = "sh-dma-engine",
729  .id = 1,
730  .resource = sh73a0_mpdma_resources,
731  .num_resources = ARRAY_SIZE(sh73a0_mpdma_resources),
732  .dev = {
733  .platform_data = &sh73a0_mpdma_platform_data,
734  },
735 };
736 
737 static struct resource pmu_resources[] = {
738  [0] = {
739  .start = gic_spi(55),
740  .end = gic_spi(55),
741  .flags = IORESOURCE_IRQ,
742  },
743  [1] = {
744  .start = gic_spi(56),
745  .end = gic_spi(56),
746  .flags = IORESOURCE_IRQ,
747  },
748 };
749 
750 static struct platform_device pmu_device = {
751  .name = "arm-pmu",
752  .id = -1,
753  .num_resources = ARRAY_SIZE(pmu_resources),
754  .resource = pmu_resources,
755 };
756 
757 static struct platform_device *sh73a0_early_devices[] __initdata = {
758  &scif0_device,
759  &scif1_device,
760  &scif2_device,
761  &scif3_device,
762  &scif4_device,
763  &scif5_device,
764  &scif6_device,
765  &scif7_device,
766  &scif8_device,
767  &cmt10_device,
768  &tmu00_device,
769  &tmu01_device,
770 };
771 
772 static struct platform_device *sh73a0_late_devices[] __initdata = {
773  &i2c0_device,
774  &i2c1_device,
775  &i2c2_device,
776  &i2c3_device,
777  &i2c4_device,
778  &dma0_device,
779  &mpdma0_device,
780  &pmu_device,
781 };
782 
783 #define SRCR2 IOMEM(0xe61580b0)
784 
786 {
787  /* Clear software reset bit on SY-DMAC module */
788  __raw_writel(__raw_readl(SRCR2) & ~(1 << 18), SRCR2);
789 
790  platform_add_devices(sh73a0_early_devices,
791  ARRAY_SIZE(sh73a0_early_devices));
792  platform_add_devices(sh73a0_late_devices,
793  ARRAY_SIZE(sh73a0_late_devices));
794 }
795 
796 /* do nothing for !CONFIG_SMP or !CONFIG_HAVE_TWD */
798 
799 static void __init sh73a0_earlytimer_init(void)
800 {
804 }
805 
807 {
808  early_platform_add_devices(sh73a0_early_devices,
809  ARRAY_SIZE(sh73a0_early_devices));
810 
811  /* setup early console here as well */
813 
814  /* override timer setup with soc-specific code */
815  shmobile_timer.init = sh73a0_earlytimer_init;
816 }