db5500-prcmu.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449
  1. /*
  2. * Copyright (C) ST-Ericsson SA 2010
  3. *
  4. * License Terms: GNU General Public License v2
  5. * Author: Mattias Nilsson <mattias.i.nilsson@stericsson.com>
  6. *
  7. * U5500 PRCM Unit interface driver
  8. */
  9. #include <linux/module.h>
  10. #include <linux/kernel.h>
  11. #include <linux/delay.h>
  12. #include <linux/errno.h>
  13. #include <linux/err.h>
  14. #include <linux/spinlock.h>
  15. #include <linux/io.h>
  16. #include <linux/slab.h>
  17. #include <linux/mutex.h>
  18. #include <linux/completion.h>
  19. #include <linux/irq.h>
  20. #include <linux/jiffies.h>
  21. #include <linux/bitops.h>
  22. #include <linux/interrupt.h>
  23. #include <linux/mfd/db5500-prcmu.h>
  24. #include <mach/hardware.h>
  25. #include <mach/irqs.h>
  26. #include <mach/db5500-regs.h>
  27. #include "db5500-prcmu-regs.h"
  28. #define _PRCM_MB_HEADER (tcdm_base + 0xFE8)
  29. #define PRCM_REQ_MB0_HEADER (_PRCM_MB_HEADER + 0x0)
  30. #define PRCM_REQ_MB1_HEADER (_PRCM_MB_HEADER + 0x1)
  31. #define PRCM_REQ_MB2_HEADER (_PRCM_MB_HEADER + 0x2)
  32. #define PRCM_REQ_MB3_HEADER (_PRCM_MB_HEADER + 0x3)
  33. #define PRCM_REQ_MB4_HEADER (_PRCM_MB_HEADER + 0x4)
  34. #define PRCM_REQ_MB5_HEADER (_PRCM_MB_HEADER + 0x5)
  35. #define PRCM_REQ_MB6_HEADER (_PRCM_MB_HEADER + 0x6)
  36. #define PRCM_REQ_MB7_HEADER (_PRCM_MB_HEADER + 0x7)
  37. #define PRCM_ACK_MB0_HEADER (_PRCM_MB_HEADER + 0x8)
  38. #define PRCM_ACK_MB1_HEADER (_PRCM_MB_HEADER + 0x9)
  39. #define PRCM_ACK_MB2_HEADER (_PRCM_MB_HEADER + 0xa)
  40. #define PRCM_ACK_MB3_HEADER (_PRCM_MB_HEADER + 0xb)
  41. #define PRCM_ACK_MB4_HEADER (_PRCM_MB_HEADER + 0xc)
  42. #define PRCM_ACK_MB5_HEADER (_PRCM_MB_HEADER + 0xd)
  43. #define PRCM_ACK_MB6_HEADER (_PRCM_MB_HEADER + 0xe)
  44. #define PRCM_ACK_MB7_HEADER (_PRCM_MB_HEADER + 0xf)
  45. /* Req Mailboxes */
  46. #define PRCM_REQ_MB0 (tcdm_base + 0xFD8)
  47. #define PRCM_REQ_MB1 (tcdm_base + 0xFCC)
  48. #define PRCM_REQ_MB2 (tcdm_base + 0xFC4)
  49. #define PRCM_REQ_MB3 (tcdm_base + 0xFC0)
  50. #define PRCM_REQ_MB4 (tcdm_base + 0xF98)
  51. #define PRCM_REQ_MB5 (tcdm_base + 0xF90)
  52. #define PRCM_REQ_MB6 (tcdm_base + 0xF8C)
  53. #define PRCM_REQ_MB7 (tcdm_base + 0xF84)
  54. /* Ack Mailboxes */
  55. #define PRCM_ACK_MB0 (tcdm_base + 0xF38)
  56. #define PRCM_ACK_MB1 (tcdm_base + 0xF30)
  57. #define PRCM_ACK_MB2 (tcdm_base + 0xF24)
  58. #define PRCM_ACK_MB3 (tcdm_base + 0xF20)
  59. #define PRCM_ACK_MB4 (tcdm_base + 0xF1C)
  60. #define PRCM_ACK_MB5 (tcdm_base + 0xF14)
  61. #define PRCM_ACK_MB6 (tcdm_base + 0xF0C)
  62. #define PRCM_ACK_MB7 (tcdm_base + 0xF08)
  63. enum mb_return_code {
  64. RC_SUCCESS,
  65. RC_FAIL,
  66. };
  67. /* Mailbox 0 headers. */
  68. enum mb0_header {
  69. /* request */
  70. RMB0H_PWR_STATE_TRANS = 1,
  71. RMB0H_WAKE_UP_CFG,
  72. RMB0H_RD_WAKE_UP_ACK,
  73. /* acknowledge */
  74. AMB0H_WAKE_UP = 1,
  75. };
  76. /* Mailbox 5 headers. */
  77. enum mb5_header {
  78. MB5H_I2C_WRITE = 1,
  79. MB5H_I2C_READ,
  80. };
  81. /* Request mailbox 5 fields. */
  82. #define PRCM_REQ_MB5_I2C_SLAVE (PRCM_REQ_MB5 + 0)
  83. #define PRCM_REQ_MB5_I2C_REG (PRCM_REQ_MB5 + 1)
  84. #define PRCM_REQ_MB5_I2C_SIZE (PRCM_REQ_MB5 + 2)
  85. #define PRCM_REQ_MB5_I2C_DATA (PRCM_REQ_MB5 + 4)
  86. /* Acknowledge mailbox 5 fields. */
  87. #define PRCM_ACK_MB5_RETURN_CODE (PRCM_ACK_MB5 + 0)
  88. #define PRCM_ACK_MB5_I2C_DATA (PRCM_ACK_MB5 + 4)
  89. #define NUM_MB 8
  90. #define MBOX_BIT BIT
  91. #define ALL_MBOX_BITS (MBOX_BIT(NUM_MB) - 1)
  92. /*
  93. * Used by MCDE to setup all necessary PRCMU registers
  94. */
  95. #define PRCMU_RESET_DSIPLL 0x00004000
  96. #define PRCMU_UNCLAMP_DSIPLL 0x00400800
  97. /* HDMI CLK MGT PLLSW=001 (PLLSOC0), PLLDIV=0x8, = 50 Mhz*/
  98. #define PRCMU_DSI_CLOCK_SETTING 0x00000128
  99. /* TVCLK_MGT PLLSW=001 (PLLSOC0) PLLDIV=0x13, = 19.05 MHZ */
  100. #define PRCMU_DSI_LP_CLOCK_SETTING 0x00000135
  101. #define PRCMU_PLLDSI_FREQ_SETTING 0x0004013C
  102. #define PRCMU_DSI_PLLOUT_SEL_SETTING 0x00000002
  103. #define PRCMU_ENABLE_ESCAPE_CLOCK_DIV 0x03000101
  104. #define PRCMU_DISABLE_ESCAPE_CLOCK_DIV 0x00000101
  105. #define PRCMU_ENABLE_PLLDSI 0x00000001
  106. #define PRCMU_DISABLE_PLLDSI 0x00000000
  107. #define PRCMU_DSI_RESET_SW 0x00000003
  108. #define PRCMU_PLLDSI_LOCKP_LOCKED 0x3
  109. /*
  110. * mb0_transfer - state needed for mailbox 0 communication.
  111. * @lock: The transaction lock.
  112. */
  113. static struct {
  114. spinlock_t lock;
  115. } mb0_transfer;
  116. /*
  117. * mb5_transfer - state needed for mailbox 5 communication.
  118. * @lock: The transaction lock.
  119. * @work: The transaction completion structure.
  120. * @ack: Reply ("acknowledge") data.
  121. */
  122. static struct {
  123. struct mutex lock;
  124. struct completion work;
  125. struct {
  126. u8 header;
  127. u8 status;
  128. u8 value[4];
  129. } ack;
  130. } mb5_transfer;
  131. /* PRCMU TCDM base IO address. */
  132. static __iomem void *tcdm_base;
  133. /**
  134. * db5500_prcmu_abb_read() - Read register value(s) from the ABB.
  135. * @slave: The I2C slave address.
  136. * @reg: The (start) register address.
  137. * @value: The read out value(s).
  138. * @size: The number of registers to read.
  139. *
  140. * Reads register value(s) from the ABB.
  141. * @size has to be <= 4.
  142. */
  143. int db5500_prcmu_abb_read(u8 slave, u8 reg, u8 *value, u8 size)
  144. {
  145. int r;
  146. if ((size < 1) || (4 < size))
  147. return -EINVAL;
  148. mutex_lock(&mb5_transfer.lock);
  149. while (readl(PRCM_MBOX_CPU_VAL) & MBOX_BIT(5))
  150. cpu_relax();
  151. writeb(slave, PRCM_REQ_MB5_I2C_SLAVE);
  152. writeb(reg, PRCM_REQ_MB5_I2C_REG);
  153. writeb(size, PRCM_REQ_MB5_I2C_SIZE);
  154. writeb(MB5H_I2C_READ, PRCM_REQ_MB5_HEADER);
  155. writel(MBOX_BIT(5), PRCM_MBOX_CPU_SET);
  156. wait_for_completion(&mb5_transfer.work);
  157. r = 0;
  158. if ((mb5_transfer.ack.header == MB5H_I2C_READ) &&
  159. (mb5_transfer.ack.status == RC_SUCCESS))
  160. memcpy(value, mb5_transfer.ack.value, (size_t)size);
  161. else
  162. r = -EIO;
  163. mutex_unlock(&mb5_transfer.lock);
  164. return r;
  165. }
  166. /**
  167. * db5500_prcmu_abb_write() - Write register value(s) to the ABB.
  168. * @slave: The I2C slave address.
  169. * @reg: The (start) register address.
  170. * @value: The value(s) to write.
  171. * @size: The number of registers to write.
  172. *
  173. * Writes register value(s) to the ABB.
  174. * @size has to be <= 4.
  175. */
  176. int db5500_prcmu_abb_write(u8 slave, u8 reg, u8 *value, u8 size)
  177. {
  178. int r;
  179. if ((size < 1) || (4 < size))
  180. return -EINVAL;
  181. mutex_lock(&mb5_transfer.lock);
  182. while (readl(PRCM_MBOX_CPU_VAL) & MBOX_BIT(5))
  183. cpu_relax();
  184. writeb(slave, PRCM_REQ_MB5_I2C_SLAVE);
  185. writeb(reg, PRCM_REQ_MB5_I2C_REG);
  186. writeb(size, PRCM_REQ_MB5_I2C_SIZE);
  187. memcpy_toio(PRCM_REQ_MB5_I2C_DATA, value, size);
  188. writeb(MB5H_I2C_WRITE, PRCM_REQ_MB5_HEADER);
  189. writel(MBOX_BIT(5), PRCM_MBOX_CPU_SET);
  190. wait_for_completion(&mb5_transfer.work);
  191. if ((mb5_transfer.ack.header == MB5H_I2C_WRITE) &&
  192. (mb5_transfer.ack.status == RC_SUCCESS))
  193. r = 0;
  194. else
  195. r = -EIO;
  196. mutex_unlock(&mb5_transfer.lock);
  197. return r;
  198. }
  199. int db5500_prcmu_enable_dsipll(void)
  200. {
  201. int i;
  202. /* Enable DSIPLL_RESETN resets */
  203. writel(PRCMU_RESET_DSIPLL, PRCM_APE_RESETN_CLR);
  204. /* Unclamp DSIPLL in/out */
  205. writel(PRCMU_UNCLAMP_DSIPLL, PRCM_MMIP_LS_CLAMP_CLR);
  206. /* Set DSI PLL FREQ */
  207. writel(PRCMU_PLLDSI_FREQ_SETTING, PRCM_PLLDSI_FREQ);
  208. writel(PRCMU_DSI_PLLOUT_SEL_SETTING,
  209. PRCM_DSI_PLLOUT_SEL);
  210. /* Enable Escape clocks */
  211. writel(PRCMU_ENABLE_ESCAPE_CLOCK_DIV, PRCM_DSITVCLK_DIV);
  212. /* Start DSI PLL */
  213. writel(PRCMU_ENABLE_PLLDSI, PRCM_PLLDSI_ENABLE);
  214. /* Reset DSI PLL */
  215. writel(PRCMU_DSI_RESET_SW, PRCM_DSI_SW_RESET);
  216. for (i = 0; i < 10; i++) {
  217. if ((readl(PRCM_PLLDSI_LOCKP) &
  218. PRCMU_PLLDSI_LOCKP_LOCKED) == PRCMU_PLLDSI_LOCKP_LOCKED)
  219. break;
  220. udelay(100);
  221. }
  222. /* Release DSIPLL_RESETN */
  223. writel(PRCMU_RESET_DSIPLL, PRCM_APE_RESETN_SET);
  224. return 0;
  225. }
  226. int db5500_prcmu_disable_dsipll(void)
  227. {
  228. /* Disable dsi pll */
  229. writel(PRCMU_DISABLE_PLLDSI, PRCM_PLLDSI_ENABLE);
  230. /* Disable escapeclock */
  231. writel(PRCMU_DISABLE_ESCAPE_CLOCK_DIV, PRCM_DSITVCLK_DIV);
  232. return 0;
  233. }
  234. int db5500_prcmu_set_display_clocks(void)
  235. {
  236. /* HDMI and TVCLK Should be handled somewhere else */
  237. /* PLLDIV=8, PLLSW=2, CLKEN=1 */
  238. writel(PRCMU_DSI_CLOCK_SETTING, PRCM_HDMICLK_MGT);
  239. /* PLLDIV=14, PLLSW=2, CLKEN=1 */
  240. writel(PRCMU_DSI_LP_CLOCK_SETTING, PRCM_TVCLK_MGT);
  241. return 0;
  242. }
  243. static void ack_dbb_wakeup(void)
  244. {
  245. unsigned long flags;
  246. spin_lock_irqsave(&mb0_transfer.lock, flags);
  247. while (readl(PRCM_MBOX_CPU_VAL) & MBOX_BIT(0))
  248. cpu_relax();
  249. writeb(RMB0H_RD_WAKE_UP_ACK, PRCM_REQ_MB0_HEADER);
  250. writel(MBOX_BIT(0), PRCM_MBOX_CPU_SET);
  251. spin_unlock_irqrestore(&mb0_transfer.lock, flags);
  252. }
  253. static inline void print_unknown_header_warning(u8 n, u8 header)
  254. {
  255. pr_warning("prcmu: Unknown message header (%d) in mailbox %d.\n",
  256. header, n);
  257. }
  258. static bool read_mailbox_0(void)
  259. {
  260. bool r;
  261. u8 header;
  262. header = readb(PRCM_ACK_MB0_HEADER);
  263. switch (header) {
  264. case AMB0H_WAKE_UP:
  265. r = true;
  266. break;
  267. default:
  268. print_unknown_header_warning(0, header);
  269. r = false;
  270. break;
  271. }
  272. writel(MBOX_BIT(0), PRCM_ARM_IT1_CLEAR);
  273. return r;
  274. }
  275. static bool read_mailbox_1(void)
  276. {
  277. writel(MBOX_BIT(1), PRCM_ARM_IT1_CLEAR);
  278. return false;
  279. }
  280. static bool read_mailbox_2(void)
  281. {
  282. writel(MBOX_BIT(2), PRCM_ARM_IT1_CLEAR);
  283. return false;
  284. }
  285. static bool read_mailbox_3(void)
  286. {
  287. writel(MBOX_BIT(3), PRCM_ARM_IT1_CLEAR);
  288. return false;
  289. }
  290. static bool read_mailbox_4(void)
  291. {
  292. writel(MBOX_BIT(4), PRCM_ARM_IT1_CLEAR);
  293. return false;
  294. }
  295. static bool read_mailbox_5(void)
  296. {
  297. u8 header;
  298. header = readb(PRCM_ACK_MB5_HEADER);
  299. switch (header) {
  300. case MB5H_I2C_READ:
  301. memcpy_fromio(mb5_transfer.ack.value, PRCM_ACK_MB5_I2C_DATA, 4);
  302. case MB5H_I2C_WRITE:
  303. mb5_transfer.ack.header = header;
  304. mb5_transfer.ack.status = readb(PRCM_ACK_MB5_RETURN_CODE);
  305. complete(&mb5_transfer.work);
  306. break;
  307. default:
  308. print_unknown_header_warning(5, header);
  309. break;
  310. }
  311. writel(MBOX_BIT(5), PRCM_ARM_IT1_CLEAR);
  312. return false;
  313. }
  314. static bool read_mailbox_6(void)
  315. {
  316. writel(MBOX_BIT(6), PRCM_ARM_IT1_CLEAR);
  317. return false;
  318. }
  319. static bool read_mailbox_7(void)
  320. {
  321. writel(MBOX_BIT(7), PRCM_ARM_IT1_CLEAR);
  322. return false;
  323. }
  324. static bool (* const read_mailbox[NUM_MB])(void) = {
  325. read_mailbox_0,
  326. read_mailbox_1,
  327. read_mailbox_2,
  328. read_mailbox_3,
  329. read_mailbox_4,
  330. read_mailbox_5,
  331. read_mailbox_6,
  332. read_mailbox_7
  333. };
  334. static irqreturn_t prcmu_irq_handler(int irq, void *data)
  335. {
  336. u32 bits;
  337. u8 n;
  338. irqreturn_t r;
  339. bits = (readl(PRCM_ARM_IT1_VAL) & ALL_MBOX_BITS);
  340. if (unlikely(!bits))
  341. return IRQ_NONE;
  342. r = IRQ_HANDLED;
  343. for (n = 0; bits; n++) {
  344. if (bits & MBOX_BIT(n)) {
  345. bits -= MBOX_BIT(n);
  346. if (read_mailbox[n]())
  347. r = IRQ_WAKE_THREAD;
  348. }
  349. }
  350. return r;
  351. }
  352. static irqreturn_t prcmu_irq_thread_fn(int irq, void *data)
  353. {
  354. ack_dbb_wakeup();
  355. return IRQ_HANDLED;
  356. }
  357. void __init db5500_prcmu_early_init(void)
  358. {
  359. tcdm_base = __io_address(U5500_PRCMU_TCDM_BASE);
  360. spin_lock_init(&mb0_transfer.lock);
  361. mutex_init(&mb5_transfer.lock);
  362. init_completion(&mb5_transfer.work);
  363. }
  364. /**
  365. * prcmu_fw_init - arch init call for the Linux PRCMU fw init logic
  366. *
  367. */
  368. int __init db5500_prcmu_init(void)
  369. {
  370. int r = 0;
  371. if (ux500_is_svp() || !cpu_is_u5500())
  372. return -ENODEV;
  373. /* Clean up the mailbox interrupts after pre-kernel code. */
  374. writel(ALL_MBOX_BITS, PRCM_ARM_IT1_CLEAR);
  375. r = request_threaded_irq(IRQ_DB5500_PRCMU1, prcmu_irq_handler,
  376. prcmu_irq_thread_fn, 0, "prcmu", NULL);
  377. if (r < 0) {
  378. pr_err("prcmu: Failed to allocate IRQ_DB5500_PRCMU1.\n");
  379. return -EBUSY;
  380. }
  381. return 0;
  382. }
  383. arch_initcall(db5500_prcmu_init);