summaryrefslogtreecommitdiff
path: root/bsp/qemu-vexpress-a9/drivers/audio/drv_ac97.c
blob: 3641f7f07954e1497bb5136e9b052898a17ae2e4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/*
 * Copyright (c) 2006-2021, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2018-05-25     RT-Thread    the first version
 */

#include <rtthread.h>
#include <rthw.h>
#include "drv_pl041.h"
#include "drv_ac97.h"

void ac97_reset(void)
{
    aaci_ac97_write(AC97_RESET, 0xFFFF);
}

rt_err_t ac97_set_vol(int vol)
{
    rt_uint16_t tmp = vol | (vol << 8);

    if (vol < 0 || vol > 0x3f)
    {
        return -RT_ERROR;
    }

    aaci_ac97_write(AC97_MASTER, tmp);
    aaci_ac97_write(AC97_HEADPHONE, tmp);
    aaci_ac97_write(AC97_MASTER_MONO, tmp);
    aaci_ac97_write(AC97_PCM, tmp);

    return RT_EOK;
}

int ac97_get_vol(void)
{
    rt_uint16_t v;

    v = aaci_ac97_read(AC97_MASTER);
    if (v == (~0x0))
    {
        v = 0;
    }
    return 0x3F & v;
}

rt_err_t ac97_set_rate(int rate)
{
    if (rate < 0)
    {
        return -RT_ERROR;
    }
    aaci_ac97_write(AC97_PCM_FRONT_DAC_RATE, rate);
    return 0;
}

int ac97_get_rate(void)
{
    rt_uint16_t v;

    v = aaci_ac97_read(AC97_PCM_FRONT_DAC_RATE);
    if (v == (~0x0))
    {
        v = 0;
    }
    return v;
}

#if 0
#define AC97_DUMP(_v)    rt_kprintf("%32s:addr:0x%08x data:0x%08x\n", #_v, (_v), (aaci_ac97_read(_v)))
int _ac97_reg_dump(int argc, char **argv)
{
    AC97_DUMP(AC97_RESET);
    AC97_DUMP(AC97_MASTER);
    AC97_DUMP(AC97_HEADPHONE);
    AC97_DUMP(AC97_MASTER_MONO);
    AC97_DUMP(AC97_MASTER_TONE);
    AC97_DUMP(AC97_PC_BEEP);
    AC97_DUMP(AC97_PHONE);
    AC97_DUMP(AC97_MIC);
    AC97_DUMP(AC97_LINE);
    AC97_DUMP(AC97_CD);
    AC97_DUMP(AC97_VIDEO);
    AC97_DUMP(AC97_AUX);
    AC97_DUMP(AC97_PCM);
    AC97_DUMP(AC97_REC_SEL);
    AC97_DUMP(AC97_REC_GAIN);
    AC97_DUMP(AC97_REC_GAIN_MIC);
    AC97_DUMP(AC97_GENERAL_PURPOSE);
    AC97_DUMP(AC97_3D_CONTROL);
    AC97_DUMP(AC97_INT_PAGING);
    AC97_DUMP(AC97_POWERDOWN);
    AC97_DUMP(AC97_PCM_FRONT_DAC_RATE);
    AC97_DUMP(AC97_PCM_SURR_DAC_RATE);
    AC97_DUMP(AC97_PCM_LFE_DAC_RATE);
    AC97_DUMP(AC97_PCM_LR_ADC_RATE);
    AC97_DUMP(AC97_PCM_MIC_ADC_RATE);
    AC97_DUMP(AC97_DAC_SLOT_MAP);
    AC97_DUMP(AC97_ADC_SLOT_MAP);
    return 0;
}
MSH_CMD_EXPORT_ALIAS(_ac97_reg_dump, ac97_dump, ac97 dump reg);

#endif