omap_hwmod_81xx_data.c 38 KB

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