int sa1111_pcmcia_add(struct sa1111_dev *dev, struct pcmcia_low_level *ops, int (*add)(struct soc_pcmcia_socket *)) { struct sa1111_pcmcia_socket *s; struct clk *clk; int i, ret = 0, irqs[NUM_IRQS]; clk = devm_clk_get(&dev->dev, NULL); if (IS_ERR(clk)) return PTR_ERR(clk); for (i = 0; i < NUM_IRQS; i++) { irqs[i] = sa1111_get_irq(dev, i); if (irqs[i] <= 0) return irqs[i] ? : -ENXIO; } ops->socket_state = sa1111_pcmcia_socket_state; for (i = 0; i < ops->nr; i++) { s = kzalloc(sizeof(*s), GFP_KERNEL); if (!s) return -ENOMEM; s->soc.nr = ops->first + i; s->soc.clk = clk; soc_pcmcia_init_one(&s->soc, ops, &dev->dev); s->dev = dev; if (s->soc.nr) { s->soc.socket.pci_irq = irqs[IDX_IRQ_S1_READY_NINT]; s->soc.stat[SOC_STAT_CD].irq = irqs[IDX_IRQ_S1_CD_VALID]; s->soc.stat[SOC_STAT_CD].name = "SA1111 CF card detect"; s->soc.stat[SOC_STAT_BVD1].irq = irqs[IDX_IRQ_S1_BVD1_STSCHG]; s->soc.stat[SOC_STAT_BVD1].name = "SA1111 CF BVD1"; } else { s->soc.socket.pci_irq = irqs[IDX_IRQ_S0_READY_NINT]; s->soc.stat[SOC_STAT_CD].irq = irqs[IDX_IRQ_S0_CD_VALID]; s->soc.stat[SOC_STAT_CD].name = "SA1111 PCMCIA card detect"; s->soc.stat[SOC_STAT_BVD1].irq = irqs[IDX_IRQ_S0_BVD1_STSCHG]; s->soc.stat[SOC_STAT_BVD1].name = "SA1111 PCMCIA BVD1"; } ret = add(&s->soc); if (ret == 0) { s->next = dev_get_drvdata(&dev->dev); dev_set_drvdata(&dev->dev, s); } else kfree(s); } return ret; }
int sa1111_pcmcia_add(struct sa1111_dev *dev, struct pcmcia_low_level *ops, int (*add)(struct soc_pcmcia_socket *)) { struct sa1111_pcmcia_socket *s; int i, ret = 0; ops->socket_state = sa1111_pcmcia_socket_state; for (i = 0; i < ops->nr; i++) { s = kzalloc(sizeof(*s), GFP_KERNEL); if (!s) return -ENOMEM; s->soc.nr = ops->first + i; soc_pcmcia_init_one(&s->soc, ops, &dev->dev); s->dev = dev; if (s->soc.nr) { s->soc.socket.pci_irq = dev->irq[IDX_IRQ_S1_READY_NINT]; s->soc.stat[SOC_STAT_CD].irq = dev->irq[IDX_IRQ_S1_CD_VALID]; s->soc.stat[SOC_STAT_CD].name = "SA1111 CF card detect"; s->soc.stat[SOC_STAT_BVD1].irq = dev->irq[IDX_IRQ_S1_BVD1_STSCHG]; s->soc.stat[SOC_STAT_BVD1].name = "SA1111 CF BVD1"; } else { s->soc.socket.pci_irq = dev->irq[IDX_IRQ_S0_READY_NINT]; s->soc.stat[SOC_STAT_CD].irq = dev->irq[IDX_IRQ_S0_CD_VALID]; s->soc.stat[SOC_STAT_CD].name = "SA1111 PCMCIA card detect"; s->soc.stat[SOC_STAT_BVD1].irq = dev->irq[IDX_IRQ_S0_BVD1_STSCHG]; s->soc.stat[SOC_STAT_BVD1].name = "SA1111 PCMCIA BVD1"; } ret = add(&s->soc); if (ret == 0) { s->next = dev_get_drvdata(&dev->dev); dev_set_drvdata(&dev->dev, s); } else kfree(s); } return ret; }