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
nexedi
linux
Commits
f98dedce
Commit
f98dedce
authored
Feb 13, 2011
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'for-2.6.38' into for-2.6.39
parents
905f6952
3017358a
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
196 additions
and
23 deletions
+196
-23
include/sound/wm8903.h
include/sound/wm8903.h
+3
-7
sound/soc/codecs/wm8903.c
sound/soc/codecs/wm8903.c
+1
-1
sound/soc/codecs/wm8994.c
sound/soc/codecs/wm8994.c
+183
-14
sound/soc/soc-dapm.c
sound/soc/soc-dapm.c
+9
-1
No files found.
include/sound/wm8903.h
View file @
f98dedce
...
...
@@ -17,13 +17,9 @@
/*
* R6 (0x06) - Mic Bias Control 0
*/
#define WM8903_MICDET_HYST_ENA 0x0080
/* MICDET_HYST_ENA */
#define WM8903_MICDET_HYST_ENA_MASK 0x0080
/* MICDET_HYST_ENA */
#define WM8903_MICDET_HYST_ENA_SHIFT 7
/* MICDET_HYST_ENA */
#define WM8903_MICDET_HYST_ENA_WIDTH 1
/* MICDET_HYST_ENA */
#define WM8903_MICDET_THR_MASK 0x0070
/* MICDET_THR - [6:4] */
#define WM8903_MICDET_THR_SHIFT 4
/* MICDET_THR - [6:4] */
#define WM8903_MICDET_THR_WIDTH 3
/* MICDET_THR - [6:4] */
#define WM8903_MICDET_THR_MASK 0x0030
/* MICDET_THR - [5:4] */
#define WM8903_MICDET_THR_SHIFT 4
/* MICDET_THR - [5:4] */
#define WM8903_MICDET_THR_WIDTH 2
/* MICDET_THR - [5:4] */
#define WM8903_MICSHORT_THR_MASK 0x000C
/* MICSHORT_THR - [3:2] */
#define WM8903_MICSHORT_THR_SHIFT 2
/* MICSHORT_THR - [3:2] */
#define WM8903_MICSHORT_THR_WIDTH 2
/* MICSHORT_THR - [3:2] */
...
...
sound/soc/codecs/wm8903.c
View file @
f98dedce
...
...
@@ -1620,7 +1620,7 @@ int wm8903_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack,
WM8903_MICDET_EINT
|
WM8903_MICSHRT_EINT
,
irq_mask
);
if
(
det
&&
shrt
)
{
if
(
det
||
shrt
)
{
/* Enable mic detection, this may not have been set through
* platform data (eg, if the defaults are OK). */
snd_soc_update_bits
(
codec
,
WM8903_WRITE_SEQUENCER_0
,
...
...
sound/soc/codecs/wm8994.c
View file @
f98dedce
...
...
@@ -107,6 +107,9 @@ struct wm8994_priv {
int
revision
;
struct
wm8994_pdata
*
pdata
;
unsigned
int
aif1clk_enable
:
1
;
unsigned
int
aif2clk_enable
:
1
;
};
static
int
wm8994_readable
(
struct
snd_soc_codec
*
codec
,
unsigned
int
reg
)
...
...
@@ -1004,6 +1007,93 @@ static void wm8994_update_class_w(struct snd_soc_codec *codec)
}
}
static
int
late_enable_ev
(
struct
snd_soc_dapm_widget
*
w
,
struct
snd_kcontrol
*
kcontrol
,
int
event
)
{
struct
snd_soc_codec
*
codec
=
w
->
codec
;
struct
wm8994_priv
*
wm8994
=
snd_soc_codec_get_drvdata
(
codec
);
switch
(
event
)
{
case
SND_SOC_DAPM_PRE_PMU
:
if
(
wm8994
->
aif1clk_enable
)
snd_soc_update_bits
(
codec
,
WM8994_AIF1_CLOCKING_1
,
WM8994_AIF1CLK_ENA_MASK
,
WM8994_AIF1CLK_ENA
);
if
(
wm8994
->
aif2clk_enable
)
snd_soc_update_bits
(
codec
,
WM8994_AIF2_CLOCKING_1
,
WM8994_AIF2CLK_ENA_MASK
,
WM8994_AIF2CLK_ENA
);
break
;
}
return
0
;
}
static
int
late_disable_ev
(
struct
snd_soc_dapm_widget
*
w
,
struct
snd_kcontrol
*
kcontrol
,
int
event
)
{
struct
snd_soc_codec
*
codec
=
w
->
codec
;
struct
wm8994_priv
*
wm8994
=
snd_soc_codec_get_drvdata
(
codec
);
switch
(
event
)
{
case
SND_SOC_DAPM_POST_PMD
:
if
(
wm8994
->
aif1clk_enable
)
{
snd_soc_update_bits
(
codec
,
WM8994_AIF1_CLOCKING_1
,
WM8994_AIF1CLK_ENA_MASK
,
0
);
wm8994
->
aif1clk_enable
=
0
;
}
if
(
wm8994
->
aif2clk_enable
)
{
snd_soc_update_bits
(
codec
,
WM8994_AIF2_CLOCKING_1
,
WM8994_AIF2CLK_ENA_MASK
,
0
);
wm8994
->
aif2clk_enable
=
0
;
}
break
;
}
return
0
;
}
static
int
aif1clk_ev
(
struct
snd_soc_dapm_widget
*
w
,
struct
snd_kcontrol
*
kcontrol
,
int
event
)
{
struct
snd_soc_codec
*
codec
=
w
->
codec
;
struct
wm8994_priv
*
wm8994
=
snd_soc_codec_get_drvdata
(
codec
);
switch
(
event
)
{
case
SND_SOC_DAPM_PRE_PMU
:
wm8994
->
aif1clk_enable
=
1
;
break
;
}
return
0
;
}
static
int
aif2clk_ev
(
struct
snd_soc_dapm_widget
*
w
,
struct
snd_kcontrol
*
kcontrol
,
int
event
)
{
struct
snd_soc_codec
*
codec
=
w
->
codec
;
struct
wm8994_priv
*
wm8994
=
snd_soc_codec_get_drvdata
(
codec
);
switch
(
event
)
{
case
SND_SOC_DAPM_PRE_PMU
:
wm8994
->
aif2clk_enable
=
1
;
break
;
}
return
0
;
}
static
int
dac_ev
(
struct
snd_soc_dapm_widget
*
w
,
struct
snd_kcontrol
*
kcontrol
,
int
event
)
{
struct
snd_soc_codec
*
codec
=
w
->
codec
;
unsigned
int
mask
=
1
<<
w
->
shift
;
snd_soc_update_bits
(
codec
,
WM8994_POWER_MANAGEMENT_5
,
mask
,
mask
);
return
0
;
}
static
const
char
*
hp_mux_text
[]
=
{
"Mixer"
,
"DAC"
,
...
...
@@ -1272,6 +1362,47 @@ static const struct soc_enum aif2dacr_src_enum =
static
const
struct
snd_kcontrol_new
aif2dacr_src_mux
=
SOC_DAPM_ENUM
(
"AIF2DACR Mux"
,
aif2dacr_src_enum
);
static
const
struct
snd_soc_dapm_widget
wm8994_lateclk_revd_widgets
[]
=
{
SND_SOC_DAPM_SUPPLY
(
"AIF1CLK"
,
SND_SOC_NOPM
,
0
,
0
,
aif1clk_ev
,
SND_SOC_DAPM_PRE_PMU
|
SND_SOC_DAPM_POST_PMD
),
SND_SOC_DAPM_SUPPLY
(
"AIF2CLK"
,
SND_SOC_NOPM
,
0
,
0
,
aif2clk_ev
,
SND_SOC_DAPM_PRE_PMU
|
SND_SOC_DAPM_POST_PMD
),
SND_SOC_DAPM_PGA_E
(
"Late DAC1L Enable PGA"
,
SND_SOC_NOPM
,
0
,
0
,
NULL
,
0
,
late_enable_ev
,
SND_SOC_DAPM_PRE_PMU
),
SND_SOC_DAPM_PGA_E
(
"Late DAC1R Enable PGA"
,
SND_SOC_NOPM
,
0
,
0
,
NULL
,
0
,
late_enable_ev
,
SND_SOC_DAPM_PRE_PMU
),
SND_SOC_DAPM_PGA_E
(
"Late DAC2L Enable PGA"
,
SND_SOC_NOPM
,
0
,
0
,
NULL
,
0
,
late_enable_ev
,
SND_SOC_DAPM_PRE_PMU
),
SND_SOC_DAPM_PGA_E
(
"Late DAC2R Enable PGA"
,
SND_SOC_NOPM
,
0
,
0
,
NULL
,
0
,
late_enable_ev
,
SND_SOC_DAPM_PRE_PMU
),
SND_SOC_DAPM_POST
(
"Late Disable PGA"
,
late_disable_ev
)
};
static
const
struct
snd_soc_dapm_widget
wm8994_lateclk_widgets
[]
=
{
SND_SOC_DAPM_SUPPLY
(
"AIF1CLK"
,
WM8994_AIF1_CLOCKING_1
,
0
,
0
,
NULL
,
0
),
SND_SOC_DAPM_SUPPLY
(
"AIF2CLK"
,
WM8994_AIF2_CLOCKING_1
,
0
,
0
,
NULL
,
0
)
};
static
const
struct
snd_soc_dapm_widget
wm8994_dac_revd_widgets
[]
=
{
SND_SOC_DAPM_DAC_E
(
"DAC2L"
,
NULL
,
SND_SOC_NOPM
,
3
,
0
,
dac_ev
,
SND_SOC_DAPM_PRE_PMU
),
SND_SOC_DAPM_DAC_E
(
"DAC2R"
,
NULL
,
SND_SOC_NOPM
,
2
,
0
,
dac_ev
,
SND_SOC_DAPM_PRE_PMU
),
SND_SOC_DAPM_DAC_E
(
"DAC1L"
,
NULL
,
SND_SOC_NOPM
,
1
,
0
,
dac_ev
,
SND_SOC_DAPM_PRE_PMU
),
SND_SOC_DAPM_DAC_E
(
"DAC1R"
,
NULL
,
SND_SOC_NOPM
,
0
,
0
,
dac_ev
,
SND_SOC_DAPM_PRE_PMU
),
};
static
const
struct
snd_soc_dapm_widget
wm8994_dac_widgets
[]
=
{
SND_SOC_DAPM_DAC
(
"DAC2L"
,
NULL
,
WM8994_POWER_MANAGEMENT_5
,
3
,
0
),
SND_SOC_DAPM_DAC
(
"DAC1R"
,
NULL
,
WM8994_POWER_MANAGEMENT_5
,
2
,
0
),
SND_SOC_DAPM_DAC
(
"DAC1L"
,
NULL
,
WM8994_POWER_MANAGEMENT_5
,
1
,
0
),
SND_SOC_DAPM_DAC
(
"DAC1R"
,
NULL
,
WM8994_POWER_MANAGEMENT_5
,
0
,
0
),
};
static
const
struct
snd_soc_dapm_widget
wm8994_dapm_widgets
[]
=
{
SND_SOC_DAPM_INPUT
(
"DMIC1DAT"
),
SND_SOC_DAPM_INPUT
(
"DMIC2DAT"
),
...
...
@@ -1284,9 +1415,6 @@ SND_SOC_DAPM_SUPPLY("DSP1CLK", WM8994_CLOCKING_1, 3, 0, NULL, 0),
SND_SOC_DAPM_SUPPLY
(
"DSP2CLK"
,
WM8994_CLOCKING_1
,
2
,
0
,
NULL
,
0
),
SND_SOC_DAPM_SUPPLY
(
"DSPINTCLK"
,
WM8994_CLOCKING_1
,
1
,
0
,
NULL
,
0
),
SND_SOC_DAPM_SUPPLY
(
"AIF1CLK"
,
WM8994_AIF1_CLOCKING_1
,
0
,
0
,
NULL
,
0
),
SND_SOC_DAPM_SUPPLY
(
"AIF2CLK"
,
WM8994_AIF2_CLOCKING_1
,
0
,
0
,
NULL
,
0
),
SND_SOC_DAPM_AIF_OUT
(
"AIF1ADC1L"
,
NULL
,
0
,
WM8994_POWER_MANAGEMENT_4
,
9
,
0
),
SND_SOC_DAPM_AIF_OUT
(
"AIF1ADC1R"
,
NULL
,
...
...
@@ -1372,11 +1500,6 @@ SND_SOC_DAPM_ADC("ADCR", NULL, SND_SOC_NOPM, 0, 0),
SND_SOC_DAPM_MUX
(
"ADCL Mux"
,
WM8994_POWER_MANAGEMENT_4
,
1
,
0
,
&
adcl_mux
),
SND_SOC_DAPM_MUX
(
"ADCR Mux"
,
WM8994_POWER_MANAGEMENT_4
,
0
,
0
,
&
adcr_mux
),
SND_SOC_DAPM_DAC
(
"DAC2L"
,
NULL
,
WM8994_POWER_MANAGEMENT_5
,
3
,
0
),
SND_SOC_DAPM_DAC
(
"DAC2R"
,
NULL
,
WM8994_POWER_MANAGEMENT_5
,
2
,
0
),
SND_SOC_DAPM_DAC
(
"DAC1L"
,
NULL
,
WM8994_POWER_MANAGEMENT_5
,
1
,
0
),
SND_SOC_DAPM_DAC
(
"DAC1R"
,
NULL
,
WM8994_POWER_MANAGEMENT_5
,
0
,
0
),
SND_SOC_DAPM_MUX
(
"Left Headphone Mux"
,
SND_SOC_NOPM
,
0
,
0
,
&
hpl_mux
),
SND_SOC_DAPM_MUX
(
"Right Headphone Mux"
,
SND_SOC_NOPM
,
0
,
0
,
&
hpr_mux
),
...
...
@@ -1516,14 +1639,12 @@ static const struct snd_soc_dapm_route intercon[] = {
{
"AIF2ADC Mux"
,
"AIF3DACDAT"
,
"AIF3ADCDAT"
},
/* DAC1 inputs */
{
"DAC1L"
,
NULL
,
"DAC1L Mixer"
},
{
"DAC1L Mixer"
,
"AIF2 Switch"
,
"AIF2DACL"
},
{
"DAC1L Mixer"
,
"AIF1.2 Switch"
,
"AIF1DAC2L"
},
{
"DAC1L Mixer"
,
"AIF1.1 Switch"
,
"AIF1DAC1L"
},
{
"DAC1L Mixer"
,
"Left Sidetone Switch"
,
"Left Sidetone"
},
{
"DAC1L Mixer"
,
"Right Sidetone Switch"
,
"Right Sidetone"
},
{
"DAC1R"
,
NULL
,
"DAC1R Mixer"
},
{
"DAC1R Mixer"
,
"AIF2 Switch"
,
"AIF2DACR"
},
{
"DAC1R Mixer"
,
"AIF1.2 Switch"
,
"AIF1DAC2R"
},
{
"DAC1R Mixer"
,
"AIF1.1 Switch"
,
"AIF1DAC1R"
},
...
...
@@ -1532,7 +1653,6 @@ static const struct snd_soc_dapm_route intercon[] = {
/* DAC2/AIF2 outputs */
{
"AIF2ADCL"
,
NULL
,
"AIF2DAC2L Mixer"
},
{
"DAC2L"
,
NULL
,
"AIF2DAC2L Mixer"
},
{
"AIF2DAC2L Mixer"
,
"AIF2 Switch"
,
"AIF2DACL"
},
{
"AIF2DAC2L Mixer"
,
"AIF1.2 Switch"
,
"AIF1DAC2L"
},
{
"AIF2DAC2L Mixer"
,
"AIF1.1 Switch"
,
"AIF1DAC1L"
},
...
...
@@ -1540,7 +1660,6 @@ static const struct snd_soc_dapm_route intercon[] = {
{
"AIF2DAC2L Mixer"
,
"Right Sidetone Switch"
,
"Right Sidetone"
},
{
"AIF2ADCR"
,
NULL
,
"AIF2DAC2R Mixer"
},
{
"DAC2R"
,
NULL
,
"AIF2DAC2R Mixer"
},
{
"AIF2DAC2R Mixer"
,
"AIF2 Switch"
,
"AIF2DACR"
},
{
"AIF2DAC2R Mixer"
,
"AIF1.2 Switch"
,
"AIF1DAC2R"
},
{
"AIF2DAC2R Mixer"
,
"AIF1.1 Switch"
,
"AIF1DAC1R"
},
...
...
@@ -1584,6 +1703,24 @@ static const struct snd_soc_dapm_route intercon[] = {
{
"Right Headphone Mux"
,
"DAC"
,
"DAC1R"
},
};
static
const
struct
snd_soc_dapm_route
wm8994_lateclk_revd_intercon
[]
=
{
{
"DAC1L"
,
NULL
,
"Late DAC1L Enable PGA"
},
{
"Late DAC1L Enable PGA"
,
NULL
,
"DAC1L Mixer"
},
{
"DAC1R"
,
NULL
,
"Late DAC1R Enable PGA"
},
{
"Late DAC1R Enable PGA"
,
NULL
,
"DAC1R Mixer"
},
{
"DAC2L"
,
NULL
,
"Late DAC2L Enable PGA"
},
{
"Late DAC2L Enable PGA"
,
NULL
,
"AIF2DAC2L Mixer"
},
{
"DAC2R"
,
NULL
,
"Late DAC2R Enable PGA"
},
{
"Late DAC2R Enable PGA"
,
NULL
,
"AIF2DAC2R Mixer"
}
};
static
const
struct
snd_soc_dapm_route
wm8994_lateclk_intercon
[]
=
{
{
"DAC1L"
,
NULL
,
"DAC1L Mixer"
},
{
"DAC1R"
,
NULL
,
"DAC1R Mixer"
},
{
"DAC2L"
,
NULL
,
"AIF2DAC2L Mixer"
},
{
"DAC2R"
,
NULL
,
"AIF2DAC2R Mixer"
},
};
static
const
struct
snd_soc_dapm_route
wm8994_revd_intercon
[]
=
{
{
"AIF1DACDAT"
,
NULL
,
"AIF2DACDAT"
},
{
"AIF2DACDAT"
,
NULL
,
"AIF1DACDAT"
},
...
...
@@ -2514,6 +2651,22 @@ static int wm8994_resume(struct snd_soc_codec *codec)
{
struct
wm8994_priv
*
wm8994
=
snd_soc_codec_get_drvdata
(
codec
);
int
i
,
ret
;
unsigned
int
val
,
mask
;
if
(
wm8994
->
revision
<
4
)
{
/* force a HW read */
val
=
wm8994_reg_read
(
codec
->
control_data
,
WM8994_POWER_MANAGEMENT_5
);
/* modify the cache only */
codec
->
cache_only
=
1
;
mask
=
WM8994_DAC1R_ENA
|
WM8994_DAC1L_ENA
|
WM8994_DAC2R_ENA
|
WM8994_DAC2L_ENA
;
val
&=
mask
;
snd_soc_update_bits
(
codec
,
WM8994_POWER_MANAGEMENT_5
,
mask
,
val
);
codec
->
cache_only
=
0
;
}
/* Restore the registers */
ret
=
snd_soc_cache_sync
(
codec
);
...
...
@@ -3125,6 +3278,17 @@ static int wm8994_codec_probe(struct snd_soc_codec *codec)
case
WM8994
:
snd_soc_dapm_new_controls
(
dapm
,
wm8994_specific_dapm_widgets
,
ARRAY_SIZE
(
wm8994_specific_dapm_widgets
));
if
(
wm8994
->
revision
<
4
)
{
snd_soc_dapm_new_controls
(
dapm
,
wm8994_lateclk_revd_widgets
,
ARRAY_SIZE
(
wm8994_lateclk_revd_widgets
));
snd_soc_dapm_new_controls
(
dapm
,
wm8994_dac_revd_widgets
,
ARRAY_SIZE
(
wm8994_dac_revd_widgets
));
}
else
{
snd_soc_dapm_new_controls
(
dapm
,
wm8994_lateclk_widgets
,
ARRAY_SIZE
(
wm8994_lateclk_widgets
));
snd_soc_dapm_new_controls
(
dapm
,
wm8994_dac_widgets
,
ARRAY_SIZE
(
wm8994_dac_widgets
));
}
break
;
case
WM8958
:
snd_soc_add_controls
(
codec
,
wm8958_snd_controls
,
...
...
@@ -3143,10 +3307,15 @@ static int wm8994_codec_probe(struct snd_soc_codec *codec)
snd_soc_dapm_add_routes
(
dapm
,
wm8994_intercon
,
ARRAY_SIZE
(
wm8994_intercon
));
if
(
wm8994
->
revision
<
4
)
if
(
wm8994
->
revision
<
4
)
{
snd_soc_dapm_add_routes
(
dapm
,
wm8994_revd_intercon
,
ARRAY_SIZE
(
wm8994_revd_intercon
));
snd_soc_dapm_add_routes
(
dapm
,
wm8994_lateclk_revd_intercon
,
ARRAY_SIZE
(
wm8994_lateclk_revd_intercon
));
}
else
{
snd_soc_dapm_add_routes
(
dapm
,
wm8994_lateclk_intercon
,
ARRAY_SIZE
(
wm8994_lateclk_intercon
));
}
break
;
case
WM8958
:
snd_soc_dapm_add_routes
(
dapm
,
wm8958_intercon
,
...
...
sound/soc/soc-dapm.c
View file @
f98dedce
...
...
@@ -712,7 +712,15 @@ static int dapm_supply_check_power(struct snd_soc_dapm_widget *w)
!
path
->
connected
(
path
->
source
,
path
->
sink
))
continue
;
if
(
path
->
sink
&&
path
->
sink
->
power_check
&&
if
(
!
path
->
sink
)
continue
;
if
(
path
->
sink
->
force
)
{
power
=
1
;
break
;
}
if
(
path
->
sink
->
power_check
&&
path
->
sink
->
power_check
(
path
->
sink
))
{
power
=
1
;
break
;
...
...
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