Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
raspberrypi-kernel
提交
cb42e0f7
R
raspberrypi-kernel
项目概览
openeuler
/
raspberrypi-kernel
通知
13
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
raspberrypi-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
cb42e0f7
编写于
8月 30, 2015
作者:
M
Mark Brown
浏览文件
操作
浏览文件
下载
差异文件
Merge remote-tracking branch 'asoc/topic/rt5645' into asoc-next
上级
ca945cf9
f2988afe
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
244 addition
and
272 deletion
+244
-272
include/sound/soc.h
include/sound/soc.h
+3
-7
sound/soc/codecs/rt5645.c
sound/soc/codecs/rt5645.c
+209
-206
sound/soc/codecs/rt5645.h
sound/soc/codecs/rt5645.h
+1
-26
sound/soc/codecs/tas571x.c
sound/soc/codecs/tas571x.c
+1
-1
sound/soc/intel/boards/cht_bsw_max98090_ti.c
sound/soc/intel/boards/cht_bsw_max98090_ti.c
+7
-11
sound/soc/omap/omap3pandora.c
sound/soc/omap/omap3pandora.c
+2
-4
sound/soc/soc-core.c
sound/soc/soc-core.c
+12
-11
sound/soc/soc-dapm.c
sound/soc/soc-dapm.c
+9
-6
未找到文件。
include/sound/soc.h
浏览文件 @
cb42e0f7
...
...
@@ -791,7 +791,6 @@ struct snd_soc_component {
/* Don't use these, use snd_soc_component_get_dapm() */
struct
snd_soc_dapm_context
dapm
;
struct
snd_soc_dapm_context
*
dapm_ptr
;
const
struct
snd_kcontrol_new
*
controls
;
unsigned
int
num_controls
;
...
...
@@ -831,9 +830,6 @@ struct snd_soc_codec {
/* component */
struct
snd_soc_component
component
;
/* Don't access this directly, use snd_soc_codec_get_dapm() */
struct
snd_soc_dapm_context
dapm
;
#ifdef CONFIG_DEBUG_FS
struct
dentry
*
debugfs_reg
;
#endif
...
...
@@ -1276,7 +1272,7 @@ static inline struct snd_soc_component *snd_soc_dapm_to_component(
static
inline
struct
snd_soc_codec
*
snd_soc_dapm_to_codec
(
struct
snd_soc_dapm_context
*
dapm
)
{
return
container_of
(
dapm
,
struct
snd_soc_codec
,
dapm
);
return
snd_soc_component_to_codec
(
snd_soc_dapm_to_component
(
dapm
)
);
}
/**
...
...
@@ -1301,7 +1297,7 @@ static inline struct snd_soc_platform *snd_soc_dapm_to_platform(
static
inline
struct
snd_soc_dapm_context
*
snd_soc_component_get_dapm
(
struct
snd_soc_component
*
component
)
{
return
component
->
dapm_ptr
;
return
&
component
->
dapm
;
}
/**
...
...
@@ -1313,7 +1309,7 @@ static inline struct snd_soc_dapm_context *snd_soc_component_get_dapm(
static
inline
struct
snd_soc_dapm_context
*
snd_soc_codec_get_dapm
(
struct
snd_soc_codec
*
codec
)
{
return
&
codec
->
dapm
;
return
snd_soc_component_get_dapm
(
&
codec
->
component
)
;
}
/**
...
...
sound/soc/codecs/rt5645.c
浏览文件 @
cb42e0f7
...
...
@@ -21,6 +21,7 @@
#include <linux/gpio/consumer.h>
#include <linux/acpi.h>
#include <linux/dmi.h>
#include <linux/regulator/consumer.h>
#include <sound/core.h>
#include <sound/pcm.h>
#include <sound/pcm_params.h>
...
...
@@ -223,6 +224,39 @@ static const struct reg_default rt5645_reg[] = {
{
0xff
,
0x6308
},
};
static
const
char
*
const
rt5645_supply_names
[]
=
{
"avdd"
,
"cpvdd"
,
};
struct
rt5645_priv
{
struct
snd_soc_codec
*
codec
;
struct
rt5645_platform_data
pdata
;
struct
regmap
*
regmap
;
struct
i2c_client
*
i2c
;
struct
gpio_desc
*
gpiod_hp_det
;
struct
snd_soc_jack
*
hp_jack
;
struct
snd_soc_jack
*
mic_jack
;
struct
snd_soc_jack
*
btn_jack
;
struct
delayed_work
jack_detect_work
;
struct
regulator_bulk_data
supplies
[
ARRAY_SIZE
(
rt5645_supply_names
)];
int
codec_type
;
int
sysclk
;
int
sysclk_src
;
int
lrck
[
RT5645_AIFS
];
int
bclk
[
RT5645_AIFS
];
int
master
[
RT5645_AIFS
];
int
pll_src
;
int
pll_in
;
int
pll_out
;
int
jack_type
;
bool
en_button_func
;
bool
hp_on
;
};
static
int
rt5645_reset
(
struct
snd_soc_codec
*
codec
)
{
return
snd_soc_write
(
codec
,
RT5645_RESET
,
0
);
...
...
@@ -360,6 +394,7 @@ static bool rt5645_readable_register(struct device *dev, unsigned int reg)
case
RT5645_DEPOP_M1
:
case
RT5645_DEPOP_M2
:
case
RT5645_DEPOP_M3
:
case
RT5645_CHARGE_PUMP
:
case
RT5645_MICBIAS
:
case
RT5645_A_JD_CTRL1
:
case
RT5645_VAD_CTRL4
:
...
...
@@ -1331,15 +1366,23 @@ static void hp_amp_power(struct snd_soc_codec *codec, int on)
if
(
on
)
{
if
(
hp_amp_power_count
<=
0
)
{
if
(
rt5645
->
codec_type
==
CODEC_TYPE_RT5650
)
{
snd_soc_write
(
codec
,
RT5645_DEPOP_M2
,
0x3100
);
snd_soc_write
(
codec
,
RT5645_CHARGE_PUMP
,
0x0e06
);
snd_soc_write
(
codec
,
RT5645_DEPOP_M1
,
0x001d
);
snd_soc_write
(
codec
,
RT5645_DEPOP_M1
,
0x000d
);
regmap_write
(
rt5645
->
regmap
,
RT5645_PR_BASE
+
RT5645_HP_DCC_INT1
,
0x9f01
);
msleep
(
20
);
snd_soc_update_bits
(
codec
,
RT5645_DEPOP_M1
,
RT5645_HP_CO_MASK
,
RT5645_HP_CO_EN
);
regmap_write
(
rt5645
->
regmap
,
RT5645_PR_BASE
+
0x3e
,
0x7400
);
snd_soc_write
(
codec
,
RT5645_DEPOP_M3
,
0x0737
);
regmap_write
(
rt5645
->
regmap
,
RT5645_PR_BASE
+
RT5645_MAMP_INT_REG2
,
0xfc00
);
snd_soc_write
(
codec
,
RT5645_DEPOP_M2
,
0x1140
);
mdelay
(
5
);
rt5645
->
hp_on
=
true
;
}
else
{
/* depop parameters */
snd_soc_update_bits
(
codec
,
RT5645_DEPOP_M2
,
...
...
@@ -1553,6 +1596,27 @@ static int rt5645_bst2_event(struct snd_soc_dapm_widget *w,
return
0
;
}
static
int
rt5650_hp_event
(
struct
snd_soc_dapm_widget
*
w
,
struct
snd_kcontrol
*
k
,
int
event
)
{
struct
snd_soc_codec
*
codec
=
snd_soc_dapm_to_codec
(
w
->
dapm
);
struct
rt5645_priv
*
rt5645
=
snd_soc_codec_get_drvdata
(
codec
);
switch
(
event
)
{
case
SND_SOC_DAPM_POST_PMU
:
if
(
rt5645
->
hp_on
)
{
msleep
(
100
);
rt5645
->
hp_on
=
false
;
}
break
;
default:
return
0
;
}
return
0
;
}
static
const
struct
snd_soc_dapm_widget
rt5645_dapm_widgets
[]
=
{
SND_SOC_DAPM_SUPPLY
(
"LDO2"
,
RT5645_PWR_MIXER
,
RT5645_PWR_LDO2_BIT
,
0
,
NULL
,
0
),
...
...
@@ -1697,15 +1761,6 @@ static const struct snd_soc_dapm_widget rt5645_dapm_widgets[] = {
SND_SOC_DAPM_PGA
(
"IF1_ADC4"
,
SND_SOC_NOPM
,
0
,
0
,
NULL
,
0
),
/* IF1 2 Mux */
SND_SOC_DAPM_MUX
(
"RT5645 IF1 ADC1 Swap Mux"
,
SND_SOC_NOPM
,
0
,
0
,
&
rt5645_if1_adc1_in_mux
),
SND_SOC_DAPM_MUX
(
"RT5645 IF1 ADC2 Swap Mux"
,
SND_SOC_NOPM
,
0
,
0
,
&
rt5645_if1_adc2_in_mux
),
SND_SOC_DAPM_MUX
(
"RT5645 IF1 ADC3 Swap Mux"
,
SND_SOC_NOPM
,
0
,
0
,
&
rt5645_if1_adc3_in_mux
),
SND_SOC_DAPM_MUX
(
"RT5645 IF1 ADC Mux"
,
SND_SOC_NOPM
,
0
,
0
,
&
rt5645_if1_adc_in_mux
),
SND_SOC_DAPM_MUX
(
"IF2 ADC Mux"
,
SND_SOC_NOPM
,
0
,
0
,
&
rt5645_if2_adc_in_mux
),
...
...
@@ -1716,14 +1771,6 @@ static const struct snd_soc_dapm_widget rt5645_dapm_widgets[] = {
SND_SOC_DAPM_PGA
(
"IF1 DAC1"
,
SND_SOC_NOPM
,
0
,
0
,
NULL
,
0
),
SND_SOC_DAPM_PGA
(
"IF1 DAC2"
,
SND_SOC_NOPM
,
0
,
0
,
NULL
,
0
),
SND_SOC_DAPM_PGA
(
"IF1 DAC3"
,
SND_SOC_NOPM
,
0
,
0
,
NULL
,
0
),
SND_SOC_DAPM_MUX
(
"RT5645 IF1 DAC1 L Mux"
,
SND_SOC_NOPM
,
0
,
0
,
&
rt5645_if1_dac0_tdm_sel_mux
),
SND_SOC_DAPM_MUX
(
"RT5645 IF1 DAC1 R Mux"
,
SND_SOC_NOPM
,
0
,
0
,
&
rt5645_if1_dac1_tdm_sel_mux
),
SND_SOC_DAPM_MUX
(
"RT5645 IF1 DAC2 L Mux"
,
SND_SOC_NOPM
,
0
,
0
,
&
rt5645_if1_dac2_tdm_sel_mux
),
SND_SOC_DAPM_MUX
(
"RT5645 IF1 DAC2 R Mux"
,
SND_SOC_NOPM
,
0
,
0
,
&
rt5645_if1_dac3_tdm_sel_mux
),
SND_SOC_DAPM_PGA
(
"IF1 ADC"
,
SND_SOC_NOPM
,
0
,
0
,
NULL
,
0
),
SND_SOC_DAPM_PGA
(
"IF1 ADC L"
,
SND_SOC_NOPM
,
0
,
0
,
NULL
,
0
),
SND_SOC_DAPM_PGA
(
"IF1 ADC R"
,
SND_SOC_NOPM
,
0
,
0
,
NULL
,
0
),
...
...
@@ -1854,6 +1901,26 @@ static const struct snd_soc_dapm_widget rt5645_dapm_widgets[] = {
SND_SOC_DAPM_OUTPUT
(
"PDM1R"
),
SND_SOC_DAPM_OUTPUT
(
"SPOL"
),
SND_SOC_DAPM_OUTPUT
(
"SPOR"
),
SND_SOC_DAPM_POST
(
"DAPM_POST"
,
rt5650_hp_event
),
};
static
const
struct
snd_soc_dapm_widget
rt5645_specific_dapm_widgets
[]
=
{
SND_SOC_DAPM_MUX
(
"RT5645 IF1 DAC1 L Mux"
,
SND_SOC_NOPM
,
0
,
0
,
&
rt5645_if1_dac0_tdm_sel_mux
),
SND_SOC_DAPM_MUX
(
"RT5645 IF1 DAC1 R Mux"
,
SND_SOC_NOPM
,
0
,
0
,
&
rt5645_if1_dac1_tdm_sel_mux
),
SND_SOC_DAPM_MUX
(
"RT5645 IF1 DAC2 L Mux"
,
SND_SOC_NOPM
,
0
,
0
,
&
rt5645_if1_dac2_tdm_sel_mux
),
SND_SOC_DAPM_MUX
(
"RT5645 IF1 DAC2 R Mux"
,
SND_SOC_NOPM
,
0
,
0
,
&
rt5645_if1_dac3_tdm_sel_mux
),
SND_SOC_DAPM_MUX
(
"RT5645 IF1 ADC Mux"
,
SND_SOC_NOPM
,
0
,
0
,
&
rt5645_if1_adc_in_mux
),
SND_SOC_DAPM_MUX
(
"RT5645 IF1 ADC1 Swap Mux"
,
SND_SOC_NOPM
,
0
,
0
,
&
rt5645_if1_adc1_in_mux
),
SND_SOC_DAPM_MUX
(
"RT5645 IF1 ADC2 Swap Mux"
,
SND_SOC_NOPM
,
0
,
0
,
&
rt5645_if1_adc2_in_mux
),
SND_SOC_DAPM_MUX
(
"RT5645 IF1 ADC3 Swap Mux"
,
SND_SOC_NOPM
,
0
,
0
,
&
rt5645_if1_adc3_in_mux
),
};
static
const
struct
snd_soc_dapm_widget
rt5650_specific_dapm_widgets
[]
=
{
...
...
@@ -2642,7 +2709,7 @@ static int rt5645_set_bias_level(struct snd_soc_codec *codec,
switch
(
level
)
{
case
SND_SOC_BIAS_PREPARE
:
if
(
SND_SOC_BIAS_STANDBY
==
codec
->
dapm
.
bias_level
)
{
if
(
SND_SOC_BIAS_STANDBY
==
snd_soc_codec_get_bias_level
(
codec
)
)
{
snd_soc_update_bits
(
codec
,
RT5645_PWR_ANLG1
,
RT5645_PWR_VREF1
|
RT5645_PWR_MB
|
RT5645_PWR_BG
|
RT5645_PWR_VREF2
,
...
...
@@ -2686,94 +2753,15 @@ static int rt5645_set_bias_level(struct snd_soc_codec *codec,
return
0
;
}
static
int
rt5650_calibration
(
struct
rt5645_priv
*
rt5645
)
{
int
val
,
i
;
int
ret
=
-
1
;
regcache_cache_bypass
(
rt5645
->
regmap
,
true
);
regmap_write
(
rt5645
->
regmap
,
RT5645_RESET
,
0
);
regmap_write
(
rt5645
->
regmap
,
RT5645_GEN_CTRL3
,
0x0800
);
regmap_write
(
rt5645
->
regmap
,
RT5645_PR_BASE
+
RT5645_CHOP_DAC_ADC
,
0x3600
);
regmap_write
(
rt5645
->
regmap
,
RT5645_PR_BASE
+
0x25
,
0x7000
);
regmap_write
(
rt5645
->
regmap
,
RT5645_I2S1_SDP
,
0x8008
);
/* headset type */
regmap_write
(
rt5645
->
regmap
,
RT5645_GEN_CTRL1
,
0x2061
);
regmap_write
(
rt5645
->
regmap
,
RT5645_CHARGE_PUMP
,
0x0006
);
regmap_write
(
rt5645
->
regmap
,
RT5645_PWR_ANLG1
,
0x2012
);
regmap_write
(
rt5645
->
regmap
,
RT5645_PWR_MIXER
,
0x0002
);
regmap_write
(
rt5645
->
regmap
,
RT5645_PWR_VOL
,
0x0020
);
regmap_write
(
rt5645
->
regmap
,
RT5645_JD_CTRL3
,
0x00f0
);
regmap_write
(
rt5645
->
regmap
,
RT5645_IN1_CTRL1
,
0x0006
);
regmap_write
(
rt5645
->
regmap
,
RT5645_IN1_CTRL2
,
0x1827
);
regmap_write
(
rt5645
->
regmap
,
RT5645_IN1_CTRL2
,
0x0827
);
msleep
(
400
);
/* Inline command */
regmap_write
(
rt5645
->
regmap
,
RT5645_DEPOP_M1
,
0x0001
);
regmap_write
(
rt5645
->
regmap
,
RT5650_4BTN_IL_CMD2
,
0xc000
);
regmap_write
(
rt5645
->
regmap
,
RT5650_4BTN_IL_CMD1
,
0x0008
);
/* Calbration */
regmap_write
(
rt5645
->
regmap
,
RT5645_GLB_CLK
,
0x8000
);
regmap_write
(
rt5645
->
regmap
,
RT5645_DEPOP_M1
,
0x0000
);
regmap_write
(
rt5645
->
regmap
,
RT5650_4BTN_IL_CMD2
,
0xc000
);
regmap_write
(
rt5645
->
regmap
,
RT5650_4BTN_IL_CMD1
,
0x0008
);
regmap_write
(
rt5645
->
regmap
,
RT5645_PWR_DIG2
,
0x8800
);
regmap_write
(
rt5645
->
regmap
,
RT5645_PWR_ANLG1
,
0xe8fa
);
regmap_write
(
rt5645
->
regmap
,
RT5645_PWR_ANLG2
,
0x8c04
);
regmap_write
(
rt5645
->
regmap
,
RT5645_DEPOP_M2
,
0x3100
);
regmap_write
(
rt5645
->
regmap
,
RT5645_CHARGE_PUMP
,
0x0e06
);
regmap_write
(
rt5645
->
regmap
,
RT5645_BASS_BACK
,
0x8a13
);
regmap_write
(
rt5645
->
regmap
,
RT5645_GEN_CTRL3
,
0x0820
);
regmap_write
(
rt5645
->
regmap
,
RT5645_DEPOP_M1
,
0x000d
);
/* Power on and Calbration */
regmap_write
(
rt5645
->
regmap
,
RT5645_PR_BASE
+
RT5645_HP_DCC_INT1
,
0x9f01
);
msleep
(
200
);
for
(
i
=
0
;
i
<
5
;
i
++
)
{
regmap_read
(
rt5645
->
regmap
,
RT5645_PR_BASE
+
0x7a
,
&
val
);
if
(
val
!=
0
&&
val
!=
0x3f3f
)
{
ret
=
0
;
break
;
}
msleep
(
50
);
}
pr_debug
(
"%s: PR-7A = 0x%x
\n
"
,
__func__
,
val
);
/* mute */
regmap_write
(
rt5645
->
regmap
,
RT5645_PR_BASE
+
0x3e
,
0x7400
);
regmap_write
(
rt5645
->
regmap
,
RT5645_DEPOP_M3
,
0x0737
);
regmap_write
(
rt5645
->
regmap
,
RT5645_PR_BASE
+
RT5645_MAMP_INT_REG2
,
0xfc00
);
regmap_write
(
rt5645
->
regmap
,
RT5645_DEPOP_M2
,
0x1140
);
regmap_write
(
rt5645
->
regmap
,
RT5645_DEPOP_M1
,
0x0000
);
regmap_write
(
rt5645
->
regmap
,
RT5645_GEN_CTRL2
,
0x4020
);
regmap_write
(
rt5645
->
regmap
,
RT5645_PWR_ANLG2
,
0x0006
);
regmap_write
(
rt5645
->
regmap
,
RT5645_PWR_DIG2
,
0x0000
);
msleep
(
350
);
regcache_cache_bypass
(
rt5645
->
regmap
,
false
);
return
ret
;
}
static
void
rt5645_enable_push_button_irq
(
struct
snd_soc_codec
*
codec
,
bool
enable
)
{
struct
rt5645_priv
*
rt5645
=
snd_soc_codec_get_drvdata
(
codec
);
struct
snd_soc_dapm_context
*
dapm
=
snd_soc_codec_get_dapm
(
codec
);
if
(
enable
)
{
snd_soc_dapm_mutex_lock
(
&
codec
->
dapm
);
snd_soc_dapm_force_enable_pin_unlocked
(
&
codec
->
dapm
,
"ADC L power"
);
snd_soc_dapm_force_enable_pin_unlocked
(
&
codec
->
dapm
,
"ADC R power"
);
snd_soc_dapm_force_enable_pin_unlocked
(
&
codec
->
dapm
,
"LDO2"
);
snd_soc_dapm_force_enable_pin_unlocked
(
&
codec
->
dapm
,
"Mic Det Power"
);
snd_soc_dapm_sync_unlocked
(
&
codec
->
dapm
);
snd_soc_dapm_mutex_unlock
(
&
codec
->
dapm
);
snd_soc_dapm_force_enable_pin
(
dapm
,
"ADC L power"
);
snd_soc_dapm_force_enable_pin
(
dapm
,
"ADC R power"
);
snd_soc_dapm_sync
(
dapm
);
snd_soc_update_bits
(
codec
,
RT5645_INT_IRQ_ST
,
0x8
,
0x8
);
...
...
@@ -2786,36 +2774,26 @@ static void rt5645_enable_push_button_irq(struct snd_soc_codec *codec,
snd_soc_update_bits
(
codec
,
RT5650_4BTN_IL_CMD2
,
0x8000
,
0x0
);
snd_soc_update_bits
(
codec
,
RT5645_INT_IRQ_ST
,
0x8
,
0x0
);
snd_soc_dapm_mutex_lock
(
&
codec
->
dapm
);
snd_soc_dapm_disable_pin_unlocked
(
&
codec
->
dapm
,
"ADC L power"
);
snd_soc_dapm_disable_pin_unlocked
(
&
codec
->
dapm
,
"ADC R power"
);
if
(
rt5645
->
pdata
.
jd_mode
==
0
)
snd_soc_dapm_disable_pin_unlocked
(
&
codec
->
dapm
,
"LDO2"
);
snd_soc_dapm_disable_pin_unlocked
(
&
codec
->
dapm
,
"Mic Det Power"
);
snd_soc_dapm_sync_unlocked
(
&
codec
->
dapm
);
snd_soc_dapm_mutex_unlock
(
&
codec
->
dapm
);
snd_soc_dapm_disable_pin
(
dapm
,
"ADC L power"
);
snd_soc_dapm_disable_pin
(
dapm
,
"ADC R power"
);
snd_soc_dapm_sync
(
dapm
);
}
}
static
int
rt5645_jack_detect
(
struct
snd_soc_codec
*
codec
,
int
jack_insert
)
{
struct
snd_soc_dapm_context
*
dapm
=
snd_soc_codec_get_dapm
(
codec
);
struct
rt5645_priv
*
rt5645
=
snd_soc_codec_get_drvdata
(
codec
);
unsigned
int
val
;
if
(
jack_insert
)
{
regmap_write
(
rt5645
->
regmap
,
RT5645_CHARGE_PUMP
,
0x0006
);
if
(
codec
->
component
.
card
->
instantiated
)
{
/* for jack type detect */
snd_soc_dapm_force_enable_pin
(
&
codec
->
dapm
,
"LDO2"
);
snd_soc_dapm_force_enable_pin
(
&
codec
->
dapm
,
"Mic Det Power"
);
snd_soc_dapm_sync
(
&
codec
->
dapm
);
}
else
{
/* for jack type detect */
snd_soc_dapm_force_enable_pin
(
dapm
,
"LDO2"
);
snd_soc_dapm_force_enable_pin
(
dapm
,
"Mic Det Power"
);
snd_soc_dapm_sync
(
dapm
);
if
(
!
dapm
->
card
->
instantiated
)
{
/* Power up necessary bits for JD if dapm is
not ready yet */
regmap_update_bits
(
rt5645
->
regmap
,
RT5645_PWR_ANLG1
,
...
...
@@ -2828,14 +2806,15 @@ static int rt5645_jack_detect(struct snd_soc_codec *codec, int jack_insert)
}
regmap_write
(
rt5645
->
regmap
,
RT5645_JD_CTRL3
,
0x00f0
);
regmap_write
(
rt5645
->
regmap
,
RT5645_IN1_CTRL1
,
0x0006
);
regmap_update_bits
(
rt5645
->
regmap
,
RT5645_IN1_CTRL2
,
0x1000
,
0x1000
);
regmap_update_bits
(
rt5645
->
regmap
,
RT5645_IN1_CTRL2
,
RT5645_CBJ_MN_JD
,
RT5645_CBJ_MN_JD
);
regmap_update_bits
(
rt5645
->
regmap
,
RT5645_IN1_CTRL1
,
RT5645_CBJ_BST1_EN
,
RT5645_CBJ_BST1_EN
);
msleep
(
100
);
regmap_update_bits
(
rt5645
->
regmap
,
RT5645_IN1_CTRL2
,
0x1000
,
0x000
0
);
regmap_update_bits
(
rt5645
->
regmap
,
RT5645_IN1_CTRL2
,
RT5645_CBJ_MN_JD
,
0
);
msleep
(
45
0
);
msleep
(
60
0
);
regmap_read
(
rt5645
->
regmap
,
RT5645_IN1_CTRL3
,
&
val
);
val
&=
0x7
;
dev_dbg
(
codec
->
dev
,
"val = %d
\n
"
,
val
);
...
...
@@ -2846,43 +2825,46 @@ static int rt5645_jack_detect(struct snd_soc_codec *codec, int jack_insert)
rt5645_enable_push_button_irq
(
codec
,
true
);
}
}
else
{
if
(
codec
->
component
.
card
->
instantiated
)
{
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"Mic Det Power"
);
snd_soc_dapm_sync
(
&
codec
->
dapm
);
}
else
regmap_update_bits
(
rt5645
->
regmap
,
RT5645_PWR_VOL
,
RT5645_PWR_MIC_DET
,
0
);
snd_soc_dapm_disable_pin
(
dapm
,
"Mic Det Power"
);
snd_soc_dapm_sync
(
dapm
);
rt5645
->
jack_type
=
SND_JACK_HEADPHONE
;
}
snd_soc_update_bits
(
codec
,
RT5645_CHARGE_PUMP
,
0x0300
,
0x0200
);
snd_soc_write
(
codec
,
RT5645_DEPOP_M1
,
0x001d
);
snd_soc_write
(
codec
,
RT5645_DEPOP_M1
,
0x0001
);
}
else
{
/* jack out */
rt5645
->
jack_type
=
0
;
regmap_update_bits
(
rt5645
->
regmap
,
RT5645_IN1_CTRL2
,
RT5645_CBJ_MN_JD
,
RT5645_CBJ_MN_JD
);
regmap_update_bits
(
rt5645
->
regmap
,
RT5645_IN1_CTRL1
,
RT5645_CBJ_BST1_EN
,
0
);
if
(
rt5645
->
en_button_func
)
rt5645_enable_push_button_irq
(
codec
,
false
);
else
{
if
(
codec
->
component
.
card
->
instantiated
)
{
if
(
rt5645
->
pdata
.
jd_mode
==
0
)
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"LDO2"
);
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"Mic Det Power"
);
snd_soc_dapm_sync
(
&
codec
->
dapm
);
}
else
{
if
(
rt5645
->
pdata
.
jd_mode
==
0
)
regmap_update_bits
(
rt5645
->
regmap
,
RT5645_PWR_MIXER
,
RT5645_PWR_LDO2
,
0
);
regmap_update_bits
(
rt5645
->
regmap
,
RT5645_PWR_VOL
,
RT5645_PWR_MIC_DET
,
0
);
}
}
if
(
rt5645
->
pdata
.
jd_mode
==
0
)
snd_soc_dapm_disable_pin
(
dapm
,
"LDO2"
);
snd_soc_dapm_disable_pin
(
dapm
,
"Mic Det Power"
);
snd_soc_dapm_sync
(
dapm
);
}
return
rt5645
->
jack_type
;
}
static
int
rt5645_irq_detection
(
struct
rt5645_priv
*
rt5645
);
static
int
rt5645_button_detect
(
struct
snd_soc_codec
*
codec
)
{
int
btn_type
,
val
;
val
=
snd_soc_read
(
codec
,
RT5650_4BTN_IL_CMD1
);
pr_debug
(
"val=0x%x
\n
"
,
val
);
btn_type
=
val
&
0xfff0
;
snd_soc_write
(
codec
,
RT5650_4BTN_IL_CMD1
,
val
);
return
btn_type
;
}
static
irqreturn_t
rt5645_irq
(
int
irq
,
void
*
data
);
int
rt5645_set_jack_detect
(
struct
snd_soc_codec
*
codec
,
...
...
@@ -2913,38 +2895,10 @@ static void rt5645_jack_detect_work(struct work_struct *work)
{
struct
rt5645_priv
*
rt5645
=
container_of
(
work
,
struct
rt5645_priv
,
jack_detect_work
.
work
);
rt5645_irq_detection
(
rt5645
);
}
static
irqreturn_t
rt5645_irq
(
int
irq
,
void
*
data
)
{
struct
rt5645_priv
*
rt5645
=
data
;
queue_delayed_work
(
system_power_efficient_wq
,
&
rt5645
->
jack_detect_work
,
msecs_to_jiffies
(
250
));
return
IRQ_HANDLED
;
}
static
int
rt5645_button_detect
(
struct
snd_soc_codec
*
codec
)
{
int
btn_type
,
val
;
val
=
snd_soc_read
(
codec
,
RT5650_4BTN_IL_CMD1
);
pr_debug
(
"val=0x%x
\n
"
,
val
);
btn_type
=
val
&
0xfff0
;
snd_soc_write
(
codec
,
RT5650_4BTN_IL_CMD1
,
val
);
return
btn_type
;
}
static
int
rt5645_irq_detection
(
struct
rt5645_priv
*
rt5645
)
{
int
val
,
btn_type
,
gpio_state
=
0
,
report
=
0
;
if
(
!
rt5645
->
codec
)
return
-
EINVAL
;
return
;
switch
(
rt5645
->
pdata
.
jd_mode
)
{
case
0
:
/* Not using rt5645 JD */
...
...
@@ -2958,7 +2912,7 @@ static int rt5645_irq_detection(struct rt5645_priv *rt5645)
report
,
SND_JACK_HEADPHONE
);
snd_soc_jack_report
(
rt5645
->
mic_jack
,
report
,
SND_JACK_MICROPHONE
);
return
report
;
return
;
case
1
:
/* 2 port */
val
=
snd_soc_read
(
rt5645
->
codec
,
RT5645_A_JD_CTRL1
)
&
0x0070
;
break
;
...
...
@@ -3040,27 +2994,39 @@ static int rt5645_irq_detection(struct rt5645_priv *rt5645)
snd_soc_jack_report
(
rt5645
->
btn_jack
,
report
,
SND_JACK_BTN_0
|
SND_JACK_BTN_1
|
SND_JACK_BTN_2
|
SND_JACK_BTN_3
);
}
static
irqreturn_t
rt5645_irq
(
int
irq
,
void
*
data
)
{
struct
rt5645_priv
*
rt5645
=
data
;
queue_delayed_work
(
system_power_efficient_wq
,
&
rt5645
->
jack_detect_work
,
msecs_to_jiffies
(
250
));
return
report
;
return
IRQ_HANDLED
;
}
static
int
rt5645_probe
(
struct
snd_soc_codec
*
codec
)
{
struct
snd_soc_dapm_context
*
dapm
=
snd_soc_codec_get_dapm
(
codec
);
struct
rt5645_priv
*
rt5645
=
snd_soc_codec_get_drvdata
(
codec
);
rt5645
->
codec
=
codec
;
switch
(
rt5645
->
codec_type
)
{
case
CODEC_TYPE_RT5645
:
snd_soc_dapm_add_routes
(
&
codec
->
dapm
,
snd_soc_dapm_new_controls
(
dapm
,
rt5645_specific_dapm_widgets
,
ARRAY_SIZE
(
rt5645_specific_dapm_widgets
));
snd_soc_dapm_add_routes
(
dapm
,
rt5645_specific_dapm_routes
,
ARRAY_SIZE
(
rt5645_specific_dapm_routes
));
break
;
case
CODEC_TYPE_RT5650
:
snd_soc_dapm_new_controls
(
&
codec
->
dapm
,
snd_soc_dapm_new_controls
(
dapm
,
rt5650_specific_dapm_widgets
,
ARRAY_SIZE
(
rt5650_specific_dapm_widgets
));
snd_soc_dapm_add_routes
(
&
codec
->
dapm
,
snd_soc_dapm_add_routes
(
dapm
,
rt5650_specific_dapm_routes
,
ARRAY_SIZE
(
rt5650_specific_dapm_routes
));
break
;
...
...
@@ -3070,9 +3036,9 @@ static int rt5645_probe(struct snd_soc_codec *codec)
/* for JD function */
if
(
rt5645
->
pdata
.
jd_mode
)
{
snd_soc_dapm_force_enable_pin
(
&
codec
->
dapm
,
"JD Power"
);
snd_soc_dapm_force_enable_pin
(
&
codec
->
dapm
,
"LDO2"
);
snd_soc_dapm_sync
(
&
codec
->
dapm
);
snd_soc_dapm_force_enable_pin
(
dapm
,
"JD Power"
);
snd_soc_dapm_force_enable_pin
(
dapm
,
"LDO2"
);
snd_soc_dapm_sync
(
dapm
);
}
return
0
;
...
...
@@ -3224,7 +3190,7 @@ static int strago_quirk_cb(const struct dmi_system_id *id)
return
1
;
}
static
struct
dmi_system_id
dmi_platform_intel_braswell
[]
=
{
static
const
struct
dmi_system_id
dmi_platform_intel_braswell
[]
=
{
{
.
ident
=
"Intel Strago"
,
.
callback
=
strago_quirk_cb
,
...
...
@@ -3261,7 +3227,7 @@ static int rt5645_i2c_probe(struct i2c_client *i2c,
{
struct
rt5645_platform_data
*
pdata
=
dev_get_platdata
(
&
i2c
->
dev
);
struct
rt5645_priv
*
rt5645
;
int
ret
;
int
ret
,
i
;
unsigned
int
val
;
rt5645
=
devm_kzalloc
(
&
i2c
->
dev
,
sizeof
(
struct
rt5645_priv
),
...
...
@@ -3295,6 +3261,24 @@ static int rt5645_i2c_probe(struct i2c_client *i2c,
return
ret
;
}
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
rt5645
->
supplies
);
i
++
)
rt5645
->
supplies
[
i
].
supply
=
rt5645_supply_names
[
i
];
ret
=
devm_regulator_bulk_get
(
&
i2c
->
dev
,
ARRAY_SIZE
(
rt5645
->
supplies
),
rt5645
->
supplies
);
if
(
ret
)
{
dev_err
(
&
i2c
->
dev
,
"Failed to request supplies: %d
\n
"
,
ret
);
return
ret
;
}
ret
=
regulator_bulk_enable
(
ARRAY_SIZE
(
rt5645
->
supplies
),
rt5645
->
supplies
);
if
(
ret
)
{
dev_err
(
&
i2c
->
dev
,
"Failed to enable supplies: %d
\n
"
,
ret
);
return
ret
;
}
regmap_read
(
rt5645
->
regmap
,
RT5645_VENDOR_ID2
,
&
val
);
switch
(
val
)
{
...
...
@@ -3306,16 +3290,10 @@ static int rt5645_i2c_probe(struct i2c_client *i2c,
break
;
default:
dev_err
(
&
i2c
->
dev
,
"Device with ID register %x is not rt5645 or rt5650
\n
"
,
"Device with ID register %
#
x is not rt5645 or rt5650
\n
"
,
val
);
return
-
ENODEV
;
}
if
(
rt5645
->
codec_type
==
CODEC_TYPE_RT5650
)
{
ret
=
rt5650_calibration
(
rt5645
);
if
(
ret
<
0
)
pr_err
(
"calibration failed!
\n
"
);
ret
=
-
ENODEV
;
goto
err_enable
;
}
regmap_write
(
rt5645
->
regmap
,
RT5645_RESET
,
0
);
...
...
@@ -3405,8 +3383,6 @@ static int rt5645_i2c_probe(struct i2c_client *i2c,
regmap_update_bits
(
rt5645
->
regmap
,
RT5645_GEN_CTRL3
,
RT5645_IRQ_CLK_GATE_CTRL
,
RT5645_IRQ_CLK_GATE_CTRL
);
regmap_update_bits
(
rt5645
->
regmap
,
RT5645_IN1_CTRL1
,
RT5645_CBJ_BST1_EN
,
RT5645_CBJ_BST1_EN
);
regmap_update_bits
(
rt5645
->
regmap
,
RT5645_MICBIAS
,
RT5645_IRQ_CLK_INT
,
RT5645_IRQ_CLK_INT
);
regmap_update_bits
(
rt5645
->
regmap
,
RT5645_IRQ_CTRL2
,
...
...
@@ -3446,12 +3422,25 @@ static int rt5645_i2c_probe(struct i2c_client *i2c,
ret
=
request_threaded_irq
(
rt5645
->
i2c
->
irq
,
NULL
,
rt5645_irq
,
IRQF_TRIGGER_RISING
|
IRQF_TRIGGER_FALLING
|
IRQF_ONESHOT
,
"rt5645"
,
rt5645
);
if
(
ret
)
if
(
ret
)
{
dev_err
(
&
i2c
->
dev
,
"Failed to reguest IRQ: %d
\n
"
,
ret
);
goto
err_enable
;
}
}
return
snd_soc_register_codec
(
&
i2c
->
dev
,
&
soc_codec_dev_rt5645
,
rt5645_dai
,
ARRAY_SIZE
(
rt5645_dai
));
ret
=
snd_soc_register_codec
(
&
i2c
->
dev
,
&
soc_codec_dev_rt5645
,
rt5645_dai
,
ARRAY_SIZE
(
rt5645_dai
));
if
(
ret
)
goto
err_irq
;
return
0
;
err_irq:
if
(
rt5645
->
i2c
->
irq
)
free_irq
(
rt5645
->
i2c
->
irq
,
rt5645
);
err_enable:
regulator_bulk_disable
(
ARRAY_SIZE
(
rt5645
->
supplies
),
rt5645
->
supplies
);
return
ret
;
}
static
int
rt5645_i2c_remove
(
struct
i2c_client
*
i2c
)
...
...
@@ -3464,10 +3453,23 @@ static int rt5645_i2c_remove(struct i2c_client *i2c)
cancel_delayed_work_sync
(
&
rt5645
->
jack_detect_work
);
snd_soc_unregister_codec
(
&
i2c
->
dev
);
regulator_bulk_disable
(
ARRAY_SIZE
(
rt5645
->
supplies
),
rt5645
->
supplies
);
return
0
;
}
static
void
rt5645_i2c_shutdown
(
struct
i2c_client
*
i2c
)
{
struct
rt5645_priv
*
rt5645
=
i2c_get_clientdata
(
i2c
);
regmap_update_bits
(
rt5645
->
regmap
,
RT5645_GEN_CTRL3
,
RT5645_RING2_SLEEVE_GND
,
RT5645_RING2_SLEEVE_GND
);
regmap_update_bits
(
rt5645
->
regmap
,
RT5645_IN1_CTRL2
,
RT5645_CBJ_MN_JD
,
RT5645_CBJ_MN_JD
);
regmap_update_bits
(
rt5645
->
regmap
,
RT5645_IN1_CTRL1
,
RT5645_CBJ_BST1_EN
,
0
);
}
static
struct
i2c_driver
rt5645_i2c_driver
=
{
.
driver
=
{
.
name
=
"rt5645"
,
...
...
@@ -3475,7 +3477,8 @@ static struct i2c_driver rt5645_i2c_driver = {
.
acpi_match_table
=
ACPI_PTR
(
rt5645_acpi_match
),
},
.
probe
=
rt5645_i2c_probe
,
.
remove
=
rt5645_i2c_remove
,
.
remove
=
rt5645_i2c_remove
,
.
shutdown
=
rt5645_i2c_shutdown
,
.
id_table
=
rt5645_i2c_id
,
};
module_i2c_driver
(
rt5645_i2c_driver
);
...
...
sound/soc/codecs/rt5645.h
浏览文件 @
cb42e0f7
...
...
@@ -2115,6 +2115,7 @@ enum {
#define RT5645_JD_PSV_MODE (0x1 << 12)
#define RT5645_IRQ_CLK_GATE_CTRL (0x1 << 11)
#define RT5645_MICINDET_MANU (0x1 << 7)
#define RT5645_RING2_SLEEVE_GND (0x1 << 5)
/* Vendor ID (0xfd) */
#define RT5645_VER_C 0x2
...
...
@@ -2181,32 +2182,6 @@ enum {
int
rt5645_sel_asrc_clk_src
(
struct
snd_soc_codec
*
codec
,
unsigned
int
filter_mask
,
unsigned
int
clk_src
);
struct
rt5645_priv
{
struct
snd_soc_codec
*
codec
;
struct
rt5645_platform_data
pdata
;
struct
regmap
*
regmap
;
struct
i2c_client
*
i2c
;
struct
gpio_desc
*
gpiod_hp_det
;
struct
snd_soc_jack
*
hp_jack
;
struct
snd_soc_jack
*
mic_jack
;
struct
snd_soc_jack
*
btn_jack
;
struct
delayed_work
jack_detect_work
;
int
codec_type
;
int
sysclk
;
int
sysclk_src
;
int
lrck
[
RT5645_AIFS
];
int
bclk
[
RT5645_AIFS
];
int
master
[
RT5645_AIFS
];
int
pll_src
;
int
pll_in
;
int
pll_out
;
int
jack_type
;
bool
en_button_func
;
};
int
rt5645_set_jack_detect
(
struct
snd_soc_codec
*
codec
,
struct
snd_soc_jack
*
hp_jack
,
struct
snd_soc_jack
*
mic_jack
,
struct
snd_soc_jack
*
btn_jack
);
...
...
sound/soc/codecs/tas571x.c
浏览文件 @
cb42e0f7
...
...
@@ -179,7 +179,7 @@ static int tas571x_set_bias_level(struct snd_soc_codec *codec,
case
SND_SOC_BIAS_PREPARE
:
break
;
case
SND_SOC_BIAS_STANDBY
:
if
(
codec
->
dapm
.
bias_level
==
SND_SOC_BIAS_OFF
)
{
if
(
snd_soc_codec_get_bias_level
(
codec
)
==
SND_SOC_BIAS_OFF
)
{
if
(
!
IS_ERR
(
priv
->
mclk
))
{
ret
=
clk_prepare_enable
(
priv
->
mclk
);
if
(
ret
)
{
...
...
sound/soc/intel/boards/cht_bsw_max98090_ti.c
浏览文件 @
cb42e0f7
...
...
@@ -104,21 +104,17 @@ static int cht_aif1_hw_params(struct snd_pcm_substream *substream,
static
int
cht_ti_jack_event
(
struct
notifier_block
*
nb
,
unsigned
long
event
,
void
*
data
)
{
struct
snd_soc_jack
*
jack
=
(
struct
snd_soc_jack
*
)
data
;
struct
snd_soc_dai
*
codec_dai
=
jack
->
card
->
rtd
->
codec_dai
;
struct
snd_soc_codec
*
codec
=
codec_dai
->
codec
;
struct
snd_soc_dapm_context
*
dapm
=
&
jack
->
card
->
dapm
;
if
(
event
&
SND_JACK_MICROPHONE
)
{
snd_soc_dapm_force_enable_pin
(
&
codec
->
dapm
,
"SHDN"
);
snd_soc_dapm_force_enable_pin
(
&
codec
->
dapm
,
"MICBIAS"
);
snd_soc_dapm_sync
(
&
codec
->
dapm
);
snd_soc_dapm_force_enable_pin
(
dapm
,
"SHDN"
);
snd_soc_dapm_force_enable_pin
(
dapm
,
"MICBIAS"
);
snd_soc_dapm_sync
(
dapm
);
}
else
{
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"MICBIAS"
);
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"SHDN"
);
snd_soc_dapm_sync
(
&
codec
->
dapm
);
snd_soc_dapm_disable_pin
(
dapm
,
"MICBIAS"
);
snd_soc_dapm_disable_pin
(
dapm
,
"SHDN"
);
snd_soc_dapm_sync
(
dapm
);
}
return
0
;
...
...
sound/soc/omap/omap3pandora.c
浏览文件 @
cb42e0f7
...
...
@@ -154,8 +154,7 @@ static const struct snd_soc_dapm_route omap3pandora_map[] = {
static
int
omap3pandora_out_init
(
struct
snd_soc_pcm_runtime
*
rtd
)
{
struct
snd_soc_codec
*
codec
=
rtd
->
codec
;
struct
snd_soc_dapm_context
*
dapm
=
&
codec
->
dapm
;
struct
snd_soc_dapm_context
*
dapm
=
&
rtd
->
card
->
dapm
;
/* All TWL4030 output pins are floating */
snd_soc_dapm_nc_pin
(
dapm
,
"EARPIECE"
);
...
...
@@ -174,8 +173,7 @@ static int omap3pandora_out_init(struct snd_soc_pcm_runtime *rtd)
static
int
omap3pandora_in_init
(
struct
snd_soc_pcm_runtime
*
rtd
)
{
struct
snd_soc_codec
*
codec
=
rtd
->
codec
;
struct
snd_soc_dapm_context
*
dapm
=
&
codec
->
dapm
;
struct
snd_soc_dapm_context
*
dapm
=
&
rtd
->
card
->
dapm
;
/* Not comnnected */
snd_soc_dapm_nc_pin
(
dapm
,
"HSMIC"
);
...
...
sound/soc/soc-core.c
浏览文件 @
cb42e0f7
...
...
@@ -654,10 +654,12 @@ int snd_soc_suspend(struct device *dev)
/* suspend all CODECs */
list_for_each_entry
(
codec
,
&
card
->
codec_dev_list
,
card_list
)
{
struct
snd_soc_dapm_context
*
dapm
=
snd_soc_codec_get_dapm
(
codec
);
/* If there are paths active then the CODEC will be held with
* bias _ON and should not be suspended. */
if
(
!
codec
->
suspended
)
{
switch
(
codec
->
dapm
.
bias_level
)
{
switch
(
snd_soc_dapm_get_bias_level
(
dapm
)
)
{
case
SND_SOC_BIAS_STANDBY
:
/*
* If the CODEC is capable of idle
...
...
@@ -665,7 +667,7 @@ int snd_soc_suspend(struct device *dev)
* means it's doing something,
* otherwise fall through.
*/
if
(
codec
->
dapm
.
idle_bias_off
)
{
if
(
dapm
->
idle_bias_off
)
{
dev_dbg
(
codec
->
dev
,
"ASoC: idle_bias_off CODEC on over suspend
\n
"
);
break
;
...
...
@@ -2662,10 +2664,7 @@ static int snd_soc_component_initialize(struct snd_soc_component *component,
component
->
probe
=
component
->
driver
->
probe
;
component
->
remove
=
component
->
driver
->
remove
;
if
(
!
component
->
dapm_ptr
)
component
->
dapm_ptr
=
&
component
->
dapm
;
dapm
=
component
->
dapm_ptr
;
dapm
=
&
component
->
dapm
;
dapm
->
dev
=
dev
;
dapm
->
component
=
component
;
dapm
->
bias_level
=
SND_SOC_BIAS_OFF
;
...
...
@@ -3047,6 +3046,7 @@ int snd_soc_register_codec(struct device *dev,
struct
snd_soc_dai_driver
*
dai_drv
,
int
num_dai
)
{
struct
snd_soc_dapm_context
*
dapm
;
struct
snd_soc_codec
*
codec
;
struct
snd_soc_dai
*
dai
;
int
ret
,
i
;
...
...
@@ -3057,7 +3057,6 @@ int snd_soc_register_codec(struct device *dev,
if
(
codec
==
NULL
)
return
-
ENOMEM
;
codec
->
component
.
dapm_ptr
=
&
codec
->
dapm
;
codec
->
component
.
codec
=
codec
;
ret
=
snd_soc_component_initialize
(
&
codec
->
component
,
...
...
@@ -3087,12 +3086,14 @@ int snd_soc_register_codec(struct device *dev,
if
(
codec_drv
->
read
)
codec
->
component
.
read
=
snd_soc_codec_drv_read
;
codec
->
component
.
ignore_pmdown_time
=
codec_drv
->
ignore_pmdown_time
;
codec
->
dapm
.
idle_bias_off
=
codec_drv
->
idle_bias_off
;
codec
->
dapm
.
suspend_bias_off
=
codec_drv
->
suspend_bias_off
;
dapm
=
snd_soc_codec_get_dapm
(
codec
);
dapm
->
idle_bias_off
=
codec_drv
->
idle_bias_off
;
dapm
->
suspend_bias_off
=
codec_drv
->
suspend_bias_off
;
if
(
codec_drv
->
seq_notifier
)
codec
->
dapm
.
seq_notifier
=
codec_drv
->
seq_notifier
;
dapm
->
seq_notifier
=
codec_drv
->
seq_notifier
;
if
(
codec_drv
->
set_bias_level
)
codec
->
dapm
.
set_bias_level
=
snd_soc_codec_set_bias_level
;
dapm
->
set_bias_level
=
snd_soc_codec_set_bias_level
;
codec
->
dev
=
dev
;
codec
->
driver
=
codec_drv
;
codec
->
component
.
val_bytes
=
codec_drv
->
reg_word_size
;
...
...
sound/soc/soc-dapm.c
浏览文件 @
cb42e0f7
...
...
@@ -2163,14 +2163,16 @@ int snd_soc_dapm_mixer_update_power(struct snd_soc_dapm_context *dapm,
}
EXPORT_SYMBOL_GPL
(
snd_soc_dapm_mixer_update_power
);
static
ssize_t
dapm_widget_show_codec
(
struct
snd_soc_codec
*
codec
,
char
*
buf
)
static
ssize_t
dapm_widget_show_component
(
struct
snd_soc_component
*
cmpnt
,
char
*
buf
)
{
struct
snd_soc_dapm_context
*
dapm
=
snd_soc_component_get_dapm
(
cmpnt
);
struct
snd_soc_dapm_widget
*
w
;
int
count
=
0
;
char
*
state
=
"not set"
;
list_for_each_entry
(
w
,
&
c
odec
->
component
.
card
->
widgets
,
list
)
{
if
(
w
->
dapm
!=
&
codec
->
dapm
)
list_for_each_entry
(
w
,
&
c
mpnt
->
card
->
widgets
,
list
)
{
if
(
w
->
dapm
!=
dapm
)
continue
;
/* only display widgets that burnm power */
...
...
@@ -2198,7 +2200,7 @@ static ssize_t dapm_widget_show_codec(struct snd_soc_codec *codec, char *buf)
}
}
switch
(
codec
->
dapm
.
bias_level
)
{
switch
(
snd_soc_dapm_get_bias_level
(
dapm
)
)
{
case
SND_SOC_BIAS_ON
:
state
=
"On"
;
break
;
...
...
@@ -2227,8 +2229,9 @@ static ssize_t dapm_widget_show(struct device *dev,
mutex_lock
(
&
rtd
->
card
->
dapm_mutex
);
for
(
i
=
0
;
i
<
rtd
->
num_codecs
;
i
++
)
{
struct
snd_soc_codec
*
codec
=
rtd
->
codec_dais
[
i
]
->
codec
;
count
+=
dapm_widget_show_codec
(
codec
,
buf
+
count
);
struct
snd_soc_component
*
cmpnt
=
rtd
->
codec_dais
[
i
]
->
component
;
count
+=
dapm_widget_show_component
(
cmpnt
,
buf
+
count
);
}
mutex_unlock
(
&
rtd
->
card
->
dapm_mutex
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录