Lines Matching refs:chip
71 #define SLIO_REG(chip, x) ((chip)->io_port + ESSIO_REG_##x)
73 #define SLDM_REG(chip, x) ((chip)->ddma_port + ESSDM_REG_##x)
75 #define SLSB_REG(chip, x) ((chip)->sb_port + ESSSB_REG_##x)
240 static void snd_es1938_mixer_write(struct es1938 *chip, unsigned char reg, unsigned char val)
243 spin_lock_irqsave(&chip->mixer_lock, flags);
244 outb(reg, SLSB_REG(chip, MIXERADDR));
245 outb(val, SLSB_REG(chip, MIXERDATA));
246 spin_unlock_irqrestore(&chip->mixer_lock, flags);
247 dev_dbg(chip->card->dev, "Mixer reg %02x set to %02x\n", reg, val);
253 static int snd_es1938_mixer_read(struct es1938 *chip, unsigned char reg)
257 spin_lock_irqsave(&chip->mixer_lock, flags);
258 outb(reg, SLSB_REG(chip, MIXERADDR));
259 data = inb(SLSB_REG(chip, MIXERDATA));
260 spin_unlock_irqrestore(&chip->mixer_lock, flags);
261 dev_dbg(chip->card->dev, "Mixer reg %02x now is %02x\n", reg, data);
268 static int snd_es1938_mixer_bits(struct es1938 *chip, unsigned char reg,
273 spin_lock_irqsave(&chip->mixer_lock, flags);
274 outb(reg, SLSB_REG(chip, MIXERADDR));
275 old = inb(SLSB_REG(chip, MIXERDATA));
279 outb(new, SLSB_REG(chip, MIXERDATA));
280 dev_dbg(chip->card->dev,
284 spin_unlock_irqrestore(&chip->mixer_lock, flags);
291 static void snd_es1938_write_cmd(struct es1938 *chip, unsigned char cmd)
296 v = inb(SLSB_REG(chip, READSTATUS));
298 outb(cmd, SLSB_REG(chip, WRITEDATA));
302 dev_err(chip->card->dev,
309 static int snd_es1938_get_byte(struct es1938 *chip)
314 v = inb(SLSB_REG(chip, STATUS));
316 return inb(SLSB_REG(chip, READDATA));
318 dev_err(chip->card->dev, "get_byte timeout: status 0x02%x\n", v);
325 static void snd_es1938_write(struct es1938 *chip, unsigned char reg, unsigned char val)
328 spin_lock_irqsave(&chip->reg_lock, flags);
329 snd_es1938_write_cmd(chip, reg);
330 snd_es1938_write_cmd(chip, val);
331 spin_unlock_irqrestore(&chip->reg_lock, flags);
332 dev_dbg(chip->card->dev, "Reg %02x set to %02x\n", reg, val);
338 static unsigned char snd_es1938_read(struct es1938 *chip, unsigned char reg)
342 spin_lock_irqsave(&chip->reg_lock, flags);
343 snd_es1938_write_cmd(chip, ESS_CMD_READREG);
344 snd_es1938_write_cmd(chip, reg);
345 val = snd_es1938_get_byte(chip);
346 spin_unlock_irqrestore(&chip->reg_lock, flags);
347 dev_dbg(chip->card->dev, "Reg %02x now is %02x\n", reg, val);
354 static int snd_es1938_bits(struct es1938 *chip, unsigned char reg, unsigned char mask,
359 spin_lock_irqsave(&chip->reg_lock, flags);
360 snd_es1938_write_cmd(chip, ESS_CMD_READREG);
361 snd_es1938_write_cmd(chip, reg);
362 old = snd_es1938_get_byte(chip);
365 snd_es1938_write_cmd(chip, reg);
367 snd_es1938_write_cmd(chip, new);
368 dev_dbg(chip->card->dev, "Reg %02x was %02x, set to %02x\n",
371 spin_unlock_irqrestore(&chip->reg_lock, flags);
376 * Reset the chip
378 static void snd_es1938_reset(struct es1938 *chip)
382 outb(3, SLSB_REG(chip, RESET));
383 inb(SLSB_REG(chip, RESET));
384 outb(0, SLSB_REG(chip, RESET));
386 if (inb(SLSB_REG(chip, STATUS)) & 0x80) {
387 if (inb(SLSB_REG(chip, READDATA)) == 0xaa)
391 dev_err(chip->card->dev, "ESS Solo-1 reset failed\n");
394 snd_es1938_write_cmd(chip, ESS_CMD_ENABLEEXT);
397 snd_es1938_write(chip, ESS_CMD_DMATYPE, 2);
402 snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2MODE, 0x32);
404 snd_es1938_bits(chip, ESS_CMD_IRQCONTROL, 0xf0, 0x50);
405 snd_es1938_bits(chip, ESS_CMD_DRQCONTROL, 0xf0, 0x50);
406 snd_es1938_write_cmd(chip, ESS_CMD_ENABLEAUDIO1);
408 snd_es1938_mixer_write(chip, 0x54, 0x8f);
409 snd_es1938_mixer_write(chip, 0x56, 0x95);
410 snd_es1938_mixer_write(chip, 0x58, 0x94);
411 snd_es1938_mixer_write(chip, 0x5a, 0x80);
417 static void snd_es1938_reset_fifo(struct es1938 *chip)
419 outb(2, SLSB_REG(chip, RESET));
420 outb(0, SLSB_REG(chip, RESET));
444 static void snd_es1938_rate_set(struct es1938 *chip,
459 snd_es1938_mixer_write(chip, 0x70, bits);
460 snd_es1938_mixer_write(chip, 0x72, div0);
462 snd_es1938_write(chip, 0xA1, bits);
463 snd_es1938_write(chip, 0xA2, div0);
471 static void snd_es1938_playback1_setdma(struct es1938 *chip)
473 outb(0x00, SLIO_REG(chip, AUDIO2MODE));
474 outl(chip->dma2_start, SLIO_REG(chip, AUDIO2DMAADDR));
475 outw(0, SLIO_REG(chip, AUDIO2DMACOUNT));
476 outw(chip->dma2_size, SLIO_REG(chip, AUDIO2DMACOUNT));
479 static void snd_es1938_playback2_setdma(struct es1938 *chip)
482 outb(0xc4, SLDM_REG(chip, DMACOMMAND));
484 outb(0, SLDM_REG(chip, DMACLEAR));
486 outb(1, SLDM_REG(chip, DMAMASK));
487 outb(0x18, SLDM_REG(chip, DMAMODE));
488 outl(chip->dma1_start, SLDM_REG(chip, DMAADDR));
489 outw(chip->dma1_size - 1, SLDM_REG(chip, DMACOUNT));
491 outb(0, SLDM_REG(chip, DMAMASK));
494 static void snd_es1938_capture_setdma(struct es1938 *chip)
497 outb(0xc4, SLDM_REG(chip, DMACOMMAND));
499 outb(0, SLDM_REG(chip, DMACLEAR));
501 outb(1, SLDM_REG(chip, DMAMASK));
502 outb(0x14, SLDM_REG(chip, DMAMODE));
503 outl(chip->dma1_start, SLDM_REG(chip, DMAADDR));
504 chip->last_capture_dmaaddr = chip->dma1_start;
505 outw(chip->dma1_size - 1, SLDM_REG(chip, DMACOUNT));
507 outb(0, SLDM_REG(chip, DMAMASK));
518 struct es1938 *chip = snd_pcm_substream_chip(substream);
524 chip->active |= ADC1;
529 chip->active &= ~ADC1;
534 snd_es1938_write(chip, ESS_CMD_DMACONTROL, val);
541 struct es1938 *chip = snd_pcm_substream_chip(substream);
547 snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2CONTROL1, 0x92);
549 snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2CONTROL1, 0x93);
553 outb(0x0a, SLIO_REG(chip, AUDIO2MODE));
554 chip->active |= DAC2;
558 outb(0, SLIO_REG(chip, AUDIO2MODE));
559 snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2CONTROL1, 0);
560 chip->active &= ~DAC2;
571 struct es1938 *chip = snd_pcm_substream_chip(substream);
577 chip->active |= DAC1;
582 chip->active &= ~DAC1;
587 snd_es1938_write(chip, ESS_CMD_DMACONTROL, val);
609 struct es1938 *chip = snd_pcm_substream_chip(substream);
615 chip->dma1_size = size;
616 chip->dma1_start = runtime->dma_addr;
622 chip->dma1_shift = 2 - mono - is8;
624 snd_es1938_reset_fifo(chip);
627 snd_es1938_bits(chip, ESS_CMD_ANALOGCONTROL, 0x03, (mono ? 2 : 1));
630 snd_es1938_rate_set(chip, substream, ADC1);
633 snd_es1938_write(chip, ESS_CMD_DMACNTRELOADL, count & 0xff);
634 snd_es1938_write(chip, ESS_CMD_DMACNTRELOADH, count >> 8);
637 snd_es1938_write(chip, ESS_CMD_SETFORMAT2, u ? 0x51 : 0x71);
638 snd_es1938_write(chip, ESS_CMD_SETFORMAT2, 0x90 |
643 // snd_es1938_reset_fifo(chip);
646 snd_es1938_capture_setdma(chip);
657 struct es1938 *chip = snd_pcm_substream_chip(substream);
663 chip->dma2_size = size;
664 chip->dma2_start = runtime->dma_addr;
670 chip->dma2_shift = 2 - mono - is8;
672 snd_es1938_reset_fifo(chip);
675 snd_es1938_rate_set(chip, substream, DAC2);
679 snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2TCOUNTL, count & 0xff);
680 snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2TCOUNTH, count >> 8);
683 snd_es1938_mixer_write(chip, ESSSB_IREG_AUDIO2CONTROL2, 0x40 | (u ? 0 : 4) |
687 snd_es1938_playback1_setdma(chip);
694 struct es1938 *chip = snd_pcm_substream_chip(substream);
700 chip->dma1_size = size;
701 chip->dma1_start = runtime->dma_addr;
707 chip->dma1_shift = 2 - mono - is8;
712 snd_es1938_reset_fifo(chip);
714 snd_es1938_bits(chip, ESS_CMD_ANALOGCONTROL, 0x03, (mono ? 2 : 1));
717 snd_es1938_rate_set(chip, substream, DAC1);
718 snd_es1938_write(chip, ESS_CMD_DMACNTRELOADL, count & 0xff);
719 snd_es1938_write(chip, ESS_CMD_DMACNTRELOADH, count >> 8);
722 snd_es1938_write(chip, ESS_CMD_SETFORMAT, u ? 0x80 : 0x00);
723 snd_es1938_write(chip, ESS_CMD_SETFORMAT, u ? 0x51 : 0x71);
724 snd_es1938_write(chip, ESS_CMD_SETFORMAT2,
729 snd_es1938_playback2_setdma(chip);
756 struct es1938 *chip = snd_pcm_substream_chip(substream);
761 old = inw(SLDM_REG(chip, DMACOUNT));
762 while ((new = inw(SLDM_REG(chip, DMACOUNT))) != old)
764 ptr = chip->dma1_size - 1 - new;
769 ptr = inl(SLDM_REG(chip, DMAADDR));
770 count = inw(SLDM_REG(chip, DMACOUNT));
771 diff = chip->dma1_start + chip->dma1_size - ptr - count;
773 if (diff > 3 || ptr < chip->dma1_start
774 || ptr >= chip->dma1_start+chip->dma1_size)
775 ptr = chip->last_capture_dmaaddr; /* bad, use last saved */
777 chip->last_capture_dmaaddr = ptr; /* good, remember it */
779 ptr -= chip->dma1_start;
781 return ptr >> chip->dma1_shift;
786 struct es1938 *chip = snd_pcm_substream_chip(substream);
789 ptr = chip->dma2_size - inw(SLIO_REG(chip, AUDIO2DMACOUNT));
791 ptr = inl(SLIO_REG(chip, AUDIO2DMAADDR)) - chip->dma2_start;
793 return ptr >> chip->dma2_shift;
798 struct es1938 *chip = snd_pcm_substream_chip(substream);
803 old = inw(SLDM_REG(chip, DMACOUNT));
804 while ((new = inw(SLDM_REG(chip, DMACOUNT))) != old)
806 ptr = chip->dma1_size - 1 - new;
808 ptr = inl(SLDM_REG(chip, DMAADDR)) - chip->dma1_start;
810 return ptr >> chip->dma1_shift;
830 struct es1938 *chip = snd_pcm_substream_chip(substream);
832 if (snd_BUG_ON(pos + count > chip->dma1_size))
834 if (pos + count < chip->dma1_size) {
893 struct es1938 *chip = snd_pcm_substream_chip(substream);
896 if (chip->playback2_substream)
898 chip->capture_substream = substream;
908 struct es1938 *chip = snd_pcm_substream_chip(substream);
913 chip->playback1_substream = substream;
916 if (chip->capture_substream)
918 chip->playback2_substream = substream;
933 struct es1938 *chip = snd_pcm_substream_chip(substream);
935 chip->capture_substream = NULL;
941 struct es1938 *chip = snd_pcm_substream_chip(substream);
945 chip->playback1_substream = NULL;
948 chip->playback2_substream = NULL;
974 static int snd_es1938_new_pcm(struct es1938 *chip, int device)
979 err = snd_pcm_new(chip->card, "es-1938-1946", device, 2, 1, &pcm);
985 pcm->private_data = chip;
990 &chip->pci->dev, 64*1024, 64*1024);
992 chip->pcm = pcm;
1015 struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1016 ucontrol->value.enumerated.item[0] = snd_es1938_mixer_read(chip, 0x1c) & 0x07;
1023 struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1028 return snd_es1938_mixer_bits(chip, 0x1c, 0x07, val) != val;
1036 struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1037 unsigned char val = snd_es1938_mixer_read(chip, 0x50);
1045 struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1049 oval = snd_es1938_mixer_read(chip, 0x50) & 0x0c;
1052 snd_es1938_mixer_write(chip, 0x50, nval & ~0x04);
1053 snd_es1938_mixer_write(chip, 0x50, nval);
1071 struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1072 ucontrol->value.integer.value[0] = snd_es1938_mixer_read(chip, 0x61) & 0x3f;
1073 ucontrol->value.integer.value[1] = snd_es1938_mixer_read(chip, 0x63) & 0x3f;
1082 struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1083 ucontrol->value.integer.value[0] = !(snd_es1938_mixer_read(chip, 0x61) & 0x40);
1084 ucontrol->value.integer.value[1] = !(snd_es1938_mixer_read(chip, 0x63) & 0x40);
1090 struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1091 chip->master_volume = NULL;
1092 chip->master_switch = NULL;
1093 chip->hw_volume = NULL;
1094 chip->hw_switch = NULL;
1097 static int snd_es1938_reg_bits(struct es1938 *chip, unsigned char reg,
1101 return snd_es1938_mixer_bits(chip, reg, mask, val);
1103 return snd_es1938_bits(chip, reg, mask, val);
1106 static int snd_es1938_reg_read(struct es1938 *chip, unsigned char reg)
1109 return snd_es1938_mixer_read(chip, reg);
1111 return snd_es1938_read(chip, reg);
1143 struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1150 val = snd_es1938_reg_read(chip, reg);
1160 struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1172 return snd_es1938_reg_bits(chip, reg, mask, val) != val;
1204 struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1213 left = snd_es1938_reg_read(chip, left_reg);
1215 right = snd_es1938_reg_read(chip, right_reg);
1230 struct es1938 *chip = snd_kcontrol_chip(kcontrol);
1252 if (snd_es1938_reg_bits(chip, left_reg, mask1, val1) != val1)
1254 if (snd_es1938_reg_bits(chip, right_reg, mask2, val2) != val2)
1257 change = (snd_es1938_reg_bits(chip, left_reg, mask1 | mask2,
1370 * initialize the chip - used by resume callback, too
1372 static void snd_es1938_chip_init(struct es1938 *chip)
1374 /* reset chip */
1375 snd_es1938_reset(chip);
1380 pci_set_master(chip->pci);
1383 pci_write_config_word(chip->pci, SL_PCI_LEGACYCONTROL, 0x805f);
1386 pci_write_config_word(chip->pci, SL_PCI_DDMACONTROL, chip->ddma_port | 1);
1389 pci_write_config_dword(chip->pci, SL_PCI_CONFIG, 0);
1392 outb(0xf0, SLIO_REG(chip, IRQCONTROL));
1395 outb(0, SLDM_REG(chip, DMACLEAR));
1414 struct es1938 *chip = card->private_data;
1421 for (s = saved_regs, d = chip->saved_regs; *s; s++, d++)
1422 *d = snd_es1938_reg_read(chip, *s);
1424 outb(0x00, SLIO_REG(chip, IRQCONTROL)); /* disable irqs */
1425 if (chip->irq >= 0) {
1426 free_irq(chip->irq, chip);
1427 chip->irq = -1;
1437 struct es1938 *chip = card->private_data;
1442 IRQF_SHARED, KBUILD_MODNAME, chip)) {
1448 chip->irq = pci->irq;
1449 card->sync_irq = chip->irq;
1450 snd_es1938_chip_init(chip);
1453 for (s = saved_regs, d = chip->saved_regs; *s; s++, d++) {
1455 snd_es1938_mixer_write(chip, *s, *d);
1457 snd_es1938_write(chip, *s, *d);
1471 static int snd_es1938_create_gameport(struct es1938 *chip)
1475 chip->gameport = gp = gameport_allocate_port();
1477 dev_err(chip->card->dev,
1483 gameport_set_phys(gp, "pci%s/gameport0", pci_name(chip->pci));
1484 gameport_set_dev_parent(gp, &chip->pci->dev);
1485 gp->io = chip->game_port;
1492 static void snd_es1938_free_gameport(struct es1938 *chip)
1494 if (chip->gameport) {
1495 gameport_unregister_port(chip->gameport);
1496 chip->gameport = NULL;
1500 static inline int snd_es1938_create_gameport(struct es1938 *chip) { return -ENOSYS; }
1501 static inline void snd_es1938_free_gameport(struct es1938 *chip) { }
1506 struct es1938 *chip = card->private_data;
1509 outb(0x00, SLIO_REG(chip, IRQCONTROL));
1510 if (chip->rmidi)
1511 snd_es1938_mixer_bits(chip, ESSSB_IREG_MPU401CONTROL, 0x40, 0);
1513 snd_es1938_free_gameport(chip);
1515 if (chip->irq >= 0)
1516 free_irq(chip->irq, chip);
1522 struct es1938 *chip = card->private_data;
1536 spin_lock_init(&chip->reg_lock);
1537 spin_lock_init(&chip->mixer_lock);
1538 chip->card = card;
1539 chip->pci = pci;
1540 chip->irq = -1;
1544 chip->io_port = pci_resource_start(pci, 0);
1545 chip->sb_port = pci_resource_start(pci, 1);
1546 chip->vc_port = pci_resource_start(pci, 2);
1547 chip->mpu_port = pci_resource_start(pci, 3);
1548 chip->game_port = pci_resource_start(pci, 4);
1551 KBUILD_MODNAME, chip)) {
1555 chip->irq = pci->irq;
1556 card->sync_irq = chip->irq;
1560 chip->io_port, chip->sb_port, chip->vc_port, chip->mpu_port, chip->game_port);
1562 chip->ddma_port = chip->vc_port + 0x00; /* fix from Thomas Sailer */
1564 snd_es1938_chip_init(chip);
1573 struct es1938 *chip = dev_id;
1578 status = inb(SLIO_REG(chip, IRQCONTROL));
1580 dev_dbg(chip->card->dev,
1587 dev_dbg(chip->card->dev,
1589 dev_dbg(chip->card->dev,
1591 inw(SLDM_REG(chip, DMACOUNT)));
1592 dev_dbg(chip->card->dev,
1594 inl(SLDM_REG(chip, DMAADDR)));
1595 dev_dbg(chip->card->dev,
1597 inl(SLDM_REG(chip, DMASTATUS)));
1601 audiostatus = inb(SLSB_REG(chip, STATUS));
1602 if (chip->active & ADC1)
1603 snd_pcm_period_elapsed(chip->capture_substream);
1604 else if (chip->active & DAC1)
1605 snd_pcm_period_elapsed(chip->playback2_substream);
1611 dev_dbg(chip->card->dev,
1613 dev_dbg(chip->card->dev,
1615 inw(SLIO_REG(chip, AUDIO2DMACOUNT)));
1616 dev_dbg(chip->card->dev,
1618 inl(SLIO_REG(chip, AUDIO2DMAADDR)));
1623 snd_es1938_mixer_bits(chip, ESSSB_IREG_AUDIO2CONTROL2, 0x80, 0);
1624 if (chip->active & DAC2)
1625 snd_pcm_period_elapsed(chip->playback1_substream);
1630 int split = snd_es1938_mixer_read(chip, 0x64) & 0x80;
1632 snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, &chip->hw_switch->id);
1633 snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, &chip->hw_volume->id);
1635 snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
1636 &chip->master_switch->id);
1637 snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
1638 &chip->master_volume->id);
1641 snd_es1938_mixer_write(chip, 0x66, 0x00);
1649 // snd_es1938_mixer_bits(chip, ESSSB_IREG_MPU401CONTROL, 0x40, 0); /* ack? */
1650 if (chip->rmidi) {
1652 snd_mpu401_uart_interrupt(irq, chip->rmidi->private_data);
1660 static int snd_es1938_mixer(struct es1938 *chip)
1666 card = chip->card;
1672 kctl = snd_ctl_new1(&snd_es1938_controls[idx], chip);
1675 chip->master_volume = kctl;
1679 chip->master_switch = kctl;
1683 chip->hw_volume = kctl;
1687 chip->hw_switch = kctl;
1704 struct es1938 *chip;
1716 sizeof(*chip), &card);
1719 chip = card->private_data;
1734 chip->revision,
1735 chip->irq);
1737 err = snd_es1938_new_pcm(chip, 0);
1740 err = snd_es1938_mixer(chip);
1744 SLSB_REG(chip, FMLOWADDR),
1745 SLSB_REG(chip, FMHIGHADDR),
1748 SLSB_REG(chip, FMLOWADDR));
1758 chip->mpu_port,
1760 -1, &chip->rmidi) < 0) {
1765 snd_es1938_mixer_bits(chip, ESSSB_IREG_MPU401CONTROL, 0x40, 0x40);
1768 snd_es1938_create_gameport(chip);