sound/soc/codecs/wm8991.c

Source file repositories/reference/linux-study-clean/sound/soc/codecs/wm8991.c

File Facts

System
Linux kernel
Corpus path
sound/soc/codecs/wm8991.c
Extension
.c
Size
43430 bytes
Lines
1336
Domain
Driver Families
Bucket
sound/soc
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

struct wm8991_priv {
	struct regmap *regmap;
	unsigned int pcmclk;
};

static const struct reg_default wm8991_reg_defaults[] = {
	{  1, 0x0000 },     /* R1  - Power Management (1) */
	{  2, 0x6000 },     /* R2  - Power Management (2) */
	{  3, 0x0000 },     /* R3  - Power Management (3) */
	{  4, 0x4050 },     /* R4  - Audio Interface (1) */
	{  5, 0x4000 },     /* R5  - Audio Interface (2) */
	{  6, 0x01C8 },     /* R6  - Clocking (1) */
	{  7, 0x0000 },     /* R7  - Clocking (2) */
	{  8, 0x0040 },     /* R8  - Audio Interface (3) */
	{  9, 0x0040 },     /* R9  - Audio Interface (4) */
	{ 10, 0x0004 },     /* R10 - DAC CTRL */
	{ 11, 0x00C0 },     /* R11 - Left DAC Digital Volume */
	{ 12, 0x00C0 },     /* R12 - Right DAC Digital Volume */
	{ 13, 0x0000 },     /* R13 - Digital Side Tone */
	{ 14, 0x0100 },     /* R14 - ADC CTRL */
	{ 15, 0x00C0 },     /* R15 - Left ADC Digital Volume */
	{ 16, 0x00C0 },     /* R16 - Right ADC Digital Volume */

	{ 18, 0x0000 },     /* R18 - GPIO CTRL 1 */
	{ 19, 0x1000 },     /* R19 - GPIO1 & GPIO2 */
	{ 20, 0x1010 },     /* R20 - GPIO3 & GPIO4 */
	{ 21, 0x1010 },     /* R21 - GPIO5 & GPIO6 */
	{ 22, 0x8000 },     /* R22 - GPIOCTRL 2 */
	{ 23, 0x0800 },     /* R23 - GPIO_POL */
	{ 24, 0x008B },     /* R24 - Left Line Input 1&2 Volume */
	{ 25, 0x008B },     /* R25 - Left Line Input 3&4 Volume */
	{ 26, 0x008B },     /* R26 - Right Line Input 1&2 Volume */
	{ 27, 0x008B },     /* R27 - Right Line Input 3&4 Volume */
	{ 28, 0x0000 },     /* R28 - Left Output Volume */
	{ 29, 0x0000 },     /* R29 - Right Output Volume */
	{ 30, 0x0066 },     /* R30 - Line Outputs Volume */
	{ 31, 0x0022 },     /* R31 - Out3/4 Volume */
	{ 32, 0x0079 },     /* R32 - Left OPGA Volume */
	{ 33, 0x0079 },     /* R33 - Right OPGA Volume */
	{ 34, 0x0003 },     /* R34 - Speaker Volume */
	{ 35, 0x0003 },     /* R35 - ClassD1 */

	{ 37, 0x0100 },     /* R37 - ClassD3 */

	{ 39, 0x0000 },     /* R39 - Input Mixer1 */
	{ 40, 0x0000 },     /* R40 - Input Mixer2 */
	{ 41, 0x0000 },     /* R41 - Input Mixer3 */
	{ 42, 0x0000 },     /* R42 - Input Mixer4 */
	{ 43, 0x0000 },     /* R43 - Input Mixer5 */
	{ 44, 0x0000 },     /* R44 - Input Mixer6 */
	{ 45, 0x0000 },     /* R45 - Output Mixer1 */
	{ 46, 0x0000 },     /* R46 - Output Mixer2 */
	{ 47, 0x0000 },     /* R47 - Output Mixer3 */
	{ 48, 0x0000 },     /* R48 - Output Mixer4 */
	{ 49, 0x0000 },     /* R49 - Output Mixer5 */
	{ 50, 0x0000 },     /* R50 - Output Mixer6 */
	{ 51, 0x0180 },     /* R51 - Out3/4 Mixer */
	{ 52, 0x0000 },     /* R52 - Line Mixer1 */
	{ 53, 0x0000 },     /* R53 - Line Mixer2 */
	{ 54, 0x0000 },     /* R54 - Speaker Mixer */
	{ 55, 0x0000 },     /* R55 - Additional Control */
	{ 56, 0x0000 },     /* R56 - AntiPOP1 */
	{ 57, 0x0000 },     /* R57 - AntiPOP2 */
	{ 58, 0x0000 },     /* R58 - MICBIAS */

	{ 60, 0x0008 },     /* R60 - PLL1 */
	{ 61, 0x0031 },     /* R61 - PLL2 */
	{ 62, 0x0026 },     /* R62 - PLL3 */
};

static bool wm8991_volatile(struct device *dev, unsigned int reg)
{
	switch (reg) {
	case WM8991_RESET:
		return true;
	default:
		return false;
	}
}

static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(in_pga_tlv, -1650, 150, 0);
static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(out_mix_tlv, -2100, 300, 0);
static const SNDRV_CTL_TLVD_DECLARE_DB_RANGE(out_pga_tlv,
	0x00, 0x2f, SNDRV_CTL_TLVD_DB_SCALE_ITEM(SNDRV_CTL_TLVD_DB_GAIN_MUTE, 0, 1),
	0x30, 0x7f, SNDRV_CTL_TLVD_DB_SCALE_ITEM(-7300, 100, 0),
);
static const SNDRV_CTL_TLVD_DECLARE_DB_RANGE(out_dac_tlv,
	0x00, 0xbf, SNDRV_CTL_TLVD_DB_SCALE_ITEM(-71625, 375, 1),
	0xc0, 0xff, SNDRV_CTL_TLVD_DB_SCALE_ITEM(0, 0, 0),
);

Annotation

Implementation Notes