3250c7fa4f0fa8ae7cf67d0626b19cd785844e98
[linux-3.10.git] / arch / arm / mach-tegra / board-touch-raydium_spi.c
1 /*
2  * arch/arm/mach-tegra/board-touch-raydium_spi.c
3  *
4  * Copyright (c) 2011, NVIDIA Corporation.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
14  * more details.
15  *
16  * You should have received a copy of the GNU General Public License along
17  * with this program; if not, write to the Free Software Foundation, Inc.,
18  * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19  */
20
21 #include <linux/errno.h>
22 #include <linux/kernel.h>
23 #include <linux/spi/spi.h>
24 #include <linux/delay.h>
25 #include <linux/gpio.h>
26 #include <linux/spi/rm31080a_ts.h>
27
28 #include <mach/gpio-tegra.h>
29
30 /* Raydium touchscreen                     Driver data */
31 /*-----------------------------------------------------*/
32 static const u8 rm31080_config_cardhu[] = {
33         0x00, 0x00, 0x00, 0x00, 0x30, 0x1e, 0x20, 0x0f,
34         0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x08,
35         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
36         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
37         0x10, 0x10, 0x06, 0x06, 0x04, 0x01, 0x02, 0x00,
38         0x00, 0x0a, 0x00, 0xd5, 0x2b, 0x00, 0x00, 0x09,
39         0x2c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
40         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
41         0x28, 0xf8, 0x50, 0xce, 0x0a, 0x0c, 0x00, 0x00,
42         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
43         0x16, 0x1b, 0x14, 0x16, 0x16, 0x18, 0x32, 0x19,
44         0x1d, 0x08, 0x30, 0x19, 0x10, 0xf6, 0xe2, 0x08,
45         0x28, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00,
46         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
47         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
48         0x00, 0x21, 0x00, 0x00, 0x21, 0x00, 0x00, 0x21,
49         0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00,
50         0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x80,
51         0x00, 0xc0, 0x00, 0xc2, 0x00, 0xf0, 0xed, 0x02,
52         0xed, 0x02, 0x00, 0x90, 0x0a, 0x06, 0x80, 0x02,
53         0x00, 0x04, 0x00, 0x20, 0x03, 0x02, 0x08, 0x03,
54         0x10, 0x20, 0x20, 0x40, 0x10, 0x00, 0x00, 0x00,
55         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
56         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
57         0x10, 0x10, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00,
58         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
59         0x50, 0x80, 0x02, 0x02, 0x02, 0x00, 0x00, 0x33,
60         0x32, 0x00, 0x01, 0x4c, 0xfa, 0x00, 0x00, 0x43,
61         0x3c, 0x00, 0x01, 0x38, 0xe6, 0x00, 0x00, 0x26,
62         0x19, 0x00, 0x02, 0x66, 0x19, 0x00, 0x02, 0x50,
63         0x64, 0x00, 0x00, 0x36, 0x4a, 0x00, 0x00, 0x0c,
64         0x19, 0x00, 0x02, 0x64, 0x96, 0xab, 0x88, 0x78,
65         0x88, 0x78, 0x04, 0x0f, 0x38, 0xff, 0x02, 0x04,
66         0x80, 0xe0, 0x13, 0x01, 0x00, 0x44, 0x61, 0x12,
67         0x41, 0x00, 0x00, 0x00, 0x00, 0x97, 0x01, 0x0c,
68         0x44, 0x61, 0x12, 0x29, 0x29, 0x41, 0x00, 0x00,
69         0x97, 0x06, 0x0c, 0x12, 0x41, 0x44, 0x52, 0x52,
70         0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
71         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
72         0x00, 0x00, 0x80, 0x80, 0x01, 0x80, 0x01, 0x80,
73         0x22, 0x33, 0x22, 0x33, 0x66, 0x20, 0xff, 0xc9,
74         0x19, 0xd0, 0xd0, 0x44, 0x00, 0x10, 0x00, 0x80,
75         0x05, 0x44, 0xff, 0x00, 0x00, 0x10, 0x50, 0x00,
76         0x00, 0x00, 0x30, 0x00, 0x00, 0x18, 0x18, 0x0f,
77         0x0f, 0xf0, 0xf0, 0x00, 0x00, 0x10, 0x10, 0x00,
78         0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00,
79         0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
80         0x00, 0x00, 0x00, 0x10, 0x01, 0x10, 0x01, 0x02,
81 };
82
83 /* Wintek 7" MB (01.18.10.01.10) */
84 static const u8 rm31080_config_kai_mainboard[] = {
85         0x00, 0x00, 0x00, 0x00, 0x1e, 0x12, 0x20, 0x0f,
86         0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x07,
87         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
88         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
89         0x19, 0x19, 0x06, 0x06, 0x04, 0x10, 0x02, 0x00,
90         0x00, 0x0a, 0x00, 0xd5, 0x2b, 0x00, 0x00, 0x09,
91         0x2c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
92         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
93         0x28, 0xec, 0x5f, 0xce, 0x14, 0x0a, 0x00, 0x00,
94         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
95         0x14, 0x19, 0x14, 0x19, 0x10, 0x10, 0x32, 0x12,
96         0x1d, 0x08, 0x20, 0x19, 0x10, 0xf6, 0xe2, 0x08,
97         0x1c, 0x04, 0x04, 0x20, 0x0f, 0x1c, 0x00, 0x00,
98         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
99         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
100         0x00, 0x28, 0x00, 0x10, 0x22, 0x00, 0x00, 0x21,
101         0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00,
102         0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x60,
103         0x00, 0xa8, 0x00, 0xa8, 0x00, 0xd0, 0xed, 0x02,
104         0xed, 0x02, 0x00, 0x90, 0x0a, 0x06, 0x20, 0x02,
105         0x70, 0x03, 0x20, 0x1b, 0x03, 0x02, 0x08, 0x03,
106         0x10, 0x20, 0x20, 0x40, 0x10, 0x00, 0x00, 0x00,
107         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
108         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
109         0x20, 0x20, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00,
110         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
111         0x50, 0x80, 0x02, 0x02, 0x02, 0x00, 0x00, 0x33,
112         0x32, 0x00, 0x01, 0x60, 0xfa, 0x00, 0x00, 0x43,
113         0x3c, 0x00, 0x01, 0x4c, 0xe6, 0x00, 0x00, 0x26,
114         0x19, 0x00, 0x02, 0x7a, 0x19, 0x00, 0x02, 0x50,
115         0x64, 0x00, 0x00, 0x36, 0x4a, 0x00, 0x00, 0x0c,
116         0x19, 0x00, 0x02, 0x64, 0x96, 0xab, 0x88, 0x78,
117         0x88, 0x78, 0x04, 0x0f, 0x38, 0xff, 0x02, 0x04,
118         0x80, 0xe0, 0x13, 0x02, 0x00, 0x2c, 0x1b, 0x4b,
119         0x2e, 0x00, 0x00, 0x00, 0x00, 0x97, 0x06, 0x0c,
120         0x2c, 0x1b, 0x2e, 0x3c, 0x3c, 0x4b, 0x00, 0x00,
121         0x97, 0x06, 0x0c, 0x12, 0x41, 0x44, 0x52, 0x52,
122         0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
123         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
124         0x00, 0x00, 0x80, 0x80, 0x01, 0x80, 0x01, 0x80,
125         0x21, 0x33, 0x21, 0x33, 0x66, 0x20, 0xff, 0xc9,
126         0x19, 0xd0, 0xd0, 0x44, 0x00, 0x10, 0x00, 0x80,
127         0x05, 0x44, 0xff, 0x00, 0x00, 0x10, 0x50, 0x00,
128         0x00, 0x00, 0x30, 0x00, 0x00, 0x18, 0x18, 0x0f,
129         0x0f, 0xf0, 0xf0, 0x00, 0x00, 0x10, 0x10, 0x00,
130         0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00,
131         0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
132         0x00, 0x00, 0x00, 0x10, 0x01, 0x10, 0x01, 0x02,
133 };
134
135 /* Wintek 7" PCB (01.18.10.01.10), TS IC is on the mainboard */
136 static const u8 rm31080_config_kai_pcb[] = {
137         0x00, 0x00, 0x00, 0x00, 0x1e, 0x12, 0x20, 0x0f,
138         0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x07,
139         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
140         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
141         0x19, 0x19, 0x06, 0x06, 0x04, 0x10, 0x02, 0x00,
142         0x00, 0x0a, 0x00, 0xd5, 0x2b, 0x00, 0x00, 0x09,
143         0x2c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
144         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
145         0x28, 0xec, 0x5f, 0xce, 0x14, 0x0a, 0x00, 0x00,
146         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
147         0x14, 0x19, 0x14, 0x19, 0x10, 0x10, 0x32, 0x12,
148         0x1d, 0x08, 0x20, 0x19, 0x10, 0xf6, 0xe2, 0x08,
149         0x1c, 0x04, 0x04, 0x20, 0x0f, 0x1c, 0x00, 0x00,
150         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
151         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
152         0x00, 0x28, 0x00, 0x10, 0x22, 0x00, 0x00, 0x21,
153         0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00,
154         0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x60,
155         0x00, 0xa8, 0x00, 0xa8, 0x00, 0xd0, 0xed, 0x02,
156         0xed, 0x02, 0x00, 0x90, 0x0a, 0x06, 0x20, 0x02,
157         0x70, 0x03, 0x20, 0x1b, 0x03, 0x02, 0x08, 0x03,
158         0x10, 0x20, 0x20, 0x40, 0x10, 0x00, 0x00, 0x00,
159         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
160         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
161         0x20, 0x20, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00,
162         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
163         0x50, 0x80, 0x02, 0x02, 0x02, 0x00, 0x00, 0x33,
164         0x32, 0x00, 0x01, 0x60, 0xfa, 0x00, 0x00, 0x43,
165         0x3c, 0x00, 0x01, 0x4c, 0xe6, 0x00, 0x00, 0x26,
166         0x19, 0x00, 0x02, 0x7a, 0x19, 0x00, 0x02, 0x50,
167         0x64, 0x00, 0x00, 0x36, 0x4a, 0x00, 0x00, 0x0c,
168         0x19, 0x00, 0x02, 0x64, 0x96, 0xab, 0x88, 0x78,
169         0x88, 0x78, 0x04, 0x0f, 0x38, 0xff, 0x02, 0x04,
170         0x80, 0xe0, 0x13, 0x02, 0x00, 0x28, 0x17, 0x4b,
171         0x2e, 0x00, 0x00, 0x00, 0x00, 0x97, 0x06, 0x0c,
172         0x28, 0x17, 0x2e, 0x3c, 0x3c, 0x4b, 0x00, 0x00,
173         0x97, 0x06, 0x0c, 0x12, 0x41, 0x44, 0x52, 0x52,
174         0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
175         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
176         0x00, 0x00, 0x80, 0x80, 0x01, 0x80, 0x01, 0x80,
177         0x21, 0x33, 0x21, 0x33, 0x66, 0x20, 0xff, 0xc9,
178         0x19, 0xd0, 0xd0, 0x44, 0x00, 0x10, 0x00, 0x80,
179         0x05, 0x44, 0xff, 0x00, 0x00, 0x10, 0x50, 0x00,
180         0x00, 0x00, 0x30, 0x00, 0x00, 0x18, 0x18, 0x0f,
181         0x0f, 0xf0, 0xf0, 0x00, 0x00, 0x10, 0x10, 0x00,
182         0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00,
183         0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
184         0x00, 0x00, 0x00, 0x10, 0x01, 0x10, 0x01, 0x02,
185 };
186
187 struct rm_spi_ts_platform_data rm31080ts_data = {
188         .gpio_reset = 0,
189         .config = 0,
190 };
191
192 struct spi_board_info rm31080a_spi_board[1] = {
193         {
194          .modalias = "rm_ts_spidev",
195          .bus_num = 0,
196          .chip_select = 0,
197          .max_speed_hz = 13 * 1000 * 1000,
198          .mode = SPI_MODE_0,
199          .platform_data = &rm31080ts_data,
200          },
201 };
202
203 int __init touch_init_raydium(int irq_gpio, int reset_gpio, int platform)
204 {
205         int err = 0;
206         tegra_gpio_enable(irq_gpio);
207         gpio_request(irq_gpio, "raydium-irq");
208         gpio_direction_input(irq_gpio);
209
210         tegra_gpio_enable(reset_gpio);
211         gpio_request(reset_gpio, "raydium-reset");
212         gpio_direction_output(reset_gpio, 0);
213
214         rm31080ts_data.gpio_reset = reset_gpio;
215
216         msleep(1);
217         gpio_set_value(reset_gpio, 1);
218         msleep(100);
219
220         rm31080a_spi_board[0].irq = gpio_to_irq(irq_gpio);
221
222         switch (platform) {
223         case 0:
224                 pr_info("Raydium Kai PCB based touch init\n");
225                 rm31080ts_data.config = rm31080_config_kai_pcb;
226                 break;
227         case 1:
228                 pr_info("Raydium Kai On-Board touch init\n");
229                 rm31080ts_data.config = rm31080_config_kai_mainboard;
230                 break;
231         case 2:
232                 pr_info("Raydium cardhu touch init\n");
233                 rm31080ts_data.config = rm31080_config_cardhu;
234                 break;
235         default:
236                 pr_err("touch_id error, no touch\n");
237                 err = -ENODEV;
238         }
239
240         if(!err)
241                 spi_register_board_info(rm31080a_spi_board,
242                                 ARRAY_SIZE(rm31080a_spi_board));
243
244         return err;
245 }