omap_hwmod_2430_data.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958
  1. /*
  2. * omap_hwmod_2430_data.c - hardware modules present on the OMAP2430 chips
  3. *
  4. * Copyright (C) 2009-2011 Nokia Corporation
  5. * Copyright (C) 2012 Texas Instruments, Inc.
  6. * Paul Walmsley
  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 version 2 as
  10. * published by the Free Software Foundation.
  11. *
  12. * XXX handle crossbar/shared link difference for L3?
  13. * XXX these should be marked initdata for multi-OMAP kernels
  14. */
  15. #include <plat/omap_hwmod.h>
  16. #include <mach/irqs.h>
  17. #include <plat/cpu.h>
  18. #include <plat/dma.h>
  19. #include <plat/serial.h>
  20. #include <plat/i2c.h>
  21. #include <plat/gpio.h>
  22. #include <plat/mcbsp.h>
  23. #include <plat/mcspi.h>
  24. #include <plat/dmtimer.h>
  25. #include <plat/mmc.h>
  26. #include <plat/l3_2xxx.h>
  27. #include "omap_hwmod_common_data.h"
  28. #include "prm-regbits-24xx.h"
  29. #include "cm-regbits-24xx.h"
  30. #include "wd_timer.h"
  31. /*
  32. * OMAP2430 hardware module integration data
  33. *
  34. * All of the data in this section should be autogeneratable from the
  35. * TI hardware database or other technical documentation. Data that
  36. * is driver-specific or driver-kernel integration-specific belongs
  37. * elsewhere.
  38. */
  39. /*
  40. * IP blocks
  41. */
  42. /* IVA2 (IVA2) */
  43. static struct omap_hwmod_rst_info omap2430_iva_resets[] = {
  44. { .name = "logic", .rst_shift = 0 },
  45. { .name = "mmu", .rst_shift = 1 },
  46. };
  47. static struct omap_hwmod omap2430_iva_hwmod = {
  48. .name = "iva",
  49. .class = &iva_hwmod_class,
  50. .clkdm_name = "dsp_clkdm",
  51. .rst_lines = omap2430_iva_resets,
  52. .rst_lines_cnt = ARRAY_SIZE(omap2430_iva_resets),
  53. .main_clk = "dsp_fck",
  54. };
  55. /* I2C common */
  56. static struct omap_hwmod_class_sysconfig i2c_sysc = {
  57. .rev_offs = 0x00,
  58. .sysc_offs = 0x20,
  59. .syss_offs = 0x10,
  60. .sysc_flags = (SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE |
  61. SYSS_HAS_RESET_STATUS),
  62. .sysc_fields = &omap_hwmod_sysc_type1,
  63. };
  64. static struct omap_hwmod_class i2c_class = {
  65. .name = "i2c",
  66. .sysc = &i2c_sysc,
  67. .rev = OMAP_I2C_IP_VERSION_1,
  68. .reset = &omap_i2c_reset,
  69. };
  70. static struct omap_i2c_dev_attr i2c_dev_attr = {
  71. .fifo_depth = 8, /* bytes */
  72. .flags = OMAP_I2C_FLAG_APPLY_ERRATA_I207 |
  73. OMAP_I2C_FLAG_BUS_SHIFT_2 |
  74. OMAP_I2C_FLAG_FORCE_19200_INT_CLK,
  75. };
  76. /* I2C1 */
  77. static struct omap_hwmod omap2430_i2c1_hwmod = {
  78. .name = "i2c1",
  79. .flags = HWMOD_16BIT_REG,
  80. .mpu_irqs = omap2_i2c1_mpu_irqs,
  81. .sdma_reqs = omap2_i2c1_sdma_reqs,
  82. .main_clk = "i2chs1_fck",
  83. .prcm = {
  84. .omap2 = {
  85. /*
  86. * NOTE: The CM_FCLKEN* and CM_ICLKEN* for
  87. * I2CHS IP's do not follow the usual pattern.
  88. * prcm_reg_id alone cannot be used to program
  89. * the iclk and fclk. Needs to be handled using
  90. * additional flags when clk handling is moved
  91. * to hwmod framework.
  92. */
  93. .module_offs = CORE_MOD,
  94. .prcm_reg_id = 1,
  95. .module_bit = OMAP2430_EN_I2CHS1_SHIFT,
  96. .idlest_reg_id = 1,
  97. .idlest_idle_bit = OMAP2430_ST_I2CHS1_SHIFT,
  98. },
  99. },
  100. .class = &i2c_class,
  101. .dev_attr = &i2c_dev_attr,
  102. };
  103. /* I2C2 */
  104. static struct omap_hwmod omap2430_i2c2_hwmod = {
  105. .name = "i2c2",
  106. .flags = HWMOD_16BIT_REG,
  107. .mpu_irqs = omap2_i2c2_mpu_irqs,
  108. .sdma_reqs = omap2_i2c2_sdma_reqs,
  109. .main_clk = "i2chs2_fck",
  110. .prcm = {
  111. .omap2 = {
  112. .module_offs = CORE_MOD,
  113. .prcm_reg_id = 1,
  114. .module_bit = OMAP2430_EN_I2CHS2_SHIFT,
  115. .idlest_reg_id = 1,
  116. .idlest_idle_bit = OMAP2430_ST_I2CHS2_SHIFT,
  117. },
  118. },
  119. .class = &i2c_class,
  120. .dev_attr = &i2c_dev_attr,
  121. };
  122. /* gpio5 */
  123. static struct omap_hwmod_irq_info omap243x_gpio5_irqs[] = {
  124. { .irq = 33 }, /* INT_24XX_GPIO_BANK5 */
  125. { .irq = -1 }
  126. };
  127. static struct omap_hwmod omap2430_gpio5_hwmod = {
  128. .name = "gpio5",
  129. .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
  130. .mpu_irqs = omap243x_gpio5_irqs,
  131. .main_clk = "gpio5_fck",
  132. .prcm = {
  133. .omap2 = {
  134. .prcm_reg_id = 2,
  135. .module_bit = OMAP2430_EN_GPIO5_SHIFT,
  136. .module_offs = CORE_MOD,
  137. .idlest_reg_id = 2,
  138. .idlest_idle_bit = OMAP2430_ST_GPIO5_SHIFT,
  139. },
  140. },
  141. .class = &omap2xxx_gpio_hwmod_class,
  142. .dev_attr = &omap2xxx_gpio_dev_attr,
  143. };
  144. /* dma attributes */
  145. static struct omap_dma_dev_attr dma_dev_attr = {
  146. .dev_caps = RESERVE_CHANNEL | DMA_LINKED_LCH | GLOBAL_PRIORITY |
  147. IS_CSSA_32 | IS_CDSA_32 | IS_RW_PRIORITY,
  148. .lch_count = 32,
  149. };
  150. static struct omap_hwmod omap2430_dma_system_hwmod = {
  151. .name = "dma",
  152. .class = &omap2xxx_dma_hwmod_class,
  153. .mpu_irqs = omap2_dma_system_irqs,
  154. .main_clk = "core_l3_ck",
  155. .dev_attr = &dma_dev_attr,
  156. .flags = HWMOD_NO_IDLEST,
  157. };
  158. /* mailbox */
  159. static struct omap_hwmod_irq_info omap2430_mailbox_irqs[] = {
  160. { .irq = 26 },
  161. { .irq = -1 }
  162. };
  163. static struct omap_hwmod omap2430_mailbox_hwmod = {
  164. .name = "mailbox",
  165. .class = &omap2xxx_mailbox_hwmod_class,
  166. .mpu_irqs = omap2430_mailbox_irqs,
  167. .main_clk = "mailboxes_ick",
  168. .prcm = {
  169. .omap2 = {
  170. .prcm_reg_id = 1,
  171. .module_bit = OMAP24XX_EN_MAILBOXES_SHIFT,
  172. .module_offs = CORE_MOD,
  173. .idlest_reg_id = 1,
  174. .idlest_idle_bit = OMAP24XX_ST_MAILBOXES_SHIFT,
  175. },
  176. },
  177. };
  178. /* mcspi3 */
  179. static struct omap_hwmod_irq_info omap2430_mcspi3_mpu_irqs[] = {
  180. { .irq = 91 },
  181. { .irq = -1 }
  182. };
  183. static struct omap_hwmod_dma_info omap2430_mcspi3_sdma_reqs[] = {
  184. { .name = "tx0", .dma_req = 15 }, /* DMA_SPI3_TX0 */
  185. { .name = "rx0", .dma_req = 16 }, /* DMA_SPI3_RX0 */
  186. { .name = "tx1", .dma_req = 23 }, /* DMA_SPI3_TX1 */
  187. { .name = "rx1", .dma_req = 24 }, /* DMA_SPI3_RX1 */
  188. { .dma_req = -1 }
  189. };
  190. static struct omap2_mcspi_dev_attr omap_mcspi3_dev_attr = {
  191. .num_chipselect = 2,
  192. };
  193. static struct omap_hwmod omap2430_mcspi3_hwmod = {
  194. .name = "mcspi3",
  195. .mpu_irqs = omap2430_mcspi3_mpu_irqs,
  196. .sdma_reqs = omap2430_mcspi3_sdma_reqs,
  197. .main_clk = "mcspi3_fck",
  198. .prcm = {
  199. .omap2 = {
  200. .module_offs = CORE_MOD,
  201. .prcm_reg_id = 2,
  202. .module_bit = OMAP2430_EN_MCSPI3_SHIFT,
  203. .idlest_reg_id = 2,
  204. .idlest_idle_bit = OMAP2430_ST_MCSPI3_SHIFT,
  205. },
  206. },
  207. .class = &omap2xxx_mcspi_class,
  208. .dev_attr = &omap_mcspi3_dev_attr,
  209. };
  210. /* usbhsotg */
  211. static struct omap_hwmod_class_sysconfig omap2430_usbhsotg_sysc = {
  212. .rev_offs = 0x0400,
  213. .sysc_offs = 0x0404,
  214. .syss_offs = 0x0408,
  215. .sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_MIDLEMODE|
  216. SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
  217. SYSC_HAS_AUTOIDLE),
  218. .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
  219. MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART),
  220. .sysc_fields = &omap_hwmod_sysc_type1,
  221. };
  222. static struct omap_hwmod_class usbotg_class = {
  223. .name = "usbotg",
  224. .sysc = &omap2430_usbhsotg_sysc,
  225. };
  226. /* usb_otg_hs */
  227. static struct omap_hwmod_irq_info omap2430_usbhsotg_mpu_irqs[] = {
  228. { .name = "mc", .irq = 92 },
  229. { .name = "dma", .irq = 93 },
  230. { .irq = -1 }
  231. };
  232. static struct omap_hwmod omap2430_usbhsotg_hwmod = {
  233. .name = "usb_otg_hs",
  234. .mpu_irqs = omap2430_usbhsotg_mpu_irqs,
  235. .main_clk = "usbhs_ick",
  236. .prcm = {
  237. .omap2 = {
  238. .prcm_reg_id = 1,
  239. .module_bit = OMAP2430_EN_USBHS_MASK,
  240. .module_offs = CORE_MOD,
  241. .idlest_reg_id = 1,
  242. .idlest_idle_bit = OMAP2430_ST_USBHS_SHIFT,
  243. },
  244. },
  245. .class = &usbotg_class,
  246. /*
  247. * Erratum ID: i479 idle_req / idle_ack mechanism potentially
  248. * broken when autoidle is enabled
  249. * workaround is to disable the autoidle bit at module level.
  250. */
  251. .flags = HWMOD_NO_OCP_AUTOIDLE | HWMOD_SWSUP_SIDLE
  252. | HWMOD_SWSUP_MSTANDBY,
  253. };
  254. /*
  255. * 'mcbsp' class
  256. * multi channel buffered serial port controller
  257. */
  258. static struct omap_hwmod_class_sysconfig omap2430_mcbsp_sysc = {
  259. .rev_offs = 0x007C,
  260. .sysc_offs = 0x008C,
  261. .sysc_flags = (SYSC_HAS_SOFTRESET),
  262. .sysc_fields = &omap_hwmod_sysc_type1,
  263. };
  264. static struct omap_hwmod_class omap2430_mcbsp_hwmod_class = {
  265. .name = "mcbsp",
  266. .sysc = &omap2430_mcbsp_sysc,
  267. .rev = MCBSP_CONFIG_TYPE2,
  268. };
  269. static struct omap_hwmod_opt_clk mcbsp_opt_clks[] = {
  270. { .role = "pad_fck", .clk = "mcbsp_clks" },
  271. { .role = "prcm_fck", .clk = "func_96m_ck" },
  272. };
  273. /* mcbsp1 */
  274. static struct omap_hwmod_irq_info omap2430_mcbsp1_irqs[] = {
  275. { .name = "tx", .irq = 59 },
  276. { .name = "rx", .irq = 60 },
  277. { .name = "ovr", .irq = 61 },
  278. { .name = "common", .irq = 64 },
  279. { .irq = -1 }
  280. };
  281. static struct omap_hwmod omap2430_mcbsp1_hwmod = {
  282. .name = "mcbsp1",
  283. .class = &omap2430_mcbsp_hwmod_class,
  284. .mpu_irqs = omap2430_mcbsp1_irqs,
  285. .sdma_reqs = omap2_mcbsp1_sdma_reqs,
  286. .main_clk = "mcbsp1_fck",
  287. .prcm = {
  288. .omap2 = {
  289. .prcm_reg_id = 1,
  290. .module_bit = OMAP24XX_EN_MCBSP1_SHIFT,
  291. .module_offs = CORE_MOD,
  292. .idlest_reg_id = 1,
  293. .idlest_idle_bit = OMAP24XX_ST_MCBSP1_SHIFT,
  294. },
  295. },
  296. .opt_clks = mcbsp_opt_clks,
  297. .opt_clks_cnt = ARRAY_SIZE(mcbsp_opt_clks),
  298. };
  299. /* mcbsp2 */
  300. static struct omap_hwmod_irq_info omap2430_mcbsp2_irqs[] = {
  301. { .name = "tx", .irq = 62 },
  302. { .name = "rx", .irq = 63 },
  303. { .name = "common", .irq = 16 },
  304. { .irq = -1 }
  305. };
  306. static struct omap_hwmod omap2430_mcbsp2_hwmod = {
  307. .name = "mcbsp2",
  308. .class = &omap2430_mcbsp_hwmod_class,
  309. .mpu_irqs = omap2430_mcbsp2_irqs,
  310. .sdma_reqs = omap2_mcbsp2_sdma_reqs,
  311. .main_clk = "mcbsp2_fck",
  312. .prcm = {
  313. .omap2 = {
  314. .prcm_reg_id = 1,
  315. .module_bit = OMAP24XX_EN_MCBSP2_SHIFT,
  316. .module_offs = CORE_MOD,
  317. .idlest_reg_id = 1,
  318. .idlest_idle_bit = OMAP24XX_ST_MCBSP2_SHIFT,
  319. },
  320. },
  321. .opt_clks = mcbsp_opt_clks,
  322. .opt_clks_cnt = ARRAY_SIZE(mcbsp_opt_clks),
  323. };
  324. /* mcbsp3 */
  325. static struct omap_hwmod_irq_info omap2430_mcbsp3_irqs[] = {
  326. { .name = "tx", .irq = 89 },
  327. { .name = "rx", .irq = 90 },
  328. { .name = "common", .irq = 17 },
  329. { .irq = -1 }
  330. };
  331. static struct omap_hwmod omap2430_mcbsp3_hwmod = {
  332. .name = "mcbsp3",
  333. .class = &omap2430_mcbsp_hwmod_class,
  334. .mpu_irqs = omap2430_mcbsp3_irqs,
  335. .sdma_reqs = omap2_mcbsp3_sdma_reqs,
  336. .main_clk = "mcbsp3_fck",
  337. .prcm = {
  338. .omap2 = {
  339. .prcm_reg_id = 1,
  340. .module_bit = OMAP2430_EN_MCBSP3_SHIFT,
  341. .module_offs = CORE_MOD,
  342. .idlest_reg_id = 2,
  343. .idlest_idle_bit = OMAP2430_ST_MCBSP3_SHIFT,
  344. },
  345. },
  346. .opt_clks = mcbsp_opt_clks,
  347. .opt_clks_cnt = ARRAY_SIZE(mcbsp_opt_clks),
  348. };
  349. /* mcbsp4 */
  350. static struct omap_hwmod_irq_info omap2430_mcbsp4_irqs[] = {
  351. { .name = "tx", .irq = 54 },
  352. { .name = "rx", .irq = 55 },
  353. { .name = "common", .irq = 18 },
  354. { .irq = -1 }
  355. };
  356. static struct omap_hwmod_dma_info omap2430_mcbsp4_sdma_chs[] = {
  357. { .name = "rx", .dma_req = 20 },
  358. { .name = "tx", .dma_req = 19 },
  359. { .dma_req = -1 }
  360. };
  361. static struct omap_hwmod omap2430_mcbsp4_hwmod = {
  362. .name = "mcbsp4",
  363. .class = &omap2430_mcbsp_hwmod_class,
  364. .mpu_irqs = omap2430_mcbsp4_irqs,
  365. .sdma_reqs = omap2430_mcbsp4_sdma_chs,
  366. .main_clk = "mcbsp4_fck",
  367. .prcm = {
  368. .omap2 = {
  369. .prcm_reg_id = 1,
  370. .module_bit = OMAP2430_EN_MCBSP4_SHIFT,
  371. .module_offs = CORE_MOD,
  372. .idlest_reg_id = 2,
  373. .idlest_idle_bit = OMAP2430_ST_MCBSP4_SHIFT,
  374. },
  375. },
  376. .opt_clks = mcbsp_opt_clks,
  377. .opt_clks_cnt = ARRAY_SIZE(mcbsp_opt_clks),
  378. };
  379. /* mcbsp5 */
  380. static struct omap_hwmod_irq_info omap2430_mcbsp5_irqs[] = {
  381. { .name = "tx", .irq = 81 },
  382. { .name = "rx", .irq = 82 },
  383. { .name = "common", .irq = 19 },
  384. { .irq = -1 }
  385. };
  386. static struct omap_hwmod_dma_info omap2430_mcbsp5_sdma_chs[] = {
  387. { .name = "rx", .dma_req = 22 },
  388. { .name = "tx", .dma_req = 21 },
  389. { .dma_req = -1 }
  390. };
  391. static struct omap_hwmod omap2430_mcbsp5_hwmod = {
  392. .name = "mcbsp5",
  393. .class = &omap2430_mcbsp_hwmod_class,
  394. .mpu_irqs = omap2430_mcbsp5_irqs,
  395. .sdma_reqs = omap2430_mcbsp5_sdma_chs,
  396. .main_clk = "mcbsp5_fck",
  397. .prcm = {
  398. .omap2 = {
  399. .prcm_reg_id = 1,
  400. .module_bit = OMAP2430_EN_MCBSP5_SHIFT,
  401. .module_offs = CORE_MOD,
  402. .idlest_reg_id = 2,
  403. .idlest_idle_bit = OMAP2430_ST_MCBSP5_SHIFT,
  404. },
  405. },
  406. .opt_clks = mcbsp_opt_clks,
  407. .opt_clks_cnt = ARRAY_SIZE(mcbsp_opt_clks),
  408. };
  409. /* MMC/SD/SDIO common */
  410. static struct omap_hwmod_class_sysconfig omap2430_mmc_sysc = {
  411. .rev_offs = 0x1fc,
  412. .sysc_offs = 0x10,
  413. .syss_offs = 0x14,
  414. .sysc_flags = (SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
  415. SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
  416. SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS),
  417. .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
  418. .sysc_fields = &omap_hwmod_sysc_type1,
  419. };
  420. static struct omap_hwmod_class omap2430_mmc_class = {
  421. .name = "mmc",
  422. .sysc = &omap2430_mmc_sysc,
  423. };
  424. /* MMC/SD/SDIO1 */
  425. static struct omap_hwmod_irq_info omap2430_mmc1_mpu_irqs[] = {
  426. { .irq = 83 },
  427. { .irq = -1 }
  428. };
  429. static struct omap_hwmod_dma_info omap2430_mmc1_sdma_reqs[] = {
  430. { .name = "tx", .dma_req = 61 }, /* DMA_MMC1_TX */
  431. { .name = "rx", .dma_req = 62 }, /* DMA_MMC1_RX */
  432. { .dma_req = -1 }
  433. };
  434. static struct omap_hwmod_opt_clk omap2430_mmc1_opt_clks[] = {
  435. { .role = "dbck", .clk = "mmchsdb1_fck" },
  436. };
  437. static struct omap_mmc_dev_attr mmc1_dev_attr = {
  438. .flags = OMAP_HSMMC_SUPPORTS_DUAL_VOLT,
  439. };
  440. static struct omap_hwmod omap2430_mmc1_hwmod = {
  441. .name = "mmc1",
  442. .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
  443. .mpu_irqs = omap2430_mmc1_mpu_irqs,
  444. .sdma_reqs = omap2430_mmc1_sdma_reqs,
  445. .opt_clks = omap2430_mmc1_opt_clks,
  446. .opt_clks_cnt = ARRAY_SIZE(omap2430_mmc1_opt_clks),
  447. .main_clk = "mmchs1_fck",
  448. .prcm = {
  449. .omap2 = {
  450. .module_offs = CORE_MOD,
  451. .prcm_reg_id = 2,
  452. .module_bit = OMAP2430_EN_MMCHS1_SHIFT,
  453. .idlest_reg_id = 2,
  454. .idlest_idle_bit = OMAP2430_ST_MMCHS1_SHIFT,
  455. },
  456. },
  457. .dev_attr = &mmc1_dev_attr,
  458. .class = &omap2430_mmc_class,
  459. };
  460. /* MMC/SD/SDIO2 */
  461. static struct omap_hwmod_irq_info omap2430_mmc2_mpu_irqs[] = {
  462. { .irq = 86 },
  463. { .irq = -1 }
  464. };
  465. static struct omap_hwmod_dma_info omap2430_mmc2_sdma_reqs[] = {
  466. { .name = "tx", .dma_req = 47 }, /* DMA_MMC2_TX */
  467. { .name = "rx", .dma_req = 48 }, /* DMA_MMC2_RX */
  468. { .dma_req = -1 }
  469. };
  470. static struct omap_hwmod_opt_clk omap2430_mmc2_opt_clks[] = {
  471. { .role = "dbck", .clk = "mmchsdb2_fck" },
  472. };
  473. static struct omap_hwmod omap2430_mmc2_hwmod = {
  474. .name = "mmc2",
  475. .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
  476. .mpu_irqs = omap2430_mmc2_mpu_irqs,
  477. .sdma_reqs = omap2430_mmc2_sdma_reqs,
  478. .opt_clks = omap2430_mmc2_opt_clks,
  479. .opt_clks_cnt = ARRAY_SIZE(omap2430_mmc2_opt_clks),
  480. .main_clk = "mmchs2_fck",
  481. .prcm = {
  482. .omap2 = {
  483. .module_offs = CORE_MOD,
  484. .prcm_reg_id = 2,
  485. .module_bit = OMAP2430_EN_MMCHS2_SHIFT,
  486. .idlest_reg_id = 2,
  487. .idlest_idle_bit = OMAP2430_ST_MMCHS2_SHIFT,
  488. },
  489. },
  490. .class = &omap2430_mmc_class,
  491. };
  492. /* HDQ1W/1-wire */
  493. static struct omap_hwmod omap2430_hdq1w_hwmod = {
  494. .name = "hdq1w",
  495. .mpu_irqs = omap2_hdq1w_mpu_irqs,
  496. .main_clk = "hdq_fck",
  497. .prcm = {
  498. .omap2 = {
  499. .module_offs = CORE_MOD,
  500. .prcm_reg_id = 1,
  501. .module_bit = OMAP24XX_EN_HDQ_SHIFT,
  502. .idlest_reg_id = 1,
  503. .idlest_idle_bit = OMAP24XX_ST_HDQ_SHIFT,
  504. },
  505. },
  506. .class = &omap2_hdq1w_class,
  507. };
  508. /*
  509. * interfaces
  510. */
  511. /* L3 -> L4_CORE interface */
  512. /* l3_core -> usbhsotg interface */
  513. static struct omap_hwmod_ocp_if omap2430_usbhsotg__l3 = {
  514. .master = &omap2430_usbhsotg_hwmod,
  515. .slave = &omap2xxx_l3_main_hwmod,
  516. .clk = "core_l3_ck",
  517. .user = OCP_USER_MPU,
  518. };
  519. /* L4 CORE -> I2C1 interface */
  520. static struct omap_hwmod_ocp_if omap2430_l4_core__i2c1 = {
  521. .master = &omap2xxx_l4_core_hwmod,
  522. .slave = &omap2430_i2c1_hwmod,
  523. .clk = "i2c1_ick",
  524. .addr = omap2_i2c1_addr_space,
  525. .user = OCP_USER_MPU | OCP_USER_SDMA,
  526. };
  527. /* L4 CORE -> I2C2 interface */
  528. static struct omap_hwmod_ocp_if omap2430_l4_core__i2c2 = {
  529. .master = &omap2xxx_l4_core_hwmod,
  530. .slave = &omap2430_i2c2_hwmod,
  531. .clk = "i2c2_ick",
  532. .addr = omap2_i2c2_addr_space,
  533. .user = OCP_USER_MPU | OCP_USER_SDMA,
  534. };
  535. static struct omap_hwmod_addr_space omap2430_usbhsotg_addrs[] = {
  536. {
  537. .pa_start = OMAP243X_HS_BASE,
  538. .pa_end = OMAP243X_HS_BASE + SZ_4K - 1,
  539. .flags = ADDR_TYPE_RT
  540. },
  541. { }
  542. };
  543. /* l4_core ->usbhsotg interface */
  544. static struct omap_hwmod_ocp_if omap2430_l4_core__usbhsotg = {
  545. .master = &omap2xxx_l4_core_hwmod,
  546. .slave = &omap2430_usbhsotg_hwmod,
  547. .clk = "usb_l4_ick",
  548. .addr = omap2430_usbhsotg_addrs,
  549. .user = OCP_USER_MPU,
  550. };
  551. /* L4 CORE -> MMC1 interface */
  552. static struct omap_hwmod_ocp_if omap2430_l4_core__mmc1 = {
  553. .master = &omap2xxx_l4_core_hwmod,
  554. .slave = &omap2430_mmc1_hwmod,
  555. .clk = "mmchs1_ick",
  556. .addr = omap2430_mmc1_addr_space,
  557. .user = OCP_USER_MPU | OCP_USER_SDMA,
  558. };
  559. /* L4 CORE -> MMC2 interface */
  560. static struct omap_hwmod_ocp_if omap2430_l4_core__mmc2 = {
  561. .master = &omap2xxx_l4_core_hwmod,
  562. .slave = &omap2430_mmc2_hwmod,
  563. .clk = "mmchs2_ick",
  564. .addr = omap2430_mmc2_addr_space,
  565. .user = OCP_USER_MPU | OCP_USER_SDMA,
  566. };
  567. /* l4 core -> mcspi3 interface */
  568. static struct omap_hwmod_ocp_if omap2430_l4_core__mcspi3 = {
  569. .master = &omap2xxx_l4_core_hwmod,
  570. .slave = &omap2430_mcspi3_hwmod,
  571. .clk = "mcspi3_ick",
  572. .addr = omap2430_mcspi3_addr_space,
  573. .user = OCP_USER_MPU | OCP_USER_SDMA,
  574. };
  575. /* IVA2 <- L3 interface */
  576. static struct omap_hwmod_ocp_if omap2430_l3__iva = {
  577. .master = &omap2xxx_l3_main_hwmod,
  578. .slave = &omap2430_iva_hwmod,
  579. .clk = "core_l3_ck",
  580. .user = OCP_USER_MPU | OCP_USER_SDMA,
  581. };
  582. static struct omap_hwmod_addr_space omap2430_timer1_addrs[] = {
  583. {
  584. .pa_start = 0x49018000,
  585. .pa_end = 0x49018000 + SZ_1K - 1,
  586. .flags = ADDR_TYPE_RT
  587. },
  588. { }
  589. };
  590. /* l4_wkup -> timer1 */
  591. static struct omap_hwmod_ocp_if omap2430_l4_wkup__timer1 = {
  592. .master = &omap2xxx_l4_wkup_hwmod,
  593. .slave = &omap2xxx_timer1_hwmod,
  594. .clk = "gpt1_ick",
  595. .addr = omap2430_timer1_addrs,
  596. .user = OCP_USER_MPU | OCP_USER_SDMA,
  597. };
  598. /* l4_wkup -> wd_timer2 */
  599. static struct omap_hwmod_addr_space omap2430_wd_timer2_addrs[] = {
  600. {
  601. .pa_start = 0x49016000,
  602. .pa_end = 0x4901607f,
  603. .flags = ADDR_TYPE_RT
  604. },
  605. { }
  606. };
  607. static struct omap_hwmod_ocp_if omap2430_l4_wkup__wd_timer2 = {
  608. .master = &omap2xxx_l4_wkup_hwmod,
  609. .slave = &omap2xxx_wd_timer2_hwmod,
  610. .clk = "mpu_wdt_ick",
  611. .addr = omap2430_wd_timer2_addrs,
  612. .user = OCP_USER_MPU | OCP_USER_SDMA,
  613. };
  614. /* l4_wkup -> gpio1 */
  615. static struct omap_hwmod_addr_space omap2430_gpio1_addr_space[] = {
  616. {
  617. .pa_start = 0x4900C000,
  618. .pa_end = 0x4900C1ff,
  619. .flags = ADDR_TYPE_RT
  620. },
  621. { }
  622. };
  623. static struct omap_hwmod_ocp_if omap2430_l4_wkup__gpio1 = {
  624. .master = &omap2xxx_l4_wkup_hwmod,
  625. .slave = &omap2xxx_gpio1_hwmod,
  626. .clk = "gpios_ick",
  627. .addr = omap2430_gpio1_addr_space,
  628. .user = OCP_USER_MPU | OCP_USER_SDMA,
  629. };
  630. /* l4_wkup -> gpio2 */
  631. static struct omap_hwmod_addr_space omap2430_gpio2_addr_space[] = {
  632. {
  633. .pa_start = 0x4900E000,
  634. .pa_end = 0x4900E1ff,
  635. .flags = ADDR_TYPE_RT
  636. },
  637. { }
  638. };
  639. static struct omap_hwmod_ocp_if omap2430_l4_wkup__gpio2 = {
  640. .master = &omap2xxx_l4_wkup_hwmod,
  641. .slave = &omap2xxx_gpio2_hwmod,
  642. .clk = "gpios_ick",
  643. .addr = omap2430_gpio2_addr_space,
  644. .user = OCP_USER_MPU | OCP_USER_SDMA,
  645. };
  646. /* l4_wkup -> gpio3 */
  647. static struct omap_hwmod_addr_space omap2430_gpio3_addr_space[] = {
  648. {
  649. .pa_start = 0x49010000,
  650. .pa_end = 0x490101ff,
  651. .flags = ADDR_TYPE_RT
  652. },
  653. { }
  654. };
  655. static struct omap_hwmod_ocp_if omap2430_l4_wkup__gpio3 = {
  656. .master = &omap2xxx_l4_wkup_hwmod,
  657. .slave = &omap2xxx_gpio3_hwmod,
  658. .clk = "gpios_ick",
  659. .addr = omap2430_gpio3_addr_space,
  660. .user = OCP_USER_MPU | OCP_USER_SDMA,
  661. };
  662. /* l4_wkup -> gpio4 */
  663. static struct omap_hwmod_addr_space omap2430_gpio4_addr_space[] = {
  664. {
  665. .pa_start = 0x49012000,
  666. .pa_end = 0x490121ff,
  667. .flags = ADDR_TYPE_RT
  668. },
  669. { }
  670. };
  671. static struct omap_hwmod_ocp_if omap2430_l4_wkup__gpio4 = {
  672. .master = &omap2xxx_l4_wkup_hwmod,
  673. .slave = &omap2xxx_gpio4_hwmod,
  674. .clk = "gpios_ick",
  675. .addr = omap2430_gpio4_addr_space,
  676. .user = OCP_USER_MPU | OCP_USER_SDMA,
  677. };
  678. /* l4_core -> gpio5 */
  679. static struct omap_hwmod_addr_space omap2430_gpio5_addr_space[] = {
  680. {
  681. .pa_start = 0x480B6000,
  682. .pa_end = 0x480B61ff,
  683. .flags = ADDR_TYPE_RT
  684. },
  685. { }
  686. };
  687. static struct omap_hwmod_ocp_if omap2430_l4_core__gpio5 = {
  688. .master = &omap2xxx_l4_core_hwmod,
  689. .slave = &omap2430_gpio5_hwmod,
  690. .clk = "gpio5_ick",
  691. .addr = omap2430_gpio5_addr_space,
  692. .user = OCP_USER_MPU | OCP_USER_SDMA,
  693. };
  694. /* dma_system -> L3 */
  695. static struct omap_hwmod_ocp_if omap2430_dma_system__l3 = {
  696. .master = &omap2430_dma_system_hwmod,
  697. .slave = &omap2xxx_l3_main_hwmod,
  698. .clk = "core_l3_ck",
  699. .user = OCP_USER_MPU | OCP_USER_SDMA,
  700. };
  701. /* l4_core -> dma_system */
  702. static struct omap_hwmod_ocp_if omap2430_l4_core__dma_system = {
  703. .master = &omap2xxx_l4_core_hwmod,
  704. .slave = &omap2430_dma_system_hwmod,
  705. .clk = "sdma_ick",
  706. .addr = omap2_dma_system_addrs,
  707. .user = OCP_USER_MPU | OCP_USER_SDMA,
  708. };
  709. /* l4_core -> mailbox */
  710. static struct omap_hwmod_ocp_if omap2430_l4_core__mailbox = {
  711. .master = &omap2xxx_l4_core_hwmod,
  712. .slave = &omap2430_mailbox_hwmod,
  713. .addr = omap2_mailbox_addrs,
  714. .user = OCP_USER_MPU | OCP_USER_SDMA,
  715. };
  716. /* l4_core -> mcbsp1 */
  717. static struct omap_hwmod_ocp_if omap2430_l4_core__mcbsp1 = {
  718. .master = &omap2xxx_l4_core_hwmod,
  719. .slave = &omap2430_mcbsp1_hwmod,
  720. .clk = "mcbsp1_ick",
  721. .addr = omap2_mcbsp1_addrs,
  722. .user = OCP_USER_MPU | OCP_USER_SDMA,
  723. };
  724. /* l4_core -> mcbsp2 */
  725. static struct omap_hwmod_ocp_if omap2430_l4_core__mcbsp2 = {
  726. .master = &omap2xxx_l4_core_hwmod,
  727. .slave = &omap2430_mcbsp2_hwmod,
  728. .clk = "mcbsp2_ick",
  729. .addr = omap2xxx_mcbsp2_addrs,
  730. .user = OCP_USER_MPU | OCP_USER_SDMA,
  731. };
  732. static struct omap_hwmod_addr_space omap2430_mcbsp3_addrs[] = {
  733. {
  734. .name = "mpu",
  735. .pa_start = 0x4808C000,
  736. .pa_end = 0x4808C0ff,
  737. .flags = ADDR_TYPE_RT
  738. },
  739. { }
  740. };
  741. /* l4_core -> mcbsp3 */
  742. static struct omap_hwmod_ocp_if omap2430_l4_core__mcbsp3 = {
  743. .master = &omap2xxx_l4_core_hwmod,
  744. .slave = &omap2430_mcbsp3_hwmod,
  745. .clk = "mcbsp3_ick",
  746. .addr = omap2430_mcbsp3_addrs,
  747. .user = OCP_USER_MPU | OCP_USER_SDMA,
  748. };
  749. static struct omap_hwmod_addr_space omap2430_mcbsp4_addrs[] = {
  750. {
  751. .name = "mpu",
  752. .pa_start = 0x4808E000,
  753. .pa_end = 0x4808E0ff,
  754. .flags = ADDR_TYPE_RT
  755. },
  756. { }
  757. };
  758. /* l4_core -> mcbsp4 */
  759. static struct omap_hwmod_ocp_if omap2430_l4_core__mcbsp4 = {
  760. .master = &omap2xxx_l4_core_hwmod,
  761. .slave = &omap2430_mcbsp4_hwmod,
  762. .clk = "mcbsp4_ick",
  763. .addr = omap2430_mcbsp4_addrs,
  764. .user = OCP_USER_MPU | OCP_USER_SDMA,
  765. };
  766. static struct omap_hwmod_addr_space omap2430_mcbsp5_addrs[] = {
  767. {
  768. .name = "mpu",
  769. .pa_start = 0x48096000,
  770. .pa_end = 0x480960ff,
  771. .flags = ADDR_TYPE_RT
  772. },
  773. { }
  774. };
  775. /* l4_core -> mcbsp5 */
  776. static struct omap_hwmod_ocp_if omap2430_l4_core__mcbsp5 = {
  777. .master = &omap2xxx_l4_core_hwmod,
  778. .slave = &omap2430_mcbsp5_hwmod,
  779. .clk = "mcbsp5_ick",
  780. .addr = omap2430_mcbsp5_addrs,
  781. .user = OCP_USER_MPU | OCP_USER_SDMA,
  782. };
  783. /* l4_core -> hdq1w */
  784. static struct omap_hwmod_ocp_if omap2430_l4_core__hdq1w = {
  785. .master = &omap2xxx_l4_core_hwmod,
  786. .slave = &omap2430_hdq1w_hwmod,
  787. .clk = "hdq_ick",
  788. .addr = omap2_hdq1w_addr_space,
  789. .user = OCP_USER_MPU | OCP_USER_SDMA,
  790. .flags = OMAP_FIREWALL_L4 | OCPIF_SWSUP_IDLE,
  791. };
  792. /* l4_wkup -> 32ksync_counter */
  793. static struct omap_hwmod_addr_space omap2430_counter_32k_addrs[] = {
  794. {
  795. .pa_start = 0x49020000,
  796. .pa_end = 0x4902001f,
  797. .flags = ADDR_TYPE_RT
  798. },
  799. { }
  800. };
  801. static struct omap_hwmod_ocp_if omap2430_l4_wkup__counter_32k = {
  802. .master = &omap2xxx_l4_wkup_hwmod,
  803. .slave = &omap2xxx_counter_32k_hwmod,
  804. .clk = "sync_32k_ick",
  805. .addr = omap2430_counter_32k_addrs,
  806. .user = OCP_USER_MPU | OCP_USER_SDMA,
  807. };
  808. static struct omap_hwmod_ocp_if *omap2430_hwmod_ocp_ifs[] __initdata = {
  809. &omap2xxx_l3_main__l4_core,
  810. &omap2xxx_mpu__l3_main,
  811. &omap2xxx_dss__l3,
  812. &omap2430_usbhsotg__l3,
  813. &omap2430_l4_core__i2c1,
  814. &omap2430_l4_core__i2c2,
  815. &omap2xxx_l4_core__l4_wkup,
  816. &omap2_l4_core__uart1,
  817. &omap2_l4_core__uart2,
  818. &omap2_l4_core__uart3,
  819. &omap2430_l4_core__usbhsotg,
  820. &omap2430_l4_core__mmc1,
  821. &omap2430_l4_core__mmc2,
  822. &omap2xxx_l4_core__mcspi1,
  823. &omap2xxx_l4_core__mcspi2,
  824. &omap2430_l4_core__mcspi3,
  825. &omap2430_l3__iva,
  826. &omap2430_l4_wkup__timer1,
  827. &omap2xxx_l4_core__timer2,
  828. &omap2xxx_l4_core__timer3,
  829. &omap2xxx_l4_core__timer4,
  830. &omap2xxx_l4_core__timer5,
  831. &omap2xxx_l4_core__timer6,
  832. &omap2xxx_l4_core__timer7,
  833. &omap2xxx_l4_core__timer8,
  834. &omap2xxx_l4_core__timer9,
  835. &omap2xxx_l4_core__timer10,
  836. &omap2xxx_l4_core__timer11,
  837. &omap2xxx_l4_core__timer12,
  838. &omap2430_l4_wkup__wd_timer2,
  839. &omap2xxx_l4_core__dss,
  840. &omap2xxx_l4_core__dss_dispc,
  841. &omap2xxx_l4_core__dss_rfbi,
  842. &omap2xxx_l4_core__dss_venc,
  843. &omap2430_l4_wkup__gpio1,
  844. &omap2430_l4_wkup__gpio2,
  845. &omap2430_l4_wkup__gpio3,
  846. &omap2430_l4_wkup__gpio4,
  847. &omap2430_l4_core__gpio5,
  848. &omap2430_dma_system__l3,
  849. &omap2430_l4_core__dma_system,
  850. &omap2430_l4_core__mailbox,
  851. &omap2430_l4_core__mcbsp1,
  852. &omap2430_l4_core__mcbsp2,
  853. &omap2430_l4_core__mcbsp3,
  854. &omap2430_l4_core__mcbsp4,
  855. &omap2430_l4_core__mcbsp5,
  856. &omap2430_l4_core__hdq1w,
  857. &omap2430_l4_wkup__counter_32k,
  858. NULL,
  859. };
  860. int __init omap2430_hwmod_init(void)
  861. {
  862. omap_hwmod_init();
  863. return omap_hwmod_register_links(omap2430_hwmod_ocp_ifs);
  864. }