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
cb42e0f7
Commit
cb42e0f7
authored
Aug 30, 2015
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'asoc/topic/rt5645' into asoc-next
parents
ca945cf9
f2988afe
Changes
8
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
244 additions
and
272 deletions
+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
No files found.
include/sound/soc.h
View file @
cb42e0f7
...
@@ -791,7 +791,6 @@ struct snd_soc_component {
...
@@ -791,7 +791,6 @@ struct snd_soc_component {
/* Don't use these, use snd_soc_component_get_dapm() */
/* Don't use these, use snd_soc_component_get_dapm() */
struct
snd_soc_dapm_context
dapm
;
struct
snd_soc_dapm_context
dapm
;
struct
snd_soc_dapm_context
*
dapm_ptr
;
const
struct
snd_kcontrol_new
*
controls
;
const
struct
snd_kcontrol_new
*
controls
;
unsigned
int
num_controls
;
unsigned
int
num_controls
;
...
@@ -831,9 +830,6 @@ struct snd_soc_codec {
...
@@ -831,9 +830,6 @@ struct snd_soc_codec {
/* component */
/* component */
struct
snd_soc_component
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
#ifdef CONFIG_DEBUG_FS
struct
dentry
*
debugfs_reg
;
struct
dentry
*
debugfs_reg
;
#endif
#endif
...
@@ -1276,7 +1272,7 @@ static inline struct snd_soc_component *snd_soc_dapm_to_component(
...
@@ -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
(
static
inline
struct
snd_soc_codec
*
snd_soc_dapm_to_codec
(
struct
snd_soc_dapm_context
*
dapm
)
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(
...
@@ -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
(
static
inline
struct
snd_soc_dapm_context
*
snd_soc_component_get_dapm
(
struct
snd_soc_component
*
component
)
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(
...
@@ -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
(
static
inline
struct
snd_soc_dapm_context
*
snd_soc_codec_get_dapm
(
struct
snd_soc_codec
*
codec
)
struct
snd_soc_codec
*
codec
)
{
{
return
&
codec
->
dapm
;
return
snd_soc_component_get_dapm
(
&
codec
->
component
)
;
}
}
/**
/**
...
...
sound/soc/codecs/rt5645.c
View file @
cb42e0f7
...
@@ -21,6 +21,7 @@
...
@@ -21,6 +21,7 @@
#include <linux/gpio/consumer.h>
#include <linux/gpio/consumer.h>
#include <linux/acpi.h>
#include <linux/acpi.h>
#include <linux/dmi.h>
#include <linux/dmi.h>
#include <linux/regulator/consumer.h>
#include <sound/core.h>
#include <sound/core.h>
#include <sound/pcm.h>
#include <sound/pcm.h>
#include <sound/pcm_params.h>
#include <sound/pcm_params.h>
...
@@ -223,6 +224,39 @@ static const struct reg_default rt5645_reg[] = {
...
@@ -223,6 +224,39 @@ static const struct reg_default rt5645_reg[] = {
{
0xff
,
0x6308
},
{
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
)
static
int
rt5645_reset
(
struct
snd_soc_codec
*
codec
)
{
{
return
snd_soc_write
(
codec
,
RT5645_RESET
,
0
);
return
snd_soc_write
(
codec
,
RT5645_RESET
,
0
);
...
@@ -360,6 +394,7 @@ static bool rt5645_readable_register(struct device *dev, unsigned int reg)
...
@@ -360,6 +394,7 @@ static bool rt5645_readable_register(struct device *dev, unsigned int reg)
case
RT5645_DEPOP_M1
:
case
RT5645_DEPOP_M1
:
case
RT5645_DEPOP_M2
:
case
RT5645_DEPOP_M2
:
case
RT5645_DEPOP_M3
:
case
RT5645_DEPOP_M3
:
case
RT5645_CHARGE_PUMP
:
case
RT5645_MICBIAS
:
case
RT5645_MICBIAS
:
case
RT5645_A_JD_CTRL1
:
case
RT5645_A_JD_CTRL1
:
case
RT5645_VAD_CTRL4
:
case
RT5645_VAD_CTRL4
:
...
@@ -1331,15 +1366,23 @@ static void hp_amp_power(struct snd_soc_codec *codec, int on)
...
@@ -1331,15 +1366,23 @@ static void hp_amp_power(struct snd_soc_codec *codec, int on)
if
(
on
)
{
if
(
on
)
{
if
(
hp_amp_power_count
<=
0
)
{
if
(
hp_amp_power_count
<=
0
)
{
if
(
rt5645
->
codec_type
==
CODEC_TYPE_RT5650
)
{
if
(
rt5645
->
codec_type
==
CODEC_TYPE_RT5650
)
{
snd_soc_write
(
codec
,
RT5645_DEPOP_M2
,
0x3100
);
snd_soc_write
(
codec
,
RT5645_CHARGE_PUMP
,
snd_soc_write
(
codec
,
RT5645_CHARGE_PUMP
,
0x0e06
);
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
+
regmap_write
(
rt5645
->
regmap
,
RT5645_PR_BASE
+
0x3e
,
0x7400
);
0x3e
,
0x7400
);
snd_soc_write
(
codec
,
RT5645_DEPOP_M3
,
0x0737
);
snd_soc_write
(
codec
,
RT5645_DEPOP_M3
,
0x0737
);
regmap_write
(
rt5645
->
regmap
,
RT5645_PR_BASE
+
regmap_write
(
rt5645
->
regmap
,
RT5645_PR_BASE
+
RT5645_MAMP_INT_REG2
,
0xfc00
);
RT5645_MAMP_INT_REG2
,
0xfc00
);
snd_soc_write
(
codec
,
RT5645_DEPOP_M2
,
0x1140
);
snd_soc_write
(
codec
,
RT5645_DEPOP_M2
,
0x1140
);
mdelay
(
5
);
rt5645
->
hp_on
=
true
;
}
else
{
}
else
{
/* depop parameters */
/* depop parameters */
snd_soc_update_bits
(
codec
,
RT5645_DEPOP_M2
,
snd_soc_update_bits
(
codec
,
RT5645_DEPOP_M2
,
...
@@ -1553,6 +1596,27 @@ static int rt5645_bst2_event(struct snd_soc_dapm_widget *w,
...
@@ -1553,6 +1596,27 @@ static int rt5645_bst2_event(struct snd_soc_dapm_widget *w,
return
0
;
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
[]
=
{
static
const
struct
snd_soc_dapm_widget
rt5645_dapm_widgets
[]
=
{
SND_SOC_DAPM_SUPPLY
(
"LDO2"
,
RT5645_PWR_MIXER
,
SND_SOC_DAPM_SUPPLY
(
"LDO2"
,
RT5645_PWR_MIXER
,
RT5645_PWR_LDO2_BIT
,
0
,
NULL
,
0
),
RT5645_PWR_LDO2_BIT
,
0
,
NULL
,
0
),
...
@@ -1697,15 +1761,6 @@ static const struct snd_soc_dapm_widget rt5645_dapm_widgets[] = {
...
@@ -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
),
SND_SOC_DAPM_PGA
(
"IF1_ADC4"
,
SND_SOC_NOPM
,
0
,
0
,
NULL
,
0
),
/* IF1 2 Mux */
/* 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
,
SND_SOC_DAPM_MUX
(
"IF2 ADC Mux"
,
SND_SOC_NOPM
,
0
,
0
,
&
rt5645_if2_adc_in_mux
),
0
,
0
,
&
rt5645_if2_adc_in_mux
),
...
@@ -1716,14 +1771,6 @@ static const struct snd_soc_dapm_widget rt5645_dapm_widgets[] = {
...
@@ -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 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 DAC2"
,
SND_SOC_NOPM
,
0
,
0
,
NULL
,
0
),
SND_SOC_DAPM_PGA
(
"IF1 DAC3"
,
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"
,
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 L"
,
SND_SOC_NOPM
,
0
,
0
,
NULL
,
0
),
SND_SOC_DAPM_PGA
(
"IF1 ADC R"
,
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[] = {
...
@@ -1854,6 +1901,26 @@ static const struct snd_soc_dapm_widget rt5645_dapm_widgets[] = {
SND_SOC_DAPM_OUTPUT
(
"PDM1R"
),
SND_SOC_DAPM_OUTPUT
(
"PDM1R"
),
SND_SOC_DAPM_OUTPUT
(
"SPOL"
),
SND_SOC_DAPM_OUTPUT
(
"SPOL"
),
SND_SOC_DAPM_OUTPUT
(
"SPOR"
),
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
[]
=
{
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,
...
@@ -2642,7 +2709,7 @@ static int rt5645_set_bias_level(struct snd_soc_codec *codec,
switch
(
level
)
{
switch
(
level
)
{
case
SND_SOC_BIAS_PREPARE
:
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
,
snd_soc_update_bits
(
codec
,
RT5645_PWR_ANLG1
,
RT5645_PWR_VREF1
|
RT5645_PWR_MB
|
RT5645_PWR_VREF1
|
RT5645_PWR_MB
|
RT5645_PWR_BG
|
RT5645_PWR_VREF2
,
RT5645_PWR_BG
|
RT5645_PWR_VREF2
,
...
@@ -2686,94 +2753,15 @@ static int rt5645_set_bias_level(struct snd_soc_codec *codec,
...
@@ -2686,94 +2753,15 @@ static int rt5645_set_bias_level(struct snd_soc_codec *codec,
return
0
;
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
,
static
void
rt5645_enable_push_button_irq
(
struct
snd_soc_codec
*
codec
,
bool
enable
)
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
)
{
if
(
enable
)
{
snd_soc_dapm_mutex_lock
(
&
codec
->
dapm
);
snd_soc_dapm_force_enable_pin
(
dapm
,
"ADC L power"
);
snd_soc_dapm_force_enable_pin_unlocked
(
&
codec
->
dapm
,
snd_soc_dapm_force_enable_pin
(
dapm
,
"ADC R power"
);
"ADC L power"
);
snd_soc_dapm_sync
(
dapm
);
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_update_bits
(
codec
,
snd_soc_update_bits
(
codec
,
RT5645_INT_IRQ_ST
,
0x8
,
0x8
);
RT5645_INT_IRQ_ST
,
0x8
,
0x8
);
...
@@ -2786,36 +2774,26 @@ static void rt5645_enable_push_button_irq(struct snd_soc_codec *codec,
...
@@ -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
,
RT5650_4BTN_IL_CMD2
,
0x8000
,
0x0
);
snd_soc_update_bits
(
codec
,
RT5645_INT_IRQ_ST
,
0x8
,
0x0
);
snd_soc_update_bits
(
codec
,
RT5645_INT_IRQ_ST
,
0x8
,
0x0
);
snd_soc_dapm_mutex_lock
(
&
codec
->
dapm
);
snd_soc_dapm_disable_pin
(
dapm
,
"ADC L power"
);
snd_soc_dapm_disable_pin_unlocked
(
&
codec
->
dapm
,
snd_soc_dapm_disable_pin
(
dapm
,
"ADC R power"
);
"ADC L power"
);
snd_soc_dapm_sync
(
dapm
);
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
);
}
}
}
}
static
int
rt5645_jack_detect
(
struct
snd_soc_codec
*
codec
,
int
jack_insert
)
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
);
struct
rt5645_priv
*
rt5645
=
snd_soc_codec_get_drvdata
(
codec
);
unsigned
int
val
;
unsigned
int
val
;
if
(
jack_insert
)
{
if
(
jack_insert
)
{
regmap_write
(
rt5645
->
regmap
,
RT5645_CHARGE_PUMP
,
0x0006
);
regmap_write
(
rt5645
->
regmap
,
RT5645_CHARGE_PUMP
,
0x0006
);
if
(
codec
->
component
.
card
->
instantiated
)
{
/* for jack type detect */
/* for jack type detect */
snd_soc_dapm_force_enable_pin
(
&
codec
->
dapm
,
"LDO2"
);
snd_soc_dapm_force_enable_pin
(
dapm
,
"LDO2"
);
snd_soc_dapm_force_enable_pin
(
&
codec
->
dapm
,
snd_soc_dapm_force_enable_pin
(
dapm
,
"Mic Det Power"
);
"Mic Det Power"
);
snd_soc_dapm_sync
(
dapm
);
snd_soc_dapm_sync
(
&
codec
->
dapm
);
if
(
!
dapm
->
card
->
instantiated
)
{
}
else
{
/* Power up necessary bits for JD if dapm is
/* Power up necessary bits for JD if dapm is
not ready yet */
not ready yet */
regmap_update_bits
(
rt5645
->
regmap
,
RT5645_PWR_ANLG1
,
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)
...
@@ -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_JD_CTRL3
,
0x00f0
);
regmap_write
(
rt5645
->
regmap
,
RT5645_IN1_CTRL1
,
0x0006
);
regmap_update_bits
(
rt5645
->
regmap
,
RT5645_IN1_CTRL2
,
regmap_update_bits
(
rt5645
->
regmap
,
RT5645_CBJ_MN_JD
,
RT5645_CBJ_MN_JD
);
RT5645_IN1_CTRL2
,
0x1000
,
0x1000
);
regmap_update_bits
(
rt5645
->
regmap
,
RT5645_IN1_CTRL1
,
RT5645_CBJ_BST1_EN
,
RT5645_CBJ_BST1_EN
);
msleep
(
100
);
msleep
(
100
);
regmap_update_bits
(
rt5645
->
regmap
,
regmap_update_bits
(
rt5645
->
regmap
,
RT5645_IN1_CTRL2
,
RT5645_IN1_CTRL2
,
0x1000
,
0x000
0
);
RT5645_CBJ_MN_JD
,
0
);
msleep
(
45
0
);
msleep
(
60
0
);
regmap_read
(
rt5645
->
regmap
,
RT5645_IN1_CTRL3
,
&
val
);
regmap_read
(
rt5645
->
regmap
,
RT5645_IN1_CTRL3
,
&
val
);
val
&=
0x7
;
val
&=
0x7
;
dev_dbg
(
codec
->
dev
,
"val = %d
\n
"
,
val
);
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)
...
@@ -2846,43 +2825,46 @@ static int rt5645_jack_detect(struct snd_soc_codec *codec, int jack_insert)
rt5645_enable_push_button_irq
(
codec
,
true
);
rt5645_enable_push_button_irq
(
codec
,
true
);
}
}
}
else
{
}
else
{
if
(
codec
->
component
.
card
->
instantiated
)
{
snd_soc_dapm_disable_pin
(
dapm
,
"Mic Det Power"
);
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
snd_soc_dapm_sync
(
dapm
);
"Mic Det Power"
);
snd_soc_dapm_sync
(
&
codec
->
dapm
);
}
else
regmap_update_bits
(
rt5645
->
regmap
,
RT5645_PWR_VOL
,
RT5645_PWR_MIC_DET
,
0
);
rt5645
->
jack_type
=
SND_JACK_HEADPHONE
;
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 */
}
else
{
/* jack out */
rt5645
->
jack_type
=
0
;
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
)
if
(
rt5645
->
en_button_func
)
rt5645_enable_push_button_irq
(
codec
,
false
);
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
)
if
(
rt5645
->
pdata
.
jd_mode
==
0
)
regmap_update_bits
(
rt5645
->
regmap
,
snd_soc_dapm_disable_pin
(
dapm
,
"LDO2"
);
RT5645_PWR_MIXER
,
snd_soc_dapm_disable_pin
(
dapm
,
"Mic Det Power"
);
RT5645_PWR_LDO2
,
0
);
snd_soc_dapm_sync
(
dapm
);
regmap_update_bits
(
rt5645
->
regmap
,
RT5645_PWR_VOL
,
RT5645_PWR_MIC_DET
,
0
);
}
}
}
}
return
rt5645
->
jack_type
;
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
);
static
irqreturn_t
rt5645_irq
(
int
irq
,
void
*
data
);
int
rt5645_set_jack_detect
(
struct
snd_soc_codec
*
codec
,
int
rt5645_set_jack_detect
(
struct
snd_soc_codec
*
codec
,
...
@@ -2913,38 +2895,10 @@ static void rt5645_jack_detect_work(struct work_struct *work)
...
@@ -2913,38 +2895,10 @@ static void rt5645_jack_detect_work(struct work_struct *work)
{
{
struct
rt5645_priv
*
rt5645
=
struct
rt5645_priv
*
rt5645
=
container_of
(
work
,
struct
rt5645_priv
,
jack_detect_work
.
work
);
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
;
int
val
,
btn_type
,
gpio_state
=
0
,
report
=
0
;
if
(
!
rt5645
->
codec
)
if
(
!
rt5645
->
codec
)
return
-
EINVAL
;
return
;
switch
(
rt5645
->
pdata
.
jd_mode
)
{
switch
(
rt5645
->
pdata
.
jd_mode
)
{
case
0
:
/* Not using rt5645 JD */
case
0
:
/* Not using rt5645 JD */
...
@@ -2958,7 +2912,7 @@ static int rt5645_irq_detection(struct rt5645_priv *rt5645)
...
@@ -2958,7 +2912,7 @@ static int rt5645_irq_detection(struct rt5645_priv *rt5645)
report
,
SND_JACK_HEADPHONE
);
report
,
SND_JACK_HEADPHONE
);
snd_soc_jack_report
(
rt5645
->
mic_jack
,
snd_soc_jack_report
(
rt5645
->
mic_jack
,
report
,
SND_JACK_MICROPHONE
);
report
,
SND_JACK_MICROPHONE
);
return
report
;
return
;
case
1
:
/* 2 port */
case
1
:
/* 2 port */
val
=
snd_soc_read
(
rt5645
->
codec
,
RT5645_A_JD_CTRL1
)
&
0x0070
;
val
=
snd_soc_read
(
rt5645
->
codec
,
RT5645_A_JD_CTRL1
)
&
0x0070
;
break
;
break
;
...
@@ -3040,27 +2994,39 @@ static int rt5645_irq_detection(struct rt5645_priv *rt5645)
...
@@ -3040,27 +2994,39 @@ static int rt5645_irq_detection(struct rt5645_priv *rt5645)
snd_soc_jack_report
(
rt5645
->
btn_jack
,
snd_soc_jack_report
(
rt5645
->
btn_jack
,
report
,
SND_JACK_BTN_0
|
SND_JACK_BTN_1
|
report
,
SND_JACK_BTN_0
|
SND_JACK_BTN_1
|
SND_JACK_BTN_2
|
SND_JACK_BTN_3
);
SND_JACK_BTN_2
|
SND_JACK_BTN_3
);
}
return
report
;
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_probe
(
struct
snd_soc_codec
*
codec
)
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
);
struct
rt5645_priv
*
rt5645
=
snd_soc_codec_get_drvdata
(
codec
);
rt5645
->
codec
=
codec
;
rt5645
->
codec
=
codec
;
switch
(
rt5645
->
codec_type
)
{
switch
(
rt5645
->
codec_type
)
{
case
CODEC_TYPE_RT5645
:
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
,
rt5645_specific_dapm_routes
,
ARRAY_SIZE
(
rt5645_specific_dapm_routes
));
ARRAY_SIZE
(
rt5645_specific_dapm_routes
));
break
;
break
;
case
CODEC_TYPE_RT5650
:
case
CODEC_TYPE_RT5650
:
snd_soc_dapm_new_controls
(
&
codec
->
dapm
,
snd_soc_dapm_new_controls
(
dapm
,
rt5650_specific_dapm_widgets
,
rt5650_specific_dapm_widgets
,
ARRAY_SIZE
(
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
,
rt5650_specific_dapm_routes
,
ARRAY_SIZE
(
rt5650_specific_dapm_routes
));
ARRAY_SIZE
(
rt5650_specific_dapm_routes
));
break
;
break
;
...
@@ -3070,9 +3036,9 @@ static int rt5645_probe(struct snd_soc_codec *codec)
...
@@ -3070,9 +3036,9 @@ static int rt5645_probe(struct snd_soc_codec *codec)
/* for JD function */
/* for JD function */
if
(
rt5645
->
pdata
.
jd_mode
)
{
if
(
rt5645
->
pdata
.
jd_mode
)
{
snd_soc_dapm_force_enable_pin
(
&
codec
->
dapm
,
"JD Power"
);
snd_soc_dapm_force_enable_pin
(
dapm
,
"JD Power"
);
snd_soc_dapm_force_enable_pin
(
&
codec
->
dapm
,
"LDO2"
);
snd_soc_dapm_force_enable_pin
(
dapm
,
"LDO2"
);
snd_soc_dapm_sync
(
&
codec
->
dapm
);
snd_soc_dapm_sync
(
dapm
);
}
}
return
0
;
return
0
;
...
@@ -3224,7 +3190,7 @@ static int strago_quirk_cb(const struct dmi_system_id *id)
...
@@ -3224,7 +3190,7 @@ static int strago_quirk_cb(const struct dmi_system_id *id)
return
1
;
return
1
;
}
}
static
struct
dmi_system_id
dmi_platform_intel_braswell
[]
=
{
static
const
struct
dmi_system_id
dmi_platform_intel_braswell
[]
=
{
{
{
.
ident
=
"Intel Strago"
,
.
ident
=
"Intel Strago"
,
.
callback
=
strago_quirk_cb
,
.
callback
=
strago_quirk_cb
,
...
@@ -3261,7 +3227,7 @@ static int rt5645_i2c_probe(struct i2c_client *i2c,
...
@@ -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_platform_data
*
pdata
=
dev_get_platdata
(
&
i2c
->
dev
);
struct
rt5645_priv
*
rt5645
;
struct
rt5645_priv
*
rt5645
;
int
ret
;
int
ret
,
i
;
unsigned
int
val
;
unsigned
int
val
;
rt5645
=
devm_kzalloc
(
&
i2c
->
dev
,
sizeof
(
struct
rt5645_priv
),
rt5645
=
devm_kzalloc
(
&
i2c
->
dev
,
sizeof
(
struct
rt5645_priv
),
...
@@ -3295,6 +3261,24 @@ static int rt5645_i2c_probe(struct i2c_client *i2c,
...
@@ -3295,6 +3261,24 @@ static int rt5645_i2c_probe(struct i2c_client *i2c,
return
ret
;
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
);
regmap_read
(
rt5645
->
regmap
,
RT5645_VENDOR_ID2
,
&
val
);
switch
(
val
)
{
switch
(
val
)
{
...
@@ -3306,16 +3290,10 @@ static int rt5645_i2c_probe(struct i2c_client *i2c,
...
@@ -3306,16 +3290,10 @@ static int rt5645_i2c_probe(struct i2c_client *i2c,
break
;
break
;
default:
default:
dev_err
(
&
i2c
->
dev
,
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
);
val
);
return
-
ENODEV
;
ret
=
-
ENODEV
;
}
goto
err_enable
;
if
(
rt5645
->
codec_type
==
CODEC_TYPE_RT5650
)
{
ret
=
rt5650_calibration
(
rt5645
);
if
(
ret
<
0
)
pr_err
(
"calibration failed!
\n
"
);
}
}
regmap_write
(
rt5645
->
regmap
,
RT5645_RESET
,
0
);
regmap_write
(
rt5645
->
regmap
,
RT5645_RESET
,
0
);
...
@@ -3405,8 +3383,6 @@ static int rt5645_i2c_probe(struct i2c_client *i2c,
...
@@ -3405,8 +3383,6 @@ static int rt5645_i2c_probe(struct i2c_client *i2c,
regmap_update_bits
(
rt5645
->
regmap
,
RT5645_GEN_CTRL3
,
regmap_update_bits
(
rt5645
->
regmap
,
RT5645_GEN_CTRL3
,
RT5645_IRQ_CLK_GATE_CTRL
,
RT5645_IRQ_CLK_GATE_CTRL
,
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
,
regmap_update_bits
(
rt5645
->
regmap
,
RT5645_MICBIAS
,
RT5645_IRQ_CLK_INT
,
RT5645_IRQ_CLK_INT
);
RT5645_IRQ_CLK_INT
,
RT5645_IRQ_CLK_INT
);
regmap_update_bits
(
rt5645
->
regmap
,
RT5645_IRQ_CTRL2
,
regmap_update_bits
(
rt5645
->
regmap
,
RT5645_IRQ_CTRL2
,
...
@@ -3446,12 +3422,25 @@ static int rt5645_i2c_probe(struct i2c_client *i2c,
...
@@ -3446,12 +3422,25 @@ static int rt5645_i2c_probe(struct i2c_client *i2c,
ret
=
request_threaded_irq
(
rt5645
->
i2c
->
irq
,
NULL
,
rt5645_irq
,
ret
=
request_threaded_irq
(
rt5645
->
i2c
->
irq
,
NULL
,
rt5645_irq
,
IRQF_TRIGGER_RISING
|
IRQF_TRIGGER_FALLING
IRQF_TRIGGER_RISING
|
IRQF_TRIGGER_FALLING
|
IRQF_ONESHOT
,
"rt5645"
,
rt5645
);
|
IRQF_ONESHOT
,
"rt5645"
,
rt5645
);
if
(
ret
)
if
(
ret
)
{
dev_err
(
&
i2c
->
dev
,
"Failed to reguest IRQ: %d
\n
"
,
ret
);
dev_err
(
&
i2c
->
dev
,
"Failed to reguest IRQ: %d
\n
"
,
ret
);
goto
err_enable
;
}
}
}
ret
urn
snd_soc_register_codec
(
&
i2c
->
dev
,
&
soc_codec_dev_rt5645
,
ret
=
snd_soc_register_codec
(
&
i2c
->
dev
,
&
soc_codec_dev_rt5645
,
rt5645_dai
,
ARRAY_SIZE
(
rt5645_dai
));
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
)
static
int
rt5645_i2c_remove
(
struct
i2c_client
*
i2c
)
...
@@ -3464,10 +3453,23 @@ 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
);
cancel_delayed_work_sync
(
&
rt5645
->
jack_detect_work
);
snd_soc_unregister_codec
(
&
i2c
->
dev
);
snd_soc_unregister_codec
(
&
i2c
->
dev
);
regulator_bulk_disable
(
ARRAY_SIZE
(
rt5645
->
supplies
),
rt5645
->
supplies
);
return
0
;
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
=
{
static
struct
i2c_driver
rt5645_i2c_driver
=
{
.
driver
=
{
.
driver
=
{
.
name
=
"rt5645"
,
.
name
=
"rt5645"
,
...
@@ -3476,6 +3478,7 @@ static struct i2c_driver rt5645_i2c_driver = {
...
@@ -3476,6 +3478,7 @@ static struct i2c_driver rt5645_i2c_driver = {
},
},
.
probe
=
rt5645_i2c_probe
,
.
probe
=
rt5645_i2c_probe
,
.
remove
=
rt5645_i2c_remove
,
.
remove
=
rt5645_i2c_remove
,
.
shutdown
=
rt5645_i2c_shutdown
,
.
id_table
=
rt5645_i2c_id
,
.
id_table
=
rt5645_i2c_id
,
};
};
module_i2c_driver
(
rt5645_i2c_driver
);
module_i2c_driver
(
rt5645_i2c_driver
);
...
...
sound/soc/codecs/rt5645.h
View file @
cb42e0f7
...
@@ -2115,6 +2115,7 @@ enum {
...
@@ -2115,6 +2115,7 @@ enum {
#define RT5645_JD_PSV_MODE (0x1 << 12)
#define RT5645_JD_PSV_MODE (0x1 << 12)
#define RT5645_IRQ_CLK_GATE_CTRL (0x1 << 11)
#define RT5645_IRQ_CLK_GATE_CTRL (0x1 << 11)
#define RT5645_MICINDET_MANU (0x1 << 7)
#define RT5645_MICINDET_MANU (0x1 << 7)
#define RT5645_RING2_SLEEVE_GND (0x1 << 5)
/* Vendor ID (0xfd) */
/* Vendor ID (0xfd) */
#define RT5645_VER_C 0x2
#define RT5645_VER_C 0x2
...
@@ -2181,32 +2182,6 @@ enum {
...
@@ -2181,32 +2182,6 @@ enum {
int
rt5645_sel_asrc_clk_src
(
struct
snd_soc_codec
*
codec
,
int
rt5645_sel_asrc_clk_src
(
struct
snd_soc_codec
*
codec
,
unsigned
int
filter_mask
,
unsigned
int
clk_src
);
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
,
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
*
hp_jack
,
struct
snd_soc_jack
*
mic_jack
,
struct
snd_soc_jack
*
btn_jack
);
struct
snd_soc_jack
*
btn_jack
);
...
...
sound/soc/codecs/tas571x.c
View file @
cb42e0f7
...
@@ -179,7 +179,7 @@ static int tas571x_set_bias_level(struct snd_soc_codec *codec,
...
@@ -179,7 +179,7 @@ static int tas571x_set_bias_level(struct snd_soc_codec *codec,
case
SND_SOC_BIAS_PREPARE
:
case
SND_SOC_BIAS_PREPARE
:
break
;
break
;
case
SND_SOC_BIAS_STANDBY
:
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
))
{
if
(
!
IS_ERR
(
priv
->
mclk
))
{
ret
=
clk_prepare_enable
(
priv
->
mclk
);
ret
=
clk_prepare_enable
(
priv
->
mclk
);
if
(
ret
)
{
if
(
ret
)
{
...
...
sound/soc/intel/boards/cht_bsw_max98090_ti.c
View file @
cb42e0f7
...
@@ -104,21 +104,17 @@ static int cht_aif1_hw_params(struct snd_pcm_substream *substream,
...
@@ -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
,
static
int
cht_ti_jack_event
(
struct
notifier_block
*
nb
,
unsigned
long
event
,
void
*
data
)
unsigned
long
event
,
void
*
data
)
{
{
struct
snd_soc_jack
*
jack
=
(
struct
snd_soc_jack
*
)
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_dapm_context
*
dapm
=
&
jack
->
card
->
dapm
;
struct
snd_soc_codec
*
codec
=
codec_dai
->
codec
;
if
(
event
&
SND_JACK_MICROPHONE
)
{
if
(
event
&
SND_JACK_MICROPHONE
)
{
snd_soc_dapm_force_enable_pin
(
dapm
,
"SHDN"
);
snd_soc_dapm_force_enable_pin
(
&
codec
->
dapm
,
"SHDN"
);
snd_soc_dapm_force_enable_pin
(
dapm
,
"MICBIAS"
);
snd_soc_dapm_force_enable_pin
(
&
codec
->
dapm
,
"MICBIAS"
);
snd_soc_dapm_sync
(
dapm
);
snd_soc_dapm_sync
(
&
codec
->
dapm
);
}
else
{
}
else
{
snd_soc_dapm_disable_pin
(
dapm
,
"MICBIAS"
);
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"MICBIAS"
);
snd_soc_dapm_disable_pin
(
dapm
,
"SHDN"
);
snd_soc_dapm_disable_pin
(
&
codec
->
dapm
,
"SHDN"
);
snd_soc_dapm_sync
(
dapm
);
snd_soc_dapm_sync
(
&
codec
->
dapm
);
}
}
return
0
;
return
0
;
...
...
sound/soc/omap/omap3pandora.c
View file @
cb42e0f7
...
@@ -154,8 +154,7 @@ static const struct snd_soc_dapm_route omap3pandora_map[] = {
...
@@ -154,8 +154,7 @@ static const struct snd_soc_dapm_route omap3pandora_map[] = {
static
int
omap3pandora_out_init
(
struct
snd_soc_pcm_runtime
*
rtd
)
static
int
omap3pandora_out_init
(
struct
snd_soc_pcm_runtime
*
rtd
)
{
{
struct
snd_soc_codec
*
codec
=
rtd
->
codec
;
struct
snd_soc_dapm_context
*
dapm
=
&
rtd
->
card
->
dapm
;
struct
snd_soc_dapm_context
*
dapm
=
&
codec
->
dapm
;
/* All TWL4030 output pins are floating */
/* All TWL4030 output pins are floating */
snd_soc_dapm_nc_pin
(
dapm
,
"EARPIECE"
);
snd_soc_dapm_nc_pin
(
dapm
,
"EARPIECE"
);
...
@@ -174,8 +173,7 @@ static int omap3pandora_out_init(struct snd_soc_pcm_runtime *rtd)
...
@@ -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
)
static
int
omap3pandora_in_init
(
struct
snd_soc_pcm_runtime
*
rtd
)
{
{
struct
snd_soc_codec
*
codec
=
rtd
->
codec
;
struct
snd_soc_dapm_context
*
dapm
=
&
rtd
->
card
->
dapm
;
struct
snd_soc_dapm_context
*
dapm
=
&
codec
->
dapm
;
/* Not comnnected */
/* Not comnnected */
snd_soc_dapm_nc_pin
(
dapm
,
"HSMIC"
);
snd_soc_dapm_nc_pin
(
dapm
,
"HSMIC"
);
...
...
sound/soc/soc-core.c
View file @
cb42e0f7
...
@@ -654,10 +654,12 @@ int snd_soc_suspend(struct device *dev)
...
@@ -654,10 +654,12 @@ int snd_soc_suspend(struct device *dev)
/* suspend all CODECs */
/* suspend all CODECs */
list_for_each_entry
(
codec
,
&
card
->
codec_dev_list
,
card_list
)
{
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
/* If there are paths active then the CODEC will be held with
* bias _ON and should not be suspended. */
* bias _ON and should not be suspended. */
if
(
!
codec
->
suspended
)
{
if
(
!
codec
->
suspended
)
{
switch
(
codec
->
dapm
.
bias_level
)
{
switch
(
snd_soc_dapm_get_bias_level
(
dapm
)
)
{
case
SND_SOC_BIAS_STANDBY
:
case
SND_SOC_BIAS_STANDBY
:
/*
/*
* If the CODEC is capable of idle
* If the CODEC is capable of idle
...
@@ -665,7 +667,7 @@ int snd_soc_suspend(struct device *dev)
...
@@ -665,7 +667,7 @@ int snd_soc_suspend(struct device *dev)
* means it's doing something,
* means it's doing something,
* otherwise fall through.
* otherwise fall through.
*/
*/
if
(
codec
->
dapm
.
idle_bias_off
)
{
if
(
dapm
->
idle_bias_off
)
{
dev_dbg
(
codec
->
dev
,
dev_dbg
(
codec
->
dev
,
"ASoC: idle_bias_off CODEC on over suspend
\n
"
);
"ASoC: idle_bias_off CODEC on over suspend
\n
"
);
break
;
break
;
...
@@ -2662,10 +2664,7 @@ static int snd_soc_component_initialize(struct snd_soc_component *component,
...
@@ -2662,10 +2664,7 @@ static int snd_soc_component_initialize(struct snd_soc_component *component,
component
->
probe
=
component
->
driver
->
probe
;
component
->
probe
=
component
->
driver
->
probe
;
component
->
remove
=
component
->
driver
->
remove
;
component
->
remove
=
component
->
driver
->
remove
;
if
(
!
component
->
dapm_ptr
)
dapm
=
&
component
->
dapm
;
component
->
dapm_ptr
=
&
component
->
dapm
;
dapm
=
component
->
dapm_ptr
;
dapm
->
dev
=
dev
;
dapm
->
dev
=
dev
;
dapm
->
component
=
component
;
dapm
->
component
=
component
;
dapm
->
bias_level
=
SND_SOC_BIAS_OFF
;
dapm
->
bias_level
=
SND_SOC_BIAS_OFF
;
...
@@ -3047,6 +3046,7 @@ int snd_soc_register_codec(struct device *dev,
...
@@ -3047,6 +3046,7 @@ int snd_soc_register_codec(struct device *dev,
struct
snd_soc_dai_driver
*
dai_drv
,
struct
snd_soc_dai_driver
*
dai_drv
,
int
num_dai
)
int
num_dai
)
{
{
struct
snd_soc_dapm_context
*
dapm
;
struct
snd_soc_codec
*
codec
;
struct
snd_soc_codec
*
codec
;
struct
snd_soc_dai
*
dai
;
struct
snd_soc_dai
*
dai
;
int
ret
,
i
;
int
ret
,
i
;
...
@@ -3057,7 +3057,6 @@ int snd_soc_register_codec(struct device *dev,
...
@@ -3057,7 +3057,6 @@ int snd_soc_register_codec(struct device *dev,
if
(
codec
==
NULL
)
if
(
codec
==
NULL
)
return
-
ENOMEM
;
return
-
ENOMEM
;
codec
->
component
.
dapm_ptr
=
&
codec
->
dapm
;
codec
->
component
.
codec
=
codec
;
codec
->
component
.
codec
=
codec
;
ret
=
snd_soc_component_initialize
(
&
codec
->
component
,
ret
=
snd_soc_component_initialize
(
&
codec
->
component
,
...
@@ -3087,12 +3086,14 @@ int snd_soc_register_codec(struct device *dev,
...
@@ -3087,12 +3086,14 @@ int snd_soc_register_codec(struct device *dev,
if
(
codec_drv
->
read
)
if
(
codec_drv
->
read
)
codec
->
component
.
read
=
snd_soc_codec_drv_read
;
codec
->
component
.
read
=
snd_soc_codec_drv_read
;
codec
->
component
.
ignore_pmdown_time
=
codec_drv
->
ignore_pmdown_time
;
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
)
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
)
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
->
dev
=
dev
;
codec
->
driver
=
codec_drv
;
codec
->
driver
=
codec_drv
;
codec
->
component
.
val_bytes
=
codec_drv
->
reg_word_size
;
codec
->
component
.
val_bytes
=
codec_drv
->
reg_word_size
;
...
...
sound/soc/soc-dapm.c
View file @
cb42e0f7
...
@@ -2163,14 +2163,16 @@ int snd_soc_dapm_mixer_update_power(struct snd_soc_dapm_context *dapm,
...
@@ -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
);
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
;
struct
snd_soc_dapm_widget
*
w
;
int
count
=
0
;
int
count
=
0
;
char
*
state
=
"not set"
;
char
*
state
=
"not set"
;
list_for_each_entry
(
w
,
&
c
odec
->
component
.
card
->
widgets
,
list
)
{
list_for_each_entry
(
w
,
&
c
mpnt
->
card
->
widgets
,
list
)
{
if
(
w
->
dapm
!=
&
codec
->
dapm
)
if
(
w
->
dapm
!=
dapm
)
continue
;
continue
;
/* only display widgets that burnm power */
/* only display widgets that burnm power */
...
@@ -2198,7 +2200,7 @@ static ssize_t dapm_widget_show_codec(struct snd_soc_codec *codec, char *buf)
...
@@ -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
:
case
SND_SOC_BIAS_ON
:
state
=
"On"
;
state
=
"On"
;
break
;
break
;
...
@@ -2227,8 +2229,9 @@ static ssize_t dapm_widget_show(struct device *dev,
...
@@ -2227,8 +2229,9 @@ static ssize_t dapm_widget_show(struct device *dev,
mutex_lock
(
&
rtd
->
card
->
dapm_mutex
);
mutex_lock
(
&
rtd
->
card
->
dapm_mutex
);
for
(
i
=
0
;
i
<
rtd
->
num_codecs
;
i
++
)
{
for
(
i
=
0
;
i
<
rtd
->
num_codecs
;
i
++
)
{
struct
snd_soc_codec
*
codec
=
rtd
->
codec_dais
[
i
]
->
codec
;
struct
snd_soc_component
*
cmpnt
=
rtd
->
codec_dais
[
i
]
->
component
;
count
+=
dapm_widget_show_codec
(
codec
,
buf
+
count
);
count
+=
dapm_widget_show_component
(
cmpnt
,
buf
+
count
);
}
}
mutex_unlock
(
&
rtd
->
card
->
dapm_mutex
);
mutex_unlock
(
&
rtd
->
card
->
dapm_mutex
);
...
...
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