static void pxamci_attach(device_t parent, device_t self, void *aux) { struct wzero3mci_softc *sc = device_private(self); struct pxaip_attach_args *pxa = aux; const struct wzero3mci_model *model; sc->sc.sc_dev = self; model = wzero3mci_lookup(); if (model == NULL) { aprint_error(": Unknown model."); return; } sc->sc_detect_pin = model->detect_pin; sc->sc_power_pin = model->power_pin; /* Establish SD detect interrupt */ if (sc->sc_detect_pin >= 0) { pxa2x0_gpio_set_function(sc->sc_detect_pin, GPIO_IN); sc->sc_detect_ih = pxa2x0_gpio_intr_establish(sc->sc_detect_pin, IST_EDGE_BOTH, IPL_BIO, wzero3mci_intr, sc); if (sc->sc_detect_ih == NULL) { aprint_error_dev(self, "unable to establish card detect interrupt\n"); return; } } sc->sc.sc_tag.cookie = sc; sc->sc.sc_tag.get_ocr = wzero3mci_get_ocr; sc->sc.sc_tag.set_power = wzero3mci_set_power; sc->sc.sc_tag.card_detect = wzero3mci_card_detect; sc->sc.sc_tag.write_protect = wzero3mci_write_protect; sc->sc.sc_caps = PMC_CAPS_4BIT; if (pxamci_attach_sub(self, pxa)) { aprint_error_dev(self, "unable to attach MMC controller\n"); goto free_intr; } if (!pmf_device_register(self, NULL, NULL)) { aprint_error_dev(self, "couldn't establish power handler\n"); } return; free_intr: pxa2x0_gpio_intr_disestablish(sc->sc_detect_ih); sc->sc_detect_ih = NULL; }
int zts_activate(struct device *self, int act) { struct zts_softc *sc = (struct zts_softc *)self; switch (act) { case DVACT_SUSPEND: if (sc->sc_enabled == 0) break; sc->sc_running = 0; #if 0 pxa2x0_gpio_intr_disestablish(sc->sc_gh); #endif timeout_del(&sc->sc_ts_poll); pxa2x0_gpio_intr_mask(sc->sc_gh); /* Turn off reference voltage but leave ADC on. */ (void)zssp_ic_send(ZSSP_IC_ADS7846, (1 << ADSCTRL_PD1_SH) | (1 << ADSCTRL_ADR_SH) | (1 << ADSCTRL_STS_SH)); pxa2x0_gpio_set_function(GPIO_TP_INT_C3K, GPIO_OUT | GPIO_SET); break; case DVACT_RESUME: if (sc->sc_enabled == 0) break; pxa2x0_gpio_set_function(GPIO_TP_INT_C3K, GPIO_IN); pxa2x0_gpio_intr_mask(sc->sc_gh); /* Enable automatic low power mode. */ (void)zssp_ic_send(ZSSP_IC_ADS7846, (4 << ADSCTRL_ADR_SH) | (1 << ADSCTRL_STS_SH)); #if 0 sc->sc_gh = pxa2x0_gpio_intr_establish(GPIO_TP_INT_C3K, IST_EDGE_FALLING, IPL_TTY, zts_irq, sc, sc->sc_dev.dv_xname); #else pxa2x0_gpio_intr_unmask(sc->sc_gh); #endif sc->sc_running = 1; break; } return 0; }
void zts_disable(void *v) { struct zts_softc *sc = v; timeout_del(&sc->sc_ts_poll); if (sc->sc_gh != NULL) { #if 0 pxa2x0_gpio_intr_disestablish(sc->sc_gh); sc->sc_gh = NULL; #endif } /* disable interrupts */ sc->sc_enabled = 0; sc->sc_running = 0; }
static int wzero3kbd_power_intr(void *arg) { struct wzero3kbd_softc *sc = (struct wzero3kbd_softc *)arg; #if defined(KEYTEST) || defined(KEYTEST2) || defined(KEYTEST3) || defined(KEYTEST4) printf("wzero3kbd_power_intr: status = %s\n", pxa2x0_gpio_get_bit(sc->sc_power_pin) ? "on" : "off"); #endif #if defined(KEYTEST) if (pxa2x0_gpio_get_bit(sc->sc_power_pin)) { if (sc->sc_test_pin >= 0) { int orig_pin = sc->sc_test_pin; pxa2x0_gpio_intr_disestablish(sc->sc_test_ih); sc->sc_test_ih = NULL; for (;;) { if (++sc->sc_test_pin >= PXA270_GPIO_NPINS) sc->sc_test_pin = 2; if (sc->sc_test_pin == orig_pin) break; if (sc->sc_test_pin != sc->sc_nouse_pin && sc->sc_test_pin != sc->sc_nouse_pin2 && sc->sc_test_pin != sc->sc_nouse_pin3 && sc->sc_test_pin != sc->sc_key_pin && sc->sc_test_pin != sc->sc_power_pin && sc->sc_test_pin != sc->sc_reset_pin && GPIO_IS_GPIO_IN(pxa2x0_gpio_get_function(sc->sc_test_pin))) break; } if (sc->sc_test_pin != orig_pin) { printf("GPIO_IN: GPIO pin #%d\n", sc->sc_test_pin); sc->sc_test_ih = pxa2x0_gpio_intr_establish(sc->sc_test_pin, IST_EDGE_BOTH, IPL_TTY, wzero3kbd_intr2,sc); } else { sc->sc_test_pin = -1; } } } #endif #if defined(KEYTEST2) if (pxa2x0_gpio_get_bit(sc->sc_power_pin)) { sc->sc_enabled ^= 2; if (sc->sc_enabled & 2) { printf("print col/row\n"); } else { printf("keyscan\n"); } } #endif #if defined(KEYTEST4) if (pxa2x0_gpio_get_bit(sc->sc_power_pin)) { if (sc->sc_test_pin >= 0) { int orig_pin = sc->sc_test_pin; for (;;) { if (++sc->sc_test_pin >= PXA270_GPIO_NPINS) sc->sc_test_pin = 2; if (sc->sc_test_pin == orig_pin) break; if (sc->sc_test_pin != sc->sc_nouse_pin && sc->sc_test_pin != sc->sc_nouse_pin2 && sc->sc_test_pin != sc->sc_nouse_pin3 && sc->sc_test_pin != sc->sc_key_pin && sc->sc_test_pin != sc->sc_power_pin && sc->sc_test_pin != sc->sc_reset_pin && GPIO_IS_GPIO_OUT(pxa2x0_gpio_get_function(sc->sc_test_pin))) break; } if (sc->sc_test_pin != orig_pin) { printf("GPIO_OUT: GPIO pin #%d\n", sc->sc_test_pin); } else { sc->sc_test_pin = -1; } } } #endif #if defined(KEYTEST5) if (pxa2x0_gpio_get_bit(sc->sc_power_pin)) { sc->sc_bit <<= 1; if (sc->sc_bit & ~0xff) { sc->sc_bit = 0x01; sc->sc_test_pin += 0x4; if (sc->sc_test_pin >= 0x20) { sc->sc_test_pin = 0x00; } } printf("CPLD(%#x), mask=%#x\n", sc->sc_test_pin, sc->sc_bit); } #endif pxa2x0_gpio_clear_intr(sc->sc_power_pin); return 1; }
void pxapcic_intr_disestablish(pcmcia_chipset_handle_t pch, void *ih) { pxa2x0_gpio_intr_disestablish(ih); }
/* ARGSUSED */ static void gxpcic_intr_disestablish(struct pxapcic_socket *so, void *ih) { pxa2x0_gpio_intr_disestablish(ih); }