Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
f98dedce
cloud-kernel
项目概览
openanolis
/
cloud-kernel
1 年多 前同步成功
通知
160
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
f98dedce
编写于
2月 13, 2011
作者:
M
Mark Brown
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'for-2.6.38' into for-2.6.39
上级
905f6952
3017358a
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
196 addition
and
23 deletion
+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
未找到文件。
include/sound/wm8903.h
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录