Lines Matching refs:dev

139 	struct solo_dev		*dev;  member
177 struct solo_dev *dev; member
238 solo_dspready(solo_dev_t *dev) in solo_dspready() argument
240 return ((PORT_RD8(dev->sb, 0xc) & 0x80) == 0 ? true : false); in solo_dspready()
244 solo_dspwr(solo_dev_t *dev, uint8_t val) in solo_dspwr() argument
249 if (solo_dspready(dev)) { in solo_dspwr()
250 PORT_WR8(dev->sb, 0xc, val); in solo_dspwr()
256 audio_dev_warn(dev->adev, "solo_dspwr(0x%02x) timed out", val); in solo_dspwr()
261 solo_cmd(solo_dev_t *dev, uint8_t val) in solo_cmd() argument
263 return (solo_dspwr(dev, val)); in solo_cmd()
267 solo_cmd1(solo_dev_t *dev, uint8_t cmd, uint8_t val) in solo_cmd1() argument
269 if (solo_dspwr(dev, cmd)) { in solo_cmd1()
270 (void) solo_dspwr(dev, val); in solo_cmd1()
275 solo_setmixer(solo_dev_t *dev, uint8_t port, uint8_t value) in solo_setmixer() argument
277 PORT_WR8(dev->sb, 0x4, port); /* Select register */ in solo_setmixer()
279 PORT_WR8(dev->sb, 0x5, value); in solo_setmixer()
284 solo_getmixer(solo_dev_t *dev, uint8_t port) in solo_getmixer() argument
288 PORT_WR8(dev->sb, 0x4, port); /* Select register */ in solo_getmixer()
290 val = PORT_RD8(dev->sb, 0x5); in solo_getmixer()
297 solo_get_byte(solo_dev_t *dev) in solo_get_byte() argument
300 if (PORT_RD8(dev->sb, 0xc) & 0x40) in solo_get_byte()
301 return (PORT_RD8(dev->sb, 0xa)); in solo_get_byte()
305 audio_dev_warn(dev->adev, "timeout waiting to read DSP port"); in solo_get_byte()
310 solo_write(solo_dev_t *dev, uint8_t reg, uint8_t val) in solo_write() argument
312 solo_cmd1(dev, reg, val); in solo_write()
316 solo_read(solo_dev_t *dev, uint8_t reg) in solo_read() argument
318 if (solo_cmd(dev, 0xc0) && solo_cmd(dev, reg)) { in solo_read()
319 return (solo_get_byte(dev)); in solo_read()
325 solo_reset_dsp(solo_dev_t *dev) in solo_reset_dsp() argument
327 PORT_WR8(dev->sb, 0x6, 3); in solo_reset_dsp()
329 PORT_WR8(dev->sb, 0x6, 0); in solo_reset_dsp()
330 if (solo_get_byte(dev) != 0xAA) { in solo_reset_dsp()
331 audio_dev_warn(dev->adev, "solo_reset_dsp failed"); in solo_reset_dsp()
340 solo_dev_t *dev = (void *)arg1; in solo_intr() local
346 mutex_enter(&dev->mutex); in solo_intr()
348 if (dev->suspended) { in solo_intr()
349 mutex_exit(&dev->mutex); in solo_intr()
353 status = PORT_RD8(dev->io, 0x7); in solo_intr()
357 solo_setmixer(dev, 0x7a, solo_getmixer(dev, 0x7a) & ~0x80); in solo_intr()
363 (void) PORT_RD8(dev->sb, 0xe); in solo_intr()
365 mutex_exit(&dev->mutex); in solo_intr()
371 solo_mixer_scale(solo_dev_t *dev, solo_ctrl_num_t num) in solo_mixer_scale() argument
374 uint64_t value = dev->ctrls[num].val; in solo_mixer_scale()
385 solo_configure_mixer(solo_dev_t *dev) in solo_configure_mixer() argument
395 solo_setmixer(dev, 0x64, solo_getmixer(dev, 0x64) | 0xc); in solo_configure_mixer()
396 solo_setmixer(dev, 0x66, 0); in solo_configure_mixer()
400 v = (dev->ctrls[CTL_FRONT].val >> 8) & 0xff; in solo_configure_mixer()
402 solo_setmixer(dev, 0x60, v & 0xff); in solo_configure_mixer()
405 v = dev->ctrls[CTL_FRONT].val & 0xff; in solo_configure_mixer()
407 solo_setmixer(dev, 0x62, v & 0xff); in solo_configure_mixer()
409 v = solo_mixer_scale(dev, CTL_VOLUME); in solo_configure_mixer()
411 solo_setmixer(dev, 0x7c, v & 0xff); in solo_configure_mixer()
412 solo_setmixer(dev, 0x14, v & 0xff); in solo_configure_mixer()
414 mon = dev->ctrls[CTL_MONSRC].val; in solo_configure_mixer()
415 rec = dev->ctrls[CTL_RECSRC].val; in solo_configure_mixer()
421 v = solo_mixer_scale(dev, CTL_MIC); in solo_configure_mixer()
422 solo_setmixer(dev, 0x68, rec & (1 << INPUT_MIC) ? v : 0); in solo_configure_mixer()
423 solo_setmixer(dev, 0x1a, mon & (1 << INPUT_MIC) ? v : 0); in solo_configure_mixer()
425 v = solo_mixer_scale(dev, CTL_LINE); in solo_configure_mixer()
426 solo_setmixer(dev, 0x6e, rec & (1 << INPUT_LINE) ? v : 0); in solo_configure_mixer()
427 solo_setmixer(dev, 0x3e, mon & (1 << INPUT_LINE) ? v : 0); in solo_configure_mixer()
429 v = solo_mixer_scale(dev, CTL_CD); in solo_configure_mixer()
430 solo_setmixer(dev, 0x6a, rec & (1 << INPUT_CD) ? v : 0); in solo_configure_mixer()
431 solo_setmixer(dev, 0x38, mon & (1 << INPUT_CD) ? v : 0); in solo_configure_mixer()
433 v = solo_mixer_scale(dev, CTL_AUX); in solo_configure_mixer()
434 solo_setmixer(dev, 0x6c, rec & (1 << INPUT_AUX) ? v : 0); in solo_configure_mixer()
435 solo_setmixer(dev, 0x3a, mon & (1 << INPUT_AUX) ? v : 0); in solo_configure_mixer()
437 v = solo_mixer_scale(dev, CTL_MONO); in solo_configure_mixer()
439 solo_setmixer(dev, 0x6f, rec & (1 << INPUT_MONO) ? v : 0); in solo_configure_mixer()
440 solo_setmixer(dev, 0x6d, mon & (1 << INPUT_MONO) ? v : 0); in solo_configure_mixer()
442 if (dev->ctrls[CTL_MICBOOST].val) { in solo_configure_mixer()
443 solo_setmixer(dev, 0x7d, solo_getmixer(dev, 0x7d) | 0x8); in solo_configure_mixer()
445 solo_setmixer(dev, 0x7d, solo_getmixer(dev, 0x7d) & ~(0x8)); in solo_configure_mixer()
448 v = solo_mixer_scale(dev, CTL_RECGAIN); in solo_configure_mixer()
450 solo_write(dev, 0xb4, v & 0xff); in solo_configure_mixer()
452 v = dev->ctrls[CTL_SPEAKER].val & 0xff; in solo_configure_mixer()
454 solo_setmixer(dev, 0x3c, v & 0xff); in solo_configure_mixer()
456 if (dev->ctrls[CTL_LOOPBACK].val) { in solo_configure_mixer()
458 solo_setmixer(dev, 0x1c, 0x3); in solo_configure_mixer()
461 solo_setmixer(dev, 0x1c, 0x5); in solo_configure_mixer()
470 solo_dev_t *dev = pc->dev; in solo_set_mixsrc() local
475 mutex_enter(&dev->mutex); in solo_set_mixsrc()
477 solo_configure_mixer(dev); in solo_set_mixsrc()
478 mutex_exit(&dev->mutex); in solo_set_mixsrc()
486 solo_dev_t *dev = pc->dev; in solo_set_mono() local
494 mutex_enter(&dev->mutex); in solo_set_mono()
496 solo_configure_mixer(dev); in solo_set_mono()
497 mutex_exit(&dev->mutex); in solo_set_mono()
505 solo_dev_t *dev = pc->dev; in solo_set_stereo() local
515 mutex_enter(&dev->mutex); in solo_set_stereo()
517 solo_configure_mixer(dev); in solo_set_stereo()
518 mutex_exit(&dev->mutex); in solo_set_stereo()
526 solo_dev_t *dev = pc->dev; in solo_set_bool() local
528 mutex_enter(&dev->mutex); in solo_set_bool()
530 solo_configure_mixer(dev); in solo_set_bool()
531 mutex_exit(&dev->mutex); in solo_set_bool()
539 solo_dev_t *dev = pc->dev; in solo_get_value() local
541 mutex_enter(&dev->mutex); in solo_get_value()
543 mutex_exit(&dev->mutex); in solo_get_value()
555 solo_alloc_ctrl(solo_dev_t *dev, uint32_t num, uint64_t val) in solo_alloc_ctrl() argument
563 pc = &dev->ctrls[num]; in solo_alloc_ctrl()
565 pc->dev = dev; in solo_alloc_ctrl()
693 pc->ctrl = audio_dev_add_control(dev->adev, &desc, in solo_alloc_ctrl()
698 solo_add_controls(solo_dev_t *dev) in solo_add_controls() argument
700 solo_alloc_ctrl(dev, CTL_VOLUME, 0x4b); in solo_add_controls()
701 solo_alloc_ctrl(dev, CTL_FRONT, 0x5a5a); in solo_add_controls()
702 solo_alloc_ctrl(dev, CTL_SPEAKER, 0x4b); in solo_add_controls()
703 solo_alloc_ctrl(dev, CTL_MIC, 0x3232); in solo_add_controls()
704 solo_alloc_ctrl(dev, CTL_LINE, 0x4b4b); in solo_add_controls()
705 solo_alloc_ctrl(dev, CTL_CD, 0x4b4b); in solo_add_controls()
706 solo_alloc_ctrl(dev, CTL_AUX, 0); in solo_add_controls()
707 solo_alloc_ctrl(dev, CTL_MONO, 0); in solo_add_controls()
708 solo_alloc_ctrl(dev, CTL_RECSRC, (1U << INPUT_MIC)); in solo_add_controls()
709 solo_alloc_ctrl(dev, CTL_MONSRC, 0); in solo_add_controls()
710 solo_alloc_ctrl(dev, CTL_RECGAIN, 0x4b4b); in solo_add_controls()
711 solo_alloc_ctrl(dev, CTL_MICBOOST, 1); in solo_add_controls()
712 solo_alloc_ctrl(dev, CTL_LOOPBACK, 0); in solo_add_controls()
731 solo_dev_t *dev = e->dev; in solo_aud1_update() local
738 ASSERT(mutex_owned(&dev->mutex)); in solo_aud1_update()
751 ptr = PORT_RD32(dev->vc, 0); in solo_aud1_update()
752 count = PORT_RD16(dev->vc, 4); in solo_aud1_update()
756 ptr = dev->last_capture; in solo_aud1_update()
762 PORT_WR8(dev->vc, 0xf, 0); /* restart DMA */ in solo_aud1_update()
774 dev->last_capture = ptr; in solo_aud1_update()
789 solo_dev_t *dev = e->dev; in solo_aud1_start() local
793 ASSERT(mutex_owned(&dev->mutex)); in solo_aud1_start()
800 solo_write(dev, 0xa1, 0xf0); in solo_aud1_start()
802 solo_write(dev, 0xa2, solo_calcfilter(SOLO_RATE)); in solo_aud1_start()
806 solo_write(dev, 0xa8, (solo_read(dev, 0xa8) & ~0x03) | 1); in solo_aud1_start()
808 (void) solo_cmd(dev, 0xd3); /* turn off DAC1 output */ in solo_aud1_start()
811 solo_write(dev, 0xb7, 0x71); in solo_aud1_start()
812 solo_write(dev, 0xb7, 0xbc); in solo_aud1_start()
814 v = solo_mixer_scale(dev, CTL_RECGAIN); in solo_aud1_start()
816 solo_write(dev, 0xb4, v & 0xff); in solo_aud1_start()
818 PORT_WR8(dev->vc, 0x8, 0xc4); /* command */ in solo_aud1_start()
819 PORT_WR8(dev->vc, 0xd, 0xff); /* clear DMA */ in solo_aud1_start()
820 PORT_WR8(dev->vc, 0xf, 0x01); /* stop DMA */ in solo_aud1_start()
822 PORT_WR8(dev->vc, 0xd, 0xff); /* reset */ in solo_aud1_start()
823 PORT_WR8(dev->vc, 0xf, 0x01); /* mask */ in solo_aud1_start()
824 PORT_WR8(dev->vc, 0xb, 0x14); /* mode */ in solo_aud1_start()
826 PORT_WR32(dev->vc, 0x0, e->paddr); in solo_aud1_start()
827 PORT_WR16(dev->vc, 0x4, SOLO_BUFSZ - 1); in solo_aud1_start()
830 solo_write(dev, 0xa4, len & 0x00ff); in solo_aud1_start()
831 solo_write(dev, 0xa5, (len & 0xff00) >> 8); in solo_aud1_start()
834 solo_write(dev, 0xb8, 0x0f); in solo_aud1_start()
835 PORT_WR8(dev->vc, 0xf, 0); /* start DMA */ in solo_aud1_start()
837 dev->last_capture = e->paddr; in solo_aud1_start()
844 solo_dev_t *dev = e->dev; in solo_aud1_stop() local
847 solo_write(dev, 0xb8, solo_read(dev, 0xb8) & ~0x01); in solo_aud1_stop()
854 solo_dev_t *dev = e->dev; in solo_aud2_update() local
857 ASSERT(mutex_owned(&dev->mutex)); in solo_aud2_update()
859 offset = SOLO_BUFSZ - PORT_RD16(dev->io, 0x4); in solo_aud2_update()
873 solo_dev_t *dev = e->dev; in solo_aud2_start() local
877 ASSERT(mutex_owned(&dev->mutex)); in solo_aud2_start()
884 solo_setmixer(dev, 0x78, 0x10); in solo_aud2_start()
886 solo_setmixer(dev, 0x70, 0xf0); in solo_aud2_start()
887 solo_setmixer(dev, 0x72, solo_calcfilter(SOLO_RATE)); in solo_aud2_start()
889 solo_setmixer(dev, 0x74, len & 0x00ff); in solo_aud2_start()
890 solo_setmixer(dev, 0x76, (len & 0xff00) >> 8); in solo_aud2_start()
892 solo_setmixer(dev, 0x7a, 0x47); in solo_aud2_start()
894 PORT_WR8(dev->io, 0x6, 0); in solo_aud2_start()
895 PORT_WR32(dev->io, 0x0, e->paddr); in solo_aud2_start()
896 PORT_WR16(dev->io, 0x4, SOLO_BUFSZ); in solo_aud2_start()
900 solo_setmixer(dev, 0x78, 0x92); in solo_aud2_start()
902 solo_setmixer(dev, 0x78, 0x93); in solo_aud2_start()
904 PORT_WR8(dev->io, 0x6, 0x0a); /* autoinit, enable */ in solo_aud2_start()
906 v = solo_mixer_scale(dev, CTL_VOLUME); in solo_aud2_start()
908 solo_setmixer(dev, 0x7c, v & 0xff); in solo_aud2_start()
916 solo_dev_t *dev = e->dev; in solo_aud2_stop() local
919 PORT_WR8(dev->io, 0x6, 0); in solo_aud2_stop()
920 solo_setmixer(dev, 0x78, solo_getmixer(dev, 0x78) & ~0x03); in solo_aud2_stop()
977 solo_dev_t *dev = e->dev; in solo_count() local
980 mutex_enter(&dev->mutex); in solo_count()
983 mutex_exit(&dev->mutex); in solo_count()
992 solo_dev_t *dev = e->dev; in solo_open() local
999 mutex_enter(&dev->mutex); in solo_open()
1002 mutex_exit(&dev->mutex); in solo_open()
1011 solo_dev_t *dev = e->dev; in solo_close() local
1013 mutex_enter(&dev->mutex); in solo_close()
1016 mutex_exit(&dev->mutex); in solo_close()
1024 solo_dev_t *dev = e->dev; in solo_start() local
1026 mutex_enter(&dev->mutex); in solo_start()
1031 mutex_exit(&dev->mutex); in solo_start()
1040 solo_dev_t *dev = e->dev; in solo_stop() local
1042 mutex_enter(&dev->mutex); in solo_stop()
1047 mutex_exit(&dev->mutex); in solo_stop()
1068 solo_release_resources(solo_dev_t *dev) in solo_release_resources() argument
1070 if (dev->ihandle != NULL) { in solo_release_resources()
1071 (void) ddi_intr_disable(dev->ihandle); in solo_release_resources()
1072 (void) ddi_intr_remove_handler(dev->ihandle); in solo_release_resources()
1073 (void) ddi_intr_free(dev->ihandle); in solo_release_resources()
1074 mutex_destroy(&dev->mutex); in solo_release_resources()
1077 if (dev->io.acch != NULL) { in solo_release_resources()
1078 ddi_regs_map_free(&dev->io.acch); in solo_release_resources()
1081 if (dev->sb.acch != NULL) { in solo_release_resources()
1082 ddi_regs_map_free(&dev->sb.acch); in solo_release_resources()
1085 if (dev->vc.acch != NULL) { in solo_release_resources()
1086 ddi_regs_map_free(&dev->vc.acch); in solo_release_resources()
1089 if (dev->pcih != NULL) { in solo_release_resources()
1090 pci_config_teardown(&dev->pcih); in solo_release_resources()
1094 if (dev->play.paddr != 0) in solo_release_resources()
1095 (void) ddi_dma_unbind_handle(dev->play.dmah); in solo_release_resources()
1096 if (dev->play.acch != NULL) in solo_release_resources()
1097 ddi_dma_mem_free(&dev->play.acch); in solo_release_resources()
1098 if (dev->play.dmah != NULL) in solo_release_resources()
1099 ddi_dma_free_handle(&dev->play.dmah); in solo_release_resources()
1101 if (dev->play.engine != NULL) { in solo_release_resources()
1102 audio_dev_remove_engine(dev->adev, dev->play.engine); in solo_release_resources()
1103 audio_engine_free(dev->play.engine); in solo_release_resources()
1107 if (dev->rec.paddr != 0) in solo_release_resources()
1108 (void) ddi_dma_unbind_handle(dev->rec.dmah); in solo_release_resources()
1109 if (dev->rec.acch != NULL) in solo_release_resources()
1110 ddi_dma_mem_free(&dev->rec.acch); in solo_release_resources()
1111 if (dev->rec.dmah != NULL) in solo_release_resources()
1112 ddi_dma_free_handle(&dev->rec.dmah); in solo_release_resources()
1114 if (dev->rec.engine != NULL) { in solo_release_resources()
1115 audio_dev_remove_engine(dev->adev, dev->rec.engine); in solo_release_resources()
1116 audio_engine_free(dev->rec.engine); in solo_release_resources()
1120 if (dev->ctrls[i].ctrl != NULL) { in solo_release_resources()
1121 audio_dev_del_control(dev->ctrls[i].ctrl); in solo_release_resources()
1125 if (dev->adev != NULL) { in solo_release_resources()
1126 audio_dev_free(dev->adev); in solo_release_resources()
1129 kmem_free(dev, sizeof (*dev)); in solo_release_resources()
1133 solo_setup_interrupts(solo_dev_t *dev) in solo_setup_interrupts() argument
1138 if ((ddi_intr_alloc(dev->dip, &dev->ihandle, DDI_INTR_TYPE_FIXED, in solo_setup_interrupts()
1141 audio_dev_warn(dev->adev, "can't alloc intr handle"); in solo_setup_interrupts()
1145 if (ddi_intr_get_pri(dev->ihandle, &ipri) != DDI_SUCCESS) { in solo_setup_interrupts()
1146 audio_dev_warn(dev->adev, "can't determine intr priority"); in solo_setup_interrupts()
1147 (void) ddi_intr_free(dev->ihandle); in solo_setup_interrupts()
1148 dev->ihandle = NULL; in solo_setup_interrupts()
1152 if (ddi_intr_add_handler(dev->ihandle, solo_intr, dev, in solo_setup_interrupts()
1154 audio_dev_warn(dev->adev, "can't add intr handler"); in solo_setup_interrupts()
1155 (void) ddi_intr_free(dev->ihandle); in solo_setup_interrupts()
1156 dev->ihandle = NULL; in solo_setup_interrupts()
1160 mutex_init(&dev->mutex, NULL, MUTEX_DRIVER, DDI_INTR_PRI(ipri)); in solo_setup_interrupts()
1166 solo_map_registers(solo_dev_t *dev) in solo_map_registers() argument
1168 dev_info_t *dip = dev->dip; in solo_map_registers()
1171 if (ddi_regs_map_setup(dip, 1, &dev->io.base, 0, 0, &acc_attr, in solo_map_registers()
1172 &dev->io.acch) != DDI_SUCCESS) { in solo_map_registers()
1173 audio_dev_warn(dev->adev, "can't map IO registers"); in solo_map_registers()
1176 if (ddi_regs_map_setup(dip, 2, &dev->sb.base, 0, 0, &acc_attr, in solo_map_registers()
1177 &dev->sb.acch) != DDI_SUCCESS) { in solo_map_registers()
1178 audio_dev_warn(dev->adev, "can't map SB registers"); in solo_map_registers()
1181 if (ddi_regs_map_setup(dip, 3, &dev->vc.base, 0, 0, &acc_attr, in solo_map_registers()
1182 &dev->vc.acch) != DDI_SUCCESS) { in solo_map_registers()
1183 audio_dev_warn(dev->adev, "can't map VC registers"); in solo_map_registers()
1195 solo_init_hw(solo_dev_t *dev) in solo_init_hw() argument
1204 pci_config_put16(dev->pcih, ESS_PCI_LEGACYCONTROL, 0x8041); in solo_init_hw()
1210 data = pci_config_get32(dev->pcih, PCI_CONF_BASE2); in solo_init_hw()
1212 pci_config_put16(dev->pcih, ESS_PCI_DDMACONTROL, data & 0xffff); in solo_init_hw()
1218 pci_config_put16(dev->pcih, ESS_PCI_CONFIG, 0); in solo_init_hw()
1220 if (!solo_reset_dsp(dev)) in solo_init_hw()
1224 (void) solo_cmd(dev, 0xc6); in solo_init_hw()
1227 PORT_WR8(dev->io, 0x7, 0x30); /* enable audio irqs */ in solo_init_hw()
1230 solo_write(dev, 0xb9, 0x01); in solo_init_hw()
1237 solo_setmixer(dev, 0x71, 0x2a); in solo_init_hw()
1240 solo_write(dev, 0xb1, (solo_read(dev, 0xb1) & 0x0f) | 0x50); in solo_init_hw()
1242 solo_write(dev, 0xb2, (solo_read(dev, 0xb2) & 0x0f) | 0x50); in solo_init_hw()
1244 solo_setmixer(dev, 0, 0); /* reset mixer settings */ in solo_init_hw()
1246 solo_configure_mixer(dev); in solo_init_hw()
1251 solo_alloc_engine(solo_dev_t *dev, int engno) in solo_alloc_engine() argument
1266 e = &dev->rec; in solo_alloc_engine()
1280 e = &dev->play; in solo_alloc_engine()
1294 audio_dev_warn(dev->adev, "bad engine number!"); in solo_alloc_engine()
1298 e->dev = dev; in solo_alloc_engine()
1300 if (ddi_dma_alloc_handle(dev->dip, dattr, DDI_DMA_SLEEP, NULL, in solo_alloc_engine()
1302 audio_dev_warn(dev->adev, "%s dma handle alloc failed", desc); in solo_alloc_engine()
1308 audio_dev_warn(dev->adev, "%s dma memory alloc failed", desc); in solo_alloc_engine()
1315 audio_dev_warn(dev->adev, "%s dma binding failed", desc); in solo_alloc_engine()
1325 audio_dev_warn(dev->adev, "record audio_engine_alloc failed"); in solo_alloc_engine()
1330 audio_dev_add_engine(dev->adev, e->engine); in solo_alloc_engine()
1337 solo_suspend(solo_dev_t *dev) in solo_suspend() argument
1339 audio_dev_suspend(dev->adev); in solo_suspend()
1341 mutex_enter(&dev->mutex); in solo_suspend()
1342 dev->suspended = true; in solo_suspend()
1343 mutex_exit(&dev->mutex); in solo_suspend()
1349 solo_resume(solo_dev_t *dev) in solo_resume() argument
1351 mutex_enter(&dev->mutex); in solo_resume()
1352 if (!solo_init_hw(dev)) { in solo_resume()
1354 audio_dev_warn(dev->adev, "unable to resume audio!"); in solo_resume()
1355 audio_dev_warn(dev->adev, "reboot or reload driver to reset"); in solo_resume()
1357 dev->suspended = false; in solo_resume()
1358 mutex_exit(&dev->mutex); in solo_resume()
1360 audio_dev_resume(dev->adev); in solo_resume()
1368 solo_dev_t *dev; in solo_attach() local
1371 dev = kmem_zalloc(sizeof (*dev), KM_SLEEP); in solo_attach()
1372 dev->dip = dip; in solo_attach()
1373 ddi_set_driver_private(dip, dev); in solo_attach()
1375 dev->adev = audio_dev_alloc(dip, 0); in solo_attach()
1376 if (dev->adev == NULL) in solo_attach()
1379 audio_dev_set_description(dev->adev, "ESS Solo-1 PCI AudioDrive"); in solo_attach()
1380 audio_dev_set_version(dev->adev, "ES1938"); in solo_attach()
1382 if (pci_config_setup(dip, &dev->pcih) != DDI_SUCCESS) { in solo_attach()
1387 data = pci_config_get16(dev->pcih, PCI_CONF_COMM); in solo_attach()
1389 pci_config_put16(dev->pcih, PCI_CONF_COMM, data); in solo_attach()
1391 if ((!solo_map_registers(dev)) || in solo_attach()
1392 (!solo_setup_interrupts(dev)) || in solo_attach()
1393 (!solo_alloc_engine(dev, 1)) || in solo_attach()
1394 (!solo_alloc_engine(dev, 2)) || in solo_attach()
1395 (!solo_add_controls(dev)) || in solo_attach()
1396 (!solo_init_hw(dev))) { in solo_attach()
1400 if (audio_dev_register(dev->adev) != DDI_SUCCESS) { in solo_attach()
1401 audio_dev_warn(dev->adev, in solo_attach()
1406 (void) ddi_intr_enable(dev->ihandle); in solo_attach()
1412 solo_release_resources(dev); in solo_attach()
1417 solo_detach(solo_dev_t *dev) in solo_detach() argument
1419 if (audio_dev_unregister(dev->adev) != DDI_SUCCESS) { in solo_detach()
1423 solo_release_resources(dev); in solo_detach()
1430 solo_dev_t *dev; in solo_ddi_attach() local
1437 if ((dev = ddi_get_driver_private(dip)) == NULL) { in solo_ddi_attach()
1440 return (solo_resume(dev)); in solo_ddi_attach()
1450 solo_dev_t *dev; in solo_ddi_detach() local
1452 if ((dev = ddi_get_driver_private(dip)) == NULL) { in solo_ddi_detach()
1458 return (solo_detach(dev)); in solo_ddi_detach()
1461 return (solo_suspend(dev)); in solo_ddi_detach()
1470 solo_dev_t *dev; in solo_quiesce() local
1472 dev = ddi_get_driver_private(dip); in solo_quiesce()
1474 solo_aud1_stop(&dev->rec); in solo_quiesce()
1475 solo_aud2_stop(&dev->play); in solo_quiesce()
1477 solo_setmixer(dev, 0, 0); in solo_quiesce()
1478 PORT_WR8(dev->io, 0x7, 0); /* disable all irqs */ in solo_quiesce()