static int viper_pcmcia_hw_init(struct soc_pcmcia_socket *skt) { struct arcom_pcmcia_pdata *pdata = viper_get_pdata(); unsigned long flags; skt->stat[SOC_STAT_CD].gpio = pdata->cd_gpio; skt->stat[SOC_STAT_CD].name = "PCMCIA_CD"; skt->stat[SOC_STAT_RDY].gpio = pdata->rdy_gpio; skt->stat[SOC_STAT_RDY].name = "CF ready"; if (gpio_request(pdata->pwr_gpio, "CF power")) goto err_request_pwr; local_irq_save(flags); if (gpio_direction_output(pdata->pwr_gpio, 0)) { local_irq_restore(flags); goto err_dir; } local_irq_restore(flags); return 0; err_dir: gpio_free(pdata->pwr_gpio); err_request_pwr: dev_err(&arcom_pcmcia_dev->dev, "Failed to setup PCMCIA GPIOs\n"); return -1; }
/* * Release all resources. */ static void viper_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt) { struct arcom_pcmcia_pdata *pdata = viper_get_pdata(); soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs)); gpio_free(pdata->pwr_gpio); gpio_free(pdata->rdy_gpio); gpio_free(pdata->cd_gpio); }
static void viper_pcmcia_socket_state(struct soc_pcmcia_socket *skt, struct pcmcia_state *state) { struct arcom_pcmcia_pdata *pdata = viper_get_pdata(); state->detect = !gpio_get_value(pdata->cd_gpio); state->ready = !!gpio_get_value(pdata->rdy_gpio); state->bvd1 = 1; state->bvd2 = 1; state->wrprot = 0; state->vs_3v = 1; /* Can only apply 3.3V */ state->vs_Xv = 0; }
static int viper_pcmcia_hw_init(struct soc_pcmcia_socket *skt) { struct arcom_pcmcia_pdata *pdata = viper_get_pdata(); unsigned long flags; skt->socket.pci_irq = gpio_to_irq(pdata->rdy_gpio); irqs[0].irq = gpio_to_irq(pdata->cd_gpio); if (gpio_request(pdata->cd_gpio, "CF detect")) goto err_request_cd; if (gpio_request(pdata->rdy_gpio, "CF ready")) goto err_request_rdy; if (gpio_request(pdata->pwr_gpio, "CF power")) goto err_request_pwr; local_irq_save(flags); if (gpio_direction_output(pdata->pwr_gpio, 0) || gpio_direction_input(pdata->cd_gpio) || gpio_direction_input(pdata->rdy_gpio)) { local_irq_restore(flags); goto err_dir; } local_irq_restore(flags); return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs)); err_dir: gpio_free(pdata->pwr_gpio); err_request_pwr: gpio_free(pdata->rdy_gpio); err_request_rdy: gpio_free(pdata->cd_gpio); err_request_cd: dev_err(&arcom_pcmcia_dev->dev, "Failed to setup PCMCIA GPIOs\n"); return -1; }
static int viper_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, const socket_state_t *state) { struct arcom_pcmcia_pdata *pdata = viper_get_pdata(); /* Silently ignore Vpp, output enable, speaker enable. */ pdata->reset(state->flags & SS_RESET); /* Apply socket voltage */ switch (state->Vcc) { case 0: gpio_set_value(pdata->pwr_gpio, 0); break; case 33: gpio_set_value(pdata->pwr_gpio, 1); break; default: dev_err(&arcom_pcmcia_dev->dev, "Unsupported Vcc:%d\n", state->Vcc); return -1; } return 0; }
/* * Release all resources. */ static void viper_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt) { struct arcom_pcmcia_pdata *pdata = viper_get_pdata(); gpio_free(pdata->pwr_gpio); }