Lines Matching defs:as
20 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
50 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
490 #define SOURCE_INFO_SIZE(as) ((as)->type == AC97_CODEC_TYPE_MODEM ? \
929 #define POWER_EAMP_ON(as) ((as->host_flags & AC97_HOST_INVERTED_EAMP) \
931 #define POWER_EAMP_OFF(as) ((as->host_flags & AC97_HOST_INVERTED_EAMP) \
935 ac97_read(struct ac97_softc *as, uint8_t reg, uint16_t *val)
937 KASSERT(mutex_owned(as->lock));
939 if (as->host_flags & AC97_HOST_DONT_READ &&
942 *val = as->shadow_reg[reg >> 1];
946 if (as->host_if->read(as->host_if->arg, reg, val)) {
947 *val = as->shadow_reg[reg >> 1];
952 ac97_write(struct ac97_softc *as, uint8_t reg, uint16_t val)
954 KASSERT(mutex_owned(as->lock));
957 as->shadow_reg[reg >> 1] = val;
958 return as->host_if->write(as->host_if->arg, reg, val);
963 as
964 ret = as->host_if->write(as->host_if->arg, reg, val);
965 as->host_if->read(as->host_if->arg, reg, &actual);
975 ac97_setup_defaults(struct ac97_softc *as)
980 KASSERT(mutex_owned(as->lock));
982 memset(as->shadow_reg, 0, sizeof(as->shadow_reg));
987 ac97_write(as, si->reg, si->default_value);
992 ac97_write(as, si->reg, si->default_value);
999 struct ac97_softc *as;
1004 as = (struct ac97_softc *)codec_if;
1006 KASSERT(mutex_owned(as->lock));
1008 if (as->type == AC97_CODEC_TYPE_AUDIO) {
1010 ac97_write(as, AC97_REG_POWER, as->power_reg);
1013 ac97_read(as, AC97_REG_POWER, &val);
1014 if ((val & as->power_all) == as->power_all)
1024 ac97_write(as, AC97_REG_MASTER_VOLUME, 0x1010);
1025 ac97_read(as, AC97_REG_MASTER_VOLUME, &val);
1032 for (idx = 0; idx < SOURCE_INFO_SIZE(as); idx++) {
1033 if (as->type == AC97_CODEC_TYPE_MODEM)
1039 ac97_write(as, si->reg, as->shadow_reg[si->reg >> 1]);
1042 if (as->ext_id & (AC97_EXT_AUDIO_VRA | AC97_EXT_AUDIO_DRA
1046 ac97_write(as, AC97_REG_EXT_AUDIO_CTRL,
1047 as->shadow_reg[AC97_REG_EXT_AUDIO_CTRL >> 1]);
1049 if (as->ext_mid & (AC97_EXT_MODEM_LINE1 | AC97_EXT_MODEM_LINE2
1053 ac97_write(as, AC97_REG_EXT_MODEM_CTRL,
1054 as->shadow_reg[AC97_REG_EXT_MODEM_CTRL >> 1]);
1065 ac97_check_capability(struct ac97_softc *as, int check)
1071 return as->ext_id & AC97_EXT_AUDIO_SDAC;
1073 return as->ext_id & AC97_EXT_AUDIO_CDAC;
1075 return as->ext_id & AC97_EXT_AUDIO_LDAC;
1077 return as->ext_id & AC97_EXT_AUDIO_SPDIF;
1079 return as->caps & AC97_CAPS_HEADPHONES;
1081 return as->caps & AC97_CAPS_TONECTRL;
1083 return as->caps & AC97_CAPS_MICIN;
1085 return as->caps & AC97_CAPS_LOUDNESS;
1087 return AC97_CAPS_ENHANCEMENT(as->caps) != 0;
1089 return as->ext_mid & AC97_EXT_MODEM_LINE1;
1091 return as->ext_mid & AC97_EXT_MODEM_LINE2;
1093 return as->ext_mid & AC97_EXT_MODEM_HANDSET;
1101 ac97_setup_source_info(struct ac97_softc *as)
1107 KASSERT(mutex_owned(as->lock));
1109 for (idx = 0, ouridx = 0; idx < SOURCE_INFO_SIZE(as); idx++) {
1110 si = &as->source_info[ouridx];
1111 if (as->type == AC97_CODEC_TYPE_MODEM) {
1116 if (!ac97_check_capability(as, si->req_feature))
1120 ac97_read(as, si->reg, &value1);
1124 ac97_write(as, si->reg, value2);
1126 ac97_read(as, si->reg, &value3);
1134 ac97_write(as, si->reg, value1);
1148 si = &as->source_info[ouridx];
1149 if (as->type == AC97_CODEC_TYPE_MODEM)
1176 as->num_source_info = ouridx;
1178 for (idx = 0; idx < as->num_source_info; idx++) {
1181 si = &as->source_info[idx];
1184 for (idx2 = 0; idx2 < as->num_source_info; idx2++) {
1185 si2 = &as->source_info[idx2];
1205 for (idx2 = 0; idx2 < as->num_source_info; idx2++) {
1209 si2 = &as->source_info[idx2];
1214 as->source_info[previdx].next = idx2;
1215 as->source_info[idx2].prev = previdx;
1221 as->source_info[previdx].next = AUDIO_MIXER_LAST;
1235 struct ac97_softc *as;
1247 as = malloc(sizeof(struct ac97_softc), M_DEVBUF, M_WAITOK|M_ZERO);
1249 if (as == NULL)
1252 as->codec_if.vtbl = &ac97civ;
1253 as->host_if = host_if;
1254 as->type = type;
1255 as->lock = lk;
1257 if ((error = host_if->attach(host_if->arg, &as->codec_if))) {
1258 free(as, M_DEVBUF);
1262 mutex_enter(as->lock);
1266 mutex_exit(as->lock);
1267 free(as, M_DEVBUF);
1273 as->host_flags = host_if->flags(host_if->arg);
1279 as->power_all = AC97_POWER_REF | AC97_POWER_ANL | AC97_POWER_DAC |
1281 if (as->type == AC97_CODEC_TYPE_AUDIO) {
1287 * AC97_POWER_MIXER will read back as zero.
1290 ac97_read(as, AC97_REG_POWER, &val);
1293 as->power_all &= ~AC97_POWER_ANL;
1295 host_if->write(host_if->arg, AC97_REG_POWER, POWER_EAMP_ON(as));
1298 ac97_read(as, AC97_REG_POWER, &val);
1299 if ((val & as->power_all) == as->power_all)
1305 ac97_read(as, AC97_REG_POWER, &as->power_reg);
1306 } else if (as->type == AC97_CODEC_TYPE_MODEM) {
1310 ac97_setup_defaults(as);
1311 if (as->type == AC97_CODEC_TYPE_AUDIO)
1312 ac97_read(as, AC97_REG_RESET, &as->caps);
1313 ac97_read(as, AC97_REG_VENDOR_ID1, &id1);
1314 ac97_read(as, AC97_REG_VENDOR_ID2, &id2);
1316 mutex_exit(as->lock);
1346 if (as->caps & (1 << i)) {
1352 ac97enhancement[AC97_CAPS_ENHANCEMENT(as->caps)]);
1354 as->ac97_clock = AC97_STANDARD_CLOCK;
1356 mutex_enter(as->lock);
1358 if (as->type == AC97_CODEC_TYPE_AUDIO) {
1359 ac97_read(as, AC97_REG_EXT_AUDIO_ID, &as->ext_id);
1360 if (as->ext_id != 0) {
1361 mutex_exit(as->lock);
1367 "\7CDAC\4VRM\3SPDIF\2DRA\1VRA", as->ext_id);
1372 if (as->ext_id & AC97_EXT_AUDIO_DSA_MASK) {
1374 switch (as->ext_id & AC97_EXT_AUDIO_DSA_MASK) {
1386 if (as->host_flags & AC97_HOST_INVERTED_EAMP) {
1391 mutex_enter(as->lock);
1394 ac97_read(as, AC97_REG_EXT_AUDIO_CTRL, &extstat);
1396 if (as->ext_id & AC97_EXT_AUDIO_LDAC)
1398 if (as->ext_id & AC97_EXT_AUDIO_SDAC)
1400 if (as->ext_id & AC97_EXT_AUDIO_CDAC)
1402 if (as->ext_id & AC97_EXT_AUDIO_VRM)
1404 if (as->ext_id & AC97_EXT_AUDIO_SPDIF) {
1405 /* Output the same data as DAC to SPDIF output */
1408 ac97_read(as, AC97_REG_SPDIF_CTRL, &val);
1411 ac97_write(as, AC97_REG_SPDIF_CTRL, val);
1413 if (as->ext_id & AC97_EXT_AUDIO_VRA)
1415 ac97_write(as, AC97_REG_EXT_AUDIO_CTRL, extstat);
1416 if (as->ext_id & AC97_EXT_AUDIO_VRA) {
1419 ac97_write(as, AC97_REG_PCM_FRONT_DAC_RATE,
1421 ac97_read(as, AC97_REG_PCM_FRONT_DAC_RATE,
1425 as->ext_id = 0;
1430 ac97_write(as, AC97_REG_PCM_FRONT_DAC_RATE,
1434 } else if (as->type == AC97_CODEC_TYPE_MODEM) {
1442 ac97_read(as, AC97_REG_EXT_MODEM_ID, &as->ext_mid);
1443 mutex_exit(as->lock);
1445 if (as->ext_mid == 0 || as->ext_mid == 0xffff) {
1447 free(as, M_DEVBUF);
1450 as->type = AC97_CODEC_TYPE_MODEM;
1454 "\20\5CID2\4CID1\3HANDSET\2LINE2\1LINE1", as->ext_mid);
1458 (as->ext_mid & 0xc000) == 0 ?
1462 err = sysctl_createv(&as->log, 0, NULL, NULL, 0, CTLTYPE_NODE,
1467 err = sysctl_createv(&as->log, 0, NULL, &node, 0,
1474 mutex_enter(as->lock);
1477 ac97_write(as, AC97_REG_EXT_MODEM_ID, 1);
1481 if (as->ext_mid & AC97_EXT_MODEM_LINE1) {
1482 ac97_write(as, AC97_REG_LINE1_RATE, xrate);
1486 if (as->ext_mid & AC97_EXT_MODEM_LINE2) {
1487 ac97_write(as, AC97_REG_LINE2_RATE, xrate);
1491 if (as->ext_mid & AC97_EXT_MODEM_HANDSET) {
1492 ac97_write(as, AC97_REG_HANDSET_RATE, xrate);
1498 ac97_write(as, AC97_REG_EXT_MODEM_CTRL, 0);
1500 ac97_read(as, AC97_REG_EXT_MODEM_CTRL, ®);
1506 mutex_exit(as->lock);
1513 if (as->ext_mid & AC97_EXT_MODEM_LINE1) {
1514 ac97_read(as, AC97_REG_GPIO_CFG, ®);
1516 ac97_write(as, AC97_REG_GPIO_CFG, reg);
1517 ac97_read(as, AC97_REG_GPIO_POLARITY, ®);
1519 ac97_write(as, AC97_REG_GPIO_POLARITY, reg);
1521 mutex_exit(as->lock);
1522 err = sysctl_createv(&as->log, 0, NULL, &node_line1,
1526 ac97_sysctl_verify, 0, (void *)as, 0,
1529 mutex_enter(as->lock);
1533 as->offhook_line1_mib = node_line1->sysctl_num;
1535 if (as->ext_mid & AC97_EXT_MODEM_LINE2) {
1536 ac97_read(as, AC97_REG_GPIO_CFG, ®);
1538 ac97_write(as, AC97_REG_GPIO_CFG, reg);
1539 ac97_read(as, AC97_REG_GPIO_POLARITY, ®);
1541 ac97_write(as, AC97_REG_GPIO_POLARITY, reg);
1543 mutex_exit(as->lock);
1544 err = sysctl_createv(&as->log, 0, NULL, &node_line2,
1548 ac97_sysctl_verify, 0, (void *)as, 0,
1551 mutex_enter(as->lock);
1555 as->offhook_line2_mib = node_line2->sysctl_num;
1559 ac97_write(as, AC97_REG_GPIO_STICKY, 0xffff);
1560 ac97_write(as, AC97_REG_GPIO_WAKEUP, 0x0);
1561 ac97_write(as, AC97_REG_MISC_AFE, 0x0);
1564 as->source_info = (as->type == AC97_CODEC_TYPE_MODEM ?
1565 as->modem_source_info : as->audio_source_info);
1566 ac97_setup_source_info(as);
1590 ctl.dev = ac97_get_portnum_by_name(&as->codec_if,
1592 ac97_mixer_set_port(&as->codec_if, &ctl);
1596 ctl.dev = ac97_get_portnum_by_name(&as->codec_if, AudioCrecord,
1598 ac97_mixer_set_port(&as->codec_if, &ctl);
1605 ctl.dev = ac97_get_portnum_by_name(&as->codec_if, AudioCoutputs,
1607 ac97_mixer_set_port(&as->codec_if, &ctl);
1608 ctl.dev = ac97_get_portnum_by_name(&as->codec_if, AudioCoutputs,
1610 ac97_mixer_set_port(&as->codec_if, &ctl);
1612 ctl.dev = ac97_get_portnum_by_name(&as->codec_if, AudioCoutputs,
1614 ac97_mixer_set_port(&as->codec_if, &ctl);
1615 ctl.dev = ac97_get_portnum_by_name(&as->codec_if, AudioCoutputs,
1617 ac97_mixer_set_port(&as->codec_if, &ctl);
1620 initfunc(as);
1623 if (as->type == AC97_CODEC_TYPE_AUDIO)
1624 ac97_write(as, AC97_REG_POWER, as->power_reg);
1626 mutex_exit(as->lock);
1634 struct ac97_softc *as;
1636 as = (struct ac97_softc *)codec_if;
1638 mutex_enter(as->lock);
1639 ac97_write(as, AC97_REG_POWER, AC97_POWER_IN | AC97_POWER_OUT
1642 | POWER_EAMP_OFF(as));
1643 mutex_exit(as->lock);
1645 free(as, M_DEVBUF);
1651 struct ac97_softc *as;
1653 as = (struct ac97_softc *)codec_if;
1655 KASSERT(mutex_owned(as->lock));
1657 as->lock_counter++;
1663 struct ac97_softc *as;
1665 as = (struct ac97_softc *)codec_if;
1667 KASSERT(mutex_owned(as->lock));
1669 as->lock_counter--;
1675 struct ac97_softc *as;
1679 as = (struct ac97_softc *)codec_if;
1680 if (dip->index >= 0 && dip->index < as->num_source_info) {
1681 si = &as->source_info[dip->index];
1715 struct ac97_softc *as;
1722 as = (struct ac97_softc *)codec_if;
1724 KASSERT(mutex_owned(as->lock));
1726 if (cp->dev < 0 || cp->dev >= as->num_source_info)
1728 si = &as->source_info[cp->dev];
1733 if (spdif && as->lock_counter >= 0) {
1739 ac97_read(as, si->reg, &val);
1774 if (!(as->host_flags & AC97_HOST_SWAPPED_CHANNELS)) {
1815 error = ac97_write(as, si->reg, (val & ~mask) | newval);
1819 if (spdif && as->host_if->spdif_event != NULL) {
1821 as->host_if->spdif_event(as->host_if->arg, cp->un.ord);
1830 struct ac97_softc *as;
1833 as = (struct ac97_softc *)codec_if;
1835 KASSERT(mutex_owned(as->lock));
1837 for (idx = 0; idx < as->num_source_info; idx++) {
1838 struct ac97_source_info *si = &as->source_info[idx];
1851 struct ac97_softc *as;
1856 as = (struct ac97_softc *)codec_if;
1858 KASSERT(mutex_owned(as->lock));
1860 si = &as->source_info[cp->dev];
1861 if (cp->dev < 0 || cp->dev >= as->num_source_info)
1867 ac97_read(as, si->reg, &val);
1891 if (!(as->host_flags & AC97_HOST_SWAPPED_CHANNELS)) {
1930 struct ac97_softc *as;
1937 as = (struct ac97_softc *)codec_if;
1939 KASSERT(mutex_owned(as->lock));
1942 if (!(as->ext_id & AC97_EXT_AUDIO_VRM)) {
1947 if (!(as->ext_id & AC97_EXT_AUDIO_VRA)) {
1952 value = *rate * AC97_STANDARD_CLOCK / as->ac97_clock;
1967 if (!(as->ext_id & AC97_EXT_AUDIO_VRA)) {
1971 if (as->ext_id & AC97_EXT_AUDIO_DRA) {
1972 ac97_read(as, AC97_REG_EXT_AUDIO_CTRL, &ext_stat);
1978 ac97_write(as, AC97_REG_EXT_AUDIO_CTRL, ext_stat);
1983 ac97_write(as, AC97_REG_EXT_AUDIO_CTRL, ext_stat);
1992 if (!(as->ext_id & AC97_EXT_AUDIO_VRA)) {
2001 if (!(as->ext_id & AC97_EXT_AUDIO_VRM)) {
2013 ac97_read(as, AC97_REG_POWER, &power);
2014 ac97_write(as, AC97_REG_POWER, power | power_bit);
2016 ac97_write(as, target, (uint16_t)value);
2017 ac97_read(as, target, &actual);
2018 actual = (uint32_t)actual * as->ac97_clock / AC97_STANDARD_CLOCK;
2020 ac97_write(as, AC97_REG_POWER, power);
2032 struct ac97_softc *as;
2034 as = (struct ac97_softc *)codec_if;
2036 KASSERT(mutex_owned(as->lock));
2038 as->ac97_clock = clock;
2044 struct ac97_softc *as;
2046 as = (struct ac97_softc *)codec_if;
2048 KASSERT(mutex_owned(as->lock));
2050 return as->ext_id;
2054 ac97_add_port(struct ac97_softc *as, const struct ac97_source_info *src)
2059 KASSERT(mutex_owned(as->lock));
2061 if ((as->type == AC97_CODEC_TYPE_AUDIO &&
2062 as->num_source_info >= AUDIO_MAX_SOURCES) ||
2063 (as->type == AC97_CODEC_TYPE_MODEM &&
2064 as->num_source_info >= MODEM_MAX_SOURCES)) {
2069 if (!ac97_check_capability(as, src->req_feature))
2071 ouridx = as->num_source_info;
2072 si = &as->source_info[ouridx];
2087 as->num_source_info++;
2089 si->mixer_class = ac97_get_portnum_by_name(&as->codec_if, si->class,
2092 idx = ac97_get_portnum_by_name(&as->codec_if, si->class,
2095 while (as->source_info[idx].next != AUDIO_MIXER_LAST)
2096 idx = as->source_info[idx].next;
2098 as->source_info[idx].next = ouridx;
2133 ac97_ad198x_init(struct ac97_softc *as)
2138 KASSERT(mutex_owned(as->lock));
2140 ac97_read(as, AD1980_REG_MISC, &misc);
2141 ac97_write(as, AD1980_REG_MISC,
2144 for (i = 0; i < as->num_source_info; i++) {
2145 if (as->source_info[i].type != AUDIO_MIXER_VALUE)
2148 if (as->source_info[i].reg == AC97_REG_MASTER_VOLUME)
2149 as->source_info[i].reg = AC97_REG_SURR_MASTER;
2150 else if (as->source_info[i].reg == AC97_REG_SURR_MASTER)
2151 as->source_info[i].reg = AC97_REG_MASTER_VOLUME;
2171 ac97_alc650_init(struct ac97_softc *as)
2200 ac97_add_port(as, &sources[0]);
2201 ac97_add_port(as, &sources[1]);
2202 ac97_add_port(as, &sources[2]);
2203 ac97_add_port(as, &sources[3]);
2204 ac97_add_port(as, &sources[4]);
2205 ac97_add_port(as, &sources[5]);
2236 ac97_ucb1400_init(struct ac97_softc *as)
2239 ac97_write(as, UCB1400_REG_FEATURE_CSR1,
2241 ac97_write(as, UCB1400_REG_FEATURE_CSR2, UCB1400_AVE | UCB1400_SLP_ON);
2252 ac97_vt1616_init(struct ac97_softc *as)
2269 KASSERT(mutex_owned(as->lock));
2271 ac97_add_port(as, &sources[0]);
2272 ac97_add_port(as, &sources[1]);
2273 ac97_add_port(as, &sources[2]);
2277 ac97_modem_offhook_set(struct ac97_softc *as, int line, int newval)
2281 KASSERT(mutex_owned(as->lock));
2283 val = as->shadow_reg[AC97_REG_GPIO_STATUS >> 1];
2292 ac97_write(as, AC97_REG_GPIO_STATUS, val);
2302 struct ac97_softc *as;
2305 as = rnode->sysctl_data;
2306 if (node.sysctl_num == as->offhook_line1_mib) {
2307 tmp = as->offhook_line1;
2316 as->offhook_line1 = tmp;
2317 mutex_enter(as->lock);
2318 ac97_modem_offhook_set(as, AC97_GPIO_LINE1_OH, tmp);
2319 mutex_exit(as->lock);
2320 } else if (node.sysctl_num == as->offhook_line2_mib) {
2321 tmp = as->offhook_line2;
2330 as->offhook_line2 = tmp;
2331 mutex_enter(as->lock);
2332 ac97_modem_offhook_set(as, AC97_GPIO_LINE2_OH, tmp);
2333 mutex_exit(as->lock);