Fork us on GitHub Follow us on Facebook Follow us on Twitter

Changeset 9034876 in mainline


Ignore:
Timestamp:
2014-08-27T09:02:43Z (7 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master
Children:
cc91ab4
Parents:
dda5848
Message:

Correctly handle verbs with 16-bit payloads - now setting amps works.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/audio/hdaudio/codec.c

    rdda5848 r9034876  
    5454                resp = &myresp;
    5555
    56         verb = (codec->address << 28) | (node << 20) | (vid << 8) | payload;
     56        if ((vid & 0x700) != 0) {
     57                verb = (codec->address << 28) |
     58                    ((node & 0x1ff) << 20) |
     59                    ((vid & 0xfff) << 8) |
     60                    (payload & 0xff);
     61        } else {
     62                verb = (codec->address << 28) |
     63                    ((node & 0x1ff) << 20) |
     64                    ((vid & 0xf) << 16) |
     65                    (payload & 0xffff);
     66        }
    5767        int rc = hda_cmd(codec->hda, verb, resp);
    58 /*
     68
    5969        if (resp != NULL) {
    6070                ddf_msg(LVL_NOTE, "verb 0x%" PRIx32 " -> 0x%" PRIx32, verb,
     
    6373                ddf_msg(LVL_NOTE, "verb 0x%" PRIx32, verb);
    6474        }
    65 */
     75
    6676        return rc;
    6777}
     
    214224                goto error;
    215225
     226        offset = ampcaps & 0x7f;
     227        ddf_msg(LVL_NOTE, "out amp caps 0x%x (offset=0x%x)",
     228            ampcaps, offset);
     229
     230        rc = hda_set_amp_gain_mute(codec, aw, 0xb000 + offset/2);
     231        if (rc != EOK)
     232                goto error;
     233
    216234        rc = hda_get_amp_gain_mute(codec, aw, 0x8000, &gmleft);
    217235        if (rc != EOK)
    218236                goto error;
    219237
    220         rc = hda_get_amp_gain_mute(codec, aw, 0xc000, &gmright);
    221         if (rc != EOK)
    222                 goto error;
    223 
    224         offset = ampcaps & 0x7f;
    225         ddf_msg(LVL_NOTE, "out amp caps 0x%x (offset=0x%x)"
    226             "gain/mute: L:0x%x R:0x%x",
    227             ampcaps, offset, gmleft, gmright);
    228 
    229         rc = hda_set_amp_gain_mute(codec, aw, 0xb000 + offset);
    230         if (rc != EOK)
    231                 goto error;
     238        rc = hda_get_amp_gain_mute(codec, aw, 0xa000, &gmright);
     239        if (rc != EOK)
     240                goto error;
     241
     242        ddf_msg(LVL_NOTE, "gain/mute: L:0x%x R:0x%x", gmleft, gmright);
    232243
    233244        return EOK;
     
    253264
    254265        for (i = 0; i < 15; i++) {
     266                rc = hda_set_amp_gain_mute(codec, aw, 0x7000 + (i << 8) + offset/2);
     267                if (rc != EOK)
     268                        goto error;
     269
    255270                rc = hda_get_amp_gain_mute(codec, aw, 0x0000 + i, &gmleft);
    256271                if (rc != EOK)
    257272                        goto error;
    258273
    259                 rc = hda_get_amp_gain_mute(codec, aw, 0x4000 + i, &gmright);
     274                rc = hda_get_amp_gain_mute(codec, aw, 0x2000 + i, &gmright);
    260275                if (rc != EOK)
    261276                        goto error;
     
    263278                ddf_msg(LVL_NOTE, "in:%d gain/mute: L:0x%x R:0x%x",
    264279                    i, gmleft, gmright);
    265 
    266                 rc = hda_set_amp_gain_mute(codec, aw, 0x7000 + (i << 8) + offset);
    267                 if (rc != EOK)
    268                         goto error;
    269280        }
    270281
Note: See TracChangeset for help on using the changeset viewer.