xref: /openbmc/linux/sound/pcmcia/vx/vxp_mixer.c (revision 1da177e4)
1 /*
2  * Driver for Digigram VXpocket soundcards
3  *
4  * VX-pocket mixer
5  *
6  * Copyright (c) 2002 by Takashi Iwai <tiwai@suse.de>
7  *
8  *   This program is free software; you can redistribute it and/or modify
9  *   it under the terms of the GNU General Public License as published by
10  *   the Free Software Foundation; either version 2 of the License, or
11  *   (at your option) any later version.
12  *
13  *   This program is distributed in the hope that it will be useful,
14  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  *   GNU General Public License for more details.
17  *
18  *   You should have received a copy of the GNU General Public License
19  *   along with this program; if not, write to the Free Software
20  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
21  */
22 
23 #include <sound/driver.h>
24 #include <sound/core.h>
25 #include <sound/control.h>
26 #include "vxpocket.h"
27 
28 #define MIC_LEVEL_MIN	0
29 #define MIC_LEVEL_MAX	8
30 
31 /*
32  * mic level control (for VXPocket)
33  */
34 static int vx_mic_level_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo)
35 {
36 	uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
37 	uinfo->count = 1;
38 	uinfo->value.integer.min = 0;
39 	uinfo->value.integer.max = MIC_LEVEL_MAX;
40 	return 0;
41 }
42 
43 static int vx_mic_level_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol)
44 {
45 	vx_core_t *_chip = snd_kcontrol_chip(kcontrol);
46 	struct snd_vxpocket *chip = (struct snd_vxpocket *)_chip;
47 	ucontrol->value.integer.value[0] = chip->mic_level;
48 	return 0;
49 }
50 
51 static int vx_mic_level_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol)
52 {
53 	vx_core_t *_chip = snd_kcontrol_chip(kcontrol);
54 	struct snd_vxpocket *chip = (struct snd_vxpocket *)_chip;
55 	down(&_chip->mixer_mutex);
56 	if (chip->mic_level != ucontrol->value.integer.value[0]) {
57 		vx_set_mic_level(_chip, ucontrol->value.integer.value[0]);
58 		chip->mic_level = ucontrol->value.integer.value[0];
59 		up(&_chip->mixer_mutex);
60 		return 1;
61 	}
62 	up(&_chip->mixer_mutex);
63 	return 0;
64 }
65 
66 static snd_kcontrol_new_t vx_control_mic_level = {
67 	.iface =	SNDRV_CTL_ELEM_IFACE_MIXER,
68 	.name =		"Mic Capture Volume",
69 	.info =		vx_mic_level_info,
70 	.get =		vx_mic_level_get,
71 	.put =		vx_mic_level_put,
72 };
73 
74 /*
75  * mic boost level control (for VXP440)
76  */
77 static int vx_mic_boost_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *uinfo)
78 {
79 	uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
80 	uinfo->count = 1;
81 	uinfo->value.integer.min = 0;
82 	uinfo->value.integer.max = 1;
83 	return 0;
84 }
85 
86 static int vx_mic_boost_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol)
87 {
88 	vx_core_t *_chip = snd_kcontrol_chip(kcontrol);
89 	struct snd_vxpocket *chip = (struct snd_vxpocket *)_chip;
90 	ucontrol->value.integer.value[0] = chip->mic_level;
91 	return 0;
92 }
93 
94 static int vx_mic_boost_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *ucontrol)
95 {
96 	vx_core_t *_chip = snd_kcontrol_chip(kcontrol);
97 	struct snd_vxpocket *chip = (struct snd_vxpocket *)_chip;
98 	down(&_chip->mixer_mutex);
99 	if (chip->mic_level != ucontrol->value.integer.value[0]) {
100 		vx_set_mic_boost(_chip, ucontrol->value.integer.value[0]);
101 		chip->mic_level = ucontrol->value.integer.value[0];
102 		up(&_chip->mixer_mutex);
103 		return 1;
104 	}
105 	up(&_chip->mixer_mutex);
106 	return 0;
107 }
108 
109 static snd_kcontrol_new_t vx_control_mic_boost = {
110 	.iface =	SNDRV_CTL_ELEM_IFACE_MIXER,
111 	.name =		"Mic Boost",
112 	.info =		vx_mic_boost_info,
113 	.get =		vx_mic_boost_get,
114 	.put =		vx_mic_boost_put,
115 };
116 
117 
118 int vxp_add_mic_controls(vx_core_t *_chip)
119 {
120 	struct snd_vxpocket *chip = (struct snd_vxpocket *)_chip;
121 	int err;
122 
123 	/* mute input levels */
124 	chip->mic_level = 0;
125 	switch (_chip->type) {
126 	case VX_TYPE_VXPOCKET:
127 		vx_set_mic_level(_chip, 0);
128 		break;
129 	case VX_TYPE_VXP440:
130 		vx_set_mic_boost(_chip, 0);
131 		break;
132 	}
133 
134 	/* mic level */
135 	switch (_chip->type) {
136 	case VX_TYPE_VXPOCKET:
137 		if ((err = snd_ctl_add(_chip->card, snd_ctl_new1(&vx_control_mic_level, chip))) < 0)
138 			return err;
139 		break;
140 	case VX_TYPE_VXP440:
141 		if ((err = snd_ctl_add(_chip->card, snd_ctl_new1(&vx_control_mic_boost, chip))) < 0)
142 			return err;
143 		break;
144 	}
145 
146 	return 0;
147 }
148 
149