diff options
Diffstat (limited to 'recipes/linux/linux-omap-pm/dss2/0118-DSS2-DISPC-fix-locking-issue-with-irq-handling.patch')
-rw-r--r-- | recipes/linux/linux-omap-pm/dss2/0118-DSS2-DISPC-fix-locking-issue-with-irq-handling.patch | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/recipes/linux/linux-omap-pm/dss2/0118-DSS2-DISPC-fix-locking-issue-with-irq-handling.patch b/recipes/linux/linux-omap-pm/dss2/0118-DSS2-DISPC-fix-locking-issue-with-irq-handling.patch new file mode 100644 index 0000000000..c01ece605b --- /dev/null +++ b/recipes/linux/linux-omap-pm/dss2/0118-DSS2-DISPC-fix-locking-issue-with-irq-handling.patch @@ -0,0 +1,54 @@ +From 32720bafdbb70ab9f534d93b75a954c891bed8cc Mon Sep 17 00:00:00 2001 +From: Tomi Valkeinen <tomi.valkeinen@nokia.com> +Date: Sat, 13 Jun 2009 13:38:54 +0300 +Subject: [PATCH 118/146] DSS2: DISPC: fix locking issue with irq handling + +Fix the problem that an irq handler couldn't unregister +itself + +Signed-off-by: Tomi Valkeinen <tomi.valkeinen@nokia.com> +--- + drivers/video/omap2/dss/dispc.c | 12 +++++++++++- + 1 files changed, 11 insertions(+), 1 deletions(-) + +diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c +index 2463bab..4e1da6b 100644 +--- a/drivers/video/omap2/dss/dispc.c ++++ b/drivers/video/omap2/dss/dispc.c +@@ -2732,6 +2732,7 @@ void dispc_irq_handler(void) + u32 handledirqs = 0; + u32 unhandled_errors; + struct omap_dispc_isr_data *isr_data; ++ struct omap_dispc_isr_data registered_isr[DISPC_MAX_NR_ISRS]; + + spin_lock(&dispc.irq_lock); + +@@ -2745,8 +2746,15 @@ void dispc_irq_handler(void) + * off */ + dispc_write_reg(DISPC_IRQSTATUS, irqstatus); + ++ /* make a copy and unlock, so that isrs can unregister ++ * themselves */ ++ memcpy(registered_isr, dispc.registered_isr, ++ sizeof(registered_isr)); ++ ++ spin_unlock(&dispc.irq_lock); ++ + for (i = 0; i < DISPC_MAX_NR_ISRS; i++) { +- isr_data = &dispc.registered_isr[i]; ++ isr_data = ®istered_isr[i]; + + if (!isr_data->isr) + continue; +@@ -2757,6 +2765,8 @@ void dispc_irq_handler(void) + } + } + ++ spin_lock(&dispc.irq_lock); ++ + unhandled_errors = irqstatus & ~handledirqs & dispc.irq_error_mask; + + if (unhandled_errors) { +-- +1.6.2.4 + |