Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
ab05e290
Commit
ab05e290
authored
Jan 05, 2009
by
Takashi Iwai
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'topic/asoc' into for-linus
parents
fe0bdec6
ac11a2b3
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
227 additions
and
217 deletions
+227
-217
sound/soc/codecs/twl4030.c
sound/soc/codecs/twl4030.c
+189
-188
sound/soc/codecs/twl4030.h
sound/soc/codecs/twl4030.h
+7
-0
sound/soc/pxa/pxa2xx-pcm.c
sound/soc/pxa/pxa2xx-pcm.c
+2
-2
sound/soc/soc-core.c
sound/soc/soc-core.c
+24
-22
sound/soc/soc-dapm.c
sound/soc/soc-dapm.c
+5
-5
No files found.
sound/soc/codecs/twl4030.c
View file @
ab05e290
...
...
@@ -298,30 +298,107 @@ static const struct soc_enum twl4030_handsfreer_enum =
static
const
struct
snd_kcontrol_new
twl4030_dapm_handsfreer_control
=
SOC_DAPM_ENUM
(
"Route"
,
twl4030_handsfreer_enum
);
static
int
outmixer_event
(
struct
snd_soc_dapm_widget
*
w
,
/* Left analog microphone selection */
static
const
char
*
twl4030_analoglmic_texts
[]
=
{
"Off"
,
"Main mic"
,
"Headset mic"
,
"Invalid"
,
"AUXL"
,
"Invalid"
,
"Invalid"
,
"Invalid"
,
"Carkit mic"
};
static
const
struct
soc_enum
twl4030_analoglmic_enum
=
SOC_ENUM_SINGLE
(
TWL4030_REG_ANAMICL
,
0
,
ARRAY_SIZE
(
twl4030_analoglmic_texts
),
twl4030_analoglmic_texts
);
static
const
struct
snd_kcontrol_new
twl4030_dapm_analoglmic_control
=
SOC_DAPM_ENUM
(
"Route"
,
twl4030_analoglmic_enum
);
/* Right analog microphone selection */
static
const
char
*
twl4030_analogrmic_texts
[]
=
{
"Off"
,
"Sub mic"
,
"Invalid"
,
"Invalid"
,
"AUXR"
};
static
const
struct
soc_enum
twl4030_analogrmic_enum
=
SOC_ENUM_SINGLE
(
TWL4030_REG_ANAMICR
,
0
,
ARRAY_SIZE
(
twl4030_analogrmic_texts
),
twl4030_analogrmic_texts
);
static
const
struct
snd_kcontrol_new
twl4030_dapm_analogrmic_control
=
SOC_DAPM_ENUM
(
"Route"
,
twl4030_analogrmic_enum
);
/* TX1 L/R Analog/Digital microphone selection */
static
const
char
*
twl4030_micpathtx1_texts
[]
=
{
"Analog"
,
"Digimic0"
};
static
const
struct
soc_enum
twl4030_micpathtx1_enum
=
SOC_ENUM_SINGLE
(
TWL4030_REG_ADCMICSEL
,
0
,
ARRAY_SIZE
(
twl4030_micpathtx1_texts
),
twl4030_micpathtx1_texts
);
static
const
struct
snd_kcontrol_new
twl4030_dapm_micpathtx1_control
=
SOC_DAPM_ENUM
(
"Route"
,
twl4030_micpathtx1_enum
);
/* TX2 L/R Analog/Digital microphone selection */
static
const
char
*
twl4030_micpathtx2_texts
[]
=
{
"Analog"
,
"Digimic1"
};
static
const
struct
soc_enum
twl4030_micpathtx2_enum
=
SOC_ENUM_SINGLE
(
TWL4030_REG_ADCMICSEL
,
2
,
ARRAY_SIZE
(
twl4030_micpathtx2_texts
),
twl4030_micpathtx2_texts
);
static
const
struct
snd_kcontrol_new
twl4030_dapm_micpathtx2_control
=
SOC_DAPM_ENUM
(
"Route"
,
twl4030_micpathtx2_enum
);
/*
* This function filters out the non valid mux settings, named as "Invalid"
* in the enum texts.
* Just refuse to set an invalid mux mode.
*/
static
int
twl4030_enum_event
(
struct
snd_soc_dapm_widget
*
w
,
struct
snd_kcontrol
*
kcontrol
,
int
event
)
{
struct
soc_enum
*
e
=
(
struct
soc_enum
*
)
kcontrol
->
private_value
;
int
ret
=
0
;
int
val
;
switch
(
e
->
reg
)
{
case
TWL4030_REG_PREDL_CTL
:
case
TWL4030_REG_PREDR_CTL
:
case
TWL4030_REG_EAR_CTL
:
val
=
w
->
value
>>
e
->
shift_l
;
if
(
val
==
3
)
{
printk
(
KERN_WARNING
"Invalid MUX setting for register 0x%02x (%d)
\n
"
,
e
->
reg
,
val
);
ret
=
-
1
;
}
break
;
val
=
w
->
value
>>
e
->
shift_l
;
if
(
!
strcmp
(
"Invalid"
,
e
->
texts
[
val
]))
{
printk
(
KERN_WARNING
"Invalid MUX setting on 0x%02x (%d)
\n
"
,
e
->
reg
,
val
);
ret
=
-
1
;
}
return
ret
;
}
static
int
micpath_event
(
struct
snd_soc_dapm_widget
*
w
,
struct
snd_kcontrol
*
kcontrol
,
int
event
)
{
struct
soc_enum
*
e
=
(
struct
soc_enum
*
)
w
->
kcontrols
->
private_value
;
unsigned
char
adcmicsel
,
micbias_ctl
;
adcmicsel
=
twl4030_read_reg_cache
(
w
->
codec
,
TWL4030_REG_ADCMICSEL
);
micbias_ctl
=
twl4030_read_reg_cache
(
w
->
codec
,
TWL4030_REG_MICBIAS_CTL
);
/* Prepare the bits for the given TX path:
* shift_l == 0: TX1 microphone path
* shift_l == 2: TX2 microphone path */
if
(
e
->
shift_l
)
{
/* TX2 microphone path */
if
(
adcmicsel
&
TWL4030_TX2IN_SEL
)
micbias_ctl
|=
TWL4030_MICBIAS2_CTL
;
/* digimic */
else
micbias_ctl
&=
~
TWL4030_MICBIAS2_CTL
;
}
else
{
/* TX1 microphone path */
if
(
adcmicsel
&
TWL4030_TX1IN_SEL
)
micbias_ctl
|=
TWL4030_MICBIAS1_CTL
;
/* digimic */
else
micbias_ctl
&=
~
TWL4030_MICBIAS1_CTL
;
}
twl4030_write
(
w
->
codec
,
TWL4030_REG_MICBIAS_CTL
,
micbias_ctl
);
return
0
;
}
static
int
handsfree_event
(
struct
snd_soc_dapm_widget
*
w
,
struct
snd_kcontrol
*
kcontrol
,
int
event
)
{
...
...
@@ -503,162 +580,6 @@ static int snd_soc_put_volsw_r2_twl4030(struct snd_kcontrol *kcontrol,
return
err
;
}
static
int
twl4030_get_left_input
(
struct
snd_kcontrol
*
kcontrol
,
struct
snd_ctl_elem_value
*
ucontrol
)
{
struct
snd_soc_codec
*
codec
=
kcontrol
->
private_data
;
u8
reg
=
twl4030_read_reg_cache
(
codec
,
TWL4030_REG_ANAMICL
);
int
result
=
0
;
/* one bit must be set a time */
reg
&=
TWL4030_CKMIC_EN
|
TWL4030_AUXL_EN
|
TWL4030_HSMIC_EN
|
TWL4030_MAINMIC_EN
;
if
(
reg
!=
0
)
{
result
++
;
while
((
reg
&
1
)
==
0
)
{
result
++
;
reg
>>=
1
;
}
}
ucontrol
->
value
.
integer
.
value
[
0
]
=
result
;
return
0
;
}
static
int
twl4030_put_left_input
(
struct
snd_kcontrol
*
kcontrol
,
struct
snd_ctl_elem_value
*
ucontrol
)
{
struct
snd_soc_codec
*
codec
=
kcontrol
->
private_data
;
int
value
=
ucontrol
->
value
.
integer
.
value
[
0
];
u8
anamicl
,
micbias
,
avadc_ctl
;
anamicl
=
twl4030_read_reg_cache
(
codec
,
TWL4030_REG_ANAMICL
);
anamicl
&=
~
(
TWL4030_CKMIC_EN
|
TWL4030_AUXL_EN
|
TWL4030_HSMIC_EN
|
TWL4030_MAINMIC_EN
);
micbias
=
twl4030_read_reg_cache
(
codec
,
TWL4030_REG_MICBIAS_CTL
);
micbias
&=
~
(
TWL4030_HSMICBIAS_EN
|
TWL4030_MICBIAS1_EN
);
avadc_ctl
=
twl4030_read_reg_cache
(
codec
,
TWL4030_REG_AVADC_CTL
);
switch
(
value
)
{
case
1
:
anamicl
|=
TWL4030_MAINMIC_EN
;
micbias
|=
TWL4030_MICBIAS1_EN
;
break
;
case
2
:
anamicl
|=
TWL4030_HSMIC_EN
;
micbias
|=
TWL4030_HSMICBIAS_EN
;
break
;
case
3
:
anamicl
|=
TWL4030_AUXL_EN
;
break
;
case
4
:
anamicl
|=
TWL4030_CKMIC_EN
;
break
;
default:
break
;
}
/* If some input is selected, enable amp and ADC */
if
(
value
!=
0
)
{
anamicl
|=
TWL4030_MICAMPL_EN
;
avadc_ctl
|=
TWL4030_ADCL_EN
;
}
else
{
anamicl
&=
~
TWL4030_MICAMPL_EN
;
avadc_ctl
&=
~
TWL4030_ADCL_EN
;
}
twl4030_write
(
codec
,
TWL4030_REG_ANAMICL
,
anamicl
);
twl4030_write
(
codec
,
TWL4030_REG_MICBIAS_CTL
,
micbias
);
twl4030_write
(
codec
,
TWL4030_REG_AVADC_CTL
,
avadc_ctl
);
return
1
;
}
static
int
twl4030_get_right_input
(
struct
snd_kcontrol
*
kcontrol
,
struct
snd_ctl_elem_value
*
ucontrol
)
{
struct
snd_soc_codec
*
codec
=
kcontrol
->
private_data
;
u8
reg
=
twl4030_read_reg_cache
(
codec
,
TWL4030_REG_ANAMICR
);
int
value
=
0
;
reg
&=
TWL4030_SUBMIC_EN
|
TWL4030_AUXR_EN
;
switch
(
reg
)
{
case
TWL4030_SUBMIC_EN
:
value
=
1
;
break
;
case
TWL4030_AUXR_EN
:
value
=
2
;
break
;
default:
break
;
}
ucontrol
->
value
.
integer
.
value
[
0
]
=
value
;
return
0
;
}
static
int
twl4030_put_right_input
(
struct
snd_kcontrol
*
kcontrol
,
struct
snd_ctl_elem_value
*
ucontrol
)
{
struct
snd_soc_codec
*
codec
=
kcontrol
->
private_data
;
int
value
=
ucontrol
->
value
.
integer
.
value
[
0
];
u8
anamicr
,
micbias
,
avadc_ctl
;
anamicr
=
twl4030_read_reg_cache
(
codec
,
TWL4030_REG_ANAMICR
);
anamicr
&=
~
(
TWL4030_SUBMIC_EN
|
TWL4030_AUXR_EN
);
micbias
=
twl4030_read_reg_cache
(
codec
,
TWL4030_REG_MICBIAS_CTL
);
micbias
&=
~
TWL4030_MICBIAS2_EN
;
avadc_ctl
=
twl4030_read_reg_cache
(
codec
,
TWL4030_REG_AVADC_CTL
);
switch
(
value
)
{
case
1
:
anamicr
|=
TWL4030_SUBMIC_EN
;
micbias
|=
TWL4030_MICBIAS2_EN
;
break
;
case
2
:
anamicr
|=
TWL4030_AUXR_EN
;
break
;
default:
break
;
}
if
(
value
!=
0
)
{
anamicr
|=
TWL4030_MICAMPR_EN
;
avadc_ctl
|=
TWL4030_ADCR_EN
;
}
else
{
anamicr
&=
~
TWL4030_MICAMPR_EN
;
avadc_ctl
&=
~
TWL4030_ADCR_EN
;
}
twl4030_write
(
codec
,
TWL4030_REG_ANAMICR
,
anamicr
);
twl4030_write
(
codec
,
TWL4030_REG_MICBIAS_CTL
,
micbias
);
twl4030_write
(
codec
,
TWL4030_REG_AVADC_CTL
,
avadc_ctl
);
return
1
;
}
static
const
char
*
twl4030_left_in_sel
[]
=
{
"None"
,
"Main Mic"
,
"Headset Mic"
,
"Line In"
,
"Carkit Mic"
,
};
static
const
char
*
twl4030_right_in_sel
[]
=
{
"None"
,
"Sub Mic"
,
"Line In"
,
};
static
const
struct
soc_enum
twl4030_left_input_mux
=
SOC_ENUM_SINGLE_EXT
(
ARRAY_SIZE
(
twl4030_left_in_sel
),
twl4030_left_in_sel
);
static
const
struct
soc_enum
twl4030_right_input_mux
=
SOC_ENUM_SINGLE_EXT
(
ARRAY_SIZE
(
twl4030_right_in_sel
),
twl4030_right_in_sel
);
/*
* FGAIN volume control:
* from -62 to 0 dB in 1 dB steps (mute instead of -63 dB)
...
...
@@ -741,18 +662,15 @@ static const struct snd_kcontrol_new twl4030_snd_controls[] = {
TWL4030_REG_EAR_CTL
,
4
,
3
,
0
,
output_tvl
),
/* Common capture gain controls */
SOC_DOUBLE_R_TLV
(
"Capture Volume"
,
SOC_DOUBLE_R_TLV
(
"
TX1 Digital
Capture Volume"
,
TWL4030_REG_ATXL1PGA
,
TWL4030_REG_ATXR1PGA
,
0
,
0x1f
,
0
,
digital_capture_tlv
),
SOC_DOUBLE_R_TLV
(
"TX2 Digital Capture Volume"
,
TWL4030_REG_AVTXL2PGA
,
TWL4030_REG_AVTXR2PGA
,
0
,
0x1f
,
0
,
digital_capture_tlv
),
SOC_DOUBLE_TLV
(
"
Input Boost
Volume"
,
TWL4030_REG_ANAMIC_GAIN
,
SOC_DOUBLE_TLV
(
"
Analog Capture
Volume"
,
TWL4030_REG_ANAMIC_GAIN
,
0
,
3
,
5
,
0
,
input_gain_tlv
),
/* Input source controls */
SOC_ENUM_EXT
(
"Left Input Source"
,
twl4030_left_input_mux
,
twl4030_get_left_input
,
twl4030_put_left_input
),
SOC_ENUM_EXT
(
"Right Input Source"
,
twl4030_right_input_mux
,
twl4030_get_right_input
,
twl4030_put_right_input
),
};
/* add non dapm controls */
...
...
@@ -772,9 +690,19 @@ static int twl4030_add_controls(struct snd_soc_codec *codec)
}
static
const
struct
snd_soc_dapm_widget
twl4030_dapm_widgets
[]
=
{
SND_SOC_DAPM_INPUT
(
"INL"
),
SND_SOC_DAPM_INPUT
(
"INR"
),
/* Left channel inputs */
SND_SOC_DAPM_INPUT
(
"MAINMIC"
),
SND_SOC_DAPM_INPUT
(
"HSMIC"
),
SND_SOC_DAPM_INPUT
(
"AUXL"
),
SND_SOC_DAPM_INPUT
(
"CARKITMIC"
),
/* Right channel inputs */
SND_SOC_DAPM_INPUT
(
"SUBMIC"
),
SND_SOC_DAPM_INPUT
(
"AUXR"
),
/* Digital microphones (Stereo) */
SND_SOC_DAPM_INPUT
(
"DIGIMIC0"
),
SND_SOC_DAPM_INPUT
(
"DIGIMIC1"
),
/* Outputs */
SND_SOC_DAPM_OUTPUT
(
"OUTL"
),
SND_SOC_DAPM_OUTPUT
(
"OUTR"
),
SND_SOC_DAPM_OUTPUT
(
"EARPIECE"
),
...
...
@@ -810,14 +738,14 @@ static const struct snd_soc_dapm_widget twl4030_dapm_widgets[] = {
/* Output MUX controls */
/* Earpiece */
SND_SOC_DAPM_MUX_E
(
"Earpiece Mux"
,
SND_SOC_NOPM
,
0
,
0
,
&
twl4030_dapm_earpiece_control
,
outmixer
_event
,
&
twl4030_dapm_earpiece_control
,
twl4030_enum
_event
,
SND_SOC_DAPM_PRE_REG
),
/* PreDrivL/R */
SND_SOC_DAPM_MUX_E
(
"PredriveL Mux"
,
SND_SOC_NOPM
,
0
,
0
,
&
twl4030_dapm_predrivel_control
,
outmixer
_event
,
&
twl4030_dapm_predrivel_control
,
twl4030_enum
_event
,
SND_SOC_DAPM_PRE_REG
),
SND_SOC_DAPM_MUX_E
(
"PredriveR Mux"
,
SND_SOC_NOPM
,
0
,
0
,
&
twl4030_dapm_predriver_control
,
outmixer
_event
,
&
twl4030_dapm_predriver_control
,
twl4030_enum
_event
,
SND_SOC_DAPM_PRE_REG
),
/* HeadsetL/R */
SND_SOC_DAPM_MUX
(
"HeadsetL Mux"
,
SND_SOC_NOPM
,
0
,
0
,
...
...
@@ -837,8 +765,50 @@ static const struct snd_soc_dapm_widget twl4030_dapm_widgets[] = {
&
twl4030_dapm_handsfreer_control
,
handsfree_event
,
SND_SOC_DAPM_POST_PMU
|
SND_SOC_DAPM_POST_PMD
),
SND_SOC_DAPM_ADC
(
"ADCL"
,
"Left Capture"
,
SND_SOC_NOPM
,
0
,
0
),
SND_SOC_DAPM_ADC
(
"ADCR"
,
"Right Capture"
,
SND_SOC_NOPM
,
0
,
0
),
/* Introducing four virtual ADC, since TWL4030 have four channel for
capture */
SND_SOC_DAPM_ADC
(
"ADC Virtual Left1"
,
"Left Front Capture"
,
SND_SOC_NOPM
,
0
,
0
),
SND_SOC_DAPM_ADC
(
"ADC Virtual Right1"
,
"Right Front Capture"
,
SND_SOC_NOPM
,
0
,
0
),
SND_SOC_DAPM_ADC
(
"ADC Virtual Left2"
,
"Left Rear Capture"
,
SND_SOC_NOPM
,
0
,
0
),
SND_SOC_DAPM_ADC
(
"ADC Virtual Right2"
,
"Right Rear Capture"
,
SND_SOC_NOPM
,
0
,
0
),
/* Analog/Digital mic path selection.
TX1 Left/Right: either analog Left/Right or Digimic0
TX2 Left/Right: either analog Left/Right or Digimic1 */
SND_SOC_DAPM_MUX_E
(
"TX1 Capture Route"
,
SND_SOC_NOPM
,
0
,
0
,
&
twl4030_dapm_micpathtx1_control
,
micpath_event
,
SND_SOC_DAPM_POST_PMU
|
SND_SOC_DAPM_POST_PMD
|
SND_SOC_DAPM_POST_REG
),
SND_SOC_DAPM_MUX_E
(
"TX2 Capture Route"
,
SND_SOC_NOPM
,
0
,
0
,
&
twl4030_dapm_micpathtx2_control
,
micpath_event
,
SND_SOC_DAPM_POST_PMU
|
SND_SOC_DAPM_POST_PMD
|
SND_SOC_DAPM_POST_REG
),
/* Analog input muxes with power switch for the physical ADCL/R */
SND_SOC_DAPM_MUX_E
(
"Analog Left Capture Route"
,
TWL4030_REG_AVADC_CTL
,
3
,
0
,
&
twl4030_dapm_analoglmic_control
,
twl4030_enum_event
,
SND_SOC_DAPM_PRE_REG
),
SND_SOC_DAPM_MUX_E
(
"Analog Right Capture Route"
,
TWL4030_REG_AVADC_CTL
,
1
,
0
,
&
twl4030_dapm_analogrmic_control
,
twl4030_enum_event
,
SND_SOC_DAPM_PRE_REG
),
SND_SOC_DAPM_PGA
(
"Analog Left Amplifier"
,
TWL4030_REG_ANAMICL
,
4
,
0
,
NULL
,
0
),
SND_SOC_DAPM_PGA
(
"Analog Right Amplifier"
,
TWL4030_REG_ANAMICR
,
4
,
0
,
NULL
,
0
),
SND_SOC_DAPM_PGA
(
"Digimic0 Enable"
,
TWL4030_REG_ADCMICSEL
,
1
,
0
,
NULL
,
0
),
SND_SOC_DAPM_PGA
(
"Digimic1 Enable"
,
TWL4030_REG_ADCMICSEL
,
3
,
0
,
NULL
,
0
),
SND_SOC_DAPM_MICBIAS
(
"Mic Bias 1"
,
TWL4030_REG_MICBIAS_CTL
,
0
,
0
),
SND_SOC_DAPM_MICBIAS
(
"Mic Bias 2"
,
TWL4030_REG_MICBIAS_CTL
,
1
,
0
),
SND_SOC_DAPM_MICBIAS
(
"Headset Mic Bias"
,
TWL4030_REG_MICBIAS_CTL
,
2
,
0
),
};
static
const
struct
snd_soc_dapm_route
intercon
[]
=
{
...
...
@@ -894,9 +864,39 @@ static const struct snd_soc_dapm_route intercon[] = {
{
"HFL"
,
NULL
,
"HandsfreeL Mux"
},
{
"HFR"
,
NULL
,
"HandsfreeR Mux"
},
/* inputs */
{
"ADCL"
,
NULL
,
"INL"
},
{
"ADCR"
,
NULL
,
"INR"
},
/* Capture path */
{
"Analog Left Capture Route"
,
"Main mic"
,
"MAINMIC"
},
{
"Analog Left Capture Route"
,
"Headset mic"
,
"HSMIC"
},
{
"Analog Left Capture Route"
,
"AUXL"
,
"AUXL"
},
{
"Analog Left Capture Route"
,
"Carkit mic"
,
"CARKITMIC"
},
{
"Analog Right Capture Route"
,
"Sub mic"
,
"SUBMIC"
},
{
"Analog Right Capture Route"
,
"AUXR"
,
"AUXR"
},
{
"Analog Left Amplifier"
,
NULL
,
"Analog Left Capture Route"
},
{
"Analog Right Amplifier"
,
NULL
,
"Analog Right Capture Route"
},
{
"Digimic0 Enable"
,
NULL
,
"DIGIMIC0"
},
{
"Digimic1 Enable"
,
NULL
,
"DIGIMIC1"
},
/* TX1 Left capture path */
{
"TX1 Capture Route"
,
"Analog"
,
"Analog Left Amplifier"
},
{
"TX1 Capture Route"
,
"Digimic0"
,
"Digimic0 Enable"
},
/* TX1 Right capture path */
{
"TX1 Capture Route"
,
"Analog"
,
"Analog Right Amplifier"
},
{
"TX1 Capture Route"
,
"Digimic0"
,
"Digimic0 Enable"
},
/* TX2 Left capture path */
{
"TX2 Capture Route"
,
"Analog"
,
"Analog Left Amplifier"
},
{
"TX2 Capture Route"
,
"Digimic1"
,
"Digimic1 Enable"
},
/* TX2 Right capture path */
{
"TX2 Capture Route"
,
"Analog"
,
"Analog Right Amplifier"
},
{
"TX2 Capture Route"
,
"Digimic1"
,
"Digimic1 Enable"
},
{
"ADC Virtual Left1"
,
NULL
,
"TX1 Capture Route"
},
{
"ADC Virtual Right1"
,
NULL
,
"TX1 Capture Route"
},
{
"ADC Virtual Left2"
,
NULL
,
"TX2 Capture Route"
},
{
"ADC Virtual Right2"
,
NULL
,
"TX2 Capture Route"
},
};
static
int
twl4030_add_widgets
(
struct
snd_soc_codec
*
codec
)
...
...
@@ -923,6 +923,7 @@ static void twl4030_power_up(struct snd_soc_codec *codec)
twl4030_write
(
codec
,
TWL4030_REG_ANAMICL
,
anamicl
|
TWL4030_CNCL_OFFSET_START
);
/* wait for offset cancellation to complete */
do
{
/* this takes a little while, so don't slam i2c */
...
...
sound/soc/codecs/twl4030.h
View file @
ab05e290
...
...
@@ -147,6 +147,13 @@
#define TWL4030_AVADC_CLK_PRIORITY 0x04
#define TWL4030_ADCR_EN 0x02
/* TWL4030_REG_ADCMICSEL (0x08) Fields */
#define TWL4030_DIGMIC1_EN 0x08
#define TWL4030_TX2IN_SEL 0x04
#define TWL4030_DIGMIC0_EN 0x02
#define TWL4030_TX1IN_SEL 0x01
/* AUDIO_IF (0x0E) Fields */
#define TWL4030_AIF_SLAVE_EN 0x80
...
...
sound/soc/pxa/pxa2xx-pcm.c
View file @
ab05e290
...
...
@@ -61,9 +61,9 @@ static int pxa2xx_pcm_hw_free(struct snd_pcm_substream *substream)
__pxa2xx_pcm_hw_free
(
substream
);
if
(
prtd
->
dma_ch
)
{
if
(
prtd
->
dma_ch
>=
0
)
{
pxa_free_dma
(
prtd
->
dma_ch
);
prtd
->
dma_ch
=
0
;
prtd
->
dma_ch
=
-
1
;
}
return
0
;
...
...
sound/soc/soc-core.c
View file @
ab05e290
...
...
@@ -1300,6 +1300,8 @@ EXPORT_SYMBOL_GPL(snd_soc_test_bits);
/**
* snd_soc_new_pcms - create new sound card and pcms
* @socdev: the SoC audio device
* @idx: ALSA card index
* @xid: card identification
*
* Create a new sound card based upon the codec and interface pcms.
*
...
...
@@ -1472,7 +1474,7 @@ EXPORT_SYMBOL_GPL(snd_soc_set_runtime_hwparams);
* snd_soc_cnew - create new control
* @_template: control template
* @data: control private data
* @l
n
ng_name: control long name
* @l
o
ng_name: control long name
*
* Create a new mixer control from a template control.
*
...
...
@@ -1522,7 +1524,7 @@ EXPORT_SYMBOL_GPL(snd_soc_info_enum_double);
/**
* snd_soc_get_enum_double - enumerated double mixer get callback
* @kcontrol: mixer control
* @u
info
: control element information
* @u
control
: control element information
*
* Callback to get the value of a double enumerated mixer.
*
...
...
@@ -1551,7 +1553,7 @@ EXPORT_SYMBOL_GPL(snd_soc_get_enum_double);
/**
* snd_soc_put_enum_double - enumerated double mixer put callback
* @kcontrol: mixer control
* @u
info
: control element information
* @u
control
: control element information
*
* Callback to set the value of a double enumerated mixer.
*
...
...
@@ -1668,7 +1670,7 @@ EXPORT_SYMBOL_GPL(snd_soc_info_volsw);
/**
* snd_soc_get_volsw - single mixer get callback
* @kcontrol: mixer control
* @u
info
: control element information
* @u
control
: control element information
*
* Callback to get the value of a single mixer control.
*
...
...
@@ -1707,7 +1709,7 @@ EXPORT_SYMBOL_GPL(snd_soc_get_volsw);
/**
* snd_soc_put_volsw - single mixer put callback
* @kcontrol: mixer control
* @u
info
: control element information
* @u
control
: control element information
*
* Callback to set the value of a single mixer control.
*
...
...
@@ -1775,7 +1777,7 @@ EXPORT_SYMBOL_GPL(snd_soc_info_volsw_2r);
/**
* snd_soc_get_volsw_2r - double mixer get callback
* @kcontrol: mixer control
* @u
info
: control element information
* @u
control
: control element information
*
* Callback to get the value of a double mixer control that spans 2 registers.
*
...
...
@@ -1812,7 +1814,7 @@ EXPORT_SYMBOL_GPL(snd_soc_get_volsw_2r);
/**
* snd_soc_put_volsw_2r - double mixer set callback
* @kcontrol: mixer control
* @u
info
: control element information
* @u
control
: control element information
*
* Callback to set the value of a double mixer control that spans 2 registers.
*
...
...
@@ -1882,7 +1884,7 @@ EXPORT_SYMBOL_GPL(snd_soc_info_volsw_s8);
/**
* snd_soc_get_volsw_s8 - signed mixer get callback
* @kcontrol: mixer control
* @u
info
: control element information
* @u
control
: control element information
*
* Callback to get the value of a signed mixer control.
*
...
...
@@ -1909,7 +1911,7 @@ EXPORT_SYMBOL_GPL(snd_soc_get_volsw_s8);
/**
* snd_soc_put_volsw_sgn - signed mixer put callback
* @kcontrol: mixer control
* @u
info
: control element information
* @u
control
: control element information
*
* Callback to set the value of a signed mixer control.
*
...
...
@@ -1954,7 +1956,7 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_sysclk);
/**
* snd_soc_dai_set_clkdiv - configure DAI clock dividers.
* @dai: DAI
* @
clk
_id: DAI specific clock divider ID
* @
div
_id: DAI specific clock divider ID
* @div: new clock divisor.
*
* Configures the clock dividers. This is used to derive the best DAI bit and
...
...
@@ -2060,7 +2062,7 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_digital_mute);
/**
* snd_soc_register_card - Register a card with the ASoC core
*
* @
param card
Card to register
* @
card:
Card to register
*
* Note that currently this is an internal only function: it will be
* exposed to machine drivers after further backporting of ASoC v2
...
...
@@ -2087,7 +2089,7 @@ static int snd_soc_register_card(struct snd_soc_card *card)
/**
* snd_soc_unregister_card - Unregister a card with the ASoC core
*
* @
param card
Card to unregister
* @
card:
Card to unregister
*
* Note that currently this is an internal only function: it will be
* exposed to machine drivers after further backporting of ASoC v2
...
...
@@ -2107,7 +2109,7 @@ static int snd_soc_unregister_card(struct snd_soc_card *card)
/**
* snd_soc_register_dai - Register a DAI with the ASoC core
*
* @
param dai
DAI to register
* @
dai:
DAI to register
*/
int
snd_soc_register_dai
(
struct
snd_soc_dai
*
dai
)
{
...
...
@@ -2134,7 +2136,7 @@ EXPORT_SYMBOL_GPL(snd_soc_register_dai);
/**
* snd_soc_unregister_dai - Unregister a DAI from the ASoC core
*
* @
param dai
DAI to unregister
* @
dai:
DAI to unregister
*/
void
snd_soc_unregister_dai
(
struct
snd_soc_dai
*
dai
)
{
...
...
@@ -2149,8 +2151,8 @@ EXPORT_SYMBOL_GPL(snd_soc_unregister_dai);
/**
* snd_soc_register_dais - Register multiple DAIs with the ASoC core
*
* @
param dai
Array of DAIs to register
* @
param count
Number of DAIs
* @
dai:
Array of DAIs to register
* @
count:
Number of DAIs
*/
int
snd_soc_register_dais
(
struct
snd_soc_dai
*
dai
,
size_t
count
)
{
...
...
@@ -2175,8 +2177,8 @@ EXPORT_SYMBOL_GPL(snd_soc_register_dais);
/**
* snd_soc_unregister_dais - Unregister multiple DAIs from the ASoC core
*
* @
param dai
Array of DAIs to unregister
* @
param count
Number of DAIs
* @
dai:
Array of DAIs to unregister
* @
count:
Number of DAIs
*/
void
snd_soc_unregister_dais
(
struct
snd_soc_dai
*
dai
,
size_t
count
)
{
...
...
@@ -2190,7 +2192,7 @@ EXPORT_SYMBOL_GPL(snd_soc_unregister_dais);
/**
* snd_soc_register_platform - Register a platform with the ASoC core
*
* @p
aram platform
platform to register
* @p
latform:
platform to register
*/
int
snd_soc_register_platform
(
struct
snd_soc_platform
*
platform
)
{
...
...
@@ -2213,7 +2215,7 @@ EXPORT_SYMBOL_GPL(snd_soc_register_platform);
/**
* snd_soc_unregister_platform - Unregister a platform from the ASoC core
*
* @p
aram platform
platform to unregister
* @p
latform:
platform to unregister
*/
void
snd_soc_unregister_platform
(
struct
snd_soc_platform
*
platform
)
{
...
...
@@ -2228,7 +2230,7 @@ EXPORT_SYMBOL_GPL(snd_soc_unregister_platform);
/**
* snd_soc_register_codec - Register a codec with the ASoC core
*
* @
param codec
codec to register
* @
codec:
codec to register
*/
int
snd_soc_register_codec
(
struct
snd_soc_codec
*
codec
)
{
...
...
@@ -2255,7 +2257,7 @@ EXPORT_SYMBOL_GPL(snd_soc_register_codec);
/**
* snd_soc_unregister_codec - Unregister a codec from the ASoC core
*
* @
param codec
codec to unregister
* @
codec:
codec to unregister
*/
void
snd_soc_unregister_codec
(
struct
snd_soc_codec
*
codec
)
{
...
...
sound/soc/soc-dapm.c
View file @
ab05e290
...
...
@@ -1077,7 +1077,7 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_new_widgets);
/**
* snd_soc_dapm_get_volsw - dapm mixer get callback
* @kcontrol: mixer control
* @u
info
: control element information
* @u
control
: control element information
*
* Callback to get the value of a dapm mixer control.
*
...
...
@@ -1122,7 +1122,7 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_get_volsw);
/**
* snd_soc_dapm_put_volsw - dapm mixer set callback
* @kcontrol: mixer control
* @u
info
: control element information
* @u
control
: control element information
*
* Callback to set the value of a dapm mixer control.
*
...
...
@@ -1193,7 +1193,7 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_put_volsw);
/**
* snd_soc_dapm_get_enum_double - dapm enumerated double mixer get callback
* @kcontrol: mixer control
* @u
info
: control element information
* @u
control
: control element information
*
* Callback to get the value of a dapm enumerated double mixer control.
*
...
...
@@ -1221,7 +1221,7 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_get_enum_double);
/**
* snd_soc_dapm_put_enum_double - dapm enumerated double mixer set callback
* @kcontrol: mixer control
* @u
info
: control element information
* @u
control
: control element information
*
* Callback to set the value of a dapm enumerated double mixer control.
*
...
...
@@ -1419,7 +1419,7 @@ int snd_soc_dapm_set_bias_level(struct snd_soc_device *socdev,
/**
* snd_soc_dapm_enable_pin - enable pin.
* @
snd_soc_
codec: SoC codec
* @codec: SoC codec
* @pin: pin name
*
* Enables input/output pin and it's parents or children widgets iff there is
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment