static int soc_pcmcia_hw_init(struct soc_pcmcia_socket *skt) { int ret = 0, i; clk_prepare_enable(skt->clk); if (skt->ops->hw_init) { ret = skt->ops->hw_init(skt); if (ret) return ret; } for (i = 0; i < ARRAY_SIZE(skt->stat); i++) { if (gpio_is_valid(skt->stat[i].gpio)) { unsigned long flags = GPIOF_IN; /* CD is active low by default */ if (i == SOC_STAT_CD) flags |= GPIOF_ACTIVE_LOW; ret = devm_gpio_request_one(skt->socket.dev.parent, skt->stat[i].gpio, flags, skt->stat[i].name); if (ret) { __soc_pcmcia_hw_shutdown(skt, i); return ret; } skt->stat[i].desc = gpio_to_desc(skt->stat[i].gpio); } if (i < SOC_STAT_VS1 && skt->stat[i].desc) { int irq = gpiod_to_irq(skt->stat[i].desc); if (irq > 0) { if (i == SOC_STAT_RDY) skt->socket.pci_irq = irq; else skt->stat[i].irq = irq; } } if (skt->stat[i].irq) { ret = request_irq(skt->stat[i].irq, soc_common_pcmcia_interrupt, IRQF_TRIGGER_NONE, skt->stat[i].name, skt); if (ret) { __soc_pcmcia_hw_shutdown(skt, i); return ret; } } } return ret; }
static int soc_pcmcia_hw_init(struct soc_pcmcia_socket *skt) { int ret = 0, i; if (skt->ops->hw_init) { ret = skt->ops->hw_init(skt); if (ret) return ret; } for (i = 0; i < ARRAY_SIZE(skt->stat); i++) { if (gpio_is_valid(skt->stat[i].gpio)) { int irq; ret = gpio_request_one(skt->stat[i].gpio, GPIOF_IN, skt->stat[i].name); if (ret) { __soc_pcmcia_hw_shutdown(skt, i); return ret; } irq = gpio_to_irq(skt->stat[i].gpio); if (i == SOC_STAT_RDY) skt->socket.pci_irq = irq; else skt->stat[i].irq = irq; } if (skt->stat[i].irq) { ret = request_irq(skt->stat[i].irq, soc_common_pcmcia_interrupt, IRQF_TRIGGER_NONE, skt->stat[i].name, skt); if (ret) { if (gpio_is_valid(skt->stat[i].gpio)) gpio_free(skt->stat[i].gpio); __soc_pcmcia_hw_shutdown(skt, i); return ret; } } } return ret; }
static void soc_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt) { __soc_pcmcia_hw_shutdown(skt, ARRAY_SIZE(skt->stat)); }