Lines Matching refs:chip

930 static inline void snd_m3_outw(struct snd_m3 *chip, u16 value, unsigned long reg)  in snd_m3_outw()  argument
932 outw(value, chip->iobase + reg); in snd_m3_outw()
935 static inline u16 snd_m3_inw(struct snd_m3 *chip, unsigned long reg) in snd_m3_inw() argument
937 return inw(chip->iobase + reg); in snd_m3_inw()
940 static inline void snd_m3_outb(struct snd_m3 *chip, u8 value, unsigned long reg) in snd_m3_outb() argument
942 outb(value, chip->iobase + reg); in snd_m3_outb()
945 static inline u8 snd_m3_inb(struct snd_m3 *chip, unsigned long reg) in snd_m3_inb() argument
947 return inb(chip->iobase + reg); in snd_m3_inb()
954 static u16 snd_m3_assp_read(struct snd_m3 *chip, u16 region, u16 index) in snd_m3_assp_read() argument
956 snd_m3_outw(chip, region & MEMTYPE_MASK, DSP_PORT_MEMORY_TYPE); in snd_m3_assp_read()
957 snd_m3_outw(chip, index, DSP_PORT_MEMORY_INDEX); in snd_m3_assp_read()
958 return snd_m3_inw(chip, DSP_PORT_MEMORY_DATA); in snd_m3_assp_read()
961 static void snd_m3_assp_write(struct snd_m3 *chip, u16 region, u16 index, u16 data) in snd_m3_assp_write() argument
963 snd_m3_outw(chip, region & MEMTYPE_MASK, DSP_PORT_MEMORY_TYPE); in snd_m3_assp_write()
964 snd_m3_outw(chip, index, DSP_PORT_MEMORY_INDEX); in snd_m3_assp_write()
965 snd_m3_outw(chip, data, DSP_PORT_MEMORY_DATA); in snd_m3_assp_write()
968 static void snd_m3_assp_halt(struct snd_m3 *chip) in snd_m3_assp_halt() argument
970 chip->reset_state = snd_m3_inb(chip, DSP_PORT_CONTROL_REG_B) & ~REGB_STOP_CLOCK; in snd_m3_assp_halt()
972 snd_m3_outb(chip, chip->reset_state & ~REGB_ENABLE_RESET, DSP_PORT_CONTROL_REG_B); in snd_m3_assp_halt()
975 static void snd_m3_assp_continue(struct snd_m3 *chip) in snd_m3_assp_continue() argument
977 snd_m3_outb(chip, chip->reset_state | REGB_ENABLE_RESET, DSP_PORT_CONTROL_REG_B); in snd_m3_assp_continue()
989 static int snd_m3_add_list(struct snd_m3 *chip, struct m3_list *list, u16 val) in snd_m3_add_list() argument
991 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_add_list()
997 static void snd_m3_remove_list(struct snd_m3 *chip, struct m3_list *list, int index) in snd_m3_remove_list() argument
1003 val = snd_m3_assp_read(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_remove_list()
1005 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_remove_list()
1010 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_remove_list()
1017 static void snd_m3_inc_timer_users(struct snd_m3 *chip) in snd_m3_inc_timer_users() argument
1019 chip->timer_users++; in snd_m3_inc_timer_users()
1020 if (chip->timer_users != 1) in snd_m3_inc_timer_users()
1023 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_inc_timer_users()
1027 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_inc_timer_users()
1031 snd_m3_outw(chip, in snd_m3_inc_timer_users()
1032 snd_m3_inw(chip, HOST_INT_CTRL) | CLKRUN_GEN_ENABLE, in snd_m3_inc_timer_users()
1036 static void snd_m3_dec_timer_users(struct snd_m3 *chip) in snd_m3_dec_timer_users() argument
1038 chip->timer_users--; in snd_m3_dec_timer_users()
1039 if (chip->timer_users > 0) in snd_m3_dec_timer_users()
1042 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_dec_timer_users()
1046 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_dec_timer_users()
1050 snd_m3_outw(chip, in snd_m3_dec_timer_users()
1051 snd_m3_inw(chip, HOST_INT_CTRL) & ~CLKRUN_GEN_ENABLE, in snd_m3_dec_timer_users()
1060 static int snd_m3_pcm_start(struct snd_m3 *chip, struct m3_dma *s, in snd_m3_pcm_start() argument
1066 snd_m3_inc_timer_users(chip); in snd_m3_pcm_start()
1069 chip->dacs_active++; in snd_m3_pcm_start()
1070 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_pcm_start()
1072 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_pcm_start()
1074 chip->dacs_active); in snd_m3_pcm_start()
1077 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_pcm_start()
1079 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_pcm_start()
1087 static int snd_m3_pcm_stop(struct snd_m3 *chip, struct m3_dma *s, in snd_m3_pcm_stop() argument
1093 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_pcm_stop()
1095 snd_m3_dec_timer_users(chip); in snd_m3_pcm_stop()
1098 chip->dacs_active--; in snd_m3_pcm_stop()
1099 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_pcm_stop()
1101 chip->dacs_active); in snd_m3_pcm_stop()
1104 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_pcm_stop()
1114 struct snd_m3 *chip = snd_pcm_substream_chip(subs); in snd_m3_pcm_trigger() local
1121 spin_lock(&chip->reg_lock); in snd_m3_pcm_trigger()
1129 err = snd_m3_pcm_start(chip, s, subs); in snd_m3_pcm_trigger()
1138 err = snd_m3_pcm_stop(chip, s, subs); in snd_m3_pcm_trigger()
1142 spin_unlock(&chip->reg_lock); in snd_m3_pcm_trigger()
1150 snd_m3_pcm_setup1(struct snd_m3 *chip, struct m3_dma *s, struct snd_pcm_substream *subs) in snd_m3_pcm_setup1() argument
1174 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_pcm_setup1()
1178 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_pcm_setup1()
1182 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_pcm_setup1()
1186 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_pcm_setup1()
1190 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_pcm_setup1()
1194 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_pcm_setup1()
1202 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_pcm_setup1()
1206 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_pcm_setup1()
1210 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_pcm_setup1()
1214 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_pcm_setup1()
1218 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_pcm_setup1()
1222 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_pcm_setup1()
1226 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_pcm_setup1()
1230 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_pcm_setup1()
1235 static void snd_m3_pcm_setup2(struct snd_m3 *chip, struct m3_dma *s, in snd_m3_pcm_setup2() argument
1244 s->index[0] = snd_m3_add_list(chip, s->index_list[0], in snd_m3_pcm_setup2()
1246 s->index[1] = snd_m3_add_list(chip, s->index_list[1], in snd_m3_pcm_setup2()
1248 s->index[2] = snd_m3_add_list(chip, s->index_list[2], in snd_m3_pcm_setup2()
1254 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_pcm_setup2()
1258 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_pcm_setup2()
1267 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_pcm_setup2()
1302 snd_m3_playback_setup(struct snd_m3 *chip, struct m3_dma *s, in snd_m3_playback_setup() argument
1311 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_playback_setup()
1315 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_playback_setup()
1320 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_playback_setup()
1325 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_playback_setup()
1333 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_playback_setup()
1369 snd_m3_capture_setup(struct snd_m3 *chip, struct m3_dma *s, struct snd_pcm_substream *subs) in snd_m3_capture_setup() argument
1377 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_capture_setup()
1382 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_capture_setup()
1391 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_capture_setup()
1427 struct snd_m3 *chip = snd_pcm_substream_chip(subs); in snd_m3_pcm_prepare() local
1441 spin_lock_irq(&chip->reg_lock); in snd_m3_pcm_prepare()
1443 snd_m3_pcm_setup1(chip, s, subs); in snd_m3_pcm_prepare()
1446 snd_m3_playback_setup(chip, s, subs); in snd_m3_pcm_prepare()
1448 snd_m3_capture_setup(chip, s, subs); in snd_m3_pcm_prepare()
1450 snd_m3_pcm_setup2(chip, s, runtime); in snd_m3_pcm_prepare()
1452 spin_unlock_irq(&chip->reg_lock); in snd_m3_pcm_prepare()
1461 snd_m3_get_pointer(struct snd_m3 *chip, struct m3_dma *s, struct snd_pcm_substream *subs) in snd_m3_get_pointer() argument
1471 hi = snd_m3_assp_read(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_get_pointer()
1474 lo = snd_m3_assp_read(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_get_pointer()
1477 if (hi == snd_m3_assp_read(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_get_pointer()
1488 struct snd_m3 *chip = snd_pcm_substream_chip(subs); in snd_m3_pcm_pointer() local
1495 spin_lock(&chip->reg_lock); in snd_m3_pcm_pointer()
1496 ptr = snd_m3_get_pointer(chip, s, subs); in snd_m3_pcm_pointer()
1497 spin_unlock(&chip->reg_lock); in snd_m3_pcm_pointer()
1504 static void snd_m3_update_ptr(struct snd_m3 *chip, struct m3_dma *s) in snd_m3_update_ptr() argument
1513 hwptr = snd_m3_get_pointer(chip, s, subs); in snd_m3_update_ptr()
1533 spin_unlock(&chip->reg_lock); in snd_m3_update_ptr()
1535 spin_lock(&chip->reg_lock); in snd_m3_update_ptr()
1545 struct snd_m3 *chip = container_of(work, struct snd_m3, hwvol_work); in snd_m3_update_hw_volume() local
1551 x = inb(chip->iobase + SHADOW_MIX_REG_VOICE) & 0xee; in snd_m3_update_hw_volume()
1562 outb(0x88, chip->iobase + SHADOW_MIX_REG_VOICE); in snd_m3_update_hw_volume()
1563 outb(0x88, chip->iobase + HW_VOL_COUNTER_VOICE); in snd_m3_update_hw_volume()
1564 outb(0x88, chip->iobase + SHADOW_MIX_REG_MASTER); in snd_m3_update_hw_volume()
1565 outb(0x88, chip->iobase + HW_VOL_COUNTER_MASTER); in snd_m3_update_hw_volume()
1569 if (chip->in_suspend) in snd_m3_update_hw_volume()
1573 if (!chip->master_switch || !chip->master_volume) in snd_m3_update_hw_volume()
1576 val = snd_ac97_read(chip->ac97, AC97_MASTER); in snd_m3_update_hw_volume()
1599 if (snd_ac97_update(chip->ac97, AC97_MASTER, val)) in snd_m3_update_hw_volume()
1600 snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, in snd_m3_update_hw_volume()
1601 &chip->master_switch->id); in snd_m3_update_hw_volume()
1603 if (!chip->input_dev) in snd_m3_update_hw_volume()
1625 input_report_key(chip->input_dev, val, 1); in snd_m3_update_hw_volume()
1626 input_sync(chip->input_dev); in snd_m3_update_hw_volume()
1627 input_report_key(chip->input_dev, val, 0); in snd_m3_update_hw_volume()
1628 input_sync(chip->input_dev); in snd_m3_update_hw_volume()
1635 struct snd_m3 *chip = dev_id; in snd_m3_interrupt() local
1639 status = inb(chip->iobase + HOST_INT_STATUS); in snd_m3_interrupt()
1645 schedule_work(&chip->hwvol_work); in snd_m3_interrupt()
1652 u8 ctl = inb(chip->iobase + ASSP_CONTROL_B); in snd_m3_interrupt()
1654 ctl = inb(chip->iobase + ASSP_HOST_INT_STATUS); in snd_m3_interrupt()
1656 outb(DSP2HOST_REQ_TIMER, chip->iobase + ASSP_HOST_INT_STATUS); in snd_m3_interrupt()
1658 spin_lock(&chip->reg_lock); in snd_m3_interrupt()
1659 for (i = 0; i < chip->num_substreams; i++) { in snd_m3_interrupt()
1660 struct m3_dma *s = &chip->substreams[i]; in snd_m3_interrupt()
1662 snd_m3_update_ptr(chip, s); in snd_m3_interrupt()
1664 spin_unlock(&chip->reg_lock); in snd_m3_interrupt()
1670 if ((status & MPU401_INT_PENDING) && chip->rmidi) in snd_m3_interrupt()
1671 snd_mpu401_uart_interrupt(irq, chip->rmidi->private_data, regs); in snd_m3_interrupt()
1675 outb(status, chip->iobase + HOST_INT_STATUS); in snd_m3_interrupt()
1731 snd_m3_substream_open(struct snd_m3 *chip, struct snd_pcm_substream *subs) in snd_m3_substream_open() argument
1736 spin_lock_irq(&chip->reg_lock); in snd_m3_substream_open()
1737 for (i = 0; i < chip->num_substreams; i++) { in snd_m3_substream_open()
1738 s = &chip->substreams[i]; in snd_m3_substream_open()
1742 spin_unlock_irq(&chip->reg_lock); in snd_m3_substream_open()
1747 spin_unlock_irq(&chip->reg_lock); in snd_m3_substream_open()
1754 s->index_list[0] = &chip->mixer_list; in snd_m3_substream_open()
1756 s->index_list[0] = &chip->adc1_list; in snd_m3_substream_open()
1757 s->index_list[1] = &chip->msrc_list; in snd_m3_substream_open()
1758 s->index_list[2] = &chip->dma_list; in snd_m3_substream_open()
1764 snd_m3_substream_close(struct snd_m3 *chip, struct snd_pcm_substream *subs) in snd_m3_substream_close() argument
1771 spin_lock_irq(&chip->reg_lock); in snd_m3_substream_close()
1773 snd_m3_pcm_stop(chip, s, s->substream); /* does this happen? */ in snd_m3_substream_close()
1775 snd_m3_remove_list(chip, s->index_list[0], s->index[0]); in snd_m3_substream_close()
1776 snd_m3_remove_list(chip, s->index_list[1], s->index[1]); in snd_m3_substream_close()
1777 snd_m3_remove_list(chip, s->index_list[2], s->index[2]); in snd_m3_substream_close()
1782 spin_unlock_irq(&chip->reg_lock); in snd_m3_substream_close()
1788 struct snd_m3 *chip = snd_pcm_substream_chip(subs); in snd_m3_playback_open() local
1792 if ((err = snd_m3_substream_open(chip, subs)) < 0) in snd_m3_playback_open()
1803 struct snd_m3 *chip = snd_pcm_substream_chip(subs); in snd_m3_playback_close() local
1805 snd_m3_substream_close(chip, subs); in snd_m3_playback_close()
1812 struct snd_m3 *chip = snd_pcm_substream_chip(subs); in snd_m3_capture_open() local
1816 if ((err = snd_m3_substream_open(chip, subs)) < 0) in snd_m3_capture_open()
1827 struct snd_m3 *chip = snd_pcm_substream_chip(subs); in snd_m3_capture_close() local
1829 snd_m3_substream_close(chip, subs); in snd_m3_capture_close()
1860 snd_m3_pcm(struct snd_m3 * chip, int device) in snd_m3_pcm() argument
1865 err = snd_pcm_new(chip->card, chip->card->driver, device, in snd_m3_pcm()
1873 pcm->private_data = chip; in snd_m3_pcm()
1875 strcpy(pcm->name, chip->card->driver); in snd_m3_pcm()
1876 chip->pcm = pcm; in snd_m3_pcm()
1879 snd_dma_pci_data(chip->pci), 64*1024, 64*1024); in snd_m3_pcm()
1893 static int snd_m3_ac97_wait(struct snd_m3 *chip) in snd_m3_ac97_wait() argument
1898 if (! (snd_m3_inb(chip, 0x30) & 1)) in snd_m3_ac97_wait()
1903 dev_err(chip->card->dev, "ac97 serial bus busy\n"); in snd_m3_ac97_wait()
1910 struct snd_m3 *chip = ac97->private_data; in snd_m3_ac97_read() local
1913 if (snd_m3_ac97_wait(chip)) in snd_m3_ac97_read()
1915 snd_m3_outb(chip, 0x80 | (reg & 0x7f), CODEC_COMMAND); in snd_m3_ac97_read()
1916 if (snd_m3_ac97_wait(chip)) in snd_m3_ac97_read()
1918 data = snd_m3_inw(chip, CODEC_DATA); in snd_m3_ac97_read()
1926 struct snd_m3 *chip = ac97->private_data; in snd_m3_ac97_write() local
1928 if (snd_m3_ac97_wait(chip)) in snd_m3_ac97_write()
1930 snd_m3_outw(chip, val, CODEC_DATA); in snd_m3_ac97_write()
1931 snd_m3_outb(chip, reg & 0x7f, CODEC_COMMAND); in snd_m3_ac97_write()
1950 static int snd_m3_try_read_vendor(struct snd_m3 *chip) in snd_m3_try_read_vendor() argument
1954 if (snd_m3_ac97_wait(chip)) in snd_m3_try_read_vendor()
1957 snd_m3_outb(chip, 0x80 | (AC97_VENDOR_ID1 & 0x7f), 0x30); in snd_m3_try_read_vendor()
1959 if (snd_m3_ac97_wait(chip)) in snd_m3_try_read_vendor()
1962 ret = snd_m3_inw(chip, 0x32); in snd_m3_try_read_vendor()
1967 static void snd_m3_ac97_reset(struct snd_m3 *chip) in snd_m3_ac97_reset() argument
1971 int io = chip->iobase; in snd_m3_ac97_reset()
1973 if (chip->allegro_flag) { in snd_m3_ac97_reset()
1989 if (!chip->irda_workaround) in snd_m3_ac97_reset()
2012 if (! snd_m3_try_read_vendor(chip)) in snd_m3_ac97_reset()
2018 dev_dbg(chip->card->dev, in snd_m3_ac97_reset()
2035 static int snd_m3_mixer(struct snd_m3 *chip) in snd_m3_mixer() argument
2048 if ((err = snd_ac97_bus(chip->card, 0, &ops, NULL, &pbus)) < 0) in snd_m3_mixer()
2052 ac97.private_data = chip; in snd_m3_mixer()
2053 if ((err = snd_ac97_mixer(pbus, &ac97, &chip->ac97)) < 0) in snd_m3_mixer()
2057 snd_ac97_write(chip->ac97, AC97_PCM, 0x8000 | (15 << 8) | 15); in snd_m3_mixer()
2059 snd_ac97_write(chip->ac97, AC97_PCM, 0); in snd_m3_mixer()
2065 chip->master_switch = snd_ctl_find_id(chip->card, &elem_id); in snd_m3_mixer()
2069 chip->master_volume = snd_ctl_find_id(chip->card, &elem_id); in snd_m3_mixer()
2086 static void snd_m3_assp_init(struct snd_m3 *chip) in snd_m3_assp_init() argument
2093 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_assp_init()
2098 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_assp_init()
2102 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_assp_init()
2107 data = (const u16 *)chip->assp_kernel_image->data; in snd_m3_assp_init()
2108 for (i = 0 ; i * 2 < chip->assp_kernel_image->size; i++) { in snd_m3_assp_init()
2109 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_CODE, in snd_m3_assp_init()
2120 data = (const u16 *)chip->assp_minisrc_image->data; in snd_m3_assp_init()
2121 for (i = 0; i * 2 < chip->assp_minisrc_image->size; i++) { in snd_m3_assp_init()
2122 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_CODE, in snd_m3_assp_init()
2130 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_CODE, in snd_m3_assp_init()
2135 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_CODE, in snd_m3_assp_init()
2143 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_assp_init()
2151 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_assp_init()
2157 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_assp_init()
2159 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_assp_init()
2162 chip->mixer_list.curlen = 0; in snd_m3_assp_init()
2163 chip->mixer_list.mem_addr = KDATA_MIXER_XFER0; in snd_m3_assp_init()
2164 chip->mixer_list.max = MAX_VIRTUAL_MIXER_CHANNELS; in snd_m3_assp_init()
2165 chip->adc1_list.curlen = 0; in snd_m3_assp_init()
2166 chip->adc1_list.mem_addr = KDATA_ADC1_XFER0; in snd_m3_assp_init()
2167 chip->adc1_list.max = MAX_VIRTUAL_ADC1_CHANNELS; in snd_m3_assp_init()
2168 chip->dma_list.curlen = 0; in snd_m3_assp_init()
2169 chip->dma_list.mem_addr = KDATA_DMA_XFER0; in snd_m3_assp_init()
2170 chip->dma_list.max = MAX_VIRTUAL_DMA_CHANNELS; in snd_m3_assp_init()
2171 chip->msrc_list.curlen = 0; in snd_m3_assp_init()
2172 chip->msrc_list.mem_addr = KDATA_INSTANCE0_MINISRC; in snd_m3_assp_init()
2173 chip->msrc_list.max = MAX_INSTANCE_MINISRC; in snd_m3_assp_init()
2177 static int snd_m3_assp_client_init(struct snd_m3 *chip, struct m3_dma *s, int index) in snd_m3_assp_client_init() argument
2198 dev_err(chip->card->dev, in snd_m3_assp_client_init()
2209 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in snd_m3_assp_client_init()
2224 snd_m3_amp_enable(struct snd_m3 *chip, int enable) in snd_m3_amp_enable() argument
2226 int io = chip->iobase; in snd_m3_amp_enable()
2229 if (! chip->external_amp) in snd_m3_amp_enable()
2233 polarity = polarity << chip->amp_gpio; in snd_m3_amp_enable()
2234 gpo = 1 << chip->amp_gpio; in snd_m3_amp_enable()
2248 snd_m3_hv_init(struct snd_m3 *chip) in snd_m3_hv_init() argument
2250 unsigned long io = chip->iobase; in snd_m3_hv_init()
2253 if (!chip->is_omnibook) in snd_m3_hv_init()
2271 snd_m3_chip_init(struct snd_m3 *chip) in snd_m3_chip_init() argument
2273 struct pci_dev *pcidev = chip->pci; in snd_m3_chip_init()
2274 unsigned long io = chip->iobase; in snd_m3_chip_init()
2287 n |= chip->hv_config; in snd_m3_chip_init()
2293 outb(RESET_ASSP, chip->iobase + ASSP_CONTROL_B); in snd_m3_chip_init()
2296 if (!chip->allegro_flag) { in snd_m3_chip_init()
2303 if (chip->allegro_flag) { in snd_m3_chip_init()
2309 t = inb(chip->iobase + ASSP_CONTROL_A); in snd_m3_chip_init()
2313 outb(t, chip->iobase + ASSP_CONTROL_A); in snd_m3_chip_init()
2315 snd_m3_assp_init(chip); /* download DSP code before starting ASSP below */ in snd_m3_chip_init()
2316 outb(RUN_ASSP, chip->iobase + ASSP_CONTROL_B); in snd_m3_chip_init()
2328 snd_m3_enable_ints(struct snd_m3 *chip) in snd_m3_enable_ints() argument
2330 unsigned long io = chip->iobase; in snd_m3_enable_ints()
2335 if (chip->hv_config & HV_CTRL_ENABLE) in snd_m3_enable_ints()
2337 outb(val, chip->iobase + HOST_INT_STATUS); in snd_m3_enable_ints()
2347 static int snd_m3_free(struct snd_m3 *chip) in snd_m3_free() argument
2352 cancel_work_sync(&chip->hwvol_work); in snd_m3_free()
2354 if (chip->input_dev) in snd_m3_free()
2355 input_unregister_device(chip->input_dev); in snd_m3_free()
2358 if (chip->substreams) { in snd_m3_free()
2359 spin_lock_irq(&chip->reg_lock); in snd_m3_free()
2360 for (i = 0; i < chip->num_substreams; i++) { in snd_m3_free()
2361 s = &chip->substreams[i]; in snd_m3_free()
2364 snd_m3_pcm_stop(chip, s, s->substream); in snd_m3_free()
2366 spin_unlock_irq(&chip->reg_lock); in snd_m3_free()
2367 kfree(chip->substreams); in snd_m3_free()
2369 if (chip->iobase) { in snd_m3_free()
2370 outw(0, chip->iobase + HOST_INT_CTRL); /* disable ints */ in snd_m3_free()
2374 vfree(chip->suspend_mem); in snd_m3_free()
2377 if (chip->irq >= 0) in snd_m3_free()
2378 free_irq(chip->irq, chip); in snd_m3_free()
2380 if (chip->iobase) in snd_m3_free()
2381 pci_release_regions(chip->pci); in snd_m3_free()
2383 release_firmware(chip->assp_kernel_image); in snd_m3_free()
2384 release_firmware(chip->assp_minisrc_image); in snd_m3_free()
2386 pci_disable_device(chip->pci); in snd_m3_free()
2387 kfree(chip); in snd_m3_free()
2399 struct snd_m3 *chip = card->private_data; in m3_suspend() local
2402 if (chip->suspend_mem == NULL) in m3_suspend()
2405 chip->in_suspend = 1; in m3_suspend()
2406 cancel_work_sync(&chip->hwvol_work); in m3_suspend()
2408 snd_pcm_suspend_all(chip->pcm); in m3_suspend()
2409 snd_ac97_suspend(chip->ac97); in m3_suspend()
2413 snd_m3_assp_halt(chip); in m3_suspend()
2418 chip->suspend_mem[dsp_index++] = in m3_suspend()
2419 snd_m3_assp_read(chip, MEMTYPE_INTERNAL_CODE, i); in m3_suspend()
2421 chip->suspend_mem[dsp_index++] = in m3_suspend()
2422 snd_m3_assp_read(chip, MEMTYPE_INTERNAL_DATA, i); in m3_suspend()
2429 struct snd_m3 *chip = card->private_data; in m3_resume() local
2432 if (chip->suspend_mem == NULL) in m3_resume()
2436 snd_m3_outw(chip, 0, 0x54); in m3_resume()
2437 snd_m3_outw(chip, 0, 0x56); in m3_resume()
2439 snd_m3_chip_init(chip); in m3_resume()
2440 snd_m3_assp_halt(chip); in m3_resume()
2441 snd_m3_ac97_reset(chip); in m3_resume()
2446 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_CODE, i, in m3_resume()
2447 chip->suspend_mem[dsp_index++]); in m3_resume()
2449 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, i, in m3_resume()
2450 chip->suspend_mem[dsp_index++]); in m3_resume()
2453 snd_m3_assp_write(chip, MEMTYPE_INTERNAL_DATA, in m3_resume()
2457 snd_ac97_resume(chip->ac97); in m3_resume()
2459 snd_m3_assp_continue(chip); in m3_resume()
2460 snd_m3_enable_ints(chip); in m3_resume()
2461 snd_m3_amp_enable(chip, 1); in m3_resume()
2463 snd_m3_hv_init(chip); in m3_resume()
2466 chip->in_suspend = 0; in m3_resume()
2477 static int snd_m3_input_register(struct snd_m3 *chip) in snd_m3_input_register() argument
2486 snprintf(chip->phys, sizeof(chip->phys), "pci-%s/input0", in snd_m3_input_register()
2487 pci_name(chip->pci)); in snd_m3_input_register()
2489 input_dev->name = chip->card->driver; in snd_m3_input_register()
2490 input_dev->phys = chip->phys; in snd_m3_input_register()
2492 input_dev->id.vendor = chip->pci->vendor; in snd_m3_input_register()
2493 input_dev->id.product = chip->pci->device; in snd_m3_input_register()
2494 input_dev->dev.parent = &chip->pci->dev; in snd_m3_input_register()
2507 chip->input_dev = input_dev; in snd_m3_input_register()
2517 struct snd_m3 *chip = device->device_data; in snd_m3_dev_free() local
2518 return snd_m3_free(chip); in snd_m3_dev_free()
2527 struct snd_m3 *chip; in snd_m3_create() local
2548 chip = kzalloc(sizeof(*chip), GFP_KERNEL); in snd_m3_create()
2549 if (chip == NULL) { in snd_m3_create()
2554 spin_lock_init(&chip->reg_lock); in snd_m3_create()
2561 chip->allegro_flag = 1; in snd_m3_create()
2565 chip->card = card; in snd_m3_create()
2566 chip->pci = pci; in snd_m3_create()
2567 chip->irq = -1; in snd_m3_create()
2568 INIT_WORK(&chip->hwvol_work, snd_m3_update_hw_volume); in snd_m3_create()
2570 chip->external_amp = enable_amp; in snd_m3_create()
2572 chip->amp_gpio = amp_gpio; in snd_m3_create()
2578 chip->amp_gpio = quirk->value; in snd_m3_create()
2579 } else if (chip->allegro_flag) in snd_m3_create()
2580 chip->amp_gpio = GPO_EXT_AMP_ALLEGRO; in snd_m3_create()
2582 chip->amp_gpio = GPO_EXT_AMP_M3; in snd_m3_create()
2589 chip->irda_workaround = 1; in snd_m3_create()
2593 chip->hv_config = quirk->value; in snd_m3_create()
2595 chip->is_omnibook = 1; in snd_m3_create()
2597 chip->num_substreams = NR_DSPS; in snd_m3_create()
2598 chip->substreams = kcalloc(chip->num_substreams, sizeof(struct m3_dma), in snd_m3_create()
2600 if (chip->substreams == NULL) { in snd_m3_create()
2601 kfree(chip); in snd_m3_create()
2606 err = request_firmware(&chip->assp_kernel_image, in snd_m3_create()
2609 snd_m3_free(chip); in snd_m3_create()
2613 err = request_firmware(&chip->assp_minisrc_image, in snd_m3_create()
2616 snd_m3_free(chip); in snd_m3_create()
2621 snd_m3_free(chip); in snd_m3_create()
2624 chip->iobase = pci_resource_start(pci, 0); in snd_m3_create()
2629 snd_m3_chip_init(chip); in snd_m3_create()
2630 snd_m3_assp_halt(chip); in snd_m3_create()
2632 snd_m3_ac97_reset(chip); in snd_m3_create()
2634 snd_m3_amp_enable(chip, 1); in snd_m3_create()
2636 snd_m3_hv_init(chip); in snd_m3_create()
2639 KBUILD_MODNAME, chip)) { in snd_m3_create()
2641 snd_m3_free(chip); in snd_m3_create()
2644 chip->irq = pci->irq; in snd_m3_create()
2647 chip->suspend_mem = vmalloc(sizeof(u16) * (REV_B_CODE_MEMORY_LENGTH + REV_B_DATA_MEMORY_LENGTH)); in snd_m3_create()
2648 if (chip->suspend_mem == NULL) in snd_m3_create()
2652 if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) { in snd_m3_create()
2653 snd_m3_free(chip); in snd_m3_create()
2657 if ((err = snd_m3_mixer(chip)) < 0) in snd_m3_create()
2660 for (i = 0; i < chip->num_substreams; i++) { in snd_m3_create()
2661 struct m3_dma *s = &chip->substreams[i]; in snd_m3_create()
2662 if ((err = snd_m3_assp_client_init(chip, s, i)) < 0) in snd_m3_create()
2666 if ((err = snd_m3_pcm(chip, 0)) < 0) in snd_m3_create()
2670 if (chip->hv_config & HV_CTRL_ENABLE) { in snd_m3_create()
2671 err = snd_m3_input_register(chip); in snd_m3_create()
2679 snd_m3_enable_ints(chip); in snd_m3_create()
2680 snd_m3_assp_continue(chip); in snd_m3_create()
2682 *chip_ret = chip; in snd_m3_create()
2694 struct snd_m3 *chip; in snd_m3_probe() local
2730 &chip)) < 0) { in snd_m3_probe()
2734 card->private_data = chip; in snd_m3_probe()
2738 card->shortname, chip->iobase, chip->irq); in snd_m3_probe()
2747 err = snd_mpu401_uart_new(chip->card, 0, MPU401_HW_MPU401, in snd_m3_probe()
2748 chip->iobase + MPU401_DATA_PORT, in snd_m3_probe()
2750 -1, &chip->rmidi); in snd_m3_probe()