summaryrefslogtreecommitdiff
path: root/cleopatre/linux-2.6.25.10-spc300
diff options
context:
space:
mode:
authorJérémy Dufour2011-02-07 15:55:13 +0100
committerJérémy Dufour2011-02-08 15:11:04 +0100
commitd5ace8af50961704dc48921aadaa87a1445109f5 (patch)
treec399fa012d46e945141151a7b8f484b44bf275cf /cleopatre/linux-2.6.25.10-spc300
parent25e889a8d94c2acd9bf8a0b37e37b59bdc651a90 (diff)
cleo/linux/drivers/gpio: lock IRQ when doing a spin_lock, refs #2287
Diffstat (limited to 'cleopatre/linux-2.6.25.10-spc300')
-rw-r--r--cleopatre/linux-2.6.25.10-spc300/drivers/gpio/spc300_gpio.c35
1 files changed, 21 insertions, 14 deletions
diff --git a/cleopatre/linux-2.6.25.10-spc300/drivers/gpio/spc300_gpio.c b/cleopatre/linux-2.6.25.10-spc300/drivers/gpio/spc300_gpio.c
index fe905001f7..caa9dd85ce 100644
--- a/cleopatre/linux-2.6.25.10-spc300/drivers/gpio/spc300_gpio.c
+++ b/cleopatre/linux-2.6.25.10-spc300/drivers/gpio/spc300_gpio.c
@@ -272,17 +272,18 @@ int
spc300_gpio_pid_count (struct spc300_gpio *gpio)
{
int count = 0, i = 0;
+ unsigned long flags;
if (NULL == gpio)
return -1;
- spin_lock_irq (&gpio->interrupt.lock);
+ spin_lock_irqsave (&gpio->interrupt.lock, flags);
for (i = 0; i < SPC300_GPIO_PID_MAX_NB; i++)
{
if (-1 != gpio->interrupt.pid[i][0])
count++;
}
- spin_unlock_irq (&gpio->interrupt.lock);
+ spin_unlock_irqrestore (&gpio->interrupt.lock, flags);
return count;
}
@@ -297,11 +298,12 @@ int
spc300_gpio_pid_registered (struct spc300_gpio *gpio)
{
int registered = 0, i = 0;
+ unsigned long flags;
if (NULL == gpio)
return -1;
- spin_lock_irq (&gpio->interrupt.lock);
+ spin_lock_irqsave (&gpio->interrupt.lock, flags);
for (i = 0; i < SPC300_GPIO_PID_MAX_NB; i++)
{
if (current->pid == gpio->interrupt.pid[i][0])
@@ -310,7 +312,7 @@ spc300_gpio_pid_registered (struct spc300_gpio *gpio)
break;
}
}
- spin_unlock_irq (&gpio->interrupt.lock);
+ spin_unlock_irqrestore (&gpio->interrupt.lock, flags);
return registered;
}
@@ -325,11 +327,12 @@ int
spc300_gpio_pid_add (struct spc300_gpio *gpio)
{
int index = 0;
+ unsigned long flags;
if (NULL == gpio)
return -1;
- spin_lock_irq (&gpio->interrupt.lock);
+ spin_lock_irqsave (&gpio->interrupt.lock, flags);
for (index = 0; index < SPC300_GPIO_PID_MAX_NB; index++)
{
if (-1 == gpio->interrupt.pid[index][0])
@@ -339,7 +342,7 @@ spc300_gpio_pid_add (struct spc300_gpio *gpio)
break;
}
}
- spin_unlock_irq (&gpio->interrupt.lock);
+ spin_unlock_irqrestore (&gpio->interrupt.lock, flags);
if (SPC300_GPIO_PID_MAX_NB <= index)
/* Not enough space */
@@ -358,11 +361,12 @@ int
spc300_gpio_pid_remove (struct spc300_gpio *gpio)
{
int i = 0;
+ unsigned long flags;
if (NULL == gpio)
return -1;
- spin_lock_irq (&gpio->interrupt.lock);
+ spin_lock_irqsave (&gpio->interrupt.lock, flags);
for (i = 0; i < SPC300_GPIO_PID_MAX_NB; i++)
{
if (current->pid == gpio->interrupt.pid[i][0])
@@ -372,7 +376,7 @@ spc300_gpio_pid_remove (struct spc300_gpio *gpio)
gpio->interrupt.pid[i][1] = 0;
}
}
- spin_unlock_irq (&gpio->interrupt.lock);
+ spin_unlock_irqrestore (&gpio->interrupt.lock, flags);
return 0;
}
@@ -381,11 +385,12 @@ int
spc300_gpio_pid_set_raw_status (struct spc300_gpio *gpio, int raw_status)
{
int i = 0;
+ unsigned long flags;
if (NULL == gpio)
return -1;
- spin_lock_irq (&gpio->interrupt.lock);
+ spin_lock_irqsave (&gpio->interrupt.lock, flags);
for (i = 0; i < SPC300_GPIO_PID_MAX_NB; i++)
{
if (-1 != gpio->interrupt.pid[i][0])
@@ -393,7 +398,7 @@ spc300_gpio_pid_set_raw_status (struct spc300_gpio *gpio, int raw_status)
gpio->interrupt.pid[i][1] |= raw_status;
}
}
- spin_unlock_irq (&gpio->interrupt.lock);
+ spin_unlock_irqrestore (&gpio->interrupt.lock, flags);
return 0;
}
@@ -402,11 +407,12 @@ int
spc300_gpio_pid_get_raw_status (struct spc300_gpio *gpio)
{
int i = 0, raw_status = 0;
+ unsigned long flags;
if (NULL == gpio)
return -1;
- spin_lock_irq (&gpio->interrupt.lock);
+ spin_lock_irqsave (&gpio->interrupt.lock, flags);
for (i = 0; i < SPC300_GPIO_PID_MAX_NB; i++)
{
if (current->pid == gpio->interrupt.pid[i][0])
@@ -415,7 +421,7 @@ spc300_gpio_pid_get_raw_status (struct spc300_gpio *gpio)
break;
}
}
- spin_unlock_irq (&gpio->interrupt.lock);
+ spin_unlock_irqrestore (&gpio->interrupt.lock, flags);
return raw_status;
}
@@ -424,11 +430,12 @@ int
spc300_gpio_pid_reset_raw_status (struct spc300_gpio *gpio)
{
int i = 0;
+ unsigned long flags;
if (NULL == gpio)
return -1;
- spin_lock_irq (&gpio->interrupt.lock);
+ spin_lock_irqsave (&gpio->interrupt.lock, flags);
for (i = 0; i < SPC300_GPIO_PID_MAX_NB; i++)
{
if (current->pid == gpio->interrupt.pid[i][0])
@@ -436,7 +443,7 @@ spc300_gpio_pid_reset_raw_status (struct spc300_gpio *gpio)
gpio->interrupt.pid[i][1] = 0;
}
}
- spin_unlock_irq (&gpio->interrupt.lock);
+ spin_unlock_irqrestore (&gpio->interrupt.lock, flags);
return 0;
}