Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 339933
b: refs/heads/master
c: ae6672c
h: refs/heads/master
i:
  339931: 3ed3483
v: v3
  • Loading branch information
Jon Hunter committed Nov 16, 2012
1 parent acc19a5 commit f58a3c3
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 43 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 9dc57643738f9fbe45c10cc062903d5dfda5bdd9
refs/heads/master: ae6672cb47c8a7652e9aff182eb85a15994c9487
50 changes: 31 additions & 19 deletions trunk/arch/arm/plat-omap/dmtimer.c
Original file line number Diff line number Diff line change
Expand Up @@ -99,32 +99,39 @@ static void omap_timer_restore_context(struct omap_dm_timer *timer)
timer->context.tclr);
}

static void omap_dm_timer_wait_for_reset(struct omap_dm_timer *timer)
static int omap_dm_timer_reset(struct omap_dm_timer *timer)
{
int c;
u32 l, timeout = 100000;

if (!timer->sys_stat)
return;
if (timer->revision != 1)
return -EINVAL;

c = 0;
while (!(__raw_readl(timer->sys_stat) & 1)) {
c++;
if (c > 100000) {
printk(KERN_ERR "Timer failed to reset\n");
return;
}
omap_dm_timer_write_reg(timer, OMAP_TIMER_IF_CTRL_REG, 0x06);

do {
l = __omap_dm_timer_read(timer,
OMAP_TIMER_V1_SYS_STAT_OFFSET, 0);
} while (!l && timeout--);

if (!timeout) {
dev_err(&timer->pdev->dev, "Timer failed to reset\n");
return -ETIMEDOUT;
}
}

static void omap_dm_timer_reset(struct omap_dm_timer *timer)
{
omap_dm_timer_write_reg(timer, OMAP_TIMER_IF_CTRL_REG, 0x06);
omap_dm_timer_wait_for_reset(timer);
__omap_dm_timer_reset(timer, 0, 0);
/* Configure timer for smart-idle mode */
l = __omap_dm_timer_read(timer, OMAP_TIMER_OCP_CFG_OFFSET, 0);
l |= 0x2 << 0x3;
__omap_dm_timer_write(timer, OMAP_TIMER_OCP_CFG_OFFSET, l, 0);

timer->posted = 0;

return 0;
}

int omap_dm_timer_prepare(struct omap_dm_timer *timer)
{
int rc;

/*
* FIXME: OMAP1 devices do not use the clock framework for dmtimers so
* do not call clk_get() for these devices.
Expand All @@ -140,8 +147,13 @@ int omap_dm_timer_prepare(struct omap_dm_timer *timer)

omap_dm_timer_enable(timer);

if (timer->capability & OMAP_TIMER_NEEDS_RESET)
omap_dm_timer_reset(timer);
if (timer->capability & OMAP_TIMER_NEEDS_RESET) {
rc = omap_dm_timer_reset(timer);
if (rc) {
omap_dm_timer_disable(timer);
return rc;
}
}

__omap_dm_timer_enable_posted(timer);
omap_dm_timer_disable(timer);
Expand Down
23 changes: 0 additions & 23 deletions trunk/arch/arm/plat-omap/include/plat/dmtimer.h
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,6 @@ struct omap_dm_timer {
struct clk *fclk;

void __iomem *io_base;
void __iomem *sys_stat; /* TISTAT timer status */
void __iomem *irq_stat; /* TISR/IRQSTATUS interrupt status */
void __iomem *irq_ena; /* irq enable */
void __iomem *irq_dis; /* irq disable, only on v2 ip */
Expand Down Expand Up @@ -317,16 +316,13 @@ static inline void __omap_dm_timer_init_regs(struct omap_dm_timer *timer)
tidr = __raw_readl(timer->io_base);
if (!(tidr >> 16)) {
timer->revision = 1;
timer->sys_stat = timer->io_base +
OMAP_TIMER_V1_SYS_STAT_OFFSET;
timer->irq_stat = timer->io_base + OMAP_TIMER_V1_STAT_OFFSET;
timer->irq_ena = timer->io_base + OMAP_TIMER_V1_INT_EN_OFFSET;
timer->irq_dis = timer->io_base + OMAP_TIMER_V1_INT_EN_OFFSET;
timer->pend = timer->io_base + _OMAP_TIMER_WRITE_PEND_OFFSET;
timer->func_base = timer->io_base;
} else {
timer->revision = 2;
timer->sys_stat = NULL;
timer->irq_stat = timer->io_base + OMAP_TIMER_V2_IRQSTATUS;
timer->irq_ena = timer->io_base + OMAP_TIMER_V2_IRQENABLE_SET;
timer->irq_dis = timer->io_base + OMAP_TIMER_V2_IRQENABLE_CLR;
Expand All @@ -337,25 +333,6 @@ static inline void __omap_dm_timer_init_regs(struct omap_dm_timer *timer)
}
}

/* Assumes the source clock has been set by caller */
static inline void __omap_dm_timer_reset(struct omap_dm_timer *timer,
int autoidle, int wakeup)
{
u32 l;

l = __raw_readl(timer->io_base + OMAP_TIMER_OCP_CFG_OFFSET);
l |= 0x02 << 3; /* Set to smart-idle mode */
l |= 0x2 << 8; /* Set clock activity to perserve f-clock on idle */

if (autoidle)
l |= 0x1 << 0;

if (wakeup)
l |= 1 << 2;

__raw_writel(l, timer->io_base + OMAP_TIMER_OCP_CFG_OFFSET);
}

/*
* __omap_dm_timer_enable_posted - enables write posted mode
* @timer: pointer to timer instance handle
Expand Down

0 comments on commit f58a3c3

Please sign in to comment.