ssb: set the PMU watchdog if available
Some ssb based devices have a PMU and the PMU watchdog register should be used instead of the register in the chip common part, if the device has a PMU. This patch also calculates the maximal number the watchdog could be set to. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
committed by
John W. Linville
parent
f924e1e989
commit
26107309c0
@@ -288,6 +288,24 @@ static u32 ssb_chipco_alp_clock(struct ssb_chipcommon *cc)
|
|||||||
return 20000000;
|
return 20000000;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static u32 ssb_chipco_watchdog_get_max_timer(struct ssb_chipcommon *cc)
|
||||||
|
{
|
||||||
|
u32 nb;
|
||||||
|
|
||||||
|
if (cc->capabilities & SSB_CHIPCO_CAP_PMU) {
|
||||||
|
if (cc->dev->id.revision < 26)
|
||||||
|
nb = 16;
|
||||||
|
else
|
||||||
|
nb = (cc->dev->id.revision >= 37) ? 32 : 24;
|
||||||
|
} else {
|
||||||
|
nb = 28;
|
||||||
|
}
|
||||||
|
if (nb == 32)
|
||||||
|
return 0xffffffff;
|
||||||
|
else
|
||||||
|
return (1 << nb) - 1;
|
||||||
|
}
|
||||||
|
|
||||||
void ssb_chipcommon_init(struct ssb_chipcommon *cc)
|
void ssb_chipcommon_init(struct ssb_chipcommon *cc)
|
||||||
{
|
{
|
||||||
if (!cc->dev)
|
if (!cc->dev)
|
||||||
@@ -405,8 +423,24 @@ void ssb_chipco_timing_init(struct ssb_chipcommon *cc,
|
|||||||
/* Set chip watchdog reset timer to fire in 'ticks' backplane cycles */
|
/* Set chip watchdog reset timer to fire in 'ticks' backplane cycles */
|
||||||
void ssb_chipco_watchdog_timer_set(struct ssb_chipcommon *cc, u32 ticks)
|
void ssb_chipco_watchdog_timer_set(struct ssb_chipcommon *cc, u32 ticks)
|
||||||
{
|
{
|
||||||
/* instant NMI */
|
u32 maxt;
|
||||||
chipco_write32(cc, SSB_CHIPCO_WATCHDOG, ticks);
|
enum ssb_clkmode clkmode;
|
||||||
|
|
||||||
|
maxt = ssb_chipco_watchdog_get_max_timer(cc);
|
||||||
|
if (cc->capabilities & SSB_CHIPCO_CAP_PMU) {
|
||||||
|
if (ticks == 1)
|
||||||
|
ticks = 2;
|
||||||
|
else if (ticks > maxt)
|
||||||
|
ticks = maxt;
|
||||||
|
chipco_write32(cc, SSB_CHIPCO_PMU_WATCHDOG, ticks);
|
||||||
|
} else {
|
||||||
|
clkmode = ticks ? SSB_CLKMODE_FAST : SSB_CLKMODE_DYNAMIC;
|
||||||
|
ssb_chipco_set_clockmode(cc, clkmode);
|
||||||
|
if (ticks > maxt)
|
||||||
|
ticks = maxt;
|
||||||
|
/* instant NMI */
|
||||||
|
chipco_write32(cc, SSB_CHIPCO_WATCHDOG, ticks);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ssb_chipco_irq_mask(struct ssb_chipcommon *cc, u32 mask, u32 value)
|
void ssb_chipco_irq_mask(struct ssb_chipcommon *cc, u32 mask, u32 value)
|
||||||
|
|||||||
Reference in New Issue
Block a user