omap_hwmod_81xx_data.c 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459
  1. /*
  2. * DM81xx hwmod data.
  3. *
  4. * Copyright (C) 2010 Texas Instruments, Inc. - http://www.ti.com/
  5. * Copyright (C) 2013 SKTB SKiT, http://www.skitlab.ru/
  6. *
  7. * This program is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU General Public License as
  9. * published by the Free Software Foundation version 2.
  10. *
  11. * This program is distributed "as is" WITHOUT ANY WARRANTY of any
  12. * kind, whether express or implied; without even the implied warranty
  13. * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. */
  17. #include <linux/types.h>
  18. #include <linux/platform_data/hsmmc-omap.h>
  19. #include "omap_hwmod_common_data.h"
  20. #include "cm81xx.h"
  21. #include "ti81xx.h"
  22. #include "wd_timer.h"
  23. /*
  24. * DM816X hardware modules integration data
  25. *
  26. * Note: This is incomplete and at present, not generated from h/w database.
  27. */
  28. /*
  29. * Common alwon .clkctrl_offs from dm814x TRM "Table 2-278. CM_ALWON REGISTERS"
  30. * also dm816x TRM 18.7.17 CM_ALWON device register values minus 0x1400.
  31. */
  32. #define DM81XX_CM_ALWON_MCASP0_CLKCTRL 0x140
  33. #define DM81XX_CM_ALWON_MCASP1_CLKCTRL 0x144
  34. #define DM81XX_CM_ALWON_MCASP2_CLKCTRL 0x148
  35. #define DM81XX_CM_ALWON_MCBSP_CLKCTRL 0x14c
  36. #define DM81XX_CM_ALWON_UART_0_CLKCTRL 0x150
  37. #define DM81XX_CM_ALWON_UART_1_CLKCTRL 0x154
  38. #define DM81XX_CM_ALWON_UART_2_CLKCTRL 0x158
  39. #define DM81XX_CM_ALWON_GPIO_0_CLKCTRL 0x15c
  40. #define DM81XX_CM_ALWON_GPIO_1_CLKCTRL 0x160
  41. #define DM81XX_CM_ALWON_I2C_0_CLKCTRL 0x164
  42. #define DM81XX_CM_ALWON_I2C_1_CLKCTRL 0x168
  43. #define DM81XX_CM_ALWON_WDTIMER_CLKCTRL 0x18c
  44. #define DM81XX_CM_ALWON_SPI_CLKCTRL 0x190
  45. #define DM81XX_CM_ALWON_MAILBOX_CLKCTRL 0x194
  46. #define DM81XX_CM_ALWON_SPINBOX_CLKCTRL 0x198
  47. #define DM81XX_CM_ALWON_MMUDATA_CLKCTRL 0x19c
  48. #define DM81XX_CM_ALWON_MMUCFG_CLKCTRL 0x1a8
  49. #define DM81XX_CM_ALWON_CONTROL_CLKCTRL 0x1c4
  50. #define DM81XX_CM_ALWON_GPMC_CLKCTRL 0x1d0
  51. #define DM81XX_CM_ALWON_ETHERNET_0_CLKCTRL 0x1d4
  52. #define DM81XX_CM_ALWON_L3_CLKCTRL 0x1e4
  53. #define DM81XX_CM_ALWON_L4HS_CLKCTRL 0x1e8
  54. #define DM81XX_CM_ALWON_L4LS_CLKCTRL 0x1ec
  55. #define DM81XX_CM_ALWON_RTC_CLKCTRL 0x1f0
  56. #define DM81XX_CM_ALWON_TPCC_CLKCTRL 0x1f4
  57. #define DM81XX_CM_ALWON_TPTC0_CLKCTRL 0x1f8
  58. #define DM81XX_CM_ALWON_TPTC1_CLKCTRL 0x1fc
  59. #define DM81XX_CM_ALWON_TPTC2_CLKCTRL 0x200
  60. #define DM81XX_CM_ALWON_TPTC3_CLKCTRL 0x204
  61. /* Registers specific to dm814x */
  62. #define DM814X_CM_ALWON_MCASP_3_4_5_CLKCTRL 0x16c
  63. #define DM814X_CM_ALWON_ATL_CLKCTRL 0x170
  64. #define DM814X_CM_ALWON_MLB_CLKCTRL 0x174
  65. #define DM814X_CM_ALWON_PATA_CLKCTRL 0x178
  66. #define DM814X_CM_ALWON_UART_3_CLKCTRL 0x180
  67. #define DM814X_CM_ALWON_UART_4_CLKCTRL 0x184
  68. #define DM814X_CM_ALWON_UART_5_CLKCTRL 0x188
  69. #define DM814X_CM_ALWON_OCM_0_CLKCTRL 0x1b4
  70. #define DM814X_CM_ALWON_VCP_CLKCTRL 0x1b8
  71. #define DM814X_CM_ALWON_MPU_CLKCTRL 0x1dc
  72. #define DM814X_CM_ALWON_DEBUGSS_CLKCTRL 0x1e0
  73. #define DM814X_CM_ALWON_DCAN_0_1_CLKCTRL 0x218
  74. #define DM814X_CM_ALWON_MMCHS_0_CLKCTRL 0x21c
  75. #define DM814X_CM_ALWON_MMCHS_1_CLKCTRL 0x220
  76. #define DM814X_CM_ALWON_MMCHS_2_CLKCTRL 0x224
  77. #define DM814X_CM_ALWON_CUST_EFUSE_CLKCTRL 0x228
  78. /* Registers specific to dm816x */
  79. #define DM816X_DM_ALWON_BASE 0x1400
  80. #define DM816X_CM_ALWON_TIMER_1_CLKCTRL (0x1570 - DM816X_DM_ALWON_BASE)
  81. #define DM816X_CM_ALWON_TIMER_2_CLKCTRL (0x1574 - DM816X_DM_ALWON_BASE)
  82. #define DM816X_CM_ALWON_TIMER_3_CLKCTRL (0x1578 - DM816X_DM_ALWON_BASE)
  83. #define DM816X_CM_ALWON_TIMER_4_CLKCTRL (0x157c - DM816X_DM_ALWON_BASE)
  84. #define DM816X_CM_ALWON_TIMER_5_CLKCTRL (0x1580 - DM816X_DM_ALWON_BASE)
  85. #define DM816X_CM_ALWON_TIMER_6_CLKCTRL (0x1584 - DM816X_DM_ALWON_BASE)
  86. #define DM816X_CM_ALWON_TIMER_7_CLKCTRL (0x1588 - DM816X_DM_ALWON_BASE)
  87. #define DM816X_CM_ALWON_SDIO_CLKCTRL (0x15b0 - DM816X_DM_ALWON_BASE)
  88. #define DM816X_CM_ALWON_OCMC_0_CLKCTRL (0x15b4 - DM816X_DM_ALWON_BASE)
  89. #define DM816X_CM_ALWON_OCMC_1_CLKCTRL (0x15b8 - DM816X_DM_ALWON_BASE)
  90. #define DM816X_CM_ALWON_ETHERNET_1_CLKCTRL (0x15d8 - DM816X_DM_ALWON_BASE)
  91. #define DM816X_CM_ALWON_MPU_CLKCTRL (0x15dc - DM816X_DM_ALWON_BASE)
  92. #define DM816X_CM_ALWON_SR_0_CLKCTRL (0x1608 - DM816X_DM_ALWON_BASE)
  93. #define DM816X_CM_ALWON_SR_1_CLKCTRL (0x160c - DM816X_DM_ALWON_BASE)
  94. /*
  95. * The default .clkctrl_offs field is offset from CM_DEFAULT, that's
  96. * TRM 18.7.6 CM_DEFAULT device register values minus 0x500
  97. */
  98. #define DM81XX_CM_DEFAULT_OFFSET 0x500
  99. #define DM81XX_CM_DEFAULT_USB_CLKCTRL (0x558 - DM81XX_CM_DEFAULT_OFFSET)
  100. #define DM81XX_CM_DEFAULT_SATA_CLKCTRL (0x560 - DM81XX_CM_DEFAULT_OFFSET)
  101. /* L3 Interconnect entries clocked at 125, 250 and 500MHz */
  102. static struct omap_hwmod dm81xx_alwon_l3_slow_hwmod = {
  103. .name = "alwon_l3_slow",
  104. .clkdm_name = "alwon_l3s_clkdm",
  105. .class = &l3_hwmod_class,
  106. .flags = HWMOD_NO_IDLEST,
  107. };
  108. static struct omap_hwmod dm81xx_default_l3_slow_hwmod = {
  109. .name = "default_l3_slow",
  110. .clkdm_name = "default_l3_slow_clkdm",
  111. .class = &l3_hwmod_class,
  112. .flags = HWMOD_NO_IDLEST,
  113. };
  114. static struct omap_hwmod dm81xx_alwon_l3_med_hwmod = {
  115. .name = "l3_med",
  116. .clkdm_name = "alwon_l3_med_clkdm",
  117. .class = &l3_hwmod_class,
  118. .flags = HWMOD_NO_IDLEST,
  119. };
  120. static struct omap_hwmod dm81xx_alwon_l3_fast_hwmod = {
  121. .name = "l3_fast",
  122. .clkdm_name = "alwon_l3_fast_clkdm",
  123. .class = &l3_hwmod_class,
  124. .flags = HWMOD_NO_IDLEST,
  125. };
  126. /*
  127. * L4 standard peripherals, see TRM table 1-12 for devices using this.
  128. * See TRM table 1-73 for devices using the 125MHz SYSCLK6 clock.
  129. */
  130. static struct omap_hwmod dm81xx_l4_ls_hwmod = {
  131. .name = "l4_ls",
  132. .clkdm_name = "alwon_l3s_clkdm",
  133. .class = &l4_hwmod_class,
  134. .flags = HWMOD_NO_IDLEST,
  135. };
  136. /*
  137. * L4 high-speed peripherals. For devices using this, please see the TRM
  138. * table 1-13. On dm816x, only EMAC, MDIO and SATA use this. See also TRM
  139. * table 1-73 for devices using 250MHz SYSCLK5 clock.
  140. */
  141. static struct omap_hwmod dm81xx_l4_hs_hwmod = {
  142. .name = "l4_hs",
  143. .clkdm_name = "alwon_l3_med_clkdm",
  144. .class = &l4_hwmod_class,
  145. .flags = HWMOD_NO_IDLEST,
  146. };
  147. /* L3 slow -> L4 ls peripheral interface running at 125MHz */
  148. static struct omap_hwmod_ocp_if dm81xx_alwon_l3_slow__l4_ls = {
  149. .master = &dm81xx_alwon_l3_slow_hwmod,
  150. .slave = &dm81xx_l4_ls_hwmod,
  151. .user = OCP_USER_MPU,
  152. };
  153. /* L3 med -> L4 fast peripheral interface running at 250MHz */
  154. static struct omap_hwmod_ocp_if dm81xx_alwon_l3_slow__l4_hs = {
  155. .master = &dm81xx_alwon_l3_med_hwmod,
  156. .slave = &dm81xx_l4_hs_hwmod,
  157. .user = OCP_USER_MPU,
  158. };
  159. /* MPU */
  160. static struct omap_hwmod dm814x_mpu_hwmod = {
  161. .name = "mpu",
  162. .clkdm_name = "alwon_l3s_clkdm",
  163. .class = &mpu_hwmod_class,
  164. .flags = HWMOD_INIT_NO_IDLE,
  165. .main_clk = "mpu_ck",
  166. .prcm = {
  167. .omap4 = {
  168. .clkctrl_offs = DM814X_CM_ALWON_MPU_CLKCTRL,
  169. .modulemode = MODULEMODE_SWCTRL,
  170. },
  171. },
  172. };
  173. static struct omap_hwmod_ocp_if dm814x_mpu__alwon_l3_slow = {
  174. .master = &dm814x_mpu_hwmod,
  175. .slave = &dm81xx_alwon_l3_slow_hwmod,
  176. .user = OCP_USER_MPU,
  177. };
  178. /* L3 med peripheral interface running at 200MHz */
  179. static struct omap_hwmod_ocp_if dm814x_mpu__alwon_l3_med = {
  180. .master = &dm814x_mpu_hwmod,
  181. .slave = &dm81xx_alwon_l3_med_hwmod,
  182. .user = OCP_USER_MPU,
  183. };
  184. static struct omap_hwmod dm816x_mpu_hwmod = {
  185. .name = "mpu",
  186. .clkdm_name = "alwon_mpu_clkdm",
  187. .class = &mpu_hwmod_class,
  188. .flags = HWMOD_INIT_NO_IDLE,
  189. .main_clk = "mpu_ck",
  190. .prcm = {
  191. .omap4 = {
  192. .clkctrl_offs = DM816X_CM_ALWON_MPU_CLKCTRL,
  193. .modulemode = MODULEMODE_SWCTRL,
  194. },
  195. },
  196. };
  197. static struct omap_hwmod_ocp_if dm816x_mpu__alwon_l3_slow = {
  198. .master = &dm816x_mpu_hwmod,
  199. .slave = &dm81xx_alwon_l3_slow_hwmod,
  200. .user = OCP_USER_MPU,
  201. };
  202. /* L3 med peripheral interface running at 250MHz */
  203. static struct omap_hwmod_ocp_if dm816x_mpu__alwon_l3_med = {
  204. .master = &dm816x_mpu_hwmod,
  205. .slave = &dm81xx_alwon_l3_med_hwmod,
  206. .user = OCP_USER_MPU,
  207. };
  208. /* RTC */
  209. static struct omap_hwmod_class_sysconfig ti81xx_rtc_sysc = {
  210. .rev_offs = 0x74,
  211. .sysc_offs = 0x78,
  212. .sysc_flags = SYSC_HAS_SIDLEMODE,
  213. .idlemodes = SIDLE_FORCE | SIDLE_NO |
  214. SIDLE_SMART | SIDLE_SMART_WKUP,
  215. .sysc_fields = &omap_hwmod_sysc_type3,
  216. };
  217. static struct omap_hwmod_class ti81xx_rtc_hwmod_class = {
  218. .name = "rtc",
  219. .sysc = &ti81xx_rtc_sysc,
  220. };
  221. static struct omap_hwmod ti81xx_rtc_hwmod = {
  222. .name = "rtc",
  223. .class = &ti81xx_rtc_hwmod_class,
  224. .clkdm_name = "alwon_l3s_clkdm",
  225. .flags = HWMOD_NO_IDLEST,
  226. .main_clk = "sysclk18_ck",
  227. .prcm = {
  228. .omap4 = {
  229. .clkctrl_offs = DM81XX_CM_ALWON_RTC_CLKCTRL,
  230. .modulemode = MODULEMODE_SWCTRL,
  231. },
  232. },
  233. };
  234. static struct omap_hwmod_ocp_if ti81xx_l4_ls__rtc = {
  235. .master = &dm81xx_l4_ls_hwmod,
  236. .slave = &ti81xx_rtc_hwmod,
  237. .clk = "sysclk6_ck",
  238. .user = OCP_USER_MPU,
  239. };
  240. /* UART common */
  241. static struct omap_hwmod_class_sysconfig uart_sysc = {
  242. .rev_offs = 0x50,
  243. .sysc_offs = 0x54,
  244. .syss_offs = 0x58,
  245. .sysc_flags = SYSC_HAS_ENAWAKEUP | SYSC_HAS_SIDLEMODE |
  246. SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE |
  247. SYSS_HAS_RESET_STATUS,
  248. .idlemodes = SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
  249. MSTANDBY_SMART_WKUP,
  250. .sysc_fields = &omap_hwmod_sysc_type1,
  251. };
  252. static struct omap_hwmod_class uart_class = {
  253. .name = "uart",
  254. .sysc = &uart_sysc,
  255. };
  256. static struct omap_hwmod dm81xx_uart1_hwmod = {
  257. .name = "uart1",
  258. .clkdm_name = "alwon_l3s_clkdm",
  259. .main_clk = "sysclk10_ck",
  260. .prcm = {
  261. .omap4 = {
  262. .clkctrl_offs = DM81XX_CM_ALWON_UART_0_CLKCTRL,
  263. .modulemode = MODULEMODE_SWCTRL,
  264. },
  265. },
  266. .class = &uart_class,
  267. .flags = DEBUG_TI81XXUART1_FLAGS,
  268. };
  269. static struct omap_hwmod_ocp_if dm81xx_l4_ls__uart1 = {
  270. .master = &dm81xx_l4_ls_hwmod,
  271. .slave = &dm81xx_uart1_hwmod,
  272. .clk = "sysclk6_ck",
  273. .user = OCP_USER_MPU,
  274. };
  275. static struct omap_hwmod dm81xx_uart2_hwmod = {
  276. .name = "uart2",
  277. .clkdm_name = "alwon_l3s_clkdm",
  278. .main_clk = "sysclk10_ck",
  279. .prcm = {
  280. .omap4 = {
  281. .clkctrl_offs = DM81XX_CM_ALWON_UART_1_CLKCTRL,
  282. .modulemode = MODULEMODE_SWCTRL,
  283. },
  284. },
  285. .class = &uart_class,
  286. .flags = DEBUG_TI81XXUART2_FLAGS,
  287. };
  288. static struct omap_hwmod_ocp_if dm81xx_l4_ls__uart2 = {
  289. .master = &dm81xx_l4_ls_hwmod,
  290. .slave = &dm81xx_uart2_hwmod,
  291. .clk = "sysclk6_ck",
  292. .user = OCP_USER_MPU,
  293. };
  294. static struct omap_hwmod dm81xx_uart3_hwmod = {
  295. .name = "uart3",
  296. .clkdm_name = "alwon_l3s_clkdm",
  297. .main_clk = "sysclk10_ck",
  298. .prcm = {
  299. .omap4 = {
  300. .clkctrl_offs = DM81XX_CM_ALWON_UART_2_CLKCTRL,
  301. .modulemode = MODULEMODE_SWCTRL,
  302. },
  303. },
  304. .class = &uart_class,
  305. .flags = DEBUG_TI81XXUART3_FLAGS,
  306. };
  307. static struct omap_hwmod_ocp_if dm81xx_l4_ls__uart3 = {
  308. .master = &dm81xx_l4_ls_hwmod,
  309. .slave = &dm81xx_uart3_hwmod,
  310. .clk = "sysclk6_ck",
  311. .user = OCP_USER_MPU,
  312. };
  313. static struct omap_hwmod_class_sysconfig wd_timer_sysc = {
  314. .rev_offs = 0x0,
  315. .sysc_offs = 0x10,
  316. .syss_offs = 0x14,
  317. .sysc_flags = SYSC_HAS_EMUFREE | SYSC_HAS_SOFTRESET |
  318. SYSS_HAS_RESET_STATUS,
  319. .sysc_fields = &omap_hwmod_sysc_type1,
  320. };
  321. static struct omap_hwmod_class wd_timer_class = {
  322. .name = "wd_timer",
  323. .sysc = &wd_timer_sysc,
  324. .pre_shutdown = &omap2_wd_timer_disable,
  325. .reset = &omap2_wd_timer_reset,
  326. };
  327. static struct omap_hwmod dm81xx_wd_timer_hwmod = {
  328. .name = "wd_timer",
  329. .clkdm_name = "alwon_l3s_clkdm",
  330. .main_clk = "sysclk18_ck",
  331. .flags = HWMOD_NO_IDLEST,
  332. .prcm = {
  333. .omap4 = {
  334. .clkctrl_offs = DM81XX_CM_ALWON_WDTIMER_CLKCTRL,
  335. .modulemode = MODULEMODE_SWCTRL,
  336. },
  337. },
  338. .class = &wd_timer_class,
  339. };
  340. static struct omap_hwmod_ocp_if dm81xx_l4_ls__wd_timer1 = {
  341. .master = &dm81xx_l4_ls_hwmod,
  342. .slave = &dm81xx_wd_timer_hwmod,
  343. .clk = "sysclk6_ck",
  344. .user = OCP_USER_MPU,
  345. };
  346. /* I2C common */
  347. static struct omap_hwmod_class_sysconfig i2c_sysc = {
  348. .rev_offs = 0x0,
  349. .sysc_offs = 0x10,
  350. .syss_offs = 0x90,
  351. .sysc_flags = SYSC_HAS_SIDLEMODE |
  352. SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
  353. SYSC_HAS_AUTOIDLE,
  354. .idlemodes = SIDLE_FORCE | SIDLE_NO | SIDLE_SMART,
  355. .sysc_fields = &omap_hwmod_sysc_type1,
  356. };
  357. static struct omap_hwmod_class i2c_class = {
  358. .name = "i2c",
  359. .sysc = &i2c_sysc,
  360. };
  361. static struct omap_hwmod dm81xx_i2c1_hwmod = {
  362. .name = "i2c1",
  363. .clkdm_name = "alwon_l3s_clkdm",
  364. .main_clk = "sysclk10_ck",
  365. .prcm = {
  366. .omap4 = {
  367. .clkctrl_offs = DM81XX_CM_ALWON_I2C_0_CLKCTRL,
  368. .modulemode = MODULEMODE_SWCTRL,
  369. },
  370. },
  371. .class = &i2c_class,
  372. };
  373. static struct omap_hwmod_ocp_if dm81xx_l4_ls__i2c1 = {
  374. .master = &dm81xx_l4_ls_hwmod,
  375. .slave = &dm81xx_i2c1_hwmod,
  376. .clk = "sysclk6_ck",
  377. .user = OCP_USER_MPU,
  378. };
  379. static struct omap_hwmod dm81xx_i2c2_hwmod = {
  380. .name = "i2c2",
  381. .clkdm_name = "alwon_l3s_clkdm",
  382. .main_clk = "sysclk10_ck",
  383. .prcm = {
  384. .omap4 = {
  385. .clkctrl_offs = DM81XX_CM_ALWON_I2C_1_CLKCTRL,
  386. .modulemode = MODULEMODE_SWCTRL,
  387. },
  388. },
  389. .class = &i2c_class,
  390. };
  391. static struct omap_hwmod_class_sysconfig dm81xx_elm_sysc = {
  392. .rev_offs = 0x0000,
  393. .sysc_offs = 0x0010,
  394. .syss_offs = 0x0014,
  395. .sysc_flags = SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
  396. SYSC_HAS_SOFTRESET |
  397. SYSS_HAS_RESET_STATUS,
  398. .idlemodes = SIDLE_FORCE | SIDLE_NO | SIDLE_SMART,
  399. .sysc_fields = &omap_hwmod_sysc_type1,
  400. };
  401. static struct omap_hwmod_ocp_if dm81xx_l4_ls__i2c2 = {
  402. .master = &dm81xx_l4_ls_hwmod,
  403. .slave = &dm81xx_i2c2_hwmod,
  404. .clk = "sysclk6_ck",
  405. .user = OCP_USER_MPU,
  406. };
  407. static struct omap_hwmod_class dm81xx_elm_hwmod_class = {
  408. .name = "elm",
  409. .sysc = &dm81xx_elm_sysc,
  410. };
  411. static struct omap_hwmod dm81xx_elm_hwmod = {
  412. .name = "elm",
  413. .clkdm_name = "alwon_l3s_clkdm",
  414. .class = &dm81xx_elm_hwmod_class,
  415. .main_clk = "sysclk6_ck",
  416. };
  417. static struct omap_hwmod_ocp_if dm81xx_l4_ls__elm = {
  418. .master = &dm81xx_l4_ls_hwmod,
  419. .slave = &dm81xx_elm_hwmod,
  420. .clk = "sysclk6_ck",
  421. .user = OCP_USER_MPU,
  422. };
  423. static struct omap_hwmod_class_sysconfig dm81xx_gpio_sysc = {
  424. .rev_offs = 0x0000,
  425. .sysc_offs = 0x0010,
  426. .syss_offs = 0x0114,
  427. .sysc_flags = SYSC_HAS_AUTOIDLE | SYSC_HAS_ENAWAKEUP |
  428. SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET |
  429. SYSS_HAS_RESET_STATUS,
  430. .idlemodes = SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
  431. SIDLE_SMART_WKUP,
  432. .sysc_fields = &omap_hwmod_sysc_type1,
  433. };
  434. static struct omap_hwmod_class dm81xx_gpio_hwmod_class = {
  435. .name = "gpio",
  436. .sysc = &dm81xx_gpio_sysc,
  437. .rev = 2,
  438. };
  439. static struct omap_hwmod_opt_clk gpio1_opt_clks[] = {
  440. { .role = "dbclk", .clk = "sysclk18_ck" },
  441. };
  442. static struct omap_hwmod dm81xx_gpio1_hwmod = {
  443. .name = "gpio1",
  444. .clkdm_name = "alwon_l3s_clkdm",
  445. .class = &dm81xx_gpio_hwmod_class,
  446. .main_clk = "sysclk6_ck",
  447. .prcm = {
  448. .omap4 = {
  449. .clkctrl_offs = DM81XX_CM_ALWON_GPIO_0_CLKCTRL,
  450. .modulemode = MODULEMODE_SWCTRL,
  451. },
  452. },
  453. .opt_clks = gpio1_opt_clks,
  454. .opt_clks_cnt = ARRAY_SIZE(gpio1_opt_clks),
  455. };
  456. static struct omap_hwmod_ocp_if dm81xx_l4_ls__gpio1 = {
  457. .master = &dm81xx_l4_ls_hwmod,
  458. .slave = &dm81xx_gpio1_hwmod,
  459. .clk = "sysclk6_ck",
  460. .user = OCP_USER_MPU,
  461. };
  462. static struct omap_hwmod_opt_clk gpio2_opt_clks[] = {
  463. { .role = "dbclk", .clk = "sysclk18_ck" },
  464. };
  465. static struct omap_hwmod dm81xx_gpio2_hwmod = {
  466. .name = "gpio2",
  467. .clkdm_name = "alwon_l3s_clkdm",
  468. .class = &dm81xx_gpio_hwmod_class,
  469. .main_clk = "sysclk6_ck",
  470. .prcm = {
  471. .omap4 = {
  472. .clkctrl_offs = DM81XX_CM_ALWON_GPIO_1_CLKCTRL,
  473. .modulemode = MODULEMODE_SWCTRL,
  474. },
  475. },
  476. .opt_clks = gpio2_opt_clks,
  477. .opt_clks_cnt = ARRAY_SIZE(gpio2_opt_clks),
  478. };
  479. static struct omap_hwmod_ocp_if dm81xx_l4_ls__gpio2 = {
  480. .master = &dm81xx_l4_ls_hwmod,
  481. .slave = &dm81xx_gpio2_hwmod,
  482. .clk = "sysclk6_ck",
  483. .user = OCP_USER_MPU,
  484. };
  485. static struct omap_hwmod_class_sysconfig dm81xx_gpmc_sysc = {
  486. .rev_offs = 0x0,
  487. .sysc_offs = 0x10,
  488. .syss_offs = 0x14,
  489. .sysc_flags = SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET |
  490. SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS,
  491. .idlemodes = SIDLE_FORCE | SIDLE_NO | SIDLE_SMART,
  492. .sysc_fields = &omap_hwmod_sysc_type1,
  493. };
  494. static struct omap_hwmod_class dm81xx_gpmc_hwmod_class = {
  495. .name = "gpmc",
  496. .sysc = &dm81xx_gpmc_sysc,
  497. };
  498. static struct omap_hwmod dm81xx_gpmc_hwmod = {
  499. .name = "gpmc",
  500. .clkdm_name = "alwon_l3s_clkdm",
  501. .class = &dm81xx_gpmc_hwmod_class,
  502. .main_clk = "sysclk6_ck",
  503. /* Skip reset for CONFIG_OMAP_GPMC_DEBUG for bootloader timings */
  504. .flags = DEBUG_OMAP_GPMC_HWMOD_FLAGS,
  505. .prcm = {
  506. .omap4 = {
  507. .clkctrl_offs = DM81XX_CM_ALWON_GPMC_CLKCTRL,
  508. .modulemode = MODULEMODE_SWCTRL,
  509. },
  510. },
  511. };
  512. static struct omap_hwmod_ocp_if dm81xx_alwon_l3_slow__gpmc = {
  513. .master = &dm81xx_alwon_l3_slow_hwmod,
  514. .slave = &dm81xx_gpmc_hwmod,
  515. .user = OCP_USER_MPU,
  516. };
  517. /* USB needs udelay 1 after reset at least on hp t410, use 2 for margin */
  518. static struct omap_hwmod_class_sysconfig dm81xx_usbhsotg_sysc = {
  519. .rev_offs = 0x0,
  520. .sysc_offs = 0x10,
  521. .srst_udelay = 2,
  522. .sysc_flags = SYSC_HAS_SIDLEMODE | SYSC_HAS_MIDLEMODE |
  523. SYSC_HAS_SOFTRESET,
  524. .idlemodes = SIDLE_SMART | MSTANDBY_FORCE | MSTANDBY_SMART,
  525. .sysc_fields = &omap_hwmod_sysc_type2,
  526. };
  527. static struct omap_hwmod_class dm81xx_usbotg_class = {
  528. .name = "usbotg",
  529. .sysc = &dm81xx_usbhsotg_sysc,
  530. };
  531. static struct omap_hwmod dm814x_usbss_hwmod = {
  532. .name = "usb_otg_hs",
  533. .clkdm_name = "default_l3_slow_clkdm",
  534. .main_clk = "pll260dcoclkldo", /* 481c5260.adpll.dcoclkldo */
  535. .prcm = {
  536. .omap4 = {
  537. .clkctrl_offs = DM81XX_CM_DEFAULT_USB_CLKCTRL,
  538. .modulemode = MODULEMODE_SWCTRL,
  539. },
  540. },
  541. .class = &dm81xx_usbotg_class,
  542. };
  543. static struct omap_hwmod_ocp_if dm814x_default_l3_slow__usbss = {
  544. .master = &dm81xx_default_l3_slow_hwmod,
  545. .slave = &dm814x_usbss_hwmod,
  546. .clk = "sysclk6_ck",
  547. .user = OCP_USER_MPU,
  548. };
  549. static struct omap_hwmod dm816x_usbss_hwmod = {
  550. .name = "usb_otg_hs",
  551. .clkdm_name = "default_l3_slow_clkdm",
  552. .main_clk = "sysclk6_ck",
  553. .prcm = {
  554. .omap4 = {
  555. .clkctrl_offs = DM81XX_CM_DEFAULT_USB_CLKCTRL,
  556. .modulemode = MODULEMODE_SWCTRL,
  557. },
  558. },
  559. .class = &dm81xx_usbotg_class,
  560. };
  561. static struct omap_hwmod_ocp_if dm816x_default_l3_slow__usbss = {
  562. .master = &dm81xx_default_l3_slow_hwmod,
  563. .slave = &dm816x_usbss_hwmod,
  564. .clk = "sysclk6_ck",
  565. .user = OCP_USER_MPU,
  566. };
  567. static struct omap_hwmod_class_sysconfig dm816x_timer_sysc = {
  568. .rev_offs = 0x0000,
  569. .sysc_offs = 0x0010,
  570. .syss_offs = 0x0014,
  571. .sysc_flags = SYSC_HAS_SIDLEMODE | SYSC_HAS_SOFTRESET,
  572. .idlemodes = SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
  573. SIDLE_SMART_WKUP,
  574. .sysc_fields = &omap_hwmod_sysc_type2,
  575. };
  576. static struct omap_hwmod_class dm816x_timer_hwmod_class = {
  577. .name = "timer",
  578. .sysc = &dm816x_timer_sysc,
  579. };
  580. static struct omap_hwmod dm814x_timer1_hwmod = {
  581. .name = "timer1",
  582. .clkdm_name = "alwon_l3s_clkdm",
  583. .main_clk = "timer1_fck",
  584. .class = &dm816x_timer_hwmod_class,
  585. .flags = HWMOD_NO_IDLEST,
  586. };
  587. static struct omap_hwmod_ocp_if dm814x_l4_ls__timer1 = {
  588. .master = &dm81xx_l4_ls_hwmod,
  589. .slave = &dm814x_timer1_hwmod,
  590. .clk = "sysclk6_ck",
  591. .user = OCP_USER_MPU,
  592. };
  593. static struct omap_hwmod dm816x_timer1_hwmod = {
  594. .name = "timer1",
  595. .clkdm_name = "alwon_l3s_clkdm",
  596. .main_clk = "timer1_fck",
  597. .prcm = {
  598. .omap4 = {
  599. .clkctrl_offs = DM816X_CM_ALWON_TIMER_1_CLKCTRL,
  600. .modulemode = MODULEMODE_SWCTRL,
  601. },
  602. },
  603. .class = &dm816x_timer_hwmod_class,
  604. };
  605. static struct omap_hwmod_ocp_if dm816x_l4_ls__timer1 = {
  606. .master = &dm81xx_l4_ls_hwmod,
  607. .slave = &dm816x_timer1_hwmod,
  608. .clk = "sysclk6_ck",
  609. .user = OCP_USER_MPU,
  610. };
  611. static struct omap_hwmod dm814x_timer2_hwmod = {
  612. .name = "timer2",
  613. .clkdm_name = "alwon_l3s_clkdm",
  614. .main_clk = "timer2_fck",
  615. .class = &dm816x_timer_hwmod_class,
  616. .flags = HWMOD_NO_IDLEST,
  617. };
  618. static struct omap_hwmod_ocp_if dm814x_l4_ls__timer2 = {
  619. .master = &dm81xx_l4_ls_hwmod,
  620. .slave = &dm814x_timer2_hwmod,
  621. .clk = "sysclk6_ck",
  622. .user = OCP_USER_MPU,
  623. };
  624. static struct omap_hwmod dm816x_timer2_hwmod = {
  625. .name = "timer2",
  626. .clkdm_name = "alwon_l3s_clkdm",
  627. .main_clk = "timer2_fck",
  628. .prcm = {
  629. .omap4 = {
  630. .clkctrl_offs = DM816X_CM_ALWON_TIMER_2_CLKCTRL,
  631. .modulemode = MODULEMODE_SWCTRL,
  632. },
  633. },
  634. .class = &dm816x_timer_hwmod_class,
  635. };
  636. static struct omap_hwmod_ocp_if dm816x_l4_ls__timer2 = {
  637. .master = &dm81xx_l4_ls_hwmod,
  638. .slave = &dm816x_timer2_hwmod,
  639. .clk = "sysclk6_ck",
  640. .user = OCP_USER_MPU,
  641. };
  642. static struct omap_hwmod dm816x_timer3_hwmod = {
  643. .name = "timer3",
  644. .clkdm_name = "alwon_l3s_clkdm",
  645. .main_clk = "timer3_fck",
  646. .prcm = {
  647. .omap4 = {
  648. .clkctrl_offs = DM816X_CM_ALWON_TIMER_3_CLKCTRL,
  649. .modulemode = MODULEMODE_SWCTRL,
  650. },
  651. },
  652. .class = &dm816x_timer_hwmod_class,
  653. };
  654. static struct omap_hwmod_ocp_if dm816x_l4_ls__timer3 = {
  655. .master = &dm81xx_l4_ls_hwmod,
  656. .slave = &dm816x_timer3_hwmod,
  657. .clk = "sysclk6_ck",
  658. .user = OCP_USER_MPU,
  659. };
  660. static struct omap_hwmod dm816x_timer4_hwmod = {
  661. .name = "timer4",
  662. .clkdm_name = "alwon_l3s_clkdm",
  663. .main_clk = "timer4_fck",
  664. .prcm = {
  665. .omap4 = {
  666. .clkctrl_offs = DM816X_CM_ALWON_TIMER_4_CLKCTRL,
  667. .modulemode = MODULEMODE_SWCTRL,
  668. },
  669. },
  670. .class = &dm816x_timer_hwmod_class,
  671. };
  672. static struct omap_hwmod_ocp_if dm816x_l4_ls__timer4 = {
  673. .master = &dm81xx_l4_ls_hwmod,
  674. .slave = &dm816x_timer4_hwmod,
  675. .clk = "sysclk6_ck",
  676. .user = OCP_USER_MPU,
  677. };
  678. static struct omap_hwmod dm816x_timer5_hwmod = {
  679. .name = "timer5",
  680. .clkdm_name = "alwon_l3s_clkdm",
  681. .main_clk = "timer5_fck",
  682. .prcm = {
  683. .omap4 = {
  684. .clkctrl_offs = DM816X_CM_ALWON_TIMER_5_CLKCTRL,
  685. .modulemode = MODULEMODE_SWCTRL,
  686. },
  687. },
  688. .class = &dm816x_timer_hwmod_class,
  689. };
  690. static struct omap_hwmod_ocp_if dm816x_l4_ls__timer5 = {
  691. .master = &dm81xx_l4_ls_hwmod,
  692. .slave = &dm816x_timer5_hwmod,
  693. .clk = "sysclk6_ck",
  694. .user = OCP_USER_MPU,
  695. };
  696. static struct omap_hwmod dm816x_timer6_hwmod = {
  697. .name = "timer6",
  698. .clkdm_name = "alwon_l3s_clkdm",
  699. .main_clk = "timer6_fck",
  700. .prcm = {
  701. .omap4 = {
  702. .clkctrl_offs = DM816X_CM_ALWON_TIMER_6_CLKCTRL,
  703. .modulemode = MODULEMODE_SWCTRL,
  704. },
  705. },
  706. .class = &dm816x_timer_hwmod_class,
  707. };
  708. static struct omap_hwmod_ocp_if dm816x_l4_ls__timer6 = {
  709. .master = &dm81xx_l4_ls_hwmod,
  710. .slave = &dm816x_timer6_hwmod,
  711. .clk = "sysclk6_ck",
  712. .user = OCP_USER_MPU,
  713. };
  714. static struct omap_hwmod dm816x_timer7_hwmod = {
  715. .name = "timer7",
  716. .clkdm_name = "alwon_l3s_clkdm",
  717. .main_clk = "timer7_fck",
  718. .prcm = {
  719. .omap4 = {
  720. .clkctrl_offs = DM816X_CM_ALWON_TIMER_7_CLKCTRL,
  721. .modulemode = MODULEMODE_SWCTRL,
  722. },
  723. },
  724. .class = &dm816x_timer_hwmod_class,
  725. };
  726. static struct omap_hwmod_ocp_if dm816x_l4_ls__timer7 = {
  727. .master = &dm81xx_l4_ls_hwmod,
  728. .slave = &dm816x_timer7_hwmod,
  729. .clk = "sysclk6_ck",
  730. .user = OCP_USER_MPU,
  731. };
  732. /* CPSW on dm814x */
  733. static struct omap_hwmod_class_sysconfig dm814x_cpgmac_sysc = {
  734. .rev_offs = 0x0,
  735. .sysc_offs = 0x8,
  736. .syss_offs = 0x4,
  737. .sysc_flags = SYSC_HAS_SIDLEMODE | SYSC_HAS_MIDLEMODE |
  738. SYSS_HAS_RESET_STATUS,
  739. .idlemodes = SIDLE_FORCE | SIDLE_NO | MSTANDBY_FORCE |
  740. MSTANDBY_NO,
  741. .sysc_fields = &omap_hwmod_sysc_type3,
  742. };
  743. static struct omap_hwmod_class dm814x_cpgmac0_hwmod_class = {
  744. .name = "cpgmac0",
  745. .sysc = &dm814x_cpgmac_sysc,
  746. };
  747. static struct omap_hwmod dm814x_cpgmac0_hwmod = {
  748. .name = "cpgmac0",
  749. .class = &dm814x_cpgmac0_hwmod_class,
  750. .clkdm_name = "alwon_ethernet_clkdm",
  751. .flags = HWMOD_SWSUP_SIDLE | HWMOD_SWSUP_MSTANDBY,
  752. .main_clk = "cpsw_125mhz_gclk",
  753. .prcm = {
  754. .omap4 = {
  755. .clkctrl_offs = DM81XX_CM_ALWON_ETHERNET_0_CLKCTRL,
  756. .modulemode = MODULEMODE_SWCTRL,
  757. },
  758. },
  759. };
  760. static struct omap_hwmod_class dm814x_mdio_hwmod_class = {
  761. .name = "davinci_mdio",
  762. };
  763. static struct omap_hwmod dm814x_mdio_hwmod = {
  764. .name = "davinci_mdio",
  765. .class = &dm814x_mdio_hwmod_class,
  766. .clkdm_name = "alwon_ethernet_clkdm",
  767. .main_clk = "cpsw_125mhz_gclk",
  768. };
  769. static struct omap_hwmod_ocp_if dm814x_l4_hs__cpgmac0 = {
  770. .master = &dm81xx_l4_hs_hwmod,
  771. .slave = &dm814x_cpgmac0_hwmod,
  772. .clk = "cpsw_125mhz_gclk",
  773. .user = OCP_USER_MPU,
  774. };
  775. static struct omap_hwmod_ocp_if dm814x_cpgmac0__mdio = {
  776. .master = &dm814x_cpgmac0_hwmod,
  777. .slave = &dm814x_mdio_hwmod,
  778. .user = OCP_USER_MPU,
  779. .flags = HWMOD_NO_IDLEST,
  780. };
  781. /* EMAC Ethernet */
  782. static struct omap_hwmod_class_sysconfig dm816x_emac_sysc = {
  783. .rev_offs = 0x0,
  784. .sysc_offs = 0x4,
  785. .sysc_flags = SYSC_HAS_SOFTRESET,
  786. .sysc_fields = &omap_hwmod_sysc_type2,
  787. };
  788. static struct omap_hwmod_class dm816x_emac_hwmod_class = {
  789. .name = "emac",
  790. .sysc = &dm816x_emac_sysc,
  791. };
  792. /*
  793. * On dm816x the MDIO is within EMAC0. As the MDIO driver is a separate
  794. * driver probed before EMAC0, we let MDIO do the clock idling.
  795. */
  796. static struct omap_hwmod dm816x_emac0_hwmod = {
  797. .name = "emac0",
  798. .clkdm_name = "alwon_ethernet_clkdm",
  799. .class = &dm816x_emac_hwmod_class,
  800. .flags = HWMOD_NO_IDLEST,
  801. };
  802. static struct omap_hwmod_ocp_if dm81xx_l4_hs__emac0 = {
  803. .master = &dm81xx_l4_hs_hwmod,
  804. .slave = &dm816x_emac0_hwmod,
  805. .clk = "sysclk5_ck",
  806. .user = OCP_USER_MPU,
  807. };
  808. static struct omap_hwmod_class dm81xx_mdio_hwmod_class = {
  809. .name = "davinci_mdio",
  810. .sysc = &dm816x_emac_sysc,
  811. };
  812. static struct omap_hwmod dm81xx_emac0_mdio_hwmod = {
  813. .name = "davinci_mdio",
  814. .class = &dm81xx_mdio_hwmod_class,
  815. .clkdm_name = "alwon_ethernet_clkdm",
  816. .main_clk = "sysclk24_ck",
  817. .flags = HWMOD_NO_IDLEST,
  818. /*
  819. * REVISIT: This should be moved to the emac0_hwmod
  820. * once we have a better way to handle device slaves.
  821. */
  822. .prcm = {
  823. .omap4 = {
  824. .clkctrl_offs = DM81XX_CM_ALWON_ETHERNET_0_CLKCTRL,
  825. .modulemode = MODULEMODE_SWCTRL,
  826. },
  827. },
  828. };
  829. static struct omap_hwmod_ocp_if dm81xx_emac0__mdio = {
  830. .master = &dm81xx_l4_hs_hwmod,
  831. .slave = &dm81xx_emac0_mdio_hwmod,
  832. .user = OCP_USER_MPU,
  833. };
  834. static struct omap_hwmod dm816x_emac1_hwmod = {
  835. .name = "emac1",
  836. .clkdm_name = "alwon_ethernet_clkdm",
  837. .main_clk = "sysclk24_ck",
  838. .flags = HWMOD_NO_IDLEST,
  839. .prcm = {
  840. .omap4 = {
  841. .clkctrl_offs = DM816X_CM_ALWON_ETHERNET_1_CLKCTRL,
  842. .modulemode = MODULEMODE_SWCTRL,
  843. },
  844. },
  845. .class = &dm816x_emac_hwmod_class,
  846. };
  847. static struct omap_hwmod_ocp_if dm816x_l4_hs__emac1 = {
  848. .master = &dm81xx_l4_hs_hwmod,
  849. .slave = &dm816x_emac1_hwmod,
  850. .clk = "sysclk5_ck",
  851. .user = OCP_USER_MPU,
  852. };
  853. static struct omap_hwmod_class_sysconfig dm81xx_sata_sysc = {
  854. .rev_offs = 0x00fc,
  855. .sysc_offs = 0x1100,
  856. .sysc_flags = SYSC_HAS_SIDLEMODE,
  857. .idlemodes = SIDLE_FORCE,
  858. .sysc_fields = &omap_hwmod_sysc_type3,
  859. };
  860. static struct omap_hwmod_class dm81xx_sata_hwmod_class = {
  861. .name = "sata",
  862. .sysc = &dm81xx_sata_sysc,
  863. };
  864. static struct omap_hwmod dm81xx_sata_hwmod = {
  865. .name = "sata",
  866. .clkdm_name = "default_clkdm",
  867. .flags = HWMOD_NO_IDLEST,
  868. .prcm = {
  869. .omap4 = {
  870. .clkctrl_offs = DM81XX_CM_DEFAULT_SATA_CLKCTRL,
  871. .modulemode = MODULEMODE_SWCTRL,
  872. },
  873. },
  874. .class = &dm81xx_sata_hwmod_class,
  875. };
  876. static struct omap_hwmod_ocp_if dm81xx_l4_hs__sata = {
  877. .master = &dm81xx_l4_hs_hwmod,
  878. .slave = &dm81xx_sata_hwmod,
  879. .clk = "sysclk5_ck",
  880. .user = OCP_USER_MPU,
  881. };
  882. static struct omap_hwmod_class_sysconfig dm81xx_mmc_sysc = {
  883. .rev_offs = 0x0,
  884. .sysc_offs = 0x110,
  885. .syss_offs = 0x114,
  886. .sysc_flags = SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
  887. SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
  888. SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS,
  889. .idlemodes = SIDLE_FORCE | SIDLE_NO | SIDLE_SMART,
  890. .sysc_fields = &omap_hwmod_sysc_type1,
  891. };
  892. static struct omap_hwmod_class dm81xx_mmc_class = {
  893. .name = "mmc",
  894. .sysc = &dm81xx_mmc_sysc,
  895. };
  896. static struct omap_hwmod_opt_clk dm81xx_mmc_opt_clks[] = {
  897. { .role = "dbck", .clk = "sysclk18_ck", },
  898. };
  899. static struct omap_hsmmc_dev_attr mmc_dev_attr = {
  900. };
  901. static struct omap_hwmod dm814x_mmc1_hwmod = {
  902. .name = "mmc1",
  903. .clkdm_name = "alwon_l3s_clkdm",
  904. .opt_clks = dm81xx_mmc_opt_clks,
  905. .opt_clks_cnt = ARRAY_SIZE(dm81xx_mmc_opt_clks),
  906. .main_clk = "sysclk8_ck",
  907. .prcm = {
  908. .omap4 = {
  909. .clkctrl_offs = DM814X_CM_ALWON_MMCHS_0_CLKCTRL,
  910. .modulemode = MODULEMODE_SWCTRL,
  911. },
  912. },
  913. .dev_attr = &mmc_dev_attr,
  914. .class = &dm81xx_mmc_class,
  915. };
  916. static struct omap_hwmod_ocp_if dm814x_l4_ls__mmc1 = {
  917. .master = &dm81xx_l4_ls_hwmod,
  918. .slave = &dm814x_mmc1_hwmod,
  919. .clk = "sysclk6_ck",
  920. .user = OCP_USER_MPU,
  921. .flags = OMAP_FIREWALL_L4
  922. };
  923. static struct omap_hwmod dm814x_mmc2_hwmod = {
  924. .name = "mmc2",
  925. .clkdm_name = "alwon_l3s_clkdm",
  926. .opt_clks = dm81xx_mmc_opt_clks,
  927. .opt_clks_cnt = ARRAY_SIZE(dm81xx_mmc_opt_clks),
  928. .main_clk = "sysclk8_ck",
  929. .prcm = {
  930. .omap4 = {
  931. .clkctrl_offs = DM814X_CM_ALWON_MMCHS_1_CLKCTRL,
  932. .modulemode = MODULEMODE_SWCTRL,
  933. },
  934. },
  935. .dev_attr = &mmc_dev_attr,
  936. .class = &dm81xx_mmc_class,
  937. };
  938. static struct omap_hwmod_ocp_if dm814x_l4_ls__mmc2 = {
  939. .master = &dm81xx_l4_ls_hwmod,
  940. .slave = &dm814x_mmc2_hwmod,
  941. .clk = "sysclk6_ck",
  942. .user = OCP_USER_MPU,
  943. .flags = OMAP_FIREWALL_L4
  944. };
  945. static struct omap_hwmod dm814x_mmc3_hwmod = {
  946. .name = "mmc3",
  947. .clkdm_name = "alwon_l3_med_clkdm",
  948. .opt_clks = dm81xx_mmc_opt_clks,
  949. .opt_clks_cnt = ARRAY_SIZE(dm81xx_mmc_opt_clks),
  950. .main_clk = "sysclk8_ck",
  951. .prcm = {
  952. .omap4 = {
  953. .clkctrl_offs = DM814X_CM_ALWON_MMCHS_2_CLKCTRL,
  954. .modulemode = MODULEMODE_SWCTRL,
  955. },
  956. },
  957. .dev_attr = &mmc_dev_attr,
  958. .class = &dm81xx_mmc_class,
  959. };
  960. static struct omap_hwmod_ocp_if dm814x_alwon_l3_med__mmc3 = {
  961. .master = &dm81xx_alwon_l3_med_hwmod,
  962. .slave = &dm814x_mmc3_hwmod,
  963. .clk = "sysclk4_ck",
  964. .user = OCP_USER_MPU,
  965. };
  966. static struct omap_hwmod dm816x_mmc1_hwmod = {
  967. .name = "mmc1",
  968. .clkdm_name = "alwon_l3s_clkdm",
  969. .opt_clks = dm81xx_mmc_opt_clks,
  970. .opt_clks_cnt = ARRAY_SIZE(dm81xx_mmc_opt_clks),
  971. .main_clk = "sysclk10_ck",
  972. .prcm = {
  973. .omap4 = {
  974. .clkctrl_offs = DM816X_CM_ALWON_SDIO_CLKCTRL,
  975. .modulemode = MODULEMODE_SWCTRL,
  976. },
  977. },
  978. .dev_attr = &mmc_dev_attr,
  979. .class = &dm81xx_mmc_class,
  980. };
  981. static struct omap_hwmod_ocp_if dm816x_l4_ls__mmc1 = {
  982. .master = &dm81xx_l4_ls_hwmod,
  983. .slave = &dm816x_mmc1_hwmod,
  984. .clk = "sysclk6_ck",
  985. .user = OCP_USER_MPU,
  986. .flags = OMAP_FIREWALL_L4
  987. };
  988. static struct omap_hwmod_class_sysconfig dm816x_mcspi_sysc = {
  989. .rev_offs = 0x0,
  990. .sysc_offs = 0x110,
  991. .syss_offs = 0x114,
  992. .sysc_flags = SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
  993. SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
  994. SYSC_HAS_AUTOIDLE | SYSS_HAS_RESET_STATUS,
  995. .idlemodes = SIDLE_FORCE | SIDLE_NO | SIDLE_SMART,
  996. .sysc_fields = &omap_hwmod_sysc_type1,
  997. };
  998. static struct omap_hwmod_class dm816x_mcspi_class = {
  999. .name = "mcspi",
  1000. .sysc = &dm816x_mcspi_sysc,
  1001. };
  1002. static struct omap_hwmod dm81xx_mcspi1_hwmod = {
  1003. .name = "mcspi1",
  1004. .clkdm_name = "alwon_l3s_clkdm",
  1005. .main_clk = "sysclk10_ck",
  1006. .prcm = {
  1007. .omap4 = {
  1008. .clkctrl_offs = DM81XX_CM_ALWON_SPI_CLKCTRL,
  1009. .modulemode = MODULEMODE_SWCTRL,
  1010. },
  1011. },
  1012. .class = &dm816x_mcspi_class,
  1013. };
  1014. static struct omap_hwmod_ocp_if dm81xx_l4_ls__mcspi1 = {
  1015. .master = &dm81xx_l4_ls_hwmod,
  1016. .slave = &dm81xx_mcspi1_hwmod,
  1017. .clk = "sysclk6_ck",
  1018. .user = OCP_USER_MPU,
  1019. };
  1020. static struct omap_hwmod_class_sysconfig dm81xx_mailbox_sysc = {
  1021. .rev_offs = 0x000,
  1022. .sysc_offs = 0x010,
  1023. .syss_offs = 0x014,
  1024. .sysc_flags = SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
  1025. SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE,
  1026. .idlemodes = SIDLE_FORCE | SIDLE_NO | SIDLE_SMART,
  1027. .sysc_fields = &omap_hwmod_sysc_type1,
  1028. };
  1029. static struct omap_hwmod_class dm81xx_mailbox_hwmod_class = {
  1030. .name = "mailbox",
  1031. .sysc = &dm81xx_mailbox_sysc,
  1032. };
  1033. static struct omap_hwmod dm81xx_mailbox_hwmod = {
  1034. .name = "mailbox",
  1035. .clkdm_name = "alwon_l3s_clkdm",
  1036. .class = &dm81xx_mailbox_hwmod_class,
  1037. .main_clk = "sysclk6_ck",
  1038. .prcm = {
  1039. .omap4 = {
  1040. .clkctrl_offs = DM81XX_CM_ALWON_MAILBOX_CLKCTRL,
  1041. .modulemode = MODULEMODE_SWCTRL,
  1042. },
  1043. },
  1044. };
  1045. static struct omap_hwmod_ocp_if dm81xx_l4_ls__mailbox = {
  1046. .master = &dm81xx_l4_ls_hwmod,
  1047. .slave = &dm81xx_mailbox_hwmod,
  1048. .clk = "sysclk6_ck",
  1049. .user = OCP_USER_MPU,
  1050. };
  1051. static struct omap_hwmod_class_sysconfig dm81xx_spinbox_sysc = {
  1052. .rev_offs = 0x000,
  1053. .sysc_offs = 0x010,
  1054. .syss_offs = 0x014,
  1055. .sysc_flags = SYSC_HAS_CLOCKACTIVITY | SYSC_HAS_SIDLEMODE |
  1056. SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE,
  1057. .idlemodes = SIDLE_FORCE | SIDLE_NO | SIDLE_SMART,
  1058. .sysc_fields = &omap_hwmod_sysc_type1,
  1059. };
  1060. static struct omap_hwmod_class dm81xx_spinbox_hwmod_class = {
  1061. .name = "spinbox",
  1062. .sysc = &dm81xx_spinbox_sysc,
  1063. };
  1064. static struct omap_hwmod dm81xx_spinbox_hwmod = {
  1065. .name = "spinbox",
  1066. .clkdm_name = "alwon_l3s_clkdm",
  1067. .class = &dm81xx_spinbox_hwmod_class,
  1068. .main_clk = "sysclk6_ck",
  1069. .prcm = {
  1070. .omap4 = {
  1071. .clkctrl_offs = DM81XX_CM_ALWON_SPINBOX_CLKCTRL,
  1072. .modulemode = MODULEMODE_SWCTRL,
  1073. },
  1074. },
  1075. };
  1076. static struct omap_hwmod_ocp_if dm81xx_l4_ls__spinbox = {
  1077. .master = &dm81xx_l4_ls_hwmod,
  1078. .slave = &dm81xx_spinbox_hwmod,
  1079. .clk = "sysclk6_ck",
  1080. .user = OCP_USER_MPU,
  1081. };
  1082. static struct omap_hwmod_class dm81xx_tpcc_hwmod_class = {
  1083. .name = "tpcc",
  1084. };
  1085. static struct omap_hwmod dm81xx_tpcc_hwmod = {
  1086. .name = "tpcc",
  1087. .class = &dm81xx_tpcc_hwmod_class,
  1088. .clkdm_name = "alwon_l3s_clkdm",
  1089. .main_clk = "sysclk4_ck",
  1090. .prcm = {
  1091. .omap4 = {
  1092. .clkctrl_offs = DM81XX_CM_ALWON_TPCC_CLKCTRL,
  1093. .modulemode = MODULEMODE_SWCTRL,
  1094. },
  1095. },
  1096. };
  1097. static struct omap_hwmod_ocp_if dm81xx_alwon_l3_fast__tpcc = {
  1098. .master = &dm81xx_alwon_l3_fast_hwmod,
  1099. .slave = &dm81xx_tpcc_hwmod,
  1100. .clk = "sysclk4_ck",
  1101. .user = OCP_USER_MPU,
  1102. };
  1103. static struct omap_hwmod_class dm81xx_tptc0_hwmod_class = {
  1104. .name = "tptc0",
  1105. };
  1106. static struct omap_hwmod dm81xx_tptc0_hwmod = {
  1107. .name = "tptc0",
  1108. .class = &dm81xx_tptc0_hwmod_class,
  1109. .clkdm_name = "alwon_l3s_clkdm",
  1110. .main_clk = "sysclk4_ck",
  1111. .prcm = {
  1112. .omap4 = {
  1113. .clkctrl_offs = DM81XX_CM_ALWON_TPTC0_CLKCTRL,
  1114. .modulemode = MODULEMODE_SWCTRL,
  1115. },
  1116. },
  1117. };
  1118. static struct omap_hwmod_ocp_if dm81xx_alwon_l3_fast__tptc0 = {
  1119. .master = &dm81xx_alwon_l3_fast_hwmod,
  1120. .slave = &dm81xx_tptc0_hwmod,
  1121. .clk = "sysclk4_ck",
  1122. .user = OCP_USER_MPU,
  1123. };
  1124. static struct omap_hwmod_ocp_if dm81xx_tptc0__alwon_l3_fast = {
  1125. .master = &dm81xx_tptc0_hwmod,
  1126. .slave = &dm81xx_alwon_l3_fast_hwmod,
  1127. .clk = "sysclk4_ck",
  1128. .user = OCP_USER_MPU,
  1129. };
  1130. static struct omap_hwmod_class dm81xx_tptc1_hwmod_class = {
  1131. .name = "tptc1",
  1132. };
  1133. static struct omap_hwmod dm81xx_tptc1_hwmod = {
  1134. .name = "tptc1",
  1135. .class = &dm81xx_tptc1_hwmod_class,
  1136. .clkdm_name = "alwon_l3s_clkdm",
  1137. .main_clk = "sysclk4_ck",
  1138. .prcm = {
  1139. .omap4 = {
  1140. .clkctrl_offs = DM81XX_CM_ALWON_TPTC1_CLKCTRL,
  1141. .modulemode = MODULEMODE_SWCTRL,
  1142. },
  1143. },
  1144. };
  1145. static struct omap_hwmod_ocp_if dm81xx_alwon_l3_fast__tptc1 = {
  1146. .master = &dm81xx_alwon_l3_fast_hwmod,
  1147. .slave = &dm81xx_tptc1_hwmod,
  1148. .clk = "sysclk4_ck",
  1149. .user = OCP_USER_MPU,
  1150. };
  1151. static struct omap_hwmod_ocp_if dm81xx_tptc1__alwon_l3_fast = {
  1152. .master = &dm81xx_tptc1_hwmod,
  1153. .slave = &dm81xx_alwon_l3_fast_hwmod,
  1154. .clk = "sysclk4_ck",
  1155. .user = OCP_USER_MPU,
  1156. };
  1157. static struct omap_hwmod_class dm81xx_tptc2_hwmod_class = {
  1158. .name = "tptc2",
  1159. };
  1160. static struct omap_hwmod dm81xx_tptc2_hwmod = {
  1161. .name = "tptc2",
  1162. .class = &dm81xx_tptc2_hwmod_class,
  1163. .clkdm_name = "alwon_l3s_clkdm",
  1164. .main_clk = "sysclk4_ck",
  1165. .prcm = {
  1166. .omap4 = {
  1167. .clkctrl_offs = DM81XX_CM_ALWON_TPTC2_CLKCTRL,
  1168. .modulemode = MODULEMODE_SWCTRL,
  1169. },
  1170. },
  1171. };
  1172. static struct omap_hwmod_ocp_if dm81xx_alwon_l3_fast__tptc2 = {
  1173. .master = &dm81xx_alwon_l3_fast_hwmod,
  1174. .slave = &dm81xx_tptc2_hwmod,
  1175. .clk = "sysclk4_ck",
  1176. .user = OCP_USER_MPU,
  1177. };
  1178. static struct omap_hwmod_ocp_if dm81xx_tptc2__alwon_l3_fast = {
  1179. .master = &dm81xx_tptc2_hwmod,
  1180. .slave = &dm81xx_alwon_l3_fast_hwmod,
  1181. .clk = "sysclk4_ck",
  1182. .user = OCP_USER_MPU,
  1183. };
  1184. static struct omap_hwmod_class dm81xx_tptc3_hwmod_class = {
  1185. .name = "tptc3",
  1186. };
  1187. static struct omap_hwmod dm81xx_tptc3_hwmod = {
  1188. .name = "tptc3",
  1189. .class = &dm81xx_tptc3_hwmod_class,
  1190. .clkdm_name = "alwon_l3s_clkdm",
  1191. .main_clk = "sysclk4_ck",
  1192. .prcm = {
  1193. .omap4 = {
  1194. .clkctrl_offs = DM81XX_CM_ALWON_TPTC3_CLKCTRL,
  1195. .modulemode = MODULEMODE_SWCTRL,
  1196. },
  1197. },
  1198. };
  1199. static struct omap_hwmod_ocp_if dm81xx_alwon_l3_fast__tptc3 = {
  1200. .master = &dm81xx_alwon_l3_fast_hwmod,
  1201. .slave = &dm81xx_tptc3_hwmod,
  1202. .clk = "sysclk4_ck",
  1203. .user = OCP_USER_MPU,
  1204. };
  1205. static struct omap_hwmod_ocp_if dm81xx_tptc3__alwon_l3_fast = {
  1206. .master = &dm81xx_tptc3_hwmod,
  1207. .slave = &dm81xx_alwon_l3_fast_hwmod,
  1208. .clk = "sysclk4_ck",
  1209. .user = OCP_USER_MPU,
  1210. };
  1211. /*
  1212. * REVISIT: Test and enable the following once clocks work:
  1213. * dm81xx_l4_ls__mailbox
  1214. *
  1215. * Also note that some devices share a single clkctrl_offs..
  1216. * For example, i2c1 and 3 share one, and i2c2 and 4 share one.
  1217. */
  1218. static struct omap_hwmod_ocp_if *dm814x_hwmod_ocp_ifs[] __initdata = {
  1219. &dm814x_mpu__alwon_l3_slow,
  1220. &dm814x_mpu__alwon_l3_med,
  1221. &dm81xx_alwon_l3_slow__l4_ls,
  1222. &dm81xx_alwon_l3_slow__l4_hs,
  1223. &dm81xx_l4_ls__uart1,
  1224. &dm81xx_l4_ls__uart2,
  1225. &dm81xx_l4_ls__uart3,
  1226. &dm81xx_l4_ls__wd_timer1,
  1227. &dm81xx_l4_ls__i2c1,
  1228. &dm81xx_l4_ls__i2c2,
  1229. &dm81xx_l4_ls__gpio1,
  1230. &dm81xx_l4_ls__gpio2,
  1231. &dm81xx_l4_ls__elm,
  1232. &dm81xx_l4_ls__mcspi1,
  1233. &dm814x_l4_ls__mmc1,
  1234. &dm814x_l4_ls__mmc2,
  1235. &ti81xx_l4_ls__rtc,
  1236. &dm81xx_alwon_l3_fast__tpcc,
  1237. &dm81xx_alwon_l3_fast__tptc0,
  1238. &dm81xx_alwon_l3_fast__tptc1,
  1239. &dm81xx_alwon_l3_fast__tptc2,
  1240. &dm81xx_alwon_l3_fast__tptc3,
  1241. &dm81xx_tptc0__alwon_l3_fast,
  1242. &dm81xx_tptc1__alwon_l3_fast,
  1243. &dm81xx_tptc2__alwon_l3_fast,
  1244. &dm81xx_tptc3__alwon_l3_fast,
  1245. &dm814x_l4_ls__timer1,
  1246. &dm814x_l4_ls__timer2,
  1247. &dm814x_l4_hs__cpgmac0,
  1248. &dm814x_cpgmac0__mdio,
  1249. &dm81xx_alwon_l3_slow__gpmc,
  1250. &dm814x_default_l3_slow__usbss,
  1251. &dm814x_alwon_l3_med__mmc3,
  1252. NULL,
  1253. };
  1254. int __init dm814x_hwmod_init(void)
  1255. {
  1256. omap_hwmod_init();
  1257. return omap_hwmod_register_links(dm814x_hwmod_ocp_ifs);
  1258. }
  1259. static struct omap_hwmod_ocp_if *dm816x_hwmod_ocp_ifs[] __initdata = {
  1260. &dm816x_mpu__alwon_l3_slow,
  1261. &dm816x_mpu__alwon_l3_med,
  1262. &dm81xx_alwon_l3_slow__l4_ls,
  1263. &dm81xx_alwon_l3_slow__l4_hs,
  1264. &dm81xx_l4_ls__uart1,
  1265. &dm81xx_l4_ls__uart2,
  1266. &dm81xx_l4_ls__uart3,
  1267. &dm81xx_l4_ls__wd_timer1,
  1268. &dm81xx_l4_ls__i2c1,
  1269. &dm81xx_l4_ls__i2c2,
  1270. &dm81xx_l4_ls__gpio1,
  1271. &dm81xx_l4_ls__gpio2,
  1272. &dm81xx_l4_ls__elm,
  1273. &ti81xx_l4_ls__rtc,
  1274. &dm816x_l4_ls__mmc1,
  1275. &dm816x_l4_ls__timer1,
  1276. &dm816x_l4_ls__timer2,
  1277. &dm816x_l4_ls__timer3,
  1278. &dm816x_l4_ls__timer4,
  1279. &dm816x_l4_ls__timer5,
  1280. &dm816x_l4_ls__timer6,
  1281. &dm816x_l4_ls__timer7,
  1282. &dm81xx_l4_ls__mcspi1,
  1283. &dm81xx_l4_ls__mailbox,
  1284. &dm81xx_l4_ls__spinbox,
  1285. &dm81xx_l4_hs__emac0,
  1286. &dm81xx_emac0__mdio,
  1287. &dm816x_l4_hs__emac1,
  1288. &dm81xx_l4_hs__sata,
  1289. &dm81xx_alwon_l3_fast__tpcc,
  1290. &dm81xx_alwon_l3_fast__tptc0,
  1291. &dm81xx_alwon_l3_fast__tptc1,
  1292. &dm81xx_alwon_l3_fast__tptc2,
  1293. &dm81xx_alwon_l3_fast__tptc3,
  1294. &dm81xx_tptc0__alwon_l3_fast,
  1295. &dm81xx_tptc1__alwon_l3_fast,
  1296. &dm81xx_tptc2__alwon_l3_fast,
  1297. &dm81xx_tptc3__alwon_l3_fast,
  1298. &dm81xx_alwon_l3_slow__gpmc,
  1299. &dm816x_default_l3_slow__usbss,
  1300. NULL,
  1301. };
  1302. int __init dm816x_hwmod_init(void)
  1303. {
  1304. omap_hwmod_init();
  1305. return omap_hwmod_register_links(dm816x_hwmod_ocp_ifs);
  1306. }