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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
From 5134afd82f568f1eae133069bc9298e731546bc1 Mon Sep 17 00:00:00 2001
From: Holger Freyther <zecke@openmoko.org>
Date: Sun, 13 Apr 2008 07:25:54 +0100
Subject: [PATCH] Add GPIO -> IRQ for the s3c2410 and add irq_to_gpio to the gpio.h of the Samsung SoC
Use this irq_to_gpio in the neo1973 keyboard driver
---
arch/arm/plat-s3c24xx/gpio.c | 17 +++++++++++++++++
drivers/input/keyboard/neo1973kbd.c | 19 ++++++-------------
include/asm-arm/arch-s3c2410/gpio.h | 1 +
include/asm-arm/arch-s3c2410/hardware.h | 2 ++
4 files changed, 26 insertions(+), 13 deletions(-)
diff --git a/arch/arm/plat-s3c24xx/gpio.c b/arch/arm/plat-s3c24xx/gpio.c
index 7cab212..dfdb33a 100644
--- a/arch/arm/plat-s3c24xx/gpio.c
+++ b/arch/arm/plat-s3c24xx/gpio.c
@@ -188,6 +188,23 @@ int s3c2410_gpio_getirq(unsigned int pin)
EXPORT_SYMBOL(s3c2410_gpio_getirq);
+int s3c2410_irq_to_gpio(unsigned int irq)
+{
+ /* not valid interrupts */
+ if (irq > 15 + IRQ_EINT8)
+ return -1;
+
+ if (irq < IRQ_EINT4)
+ return (irq - IRQ_EINT0) + S3C2410_GPF0;
+
+ if (irq < IRQ_EINT8)
+ return (irq - IRQ_EINT4) + S3C2410_GPF4;
+
+ return (irq - IRQ_EINT8) + S3C2410_GPG0;
+}
+
+EXPORT_SYMBOL(s3c2410_irq_to_gpio);
+
static void pretty_dump(u32 cfg, u32 state, u32 pull,
const char ** function_names_2,
const char ** function_names_3,
diff --git a/drivers/input/keyboard/neo1973kbd.c b/drivers/input/keyboard/neo1973kbd.c
index b413bc8..06fa8e0 100644
--- a/drivers/input/keyboard/neo1973kbd.c
+++ b/drivers/input/keyboard/neo1973kbd.c
@@ -28,16 +28,13 @@
struct neo1973kbd {
struct input_dev *input;
unsigned int suspended;
- int gpio_aux;
- int gpio_hold;
- int gpio_jack;
};
static irqreturn_t neo1973kbd_aux_irq(int irq, void *dev_id)
{
struct neo1973kbd *neo1973kbd_data = dev_id;
- int key_pressed = !gpio_get_value(neo1973kbd_data->gpio_aux);
+ int key_pressed = !gpio_get_value(irq_to_gpio(irq));
input_report_key(neo1973kbd_data->input, KEY_PHONE, key_pressed);
input_sync(neo1973kbd_data->input);
@@ -48,7 +45,7 @@ static irqreturn_t neo1973kbd_hold_irq(int irq, void *dev_id)
{
struct neo1973kbd *neo1973kbd_data = dev_id;
- int key_pressed = gpio_get_value(neo1973kbd_data->gpio_hold);
+ int key_pressed = gpio_get_value(irq_to_gpio(irq));
input_report_key(neo1973kbd_data->input, KEY_PAUSE, key_pressed);
input_sync(neo1973kbd_data->input);
@@ -59,7 +56,7 @@ static irqreturn_t neo1973kbd_headphone_irq(int irq, void *dev_id)
{
struct neo1973kbd *neo1973kbd_data = dev_id;
- int key_pressed = gpio_get_value(neo1973kbd_data->gpio_jack);
+ int key_pressed = gpio_get_value(irq_to_gpio(irq));
input_report_switch(neo1973kbd_data->input,
SW_HEADPHONE_INSERT, key_pressed);
input_sync(neo1973kbd_data->input);
@@ -107,19 +104,15 @@ static int neo1973kbd_probe(struct platform_device *pdev)
if (pdev->resource[0].flags != 0)
return -EINVAL;
- neo1973kbd->gpio_aux = pdev->resource[0].start;
- neo1973kbd->gpio_hold = pdev->resource[1].start;
- neo1973kbd->gpio_jack = pdev->resource[2].start;
-
- irq_aux = gpio_to_irq(neo1973kbd->gpio_aux);
+ irq_aux = gpio_to_irq(pdev->resource[0].start);
if (irq_aux < 0)
return -EINVAL;
- irq_hold = gpio_to_irq(neo1973kbd->gpio_hold);
+ irq_hold = gpio_to_irq(pdev->resource[1].start);
if (irq_hold < 0)
return -EINVAL;
- irq_jack = gpio_to_irq(neo1973kbd->gpio_jack);
+ irq_jack = gpio_to_irq(pdev->resource[2].start);
if (irq_jack < 0)
return -EINVAL;
diff --git a/include/asm-arm/arch-s3c2410/gpio.h b/include/asm-arm/arch-s3c2410/gpio.h
index 7583895..9c8a338 100644
--- a/include/asm-arm/arch-s3c2410/gpio.h
+++ b/include/asm-arm/arch-s3c2410/gpio.h
@@ -61,6 +61,7 @@ static inline int gpio_direction_output(unsigned gpio, int value)
#define gpio_to_irq(gpio) s3c2400_gpio_getirq(gpio)
#else
#define gpio_to_irq(gpio) s3c2410_gpio_getirq(gpio)
+#define irq_to_gpio(irq) s3c2410_irq_to_gpio(irq)
#endif
/* FIXME implement irq_to_gpio() */
diff --git a/include/asm-arm/arch-s3c2410/hardware.h b/include/asm-arm/arch-s3c2410/hardware.h
index 6dadf58..caea511 100644
--- a/include/asm-arm/arch-s3c2410/hardware.h
+++ b/include/asm-arm/arch-s3c2410/hardware.h
@@ -50,6 +50,8 @@ extern unsigned int s3c2410_gpio_getcfg(unsigned int pin);
extern int s3c2410_gpio_getirq(unsigned int pin);
+extern int s3c2410_irq_to_gpio(unsigned int irq);
+
#ifdef CONFIG_CPU_S3C2400
extern int s3c2400_gpio_getirq(unsigned int pin);
--
1.5.6.5
|