diff options
Diffstat (limited to 'meta/recipes-kernel/linux/linux-rp-2.6.24/sharpsl-rc-r2.patch')
-rw-r--r-- | meta/recipes-kernel/linux/linux-rp-2.6.24/sharpsl-rc-r2.patch | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/meta/recipes-kernel/linux/linux-rp-2.6.24/sharpsl-rc-r2.patch b/meta/recipes-kernel/linux/linux-rp-2.6.24/sharpsl-rc-r2.patch new file mode 100644 index 0000000000..6fb34ec179 --- /dev/null +++ b/meta/recipes-kernel/linux/linux-rp-2.6.24/sharpsl-rc-r2.patch | |||
@@ -0,0 +1,180 @@ | |||
1 | This patch adds support for Sharp CE-RH2 on Akita and CE-RH1 on C7x0. | ||
2 | |||
3 | This patch is a bit ugly: | ||
4 | - Device specific functions should be moved to platform infrastructure. | ||
5 | - Maybe define generic *_scoopexp functions handling Akita x Spitz differences. | ||
6 | |||
7 | Index: linux-2.6.24/drivers/input/keyboard/sharpsl_rc.c | ||
8 | =================================================================== | ||
9 | --- linux-2.6.24.orig/drivers/input/keyboard/sharpsl_rc.c 2008-03-08 19:29:02.000000000 +0000 | ||
10 | +++ linux-2.6.24/drivers/input/keyboard/sharpsl_rc.c 2008-03-08 22:23:35.000000000 +0000 | ||
11 | @@ -21,12 +21,10 @@ | ||
12 | #include <linux/module.h> | ||
13 | #include <linux/slab.h> | ||
14 | |||
15 | -#ifdef CONFIG_MACH_SPITZ | ||
16 | +#include <asm/mach-types.h> | ||
17 | #include <asm/arch/spitz.h> | ||
18 | -#endif | ||
19 | -#ifdef CONFIG_MACH_CORGI | ||
20 | +#include <asm/arch/akita.h> | ||
21 | #include <asm/arch/corgi.h> | ||
22 | -#endif | ||
23 | |||
24 | #include <asm/arch/hardware.h> | ||
25 | #include <asm/arch/pxa-regs.h> | ||
26 | @@ -42,12 +40,8 @@ | ||
27 | unsigned char key; | ||
28 | }; | ||
29 | |||
30 | -#ifdef CONFIG_MACH_SPITZ | ||
31 | -#define REMOTE_AKIN_PULLUP SPITZ_SCP2_AKIN_PULLUP | ||
32 | -#define REMOTE_SCOOP_DEVICE spitzscoop2_device | ||
33 | -#define REMOTE_GPIO_INT SPITZ_GPIO_AK_INT | ||
34 | -#define REMOTE_IRQ_INT SPITZ_IRQ_GPIO_AK_INT | ||
35 | -static struct remote_control_key remote_keys[] = { | ||
36 | +static struct remote_control_key remote_keys_spitz[] = { | ||
37 | + /* CE-RH2 values */ | ||
38 | { 25, 35, KEY_STOPCD}, | ||
39 | { 55, 65, KEY_PLAYPAUSE}, | ||
40 | { 85, 95, KEY_NEXTSONG}, | ||
41 | @@ -56,23 +50,15 @@ | ||
42 | { 180, 190, KEY_MUTE}, | ||
43 | { 215, 225, KEY_VOLUMEDOWN}, | ||
44 | }; | ||
45 | -#endif | ||
46 | -#ifdef CONFIG_MACH_CORGI | ||
47 | -#define REMOTE_AKIN_PULLUP CORGI_SCP_AKIN_PULLUP | ||
48 | -#define REMOTE_SCOOP_DEVICE corgiscoop_device | ||
49 | -#define REMOTE_GPIO_INT CORGI_GPIO_AK_INT | ||
50 | -#define REMOTE_IRQ_INT CORGI_IRQ_GPIO_AK_INT | ||
51 | -static struct remote_control_key remote_keys[] = { | ||
52 | - //These need to be fixed for the CE-RH1's values | ||
53 | - { 25, 35, KEY_STOPCD}, | ||
54 | - { 55, 65, KEY_PLAYPAUSE}, | ||
55 | - { 85, 95, KEY_NEXTSONG}, | ||
56 | - { 115, 125, KEY_VOLUMEUP}, | ||
57 | - { 145, 155, KEY_PREVIOUSSONG}, | ||
58 | - { 180, 190, KEY_MUTE}, | ||
59 | - { 215, 225, KEY_VOLUMEDOWN}, | ||
60 | +static struct remote_control_key remote_keys_corgi[] = { | ||
61 | + /* CE-RH1 values */ | ||
62 | + { 27, 35, KEY_STOPCD}, | ||
63 | + { 7, 13, KEY_PLAYPAUSE}, | ||
64 | + { 77, 93, KEY_NEXTSONG}, | ||
65 | + { 115, 132, KEY_VOLUMEUP}, | ||
66 | + { 46, 58, KEY_PREVIOUSSONG}, | ||
67 | + { 170, 186, KEY_VOLUMEDOWN}, | ||
68 | }; | ||
69 | -#endif | ||
70 | |||
71 | #define RELEASE_HI 230 | ||
72 | #define MAX_EARPHONE 6 | ||
73 | @@ -98,9 +84,17 @@ | ||
74 | static int get_remocon_raw(void) | ||
75 | { | ||
76 | int i, val; | ||
77 | + struct remote_control_key *remote_keys; | ||
78 | + | ||
79 | + if (machine_is_borzoi() || machine_is_spitz() || machine_is_akita()) | ||
80 | + remote_keys = remote_keys_spitz; | ||
81 | + else | ||
82 | + remote_keys = remote_keys_corgi; | ||
83 | |||
84 | val = sharpsl_pm_pxa_read_max1111(MAX1111_REMCOM); | ||
85 | - for (i = 0; i < ARRAY_SIZE(remote_keys); ++i) { | ||
86 | + for (i = 0; i < (machine_is_borzoi() || machine_is_spitz() || machine_is_akita() ? | ||
87 | + ARRAY_SIZE(remote_keys_spitz) : ARRAY_SIZE(remote_keys_corgi)); | ||
88 | + ++i) { | ||
89 | if (val >= remote_keys[i].min | ||
90 | && val <= remote_keys[i].max) { | ||
91 | printk("get_remocon_raw: VAL=%i, KEY=%i\n", val, remote_keys[i].key); | ||
92 | @@ -121,8 +115,12 @@ | ||
93 | data->state = 0; | ||
94 | data->last_key = 0; | ||
95 | |||
96 | - reset_scoop_gpio(&REMOTE_SCOOP_DEVICE.dev, REMOTE_AKIN_PULLUP); | ||
97 | - | ||
98 | + if (machine_is_borzoi() || machine_is_spitz()) | ||
99 | + reset_scoop_gpio(platform_scoop_config->devs[1].dev, SPITZ_SCP2_AKIN_PULLUP); | ||
100 | + else if (machine_is_akita()) | ||
101 | + akita_reset_ioexp(&akitaioexp_device.dev, AKITA_IOEXP_AKIN_PULLUP); | ||
102 | + else | ||
103 | + reset_scoop_gpio(platform_scoop_config->devs[0].dev, CORGI_SCP_AKIN_PULLUP); | ||
104 | mod_timer(&data->rctimer, jiffies + msecs_to_jiffies(RC_POLL_MS)); | ||
105 | } | ||
106 | return IRQ_HANDLED; | ||
107 | @@ -182,7 +180,12 @@ | ||
108 | if (timer) { | ||
109 | mod_timer(&data->rctimer, jiffies + msecs_to_jiffies(RC_POLL_MS)); | ||
110 | } else { | ||
111 | - set_scoop_gpio(&REMOTE_SCOOP_DEVICE.dev, REMOTE_AKIN_PULLUP); | ||
112 | + if (machine_is_borzoi() || machine_is_spitz()) | ||
113 | + set_scoop_gpio(platform_scoop_config->devs[1].dev, SPITZ_SCP2_AKIN_PULLUP); | ||
114 | + else if (machine_is_akita()) | ||
115 | + akita_set_ioexp(&akitaioexp_device.dev, AKITA_IOEXP_AKIN_PULLUP); | ||
116 | + else | ||
117 | + set_scoop_gpio(platform_scoop_config->devs[0].dev, CORGI_SCP_AKIN_PULLUP); | ||
118 | data->handling_press = 0; | ||
119 | } | ||
120 | } | ||
121 | @@ -192,6 +195,7 @@ | ||
122 | struct sharpsl_rc *sharpsl_rc; | ||
123 | struct input_dev *input_dev; | ||
124 | int i, ret; | ||
125 | + struct remote_control_key *remote_keys; | ||
126 | |||
127 | dev_dbg(&pdev->dev, "sharpsl_rc_probe\n"); | ||
128 | |||
129 | @@ -225,17 +229,32 @@ | ||
130 | |||
131 | input_dev->evbit[0] = BIT(EV_KEY); | ||
132 | |||
133 | - for (i = 0; i <= ARRAY_SIZE(remote_keys); i++) | ||
134 | + if (machine_is_borzoi() || machine_is_spitz() || machine_is_akita()) | ||
135 | + remote_keys = remote_keys_spitz; | ||
136 | + else | ||
137 | + remote_keys = remote_keys_corgi; | ||
138 | + for (i = 0; i < (machine_is_borzoi() || machine_is_spitz() || machine_is_akita() ? | ||
139 | + ARRAY_SIZE(remote_keys_spitz) : ARRAY_SIZE(remote_keys_corgi)); | ||
140 | + ++i) | ||
141 | set_bit(remote_keys[i].key, input_dev->keybit); | ||
142 | |||
143 | input_register_device(sharpsl_rc->input); | ||
144 | |||
145 | - pxa_gpio_mode(REMOTE_GPIO_INT | GPIO_IN); | ||
146 | - ret = request_irq(REMOTE_IRQ_INT, | ||
147 | - sharpsl_rc_interrupt, | ||
148 | - IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_SHARED, | ||
149 | - "sharpsl_rc", | ||
150 | - sharpsl_rc); | ||
151 | + if (machine_is_borzoi() || machine_is_spitz() || machine_is_akita()) { | ||
152 | + pxa_gpio_mode(SPITZ_GPIO_AK_INT | GPIO_IN); | ||
153 | + ret = request_irq(SPITZ_IRQ_GPIO_AK_INT, | ||
154 | + sharpsl_rc_interrupt, | ||
155 | + IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_SHARED, | ||
156 | + "sharpsl_rc", | ||
157 | + sharpsl_rc); | ||
158 | + } else { | ||
159 | + pxa_gpio_mode(CORGI_GPIO_AK_INT | GPIO_IN); | ||
160 | + ret = request_irq(CORGI_IRQ_GPIO_AK_INT, | ||
161 | + sharpsl_rc_interrupt, | ||
162 | + IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_SHARED, | ||
163 | + "sharpsl_rc", | ||
164 | + sharpsl_rc); | ||
165 | + } | ||
166 | if (ret < 0) { | ||
167 | dev_dbg(&pdev->dev, "Can't get IRQ: %d!\n", i); | ||
168 | kfree(sharpsl_rc); | ||
169 | @@ -252,7 +271,10 @@ | ||
170 | |||
171 | dev_dbg(&pdev->dev, "sharpsl_rc_remove\n"); | ||
172 | |||
173 | - free_irq(REMOTE_IRQ_INT, sharpsl_rc); | ||
174 | + if (machine_is_borzoi() || machine_is_spitz() || machine_is_akita()) | ||
175 | + free_irq(SPITZ_IRQ_GPIO_AK_INT, sharpsl_rc); | ||
176 | + else | ||
177 | + free_irq(CORGI_IRQ_GPIO_AK_INT, sharpsl_rc); | ||
178 | del_timer_sync(&sharpsl_rc->rctimer); | ||
179 | input_unregister_device(sharpsl_rc->input); | ||
180 | kfree(sharpsl_rc); | ||