prcmu.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  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. * U8500 PRCMU driver.
  8. */
  9. #include <linux/kernel.h>
  10. #include <linux/module.h>
  11. #include <linux/errno.h>
  12. #include <linux/err.h>
  13. #include <linux/io.h>
  14. #include <linux/mutex.h>
  15. #include <linux/completion.h>
  16. #include <linux/jiffies.h>
  17. #include <linux/bitops.h>
  18. #include <linux/interrupt.h>
  19. #include <mach/hardware.h>
  20. #include <mach/prcmu-regs.h>
  21. /* Global var to runtime determine TCDM base for v2 or v1 */
  22. static __iomem void *tcdm_base;
  23. #define REQ_MB5 (tcdm_base + 0xE44)
  24. #define ACK_MB5 (tcdm_base + 0xDF4)
  25. #define REQ_MB5_I2C_SLAVE_OP (REQ_MB5)
  26. #define REQ_MB5_I2C_HW_BITS (REQ_MB5 + 1)
  27. #define REQ_MB5_I2C_REG (REQ_MB5 + 2)
  28. #define REQ_MB5_I2C_VAL (REQ_MB5 + 3)
  29. #define ACK_MB5_I2C_STATUS (ACK_MB5 + 1)
  30. #define ACK_MB5_I2C_VAL (ACK_MB5 + 3)
  31. #define I2C_WRITE(slave) \
  32. (((slave) << 1) | (cpu_is_u8500v2() ? BIT(6) : 0))
  33. #define I2C_READ(slave) \
  34. (((slave) << 1) | (cpu_is_u8500v2() ? BIT(6) : 0) | BIT(0))
  35. #define I2C_STOP_EN BIT(3)
  36. enum ack_mb5_status {
  37. I2C_WR_OK = 0x01,
  38. I2C_RD_OK = 0x02,
  39. };
  40. #define MBOX_BIT BIT
  41. #define NUM_MBOX 8
  42. static struct {
  43. struct mutex lock;
  44. struct completion work;
  45. bool failed;
  46. struct {
  47. u8 status;
  48. u8 value;
  49. } ack;
  50. } mb5_transfer;
  51. /**
  52. * prcmu_abb_read() - Read register value(s) from the ABB.
  53. * @slave: The I2C slave address.
  54. * @reg: The (start) register address.
  55. * @value: The read out value(s).
  56. * @size: The number of registers to read.
  57. *
  58. * Reads register value(s) from the ABB.
  59. * @size has to be 1 for the current firmware version.
  60. */
  61. int prcmu_abb_read(u8 slave, u8 reg, u8 *value, u8 size)
  62. {
  63. int r;
  64. if (size != 1)
  65. return -EINVAL;
  66. r = mutex_lock_interruptible(&mb5_transfer.lock);
  67. if (r)
  68. return r;
  69. while (readl(PRCM_MBOX_CPU_VAL) & MBOX_BIT(5))
  70. cpu_relax();
  71. writeb(I2C_READ(slave), REQ_MB5_I2C_SLAVE_OP);
  72. writeb(I2C_STOP_EN, REQ_MB5_I2C_HW_BITS);
  73. writeb(reg, REQ_MB5_I2C_REG);
  74. writel(MBOX_BIT(5), PRCM_MBOX_CPU_SET);
  75. if (!wait_for_completion_timeout(&mb5_transfer.work,
  76. msecs_to_jiffies(500))) {
  77. pr_err("prcmu: prcmu_abb_read timed out.\n");
  78. r = -EIO;
  79. goto unlock_and_return;
  80. }
  81. r = ((mb5_transfer.ack.status == I2C_RD_OK) ? 0 : -EIO);
  82. if (!r)
  83. *value = mb5_transfer.ack.value;
  84. unlock_and_return:
  85. mutex_unlock(&mb5_transfer.lock);
  86. return r;
  87. }
  88. EXPORT_SYMBOL(prcmu_abb_read);
  89. /**
  90. * prcmu_abb_write() - Write register value(s) to the ABB.
  91. * @slave: The I2C slave address.
  92. * @reg: The (start) register address.
  93. * @value: The value(s) to write.
  94. * @size: The number of registers to write.
  95. *
  96. * Reads register value(s) from the ABB.
  97. * @size has to be 1 for the current firmware version.
  98. */
  99. int prcmu_abb_write(u8 slave, u8 reg, u8 *value, u8 size)
  100. {
  101. int r;
  102. if (size != 1)
  103. return -EINVAL;
  104. r = mutex_lock_interruptible(&mb5_transfer.lock);
  105. if (r)
  106. return r;
  107. while (readl(PRCM_MBOX_CPU_VAL) & MBOX_BIT(5))
  108. cpu_relax();
  109. writeb(I2C_WRITE(slave), REQ_MB5_I2C_SLAVE_OP);
  110. writeb(I2C_STOP_EN, REQ_MB5_I2C_HW_BITS);
  111. writeb(reg, REQ_MB5_I2C_REG);
  112. writeb(*value, REQ_MB5_I2C_VAL);
  113. writel(MBOX_BIT(5), PRCM_MBOX_CPU_SET);
  114. if (!wait_for_completion_timeout(&mb5_transfer.work,
  115. msecs_to_jiffies(500))) {
  116. pr_err("prcmu: prcmu_abb_write timed out.\n");
  117. r = -EIO;
  118. goto unlock_and_return;
  119. }
  120. r = ((mb5_transfer.ack.status == I2C_WR_OK) ? 0 : -EIO);
  121. unlock_and_return:
  122. mutex_unlock(&mb5_transfer.lock);
  123. return r;
  124. }
  125. EXPORT_SYMBOL(prcmu_abb_write);
  126. static void read_mailbox_0(void)
  127. {
  128. writel(MBOX_BIT(0), PRCM_ARM_IT1_CLEAR);
  129. }
  130. static void read_mailbox_1(void)
  131. {
  132. writel(MBOX_BIT(1), PRCM_ARM_IT1_CLEAR);
  133. }
  134. static void read_mailbox_2(void)
  135. {
  136. writel(MBOX_BIT(2), PRCM_ARM_IT1_CLEAR);
  137. }
  138. static void read_mailbox_3(void)
  139. {
  140. writel(MBOX_BIT(3), PRCM_ARM_IT1_CLEAR);
  141. }
  142. static void read_mailbox_4(void)
  143. {
  144. writel(MBOX_BIT(4), PRCM_ARM_IT1_CLEAR);
  145. }
  146. static void read_mailbox_5(void)
  147. {
  148. mb5_transfer.ack.status = readb(ACK_MB5_I2C_STATUS);
  149. mb5_transfer.ack.value = readb(ACK_MB5_I2C_VAL);
  150. complete(&mb5_transfer.work);
  151. writel(MBOX_BIT(5), PRCM_ARM_IT1_CLEAR);
  152. }
  153. static void read_mailbox_6(void)
  154. {
  155. writel(MBOX_BIT(6), PRCM_ARM_IT1_CLEAR);
  156. }
  157. static void read_mailbox_7(void)
  158. {
  159. writel(MBOX_BIT(7), PRCM_ARM_IT1_CLEAR);
  160. }
  161. static void (* const read_mailbox[NUM_MBOX])(void) = {
  162. read_mailbox_0,
  163. read_mailbox_1,
  164. read_mailbox_2,
  165. read_mailbox_3,
  166. read_mailbox_4,
  167. read_mailbox_5,
  168. read_mailbox_6,
  169. read_mailbox_7
  170. };
  171. static irqreturn_t prcmu_irq_handler(int irq, void *data)
  172. {
  173. u32 bits;
  174. u8 n;
  175. bits = (readl(PRCM_ARM_IT1_VAL) & (MBOX_BIT(NUM_MBOX) - 1));
  176. if (unlikely(!bits))
  177. return IRQ_NONE;
  178. for (n = 0; bits; n++) {
  179. if (bits & MBOX_BIT(n)) {
  180. bits -= MBOX_BIT(n);
  181. read_mailbox[n]();
  182. }
  183. }
  184. return IRQ_HANDLED;
  185. }
  186. void __init prcmu_early_init(void)
  187. {
  188. if (cpu_is_u8500v11() || cpu_is_u8500ed()) {
  189. tcdm_base = __io_address(U8500_PRCMU_TCDM_BASE_V1);
  190. } else if (cpu_is_u8500v2()) {
  191. tcdm_base = __io_address(U8500_PRCMU_TCDM_BASE);
  192. } else {
  193. pr_err("prcmu: Unsupported chip version\n");
  194. BUG();
  195. }
  196. }
  197. static int __init prcmu_init(void)
  198. {
  199. mutex_init(&mb5_transfer.lock);
  200. init_completion(&mb5_transfer.work);
  201. /* Clean up the mailbox interrupts after pre-kernel code. */
  202. writel((MBOX_BIT(NUM_MBOX) - 1), PRCM_ARM_IT1_CLEAR);
  203. return request_irq(IRQ_PRCMU, prcmu_irq_handler, 0, "prcmu", NULL);
  204. }
  205. arch_initcall(prcmu_init);