setup-sh7377.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501
  1. /*
  2. * sh7377 processor support
  3. *
  4. * Copyright (C) 2010 Magnus Damm
  5. * Copyright (C) 2008 Yoshihiro Shimoda
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; version 2 of the License.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program; if not, write to the Free Software
  18. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  19. */
  20. #include <linux/kernel.h>
  21. #include <linux/init.h>
  22. #include <linux/interrupt.h>
  23. #include <linux/irq.h>
  24. #include <linux/platform_device.h>
  25. #include <linux/uio_driver.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_intc.h>
  31. #include <linux/sh_timer.h>
  32. #include <mach/hardware.h>
  33. #include <mach/common.h>
  34. #include <asm/mach/map.h>
  35. #include <asm/mach-types.h>
  36. #include <asm/mach/arch.h>
  37. #include <asm/mach/time.h>
  38. static struct map_desc sh7377_io_desc[] __initdata = {
  39. /* create a 1:1 entity map for 0xe6xxxxxx
  40. * used by CPGA, INTC and PFC.
  41. */
  42. {
  43. .virtual = 0xe6000000,
  44. .pfn = __phys_to_pfn(0xe6000000),
  45. .length = 256 << 20,
  46. .type = MT_DEVICE_NONSHARED
  47. },
  48. };
  49. void __init sh7377_map_io(void)
  50. {
  51. iotable_init(sh7377_io_desc, ARRAY_SIZE(sh7377_io_desc));
  52. }
  53. /* SCIFA0 */
  54. static struct plat_sci_port scif0_platform_data = {
  55. .mapbase = 0xe6c40000,
  56. .flags = UPF_BOOT_AUTOCONF,
  57. .scscr = SCSCR_RE | SCSCR_TE,
  58. .scbrr_algo_id = SCBRR_ALGO_4,
  59. .type = PORT_SCIFA,
  60. .irqs = { evt2irq(0xc00), evt2irq(0xc00),
  61. evt2irq(0xc00), evt2irq(0xc00) },
  62. };
  63. static struct platform_device scif0_device = {
  64. .name = "sh-sci",
  65. .id = 0,
  66. .dev = {
  67. .platform_data = &scif0_platform_data,
  68. },
  69. };
  70. /* SCIFA1 */
  71. static struct plat_sci_port scif1_platform_data = {
  72. .mapbase = 0xe6c50000,
  73. .flags = UPF_BOOT_AUTOCONF,
  74. .scscr = SCSCR_RE | SCSCR_TE,
  75. .scbrr_algo_id = SCBRR_ALGO_4,
  76. .type = PORT_SCIFA,
  77. .irqs = { evt2irq(0xc20), evt2irq(0xc20),
  78. evt2irq(0xc20), evt2irq(0xc20) },
  79. };
  80. static struct platform_device scif1_device = {
  81. .name = "sh-sci",
  82. .id = 1,
  83. .dev = {
  84. .platform_data = &scif1_platform_data,
  85. },
  86. };
  87. /* SCIFA2 */
  88. static struct plat_sci_port scif2_platform_data = {
  89. .mapbase = 0xe6c60000,
  90. .flags = UPF_BOOT_AUTOCONF,
  91. .scscr = SCSCR_RE | SCSCR_TE,
  92. .scbrr_algo_id = SCBRR_ALGO_4,
  93. .type = PORT_SCIFA,
  94. .irqs = { evt2irq(0xc40), evt2irq(0xc40),
  95. evt2irq(0xc40), evt2irq(0xc40) },
  96. };
  97. static struct platform_device scif2_device = {
  98. .name = "sh-sci",
  99. .id = 2,
  100. .dev = {
  101. .platform_data = &scif2_platform_data,
  102. },
  103. };
  104. /* SCIFA3 */
  105. static struct plat_sci_port scif3_platform_data = {
  106. .mapbase = 0xe6c70000,
  107. .flags = UPF_BOOT_AUTOCONF,
  108. .scscr = SCSCR_RE | SCSCR_TE,
  109. .scbrr_algo_id = SCBRR_ALGO_4,
  110. .type = PORT_SCIFA,
  111. .irqs = { evt2irq(0xc60), evt2irq(0xc60),
  112. evt2irq(0xc60), evt2irq(0xc60) },
  113. };
  114. static struct platform_device scif3_device = {
  115. .name = "sh-sci",
  116. .id = 3,
  117. .dev = {
  118. .platform_data = &scif3_platform_data,
  119. },
  120. };
  121. /* SCIFA4 */
  122. static struct plat_sci_port scif4_platform_data = {
  123. .mapbase = 0xe6c80000,
  124. .flags = UPF_BOOT_AUTOCONF,
  125. .scscr = SCSCR_RE | SCSCR_TE,
  126. .scbrr_algo_id = SCBRR_ALGO_4,
  127. .type = PORT_SCIFA,
  128. .irqs = { evt2irq(0xd20), evt2irq(0xd20),
  129. evt2irq(0xd20), evt2irq(0xd20) },
  130. };
  131. static struct platform_device scif4_device = {
  132. .name = "sh-sci",
  133. .id = 4,
  134. .dev = {
  135. .platform_data = &scif4_platform_data,
  136. },
  137. };
  138. /* SCIFA5 */
  139. static struct plat_sci_port scif5_platform_data = {
  140. .mapbase = 0xe6cb0000,
  141. .flags = UPF_BOOT_AUTOCONF,
  142. .scscr = SCSCR_RE | SCSCR_TE,
  143. .scbrr_algo_id = SCBRR_ALGO_4,
  144. .type = PORT_SCIFA,
  145. .irqs = { evt2irq(0xd40), evt2irq(0xd40),
  146. evt2irq(0xd40), evt2irq(0xd40) },
  147. };
  148. static struct platform_device scif5_device = {
  149. .name = "sh-sci",
  150. .id = 5,
  151. .dev = {
  152. .platform_data = &scif5_platform_data,
  153. },
  154. };
  155. /* SCIFA6 */
  156. static struct plat_sci_port scif6_platform_data = {
  157. .mapbase = 0xe6cc0000,
  158. .flags = UPF_BOOT_AUTOCONF,
  159. .scscr = SCSCR_RE | SCSCR_TE,
  160. .scbrr_algo_id = SCBRR_ALGO_4,
  161. .type = PORT_SCIFA,
  162. .irqs = { intcs_evt2irq(0x1a80), intcs_evt2irq(0x1a80),
  163. intcs_evt2irq(0x1a80), intcs_evt2irq(0x1a80) },
  164. };
  165. static struct platform_device scif6_device = {
  166. .name = "sh-sci",
  167. .id = 6,
  168. .dev = {
  169. .platform_data = &scif6_platform_data,
  170. },
  171. };
  172. /* SCIFB */
  173. static struct plat_sci_port scif7_platform_data = {
  174. .mapbase = 0xe6c30000,
  175. .flags = UPF_BOOT_AUTOCONF,
  176. .scscr = SCSCR_RE | SCSCR_TE,
  177. .scbrr_algo_id = SCBRR_ALGO_4,
  178. .type = PORT_SCIFB,
  179. .irqs = { evt2irq(0xd60), evt2irq(0xd60),
  180. evt2irq(0xd60), evt2irq(0xd60) },
  181. };
  182. static struct platform_device scif7_device = {
  183. .name = "sh-sci",
  184. .id = 7,
  185. .dev = {
  186. .platform_data = &scif7_platform_data,
  187. },
  188. };
  189. static struct sh_timer_config cmt10_platform_data = {
  190. .name = "CMT10",
  191. .channel_offset = 0x10,
  192. .timer_bit = 0,
  193. .clockevent_rating = 125,
  194. .clocksource_rating = 125,
  195. };
  196. static struct resource cmt10_resources[] = {
  197. [0] = {
  198. .name = "CMT10",
  199. .start = 0xe6138010,
  200. .end = 0xe613801b,
  201. .flags = IORESOURCE_MEM,
  202. },
  203. [1] = {
  204. .start = evt2irq(0xb00), /* CMT1_CMT10 */
  205. .flags = IORESOURCE_IRQ,
  206. },
  207. };
  208. static struct platform_device cmt10_device = {
  209. .name = "sh_cmt",
  210. .id = 10,
  211. .dev = {
  212. .platform_data = &cmt10_platform_data,
  213. },
  214. .resource = cmt10_resources,
  215. .num_resources = ARRAY_SIZE(cmt10_resources),
  216. };
  217. /* VPU */
  218. static struct uio_info vpu_platform_data = {
  219. .name = "VPU5HG",
  220. .version = "0",
  221. .irq = intcs_evt2irq(0x980),
  222. };
  223. static struct resource vpu_resources[] = {
  224. [0] = {
  225. .name = "VPU",
  226. .start = 0xfe900000,
  227. .end = 0xfe900157,
  228. .flags = IORESOURCE_MEM,
  229. },
  230. };
  231. static struct platform_device vpu_device = {
  232. .name = "uio_pdrv_genirq",
  233. .id = 0,
  234. .dev = {
  235. .platform_data = &vpu_platform_data,
  236. },
  237. .resource = vpu_resources,
  238. .num_resources = ARRAY_SIZE(vpu_resources),
  239. };
  240. /* VEU0 */
  241. static struct uio_info veu0_platform_data = {
  242. .name = "VEU0",
  243. .version = "0",
  244. .irq = intcs_evt2irq(0x700),
  245. };
  246. static struct resource veu0_resources[] = {
  247. [0] = {
  248. .name = "VEU0",
  249. .start = 0xfe920000,
  250. .end = 0xfe9200cb,
  251. .flags = IORESOURCE_MEM,
  252. },
  253. };
  254. static struct platform_device veu0_device = {
  255. .name = "uio_pdrv_genirq",
  256. .id = 1,
  257. .dev = {
  258. .platform_data = &veu0_platform_data,
  259. },
  260. .resource = veu0_resources,
  261. .num_resources = ARRAY_SIZE(veu0_resources),
  262. };
  263. /* VEU1 */
  264. static struct uio_info veu1_platform_data = {
  265. .name = "VEU1",
  266. .version = "0",
  267. .irq = intcs_evt2irq(0x720),
  268. };
  269. static struct resource veu1_resources[] = {
  270. [0] = {
  271. .name = "VEU1",
  272. .start = 0xfe924000,
  273. .end = 0xfe9240cb,
  274. .flags = IORESOURCE_MEM,
  275. },
  276. };
  277. static struct platform_device veu1_device = {
  278. .name = "uio_pdrv_genirq",
  279. .id = 2,
  280. .dev = {
  281. .platform_data = &veu1_platform_data,
  282. },
  283. .resource = veu1_resources,
  284. .num_resources = ARRAY_SIZE(veu1_resources),
  285. };
  286. /* VEU2 */
  287. static struct uio_info veu2_platform_data = {
  288. .name = "VEU2",
  289. .version = "0",
  290. .irq = intcs_evt2irq(0x740),
  291. };
  292. static struct resource veu2_resources[] = {
  293. [0] = {
  294. .name = "VEU2",
  295. .start = 0xfe928000,
  296. .end = 0xfe928307,
  297. .flags = IORESOURCE_MEM,
  298. },
  299. };
  300. static struct platform_device veu2_device = {
  301. .name = "uio_pdrv_genirq",
  302. .id = 3,
  303. .dev = {
  304. .platform_data = &veu2_platform_data,
  305. },
  306. .resource = veu2_resources,
  307. .num_resources = ARRAY_SIZE(veu2_resources),
  308. };
  309. /* VEU3 */
  310. static struct uio_info veu3_platform_data = {
  311. .name = "VEU3",
  312. .version = "0",
  313. .irq = intcs_evt2irq(0x760),
  314. };
  315. static struct resource veu3_resources[] = {
  316. [0] = {
  317. .name = "VEU3",
  318. .start = 0xfe92c000,
  319. .end = 0xfe92c307,
  320. .flags = IORESOURCE_MEM,
  321. },
  322. };
  323. static struct platform_device veu3_device = {
  324. .name = "uio_pdrv_genirq",
  325. .id = 4,
  326. .dev = {
  327. .platform_data = &veu3_platform_data,
  328. },
  329. .resource = veu3_resources,
  330. .num_resources = ARRAY_SIZE(veu3_resources),
  331. };
  332. /* JPU */
  333. static struct uio_info jpu_platform_data = {
  334. .name = "JPU",
  335. .version = "0",
  336. .irq = intcs_evt2irq(0x560),
  337. };
  338. static struct resource jpu_resources[] = {
  339. [0] = {
  340. .name = "JPU",
  341. .start = 0xfe980000,
  342. .end = 0xfe9902d3,
  343. .flags = IORESOURCE_MEM,
  344. },
  345. };
  346. static struct platform_device jpu_device = {
  347. .name = "uio_pdrv_genirq",
  348. .id = 5,
  349. .dev = {
  350. .platform_data = &jpu_platform_data,
  351. },
  352. .resource = jpu_resources,
  353. .num_resources = ARRAY_SIZE(jpu_resources),
  354. };
  355. /* SPU2DSP0 */
  356. static struct uio_info spu0_platform_data = {
  357. .name = "SPU2DSP0",
  358. .version = "0",
  359. .irq = evt2irq(0x1800),
  360. };
  361. static struct resource spu0_resources[] = {
  362. [0] = {
  363. .name = "SPU2DSP0",
  364. .start = 0xfe200000,
  365. .end = 0xfe2fffff,
  366. .flags = IORESOURCE_MEM,
  367. },
  368. };
  369. static struct platform_device spu0_device = {
  370. .name = "uio_pdrv_genirq",
  371. .id = 6,
  372. .dev = {
  373. .platform_data = &spu0_platform_data,
  374. },
  375. .resource = spu0_resources,
  376. .num_resources = ARRAY_SIZE(spu0_resources),
  377. };
  378. /* SPU2DSP1 */
  379. static struct uio_info spu1_platform_data = {
  380. .name = "SPU2DSP1",
  381. .version = "0",
  382. .irq = evt2irq(0x1820),
  383. };
  384. static struct resource spu1_resources[] = {
  385. [0] = {
  386. .name = "SPU2DSP1",
  387. .start = 0xfe300000,
  388. .end = 0xfe3fffff,
  389. .flags = IORESOURCE_MEM,
  390. },
  391. };
  392. static struct platform_device spu1_device = {
  393. .name = "uio_pdrv_genirq",
  394. .id = 7,
  395. .dev = {
  396. .platform_data = &spu1_platform_data,
  397. },
  398. .resource = spu1_resources,
  399. .num_resources = ARRAY_SIZE(spu1_resources),
  400. };
  401. static struct platform_device *sh7377_early_devices[] __initdata = {
  402. &scif0_device,
  403. &scif1_device,
  404. &scif2_device,
  405. &scif3_device,
  406. &scif4_device,
  407. &scif5_device,
  408. &scif6_device,
  409. &scif7_device,
  410. &cmt10_device,
  411. };
  412. static struct platform_device *sh7377_devices[] __initdata = {
  413. &vpu_device,
  414. &veu0_device,
  415. &veu1_device,
  416. &veu2_device,
  417. &veu3_device,
  418. &jpu_device,
  419. &spu0_device,
  420. &spu1_device,
  421. };
  422. void __init sh7377_add_standard_devices(void)
  423. {
  424. platform_add_devices(sh7377_early_devices,
  425. ARRAY_SIZE(sh7377_early_devices));
  426. platform_add_devices(sh7377_devices,
  427. ARRAY_SIZE(sh7377_devices));
  428. }
  429. static void __init sh7377_earlytimer_init(void)
  430. {
  431. sh7377_clock_init();
  432. shmobile_earlytimer_init();
  433. }
  434. #define SMSTPCR3 0xe615013c
  435. #define SMSTPCR3_CMT1 (1 << 29)
  436. void __init sh7377_add_early_devices(void)
  437. {
  438. /* enable clock to CMT1 */
  439. __raw_writel(__raw_readl(SMSTPCR3) & ~SMSTPCR3_CMT1, SMSTPCR3);
  440. early_platform_add_devices(sh7377_early_devices,
  441. ARRAY_SIZE(sh7377_early_devices));
  442. /* setup early console here as well */
  443. shmobile_setup_console();
  444. /* override timer setup with soc-specific code */
  445. shmobile_timer.init = sh7377_earlytimer_init;
  446. }