1 1.13 nonaka /* $NetBSD: scoop.c,v 1.13 2014/09/23 14:49:46 nonaka Exp $ */ 2 1.1 ober /* $OpenBSD: zaurus_scoop.c,v 1.12 2005/11/17 05:26:31 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.13 nonaka __KERNEL_RCSID(0, "$NetBSD: scoop.c,v 1.13 2014/09/23 14:49:46 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 #include <sys/conf.h> 27 1.1 ober #include <sys/gpio.h> 28 1.9 dyoung #include <sys/bus.h> 29 1.1 ober 30 1.1 ober #include <arm/xscale/pxa2x0var.h> 31 1.1 ober 32 1.1 ober #include <zaurus/zaurus/zaurus_reg.h> 33 1.1 ober #include <zaurus/zaurus/zaurus_var.h> 34 1.1 ober 35 1.1 ober #include <zaurus/dev/scoopreg.h> 36 1.1 ober #include <zaurus/dev/scoopvar.h> 37 1.1 ober 38 1.1 ober #include "ioconf.h" 39 1.1 ober 40 1.1 ober struct scoop_softc { 41 1.6 nonaka device_t sc_dev; 42 1.2 peter 43 1.2 peter bus_space_tag_t sc_iot; 44 1.2 peter bus_space_handle_t sc_ioh; 45 1.2 peter 46 1.2 peter uint16_t sc_gpwr; /* GPIO state before suspend */ 47 1.1 ober }; 48 1.1 ober 49 1.6 nonaka static int scoopmatch(device_t, cfdata_t, void *); 50 1.6 nonaka static void scoopattach(device_t, device_t, void *); 51 1.1 ober 52 1.6 nonaka CFATTACH_DECL_NEW(scoop, sizeof(struct scoop_softc), 53 1.6 nonaka scoopmatch, scoopattach, NULL, NULL); 54 1.1 ober 55 1.2 peter #if 0 56 1.6 nonaka static int scoop_gpio_pin_read(struct scoop_softc *, int); 57 1.2 peter #endif 58 1.6 nonaka static void scoop_gpio_pin_write(struct scoop_softc *, int, int); 59 1.6 nonaka static void scoop_gpio_pin_ctl(struct scoop_softc *, int, int); 60 1.1 ober 61 1.10 tsutsui static struct scoop_softc *backlight_sc; 62 1.10 tsutsui static uint8_t backlight_on_init = 1; 63 1.10 tsutsui static uint8_t backlight_cont_init = 0; 64 1.10 tsutsui 65 1.3 nonaka enum scoop_card { 66 1.3 nonaka SD_CARD, 67 1.3 nonaka CF_CARD /* socket 0 (external) */ 68 1.3 nonaka }; 69 1.3 nonaka 70 1.3 nonaka static void scoop0_set_card_power(enum scoop_card card, int new_cpr); 71 1.3 nonaka 72 1.1 ober static int 73 1.6 nonaka scoopmatch(device_t parent, cfdata_t cf, void *aux) 74 1.1 ober { 75 1.1 ober 76 1.1 ober /* 77 1.1 ober * Only C3000-like models are known to have two SCOOPs. 78 1.1 ober */ 79 1.1 ober if (ZAURUS_ISC3000) 80 1.1 ober return (cf->cf_unit < 2); 81 1.1 ober return (cf->cf_unit == 0); 82 1.1 ober } 83 1.1 ober 84 1.1 ober static void 85 1.6 nonaka scoopattach(device_t parent, device_t self, void *aux) 86 1.1 ober { 87 1.6 nonaka struct scoop_softc *sc = device_private(self); 88 1.12 chs struct pxaip_attach_args *pxa = aux; 89 1.1 ober bus_addr_t addr; 90 1.1 ober bus_size_t size; 91 1.1 ober 92 1.6 nonaka sc->sc_dev = self; 93 1.1 ober sc->sc_iot = pxa->pxa_iot; 94 1.1 ober 95 1.6 nonaka aprint_normal(": PCMCIA/GPIO controller\n"); 96 1.6 nonaka aprint_naive("\n"); 97 1.6 nonaka 98 1.1 ober if (pxa->pxa_addr != -1) 99 1.1 ober addr = pxa->pxa_addr; 100 1.12 chs else if (device_unit(sc->sc_dev) == 0) 101 1.1 ober addr = C3000_SCOOP0_BASE; 102 1.1 ober else 103 1.1 ober addr = C3000_SCOOP1_BASE; 104 1.1 ober 105 1.1 ober size = pxa->pxa_size < SCOOP_SIZE ? SCOOP_SIZE : pxa->pxa_size; 106 1.1 ober 107 1.1 ober if (bus_space_map(sc->sc_iot, addr, size, 0, &sc->sc_ioh) != 0) { 108 1.6 nonaka aprint_error_dev(sc->sc_dev, "couldn't map registers\n"); 109 1.1 ober return; 110 1.1 ober } 111 1.1 ober 112 1.12 chs if (ZAURUS_ISC3000 && device_unit(sc->sc_dev) == 1) { 113 1.1 ober scoop_gpio_pin_ctl(sc, SCOOP1_AKIN_PULLUP, GPIO_PIN_OUTPUT); 114 1.1 ober scoop_gpio_pin_write(sc, SCOOP1_AKIN_PULLUP, GPIO_PIN_LOW); 115 1.10 tsutsui backlight_sc = sc; 116 1.10 tsutsui scoop_set_backlight(backlight_on_init, backlight_cont_init); 117 1.8 nonaka } else if (ZAURUS_ISC860) { 118 1.1 ober scoop_gpio_pin_ctl(sc, SCOOP0_AKIN_PULLUP, GPIO_PIN_OUTPUT); 119 1.1 ober scoop_gpio_pin_write(sc, SCOOP0_AKIN_PULLUP, GPIO_PIN_LOW); 120 1.10 tsutsui backlight_sc = sc; 121 1.10 tsutsui scoop_set_backlight(backlight_on_init, backlight_cont_init); 122 1.1 ober } 123 1.1 ober } 124 1.1 ober 125 1.2 peter #if 0 126 1.2 peter static int 127 1.1 ober scoop_gpio_pin_read(struct scoop_softc *sc, int pin) 128 1.1 ober { 129 1.1 ober uint16_t bit = (1 << pin); 130 1.1 ober uint16_t rv; 131 1.1 ober 132 1.1 ober rv = bus_space_read_2(sc->sc_iot, sc->sc_ioh, SCOOP_GPWR); 133 1.2 peter return (rv & bit) ? 1 : 0; 134 1.1 ober } 135 1.2 peter #endif 136 1.1 ober 137 1.2 peter static void 138 1.1 ober scoop_gpio_pin_write(struct scoop_softc *sc, int pin, int level) 139 1.1 ober { 140 1.1 ober uint16_t bit = (1 << pin); 141 1.1 ober uint16_t rv; 142 1.1 ober 143 1.1 ober rv = bus_space_read_2(sc->sc_iot, sc->sc_ioh, SCOOP_GPWR); 144 1.1 ober bus_space_write_2(sc->sc_iot, sc->sc_ioh, SCOOP_GPWR, 145 1.2 peter (level == GPIO_PIN_LOW) ? (rv & ~bit) : (rv | bit)); 146 1.1 ober } 147 1.1 ober 148 1.2 peter static void 149 1.1 ober scoop_gpio_pin_ctl(struct scoop_softc *sc, int pin, int flags) 150 1.1 ober { 151 1.1 ober uint16_t bit = (1 << pin); 152 1.1 ober uint16_t rv; 153 1.1 ober 154 1.1 ober rv = bus_space_read_2(sc->sc_iot, sc->sc_ioh, SCOOP_GPCR); 155 1.1 ober switch (flags & (GPIO_PIN_INPUT|GPIO_PIN_OUTPUT)) { 156 1.1 ober case GPIO_PIN_INPUT: 157 1.1 ober rv &= ~bit; 158 1.1 ober break; 159 1.1 ober case GPIO_PIN_OUTPUT: 160 1.1 ober rv |= bit; 161 1.1 ober break; 162 1.1 ober } 163 1.1 ober bus_space_write_2(sc->sc_iot, sc->sc_ioh, SCOOP_GPCR, rv); 164 1.1 ober } 165 1.1 ober 166 1.1 ober /* 167 1.1 ober * Turn the LCD background light and contrast signal on or off. 168 1.1 ober */ 169 1.1 ober void 170 1.1 ober scoop_set_backlight(int on, int cont) 171 1.1 ober { 172 1.10 tsutsui struct scoop_softc *sc = backlight_sc; 173 1.5 cegger 174 1.10 tsutsui if (sc == NULL) { 175 1.10 tsutsui backlight_cont_init = cont; 176 1.10 tsutsui backlight_on_init = on; 177 1.10 tsutsui } else { 178 1.10 tsutsui if (ZAURUS_ISC3000) { 179 1.10 tsutsui scoop_gpio_pin_write(sc, SCOOP1_BACKLIGHT_CONT, !cont); 180 1.10 tsutsui scoop_gpio_pin_write(sc, SCOOP1_BACKLIGHT_ON, on); 181 1.10 tsutsui } else if (ZAURUS_ISC860) { 182 1.10 tsutsui scoop_gpio_pin_write(sc, SCOOP0_BACKLIGHT_CONT, cont); 183 1.10 tsutsui } 184 1.1 ober } 185 1.1 ober } 186 1.1 ober 187 1.1 ober /* 188 1.1 ober * Turn the infrared LED on or off (must be on while transmitting). 189 1.1 ober */ 190 1.1 ober void 191 1.1 ober scoop_set_irled(int on) 192 1.1 ober { 193 1.5 cegger struct scoop_softc *sc; 194 1.2 peter 195 1.5 cegger sc = device_lookup_private(&scoop_cd, 1); 196 1.5 cegger if (sc != NULL) { 197 1.1 ober /* IR_ON is inverted */ 198 1.8 nonaka scoop_gpio_pin_write(sc, SCOOP1_IR_ON, !on); 199 1.2 peter } 200 1.1 ober } 201 1.1 ober 202 1.1 ober /* 203 1.1 ober * Turn the green and orange LEDs on or off. If the orange LED is on, 204 1.1 ober * then it is wired to indicate if A/C is connected. The green LED has 205 1.1 ober * no such predefined function. 206 1.1 ober */ 207 1.1 ober void 208 1.1 ober scoop_led_set(int led, int on) 209 1.1 ober { 210 1.5 cegger struct scoop_softc *sc; 211 1.1 ober 212 1.5 cegger sc = device_lookup_private(&scoop_cd, 0); 213 1.5 cegger if (sc != NULL) { 214 1.1 ober if ((led & SCOOP_LED_GREEN) != 0) { 215 1.8 nonaka scoop_gpio_pin_write(sc, SCOOP0_LED_GREEN, on); 216 1.1 ober } 217 1.1 ober if (scoop_cd.cd_ndevs > 1 && (led & SCOOP_LED_ORANGE) != 0) { 218 1.8 nonaka scoop_gpio_pin_write(sc, SCOOP0_LED_ORANGE_C3000, on); 219 1.1 ober } 220 1.1 ober } 221 1.1 ober } 222 1.1 ober 223 1.1 ober /* 224 1.1 ober * Enable or disable the headphone output connection. 225 1.1 ober */ 226 1.1 ober void 227 1.1 ober scoop_set_headphone(int on) 228 1.1 ober { 229 1.5 cegger struct scoop_softc *sc; 230 1.1 ober 231 1.5 cegger sc = device_lookup_private(&scoop_cd, 0); 232 1.5 cegger if (sc == NULL) 233 1.1 ober return; 234 1.1 ober 235 1.8 nonaka scoop_gpio_pin_ctl(sc, SCOOP0_MUTE_L, GPIO_PIN_OUTPUT); 236 1.8 nonaka scoop_gpio_pin_ctl(sc, SCOOP0_MUTE_R, GPIO_PIN_OUTPUT); 237 1.1 ober 238 1.1 ober if (on) { 239 1.8 nonaka scoop_gpio_pin_write(sc, SCOOP0_MUTE_L, GPIO_PIN_HIGH); 240 1.8 nonaka scoop_gpio_pin_write(sc, SCOOP0_MUTE_R, GPIO_PIN_HIGH); 241 1.1 ober } else { 242 1.8 nonaka scoop_gpio_pin_write(sc, SCOOP0_MUTE_L, GPIO_PIN_LOW); 243 1.8 nonaka scoop_gpio_pin_write(sc, SCOOP0_MUTE_R, GPIO_PIN_LOW); 244 1.1 ober } 245 1.1 ober } 246 1.1 ober 247 1.1 ober /* 248 1.13 nonaka * Enable or disable the speaker output connection. 249 1.13 nonaka */ 250 1.13 nonaka void 251 1.13 nonaka scoop_set_speaker(int onoff) 252 1.13 nonaka { 253 1.13 nonaka struct scoop_softc *sc; 254 1.13 nonaka 255 1.13 nonaka if (!ZAURUS_ISC860) 256 1.13 nonaka return; 257 1.13 nonaka 258 1.13 nonaka sc = device_lookup_private(&scoop_cd, 0); 259 1.13 nonaka if (sc == NULL) 260 1.13 nonaka return; 261 1.13 nonaka 262 1.13 nonaka scoop_gpio_pin_ctl(sc, SCOOP0_AMP_ON, GPIO_PIN_OUTPUT); 263 1.13 nonaka if (onoff) { 264 1.13 nonaka scoop_gpio_pin_write(sc, SCOOP0_AMP_ON, GPIO_PIN_HIGH); 265 1.13 nonaka } else { 266 1.13 nonaka scoop_gpio_pin_write(sc, SCOOP0_AMP_ON, GPIO_PIN_LOW); 267 1.13 nonaka } 268 1.13 nonaka } 269 1.13 nonaka 270 1.13 nonaka /* 271 1.7 nonaka * Enable or disable the mic bias 272 1.7 nonaka */ 273 1.7 nonaka void 274 1.7 nonaka scoop_set_mic_bias(int onoff) 275 1.7 nonaka { 276 1.13 nonaka struct scoop_softc *sc0; 277 1.7 nonaka struct scoop_softc *sc1; 278 1.7 nonaka 279 1.13 nonaka sc0 = device_lookup_private(&scoop_cd, 0); 280 1.7 nonaka sc1 = device_lookup_private(&scoop_cd, 1); 281 1.13 nonaka 282 1.13 nonaka if (sc1 != NULL) { 283 1.7 nonaka scoop_gpio_pin_write(sc1, SCOOP1_MIC_BIAS, onoff); 284 1.13 nonaka } else if (sc0 != NULL) { 285 1.13 nonaka scoop_gpio_pin_write(sc0, SCOOP0_MIC_BIAS, onoff); 286 1.13 nonaka } 287 1.7 nonaka } 288 1.7 nonaka 289 1.7 nonaka /* 290 1.1 ober * Turn on pullup resistor while not reading the remote control. 291 1.1 ober */ 292 1.1 ober void 293 1.1 ober scoop_akin_pullup(int enable) 294 1.1 ober { 295 1.5 cegger struct scoop_softc *sc0; 296 1.5 cegger struct scoop_softc *sc1; 297 1.5 cegger 298 1.5 cegger sc0 = device_lookup_private(&scoop_cd, 0); 299 1.5 cegger sc1 = device_lookup_private(&scoop_cd, 1); 300 1.1 ober 301 1.5 cegger if (sc1 != NULL) { 302 1.8 nonaka scoop_gpio_pin_write(sc1, SCOOP1_AKIN_PULLUP, enable); 303 1.5 cegger } else if (sc0 != NULL) { 304 1.8 nonaka scoop_gpio_pin_write(sc0, SCOOP0_AKIN_PULLUP, enable); 305 1.1 ober } 306 1.1 ober } 307 1.1 ober 308 1.1 ober void 309 1.1 ober scoop_battery_temp_adc(int enable) 310 1.1 ober { 311 1.5 cegger struct scoop_softc *sc; 312 1.5 cegger 313 1.5 cegger sc = device_lookup_private(&scoop_cd, 0); 314 1.1 ober 315 1.5 cegger if (sc != NULL) { 316 1.8 nonaka scoop_gpio_pin_write(sc, SCOOP0_ADC_TEMP_ON_C3000, enable); 317 1.1 ober } 318 1.1 ober } 319 1.1 ober 320 1.1 ober void 321 1.1 ober scoop_charge_battery(int enable, int voltage_high) 322 1.1 ober { 323 1.5 cegger struct scoop_softc *sc; 324 1.5 cegger 325 1.11 tsutsui if (ZAURUS_ISC860) 326 1.11 tsutsui return; 327 1.11 tsutsui 328 1.5 cegger sc = device_lookup_private(&scoop_cd, 0); 329 1.1 ober 330 1.5 cegger if (sc != NULL) { 331 1.8 nonaka scoop_gpio_pin_write(sc, SCOOP0_JK_B_C3000, voltage_high); 332 1.8 nonaka scoop_gpio_pin_write(sc, SCOOP0_CHARGE_OFF_C3000, !enable); 333 1.1 ober } 334 1.1 ober } 335 1.1 ober 336 1.1 ober void 337 1.1 ober scoop_discharge_battery(int enable) 338 1.1 ober { 339 1.5 cegger struct scoop_softc *sc; 340 1.1 ober 341 1.11 tsutsui if (ZAURUS_ISC860) 342 1.11 tsutsui return; 343 1.11 tsutsui 344 1.5 cegger sc = device_lookup_private(&scoop_cd, 0); 345 1.5 cegger 346 1.5 cegger if (sc != NULL) { 347 1.8 nonaka scoop_gpio_pin_write(sc, SCOOP0_JK_A_C3000, enable); 348 1.1 ober } 349 1.1 ober } 350 1.1 ober 351 1.3 nonaka /* 352 1.3 nonaka * Enable or disable 3.3V power to the SD/MMC card slot. 353 1.3 nonaka */ 354 1.3 nonaka void 355 1.3 nonaka scoop_set_sdmmc_power(int on) 356 1.3 nonaka { 357 1.3 nonaka 358 1.3 nonaka scoop0_set_card_power(SD_CARD, on ? SCP_CPR_SD_3V : SCP_CPR_OFF); 359 1.3 nonaka } 360 1.3 nonaka 361 1.3 nonaka /* 362 1.3 nonaka * The Card Power Register of the first SCOOP unit controls the power 363 1.3 nonaka * for the first CompactFlash slot and the SD/MMC card slot as well. 364 1.3 nonaka */ 365 1.2 peter void 366 1.3 nonaka scoop0_set_card_power(enum scoop_card card, int new_cpr) 367 1.2 peter { 368 1.2 peter struct scoop_softc *sc; 369 1.2 peter bus_space_tag_t iot; 370 1.2 peter bus_space_handle_t ioh; 371 1.3 nonaka uint16_t cpr; 372 1.2 peter 373 1.11 tsutsui if (ZAURUS_ISC860) 374 1.11 tsutsui return; 375 1.11 tsutsui 376 1.5 cegger sc = device_lookup_private(&scoop_cd, 0); 377 1.5 cegger if (sc == NULL) 378 1.3 nonaka return; 379 1.2 peter 380 1.3 nonaka iot = sc->sc_iot; 381 1.3 nonaka ioh = sc->sc_ioh; 382 1.3 nonaka 383 1.3 nonaka cpr = bus_space_read_2(iot, ioh, SCOOP_CPR); 384 1.3 nonaka if (new_cpr & SCP_CPR_VOLTAGE_MSK) { 385 1.3 nonaka if (card == CF_CARD) 386 1.3 nonaka cpr |= SCP_CPR_5V; 387 1.3 nonaka else if (card == SD_CARD) 388 1.3 nonaka cpr |= SCP_CPR_SD_3V; 389 1.3 nonaka 390 1.3 nonaka scoop_gpio_pin_write(sc, SCOOP0_CF_POWER_C3000, 1); 391 1.3 nonaka if (!ISSET(cpr, SCP_CPR_5V) && !ISSET(cpr, SCP_CPR_SD_3V)) 392 1.3 nonaka delay(5000); 393 1.3 nonaka bus_space_write_2(iot, ioh, SCOOP_CPR, cpr | new_cpr); 394 1.3 nonaka } else { 395 1.3 nonaka if (card == CF_CARD) 396 1.3 nonaka cpr &= ~SCP_CPR_5V; 397 1.3 nonaka else if (card == SD_CARD) 398 1.3 nonaka cpr &= ~SCP_CPR_SD_3V; 399 1.3 nonaka 400 1.3 nonaka if (!ISSET(cpr, SCP_CPR_5V) && !ISSET(cpr, SCP_CPR_SD_3V)) { 401 1.3 nonaka bus_space_write_2(iot, ioh, SCOOP_CPR, SCP_CPR_OFF); 402 1.3 nonaka delay(1000); 403 1.3 nonaka scoop_gpio_pin_write(sc, SCOOP0_CF_POWER_C3000, 0); 404 1.3 nonaka } else 405 1.3 nonaka bus_space_write_2(iot, ioh, SCOOP_CPR, cpr | new_cpr); 406 1.2 peter } 407 1.2 peter } 408 1.2 peter 409 1.1 ober void 410 1.1 ober scoop_check_mcr(void) 411 1.1 ober { 412 1.5 cegger struct scoop_softc *sc0, *sc1, *sc; 413 1.1 ober uint16_t v; 414 1.1 ober 415 1.5 cegger sc0 = device_lookup_private(&scoop_cd, 0); 416 1.5 cegger sc1 = device_lookup_private(&scoop_cd, 1); 417 1.5 cegger 418 1.1 ober /* C3000 */ 419 1.5 cegger if (sc1 != NULL) { 420 1.5 cegger sc = sc0; 421 1.1 ober v = bus_space_read_2(sc->sc_iot, sc->sc_ioh, SCOOP_MCR); 422 1.1 ober if ((v & 0x100) == 0) { 423 1.1 ober bus_space_write_2(sc->sc_iot, sc->sc_ioh, SCOOP_MCR, 424 1.1 ober 0x0101); 425 1.1 ober } 426 1.1 ober 427 1.5 cegger sc = sc1; 428 1.1 ober v = bus_space_read_2(sc->sc_iot, sc->sc_ioh, SCOOP_MCR); 429 1.1 ober if ((v & 0x100) == 0) { 430 1.1 ober bus_space_write_2(sc->sc_iot, sc->sc_ioh, SCOOP_MCR, 431 1.1 ober 0x0101); 432 1.1 ober } 433 1.1 ober } 434 1.1 ober } 435 1.1 ober 436 1.1 ober void 437 1.1 ober scoop_suspend(void) 438 1.1 ober { 439 1.5 cegger struct scoop_softc *sc, *sc0, *sc1; 440 1.1 ober uint32_t rv; 441 1.1 ober 442 1.11 tsutsui if (ZAURUS_ISC860) 443 1.11 tsutsui return; 444 1.11 tsutsui 445 1.5 cegger sc0 = device_lookup_private(&scoop_cd, 0); 446 1.5 cegger sc1 = device_lookup_private(&scoop_cd, 1); 447 1.5 cegger 448 1.5 cegger if (sc0 != NULL) { 449 1.5 cegger sc = sc0; 450 1.1 ober sc->sc_gpwr = bus_space_read_2(sc->sc_iot, sc->sc_ioh, 451 1.1 ober SCOOP_GPWR); 452 1.1 ober /* C3000 */ 453 1.1 ober bus_space_write_2(sc->sc_iot, sc->sc_ioh, SCOOP_GPWR, 454 1.1 ober sc->sc_gpwr & ~((1<<SCOOP0_MUTE_L) | (1<<SCOOP0_MUTE_R) | 455 1.1 ober (1<<SCOOP0_JK_A_C3000) | (1<<SCOOP0_ADC_TEMP_ON_C3000) | 456 1.1 ober (1<<SCOOP0_LED_GREEN))); 457 1.1 ober } 458 1.1 ober 459 1.1 ober /* C3000 */ 460 1.5 cegger if (sc1 != NULL) { 461 1.5 cegger sc = sc1; 462 1.1 ober sc->sc_gpwr = bus_space_read_2(sc->sc_iot, sc->sc_ioh, 463 1.1 ober SCOOP_GPWR); 464 1.1 ober bus_space_write_2(sc->sc_iot, sc->sc_ioh, SCOOP_GPWR, 465 1.1 ober sc->sc_gpwr & ~((1<<SCOOP1_RESERVED_4) | 466 1.1 ober (1<<SCOOP1_RESERVED_5) | (1<<SCOOP1_RESERVED_6) | 467 1.1 ober (1<<SCOOP1_BACKLIGHT_CONT) | (1<<SCOOP1_BACKLIGHT_ON) | 468 1.1 ober (1<<SCOOP1_MIC_BIAS))); 469 1.1 ober rv = bus_space_read_2(sc->sc_iot, sc->sc_ioh, SCOOP_GPWR); 470 1.1 ober bus_space_write_2(sc->sc_iot, sc->sc_ioh, SCOOP_GPWR, 471 1.1 ober rv | ((1<<SCOOP1_IR_ON) | (1<<SCOOP1_RESERVED_3))); 472 1.1 ober } 473 1.1 ober } 474 1.1 ober 475 1.1 ober void 476 1.1 ober scoop_resume(void) 477 1.1 ober { 478 1.5 cegger struct scoop_softc *sc, *sc0, *sc1; 479 1.5 cegger 480 1.5 cegger sc0 = device_lookup_private(&scoop_cd, 0); 481 1.5 cegger sc1 = device_lookup_private(&scoop_cd, 1); 482 1.1 ober 483 1.5 cegger if (sc0 != NULL) { 484 1.5 cegger sc = sc0; 485 1.1 ober bus_space_write_2(sc->sc_iot, sc->sc_ioh, SCOOP_GPWR, 486 1.1 ober sc->sc_gpwr); 487 1.1 ober } 488 1.1 ober 489 1.5 cegger if (sc1 != NULL) { 490 1.5 cegger sc = sc1; 491 1.1 ober bus_space_write_2(sc->sc_iot, sc->sc_ioh, SCOOP_GPWR, 492 1.1 ober sc->sc_gpwr); 493 1.1 ober } 494 1.1 ober } 495