control.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * OMAP2/3 System Control Module register access
  4. *
  5. * Copyright (C) 2007, 2012 Texas Instruments, Inc.
  6. * Copyright (C) 2007 Nokia Corporation
  7. *
  8. * Written by Paul Walmsley
  9. */
  10. #undef DEBUG
  11. #include <linux/kernel.h>
  12. #include <linux/io.h>
  13. #include <linux/of_address.h>
  14. #include <linux/regmap.h>
  15. #include <linux/mfd/syscon.h>
  16. #include <linux/cpu_pm.h>
  17. #include "soc.h"
  18. #include "iomap.h"
  19. #include "common.h"
  20. #include "cm-regbits-34xx.h"
  21. #include "prm-regbits-34xx.h"
  22. #include "prm3xxx.h"
  23. #include "cm3xxx.h"
  24. #include "sdrc.h"
  25. #include "pm.h"
  26. #include "control.h"
  27. #include "clock.h"
  28. /* Used by omap3_ctrl_save_padconf() */
  29. #define START_PADCONF_SAVE 0x2
  30. #define PADCONF_SAVE_DONE 0x1
  31. static void __iomem *omap2_ctrl_base;
  32. static s16 omap2_ctrl_offset;
  33. #if defined(CONFIG_ARCH_OMAP3) && defined(CONFIG_PM)
  34. struct omap3_scratchpad {
  35. u32 boot_config_ptr;
  36. u32 public_restore_ptr;
  37. u32 secure_ram_restore_ptr;
  38. u32 sdrc_module_semaphore;
  39. u32 prcm_block_offset;
  40. u32 sdrc_block_offset;
  41. };
  42. struct omap3_scratchpad_prcm_block {
  43. u32 prm_contents[2];
  44. u32 cm_contents[11];
  45. u32 prcm_block_size;
  46. };
  47. struct omap3_scratchpad_sdrc_block {
  48. u16 sysconfig;
  49. u16 cs_cfg;
  50. u16 sharing;
  51. u16 err_type;
  52. u32 dll_a_ctrl;
  53. u32 dll_b_ctrl;
  54. u32 power;
  55. u32 cs_0;
  56. u32 mcfg_0;
  57. u16 mr_0;
  58. u16 emr_1_0;
  59. u16 emr_2_0;
  60. u16 emr_3_0;
  61. u32 actim_ctrla_0;
  62. u32 actim_ctrlb_0;
  63. u32 rfr_ctrl_0;
  64. u32 cs_1;
  65. u32 mcfg_1;
  66. u16 mr_1;
  67. u16 emr_1_1;
  68. u16 emr_2_1;
  69. u16 emr_3_1;
  70. u32 actim_ctrla_1;
  71. u32 actim_ctrlb_1;
  72. u32 rfr_ctrl_1;
  73. u16 dcdl_1_ctrl;
  74. u16 dcdl_2_ctrl;
  75. u32 flags;
  76. u32 block_size;
  77. };
  78. void *omap3_secure_ram_storage;
  79. /*
  80. * This is used to store ARM registers in SDRAM before attempting
  81. * an MPU OFF. The save and restore happens from the SRAM sleep code.
  82. * The address is stored in scratchpad, so that it can be used
  83. * during the restore path.
  84. */
  85. u32 omap3_arm_context[128];
  86. struct omap3_control_regs {
  87. u32 sysconfig;
  88. u32 devconf0;
  89. u32 mem_dftrw0;
  90. u32 mem_dftrw1;
  91. u32 msuspendmux_0;
  92. u32 msuspendmux_1;
  93. u32 msuspendmux_2;
  94. u32 msuspendmux_3;
  95. u32 msuspendmux_4;
  96. u32 msuspendmux_5;
  97. u32 sec_ctrl;
  98. u32 devconf1;
  99. u32 csirxfe;
  100. u32 iva2_bootaddr;
  101. u32 iva2_bootmod;
  102. u32 wkup_ctrl;
  103. u32 debobs_0;
  104. u32 debobs_1;
  105. u32 debobs_2;
  106. u32 debobs_3;
  107. u32 debobs_4;
  108. u32 debobs_5;
  109. u32 debobs_6;
  110. u32 debobs_7;
  111. u32 debobs_8;
  112. u32 prog_io0;
  113. u32 prog_io1;
  114. u32 dss_dpll_spreading;
  115. u32 core_dpll_spreading;
  116. u32 per_dpll_spreading;
  117. u32 usbhost_dpll_spreading;
  118. u32 pbias_lite;
  119. u32 temp_sensor;
  120. u32 sramldo4;
  121. u32 sramldo5;
  122. u32 csi;
  123. u32 padconf_sys_nirq;
  124. };
  125. static struct omap3_control_regs control_context;
  126. #endif /* CONFIG_ARCH_OMAP3 && CONFIG_PM */
  127. u8 omap_ctrl_readb(u16 offset)
  128. {
  129. u32 val;
  130. u8 byte_offset = offset & 0x3;
  131. val = omap_ctrl_readl(offset);
  132. return (val >> (byte_offset * 8)) & 0xff;
  133. }
  134. u16 omap_ctrl_readw(u16 offset)
  135. {
  136. u32 val;
  137. u16 byte_offset = offset & 0x2;
  138. val = omap_ctrl_readl(offset);
  139. return (val >> (byte_offset * 8)) & 0xffff;
  140. }
  141. u32 omap_ctrl_readl(u16 offset)
  142. {
  143. offset &= 0xfffc;
  144. return readl_relaxed(omap2_ctrl_base + offset);
  145. }
  146. void omap_ctrl_writeb(u8 val, u16 offset)
  147. {
  148. u32 tmp;
  149. u8 byte_offset = offset & 0x3;
  150. tmp = omap_ctrl_readl(offset);
  151. tmp &= 0xffffffff ^ (0xff << (byte_offset * 8));
  152. tmp |= val << (byte_offset * 8);
  153. omap_ctrl_writel(tmp, offset);
  154. }
  155. void omap_ctrl_writew(u16 val, u16 offset)
  156. {
  157. u32 tmp;
  158. u8 byte_offset = offset & 0x2;
  159. tmp = omap_ctrl_readl(offset);
  160. tmp &= 0xffffffff ^ (0xffff << (byte_offset * 8));
  161. tmp |= val << (byte_offset * 8);
  162. omap_ctrl_writel(tmp, offset);
  163. }
  164. void omap_ctrl_writel(u32 val, u16 offset)
  165. {
  166. offset &= 0xfffc;
  167. writel_relaxed(val, omap2_ctrl_base + offset);
  168. }
  169. #ifdef CONFIG_ARCH_OMAP3
  170. /**
  171. * omap3_ctrl_write_boot_mode - set scratchpad boot mode for the next boot
  172. * @bootmode: 8-bit value to pass to some boot code
  173. *
  174. * Set the bootmode in the scratchpad RAM. This is used after the
  175. * system restarts. Not sure what actually uses this - it may be the
  176. * bootloader, rather than the boot ROM - contrary to the preserved
  177. * comment below. No return value.
  178. */
  179. void omap3_ctrl_write_boot_mode(u8 bootmode)
  180. {
  181. u32 l;
  182. l = ('B' << 24) | ('M' << 16) | bootmode;
  183. /*
  184. * Reserve the first word in scratchpad for communicating
  185. * with the boot ROM. A pointer to a data structure
  186. * describing the boot process can be stored there,
  187. * cf. OMAP34xx TRM, Initialization / Software Booting
  188. * Configuration.
  189. *
  190. * XXX This should use some omap_ctrl_writel()-type function
  191. */
  192. writel_relaxed(l, OMAP2_L4_IO_ADDRESS(OMAP343X_SCRATCHPAD + 4));
  193. }
  194. #endif
  195. /**
  196. * omap_ctrl_write_dsp_boot_addr - set boot address for a remote processor
  197. * @bootaddr: physical address of the boot loader
  198. *
  199. * Set boot address for the boot loader of a supported processor
  200. * when a power ON sequence occurs.
  201. */
  202. void omap_ctrl_write_dsp_boot_addr(u32 bootaddr)
  203. {
  204. u32 offset = cpu_is_omap243x() ? OMAP243X_CONTROL_IVA2_BOOTADDR :
  205. cpu_is_omap34xx() ? OMAP343X_CONTROL_IVA2_BOOTADDR :
  206. cpu_is_omap44xx() ? OMAP4_CTRL_MODULE_CORE_DSP_BOOTADDR :
  207. soc_is_omap54xx() ? OMAP4_CTRL_MODULE_CORE_DSP_BOOTADDR :
  208. 0;
  209. if (!offset) {
  210. pr_err("%s: unsupported omap type\n", __func__);
  211. return;
  212. }
  213. omap_ctrl_writel(bootaddr, offset);
  214. }
  215. /**
  216. * omap_ctrl_write_dsp_boot_mode - set boot mode for a remote processor
  217. * @bootmode: 8-bit value to pass to some boot code
  218. *
  219. * Sets boot mode for the boot loader of a supported processor
  220. * when a power ON sequence occurs.
  221. */
  222. void omap_ctrl_write_dsp_boot_mode(u8 bootmode)
  223. {
  224. u32 offset = cpu_is_omap243x() ? OMAP243X_CONTROL_IVA2_BOOTMOD :
  225. cpu_is_omap34xx() ? OMAP343X_CONTROL_IVA2_BOOTMOD :
  226. 0;
  227. if (!offset) {
  228. pr_err("%s: unsupported omap type\n", __func__);
  229. return;
  230. }
  231. omap_ctrl_writel(bootmode, offset);
  232. }
  233. #if defined(CONFIG_ARCH_OMAP3) && defined(CONFIG_PM)
  234. /*
  235. * Clears the scratchpad contents in case of cold boot-
  236. * called during bootup
  237. */
  238. void omap3_clear_scratchpad_contents(void)
  239. {
  240. u32 max_offset = OMAP343X_SCRATCHPAD_ROM_OFFSET;
  241. void __iomem *v_addr;
  242. u32 offset = 0;
  243. v_addr = OMAP2_L4_IO_ADDRESS(OMAP343X_SCRATCHPAD_ROM);
  244. if (omap3xxx_prm_clear_global_cold_reset()) {
  245. for ( ; offset <= max_offset; offset += 0x4)
  246. writel_relaxed(0x0, (v_addr + offset));
  247. }
  248. }
  249. /* Populate the scratchpad structure with restore structure */
  250. void omap3_save_scratchpad_contents(void)
  251. {
  252. void __iomem *scratchpad_address;
  253. u32 arm_context_addr;
  254. struct omap3_scratchpad scratchpad_contents;
  255. struct omap3_scratchpad_prcm_block prcm_block_contents;
  256. struct omap3_scratchpad_sdrc_block sdrc_block_contents;
  257. /*
  258. * Populate the Scratchpad contents
  259. *
  260. * The "get_*restore_pointer" functions are used to provide a
  261. * physical restore address where the ROM code jumps while waking
  262. * up from MPU OFF/OSWR state.
  263. * The restore pointer is stored into the scratchpad.
  264. */
  265. scratchpad_contents.boot_config_ptr = 0x0;
  266. if (cpu_is_omap3630())
  267. scratchpad_contents.public_restore_ptr =
  268. __pa_symbol(omap3_restore_3630);
  269. else if (omap_rev() != OMAP3430_REV_ES3_0 &&
  270. omap_rev() != OMAP3430_REV_ES3_1 &&
  271. omap_rev() != OMAP3430_REV_ES3_1_2)
  272. scratchpad_contents.public_restore_ptr =
  273. __pa_symbol(omap3_restore);
  274. else
  275. scratchpad_contents.public_restore_ptr =
  276. __pa_symbol(omap3_restore_es3);
  277. if (omap_type() == OMAP2_DEVICE_TYPE_GP)
  278. scratchpad_contents.secure_ram_restore_ptr = 0x0;
  279. else
  280. scratchpad_contents.secure_ram_restore_ptr =
  281. (u32) __pa(omap3_secure_ram_storage);
  282. scratchpad_contents.sdrc_module_semaphore = 0x0;
  283. scratchpad_contents.prcm_block_offset = 0x2C;
  284. scratchpad_contents.sdrc_block_offset = 0x64;
  285. /* Populate the PRCM block contents */
  286. omap3_prm_save_scratchpad_contents(prcm_block_contents.prm_contents);
  287. omap3_cm_save_scratchpad_contents(prcm_block_contents.cm_contents);
  288. prcm_block_contents.prcm_block_size = 0x0;
  289. /* Populate the SDRC block contents */
  290. sdrc_block_contents.sysconfig =
  291. (sdrc_read_reg(SDRC_SYSCONFIG) & 0xFFFF);
  292. sdrc_block_contents.cs_cfg =
  293. (sdrc_read_reg(SDRC_CS_CFG) & 0xFFFF);
  294. sdrc_block_contents.sharing =
  295. (sdrc_read_reg(SDRC_SHARING) & 0xFFFF);
  296. sdrc_block_contents.err_type =
  297. (sdrc_read_reg(SDRC_ERR_TYPE) & 0xFFFF);
  298. sdrc_block_contents.dll_a_ctrl = sdrc_read_reg(SDRC_DLLA_CTRL);
  299. sdrc_block_contents.dll_b_ctrl = 0x0;
  300. /*
  301. * Due to a OMAP3 errata (1.142), on EMU/HS devices SRDC should
  302. * be programed to issue automatic self refresh on timeout
  303. * of AUTO_CNT = 1 prior to any transition to OFF mode.
  304. */
  305. if ((omap_type() != OMAP2_DEVICE_TYPE_GP)
  306. && (omap_rev() >= OMAP3430_REV_ES3_0))
  307. sdrc_block_contents.power = (sdrc_read_reg(SDRC_POWER) &
  308. ~(SDRC_POWER_AUTOCOUNT_MASK|
  309. SDRC_POWER_CLKCTRL_MASK)) |
  310. (1 << SDRC_POWER_AUTOCOUNT_SHIFT) |
  311. SDRC_SELF_REFRESH_ON_AUTOCOUNT;
  312. else
  313. sdrc_block_contents.power = sdrc_read_reg(SDRC_POWER);
  314. sdrc_block_contents.cs_0 = 0x0;
  315. sdrc_block_contents.mcfg_0 = sdrc_read_reg(SDRC_MCFG_0);
  316. sdrc_block_contents.mr_0 = (sdrc_read_reg(SDRC_MR_0) & 0xFFFF);
  317. sdrc_block_contents.emr_1_0 = 0x0;
  318. sdrc_block_contents.emr_2_0 = 0x0;
  319. sdrc_block_contents.emr_3_0 = 0x0;
  320. sdrc_block_contents.actim_ctrla_0 =
  321. sdrc_read_reg(SDRC_ACTIM_CTRL_A_0);
  322. sdrc_block_contents.actim_ctrlb_0 =
  323. sdrc_read_reg(SDRC_ACTIM_CTRL_B_0);
  324. sdrc_block_contents.rfr_ctrl_0 =
  325. sdrc_read_reg(SDRC_RFR_CTRL_0);
  326. sdrc_block_contents.cs_1 = 0x0;
  327. sdrc_block_contents.mcfg_1 = sdrc_read_reg(SDRC_MCFG_1);
  328. sdrc_block_contents.mr_1 = sdrc_read_reg(SDRC_MR_1) & 0xFFFF;
  329. sdrc_block_contents.emr_1_1 = 0x0;
  330. sdrc_block_contents.emr_2_1 = 0x0;
  331. sdrc_block_contents.emr_3_1 = 0x0;
  332. sdrc_block_contents.actim_ctrla_1 =
  333. sdrc_read_reg(SDRC_ACTIM_CTRL_A_1);
  334. sdrc_block_contents.actim_ctrlb_1 =
  335. sdrc_read_reg(SDRC_ACTIM_CTRL_B_1);
  336. sdrc_block_contents.rfr_ctrl_1 =
  337. sdrc_read_reg(SDRC_RFR_CTRL_1);
  338. sdrc_block_contents.dcdl_1_ctrl = 0x0;
  339. sdrc_block_contents.dcdl_2_ctrl = 0x0;
  340. sdrc_block_contents.flags = 0x0;
  341. sdrc_block_contents.block_size = 0x0;
  342. arm_context_addr = __pa_symbol(omap3_arm_context);
  343. /* Copy all the contents to the scratchpad location */
  344. scratchpad_address = OMAP2_L4_IO_ADDRESS(OMAP343X_SCRATCHPAD);
  345. memcpy_toio(scratchpad_address, &scratchpad_contents,
  346. sizeof(scratchpad_contents));
  347. /* Scratchpad contents being 32 bits, a divide by 4 done here */
  348. memcpy_toio(scratchpad_address +
  349. scratchpad_contents.prcm_block_offset,
  350. &prcm_block_contents, sizeof(prcm_block_contents));
  351. memcpy_toio(scratchpad_address +
  352. scratchpad_contents.sdrc_block_offset,
  353. &sdrc_block_contents, sizeof(sdrc_block_contents));
  354. /*
  355. * Copies the address of the location in SDRAM where ARM
  356. * registers get saved during a MPU OFF transition.
  357. */
  358. memcpy_toio(scratchpad_address +
  359. scratchpad_contents.sdrc_block_offset +
  360. sizeof(sdrc_block_contents), &arm_context_addr, 4);
  361. }
  362. void omap3_control_save_context(void)
  363. {
  364. control_context.sysconfig = omap_ctrl_readl(OMAP2_CONTROL_SYSCONFIG);
  365. control_context.devconf0 = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0);
  366. control_context.mem_dftrw0 =
  367. omap_ctrl_readl(OMAP343X_CONTROL_MEM_DFTRW0);
  368. control_context.mem_dftrw1 =
  369. omap_ctrl_readl(OMAP343X_CONTROL_MEM_DFTRW1);
  370. control_context.msuspendmux_0 =
  371. omap_ctrl_readl(OMAP2_CONTROL_MSUSPENDMUX_0);
  372. control_context.msuspendmux_1 =
  373. omap_ctrl_readl(OMAP2_CONTROL_MSUSPENDMUX_1);
  374. control_context.msuspendmux_2 =
  375. omap_ctrl_readl(OMAP2_CONTROL_MSUSPENDMUX_2);
  376. control_context.msuspendmux_3 =
  377. omap_ctrl_readl(OMAP2_CONTROL_MSUSPENDMUX_3);
  378. control_context.msuspendmux_4 =
  379. omap_ctrl_readl(OMAP2_CONTROL_MSUSPENDMUX_4);
  380. control_context.msuspendmux_5 =
  381. omap_ctrl_readl(OMAP2_CONTROL_MSUSPENDMUX_5);
  382. control_context.sec_ctrl = omap_ctrl_readl(OMAP2_CONTROL_SEC_CTRL);
  383. control_context.devconf1 = omap_ctrl_readl(OMAP343X_CONTROL_DEVCONF1);
  384. control_context.csirxfe = omap_ctrl_readl(OMAP343X_CONTROL_CSIRXFE);
  385. control_context.iva2_bootaddr =
  386. omap_ctrl_readl(OMAP343X_CONTROL_IVA2_BOOTADDR);
  387. control_context.iva2_bootmod =
  388. omap_ctrl_readl(OMAP343X_CONTROL_IVA2_BOOTMOD);
  389. control_context.wkup_ctrl = omap_ctrl_readl(OMAP34XX_CONTROL_WKUP_CTRL);
  390. control_context.debobs_0 = omap_ctrl_readl(OMAP343X_CONTROL_DEBOBS(0));
  391. control_context.debobs_1 = omap_ctrl_readl(OMAP343X_CONTROL_DEBOBS(1));
  392. control_context.debobs_2 = omap_ctrl_readl(OMAP343X_CONTROL_DEBOBS(2));
  393. control_context.debobs_3 = omap_ctrl_readl(OMAP343X_CONTROL_DEBOBS(3));
  394. control_context.debobs_4 = omap_ctrl_readl(OMAP343X_CONTROL_DEBOBS(4));
  395. control_context.debobs_5 = omap_ctrl_readl(OMAP343X_CONTROL_DEBOBS(5));
  396. control_context.debobs_6 = omap_ctrl_readl(OMAP343X_CONTROL_DEBOBS(6));
  397. control_context.debobs_7 = omap_ctrl_readl(OMAP343X_CONTROL_DEBOBS(7));
  398. control_context.debobs_8 = omap_ctrl_readl(OMAP343X_CONTROL_DEBOBS(8));
  399. control_context.prog_io0 = omap_ctrl_readl(OMAP343X_CONTROL_PROG_IO0);
  400. control_context.prog_io1 = omap_ctrl_readl(OMAP343X_CONTROL_PROG_IO1);
  401. control_context.dss_dpll_spreading =
  402. omap_ctrl_readl(OMAP343X_CONTROL_DSS_DPLL_SPREADING);
  403. control_context.core_dpll_spreading =
  404. omap_ctrl_readl(OMAP343X_CONTROL_CORE_DPLL_SPREADING);
  405. control_context.per_dpll_spreading =
  406. omap_ctrl_readl(OMAP343X_CONTROL_PER_DPLL_SPREADING);
  407. control_context.usbhost_dpll_spreading =
  408. omap_ctrl_readl(OMAP343X_CONTROL_USBHOST_DPLL_SPREADING);
  409. control_context.pbias_lite =
  410. omap_ctrl_readl(OMAP343X_CONTROL_PBIAS_LITE);
  411. control_context.temp_sensor =
  412. omap_ctrl_readl(OMAP343X_CONTROL_TEMP_SENSOR);
  413. control_context.sramldo4 = omap_ctrl_readl(OMAP343X_CONTROL_SRAMLDO4);
  414. control_context.sramldo5 = omap_ctrl_readl(OMAP343X_CONTROL_SRAMLDO5);
  415. control_context.csi = omap_ctrl_readl(OMAP343X_CONTROL_CSI);
  416. control_context.padconf_sys_nirq =
  417. omap_ctrl_readl(OMAP343X_CONTROL_PADCONF_SYSNIRQ);
  418. }
  419. void omap3_control_restore_context(void)
  420. {
  421. omap_ctrl_writel(control_context.sysconfig, OMAP2_CONTROL_SYSCONFIG);
  422. omap_ctrl_writel(control_context.devconf0, OMAP2_CONTROL_DEVCONF0);
  423. omap_ctrl_writel(control_context.mem_dftrw0,
  424. OMAP343X_CONTROL_MEM_DFTRW0);
  425. omap_ctrl_writel(control_context.mem_dftrw1,
  426. OMAP343X_CONTROL_MEM_DFTRW1);
  427. omap_ctrl_writel(control_context.msuspendmux_0,
  428. OMAP2_CONTROL_MSUSPENDMUX_0);
  429. omap_ctrl_writel(control_context.msuspendmux_1,
  430. OMAP2_CONTROL_MSUSPENDMUX_1);
  431. omap_ctrl_writel(control_context.msuspendmux_2,
  432. OMAP2_CONTROL_MSUSPENDMUX_2);
  433. omap_ctrl_writel(control_context.msuspendmux_3,
  434. OMAP2_CONTROL_MSUSPENDMUX_3);
  435. omap_ctrl_writel(control_context.msuspendmux_4,
  436. OMAP2_CONTROL_MSUSPENDMUX_4);
  437. omap_ctrl_writel(control_context.msuspendmux_5,
  438. OMAP2_CONTROL_MSUSPENDMUX_5);
  439. omap_ctrl_writel(control_context.sec_ctrl, OMAP2_CONTROL_SEC_CTRL);
  440. omap_ctrl_writel(control_context.devconf1, OMAP343X_CONTROL_DEVCONF1);
  441. omap_ctrl_writel(control_context.csirxfe, OMAP343X_CONTROL_CSIRXFE);
  442. omap_ctrl_writel(control_context.iva2_bootaddr,
  443. OMAP343X_CONTROL_IVA2_BOOTADDR);
  444. omap_ctrl_writel(control_context.iva2_bootmod,
  445. OMAP343X_CONTROL_IVA2_BOOTMOD);
  446. omap_ctrl_writel(control_context.wkup_ctrl, OMAP34XX_CONTROL_WKUP_CTRL);
  447. omap_ctrl_writel(control_context.debobs_0, OMAP343X_CONTROL_DEBOBS(0));
  448. omap_ctrl_writel(control_context.debobs_1, OMAP343X_CONTROL_DEBOBS(1));
  449. omap_ctrl_writel(control_context.debobs_2, OMAP343X_CONTROL_DEBOBS(2));
  450. omap_ctrl_writel(control_context.debobs_3, OMAP343X_CONTROL_DEBOBS(3));
  451. omap_ctrl_writel(control_context.debobs_4, OMAP343X_CONTROL_DEBOBS(4));
  452. omap_ctrl_writel(control_context.debobs_5, OMAP343X_CONTROL_DEBOBS(5));
  453. omap_ctrl_writel(control_context.debobs_6, OMAP343X_CONTROL_DEBOBS(6));
  454. omap_ctrl_writel(control_context.debobs_7, OMAP343X_CONTROL_DEBOBS(7));
  455. omap_ctrl_writel(control_context.debobs_8, OMAP343X_CONTROL_DEBOBS(8));
  456. omap_ctrl_writel(control_context.prog_io0, OMAP343X_CONTROL_PROG_IO0);
  457. omap_ctrl_writel(control_context.prog_io1, OMAP343X_CONTROL_PROG_IO1);
  458. omap_ctrl_writel(control_context.dss_dpll_spreading,
  459. OMAP343X_CONTROL_DSS_DPLL_SPREADING);
  460. omap_ctrl_writel(control_context.core_dpll_spreading,
  461. OMAP343X_CONTROL_CORE_DPLL_SPREADING);
  462. omap_ctrl_writel(control_context.per_dpll_spreading,
  463. OMAP343X_CONTROL_PER_DPLL_SPREADING);
  464. omap_ctrl_writel(control_context.usbhost_dpll_spreading,
  465. OMAP343X_CONTROL_USBHOST_DPLL_SPREADING);
  466. omap_ctrl_writel(control_context.pbias_lite,
  467. OMAP343X_CONTROL_PBIAS_LITE);
  468. omap_ctrl_writel(control_context.temp_sensor,
  469. OMAP343X_CONTROL_TEMP_SENSOR);
  470. omap_ctrl_writel(control_context.sramldo4, OMAP343X_CONTROL_SRAMLDO4);
  471. omap_ctrl_writel(control_context.sramldo5, OMAP343X_CONTROL_SRAMLDO5);
  472. omap_ctrl_writel(control_context.csi, OMAP343X_CONTROL_CSI);
  473. omap_ctrl_writel(control_context.padconf_sys_nirq,
  474. OMAP343X_CONTROL_PADCONF_SYSNIRQ);
  475. }
  476. void omap3630_ctrl_disable_rta(void)
  477. {
  478. if (!cpu_is_omap3630())
  479. return;
  480. omap_ctrl_writel(OMAP36XX_RTA_DISABLE, OMAP36XX_CONTROL_MEM_RTA_CTRL);
  481. }
  482. /**
  483. * omap3_ctrl_save_padconf - save padconf registers to scratchpad RAM
  484. *
  485. * Tell the SCM to start saving the padconf registers, then wait for
  486. * the process to complete. Returns 0 unconditionally, although it
  487. * should also eventually be able to return -ETIMEDOUT, if the save
  488. * does not complete.
  489. *
  490. * XXX This function is missing a timeout. What should it be?
  491. */
  492. int omap3_ctrl_save_padconf(void)
  493. {
  494. u32 cpo;
  495. /* Save the padconf registers */
  496. cpo = omap_ctrl_readl(OMAP343X_CONTROL_PADCONF_OFF);
  497. cpo |= START_PADCONF_SAVE;
  498. omap_ctrl_writel(cpo, OMAP343X_CONTROL_PADCONF_OFF);
  499. /* wait for the save to complete */
  500. while (!(omap_ctrl_readl(OMAP343X_CONTROL_GENERAL_PURPOSE_STATUS)
  501. & PADCONF_SAVE_DONE))
  502. udelay(1);
  503. return 0;
  504. }
  505. /**
  506. * omap3_ctrl_set_iva_bootmode_idle - sets the IVA2 bootmode to idle
  507. *
  508. * Sets the bootmode for IVA2 to idle. This is needed by the PM code to
  509. * force disable IVA2 so that it does not prevent any low-power states.
  510. */
  511. static void __init omap3_ctrl_set_iva_bootmode_idle(void)
  512. {
  513. omap_ctrl_writel(OMAP3_IVA2_BOOTMOD_IDLE,
  514. OMAP343X_CONTROL_IVA2_BOOTMOD);
  515. }
  516. /**
  517. * omap3_ctrl_setup_d2d_padconf - setup stacked modem pads for idle
  518. *
  519. * Sets up the pads controlling the stacked modem in such way that the
  520. * device can enter idle.
  521. */
  522. static void __init omap3_ctrl_setup_d2d_padconf(void)
  523. {
  524. u16 mask, padconf;
  525. /*
  526. * In a stand alone OMAP3430 where there is not a stacked
  527. * modem for the D2D Idle Ack and D2D MStandby must be pulled
  528. * high. S CONTROL_PADCONF_SAD2D_IDLEACK and
  529. * CONTROL_PADCONF_SAD2D_MSTDBY to have a pull up.
  530. */
  531. mask = (1 << 4) | (1 << 3); /* pull-up, enabled */
  532. padconf = omap_ctrl_readw(OMAP3_PADCONF_SAD2D_MSTANDBY);
  533. padconf |= mask;
  534. omap_ctrl_writew(padconf, OMAP3_PADCONF_SAD2D_MSTANDBY);
  535. padconf = omap_ctrl_readw(OMAP3_PADCONF_SAD2D_IDLEACK);
  536. padconf |= mask;
  537. omap_ctrl_writew(padconf, OMAP3_PADCONF_SAD2D_IDLEACK);
  538. }
  539. /**
  540. * omap3_ctrl_init - does static initializations for control module
  541. *
  542. * Initializes system control module. This sets up the sysconfig autoidle,
  543. * and sets up modem and iva2 so that they can be idled properly.
  544. */
  545. void __init omap3_ctrl_init(void)
  546. {
  547. omap_ctrl_writel(OMAP3430_AUTOIDLE_MASK, OMAP2_CONTROL_SYSCONFIG);
  548. omap3_ctrl_set_iva_bootmode_idle();
  549. omap3_ctrl_setup_d2d_padconf();
  550. }
  551. #endif /* CONFIG_ARCH_OMAP3 && CONFIG_PM */
  552. static unsigned long am43xx_control_reg_offsets[] = {
  553. AM33XX_CONTROL_SYSCONFIG_OFFSET,
  554. AM33XX_CONTROL_STATUS_OFFSET,
  555. AM43XX_CONTROL_MPU_L2_CTRL_OFFSET,
  556. AM33XX_CONTROL_CORE_SLDO_CTRL_OFFSET,
  557. AM33XX_CONTROL_MPU_SLDO_CTRL_OFFSET,
  558. AM33XX_CONTROL_CLK32KDIVRATIO_CTRL_OFFSET,
  559. AM33XX_CONTROL_BANDGAP_CTRL_OFFSET,
  560. AM33XX_CONTROL_BANDGAP_TRIM_OFFSET,
  561. AM33XX_CONTROL_PLL_CLKINPULOW_CTRL_OFFSET,
  562. AM33XX_CONTROL_MOSC_CTRL_OFFSET,
  563. AM33XX_CONTROL_DEEPSLEEP_CTRL_OFFSET,
  564. AM43XX_CONTROL_DISPLAY_PLL_SEL_OFFSET,
  565. AM33XX_CONTROL_INIT_PRIORITY_0_OFFSET,
  566. AM33XX_CONTROL_INIT_PRIORITY_1_OFFSET,
  567. AM33XX_CONTROL_TPTC_CFG_OFFSET,
  568. AM33XX_CONTROL_USB_CTRL0_OFFSET,
  569. AM33XX_CONTROL_USB_CTRL1_OFFSET,
  570. AM43XX_CONTROL_USB_CTRL2_OFFSET,
  571. AM43XX_CONTROL_GMII_SEL_OFFSET,
  572. AM43XX_CONTROL_MPUSS_CTRL_OFFSET,
  573. AM43XX_CONTROL_TIMER_CASCADE_CTRL_OFFSET,
  574. AM43XX_CONTROL_PWMSS_CTRL_OFFSET,
  575. AM33XX_CONTROL_MREQPRIO_0_OFFSET,
  576. AM33XX_CONTROL_MREQPRIO_1_OFFSET,
  577. AM33XX_CONTROL_HW_EVENT_SEL_GRP1_OFFSET,
  578. AM33XX_CONTROL_HW_EVENT_SEL_GRP2_OFFSET,
  579. AM33XX_CONTROL_HW_EVENT_SEL_GRP3_OFFSET,
  580. AM33XX_CONTROL_HW_EVENT_SEL_GRP4_OFFSET,
  581. AM33XX_CONTROL_SMRT_CTRL_OFFSET,
  582. AM33XX_CONTROL_MPUSS_HW_DEBUG_SEL_OFFSET,
  583. AM43XX_CONTROL_CQDETECT_STS_OFFSET,
  584. AM43XX_CONTROL_CQDETECT_STS2_OFFSET,
  585. AM43XX_CONTROL_VTP_CTRL_OFFSET,
  586. AM33XX_CONTROL_VREF_CTRL_OFFSET,
  587. AM33XX_CONTROL_TPCC_EVT_MUX_0_3_OFFSET,
  588. AM33XX_CONTROL_TPCC_EVT_MUX_4_7_OFFSET,
  589. AM33XX_CONTROL_TPCC_EVT_MUX_8_11_OFFSET,
  590. AM33XX_CONTROL_TPCC_EVT_MUX_12_15_OFFSET,
  591. AM33XX_CONTROL_TPCC_EVT_MUX_16_19_OFFSET,
  592. AM33XX_CONTROL_TPCC_EVT_MUX_20_23_OFFSET,
  593. AM33XX_CONTROL_TPCC_EVT_MUX_24_27_OFFSET,
  594. AM33XX_CONTROL_TPCC_EVT_MUX_28_31_OFFSET,
  595. AM33XX_CONTROL_TPCC_EVT_MUX_32_35_OFFSET,
  596. AM33XX_CONTROL_TPCC_EVT_MUX_36_39_OFFSET,
  597. AM33XX_CONTROL_TPCC_EVT_MUX_40_43_OFFSET,
  598. AM33XX_CONTROL_TPCC_EVT_MUX_44_47_OFFSET,
  599. AM33XX_CONTROL_TPCC_EVT_MUX_48_51_OFFSET,
  600. AM33XX_CONTROL_TPCC_EVT_MUX_52_55_OFFSET,
  601. AM33XX_CONTROL_TPCC_EVT_MUX_56_59_OFFSET,
  602. AM33XX_CONTROL_TPCC_EVT_MUX_60_63_OFFSET,
  603. AM33XX_CONTROL_TIMER_EVT_CAPT_OFFSET,
  604. AM33XX_CONTROL_ECAP_EVT_CAPT_OFFSET,
  605. AM33XX_CONTROL_ADC_EVT_CAPT_OFFSET,
  606. AM43XX_CONTROL_ADC1_EVT_CAPT_OFFSET,
  607. AM33XX_CONTROL_RESET_ISO_OFFSET,
  608. };
  609. static u32 am33xx_control_vals[ARRAY_SIZE(am43xx_control_reg_offsets)];
  610. /**
  611. * am43xx_control_save_context - Save the wakeup domain registers
  612. *
  613. * Save the wkup domain registers
  614. */
  615. static void am43xx_control_save_context(void)
  616. {
  617. int i;
  618. for (i = 0; i < ARRAY_SIZE(am43xx_control_reg_offsets); i++)
  619. am33xx_control_vals[i] =
  620. omap_ctrl_readl(am43xx_control_reg_offsets[i]);
  621. }
  622. /**
  623. * am43xx_control_restore_context - Restore the wakeup domain registers
  624. *
  625. * Restore the wkup domain registers
  626. */
  627. static void am43xx_control_restore_context(void)
  628. {
  629. int i;
  630. for (i = 0; i < ARRAY_SIZE(am43xx_control_reg_offsets); i++)
  631. omap_ctrl_writel(am33xx_control_vals[i],
  632. am43xx_control_reg_offsets[i]);
  633. }
  634. static int cpu_notifier(struct notifier_block *nb, unsigned long cmd, void *v)
  635. {
  636. switch (cmd) {
  637. case CPU_CLUSTER_PM_ENTER:
  638. if (enable_off_mode)
  639. am43xx_control_save_context();
  640. break;
  641. case CPU_CLUSTER_PM_EXIT:
  642. if (enable_off_mode)
  643. am43xx_control_restore_context();
  644. break;
  645. }
  646. return NOTIFY_OK;
  647. }
  648. struct control_init_data {
  649. int index;
  650. void __iomem *mem;
  651. s16 offset;
  652. };
  653. static struct control_init_data ctrl_data = {
  654. .index = TI_CLKM_CTRL,
  655. };
  656. static const struct control_init_data omap2_ctrl_data = {
  657. .index = TI_CLKM_CTRL,
  658. .offset = -OMAP2_CONTROL_GENERAL,
  659. };
  660. static const struct control_init_data ctrl_aux_data = {
  661. .index = TI_CLKM_CTRL_AUX,
  662. };
  663. static const struct of_device_id omap_scrm_dt_match_table[] = {
  664. { .compatible = "ti,am3-scm", .data = &ctrl_data },
  665. { .compatible = "ti,am4-scm", .data = &ctrl_data },
  666. { .compatible = "ti,omap2-scm", .data = &omap2_ctrl_data },
  667. { .compatible = "ti,omap3-scm", .data = &omap2_ctrl_data },
  668. { .compatible = "ti,dm814-scm", .data = &ctrl_data },
  669. { .compatible = "ti,dm816-scrm", .data = &ctrl_data },
  670. { .compatible = "ti,omap4-scm-core", .data = &ctrl_data },
  671. { .compatible = "ti,omap5-scm-core", .data = &ctrl_data },
  672. { .compatible = "ti,omap5-scm-wkup-pad-conf", .data = &ctrl_aux_data },
  673. { .compatible = "ti,dra7-scm-core", .data = &ctrl_data },
  674. { }
  675. };
  676. /**
  677. * omap2_control_base_init - initialize iomappings for the control driver
  678. *
  679. * Detects and initializes the iomappings for the control driver, based
  680. * on the DT data. Returns 0 in success, negative error value
  681. * otherwise.
  682. */
  683. int __init omap2_control_base_init(void)
  684. {
  685. struct device_node *np;
  686. const struct of_device_id *match;
  687. struct control_init_data *data;
  688. void __iomem *mem;
  689. for_each_matching_node_and_match(np, omap_scrm_dt_match_table, &match) {
  690. data = (struct control_init_data *)match->data;
  691. mem = of_iomap(np, 0);
  692. if (!mem) {
  693. of_node_put(np);
  694. return -ENOMEM;
  695. }
  696. if (data->index == TI_CLKM_CTRL) {
  697. omap2_ctrl_base = mem;
  698. omap2_ctrl_offset = data->offset;
  699. }
  700. data->mem = mem;
  701. }
  702. return 0;
  703. }
  704. /**
  705. * omap_control_init - low level init for the control driver
  706. *
  707. * Initializes the low level clock infrastructure for control driver.
  708. * Returns 0 in success, negative error value in failure.
  709. */
  710. int __init omap_control_init(void)
  711. {
  712. struct device_node *np, *scm_conf;
  713. const struct of_device_id *match;
  714. const struct omap_prcm_init_data *data;
  715. int ret;
  716. struct regmap *syscon;
  717. static struct notifier_block nb;
  718. for_each_matching_node_and_match(np, omap_scrm_dt_match_table, &match) {
  719. data = match->data;
  720. /*
  721. * Check if we have scm_conf node, if yes, use this to
  722. * access clock registers.
  723. */
  724. scm_conf = of_get_child_by_name(np, "scm_conf");
  725. if (scm_conf) {
  726. syscon = syscon_node_to_regmap(scm_conf);
  727. if (IS_ERR(syscon)) {
  728. ret = PTR_ERR(syscon);
  729. goto of_node_put;
  730. }
  731. if (of_get_child_by_name(scm_conf, "clocks")) {
  732. ret = omap2_clk_provider_init(scm_conf,
  733. data->index,
  734. syscon, NULL);
  735. if (ret)
  736. goto of_node_put;
  737. }
  738. } else {
  739. /* No scm_conf found, direct access */
  740. ret = omap2_clk_provider_init(np, data->index, NULL,
  741. data->mem);
  742. if (ret)
  743. goto of_node_put;
  744. }
  745. }
  746. /* Only AM43XX can lose ctrl registers context during rtc-ddr suspend */
  747. if (soc_is_am43xx()) {
  748. nb.notifier_call = cpu_notifier;
  749. cpu_pm_register_notifier(&nb);
  750. }
  751. return 0;
  752. of_node_put:
  753. of_node_put(np);
  754. return ret;
  755. }
  756. /**
  757. * omap3_control_legacy_iomap_init - legacy iomap init for clock providers
  758. *
  759. * Legacy iomap init for clock provider. Needed only by legacy boot mode,
  760. * where the base addresses are not parsed from DT, but still required
  761. * by the clock driver to be setup properly.
  762. */
  763. void __init omap3_control_legacy_iomap_init(void)
  764. {
  765. omap2_clk_legacy_provider_init(TI_CLKM_SCRM, omap2_ctrl_base);
  766. }