static struct ns558* ns558_pnp_probe(struct pci_dev *dev, struct ns558 *next) { int ioport, iolen; struct ns558 *port; if (dev->prepare && dev->prepare(dev) < 0) return next; if (!(dev->resource[0].flags & IORESOURCE_IO)) { printk(KERN_WARNING "ns558: No i/o ports on a gameport? Weird\n"); return next; } if (dev->activate && dev->activate(dev) < 0) { printk(KERN_ERR "ns558: PnP resource allocation failed\n"); return next; } ioport = pci_resource_start(dev, 0); iolen = pci_resource_len(dev, 0); if (!request_region(ioport, iolen, "ns558-pnp")) goto deactivate; if (!(port = kmalloc(sizeof(struct ns558), GFP_KERNEL))) { printk(KERN_ERR "ns558: Memory allocation failed.\n"); goto deactivate; } memset(port, 0, sizeof(struct ns558)); port->next = next; port->type = NS558_PNP; port->gameport.io = ioport; port->size = iolen; port->dev = dev; gameport_register_port(&port->gameport); printk(KERN_INFO "gameport%d: NS558 PnP at %#x", port->gameport.number, port->gameport.io); if (iolen > 1) printk(" size %d", iolen); printk(" speed %d kHz\n", port->gameport.speed); return port; deactivate: if (dev->deactivate) dev->deactivate(dev); return next; }
static int __devinit emu_probe(struct pci_dev *pdev, const struct pci_device_id *ent) { struct emu *emu; struct gameport *port; int error; emu = kzalloc(sizeof(struct emu), GFP_KERNEL); port = gameport_allocate_port(); if (!emu || !port) { ; error = -ENOMEM; goto err_out_free; } error = pci_enable_device(pdev); if (error) goto err_out_free; emu->io = pci_resource_start(pdev, 0); emu->size = pci_resource_len(pdev, 0); emu->dev = pdev; emu->gameport = port; gameport_set_name(port, "EMU10K1"); gameport_set_phys(port, "pci%s/gameport0", pci_name(pdev)); port->dev.parent = &pdev->dev; port->io = emu->io; if (!request_region(emu->io, emu->size, "emu10k1-gp")) { // printk(KERN_ERR "emu10k1-gp: unable to grab region 0x%x-0x%x\n", ; error = -EBUSY; goto err_out_disable_dev; } pci_set_drvdata(pdev, emu); gameport_register_port(port); return 0; err_out_disable_dev: pci_disable_device(pdev); err_out_free: gameport_free_port(port); kfree(emu); return error; }
static int __devinit emu_probe(struct pci_dev *pdev, const struct pci_device_id *ent) { int ioport, iolen; struct emu *emu; if (pci_enable_device(pdev)) return -EBUSY; ioport = pci_resource_start(pdev, 0); iolen = pci_resource_len(pdev, 0); if (!request_region(ioport, iolen, "emu10k1-gp")) return -EBUSY; if (!(emu = kmalloc(sizeof(struct emu), GFP_KERNEL))) { printk(KERN_ERR "emu10k1-gp: Memory allocation failed.\n"); release_region(ioport, iolen); return -ENOMEM; } memset(emu, 0, sizeof(struct emu)); sprintf(emu->phys, "pci%s/gameport0", pci_name(pdev)); emu->size = iolen; emu->dev = pdev; emu->gameport.io = ioport; emu->gameport.name = pci_name(pdev); emu->gameport.phys = emu->phys; emu->gameport.id.bustype = BUS_PCI; emu->gameport.id.vendor = pdev->vendor; emu->gameport.id.product = pdev->device; pci_set_drvdata(pdev, emu); gameport_register_port(&emu->gameport); printk(KERN_INFO "gameport: pci%s speed %d kHz\n", pci_name(pdev), emu->gameport.speed); return 0; }
static int __devinit emu_probe(struct pci_dev *pdev, const struct pci_device_id *ent) { int ioport, iolen; struct emu *emu; struct gameport *port; if (pci_enable_device(pdev)) return -EBUSY; ioport = pci_resource_start(pdev, 0); iolen = pci_resource_len(pdev, 0); if (!request_region(ioport, iolen, "emu10k1-gp")) return -EBUSY; emu = kzalloc(sizeof(struct emu), GFP_KERNEL); port = gameport_allocate_port(); if (!emu || !port) { printk(KERN_ERR "emu10k1-gp: Memory allocation failed\n"); release_region(ioport, iolen); kfree(emu); gameport_free_port(port); return -ENOMEM; } emu->io = ioport; emu->size = iolen; emu->dev = pdev; emu->gameport = port; gameport_set_name(port, "EMU10K1"); gameport_set_phys(port, "pci%s/gameport0", pci_name(pdev)); port->dev.parent = &pdev->dev; port->io = ioport; pci_set_drvdata(pdev, emu); gameport_register_port(port); return 0; }
static int __devinit ns558_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) { int ioport, iolen; int rc; struct ns558 *port; rc = pci_enable_device(pdev); if (rc) { printk(KERN_ERR "ns558: Cannot enable PCI gameport (bus %d, devfn %d) error=%d\n", pdev->bus->number, pdev->devfn, rc); return rc; } ioport = pci_resource_start(pdev, ent->driver_data); iolen = pci_resource_len(pdev, ent->driver_data); if (!request_region(ioport, iolen, "ns558-pci")) return -EBUSY; if (!(port = kmalloc(sizeof(struct ns558), GFP_KERNEL))) { printk(KERN_ERR "Memory allocation failed.\n"); release_region(ioport, iolen); return -ENOMEM; } memset(port, 0, sizeof(struct ns558)); port->type = NS558_PCI; port->gameport.io = ioport; port->gameport.size = iolen; port->dev = pdev; pdev->driver_data = port; gameport_register_port(&port->gameport); printk(KERN_INFO "gameport%d: NS558 PCI at %#x", port->gameport.number, port->gameport.io); if (port->gameport.size > 1) printk(" size %d", port->gameport.size); printk(" speed %d kHz\n", port->gameport.speed); return 0; }
static int __devinit snd_ymfpci_create_gameport(struct snd_ymfpci *chip, int dev, int legacy_ctrl, int legacy_ctrl2) { struct gameport *gp; struct resource *r = NULL; int io_port = joystick_port[dev]; if (!io_port) return -ENODEV; if (chip->pci->device >= 0x0010) { /* YMF 744/754 */ if (io_port == 1) { /* auto-detect */ if (!(io_port = pci_resource_start(chip->pci, 2))) return -ENODEV; } } else { if (io_port == 1) { /* auto-detect */ for (io_port = 0x201; io_port <= 0x205; io_port++) { if (io_port == 0x203) continue; if ((r = request_region(io_port, 1, "YMFPCI gameport")) != NULL) break; } if (!r) { printk(KERN_ERR "ymfpci: no gameport ports available\n"); return -EBUSY; } } switch (io_port) { case 0x201: legacy_ctrl2 |= 0 << 6; break; case 0x202: legacy_ctrl2 |= 1 << 6; break; case 0x204: legacy_ctrl2 |= 2 << 6; break; case 0x205: legacy_ctrl2 |= 3 << 6; break; default: printk(KERN_ERR "ymfpci: invalid joystick port %#x", io_port); return -EINVAL; } } if (!r && !(r = request_region(io_port, 1, "YMFPCI gameport"))) { printk(KERN_ERR "ymfpci: joystick port %#x is in use.\n", io_port); return -EBUSY; } chip->gameport = gp = gameport_allocate_port(); if (!gp) { printk(KERN_ERR "ymfpci: cannot allocate memory for gameport\n"); release_and_free_resource(r); return -ENOMEM; } gameport_set_name(gp, "Yamaha YMF Gameport"); gameport_set_phys(gp, "pci%s/gameport0", pci_name(chip->pci)); gameport_set_dev_parent(gp, &chip->pci->dev); gp->io = io_port; gameport_set_port_data(gp, r); if (chip->pci->device >= 0x0010) /* YMF 744/754 */ pci_write_config_word(chip->pci, PCIR_DSXG_JOYBASE, io_port); pci_write_config_word(chip->pci, PCIR_DSXG_LEGACY, legacy_ctrl | YMFPCI_LEGACY_JPEN); pci_write_config_word(chip->pci, PCIR_DSXG_ELEGACY, legacy_ctrl2); gameport_register_port(chip->gameport); return 0; }
static int snd_cmi8328_probe(struct device *pdev, unsigned int ndev) { struct snd_card *card; struct snd_opl3 *opl3; struct snd_cmi8328 *cmi; #ifdef SUPPORT_JOYSTICK struct resource *res; #endif int err, pos; static long mpu_ports[] = { 0x330, 0x300, 0x310, 0x320, 0x332, 0x334, 0x336, -1 }; static u8 mpu_port_bits[] = { 3, 0, 1, 2, 4, 5, 6 }; static int mpu_irqs[] = { 9, 7, 5, 3, -1 }; static u8 mpu_irq_bits[] = { 3, 2, 1, 0 }; static int irqs[] = { 9, 10, 11, 7, -1 }; static u8 irq_bits[] = { 2, 3, 4, 1 }; static int dma1s[] = { 3, 1, 0, -1 }; static u8 dma_bits[] = { 3, 2, 1 }; static int dma2s[][2] = { {1, -1}, {0, -1}, {-1, -1}, {0, -1} }; u16 port = cmi8328_ports[ndev]; u8 val; /* 0xff is invalid configuration (but settable - hope it isn't set) */ if (snd_cmi8328_cfg_read(port, CFG1) == 0xff) return -ENODEV; /* the SB disable bit must NEVER EVER be cleared or the WSS dies */ snd_cmi8328_cfg_write(port, CFG1, CFG1_SB_DISABLE); if (snd_cmi8328_cfg_read(port, CFG1) != CFG1_SB_DISABLE) return -ENODEV; /* disable everything first */ snd_cmi8328_cfg_write(port, CFG2, 0); /* disable CDROM and MPU401 */ snd_cmi8328_cfg_write(port, CFG3, 0); /* disable CDROM IRQ and DMA */ if (irq[ndev] == SNDRV_AUTO_IRQ) { irq[ndev] = snd_legacy_find_free_irq(irqs); if (irq[ndev] < 0) { snd_printk(KERN_ERR "unable to find a free IRQ\n"); return -EBUSY; } } if (dma1[ndev] == SNDRV_AUTO_DMA) { dma1[ndev] = snd_legacy_find_free_dma(dma1s); if (dma1[ndev] < 0) { snd_printk(KERN_ERR "unable to find a free DMA1\n"); return -EBUSY; } } if (dma2[ndev] == SNDRV_AUTO_DMA) { dma2[ndev] = snd_legacy_find_free_dma(dma2s[dma1[ndev] % 4]); if (dma2[ndev] < 0) { snd_printk(KERN_WARNING "unable to find a free DMA2, full-duplex will not work\n"); dma2[ndev] = -1; } } /* configure WSS IRQ... */ pos = array_find(irqs, irq[ndev]); if (pos < 0) { snd_printk(KERN_ERR "invalid IRQ %d\n", irq[ndev]); return -EINVAL; } val = irq_bits[pos] << 3; /* ...and DMA... */ pos = array_find(dma1s, dma1[ndev]); if (pos < 0) { snd_printk(KERN_ERR "invalid DMA1 %d\n", dma1[ndev]); return -EINVAL; } val |= dma_bits[pos]; /* ...and DMA2 */ if (dma2[ndev] >= 0 && dma1[ndev] != dma2[ndev]) { pos = array_find(dma2s[dma1[ndev]], dma2[ndev]); if (pos < 0) { snd_printk(KERN_ERR "invalid DMA2 %d\n", dma2[ndev]); return -EINVAL; } val |= 0x04; /* enable separate capture DMA */ } outb(val, port); err = snd_card_create(index[ndev], id[ndev], THIS_MODULE, sizeof(struct snd_cmi8328), &card); if (err < 0) return err; cmi = card->private_data; cmi->card = card; cmi->port = port; cmi->wss_cfg = val; snd_card_set_dev(card, pdev); err = snd_wss_create(card, port + 4, -1, irq[ndev], dma1[ndev], dma2[ndev], WSS_HW_DETECT, 0, &cmi->wss); if (err < 0) goto error; err = snd_wss_pcm(cmi->wss, 0, NULL); if (err < 0) goto error; err = snd_wss_mixer(cmi->wss); if (err < 0) goto error; err = snd_cmi8328_mixer(cmi->wss); if (err < 0) goto error; if (snd_wss_timer(cmi->wss, 0, NULL) < 0) snd_printk(KERN_WARNING "error initializing WSS timer\n"); if (mpuport[ndev] == SNDRV_AUTO_PORT) { mpuport[ndev] = snd_legacy_find_free_ioport(mpu_ports, 2); if (mpuport[ndev] < 0) snd_printk(KERN_ERR "unable to find a free MPU401 port\n"); } if (mpuirq[ndev] == SNDRV_AUTO_IRQ) { mpuirq[ndev] = snd_legacy_find_free_irq(mpu_irqs); if (mpuirq[ndev] < 0) snd_printk(KERN_ERR "unable to find a free MPU401 IRQ\n"); } /* enable and configure MPU401 */ if (mpuport[ndev] > 0 && mpuirq[ndev] > 0) { val = CFG2_MPU_ENABLE; pos = array_find_l(mpu_ports, mpuport[ndev]); if (pos < 0) snd_printk(KERN_WARNING "invalid MPU401 port 0x%lx\n", mpuport[ndev]); else { val |= mpu_port_bits[pos] << 5; pos = array_find(mpu_irqs, mpuirq[ndev]); if (pos < 0) snd_printk(KERN_WARNING "invalid MPU401 IRQ %d\n", mpuirq[ndev]); else { val |= mpu_irq_bits[pos] << 3; snd_cmi8328_cfg_write(port, CFG2, val); if (snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401, mpuport[ndev], 0, mpuirq[ndev], NULL) < 0) snd_printk(KERN_ERR "error initializing MPU401\n"); } } } /* OPL3 is hardwired to 0x388 and cannot be disabled */ if (snd_opl3_create(card, 0x388, 0x38a, OPL3_HW_AUTO, 0, &opl3) < 0) snd_printk(KERN_ERR "error initializing OPL3\n"); else if (snd_opl3_hwdep_new(opl3, 0, 1, NULL) < 0) snd_printk(KERN_WARNING "error initializing OPL3 hwdep\n"); strcpy(card->driver, "CMI8328"); strcpy(card->shortname, "C-Media CMI8328"); sprintf(card->longname, "%s at 0x%lx, irq %d, dma %d,%d", card->shortname, cmi->wss->port, irq[ndev], dma1[ndev], (dma2[ndev] >= 0) ? dma2[ndev] : dma1[ndev]); dev_set_drvdata(pdev, card); err = snd_card_register(card); if (err < 0) goto error; #ifdef SUPPORT_JOYSTICK if (!gameport[ndev]) return 0; /* gameport is hardwired to 0x200 */ res = request_region(0x200, 8, "CMI8328 gameport"); if (!res) snd_printk(KERN_WARNING "unable to allocate gameport I/O port\n"); else { struct gameport *gp = cmi->gameport = gameport_allocate_port(); if (!cmi->gameport) release_and_free_resource(res); else { gameport_set_name(gp, "CMI8328 Gameport"); gameport_set_phys(gp, "%s/gameport0", dev_name(pdev)); gameport_set_dev_parent(gp, pdev); gp->io = 0x200; gameport_set_port_data(gp, res); /* Enable gameport */ snd_cmi8328_cfg_write(port, CFG1, CFG1_SB_DISABLE | CFG1_GAMEPORT); gameport_register_port(gp); } } #endif return 0; error: snd_card_free(card); return err; }
static struct ns558* ns558_isa_probe(int io, struct ns558 *next) { int i, j, b; unsigned char c, u, v; struct ns558 *port; /* * No one should be using this address. */ if (check_region(io, 1)) return next; /* * We must not be able to write arbitrary values to the port. * The lower two axis bits must be 1 after a write. */ c = inb(io); outb(~c & ~3, io); if (~(u = v = inb(io)) & 3) { outb(c, io); return next; } /* * After a trigger, there must be at least some bits changing. */ for (i = 0; i < 1000; i++) v &= inb(io); if (u == v) { outb(c, io); return next; } wait_ms(3); /* * After some time (4ms) the axes shouldn't change anymore. */ u = inb(io); for (i = 0; i < 1000; i++) if ((u ^ inb(io)) & 0xf) { outb(c, io); return next; } /* * And now find the number of mirrors of the port. */ for (i = 1; i < 5; i++) { if (check_region(io & (-1 << i), (1 << i))) /* Don't disturb anyone */ break; outb(0xff, io & (-1 << i)); for (j = b = 0; j < 1000; j++) if (inb(io & (-1 << i)) != inb((io & (-1 << i)) + (1 << i) - 1)) b++; wait_ms(3); if (b > 300) /* We allow 30% difference */ break; } i--; if (!(port = kmalloc(sizeof(struct ns558), GFP_KERNEL))) { printk(KERN_ERR "ns558: Memory allocation failed.\n"); return next; } memset(port, 0, sizeof(struct ns558)); port->next = next; port->type = NS558_ISA; port->size = (1 << i); port->gameport.io = io & (-1 << i); request_region(port->gameport.io, (1 << i), "ns558-isa"); gameport_register_port(&port->gameport); printk(KERN_INFO "gameport%d: NS558 ISA at %#x", port->gameport.number, port->gameport.io); if (port->size > 1) printk(" size %d", port->size); printk(" speed %d kHz\n", port->gameport.speed); return port; }
static int __init init_mad16(void) { int dmatype = 0; printk(KERN_INFO "MAD16 audio driver Copyright (C) by Hannu Savolainen 1993-1996\n"); printk(KERN_INFO "CDROM "); switch (cdtype) { case 0x00: printk("Disabled"); cdirq = 0; break; case 0x02: printk("Sony CDU31A"); dmatype = 1; if(cddma == -1) cddma = 3; break; case 0x04: printk("Mitsumi"); dmatype = 0; if(cddma == -1) cddma = 5; break; case 0x06: printk("Panasonic Lasermate"); dmatype = 1; if(cddma == -1) cddma = 3; break; case 0x08: printk("Secondary IDE"); dmatype = 0; if(cddma == -1) cddma = 5; break; case 0x0A: printk("Primary IDE"); dmatype = 0; if(cddma == -1) cddma = 5; break; default: printk("\n"); printk(KERN_ERR "Invalid CDROM type\n"); return -EINVAL; } /* * Build the config words */ mad16_conf = (joystick ^ 1) | cdtype; mad16_cdsel = 0; if (opl4) mad16_cdsel |= 0x20; if(cdtype){ if (cddma > 7 || cddma < 0 || dma_map[dmatype][cddma] == -1) { printk("\n"); printk(KERN_ERR "Invalid CDROM DMA\n"); return -EINVAL; } if (cddma) printk(", DMA %d", cddma); else printk(", no DMA"); if (!cdirq) printk(", no IRQ"); else if (cdirq < 0 || cdirq > 15 || irq_map[cdirq] == -1) { printk(", invalid IRQ (disabling)"); cdirq = 0; } else printk(", IRQ %d", cdirq); mad16_cdsel |= dma_map[dmatype][cddma]; if (cdtype < 0x08) { switch (cdport) { case 0x340: mad16_cdsel |= 0x00; break; case 0x330: mad16_cdsel |= 0x40; break; case 0x360: mad16_cdsel |= 0x80; break; case 0x320: mad16_cdsel |= 0xC0; break; default: printk(KERN_ERR "Unknown CDROM I/O base %d\n", cdport); return -EINVAL; } } mad16_cdsel |= irq_map[cdirq]; } printk(".\n"); cfg.io_base = io; cfg.irq = irq; cfg.dma = dma; cfg.dma2 = dma16; if (cfg.io_base == -1 || cfg.dma == -1 || cfg.irq == -1) { printk(KERN_ERR "I/O, DMA and irq are mandatory\n"); return -EINVAL; } if (!probe_mad16(&cfg)) return -ENODEV; cfg_mpu.io_base = mpu_io; cfg_mpu.irq = mpu_irq; attach_mad16(&cfg); found_mpu = probe_mad16_mpu(&cfg_mpu); if (joystick == 1) { /* register gameport */ if (!request_region(0x201, 1, "mad16 gameport")) printk(KERN_ERR "mad16: gameport address 0x201 already in use\n"); else { printk(KERN_ERR "mad16: gameport enabled at 0x201\n"); gameport.io = 0x201; gameport_register_port(&gameport); } } else printk(KERN_ERR "mad16: gameport disabled.\n"); return 0; }