2 * Driver for Digigram VXpocket soundcards
6 * Copyright (c) 2002 by Takashi Iwai <tiwai@suse.de>
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.
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.
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
23 #include <sound/driver.h>
24 #include <sound/core.h>
25 #include <sound/control.h>
26 #include <sound/tlv.h>
29 #define MIC_LEVEL_MIN 0
30 #define MIC_LEVEL_MAX 8
33 * mic level control (for VXPocket)
35 static int vx_mic_level_info(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_info
*uinfo
)
37 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_INTEGER
;
39 uinfo
->value
.integer
.min
= 0;
40 uinfo
->value
.integer
.max
= MIC_LEVEL_MAX
;
44 static int vx_mic_level_get(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
46 struct vx_core
*_chip
= snd_kcontrol_chip(kcontrol
);
47 struct snd_vxpocket
*chip
= (struct snd_vxpocket
*)_chip
;
48 ucontrol
->value
.integer
.value
[0] = chip
->mic_level
;
52 static int vx_mic_level_put(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
54 struct vx_core
*_chip
= snd_kcontrol_chip(kcontrol
);
55 struct snd_vxpocket
*chip
= (struct snd_vxpocket
*)_chip
;
56 mutex_lock(&_chip
->mixer_mutex
);
57 if (chip
->mic_level
!= ucontrol
->value
.integer
.value
[0]) {
58 vx_set_mic_level(_chip
, ucontrol
->value
.integer
.value
[0]);
59 chip
->mic_level
= ucontrol
->value
.integer
.value
[0];
60 mutex_unlock(&_chip
->mixer_mutex
);
63 mutex_unlock(&_chip
->mixer_mutex
);
67 static const DECLARE_TLV_DB_SCALE(db_scale_mic
, -21, 3, 0);
69 static struct snd_kcontrol_new vx_control_mic_level
= {
70 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
71 .access
= (SNDRV_CTL_ELEM_ACCESS_READWRITE
|
72 SNDRV_CTL_ELEM_ACCESS_TLV_READ
),
73 .name
= "Mic Capture Volume",
74 .info
= vx_mic_level_info
,
75 .get
= vx_mic_level_get
,
76 .put
= vx_mic_level_put
,
77 .tlv
= { .p
= db_scale_mic
},
81 * mic boost level control (for VXP440)
83 static int vx_mic_boost_info(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_info
*uinfo
)
85 uinfo
->type
= SNDRV_CTL_ELEM_TYPE_BOOLEAN
;
87 uinfo
->value
.integer
.min
= 0;
88 uinfo
->value
.integer
.max
= 1;
92 static int vx_mic_boost_get(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
94 struct vx_core
*_chip
= snd_kcontrol_chip(kcontrol
);
95 struct snd_vxpocket
*chip
= (struct snd_vxpocket
*)_chip
;
96 ucontrol
->value
.integer
.value
[0] = chip
->mic_level
;
100 static int vx_mic_boost_put(struct snd_kcontrol
*kcontrol
, struct snd_ctl_elem_value
*ucontrol
)
102 struct vx_core
*_chip
= snd_kcontrol_chip(kcontrol
);
103 struct snd_vxpocket
*chip
= (struct snd_vxpocket
*)_chip
;
104 mutex_lock(&_chip
->mixer_mutex
);
105 if (chip
->mic_level
!= ucontrol
->value
.integer
.value
[0]) {
106 vx_set_mic_boost(_chip
, ucontrol
->value
.integer
.value
[0]);
107 chip
->mic_level
= ucontrol
->value
.integer
.value
[0];
108 mutex_unlock(&_chip
->mixer_mutex
);
111 mutex_unlock(&_chip
->mixer_mutex
);
115 static struct snd_kcontrol_new vx_control_mic_boost
= {
116 .iface
= SNDRV_CTL_ELEM_IFACE_MIXER
,
118 .info
= vx_mic_boost_info
,
119 .get
= vx_mic_boost_get
,
120 .put
= vx_mic_boost_put
,
124 int vxp_add_mic_controls(struct vx_core
*_chip
)
126 struct snd_vxpocket
*chip
= (struct snd_vxpocket
*)_chip
;
129 /* mute input levels */
131 switch (_chip
->type
) {
132 case VX_TYPE_VXPOCKET
:
133 vx_set_mic_level(_chip
, 0);
136 vx_set_mic_boost(_chip
, 0);
141 switch (_chip
->type
) {
142 case VX_TYPE_VXPOCKET
:
143 if ((err
= snd_ctl_add(_chip
->card
, snd_ctl_new1(&vx_control_mic_level
, chip
))) < 0)
147 if ((err
= snd_ctl_add(_chip
->card
, snd_ctl_new1(&vx_control_mic_boost
, chip
))) < 0)