162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Vortex Mixer support.
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * There is much more than just the AC97 mixer...
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/time.h>
1062306a36Sopenharmony_ci#include <linux/init.h>
1162306a36Sopenharmony_ci#include <sound/core.h>
1262306a36Sopenharmony_ci#include "au88x0.h"
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_cistatic int remove_ctl(struct snd_card *card, const char *name)
1562306a36Sopenharmony_ci{
1662306a36Sopenharmony_ci	struct snd_ctl_elem_id id;
1762306a36Sopenharmony_ci	memset(&id, 0, sizeof(id));
1862306a36Sopenharmony_ci	strcpy(id.name, name);
1962306a36Sopenharmony_ci	id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
2062306a36Sopenharmony_ci	return snd_ctl_remove_id(card, &id);
2162306a36Sopenharmony_ci}
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_cistatic int snd_vortex_mixer(vortex_t *vortex)
2462306a36Sopenharmony_ci{
2562306a36Sopenharmony_ci	struct snd_ac97_bus *pbus;
2662306a36Sopenharmony_ci	struct snd_ac97_template ac97;
2762306a36Sopenharmony_ci	int err;
2862306a36Sopenharmony_ci	static const struct snd_ac97_bus_ops ops = {
2962306a36Sopenharmony_ci		.write = vortex_codec_write,
3062306a36Sopenharmony_ci		.read = vortex_codec_read,
3162306a36Sopenharmony_ci	};
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci	err = snd_ac97_bus(vortex->card, 0, &ops, NULL, &pbus);
3462306a36Sopenharmony_ci	if (err < 0)
3562306a36Sopenharmony_ci		return err;
3662306a36Sopenharmony_ci	memset(&ac97, 0, sizeof(ac97));
3762306a36Sopenharmony_ci	// Initialize AC97 codec stuff.
3862306a36Sopenharmony_ci	ac97.private_data = vortex;
3962306a36Sopenharmony_ci	ac97.scaps = AC97_SCAP_NO_SPDIF;
4062306a36Sopenharmony_ci	err = snd_ac97_mixer(pbus, &ac97, &vortex->codec);
4162306a36Sopenharmony_ci	vortex->isquad = ((vortex->codec == NULL) ?  0 : (vortex->codec->ext_id&0x80));
4262306a36Sopenharmony_ci	remove_ctl(vortex->card, "Master Mono Playback Volume");
4362306a36Sopenharmony_ci	remove_ctl(vortex->card, "Master Mono Playback Switch");
4462306a36Sopenharmony_ci	return err;
4562306a36Sopenharmony_ci}
46