1 1.15 thorpej /* $NetBSD: zssp.c,v 1.15 2021/08/07 16:19:08 thorpej 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.15 thorpej __KERNEL_RCSID(0, "$NetBSD: zssp.c,v 1.15 2021/08/07 16:19:08 thorpej 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.11 dyoung #include <sys/bus.h> 27 1.1 ober 28 1.1 ober #include <arm/xscale/pxa2x0reg.h> 29 1.1 ober #include <arm/xscale/pxa2x0var.h> 30 1.1 ober #include <arm/xscale/pxa2x0_gpio.h> 31 1.1 ober 32 1.1 ober #include <zaurus/dev/zsspvar.h> 33 1.1 ober #include <zaurus/zaurus/zaurus_var.h> 34 1.1 ober 35 1.1 ober #define GPIO_ADS7846_CS_C3000 14 /* SSP SFRM */ 36 1.1 ober #define GPIO_MAX1111_CS_C3000 20 37 1.1 ober #define GPIO_TG_CS_C3000 53 38 1.13 tsutsui #define GPIO_ADS7846_CS_C860 24 /* SSP SFRM */ 39 1.13 tsutsui #define GPIO_MAX1111_CS_C860 20 40 1.13 tsutsui #define GPIO_TG_CS_C860 19 41 1.1 ober 42 1.2 nonaka #define SSCR0_ADS7846_C3000 0x06ab /* 12bit/Microwire/div by 7 */ 43 1.2 nonaka #define SSCR0_MAX1111 0x0387 44 1.1 ober #define SSCR0_LZ9JG18 0x01ab 45 1.13 tsutsui #define SSCR0_ADS7846_C860 0x00ab /* 12bit/Microwire/div by 7 */ 46 1.13 tsutsui 47 1.13 tsutsui struct zssp_ads7846 { 48 1.13 tsutsui u_int gpio; 49 1.13 tsutsui uint32_t sscr0; 50 1.13 tsutsui }; 51 1.13 tsutsui struct zssp_max1111 { 52 1.13 tsutsui u_int gpio; 53 1.13 tsutsui uint32_t sscr0; 54 1.13 tsutsui }; 55 1.13 tsutsui struct zssp_lz9jg18 { 56 1.13 tsutsui u_int gpio; 57 1.13 tsutsui uint32_t sscr0; 58 1.13 tsutsui int sclk_pin; 59 1.13 tsutsui int sfrm_pin; 60 1.13 tsutsui int txd_pin; 61 1.13 tsutsui int rxd_pin; 62 1.13 tsutsui }; 63 1.1 ober 64 1.1 ober struct zssp_softc { 65 1.4 nonaka device_t sc_dev; 66 1.1 ober bus_space_tag_t sc_iot; 67 1.1 ober bus_space_handle_t sc_ioh; 68 1.13 tsutsui bus_addr_t sc_ssp; 69 1.13 tsutsui struct zssp_ads7846 ads7846; 70 1.13 tsutsui struct zssp_max1111 max1111; 71 1.13 tsutsui struct zssp_lz9jg18 lz9jg18; 72 1.1 ober }; 73 1.1 ober 74 1.4 nonaka static int zssp_match(device_t, cfdata_t, void *); 75 1.4 nonaka static void zssp_attach(device_t, device_t, void *); 76 1.12 tsutsui static int zssp_search(device_t, cfdata_t, const int *, void *); 77 1.12 tsutsui static int zssp_print(void *, const char *); 78 1.2 nonaka 79 1.4 nonaka CFATTACH_DECL_NEW(zssp, sizeof(struct zssp_softc), 80 1.2 nonaka zssp_match, zssp_attach, NULL, NULL); 81 1.2 nonaka 82 1.1 ober static void zssp_init(void); 83 1.9 dyoung static bool zssp_resume(device_t dv, const pmf_qual_t *); 84 1.1 ober 85 1.2 nonaka static struct zssp_softc *zssp_sc; 86 1.1 ober 87 1.1 ober static int 88 1.4 nonaka zssp_match(device_t parent, cfdata_t cf, void *aux) 89 1.1 ober { 90 1.1 ober 91 1.2 nonaka if (zssp_sc != NULL) 92 1.2 nonaka return 0; 93 1.1 ober return 1; 94 1.1 ober } 95 1.1 ober 96 1.1 ober static void 97 1.4 nonaka zssp_attach(device_t parent, device_t self, void *aux) 98 1.1 ober { 99 1.4 nonaka struct zssp_softc *sc = device_private(self); 100 1.4 nonaka 101 1.4 nonaka sc->sc_dev = self; 102 1.4 nonaka zssp_sc = sc; 103 1.4 nonaka 104 1.4 nonaka aprint_normal("\n"); 105 1.4 nonaka aprint_naive("\n"); 106 1.1 ober 107 1.1 ober sc->sc_iot = &pxa2x0_bs_tag; 108 1.13 tsutsui if (ZAURUS_ISC1000 || ZAURUS_ISC3000) { 109 1.13 tsutsui sc->sc_ssp = PXA2X0_SSP1_BASE; 110 1.13 tsutsui sc->ads7846.gpio = GPIO_ADS7846_CS_C3000; 111 1.13 tsutsui sc->ads7846.sscr0 = SSCR0_ADS7846_C3000; 112 1.13 tsutsui sc->max1111.gpio = GPIO_MAX1111_CS_C3000; 113 1.13 tsutsui sc->max1111.sscr0 = SSCR0_MAX1111; 114 1.13 tsutsui sc->lz9jg18.gpio = GPIO_TG_CS_C3000; 115 1.13 tsutsui sc->lz9jg18.sscr0 = SSCR0_LZ9JG18; 116 1.13 tsutsui sc->lz9jg18.sclk_pin = 19; 117 1.13 tsutsui sc->lz9jg18.sfrm_pin = 14; 118 1.13 tsutsui sc->lz9jg18.txd_pin = 87; 119 1.13 tsutsui sc->lz9jg18.rxd_pin = 86; 120 1.13 tsutsui } else { 121 1.13 tsutsui sc->sc_ssp = PXA2X0_SSP_BASE; 122 1.13 tsutsui sc->ads7846.gpio = GPIO_ADS7846_CS_C860; 123 1.13 tsutsui sc->ads7846.sscr0 = SSCR0_ADS7846_C860; 124 1.13 tsutsui sc->max1111.gpio = GPIO_MAX1111_CS_C860; 125 1.13 tsutsui sc->max1111.sscr0 = SSCR0_MAX1111; 126 1.13 tsutsui sc->lz9jg18.gpio = GPIO_TG_CS_C860; 127 1.13 tsutsui sc->lz9jg18.sscr0 = SSCR0_LZ9JG18; 128 1.13 tsutsui sc->lz9jg18.sclk_pin = 23; 129 1.13 tsutsui sc->lz9jg18.sfrm_pin = 24; 130 1.13 tsutsui sc->lz9jg18.txd_pin = 25; 131 1.13 tsutsui sc->lz9jg18.rxd_pin = 26; 132 1.13 tsutsui } 133 1.13 tsutsui 134 1.13 tsutsui if (bus_space_map(sc->sc_iot, sc->sc_ssp, PXA2X0_SSP_SIZE, 135 1.1 ober 0, &sc->sc_ioh)) { 136 1.4 nonaka aprint_error_dev(sc->sc_dev, "can't map bus space\n"); 137 1.1 ober return; 138 1.1 ober } 139 1.1 ober 140 1.6 nonaka if (!pmf_device_register(sc->sc_dev, NULL, zssp_resume)) 141 1.6 nonaka aprint_error_dev(sc->sc_dev, 142 1.6 nonaka "couldn't establish power handler\n"); 143 1.1 ober 144 1.1 ober zssp_init(); 145 1.12 tsutsui 146 1.12 tsutsui /* Attach all devices */ 147 1.14 thorpej config_search(self, NULL, 148 1.15 thorpej CFARGS(.search = zssp_search)); 149 1.12 tsutsui } 150 1.12 tsutsui 151 1.12 tsutsui static int 152 1.12 tsutsui zssp_search(device_t parent, cfdata_t cf, const int *ldesc, void *aux) 153 1.12 tsutsui { 154 1.12 tsutsui struct zssp_attach_args aa; 155 1.12 tsutsui 156 1.12 tsutsui aa.zaa_name = cf->cf_name; 157 1.12 tsutsui 158 1.14 thorpej if (config_probe(parent, cf, &aa)) 159 1.15 thorpej config_attach(parent, cf, &aa, zssp_print, CFARGS_NONE); 160 1.12 tsutsui 161 1.12 tsutsui return 0; 162 1.12 tsutsui } 163 1.12 tsutsui 164 1.12 tsutsui static int 165 1.12 tsutsui zssp_print(void *aux, const char *name) 166 1.12 tsutsui { 167 1.12 tsutsui 168 1.12 tsutsui return UNCONF; 169 1.1 ober } 170 1.1 ober 171 1.1 ober /* 172 1.1 ober * Initialize the dedicated SSP unit and disable all chip selects. 173 1.1 ober * This function is called with interrupts disabled. 174 1.1 ober */ 175 1.1 ober static void 176 1.1 ober zssp_init(void) 177 1.1 ober { 178 1.1 ober struct zssp_softc *sc; 179 1.1 ober 180 1.12 tsutsui if (__predict_false(zssp_sc == NULL)) { 181 1.12 tsutsui aprint_error("%s: not configured.\n", __func__); 182 1.12 tsutsui return; 183 1.12 tsutsui } 184 1.2 nonaka sc = zssp_sc; 185 1.1 ober 186 1.1 ober pxa2x0_clkman_config(CKEN_SSP, 1); 187 1.1 ober 188 1.13 tsutsui bus_space_write_4(sc->sc_iot, sc->sc_ioh, SSP_SSCR0, sc->lz9jg18.sscr0); 189 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_ioh, SSP_SSCR1, 0); 190 1.1 ober 191 1.13 tsutsui pxa2x0_gpio_set_function(sc->ads7846.gpio, GPIO_OUT|GPIO_SET); 192 1.13 tsutsui pxa2x0_gpio_set_function(sc->max1111.gpio, GPIO_OUT|GPIO_SET); 193 1.13 tsutsui pxa2x0_gpio_set_function(sc->lz9jg18.gpio, GPIO_OUT|GPIO_SET); 194 1.1 ober } 195 1.1 ober 196 1.6 nonaka static bool 197 1.9 dyoung zssp_resume(device_t dv, const pmf_qual_t *qual) 198 1.1 ober { 199 1.1 ober int s; 200 1.1 ober 201 1.6 nonaka s = splhigh(); 202 1.6 nonaka zssp_init(); 203 1.6 nonaka splx(s); 204 1.6 nonaka 205 1.6 nonaka return true; 206 1.1 ober } 207 1.1 ober 208 1.1 ober /* 209 1.1 ober * Transmit a single data word to one of the ICs, keep the chip selected 210 1.1 ober * afterwards, and don't wait for data to be returned in SSDR. Interrupts 211 1.1 ober * must be held off until zssp_ic_stop() gets called. 212 1.1 ober */ 213 1.1 ober void 214 1.1 ober zssp_ic_start(int ic, uint32_t data) 215 1.1 ober { 216 1.1 ober struct zssp_softc *sc; 217 1.1 ober 218 1.12 tsutsui if (__predict_false(zssp_sc == NULL)) { 219 1.12 tsutsui aprint_error("%s: not configured.\n", __func__); 220 1.12 tsutsui return; 221 1.12 tsutsui } 222 1.2 nonaka sc = zssp_sc; 223 1.1 ober 224 1.1 ober /* disable other ICs */ 225 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_ioh, SSP_SSCR0, 0); 226 1.1 ober if (ic != ZSSP_IC_ADS7846) 227 1.13 tsutsui pxa2x0_gpio_set_bit(sc->ads7846.gpio); 228 1.1 ober if (ic != ZSSP_IC_LZ9JG18) 229 1.13 tsutsui pxa2x0_gpio_set_bit(sc->lz9jg18.gpio); 230 1.1 ober if (ic != ZSSP_IC_MAX1111) 231 1.13 tsutsui pxa2x0_gpio_set_bit(sc->max1111.gpio); 232 1.1 ober 233 1.1 ober /* activate the chosen one */ 234 1.1 ober switch (ic) { 235 1.1 ober case ZSSP_IC_ADS7846: 236 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_ioh, SSP_SSCR0, 237 1.13 tsutsui sc->ads7846.sscr0); 238 1.13 tsutsui pxa2x0_gpio_clear_bit(sc->ads7846.gpio); 239 1.13 tsutsui delay(1); /* ADS7846 Tcss = 100ns */ 240 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_ioh, SSP_SSDR, data); 241 1.1 ober while ((bus_space_read_4(sc->sc_iot, sc->sc_ioh, SSP_SSSR) 242 1.1 ober & SSSR_TNF) != SSSR_TNF) 243 1.1 ober continue; /* poll */ 244 1.1 ober break; 245 1.1 ober case ZSSP_IC_LZ9JG18: 246 1.13 tsutsui pxa2x0_gpio_clear_bit(sc->lz9jg18.gpio); 247 1.1 ober break; 248 1.1 ober case ZSSP_IC_MAX1111: 249 1.13 tsutsui pxa2x0_gpio_clear_bit(sc->max1111.gpio); 250 1.1 ober break; 251 1.1 ober } 252 1.1 ober } 253 1.1 ober 254 1.1 ober /* 255 1.1 ober * Read the last value from SSDR and deactivate all chip-selects. 256 1.1 ober */ 257 1.1 ober uint32_t 258 1.1 ober zssp_ic_stop(int ic) 259 1.1 ober { 260 1.1 ober struct zssp_softc *sc; 261 1.1 ober uint32_t rv; 262 1.1 ober 263 1.12 tsutsui if (__predict_false(zssp_sc == NULL)) { 264 1.12 tsutsui aprint_error("%s: not configured.\n", __func__); 265 1.12 tsutsui return 0; 266 1.12 tsutsui } 267 1.2 nonaka sc = zssp_sc; 268 1.1 ober 269 1.1 ober switch (ic) { 270 1.1 ober case ZSSP_IC_ADS7846: 271 1.1 ober /* read result of last command */ 272 1.1 ober while ((bus_space_read_4(sc->sc_iot, sc->sc_ioh, SSP_SSSR) 273 1.1 ober & SSSR_RNE) != SSSR_RNE) 274 1.1 ober continue; /* poll */ 275 1.1 ober rv = bus_space_read_4(sc->sc_iot, sc->sc_ioh, SSP_SSDR); 276 1.1 ober break; 277 1.1 ober case ZSSP_IC_LZ9JG18: 278 1.1 ober case ZSSP_IC_MAX1111: 279 1.1 ober /* last value received is irrelevant or undefined */ 280 1.1 ober default: 281 1.1 ober rv = 0; 282 1.1 ober break; 283 1.1 ober } 284 1.1 ober 285 1.13 tsutsui pxa2x0_gpio_set_bit(sc->ads7846.gpio); 286 1.13 tsutsui pxa2x0_gpio_set_bit(sc->lz9jg18.gpio); 287 1.13 tsutsui pxa2x0_gpio_set_bit(sc->max1111.gpio); 288 1.1 ober 289 1.1 ober return rv; 290 1.1 ober } 291 1.1 ober 292 1.1 ober /* 293 1.1 ober * Activate one of the chip-select lines, transmit one word value in 294 1.1 ober * each direction, and deactivate the chip-select again. 295 1.1 ober */ 296 1.1 ober uint32_t 297 1.1 ober zssp_ic_send(int ic, uint32_t data) 298 1.1 ober { 299 1.1 ober 300 1.1 ober switch (ic) { 301 1.1 ober case ZSSP_IC_MAX1111: 302 1.1 ober return (zssp_read_max1111(data)); 303 1.1 ober case ZSSP_IC_ADS7846: 304 1.1 ober return (zssp_read_ads7846(data)); 305 1.1 ober case ZSSP_IC_LZ9JG18: 306 1.1 ober zssp_write_lz9jg18(data); 307 1.1 ober return 0; 308 1.1 ober default: 309 1.5 nonaka aprint_error("zssp: zssp_ic_send: invalid IC %d\n", ic); 310 1.1 ober return 0; 311 1.1 ober } 312 1.1 ober } 313 1.1 ober 314 1.1 ober int 315 1.1 ober zssp_read_max1111(uint32_t cmd) 316 1.1 ober { 317 1.1 ober struct zssp_softc *sc; 318 1.7 nonaka int data[3]; 319 1.7 nonaka int voltage[3]; /* voltage[0]: dummy */ 320 1.2 nonaka int i; 321 1.2 nonaka int s; 322 1.1 ober 323 1.12 tsutsui if (__predict_false(zssp_sc == NULL)) { 324 1.12 tsutsui aprint_error("%s: not configured.\n", __func__); 325 1.12 tsutsui return 0; 326 1.12 tsutsui } 327 1.2 nonaka sc = zssp_sc; 328 1.1 ober 329 1.1 ober s = splhigh(); 330 1.1 ober 331 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_ioh, SSP_SSCR0, 0); 332 1.13 tsutsui bus_space_write_4(sc->sc_iot, sc->sc_ioh, SSP_SSCR0, sc->max1111.sscr0); 333 1.1 ober 334 1.13 tsutsui pxa2x0_gpio_set_bit(sc->lz9jg18.gpio); 335 1.13 tsutsui pxa2x0_gpio_set_bit(sc->ads7846.gpio); 336 1.13 tsutsui pxa2x0_gpio_clear_bit(sc->max1111.gpio); 337 1.1 ober 338 1.1 ober delay(1); 339 1.1 ober 340 1.7 nonaka memset(data, 0, sizeof(data)); 341 1.7 nonaka data[0] = cmd; 342 1.7 nonaka for (i = 0; i < __arraycount(data); i++) { 343 1.7 nonaka bus_space_write_4(sc->sc_iot, sc->sc_ioh, SSP_SSDR, data[i]); 344 1.1 ober while ((bus_space_read_4(sc->sc_iot, sc->sc_ioh, SSP_SSSR) 345 1.1 ober & SSSR_TNF) != SSSR_TNF) 346 1.1 ober continue; /* poll */ 347 1.7 nonaka /* XXX is this delay necessary? */ 348 1.1 ober delay(1); 349 1.1 ober while ((bus_space_read_4(sc->sc_iot, sc->sc_ioh, SSP_SSSR) 350 1.1 ober & SSSR_RNE) != SSSR_RNE) 351 1.1 ober continue; /* poll */ 352 1.1 ober voltage[i] = bus_space_read_4(sc->sc_iot, sc->sc_ioh, 353 1.1 ober SSP_SSDR); 354 1.1 ober } 355 1.1 ober 356 1.13 tsutsui pxa2x0_gpio_set_bit(sc->lz9jg18.gpio); 357 1.13 tsutsui pxa2x0_gpio_set_bit(sc->ads7846.gpio); 358 1.13 tsutsui pxa2x0_gpio_set_bit(sc->max1111.gpio); 359 1.1 ober 360 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_ioh, SSP_SSCR0, 0); 361 1.1 ober 362 1.1 ober splx(s); 363 1.1 ober 364 1.1 ober /* XXX no idea what this means, but it's what Linux would do. */ 365 1.7 nonaka if ((voltage[1] & 0xc0) != 0 || (voltage[2] & 0x3f) != 0) 366 1.7 nonaka return -1; 367 1.7 nonaka return ((voltage[1] << 2) & 0xfc) | ((voltage[2] >> 6) & 0x03); 368 1.1 ober } 369 1.1 ober 370 1.1 ober /* XXX - only does CS_ADS7846 */ 371 1.1 ober uint32_t 372 1.1 ober zssp_read_ads7846(uint32_t cmd) 373 1.1 ober { 374 1.1 ober struct zssp_softc *sc; 375 1.2 nonaka uint32_t val; 376 1.1 ober int s; 377 1.1 ober 378 1.12 tsutsui if (__predict_false(zssp_sc == NULL)) { 379 1.12 tsutsui aprint_error("%s: not configured\n", __func__); 380 1.1 ober return 0; 381 1.1 ober } 382 1.2 nonaka sc = zssp_sc; 383 1.1 ober 384 1.2 nonaka s = splhigh(); 385 1.1 ober 386 1.13 tsutsui bus_space_write_4(sc->sc_iot, sc->sc_ioh, SSP_SSCR0, 0); 387 1.13 tsutsui bus_space_write_4(sc->sc_iot, sc->sc_ioh, SSP_SSCR0, sc->ads7846.sscr0); 388 1.1 ober 389 1.13 tsutsui pxa2x0_gpio_set_bit(sc->lz9jg18.gpio); 390 1.13 tsutsui pxa2x0_gpio_set_bit(sc->max1111.gpio); 391 1.13 tsutsui pxa2x0_gpio_clear_bit(sc->ads7846.gpio); 392 1.13 tsutsui delay(1); /* ADS7846 Tcss = 100ns */ 393 1.1 ober 394 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_ioh, SSP_SSDR, cmd); 395 1.1 ober 396 1.1 ober while ((bus_space_read_4(sc->sc_iot, sc->sc_ioh, SSP_SSSR) 397 1.1 ober & SSSR_TNF) != SSSR_TNF) 398 1.1 ober continue; /* poll */ 399 1.1 ober 400 1.1 ober delay(1); 401 1.1 ober 402 1.1 ober while ((bus_space_read_4(sc->sc_iot, sc->sc_ioh, SSP_SSSR) 403 1.1 ober & SSSR_RNE) != SSSR_RNE) 404 1.1 ober continue; /* poll */ 405 1.1 ober 406 1.1 ober val = bus_space_read_4(sc->sc_iot, sc->sc_ioh, SSP_SSDR); 407 1.1 ober 408 1.13 tsutsui pxa2x0_gpio_set_bit(sc->ads7846.gpio); 409 1.1 ober 410 1.1 ober splx(s); 411 1.1 ober 412 1.1 ober return val; 413 1.1 ober } 414 1.1 ober 415 1.1 ober void 416 1.1 ober zssp_write_lz9jg18(uint32_t data) 417 1.1 ober { 418 1.13 tsutsui struct zssp_softc *sc; 419 1.13 tsutsui int sclk_fn; 420 1.13 tsutsui int sfrm_fn; 421 1.13 tsutsui int txd_fn; 422 1.13 tsutsui int rxd_fn; 423 1.1 ober int i; 424 1.2 nonaka int s; 425 1.1 ober 426 1.13 tsutsui KASSERT(zssp_sc != NULL); 427 1.13 tsutsui sc = zssp_sc; 428 1.13 tsutsui 429 1.1 ober /* XXX this creates a DAC command from a backlight duty value. */ 430 1.1 ober data = 0x40 | (data & 0x1f); 431 1.1 ober 432 1.1 ober s = splhigh(); 433 1.1 ober 434 1.13 tsutsui sclk_fn = pxa2x0_gpio_get_function(sc->lz9jg18.sclk_pin); 435 1.13 tsutsui sfrm_fn = pxa2x0_gpio_get_function(sc->lz9jg18.sfrm_pin); 436 1.13 tsutsui txd_fn = pxa2x0_gpio_get_function(sc->lz9jg18.txd_pin); 437 1.13 tsutsui rxd_fn = pxa2x0_gpio_get_function(sc->lz9jg18.rxd_pin); 438 1.13 tsutsui 439 1.13 tsutsui pxa2x0_gpio_set_function(sc->lz9jg18.sfrm_pin, GPIO_OUT | GPIO_SET); 440 1.13 tsutsui pxa2x0_gpio_set_function(sc->lz9jg18.sclk_pin, GPIO_OUT | GPIO_CLR); 441 1.13 tsutsui pxa2x0_gpio_set_function(sc->lz9jg18.txd_pin, GPIO_OUT | GPIO_CLR); 442 1.13 tsutsui pxa2x0_gpio_set_function(sc->lz9jg18.rxd_pin, GPIO_IN); 443 1.13 tsutsui 444 1.13 tsutsui pxa2x0_gpio_set_bit(sc->max1111.gpio); 445 1.13 tsutsui pxa2x0_gpio_set_bit(sc->ads7846.gpio); 446 1.13 tsutsui pxa2x0_gpio_clear_bit(sc->lz9jg18.gpio); 447 1.1 ober 448 1.1 ober delay(10); 449 1.1 ober 450 1.1 ober for (i = 0; i < 8; i++) { 451 1.1 ober if (data & 0x80) 452 1.13 tsutsui pxa2x0_gpio_set_bit(sc->lz9jg18.txd_pin); 453 1.1 ober else 454 1.13 tsutsui pxa2x0_gpio_clear_bit(sc->lz9jg18.txd_pin); 455 1.1 ober delay(10); 456 1.13 tsutsui pxa2x0_gpio_set_bit(sc->lz9jg18.sclk_pin); 457 1.1 ober delay(10); 458 1.13 tsutsui pxa2x0_gpio_clear_bit(sc->lz9jg18.sclk_pin); 459 1.1 ober delay(10); 460 1.1 ober data <<= 1; 461 1.1 ober } 462 1.1 ober 463 1.13 tsutsui pxa2x0_gpio_clear_bit(sc->lz9jg18.txd_pin); 464 1.13 tsutsui pxa2x0_gpio_set_bit(sc->lz9jg18.gpio); 465 1.1 ober 466 1.13 tsutsui pxa2x0_gpio_set_function(sc->lz9jg18.sclk_pin, sclk_fn); 467 1.13 tsutsui pxa2x0_gpio_set_function(sc->lz9jg18.sfrm_pin, sfrm_fn); 468 1.13 tsutsui pxa2x0_gpio_set_function(sc->lz9jg18.txd_pin, txd_fn); 469 1.13 tsutsui pxa2x0_gpio_set_function(sc->lz9jg18.rxd_pin, rxd_fn); 470 1.1 ober 471 1.1 ober splx(s); 472 1.1 ober } 473