summaryrefslogtreecommitdiff
path: root/packages/linux/linux-rp-2.6.24/sharpsl-rc-r2.patch
blob: 3927ffeccf026a542750ab0612d29d111def3df4 (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
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
This patch adds support for Sharp CE-RH2 on Akita and CE-RH1 on C7x0.

This patch is a bit ugly:
- Device specific functions should be moved to platform infrastructure.
- Maybe define generic *_scoopexp functions handling Akita x Spitz differences.

Index: linux-2.6.24/drivers/input/keyboard/sharpsl_rc.c
===================================================================
--- linux-2.6.24.orig/drivers/input/keyboard/sharpsl_rc.c	2008-03-07 20:47:28.000000000 +0000
+++ linux-2.6.24/drivers/input/keyboard/sharpsl_rc.c	2008-03-07 22:36:40.000000000 +0000
@@ -21,12 +21,10 @@
 #include <linux/module.h>
 #include <linux/slab.h>
 
-#ifdef CONFIG_MACH_SPITZ
+#include <asm/mach-types.h>
 #include <asm/arch/spitz.h>
-#endif
-#ifdef CONFIG_MACH_CORGI
+#include <asm/arch/akita.h>
 #include <asm/arch/corgi.h>
-#endif
 
 #include <asm/arch/hardware.h>
 #include <asm/arch/pxa-regs.h>
@@ -42,12 +40,8 @@
 	unsigned char key;
 };
 
-#ifdef CONFIG_MACH_SPITZ
-#define REMOTE_AKIN_PULLUP SPITZ_SCP2_AKIN_PULLUP
-#define REMOTE_SCOOP_DEVICE spitzscoop2_device
-#define REMOTE_GPIO_INT SPITZ_GPIO_AK_INT
-#define REMOTE_IRQ_INT SPITZ_IRQ_GPIO_AK_INT
-static struct remote_control_key remote_keys[] = {
+static struct remote_control_key remote_keys_spitz[] = {
+	/* CE-RH2 values */
 	{ 25, 35, KEY_STOPCD},
 	{ 55, 65, KEY_PLAYPAUSE},
 	{ 85, 95, KEY_NEXTSONG},
@@ -56,23 +50,15 @@
 	{ 180, 190, KEY_MUTE},
 	{ 215, 225, KEY_VOLUMEDOWN},
 };
-#endif
-#ifdef CONFIG_MACH_CORGI
-#define REMOTE_AKIN_PULLUP CORGI_SCP_AKIN_PULLUP
-#define REMOTE_SCOOP_DEVICE corgiscoop_device
-#define REMOTE_GPIO_INT CORGI_GPIO_AK_INT
-#define REMOTE_IRQ_INT CORGI_IRQ_GPIO_AK_INT
-static struct remote_control_key remote_keys[] = {
-    //These need to be fixed for the CE-RH1's values
-	{ 25, 35, KEY_STOPCD},
-	{ 55, 65, KEY_PLAYPAUSE},
-	{ 85, 95, KEY_NEXTSONG},
-	{ 115, 125, KEY_VOLUMEUP},
-	{ 145, 155, KEY_PREVIOUSSONG},
-	{ 180, 190, KEY_MUTE},
-	{ 215, 225, KEY_VOLUMEDOWN},
+static struct remote_control_key remote_keys_corgi[] = {
+	/* CE-RH1 values */
+	{ 27, 35, KEY_STOPCD},
+	{ 7, 13, KEY_PLAYPAUSE},
+	{ 77, 93, KEY_NEXTSONG},
+	{ 115, 132, KEY_VOLUMEUP},
+	{ 46, 58, KEY_PREVIOUSSONG},
+	{ 170, 186, KEY_VOLUMEDOWN},
 };
-#endif
 
 #define RELEASE_HI      230
 #define MAX_EARPHONE    6
@@ -98,9 +84,17 @@
 static int get_remocon_raw(void)
 {
 	int i, val;
+	struct remote_control_key *remote_keys;
+
+	if (machine_is_borzoi() || machine_is_spitz() || machine_is_akita())
+		remote_keys = remote_keys_spitz;
+	else
+		remote_keys = remote_keys_corgi;
 
 	val = sharpsl_pm_pxa_read_max1111(MAX1111_REMCOM);
-	for (i = 0; i < ARRAY_SIZE(remote_keys); ++i) {
+	for (i = 0; i < (machine_is_borzoi() || machine_is_spitz() || machine_is_akita() ?
+			 ARRAY_SIZE(remote_keys_spitz) : ARRAY_SIZE(remote_keys_corgi));
+			 ++i) {
 		if (val >= remote_keys[i].min
 			&& val <= remote_keys[i].max) {
 			printk("get_remocon_raw: VAL=%i, KEY=%i\n", val, remote_keys[i].key);
@@ -121,8 +115,12 @@
 		data->state = 0;
 		data->last_key = 0;
 
-		reset_scoop_gpio(&REMOTE_SCOOP_DEVICE.dev, REMOTE_AKIN_PULLUP);
-
+		if (machine_is_borzoi() || machine_is_spitz())
+			reset_scoop_gpio(&platform_scoop_config->devs[1].dev, SPITZ_SCP2_AKIN_PULLUP);
+		else if (machine_is_akita())
+            		akita_reset_ioexp(&akitaioexp_device.dev, AKITA_IOEXP_AKIN_PULLUP);
+		else
+			reset_scoop_gpio(&platform_scoop_config->devs[0].dev, CORGI_SCP_AKIN_PULLUP);
 		mod_timer(&data->rctimer, jiffies + msecs_to_jiffies(RC_POLL_MS));
 	}
 	return IRQ_HANDLED;
@@ -182,7 +180,12 @@
 	if (timer) {
 		mod_timer(&data->rctimer, jiffies + msecs_to_jiffies(RC_POLL_MS));
 	} else {
-		set_scoop_gpio(&REMOTE_SCOOP_DEVICE.dev, REMOTE_AKIN_PULLUP);
+		if (machine_is_borzoi() || machine_is_spitz())
+			set_scoop_gpio(&platform_scoop_config->devs[1].dev, SPITZ_SCP2_AKIN_PULLUP);
+		else if (machine_is_akita())
+            		akita_set_ioexp(&akitaioexp_device.dev, AKITA_IOEXP_AKIN_PULLUP);
+		else
+			set_scoop_gpio(&platform_scoop_config->devs[0].dev, CORGI_SCP_AKIN_PULLUP);
 		data->handling_press = 0;
 	}
 }
@@ -192,6 +195,7 @@
 	struct sharpsl_rc *sharpsl_rc;
 	struct input_dev *input_dev;
 	int i, ret;
+	struct remote_control_key *remote_keys;
 
 	dev_dbg(&pdev->dev, "sharpsl_rc_probe\n");
 
@@ -225,17 +229,32 @@
 
 	input_dev->evbit[0] = BIT(EV_KEY);
 
-	for (i = 0; i <= ARRAY_SIZE(remote_keys); i++)
+	if (machine_is_borzoi() || machine_is_spitz() || machine_is_akita())
+		remote_keys = remote_keys_spitz;
+	else
+		remote_keys = remote_keys_corgi;
+	for (i = 0; i < (machine_is_borzoi() || machine_is_spitz() || machine_is_akita() ?
+			 ARRAY_SIZE(remote_keys_spitz) : ARRAY_SIZE(remote_keys_corgi));
+			 ++i)
 	  set_bit(remote_keys[i].key, input_dev->keybit);
 
 	input_register_device(sharpsl_rc->input);
 
-	pxa_gpio_mode(REMOTE_GPIO_INT | GPIO_IN);
-	ret = request_irq(REMOTE_IRQ_INT,
-					  sharpsl_rc_interrupt,
-					  IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_SHARED,
-					  "sharpsl_rc",
-					  sharpsl_rc);
+	if (machine_is_borzoi() || machine_is_spitz() || machine_is_akita()) {
+		pxa_gpio_mode(SPITZ_GPIO_AK_INT | GPIO_IN);
+		ret = request_irq(SPITZ_IRQ_GPIO_AK_INT,
+				  sharpsl_rc_interrupt,
+				  IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_SHARED,
+				  "sharpsl_rc",
+				  sharpsl_rc);
+	} else {
+		pxa_gpio_mode(CORGI_GPIO_AK_INT | GPIO_IN);
+		ret = request_irq(CORGI_IRQ_GPIO_AK_INT,
+				  sharpsl_rc_interrupt,
+				  IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_SHARED,
+				  "sharpsl_rc",
+				  sharpsl_rc);
+	}
 	if (ret < 0) {
 		dev_dbg(&pdev->dev, "Can't get IRQ: %d!\n", i);
 		kfree(sharpsl_rc);
@@ -252,7 +271,10 @@
 
 	dev_dbg(&pdev->dev, "sharpsl_rc_remove\n");
 
-	free_irq(REMOTE_IRQ_INT, sharpsl_rc);
+	if (machine_is_borzoi() || machine_is_spitz() || machine_is_akita())
+		free_irq(SPITZ_IRQ_GPIO_AK_INT, sharpsl_rc);
+	else
+		free_irq(CORGI_IRQ_GPIO_AK_INT, sharpsl_rc);
 	del_timer_sync(&sharpsl_rc->rctimer);
 	input_unregister_device(sharpsl_rc->input);
 	kfree(sharpsl_rc);