int yds_write_codec(void *sc_, u_int8_t reg, u_int16_t data) { struct yds_codec_softc *sc = sc_; YWRITE2(sc->sc, AC97_CMD_ADDR, AC97_CMD_WRITE | AC97_ID(sc->id) | reg); YWRITE2(sc->sc, AC97_CMD_DATA, data); if (yds_ready_codec(sc)) { printf("%s: yds_write_codec timeout\n", sc->sc->sc_dev.dv_xname); return EIO; } return 0; }
static int yds_write_codec(void *sc_, uint8_t reg, uint16_t data) { struct yds_codec_softc *sc; sc = sc_; YWRITE2(sc->sc, AC97_CMD_ADDR, AC97_CMD_WRITE | AC97_ID(sc->id) | reg); YWRITE2(sc->sc, AC97_CMD_DATA, data); if (yds_ready_codec(sc)) { aprint_error_dev(sc->sc->sc_dev, "yds_write_codec timeout\n"); return EIO; } return 0; }
/* * XXX: Must handle the secondary differntly!! */ void yds_reset_codec(void *sc_) { struct yds_codec_softc *codec = sc_; struct yds_softc *sc = codec->sc; pcireg_t reg; /* reset AC97 codec */ reg = pci_conf_read(sc->sc_pc, sc->sc_pcitag, YDS_PCI_DSCTRL); if (reg & 0x03) { pci_conf_write(sc->sc_pc, sc->sc_pcitag, YDS_PCI_DSCTRL, reg & ~0x03); pci_conf_write(sc->sc_pc, sc->sc_pcitag, YDS_PCI_DSCTRL, reg | 0x03); pci_conf_write(sc->sc_pc, sc->sc_pcitag, YDS_PCI_DSCTRL, reg & ~0x03); delay(50000); } yds_ready_codec(sc_); }
int yds_read_codec(void *sc_, u_int8_t reg, u_int16_t *data) { struct yds_codec_softc *sc = sc_; YWRITE2(sc->sc, AC97_CMD_ADDR, AC97_CMD_READ | AC97_ID(sc->id) | reg); if (yds_ready_codec(sc)) { printf("%s: yds_read_codec timeout\n", sc->sc->sc_dev.dv_xname); return EIO; } if (PCI_PRODUCT(sc->sc->sc_id) == PCI_PRODUCT_YAMAHA_YMF744 && sc->sc->sc_revision < 2) { int i; for (i = 0; i < 600; i++) YREAD2(sc->sc, sc->status_data); } *data = YREAD2(sc->sc, sc->status_data); return 0; }
static int yds_read_codec(void *sc_, uint8_t reg, uint16_t *data) { struct yds_codec_softc *sc; sc = sc_; YWRITE2(sc->sc, AC97_CMD_ADDR, AC97_CMD_READ | AC97_ID(sc->id) | reg); if (yds_ready_codec(sc)) { aprint_error_dev(sc->sc->sc_dev, "yds_read_codec timeout\n"); return EIO; } if (PCI_PRODUCT(sc->sc->sc_id) == PCI_PRODUCT_YAMAHA_YMF744B && sc->sc->sc_revision < 2) { int i; for (i=0; i<600; i++) (void)YREAD2(sc->sc, sc->status_data); } *data = YREAD2(sc->sc, sc->status_data); return 0; }