/* * soc_common_pcmcia_suspend() * ^^^^^^^^^^^^^^^^^^^^^^^^^^^ * * Remove power on the socket, disable IRQs from the card. * Turn off status interrupts, and disable the PCMCIA bus. * * Returns: 0 */ static int soc_common_pcmcia_suspend(struct pcmcia_socket *sock) { struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock); int ret; debug(skt, 2, "suspending socket\n"); ret = soc_common_pcmcia_config_skt(skt, &dead_socket); if (ret == 0) skt->ops->socket_suspend(skt); return ret; }
/* * Implements the set_socket() operation for the in-kernel PCMCIA * service (formerly SS_SetSocket in Card Services). We more or * less punt all of this work and let the kernel handle the details * of power configuration, reset, &c. We also record the value of * `state' in order to regurgitate it to the PCMCIA core later. */ static int soc_common_pcmcia_set_socket(struct pcmcia_socket *sock, socket_state_t *state) { struct soc_pcmcia_socket *skt = to_soc_pcmcia_socket(sock); debug(skt, 2, "mask: %s%s%s%s%s%sflags: %s%s%s%s%s%sVcc %d Vpp %d irq %d\n", (state->csc_mask==0)?"<NONE> ":"", (state->csc_mask&SS_DETECT)?"DETECT ":"", (state->csc_mask&SS_READY)?"READY ":"", (state->csc_mask&SS_BATDEAD)?"BATDEAD ":"", (state->csc_mask&SS_BATWARN)?"BATWARN ":"", (state->csc_mask&SS_STSCHG)?"STSCHG ":"", (state->flags==0)?"<NONE> ":"", (state->flags&SS_PWR_AUTO)?"PWR_AUTO ":"", (state->flags&SS_IOCARD)?"IOCARD ":"", (state->flags&SS_RESET)?"RESET ":"", (state->flags&SS_SPKR_ENA)?"SPKR_ENA ":"", (state->flags&SS_OUTPUT_ENA)?"OUTPUT_ENA ":"", state->Vcc, state->Vpp, state->io_irq); return soc_common_pcmcia_config_skt(skt, state); }
void soc_pcmcia_remove_one(struct soc_pcmcia_socket *skt) { mutex_lock(&soc_pcmcia_sockets_lock); del_timer_sync(&skt->poll_timer); pcmcia_unregister_socket(&skt->socket); soc_pcmcia_hw_shutdown(skt); /* should not be required; violates some lowlevel drivers */ soc_common_pcmcia_config_skt(skt, &dead_socket); list_del(&skt->node); mutex_unlock(&soc_pcmcia_sockets_lock); iounmap(skt->virt_io); skt->virt_io = NULL; release_resource(&skt->res_attr); release_resource(&skt->res_mem); release_resource(&skt->res_io); release_resource(&skt->res_skt); }
int soc_common_drv_pcmcia_remove(struct device *dev) { struct skt_dev_info *sinfo = dev_get_drvdata(dev); int i; dev_set_drvdata(dev, NULL); mutex_lock(&soc_pcmcia_sockets_lock); for (i = 0; i < sinfo->nskt; i++) { struct soc_pcmcia_socket *skt = &sinfo->skt[i]; del_timer_sync(&skt->poll_timer); pcmcia_unregister_socket(&skt->socket); flush_scheduled_work(); skt->ops->hw_shutdown(skt); soc_common_pcmcia_config_skt(skt, &dead_socket); list_del(&skt->node); iounmap(skt->virt_io); skt->virt_io = NULL; release_resource(&skt->res_attr); release_resource(&skt->res_mem); release_resource(&skt->res_io); release_resource(&skt->res_skt); } if (list_empty(&soc_pcmcia_sockets)) soc_pcmcia_cpufreq_unregister(); mutex_unlock(&soc_pcmcia_sockets_lock); kfree(sinfo); return 0; }
void soc_pcmcia_remove_one(struct soc_pcmcia_socket *skt) { mutex_lock(&soc_pcmcia_sockets_lock); del_timer_sync(&skt->poll_timer); pcmcia_unregister_socket(&skt->socket); flush_scheduled_work(); skt->ops->hw_shutdown(skt); soc_common_pcmcia_config_skt(skt, &dead_socket); list_del(&skt->node); mutex_unlock(&soc_pcmcia_sockets_lock); iounmap(skt->virt_io); skt->virt_io = NULL; release_resource(&skt->res_attr); release_resource(&skt->res_mem); release_resource(&skt->res_io); release_resource(&skt->res_skt); }
void soc_pcmcia_remove_one(struct soc_pcmcia_socket *skt) { del_timer_sync(&skt->poll_timer); pcmcia_unregister_socket(&skt->socket); #ifdef CONFIG_CPU_FREQ if (skt->ops->frequency_change) cpufreq_unregister_notifier(&skt->cpufreq_nb, CPUFREQ_TRANSITION_NOTIFIER); #endif soc_pcmcia_hw_shutdown(skt); /* should not be required; violates some lowlevel drivers */ soc_common_pcmcia_config_skt(skt, &dead_socket); iounmap(skt->virt_io); skt->virt_io = NULL; release_resource(&skt->res_attr); release_resource(&skt->res_mem); release_resource(&skt->res_io); release_resource(&skt->res_skt); }