aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/s3c24xx/patches-2.6.26/1004-resume-timers-wq.patch.patch
blob: a67a5fea4fc4c687479e886a5fcd374da15e9cf5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
From 62bc0d984e5c2778e09094ba2e4d885903c6c35b Mon Sep 17 00:00:00 2001
From: mokopatches <mokopatches@openmoko.org>
Date: Wed, 16 Jul 2008 14:44:10 +0100
Subject: [PATCH] resume-timers-wq.patch
 The initialization of clocks uses mutexes, but we execute the resume in
 an interrupt context. We therefore have to hand this task to a non-interrupt.

Adapted from a patch by Andy Green.
---
 arch/arm/plat-s3c24xx/time.c |   18 +++++++++++++++++-
 1 files changed, 17 insertions(+), 1 deletions(-)

diff --git a/arch/arm/plat-s3c24xx/time.c b/arch/arm/plat-s3c24xx/time.c
index 766473b..f8d307b 100644
--- a/arch/arm/plat-s3c24xx/time.c
+++ b/arch/arm/plat-s3c24xx/time.c
@@ -253,8 +253,24 @@ static void __init s3c2410_timer_init (void)
 	setup_irq(IRQ_TIMER4, &s3c2410_timer_irq);
 }
 
+static void s3c2410_timer_resume_work(struct work_struct *work)
+{
+	s3c2410_timer_setup();
+}
+
+static void s3c2410_timer_resume(void)
+{
+	static DECLARE_WORK(work, s3c2410_timer_resume_work);
+	int res;
+
+	res = schedule_work(&work);
+	if (!res)
+		printk(KERN_ERR
+		    "s3c2410_timer_resume_work already queued ???\n");
+}
+
 struct sys_timer s3c24xx_timer = {
 	.init		= s3c2410_timer_init,
 	.offset		= s3c2410_gettimeoffset,
-	.resume		= s3c2410_timer_setup
+	.resume		= s3c2410_timer_resume,
 };
-- 
1.5.6.3