2 * Copyright (C) STMicroelectronics 2009
3 * Copyright (C) ST-Ericsson SA 2010
5 * License Terms: GNU General Public License v2
6 * Author: Kumar Sanghvi <kumar.sanghvi@stericsson.com>
7 * Author: Sundar Iyer <sundar.iyer@stericsson.com>
8 * Author: Mattias Nilsson <mattias.i.nilsson@stericsson.com>
10 * U8500 PRCM Unit interface driver
13 #include <linux/kernel.h>
14 #include <linux/module.h>
15 #include <linux/errno.h>
16 #include <linux/err.h>
18 #include <linux/mutex.h>
19 #include <linux/completion.h>
20 #include <linux/jiffies.h>
21 #include <linux/bitops.h>
22 #include <linux/interrupt.h>
24 #include <mach/hardware.h>
25 #include <mach/prcmu-regs.h>
26 #include <mach/prcmu-defs.h>
28 /* Global var to runtime determine TCDM base for v2 or v1 */
29 static __iomem
void *tcdm_base
;
31 #define _MBOX_HEADER (tcdm_base + 0xFE8)
32 #define MBOX_HEADER_REQ_MB0 (_MBOX_HEADER + 0x0)
34 #define REQ_MB1 (tcdm_base + 0xFD0)
35 #define REQ_MB5 (tcdm_base + 0xE44)
37 #define REQ_MB1_ARMOPP (REQ_MB1 + 0x0)
38 #define REQ_MB1_APEOPP (REQ_MB1 + 0x1)
39 #define REQ_MB1_BOOSTOPP (REQ_MB1 + 0x2)
41 #define ACK_MB1 (tcdm_base + 0xE04)
42 #define ACK_MB5 (tcdm_base + 0xDF4)
44 #define ACK_MB1_CURR_ARMOPP (ACK_MB1 + 0x0)
45 #define ACK_MB1_CURR_APEOPP (ACK_MB1 + 0x1)
47 #define REQ_MB5_I2C_SLAVE_OP (REQ_MB5)
48 #define REQ_MB5_I2C_HW_BITS (REQ_MB5 + 1)
49 #define REQ_MB5_I2C_REG (REQ_MB5 + 2)
50 #define REQ_MB5_I2C_VAL (REQ_MB5 + 3)
52 #define ACK_MB5_I2C_STATUS (ACK_MB5 + 1)
53 #define ACK_MB5_I2C_VAL (ACK_MB5 + 3)
55 #define PRCM_AVS_VARM_MAX_OPP (tcdm_base + 0x2E4)
56 #define PRCM_AVS_ISMODEENABLE 7
57 #define PRCM_AVS_ISMODEENABLE_MASK (1 << PRCM_AVS_ISMODEENABLE)
59 #define I2C_WRITE(slave) \
60 (((slave) << 1) | (cpu_is_u8500v2() ? BIT(6) : 0))
61 #define I2C_READ(slave) \
62 (((slave) << 1) | (cpu_is_u8500v2() ? BIT(6) : 0) | BIT(0))
63 #define I2C_STOP_EN BIT(3)
73 struct completion work
;
92 struct completion work
;
101 * prcmu_abb_read() - Read register value(s) from the ABB.
102 * @slave: The I2C slave address.
103 * @reg: The (start) register address.
104 * @value: The read out value(s).
105 * @size: The number of registers to read.
107 * Reads register value(s) from the ABB.
108 * @size has to be 1 for the current firmware version.
110 int prcmu_abb_read(u8 slave
, u8 reg
, u8
*value
, u8 size
)
117 r
= mutex_lock_interruptible(&mb5_transfer
.lock
);
121 while (readl(PRCM_MBOX_CPU_VAL
) & MBOX_BIT(5))
124 writeb(I2C_READ(slave
), REQ_MB5_I2C_SLAVE_OP
);
125 writeb(I2C_STOP_EN
, REQ_MB5_I2C_HW_BITS
);
126 writeb(reg
, REQ_MB5_I2C_REG
);
128 writel(MBOX_BIT(5), PRCM_MBOX_CPU_SET
);
129 if (!wait_for_completion_timeout(&mb5_transfer
.work
,
130 msecs_to_jiffies(500))) {
131 pr_err("prcmu: prcmu_abb_read timed out.\n");
133 goto unlock_and_return
;
135 r
= ((mb5_transfer
.ack
.status
== I2C_RD_OK
) ? 0 : -EIO
);
137 *value
= mb5_transfer
.ack
.value
;
140 mutex_unlock(&mb5_transfer
.lock
);
143 EXPORT_SYMBOL(prcmu_abb_read
);
146 * prcmu_abb_write() - Write register value(s) to the ABB.
147 * @slave: The I2C slave address.
148 * @reg: The (start) register address.
149 * @value: The value(s) to write.
150 * @size: The number of registers to write.
152 * Reads register value(s) from the ABB.
153 * @size has to be 1 for the current firmware version.
155 int prcmu_abb_write(u8 slave
, u8 reg
, u8
*value
, u8 size
)
162 r
= mutex_lock_interruptible(&mb5_transfer
.lock
);
167 while (readl(PRCM_MBOX_CPU_VAL
) & MBOX_BIT(5))
170 writeb(I2C_WRITE(slave
), REQ_MB5_I2C_SLAVE_OP
);
171 writeb(I2C_STOP_EN
, REQ_MB5_I2C_HW_BITS
);
172 writeb(reg
, REQ_MB5_I2C_REG
);
173 writeb(*value
, REQ_MB5_I2C_VAL
);
175 writel(MBOX_BIT(5), PRCM_MBOX_CPU_SET
);
176 if (!wait_for_completion_timeout(&mb5_transfer
.work
,
177 msecs_to_jiffies(500))) {
178 pr_err("prcmu: prcmu_abb_write timed out.\n");
180 goto unlock_and_return
;
182 r
= ((mb5_transfer
.ack
.status
== I2C_WR_OK
) ? 0 : -EIO
);
185 mutex_unlock(&mb5_transfer
.lock
);
188 EXPORT_SYMBOL(prcmu_abb_write
);
190 static int set_ape_cpu_opps(u8 header
, enum prcmu_ape_opp ape_opp
,
191 enum prcmu_cpu_opp cpu_opp
)
197 do_ape
= ((header
== MB1H_APE_OPP
) || (header
== MB1H_ARM_APE_OPP
));
198 do_arm
= ((header
== MB1H_ARM_OPP
) || (header
== MB1H_ARM_APE_OPP
));
200 mutex_lock(&mb1_transfer
.lock
);
202 while (readl(PRCM_MBOX_CPU_VAL
) & MBOX_BIT(1))
205 writeb(0, MBOX_HEADER_REQ_MB0
);
206 writeb(cpu_opp
, REQ_MB1_ARMOPP
);
207 writeb(ape_opp
, REQ_MB1_APEOPP
);
208 writeb(0, REQ_MB1_BOOSTOPP
);
209 writel(MBOX_BIT(1), PRCM_MBOX_CPU_SET
);
210 wait_for_completion(&mb1_transfer
.work
);
211 if ((do_ape
) && (mb1_transfer
.ack
.ape_status
!= 0))
213 if ((do_arm
) && (mb1_transfer
.ack
.arm_status
!= 0))
216 mutex_unlock(&mb1_transfer
.lock
);
222 * prcmu_set_ape_opp() - Set the OPP of the APE.
223 * @opp: The OPP to set.
225 * This function sets the OPP of the APE.
227 int prcmu_set_ape_opp(enum prcmu_ape_opp opp
)
229 return set_ape_cpu_opps(MB1H_APE_OPP
, opp
, APE_OPP_NO_CHANGE
);
231 EXPORT_SYMBOL(prcmu_set_ape_opp
);
234 * prcmu_set_cpu_opp() - Set the OPP of the CPU.
235 * @opp: The OPP to set.
237 * This function sets the OPP of the CPU.
239 int prcmu_set_cpu_opp(enum prcmu_cpu_opp opp
)
241 return set_ape_cpu_opps(MB1H_ARM_OPP
, CPU_OPP_NO_CHANGE
, opp
);
243 EXPORT_SYMBOL(prcmu_set_cpu_opp
);
246 * prcmu_set_ape_cpu_opps() - Set the OPPs of the APE and the CPU.
247 * @ape_opp: The APE OPP to set.
248 * @cpu_opp: The CPU OPP to set.
250 * This function sets the OPPs of the APE and the CPU.
252 int prcmu_set_ape_cpu_opps(enum prcmu_ape_opp ape_opp
,
253 enum prcmu_cpu_opp cpu_opp
)
255 return set_ape_cpu_opps(MB1H_ARM_APE_OPP
, ape_opp
, cpu_opp
);
257 EXPORT_SYMBOL(prcmu_set_ape_cpu_opps
);
260 * prcmu_get_ape_opp() - Get the OPP of the APE.
262 * This function gets the OPP of the APE.
264 enum prcmu_ape_opp
prcmu_get_ape_opp(void)
266 return readb(ACK_MB1_CURR_APEOPP
);
268 EXPORT_SYMBOL(prcmu_get_ape_opp
);
271 * prcmu_get_cpu_opp() - Get the OPP of the CPU.
273 * This function gets the OPP of the CPU. The OPP is specified in %%.
274 * PRCMU_OPP_EXT is a special OPP value, not specified in %%.
276 int prcmu_get_cpu_opp(void)
278 return readb(ACK_MB1_CURR_ARMOPP
);
280 EXPORT_SYMBOL(prcmu_get_cpu_opp
);
282 bool prcmu_has_arm_maxopp(void)
284 return (readb(PRCM_AVS_VARM_MAX_OPP
) & PRCM_AVS_ISMODEENABLE_MASK
)
285 == PRCM_AVS_ISMODEENABLE_MASK
;
288 static void read_mailbox_0(void)
290 writel(MBOX_BIT(0), PRCM_ARM_IT1_CLEAR
);
293 static void read_mailbox_1(void)
295 mb1_transfer
.ack
.arm_opp
= readb(ACK_MB1_CURR_ARMOPP
);
296 mb1_transfer
.ack
.ape_opp
= readb(ACK_MB1_CURR_APEOPP
);
297 complete(&mb1_transfer
.work
);
298 writel(MBOX_BIT(1), PRCM_ARM_IT1_CLEAR
);
301 static void read_mailbox_2(void)
303 writel(MBOX_BIT(2), PRCM_ARM_IT1_CLEAR
);
306 static void read_mailbox_3(void)
308 writel(MBOX_BIT(3), PRCM_ARM_IT1_CLEAR
);
311 static void read_mailbox_4(void)
313 writel(MBOX_BIT(4), PRCM_ARM_IT1_CLEAR
);
316 static void read_mailbox_5(void)
318 mb5_transfer
.ack
.status
= readb(ACK_MB5_I2C_STATUS
);
319 mb5_transfer
.ack
.value
= readb(ACK_MB5_I2C_VAL
);
320 complete(&mb5_transfer
.work
);
321 writel(MBOX_BIT(5), PRCM_ARM_IT1_CLEAR
);
324 static void read_mailbox_6(void)
326 writel(MBOX_BIT(6), PRCM_ARM_IT1_CLEAR
);
329 static void read_mailbox_7(void)
331 writel(MBOX_BIT(7), PRCM_ARM_IT1_CLEAR
);
334 static void (* const read_mailbox
[NUM_MBOX
])(void) = {
345 static irqreturn_t
prcmu_irq_handler(int irq
, void *data
)
350 bits
= (readl(PRCM_ARM_IT1_VAL
) & (MBOX_BIT(NUM_MBOX
) - 1));
354 for (n
= 0; bits
; n
++) {
355 if (bits
& MBOX_BIT(n
)) {
363 void __init
prcmu_early_init(void)
365 if (cpu_is_u8500v11() || cpu_is_u8500ed()) {
366 tcdm_base
= __io_address(U8500_PRCMU_TCDM_BASE_V1
);
367 } else if (cpu_is_u8500v2()) {
368 tcdm_base
= __io_address(U8500_PRCMU_TCDM_BASE
);
370 pr_err("prcmu: Unsupported chip version\n");
375 static int __init
prcmu_init(void)
377 if (cpu_is_u8500ed()) {
378 pr_err("prcmu: Unsupported chip version\n");
382 mutex_init(&mb1_transfer
.lock
);
383 init_completion(&mb1_transfer
.work
);
384 mutex_init(&mb5_transfer
.lock
);
385 init_completion(&mb5_transfer
.work
);
387 /* Clean up the mailbox interrupts after pre-kernel code. */
388 writel((MBOX_BIT(NUM_MBOX
) - 1), PRCM_ARM_IT1_CLEAR
);
390 return request_irq(IRQ_DB8500_PRCMU1
, prcmu_irq_handler
, 0,
394 arch_initcall(prcmu_init
);