Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 273429
b: refs/heads/master
c: 84165b8
h: refs/heads/master
i:
  273427: 2672049
v: v3
  • Loading branch information
Jonas Aberg authored and Samuel Ortiz committed Oct 24, 2011
1 parent 898d1c3 commit cef202c
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 0b9199e3186e1998a8e066fbcf15bcf18cdbfc42
refs/heads/master: 84165b805972320050892e34fa28d09fe86a25eb
72 changes: 72 additions & 0 deletions trunk/drivers/mfd/db8500-prcmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -1543,6 +1543,78 @@ int prcmu_stop_temp_sense(void)
return config_hot_period(0xFFFF);
}

static int prcmu_a9wdog(u8 cmd, u8 d0, u8 d1, u8 d2, u8 d3)
{

mutex_lock(&mb4_transfer.lock);

while (readl(PRCM_MBOX_CPU_VAL) & MBOX_BIT(4))
cpu_relax();

writeb(d0, (tcdm_base + PRCM_REQ_MB4_A9WDOG_0));
writeb(d1, (tcdm_base + PRCM_REQ_MB4_A9WDOG_1));
writeb(d2, (tcdm_base + PRCM_REQ_MB4_A9WDOG_2));
writeb(d3, (tcdm_base + PRCM_REQ_MB4_A9WDOG_3));

writeb(cmd, (tcdm_base + PRCM_MBOX_HEADER_REQ_MB4));

writel(MBOX_BIT(4), PRCM_MBOX_CPU_SET);
wait_for_completion(&mb4_transfer.work);

mutex_unlock(&mb4_transfer.lock);

return 0;

}

int prcmu_config_a9wdog(u8 num, bool sleep_auto_off)
{
BUG_ON(num == 0 || num > 0xf);
return prcmu_a9wdog(MB4H_A9WDOG_CONF, num, 0, 0,
sleep_auto_off ? A9WDOG_AUTO_OFF_EN :
A9WDOG_AUTO_OFF_DIS);
}

int prcmu_enable_a9wdog(u8 id)
{
return prcmu_a9wdog(MB4H_A9WDOG_EN, id, 0, 0, 0);
}

int prcmu_disable_a9wdog(u8 id)
{
return prcmu_a9wdog(MB4H_A9WDOG_DIS, id, 0, 0, 0);
}

int prcmu_kick_a9wdog(u8 id)
{
return prcmu_a9wdog(MB4H_A9WDOG_KICK, id, 0, 0, 0);
}

/*
* timeout is 28 bit, in ms.
*/
#define MAX_WATCHDOG_TIMEOUT 131000
int prcmu_load_a9wdog(u8 id, u32 timeout)
{
if (timeout > MAX_WATCHDOG_TIMEOUT)
/*
* Due to calculation bug in prcmu fw, timeouts
* can't be bigger than 131 seconds.
*/
return -EINVAL;

return prcmu_a9wdog(MB4H_A9WDOG_LOAD,
(id & A9WDOG_ID_MASK) |
/*
* Put the lowest 28 bits of timeout at
* offset 4. Four first bits are used for id.
*/
(u8)((timeout << 4) & 0xf0),
(u8)((timeout >> 4) & 0xff),
(u8)((timeout >> 12) & 0xff),
(u8)((timeout >> 20) & 0xff));
}

/**
* prcmu_set_clock_divider() - Configure the clock divider.
* @clock: The clock for which the request is made.
Expand Down

0 comments on commit cef202c

Please sign in to comment.