zssp.c revision 1.10 1 1.10 nonaka /* $NetBSD: zssp.c,v 1.10 2011/06/19 16:20:09 nonaka Exp $ */
2 1.1 ober /* $OpenBSD: zaurus_ssp.c,v 1.6 2005/04/08 21:58:49 uwe Exp $ */
3 1.1 ober
4 1.1 ober /*
5 1.1 ober * Copyright (c) 2005 Uwe Stuehler <uwe (at) bsdx.de>
6 1.1 ober *
7 1.1 ober * Permission to use, copy, modify, and distribute this software for any
8 1.1 ober * purpose with or without fee is hereby granted, provided that the above
9 1.1 ober * copyright notice and this permission notice appear in all copies.
10 1.1 ober *
11 1.1 ober * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 1.1 ober * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 1.1 ober * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 1.1 ober * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 1.1 ober * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 1.1 ober * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 1.1 ober * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 1.1 ober */
19 1.1 ober
20 1.1 ober #include <sys/cdefs.h>
21 1.10 nonaka __KERNEL_RCSID(0, "$NetBSD: zssp.c,v 1.10 2011/06/19 16:20:09 nonaka Exp $");
22 1.1 ober
23 1.1 ober #include <sys/param.h>
24 1.1 ober #include <sys/systm.h>
25 1.1 ober #include <sys/device.h>
26 1.1 ober
27 1.1 ober #include <machine/bus.h>
28 1.1 ober
29 1.1 ober #include <arm/xscale/pxa2x0reg.h>
30 1.1 ober #include <arm/xscale/pxa2x0var.h>
31 1.1 ober #include <arm/xscale/pxa2x0_gpio.h>
32 1.1 ober
33 1.1 ober #include <zaurus/dev/zsspvar.h>
34 1.1 ober #include <zaurus/zaurus/zaurus_var.h>
35 1.1 ober
36 1.1 ober #define GPIO_ADS7846_CS_C3000 14 /* SSP SFRM */
37 1.1 ober #define GPIO_MAX1111_CS_C3000 20
38 1.1 ober #define GPIO_TG_CS_C3000 53
39 1.1 ober
40 1.2 nonaka #define SSCR0_ADS7846_C3000 0x06ab /* 12bit/Microwire/div by 7 */
41 1.2 nonaka #define SSCR0_MAX1111 0x0387
42 1.1 ober #define SSCR0_LZ9JG18 0x01ab
43 1.1 ober
44 1.1 ober struct zssp_softc {
45 1.4 nonaka device_t sc_dev;
46 1.1 ober bus_space_tag_t sc_iot;
47 1.1 ober bus_space_handle_t sc_ioh;
48 1.1 ober };
49 1.1 ober
50 1.4 nonaka static int zssp_match(device_t, cfdata_t, void *);
51 1.4 nonaka static void zssp_attach(device_t, device_t, void *);
52 1.2 nonaka
53 1.4 nonaka CFATTACH_DECL_NEW(zssp, sizeof(struct zssp_softc),
54 1.2 nonaka zssp_match, zssp_attach, NULL, NULL);
55 1.2 nonaka
56 1.1 ober static void zssp_init(void);
57 1.9 dyoung static bool zssp_resume(device_t dv, const pmf_qual_t *);
58 1.1 ober
59 1.2 nonaka static struct zssp_softc *zssp_sc;
60 1.1 ober
61 1.1 ober static int
62 1.4 nonaka zssp_match(device_t parent, cfdata_t cf, void *aux)
63 1.1 ober {
64 1.1 ober
65 1.2 nonaka if (zssp_sc != NULL)
66 1.2 nonaka return 0;
67 1.1 ober return 1;
68 1.1 ober }
69 1.1 ober
70 1.1 ober static void
71 1.4 nonaka zssp_attach(device_t parent, device_t self, void *aux)
72 1.1 ober {
73 1.4 nonaka struct zssp_softc *sc = device_private(self);
74 1.4 nonaka
75 1.4 nonaka sc->sc_dev = self;
76 1.4 nonaka zssp_sc = sc;
77 1.4 nonaka
78 1.4 nonaka aprint_normal("\n");
79 1.4 nonaka aprint_naive("\n");
80 1.1 ober
81 1.1 ober sc->sc_iot = &pxa2x0_bs_tag;
82 1.1 ober if (bus_space_map(sc->sc_iot, PXA2X0_SSP1_BASE, PXA2X0_SSP_SIZE,
83 1.1 ober 0, &sc->sc_ioh)) {
84 1.4 nonaka aprint_error_dev(sc->sc_dev, "can't map bus space\n");
85 1.1 ober return;
86 1.1 ober }
87 1.1 ober
88 1.6 nonaka if (!pmf_device_register(sc->sc_dev, NULL, zssp_resume))
89 1.6 nonaka aprint_error_dev(sc->sc_dev,
90 1.6 nonaka "couldn't establish power handler\n");
91 1.1 ober
92 1.1 ober zssp_init();
93 1.1 ober }
94 1.1 ober
95 1.1 ober /*
96 1.1 ober * Initialize the dedicated SSP unit and disable all chip selects.
97 1.1 ober * This function is called with interrupts disabled.
98 1.1 ober */
99 1.1 ober static void
100 1.1 ober zssp_init(void)
101 1.1 ober {
102 1.1 ober struct zssp_softc *sc;
103 1.1 ober
104 1.2 nonaka KASSERT(zssp_sc != NULL);
105 1.2 nonaka sc = zssp_sc;
106 1.1 ober
107 1.1 ober pxa2x0_clkman_config(CKEN_SSP, 1);
108 1.1 ober
109 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_ioh, SSP_SSCR0, SSCR0_LZ9JG18);
110 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_ioh, SSP_SSCR1, 0);
111 1.1 ober
112 1.1 ober pxa2x0_gpio_set_function(GPIO_ADS7846_CS_C3000, GPIO_OUT|GPIO_SET);
113 1.1 ober pxa2x0_gpio_set_function(GPIO_MAX1111_CS_C3000, GPIO_OUT|GPIO_SET);
114 1.1 ober pxa2x0_gpio_set_function(GPIO_TG_CS_C3000, GPIO_OUT|GPIO_SET);
115 1.1 ober }
116 1.1 ober
117 1.6 nonaka static bool
118 1.9 dyoung zssp_resume(device_t dv, const pmf_qual_t *qual)
119 1.1 ober {
120 1.1 ober int s;
121 1.1 ober
122 1.6 nonaka s = splhigh();
123 1.6 nonaka zssp_init();
124 1.6 nonaka splx(s);
125 1.6 nonaka
126 1.6 nonaka return true;
127 1.1 ober }
128 1.1 ober
129 1.1 ober /*
130 1.1 ober * Transmit a single data word to one of the ICs, keep the chip selected
131 1.1 ober * afterwards, and don't wait for data to be returned in SSDR. Interrupts
132 1.1 ober * must be held off until zssp_ic_stop() gets called.
133 1.1 ober */
134 1.1 ober void
135 1.1 ober zssp_ic_start(int ic, uint32_t data)
136 1.1 ober {
137 1.1 ober struct zssp_softc *sc;
138 1.1 ober
139 1.2 nonaka KASSERT(zssp_sc != NULL);
140 1.2 nonaka sc = zssp_sc;
141 1.1 ober
142 1.1 ober /* disable other ICs */
143 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_ioh, SSP_SSCR0, 0);
144 1.1 ober if (ic != ZSSP_IC_ADS7846)
145 1.1 ober pxa2x0_gpio_set_bit(GPIO_ADS7846_CS_C3000);
146 1.1 ober if (ic != ZSSP_IC_LZ9JG18)
147 1.1 ober pxa2x0_gpio_set_bit(GPIO_TG_CS_C3000);
148 1.1 ober if (ic != ZSSP_IC_MAX1111)
149 1.1 ober pxa2x0_gpio_set_bit(GPIO_MAX1111_CS_C3000);
150 1.1 ober
151 1.1 ober /* activate the chosen one */
152 1.1 ober switch (ic) {
153 1.1 ober case ZSSP_IC_ADS7846:
154 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_ioh, SSP_SSCR0,
155 1.1 ober SSCR0_ADS7846_C3000);
156 1.1 ober pxa2x0_gpio_clear_bit(GPIO_ADS7846_CS_C3000);
157 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_ioh, SSP_SSDR, data);
158 1.1 ober while ((bus_space_read_4(sc->sc_iot, sc->sc_ioh, SSP_SSSR)
159 1.1 ober & SSSR_TNF) != SSSR_TNF)
160 1.1 ober continue; /* poll */
161 1.1 ober break;
162 1.1 ober case ZSSP_IC_LZ9JG18:
163 1.1 ober pxa2x0_gpio_clear_bit(GPIO_TG_CS_C3000);
164 1.1 ober break;
165 1.1 ober case ZSSP_IC_MAX1111:
166 1.1 ober pxa2x0_gpio_clear_bit(GPIO_MAX1111_CS_C3000);
167 1.1 ober break;
168 1.1 ober }
169 1.1 ober }
170 1.1 ober
171 1.1 ober /*
172 1.1 ober * Read the last value from SSDR and deactivate all chip-selects.
173 1.1 ober */
174 1.1 ober uint32_t
175 1.1 ober zssp_ic_stop(int ic)
176 1.1 ober {
177 1.1 ober struct zssp_softc *sc;
178 1.1 ober uint32_t rv;
179 1.1 ober
180 1.2 nonaka KASSERT(zssp_sc != NULL);
181 1.2 nonaka sc = zssp_sc;
182 1.1 ober
183 1.1 ober switch (ic) {
184 1.1 ober case ZSSP_IC_ADS7846:
185 1.1 ober /* read result of last command */
186 1.1 ober while ((bus_space_read_4(sc->sc_iot, sc->sc_ioh, SSP_SSSR)
187 1.1 ober & SSSR_RNE) != SSSR_RNE)
188 1.1 ober continue; /* poll */
189 1.1 ober rv = bus_space_read_4(sc->sc_iot, sc->sc_ioh, SSP_SSDR);
190 1.1 ober break;
191 1.1 ober case ZSSP_IC_LZ9JG18:
192 1.1 ober case ZSSP_IC_MAX1111:
193 1.1 ober /* last value received is irrelevant or undefined */
194 1.1 ober default:
195 1.1 ober rv = 0;
196 1.1 ober break;
197 1.1 ober }
198 1.1 ober
199 1.1 ober pxa2x0_gpio_set_bit(GPIO_ADS7846_CS_C3000);
200 1.1 ober pxa2x0_gpio_set_bit(GPIO_TG_CS_C3000);
201 1.1 ober pxa2x0_gpio_set_bit(GPIO_MAX1111_CS_C3000);
202 1.1 ober
203 1.1 ober return rv;
204 1.1 ober }
205 1.1 ober
206 1.1 ober /*
207 1.1 ober * Activate one of the chip-select lines, transmit one word value in
208 1.1 ober * each direction, and deactivate the chip-select again.
209 1.1 ober */
210 1.1 ober uint32_t
211 1.1 ober zssp_ic_send(int ic, uint32_t data)
212 1.1 ober {
213 1.1 ober
214 1.1 ober switch (ic) {
215 1.1 ober case ZSSP_IC_MAX1111:
216 1.1 ober return (zssp_read_max1111(data));
217 1.1 ober case ZSSP_IC_ADS7846:
218 1.1 ober return (zssp_read_ads7846(data));
219 1.1 ober case ZSSP_IC_LZ9JG18:
220 1.1 ober zssp_write_lz9jg18(data);
221 1.1 ober return 0;
222 1.1 ober default:
223 1.5 nonaka aprint_error("zssp: zssp_ic_send: invalid IC %d\n", ic);
224 1.1 ober return 0;
225 1.1 ober }
226 1.1 ober }
227 1.1 ober
228 1.1 ober int
229 1.1 ober zssp_read_max1111(uint32_t cmd)
230 1.1 ober {
231 1.1 ober struct zssp_softc *sc;
232 1.7 nonaka int data[3];
233 1.7 nonaka int voltage[3]; /* voltage[0]: dummy */
234 1.2 nonaka int i;
235 1.2 nonaka int s;
236 1.1 ober
237 1.2 nonaka KASSERT(zssp_sc != NULL);
238 1.2 nonaka sc = zssp_sc;
239 1.1 ober
240 1.1 ober s = splhigh();
241 1.1 ober
242 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_ioh, SSP_SSCR0, 0);
243 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_ioh, SSP_SSCR0, SSCR0_MAX1111);
244 1.1 ober
245 1.1 ober pxa2x0_gpio_set_bit(GPIO_TG_CS_C3000);
246 1.1 ober pxa2x0_gpio_set_bit(GPIO_ADS7846_CS_C3000);
247 1.1 ober pxa2x0_gpio_clear_bit(GPIO_MAX1111_CS_C3000);
248 1.1 ober
249 1.1 ober delay(1);
250 1.1 ober
251 1.7 nonaka memset(data, 0, sizeof(data));
252 1.7 nonaka data[0] = cmd;
253 1.7 nonaka for (i = 0; i < __arraycount(data); i++) {
254 1.7 nonaka bus_space_write_4(sc->sc_iot, sc->sc_ioh, SSP_SSDR, data[i]);
255 1.1 ober while ((bus_space_read_4(sc->sc_iot, sc->sc_ioh, SSP_SSSR)
256 1.1 ober & SSSR_TNF) != SSSR_TNF)
257 1.1 ober continue; /* poll */
258 1.7 nonaka /* XXX is this delay necessary? */
259 1.1 ober delay(1);
260 1.1 ober while ((bus_space_read_4(sc->sc_iot, sc->sc_ioh, SSP_SSSR)
261 1.1 ober & SSSR_RNE) != SSSR_RNE)
262 1.1 ober continue; /* poll */
263 1.1 ober voltage[i] = bus_space_read_4(sc->sc_iot, sc->sc_ioh,
264 1.1 ober SSP_SSDR);
265 1.1 ober }
266 1.1 ober
267 1.1 ober pxa2x0_gpio_set_bit(GPIO_TG_CS_C3000);
268 1.1 ober pxa2x0_gpio_set_bit(GPIO_ADS7846_CS_C3000);
269 1.1 ober pxa2x0_gpio_set_bit(GPIO_MAX1111_CS_C3000);
270 1.1 ober
271 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_ioh, SSP_SSCR0, 0);
272 1.1 ober
273 1.1 ober splx(s);
274 1.1 ober
275 1.1 ober /* XXX no idea what this means, but it's what Linux would do. */
276 1.7 nonaka if ((voltage[1] & 0xc0) != 0 || (voltage[2] & 0x3f) != 0)
277 1.7 nonaka return -1;
278 1.7 nonaka return ((voltage[1] << 2) & 0xfc) | ((voltage[2] >> 6) & 0x03);
279 1.1 ober }
280 1.1 ober
281 1.1 ober /* XXX - only does CS_ADS7846 */
282 1.1 ober uint32_t
283 1.1 ober zssp_read_ads7846(uint32_t cmd)
284 1.1 ober {
285 1.1 ober struct zssp_softc *sc;
286 1.1 ober unsigned int cr0;
287 1.2 nonaka uint32_t val;
288 1.1 ober int s;
289 1.1 ober
290 1.2 nonaka if (zssp_sc == NULL) {
291 1.1 ober printf("zssp_read_ads7846: not configured\n");
292 1.1 ober return 0;
293 1.1 ober }
294 1.2 nonaka sc = zssp_sc;
295 1.1 ober
296 1.2 nonaka s = splhigh();
297 1.1 ober
298 1.10 nonaka if (ZAURUS_ISC1000 || ZAURUS_ISC3000) {
299 1.2 nonaka cr0 = SSCR0_ADS7846_C3000;
300 1.1 ober } else {
301 1.2 nonaka cr0 = 0x00ab;
302 1.1 ober }
303 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_ioh, SSP_SSCR0, 0);
304 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_ioh, SSP_SSCR0, cr0);
305 1.1 ober
306 1.1 ober pxa2x0_gpio_set_bit(GPIO_TG_CS_C3000);
307 1.1 ober pxa2x0_gpio_set_bit(GPIO_MAX1111_CS_C3000);
308 1.1 ober pxa2x0_gpio_clear_bit(GPIO_ADS7846_CS_C3000);
309 1.1 ober
310 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_ioh, SSP_SSDR, cmd);
311 1.1 ober
312 1.1 ober while ((bus_space_read_4(sc->sc_iot, sc->sc_ioh, SSP_SSSR)
313 1.1 ober & SSSR_TNF) != SSSR_TNF)
314 1.1 ober continue; /* poll */
315 1.1 ober
316 1.1 ober delay(1);
317 1.1 ober
318 1.1 ober while ((bus_space_read_4(sc->sc_iot, sc->sc_ioh, SSP_SSSR)
319 1.1 ober & SSSR_RNE) != SSSR_RNE)
320 1.1 ober continue; /* poll */
321 1.1 ober
322 1.1 ober val = bus_space_read_4(sc->sc_iot, sc->sc_ioh, SSP_SSDR);
323 1.1 ober
324 1.2 nonaka pxa2x0_gpio_set_bit(GPIO_ADS7846_CS_C3000);
325 1.1 ober
326 1.1 ober splx(s);
327 1.1 ober
328 1.1 ober return val;
329 1.1 ober }
330 1.1 ober
331 1.1 ober void
332 1.1 ober zssp_write_lz9jg18(uint32_t data)
333 1.1 ober {
334 1.1 ober int sclk_pin, sclk_fn;
335 1.1 ober int sfrm_pin, sfrm_fn;
336 1.1 ober int txd_pin, txd_fn;
337 1.1 ober int rxd_pin, rxd_fn;
338 1.1 ober int i;
339 1.2 nonaka int s;
340 1.1 ober
341 1.1 ober /* XXX this creates a DAC command from a backlight duty value. */
342 1.1 ober data = 0x40 | (data & 0x1f);
343 1.1 ober
344 1.10 nonaka if (ZAURUS_ISC1000 || ZAURUS_ISC3000) {
345 1.1 ober sclk_pin = 19;
346 1.1 ober sfrm_pin = 14;
347 1.1 ober txd_pin = 87;
348 1.1 ober rxd_pin = 86;
349 1.1 ober } else {
350 1.1 ober sclk_pin = 23;
351 1.1 ober sfrm_pin = 24;
352 1.1 ober txd_pin = 25;
353 1.1 ober rxd_pin = 26;
354 1.1 ober }
355 1.1 ober
356 1.1 ober s = splhigh();
357 1.1 ober
358 1.1 ober sclk_fn = pxa2x0_gpio_get_function(sclk_pin);
359 1.1 ober sfrm_fn = pxa2x0_gpio_get_function(sfrm_pin);
360 1.1 ober txd_fn = pxa2x0_gpio_get_function(txd_pin);
361 1.1 ober rxd_fn = pxa2x0_gpio_get_function(rxd_pin);
362 1.1 ober
363 1.1 ober pxa2x0_gpio_set_function(sfrm_pin, GPIO_OUT | GPIO_SET);
364 1.1 ober pxa2x0_gpio_set_function(sclk_pin, GPIO_OUT | GPIO_CLR);
365 1.1 ober pxa2x0_gpio_set_function(txd_pin, GPIO_OUT | GPIO_CLR);
366 1.1 ober pxa2x0_gpio_set_function(rxd_pin, GPIO_IN);
367 1.1 ober
368 1.1 ober pxa2x0_gpio_set_bit(GPIO_MAX1111_CS_C3000);
369 1.1 ober pxa2x0_gpio_set_bit(GPIO_ADS7846_CS_C3000);
370 1.1 ober pxa2x0_gpio_clear_bit(GPIO_TG_CS_C3000);
371 1.1 ober
372 1.1 ober delay(10);
373 1.1 ober
374 1.1 ober for (i = 0; i < 8; i++) {
375 1.1 ober if (data & 0x80)
376 1.1 ober pxa2x0_gpio_set_bit(txd_pin);
377 1.1 ober else
378 1.1 ober pxa2x0_gpio_clear_bit(txd_pin);
379 1.1 ober delay(10);
380 1.1 ober pxa2x0_gpio_set_bit(sclk_pin);
381 1.1 ober delay(10);
382 1.1 ober pxa2x0_gpio_clear_bit(sclk_pin);
383 1.1 ober delay(10);
384 1.1 ober data <<= 1;
385 1.1 ober }
386 1.1 ober
387 1.1 ober pxa2x0_gpio_clear_bit(txd_pin);
388 1.1 ober pxa2x0_gpio_set_bit(GPIO_TG_CS_C3000);
389 1.1 ober
390 1.1 ober pxa2x0_gpio_set_function(sclk_pin, sclk_fn);
391 1.1 ober pxa2x0_gpio_set_function(sfrm_pin, sfrm_fn);
392 1.1 ober pxa2x0_gpio_set_function(txd_pin, txd_fn);
393 1.1 ober pxa2x0_gpio_set_function(rxd_pin, rxd_fn);
394 1.1 ober
395 1.1 ober splx(s);
396 1.1 ober }
397