Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 344598
b: refs/heads/master
c: 4e0397c
h: refs/heads/master
v: v3
  • Loading branch information
Tomi Valkeinen committed Oct 29, 2012
1 parent f56d607 commit 84e1c7c
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 13 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: 04bd8ac14e6c0d4f75be0950c14f9791ffdc76d7
refs/heads/master: 4e0397cfa78913f3da08c0aa8076b6b0a3b262a0
44 changes: 32 additions & 12 deletions trunk/drivers/video/omap2/dss/dispc.c
Original file line number Diff line number Diff line change
Expand Up @@ -497,7 +497,7 @@ static void dispc_restore_context(void)
if (dss_has_feature(FEAT_MGR_LCD3))
RR(CONTROL3);
/* clear spurious SYNC_LOST_DIGIT interrupts */
dispc_write_reg(DISPC_IRQSTATUS, DISPC_IRQ_SYNC_LOST_DIGIT);
dispc_clear_irqstatus(DISPC_IRQ_SYNC_LOST_DIGIT);

/*
* enable last so IRQs won't trigger before
Expand Down Expand Up @@ -3627,11 +3627,35 @@ int dispc_mgr_get_clock_div(enum omap_channel channel,
return 0;
}

u32 dispc_read_irqstatus(void)
{
return dispc_read_reg(DISPC_IRQSTATUS);
}

void dispc_clear_irqstatus(u32 mask)
{
dispc_write_reg(DISPC_IRQSTATUS, mask);
}

u32 dispc_read_irqenable(void)
{
return dispc_read_reg(DISPC_IRQENABLE);
}

void dispc_write_irqenable(u32 mask)
{
u32 old_mask = dispc_read_reg(DISPC_IRQENABLE);

/* clear the irqstatus for newly enabled irqs */
dispc_clear_irqstatus((mask ^ old_mask) & mask);

dispc_write_reg(DISPC_IRQENABLE, mask);
}

/* dispc.irq_lock has to be locked by the caller */
static void _omap_dispc_set_irqs(void)
{
u32 mask;
u32 old_mask;
int i;
struct omap_dispc_isr_data *isr_data;

Expand All @@ -3646,11 +3670,7 @@ static void _omap_dispc_set_irqs(void)
mask |= isr_data->mask;
}

old_mask = dispc_read_reg(DISPC_IRQENABLE);
/* clear the irqstatus for newly enabled irqs */
dispc_write_reg(DISPC_IRQSTATUS, (mask ^ old_mask) & mask);

dispc_write_reg(DISPC_IRQENABLE, mask);
dispc_write_irqenable(mask);
}

int omap_dispc_register_isr(omap_dispc_isr_t isr, void *arg, u32 mask)
Expand Down Expand Up @@ -3777,8 +3797,8 @@ static irqreturn_t omap_dispc_irq_handler(int irq, void *arg)

spin_lock(&dispc.irq_lock);

irqstatus = dispc_read_reg(DISPC_IRQSTATUS);
irqenable = dispc_read_reg(DISPC_IRQENABLE);
irqstatus = dispc_read_irqstatus();
irqenable = dispc_read_irqenable();

/* IRQ is not for us */
if (!(irqstatus & irqenable)) {
Expand All @@ -3797,9 +3817,9 @@ static irqreturn_t omap_dispc_irq_handler(int irq, void *arg)

/* Ack the interrupt. Do it here before clocks are possibly turned
* off */
dispc_write_reg(DISPC_IRQSTATUS, irqstatus);
dispc_clear_irqstatus(irqstatus);
/* flush posted write */
dispc_read_reg(DISPC_IRQSTATUS);
dispc_read_irqstatus();

/* make a copy and unlock, so that isrs can unregister
* themselves */
Expand Down Expand Up @@ -4008,7 +4028,7 @@ static void _omap_dispc_initialize_irq(void)

/* there's SYNC_LOST_DIGIT waiting after enabling the DSS,
* so clear it */
dispc_write_reg(DISPC_IRQSTATUS, dispc_read_reg(DISPC_IRQSTATUS));
dispc_clear_irqstatus(dispc_read_irqstatus());

_omap_dispc_set_irqs();

Expand Down
4 changes: 4 additions & 0 deletions trunk/drivers/video/omap2/dss/dss.h
Original file line number Diff line number Diff line change
Expand Up @@ -397,6 +397,10 @@ void dpi_uninit_platform_driver(void) __exit;
int dispc_init_platform_driver(void) __init;
void dispc_uninit_platform_driver(void) __exit;
void dispc_dump_clocks(struct seq_file *s);
u32 dispc_read_irqstatus(void);
void dispc_clear_irqstatus(u32 mask);
u32 dispc_read_irqenable(void);
void dispc_write_irqenable(u32 mask);

int dispc_runtime_get(void);
void dispc_runtime_put(void);
Expand Down

0 comments on commit 84e1c7c

Please sign in to comment.