xref: /kernel/linux/linux-6.6/sound/pci/ice1712/amp.c (revision 62306a36)
162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *   ALSA driver for ICEnsemble VT1724 (Envy24HT)
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci *   Lowlevel functions for Advanced Micro Peripherals Ltd AUDIO2000
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci *	Copyright (c) 2000 Jaroslav Kysela <perex@perex.cz>
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include <linux/delay.h>
1162306a36Sopenharmony_ci#include <linux/interrupt.h>
1262306a36Sopenharmony_ci#include <linux/init.h>
1362306a36Sopenharmony_ci#include <sound/core.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#include "ice1712.h"
1662306a36Sopenharmony_ci#include "envy24ht.h"
1762306a36Sopenharmony_ci#include "amp.h"
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_cistatic void wm_put(struct snd_ice1712 *ice, int reg, unsigned short val)
2062306a36Sopenharmony_ci{
2162306a36Sopenharmony_ci	unsigned short cval;
2262306a36Sopenharmony_ci	cval = (reg << 9) | val;
2362306a36Sopenharmony_ci	snd_vt1724_write_i2c(ice, WM_DEV, cval >> 8, cval & 0xff);
2462306a36Sopenharmony_ci}
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_cistatic int snd_vt1724_amp_init(struct snd_ice1712 *ice)
2762306a36Sopenharmony_ci{
2862306a36Sopenharmony_ci	static const unsigned short wm_inits[] = {
2962306a36Sopenharmony_ci		WM_ATTEN_L,	0x0000,	/* 0 db */
3062306a36Sopenharmony_ci		WM_ATTEN_R,	0x0000,	/* 0 db */
3162306a36Sopenharmony_ci		WM_DAC_CTRL,	0x0008,	/* 24bit I2S */
3262306a36Sopenharmony_ci		WM_INT_CTRL,	0x0001, /* 24bit I2S */
3362306a36Sopenharmony_ci	};
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci	unsigned int i;
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci	/* only use basic functionality for now */
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci	/* VT1616 6ch codec connected to PSDOUT0 using packed mode */
4062306a36Sopenharmony_ci	ice->num_total_dacs = 6;
4162306a36Sopenharmony_ci	ice->num_total_adcs = 2;
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci	/* Chaintech AV-710 has another WM8728 codec connected to PSDOUT4
4462306a36Sopenharmony_ci	   (shared with the SPDIF output). Mixer control for this codec
4562306a36Sopenharmony_ci	   is not yet supported. */
4662306a36Sopenharmony_ci	if (ice->eeprom.subvendor == VT1724_SUBDEVICE_AV710) {
4762306a36Sopenharmony_ci		for (i = 0; i < ARRAY_SIZE(wm_inits); i += 2)
4862306a36Sopenharmony_ci			wm_put(ice, wm_inits[i], wm_inits[i+1]);
4962306a36Sopenharmony_ci	}
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci	return 0;
5262306a36Sopenharmony_ci}
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_cistatic int snd_vt1724_amp_add_controls(struct snd_ice1712 *ice)
5562306a36Sopenharmony_ci{
5662306a36Sopenharmony_ci	if (ice->ac97)
5762306a36Sopenharmony_ci		/* we use pins 39 and 41 of the VT1616 for left and right
5862306a36Sopenharmony_ci		read outputs */
5962306a36Sopenharmony_ci		snd_ac97_write_cache(ice->ac97, 0x5a,
6062306a36Sopenharmony_ci			snd_ac97_read(ice->ac97, 0x5a) & ~0x8000);
6162306a36Sopenharmony_ci	return 0;
6262306a36Sopenharmony_ci}
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci/* entry point */
6662306a36Sopenharmony_cistruct snd_ice1712_card_info snd_vt1724_amp_cards[] = {
6762306a36Sopenharmony_ci	{
6862306a36Sopenharmony_ci		.subvendor = VT1724_SUBDEVICE_AV710,
6962306a36Sopenharmony_ci		.name = "Chaintech AV-710",
7062306a36Sopenharmony_ci		.model = "av710",
7162306a36Sopenharmony_ci		.chip_init = snd_vt1724_amp_init,
7262306a36Sopenharmony_ci		.build_controls = snd_vt1724_amp_add_controls,
7362306a36Sopenharmony_ci	},
7462306a36Sopenharmony_ci	{
7562306a36Sopenharmony_ci		.subvendor = VT1724_SUBDEVICE_AUDIO2000,
7662306a36Sopenharmony_ci		.name = "AMP Ltd AUDIO2000",
7762306a36Sopenharmony_ci		.model = "amp2000",
7862306a36Sopenharmony_ci		.chip_init = snd_vt1724_amp_init,
7962306a36Sopenharmony_ci		.build_controls = snd_vt1724_amp_add_controls,
8062306a36Sopenharmony_ci	},
8162306a36Sopenharmony_ci	{ } /* terminator */
8262306a36Sopenharmony_ci};
8362306a36Sopenharmony_ci
84