static int airo_config(struct pcmcia_device *link) { local_info_t *dev; int ret; dev = link->priv; dev_dbg(&link->dev, "airo_config\n"); link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_VPP | CONF_AUTO_AUDIO | CONF_AUTO_SET_IO; ret = pcmcia_loop_config(link, airo_cs_config_check, NULL); if (ret) goto failed; if (!link->irq) goto failed; ret = pcmcia_enable_device(link); if (ret) goto failed; ((local_info_t *)link->priv)->eth_dev = init_airo_card(link->irq, link->resource[0]->start, 1, &link->dev); if (!((local_info_t *)link->priv)->eth_dev) goto failed; return 0; failed: airo_release(link); return -ENODEV; }
static int ide_config(struct pcmcia_device *link) { ide_info_t *info = link->priv; int ret = 0, is_kme = 0; unsigned long io_base, ctl_base; struct ide_host *host; dev_dbg(&link->dev, "ide_config(0x%p)\n", link); is_kme = ((link->manf_id == MANFID_KME) && ((link->card_id == PRODID_KME_KXLC005_A) || (link->card_id == PRODID_KME_KXLC005_B))); if (pcmcia_loop_config(link, pcmcia_check_one_config, &is_kme)) { link->config_flags &= ~CONF_AUTO_CHECK_VCC; if (pcmcia_loop_config(link, pcmcia_check_one_config, &is_kme)) goto failed; /* No suitable config found */ } io_base = link->resource[0]->start; if (link->resource[1]->end) ctl_base = link->resource[1]->start; else ctl_base = link->resource[0]->start + 0x0e; if (!link->irq) goto failed; ret = pcmcia_enable_device(link); if (ret) goto failed; /* disable drive interrupts during IDE probe */ outb(0x02, ctl_base); /* special setup for KXLC005 card */ if (is_kme) outb(0x81, ctl_base+1); host = idecs_register(io_base, ctl_base, link->irq, link); if (host == NULL && resource_size(link->resource[0]) == 0x20) { outb(0x02, ctl_base + 0x10); host = idecs_register(io_base + 0x10, ctl_base + 0x10, link->irq, link); } if (host == NULL) goto failed; info->ndev = 1; info->host = host; dev_info(&link->dev, "ide-cs: hd%c: Vpp = %d.%d\n", 'a' + host->ports[0]->index * 2, link->vpp / 10, link->vpp % 10); return 0; failed: ide_release(link); return -ENODEV; } /* ide_config */
static int dtl1_config(struct pcmcia_device *link) { dtl1_info_t *info = link->priv; int i; /* Look for a generic full-sized window */ link->resource[0]->end = 8; if (pcmcia_loop_config(link, dtl1_confcheck, NULL) < 0) goto failed; i = pcmcia_request_irq(link, dtl1_interrupt); if (i != 0) goto failed; i = pcmcia_enable_device(link); if (i != 0) goto failed; if (dtl1_open(info) != 0) goto failed; return 0; failed: dtl1_release(link); return -ENODEV; }
static void labpc_config(struct pcmcia_device *link) { int ret; dev_dbg(&link->dev, "labpc_config\n"); link->config_flags |= CONF_ENABLE_IRQ | CONF_ENABLE_PULSE_IRQ | CONF_AUTO_AUDIO | CONF_AUTO_SET_IO; ret = pcmcia_loop_config(link, labpc_pcmcia_config_loop, NULL); if (ret) { dev_warn(&link->dev, "no configuration found\n"); goto failed; } if (!link->irq) goto failed; ret = pcmcia_enable_device(link); if (ret) goto failed; return; failed: labpc_release(link); } /* labpc_config */
static int ixj_config(struct pcmcia_device * link) { IXJ *j; ixj_info_t *info; info = link->priv; dev_dbg(&link->dev, "ixj_config\n"); link->config_flags = CONF_AUTO_SET_IO; if (pcmcia_loop_config(link, ixj_config_check, NULL)) goto failed; if (pcmcia_enable_device(link)) goto failed; /* * Register the card with the core. */ j = ixj_pcmcia_probe(link->resource[0]->start, link->resource[0]->start + 0x10); info->ndev = 1; ixj_get_serial(link, j); return 0; failed: ixj_cs_release(link); return -ENODEV; }
static int dtl1_config(struct pcmcia_device *link) { dtl1_info_t *info = link->priv; int ret; /* Look for a generic full-sized window */ link->resource[0]->end = 8; ret = pcmcia_loop_config(link, dtl1_confcheck, NULL); if (ret) goto failed; ret = pcmcia_request_irq(link, dtl1_interrupt); if (ret) goto failed; ret = pcmcia_enable_device(link); if (ret) goto failed; ret = dtl1_open(info); if (ret) goto failed; return 0; failed: dtl1_detach(link); return ret; }
static int sl811_cs_config(struct pcmcia_device *link) { struct device *parent = &link->dev; int ret; dev_dbg(&link->dev, "sl811_cs_config\n"); link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_VPP | CONF_AUTO_CHECK_VCC | CONF_AUTO_SET_IO; if (pcmcia_loop_config(link, sl811_cs_config_check, NULL)) goto failed; /* require an IRQ and two registers */ if (resource_size(link->resource[0]) < 2) goto failed; if (!link->irq) goto failed; ret = pcmcia_enable_device(link); if (ret) goto failed; if (sl811_hc_init(parent, link->resource[0]->start, link->irq) < 0) { failed: printk(KERN_WARNING "sl811_cs_config failed\n"); sl811_cs_release(link); return -ENODEV; } return 0; }
static int pdacf_config(struct pcmcia_device *link) { struct snd_pdacf *pdacf = link->priv; int ret; snd_printdd(KERN_DEBUG "pdacf_config called\n"); link->config_index = 0x5; link->config_flags |= CONF_ENABLE_IRQ | CONF_ENABLE_PULSE_IRQ; ret = pcmcia_request_io(link); if (ret) goto failed; ret = pcmcia_request_irq(link, pdacf_interrupt); if (ret) goto failed; ret = pcmcia_enable_device(link); if (ret) goto failed; if (snd_pdacf_assign_resources(pdacf, link->resource[0]->start, link->irq) < 0) goto failed; return 0; failed: pcmcia_disable_device(link); return -ENODEV; }
static int ft1000_config(struct pcmcia_device *link) { int ret; dev_dbg(&link->dev, "ft1000_cs: ft1000_config(0x%p)\n", link); /* setup IO window */ ret = pcmcia_loop_config(link, ft1000_confcheck, NULL); if (ret) { printk(KERN_INFO "ft1000: Could not configure pcmcia\n"); return -ENODEV; } /* configure device */ ret = pcmcia_enable_device(link); if (ret) { printk(KERN_INFO "ft1000: could not enable pcmcia\n"); goto failed; } link->priv = init_ft1000_card(link, &ft1000_reset); if (!link->priv) { printk(KERN_INFO "ft1000: Could not register as network device\n"); goto failed; } /* Finally, report what we've done */ return 0; failed: pcmcia_disable_device(link); return -ENODEV; }
static int __devinit avma1cs_config(struct pcmcia_device *link) { int i = -1; char devname[128]; IsdnCard_t icard; int busy = 0; dev_dbg(&link->dev, "avma1cs_config(0x%p)\n", link); devname[0] = 0; if (link->prod_id[1]) strlcpy(devname, link->prod_id[1], sizeof(devname)); if (pcmcia_loop_config(link, avma1cs_configcheck, NULL)) return -ENODEV; do { /* * allocate an interrupt line */ if (!link->irq) { /* undo */ pcmcia_disable_device(link); break; } /* * configure the PCMCIA socket */ i = pcmcia_enable_device(link); if (i != 0) { pcmcia_disable_device(link); break; } } while (0); /* If any step failed, release any partially configured state */ if (i != 0) { avma1cs_release(link); return -ENODEV; } icard.para[0] = link->irq; icard.para[1] = link->resource[0]->start; icard.protocol = isdnprot; icard.typ = ISDN_CTYPE_A1_PCMCIA; i = hisax_init_pcmcia(link, &busy, &icard); if (i < 0) { printk(KERN_ERR "avma1_cs: failed to initialize AVM A1 " "PCMCIA %d at i/o %#x\n", i, (unsigned int) link->resource[0]->start); avma1cs_release(link); return -ENODEV; } link->priv = (void *) (unsigned long) i; return 0; } /* avma1cs_config */
static int bluecard_config(struct pcmcia_device *link) { bluecard_info_t *info = link->priv; int i, n; #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,37)) link->config_index = 0x20; #else link->conf.ConfigIndex = 0x20; #endif #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)) link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8; link->resource[0]->end = 64; link->io_lines = 6; #else link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; link->io.NumPorts1 = 64; link->io.IOAddrLines = 6; #endif for (n = 0; n < 0x400; n += 0x40) { #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)) link->resource[0]->start = n ^ 0x300; i = pcmcia_request_io(link); #else link->io.BasePort1 = n ^ 0x300; i = pcmcia_request_io(link, &link->io); #endif if (i == 0) break; } if (i != 0) goto failed; #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,35)) i = pcmcia_request_irq(link, bluecard_interrupt); if (i != 0) goto failed; #else i = pcmcia_request_irq(link, &link->irq); if (i != 0) link->irq.AssignedIRQ = 0; #endif i = pcmcia_enable_device(link); if (i != 0) goto failed; if (bluecard_open(info) != 0) goto failed; return 0; failed: bluecard_release(link); return -ENODEV; }
static int orinoco_cs_config(struct pcmcia_device *link) { struct orinoco_private *priv = link->priv; hermes_t *hw = &priv->hw; int ret; void __iomem *mem; link->config_flags |= CONF_AUTO_SET_VPP | CONF_AUTO_CHECK_VCC | CONF_AUTO_SET_IO | CONF_ENABLE_IRQ; if (ignore_cis_vcc) link->config_flags &= ~CONF_AUTO_CHECK_VCC; ret = pcmcia_loop_config(link, orinoco_cs_config_check, NULL); if (ret) { if (!ignore_cis_vcc) printk(KERN_ERR PFX "GetNextTuple(): No matching " "CIS configuration. Maybe you need the " "ignore_cis_vcc=1 parameter.\n"); goto failed; } ret = pcmcia_request_irq(link, orinoco_interrupt); if (ret) goto failed; /* We initialize the hermes structure before completing PCMCIA * configuration just in case the interrupt handler gets * called. */ mem = ioport_map(link->resource[0]->start, resource_size(link->resource[0])); if (!mem) goto failed; hermes_struct_init(hw, mem, HERMES_16BIT_REGSPACING); ret = pcmcia_enable_device(link); if (ret) goto failed; /* Initialise the main driver */ if (orinoco_init(priv) != 0) { printk(KERN_ERR PFX "orinoco_init() failed\n"); goto failed; } /* Register an interface with the stack */ if (orinoco_if_add(priv, link->resource[0]->start, link->irq, NULL) != 0) { printk(KERN_ERR PFX "orinoco_if_add() failed\n"); goto failed; } return 0; failed: orinoco_cs_release(link); return -ENODEV; } /* orinoco_cs_config */
static int orinoco_cs_config(struct pcmcia_device *link) { struct orinoco_private *priv = link->priv; struct hermes *hw = &priv->hw; int ret; void __iomem *mem; link->config_flags |= CONF_AUTO_SET_VPP | CONF_AUTO_CHECK_VCC | CONF_AUTO_SET_IO | CONF_ENABLE_IRQ; if (ignore_cis_vcc) link->config_flags &= ~CONF_AUTO_CHECK_VCC; ret = pcmcia_loop_config(link, orinoco_cs_config_check, NULL); if (ret) { if (!ignore_cis_vcc) printk(KERN_ERR PFX "GetNextTuple(): No matching " "CIS configuration. Maybe you need the " "ignore_cis_vcc=1 parameter.\n"); goto failed; } mem = ioport_map(link->resource[0]->start, resource_size(link->resource[0])); if (!mem) goto failed; /* */ hermes_struct_init(hw, mem, HERMES_16BIT_REGSPACING); ret = pcmcia_request_irq(link, orinoco_interrupt); if (ret) goto failed; ret = pcmcia_enable_device(link); if (ret) goto failed; /* */ if (orinoco_init(priv) != 0) { printk(KERN_ERR PFX "orinoco_init() failed\n"); goto failed; } /* */ if (orinoco_if_add(priv, link->resource[0]->start, link->irq, NULL) != 0) { printk(KERN_ERR PFX "orinoco_if_add() failed\n"); goto failed; } return 0; failed: orinoco_cs_release(link); return -ENODEV; } /* */
void wl_adapter_insert(struct pcmcia_device *link) { struct net_device *dev; int i; int ret; /*--------------------------------------------------------------------*/ DBG_FUNC("wl_adapter_insert"); DBG_ENTER(DbgInfo); DBG_PARAM(DbgInfo, "link", "0x%p", link); dev = link->priv; /* Do we need to allocate an interrupt? */ link->config_flags |= CONF_ENABLE_IRQ; link->io_lines = 6; ret = pcmcia_request_io(link); if (ret != 0) goto failed; ret = pcmcia_request_irq(link, (void *) wl_isr); if (ret != 0) goto failed; ret = pcmcia_enable_device(link); if (ret != 0) goto failed; dev->irq = link->irq; dev->base_addr = link->resource[0]->start; SET_NETDEV_DEV(dev, &link->dev); if (register_netdev(dev) != 0) { ; goto failed; } register_wlags_sysfs(dev); // printk(KERN_INFO "%s: Wireless, io_addr %#03lx, irq %d, ""mac_address ", ; for (i = 0; i < ETH_ALEN; i++) ; DBG_LEAVE(DbgInfo); return; failed: wl_adapter_release(link); DBG_LEAVE(DbgInfo); return; } /* wl_adapter_insert */
static int b43_pcmcia_probe(struct pcmcia_device *dev) { struct ssb_bus *ssb; int err = -ENOMEM; int res = 0; ssb = kzalloc(sizeof(*ssb), GFP_KERNEL); if (!ssb) goto out_error; err = -ENODEV; dev->config_flags |= CONF_ENABLE_IRQ; dev->resource[2]->flags |= WIN_ENABLE | WIN_DATA_WIDTH_16 | WIN_USE_WAIT; dev->resource[2]->start = 0; dev->resource[2]->end = SSB_CORE_SIZE; res = pcmcia_request_window(dev, dev->resource[2], 250); if (res != 0) goto err_kfree_ssb; res = pcmcia_map_mem_page(dev, dev->resource[2], 0); if (res != 0) goto err_disable; if (!dev->irq) goto err_disable; res = pcmcia_enable_device(dev); if (res != 0) goto err_disable; err = ssb_bus_pcmciabus_register(ssb, dev, dev->resource[2]->start); if (err) goto err_disable; dev->priv = ssb; return 0; err_disable: pcmcia_disable_device(dev); err_kfree_ssb: kfree(ssb); out_error: printk(KERN_ERR "b43-pcmcia: Initialization failed (%d, %d)\n", res, err); return err; }
static int parport_config(struct pcmcia_device *link) { parport_info_t *info = link->priv; struct parport *p; int ret; dev_dbg(&link->dev, "parport_config\n"); if (epp_mode) link->config_index |= FORCE_EPP_MODE; ret = pcmcia_loop_config(link, parport_config_check, NULL); if (ret) goto failed; if (!link->irq) goto failed; ret = pcmcia_enable_device(link); if (ret) goto failed; p = parport_pc_probe_port(link->resource[0]->start, link->resource[1]->start, link->irq, PARPORT_DMA_NONE, &link->dev, IRQF_SHARED); if (p == NULL) { #ifdef CONFIG_DEBUG_PRINTK printk(KERN_NOTICE "parport_cs: parport_pc_probe_port() at " "0x%3x, irq %u failed\n", (unsigned int) link->resource[0]->start, link->irq); #else ; #endif goto failed; } p->modes |= PARPORT_MODE_PCSPP; if (epp_mode) p->modes |= PARPORT_MODE_TRISTATE | PARPORT_MODE_EPP; info->ndev = 1; info->port = p; return 0; failed: parport_cs_release(link); return -ENODEV; } /* parport_config */
static int qlogic_config(struct pcmcia_device * link) { scsi_info_t *info = link->priv; int ret; struct Scsi_Host *host; dev_dbg(&link->dev, "qlogic_config\n"); ret = pcmcia_loop_config(link, qlogic_config_check, NULL); if (ret) goto failed; if (!link->irq) goto failed; ret = pcmcia_enable_device(link); if (ret) goto failed; if ((info->manf_id == MANFID_MACNICA) || (info->manf_id == MANFID_PIONEER) || (info->manf_id == 0x0098)) { /* set ATAcmd */ outb(0xb4, link->resource[0]->start + 0xd); outb(0x24, link->resource[0]->start + 0x9); outb(0x04, link->resource[0]->start + 0xd); } /* The KXL-810AN has a bigger IO port window */ if (resource_size(link->resource[0]) == 32) host = qlogic_detect(&qlogicfas_driver_template, link, link->resource[0]->start + 16, link->irq); else host = qlogic_detect(&qlogicfas_driver_template, link, link->resource[0]->start, link->irq); if (!host) { printk(KERN_INFO "%s: no SCSI devices found\n", qlogic_name); goto failed; } info->host = host; return 0; failed: pcmcia_disable_device(link); return -ENODEV; } /* qlogic_config */
static int aha152x_config_cs(struct pcmcia_device *link) { scsi_info_t *info = link->priv; struct aha152x_setup s; int ret; struct Scsi_Host *host; dev_dbg(&link->dev, "aha152x_config\n"); ret = pcmcia_loop_config(link, aha152x_config_check, NULL); if (ret) goto failed; if (!link->irq) goto failed; ret = pcmcia_enable_device(link); if (ret) goto failed; /* Set configuration options for the aha152x driver */ memset(&s, 0, sizeof(s)); s.conf = "PCMCIA setup"; s.io_port = link->resource[0]->start; s.irq = link->irq; s.scsiid = host_id; s.reconnect = reconnect; s.parity = parity; s.synchronous = synchronous; s.delay = reset_delay; if (ext_trans) s.ext_trans = ext_trans; host = aha152x_probe_one(&s); if (host == NULL) { ; goto failed; } info->host = host; return 0; failed: aha152x_release_cs(link); return -ENODEV; }
static int vxpocket_config(struct pcmcia_device *link) { struct vx_core *chip = link->priv; int ret; snd_printdd(KERN_DEBUG "vxpocket_config called\n"); /* redefine hardware record according to the VERSION1 string */ if (!strcmp(link->prod_id[1], "VX-POCKET")) { snd_printdd("VX-pocket is detected\n"); } else { snd_printdd("VX-pocket 440 is detected\n"); /* overwrite the hardware information */ chip->hw = &vxp440_hw; chip->type = vxp440_hw.type; strcpy(chip->card->driver, vxp440_hw.name); } ret = pcmcia_request_io(link); if (ret) goto failed_preirq; ret = request_threaded_irq(link->irq, snd_vx_irq_handler, snd_vx_threaded_irq_handler, IRQF_SHARED, link->devname, link->priv); if (ret) goto failed_preirq; ret = pcmcia_enable_device(link); if (ret) goto failed; chip->dev = &link->dev; if (snd_vxpocket_assign_resources(chip, link->resource[0]->start, link->irq) < 0) goto failed; return 0; failed: free_irq(link->irq, link->priv); failed_preirq: pcmcia_disable_device(link); return -ENODEV; }
static int qlogic_resume(struct pcmcia_device *link) { scsi_info_t *info = link->priv; pcmcia_enable_device(link); if ((info->manf_id == MANFID_MACNICA) || (info->manf_id == MANFID_PIONEER) || (info->manf_id == 0x0098)) { outb(0x80, link->resource[0]->start + 0xd); outb(0x24, link->resource[0]->start + 0x9); outb(0x04, link->resource[0]->start + 0xd); } /* Ugggglllyyyy!!! */ qlogicfas408_bus_reset(NULL); return 0; }
static int __devinit ems_pcmcia_probe(struct pcmcia_device *dev) { int csval; /* */ dev->config_flags |= CONF_ENABLE_IRQ; dev->config_index = 1; dev->config_regs = PRESENT_OPTION; /* */ dev->resource[0]->end = 16; dev->resource[0]->flags |= IO_DATA_PATH_WIDTH_8; dev->resource[1]->end = 16; dev->resource[1]->flags |= IO_DATA_PATH_WIDTH_16; dev->io_lines = 5; /* */ dev->resource[2]->flags = (WIN_DATA_WIDTH_8 | WIN_MEMORY_TYPE_CM | WIN_ENABLE); dev->resource[2]->start = dev->resource[2]->end = 0; csval = pcmcia_request_window(dev, dev->resource[2], 0); if (csval) { dev_err(&dev->dev, "pcmcia_request_window failed (err=%d)\n", csval); return 0; } csval = pcmcia_map_mem_page(dev, dev->resource[2], dev->config_base); if (csval) { dev_err(&dev->dev, "pcmcia_map_mem_page failed (err=%d)\n", csval); return 0; } csval = pcmcia_enable_device(dev); if (csval) { dev_err(&dev->dev, "pcmcia_enable_device failed (err=%d)\n", csval); return 0; } ems_pcmcia_add_card(dev, dev->resource[2]->start); return 0; }
static void mio_cs_config(struct pcmcia_device *link) { int ret; DPRINTK("mio_cs_config(link=%p)\n", link); link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO; ret = pcmcia_loop_config(link, mio_pcmcia_config_loop, NULL); if (ret) { dev_warn(&link->dev, "no configuration found\n"); return; } if (!link->irq) dev_info(&link->dev, "no IRQ available\n"); ret = pcmcia_enable_device(link); }
/** * comedi_pcmcia_enable() - Request the regions and enable the PCMCIA device. * @dev: comedi_device struct * @conf_check: optional callback to check the pcmcia_device configuration * * The comedi PCMCIA driver needs to set the link->config_flags, as * appropriate for that driver, before calling this function in order * to allow pcmcia_loop_config() to do its internal autoconfiguration. */ int comedi_pcmcia_enable(struct comedi_device *dev, int (*conf_check)(struct pcmcia_device *, void *)) { struct pcmcia_device *link = comedi_to_pcmcia_dev(dev); int ret; if (!link) return -ENODEV; if (!conf_check) conf_check = comedi_pcmcia_conf_check; ret = pcmcia_loop_config(link, conf_check, NULL); if (ret) return ret; return pcmcia_enable_device(link); }
static int fdomain_config(struct pcmcia_device *link) { scsi_info_t *info = link->priv; int ret; char str[22]; struct Scsi_Host *host; dev_dbg(&link->dev, "fdomain_config\n"); ret = pcmcia_loop_config(link, fdomain_config_check, NULL); if (ret) goto failed; if (!link->irq) goto failed; ret = pcmcia_enable_device(link); if (ret) goto failed; /* A bad hack... */ release_region(link->resource[0]->start, resource_size(link->resource[0])); /* Set configuration options for the fdomain driver */ sprintf(str, "%d,%d", (unsigned int) link->resource[0]->start, link->irq); fdomain_setup(str); host = __fdomain_16x0_detect(&fdomain_driver_template); if (!host) { printk(KERN_INFO "fdomain_cs: no SCSI devices found\n"); goto failed; } if (scsi_add_host(host, NULL)) goto failed; scsi_scan_host(host); info->host = host; return 0; failed: fdomain_release(link); return -ENODEV; } /* fdomain_config */
static int __devinit sedlbauer_config(struct pcmcia_device *link) { int ret; IsdnCard_t icard; dev_dbg(&link->dev, "sedlbauer_config(0x%p)\n", link); link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_CHECK_VCC | CONF_AUTO_SET_VPP | CONF_AUTO_AUDIO | CONF_AUTO_SET_IO; ret = pcmcia_loop_config(link, sedlbauer_config_check, NULL); if (ret) goto failed; ret = pcmcia_enable_device(link); if (ret) goto failed; icard.para[0] = link->irq; icard.para[1] = link->resource[0]->start; icard.protocol = protocol; icard.typ = ISDN_CTYPE_SEDLBAUER_PCMCIA; ret = hisax_init_pcmcia(link, &(((local_info_t *)link->priv)->stop), &icard); if (ret < 0) { printk(KERN_ERR "sedlbauer_cs: failed to initialize SEDLBAUER PCMCIA %d with %pR\n", ret, link->resource[0]); sedlbauer_release(link); return -ENODEV; } else ((local_info_t *)link->priv)->cardnr = ret; return 0; failed: sedlbauer_release(link); return -ENODEV; } /* sedlbauer_config */
static int bluecard_config(struct pcmcia_device *link) { struct bluecard_info *info = link->priv; int i, n; link->config_index = 0x20; link->resource[0]->flags |= IO_DATA_PATH_WIDTH_8; link->resource[0]->end = 64; link->io_lines = 6; for (n = 0; n < 0x400; n += 0x40) { link->resource[0]->start = n ^ 0x300; i = pcmcia_request_io(link); if (i == 0) break; } if (i != 0) goto failed; i = pcmcia_request_irq(link, bluecard_interrupt); if (i != 0) goto failed; i = pcmcia_enable_device(link); if (i != 0) goto failed; if (bluecard_open(info) != 0) goto failed; return 0; failed: bluecard_release(link); return -ENODEV; }
static int elsa_cs_config(struct pcmcia_device *link) { int i; IsdnCard_t icard; dev_dbg(&link->dev, "elsa_config(0x%p)\n", link); link->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO; i = pcmcia_loop_config(link, elsa_cs_configcheck, NULL); if (i != 0) goto failed; if (!link->irq) goto failed; i = pcmcia_enable_device(link); if (i != 0) goto failed; icard.para[0] = link->irq; icard.para[1] = link->resource[0]->start; icard.protocol = protocol; icard.typ = ISDN_CTYPE_ELSA_PCMCIA; i = hisax_init_pcmcia(link, &(((local_info_t *)link->priv)->busy), &icard); if (i < 0) { printk(KERN_ERR "elsa_cs: failed to initialize Elsa " "PCMCIA %d with %pR\n", i, link->resource[0]); elsa_cs_release(link); } else ((local_info_t *)link->priv)->cardnr = i; return 0; failed: elsa_cs_release(link); return -ENODEV; } /* elsa_cs_config */
static int __devinit teles_cs_config(struct pcmcia_device *link) { int i; IsdnCard_t icard; dev_dbg(&link->dev, "teles_config(0x%p)\n", link); i = pcmcia_loop_config(link, teles_cs_configcheck, NULL); if (i != 0) goto cs_failed; if (!link->irq) goto cs_failed; i = pcmcia_enable_device(link); if (i != 0) goto cs_failed; icard.para[0] = link->irq; icard.para[1] = link->resource[0]->start; icard.protocol = protocol; icard.typ = ISDN_CTYPE_TELESPCMCIA; i = hisax_init_pcmcia(link, &(((local_info_t*)link->priv)->busy), &icard); if (i < 0) { printk(KERN_ERR "teles_cs: failed to initialize Teles PCMCIA %d at i/o %#x\n", i, (unsigned int) link->resource[0]->start); teles_cs_release(link); return -ENODEV; } ((local_info_t*)link->priv)->cardnr = i; return 0; cs_failed: teles_cs_release(link); return -ENODEV; } /* teles_cs_config */
static int prism2_config(struct pcmcia_device *link) { struct net_device *dev; struct hostap_interface *iface; local_info_t *local; int ret = 1; struct hostap_cs_priv *hw_priv; unsigned long flags; PDEBUG(DEBUG_FLOW, "prism2_config()\n"); hw_priv = kzalloc(sizeof(*hw_priv), GFP_KERNEL); if (hw_priv == NULL) { ret = -ENOMEM; goto failed; } /* Look for an appropriate configuration table entry in the CIS */ link->config_flags |= CONF_AUTO_SET_VPP | CONF_AUTO_AUDIO | CONF_AUTO_CHECK_VCC | CONF_AUTO_SET_IO | CONF_ENABLE_IRQ; if (ignore_cis_vcc) link->config_flags &= ~CONF_AUTO_CHECK_VCC; ret = pcmcia_loop_config(link, prism2_config_check, NULL); if (ret) { if (!ignore_cis_vcc) printk(KERN_ERR "GetNextTuple(): No matching " "CIS configuration. Maybe you need the " "ignore_cis_vcc=1 parameter.\n"); goto failed; } /* Need to allocate net_device before requesting IRQ handler */ dev = prism2_init_local_data(&prism2_pccard_funcs, 0, &link->dev); if (dev == NULL) goto failed; link->priv = dev; iface = netdev_priv(dev); local = iface->local; local->hw_priv = hw_priv; hw_priv->link = link; /* * We enable IRQ here, but IRQ handler will not proceed * until dev->base_addr is set below. This protect us from * receive interrupts when driver is not initialized. */ ret = pcmcia_request_irq(link, prism2_interrupt); if (ret) goto failed; ret = pcmcia_enable_device(link); if (ret) goto failed; spin_lock_irqsave(&local->irq_init_lock, flags); dev->irq = link->irq; dev->base_addr = link->resource[0]->start; spin_unlock_irqrestore(&local->irq_init_lock, flags); local->shutdown = 0; sandisk_enable_wireless(dev); ret = prism2_hw_config(dev, 1); if (!ret) ret = hostap_hw_ready(dev); return ret; failed: kfree(hw_priv); prism2_release((u_long)link); return ret; }
/* * setup PCMCIA socket and probe for PEAK-System PC-CARD */ static int __devinit pcan_probe(struct pcmcia_device *pdev) { struct pcan_pccard *card; int err; pdev->config_flags |= CONF_ENABLE_IRQ | CONF_AUTO_SET_IO; err = pcmcia_loop_config(pdev, pcan_conf_check, NULL); if (err) { dev_err(&pdev->dev, "pcmcia_loop_config() error %d\n", err); goto probe_err_1; } if (!pdev->irq) { dev_err(&pdev->dev, "no irq assigned\n"); err = -ENODEV; goto probe_err_1; } err = pcmcia_enable_device(pdev); if (err) { dev_err(&pdev->dev, "pcmcia_enable_device failed err=%d\n", err); goto probe_err_1; } card = kzalloc(sizeof(struct pcan_pccard), GFP_KERNEL); if (!card) { dev_err(&pdev->dev, "couldn't allocate card memory\n"); err = -ENOMEM; goto probe_err_2; } card->pdev = pdev; pdev->priv = card; /* sja1000 api uses iomem */ card->ioport_addr = ioport_map(pdev->resource[0]->start, resource_size(pdev->resource[0])); if (!card->ioport_addr) { dev_err(&pdev->dev, "couldn't map io port into io memory\n"); err = -ENOMEM; goto probe_err_3; } card->fw_major = pcan_read_reg(card, PCC_FW_MAJOR); card->fw_minor = pcan_read_reg(card, PCC_FW_MINOR); /* display board name and firware version */ dev_info(&pdev->dev, "PEAK-System pcmcia card %s fw %d.%d\n", pdev->prod_id[1] ? pdev->prod_id[1] : "PCAN-PC Card", card->fw_major, card->fw_minor); /* detect available channels */ pcan_add_channels(card); if (!card->chan_count) goto probe_err_4; /* init the timer which controls the leds */ init_timer(&card->led_timer); card->led_timer.function = pcan_led_timer; card->led_timer.data = (unsigned long)card; /* request the given irq */ err = request_irq(pdev->irq, &pcan_isr, IRQF_SHARED, PCC_NAME, card); if (err) { dev_err(&pdev->dev, "couldn't request irq%d\n", pdev->irq); goto probe_err_5; } /* power on the connectors */ pcan_set_can_power(card, 1); return 0; probe_err_5: /* unregister can devices from network */ pcan_free_channels(card); probe_err_4: ioport_unmap(card->ioport_addr); probe_err_3: kfree(card); pdev->priv = NULL; probe_err_2: pcmcia_disable_device(pdev); probe_err_1: return err; }