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
665ddeb2
Commit
665ddeb2
authored
Nov 25, 2015
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'asoc/fix/rt5645' into asoc-linus
parents
98409bfd
6b3cecd1
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
57 additions
and
4 deletions
+57
-4
sound/soc/codecs/rt5645.c
sound/soc/codecs/rt5645.c
+57
-4
No files found.
sound/soc/codecs/rt5645.c
View file @
665ddeb2
...
...
@@ -245,7 +245,7 @@ struct rt5645_priv {
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
delayed_work
jack_detect_work
,
rcclock_work
;
struct
regulator_bulk_data
supplies
[
ARRAY_SIZE
(
rt5645_supply_names
)];
struct
rt5645_eq_param_s
*
eq_param
;
...
...
@@ -565,12 +565,33 @@ static int rt5645_hweq_put(struct snd_kcontrol *kcontrol,
.put = rt5645_hweq_put \
}
static
int
rt5645_spk_put_volsw
(
struct
snd_kcontrol
*
kcontrol
,
struct
snd_ctl_elem_value
*
ucontrol
)
{
struct
snd_soc_component
*
component
=
snd_kcontrol_chip
(
kcontrol
);
struct
rt5645_priv
*
rt5645
=
snd_soc_component_get_drvdata
(
component
);
int
ret
;
cancel_delayed_work_sync
(
&
rt5645
->
rcclock_work
);
regmap_update_bits
(
rt5645
->
regmap
,
RT5645_MICBIAS
,
RT5645_PWR_CLK25M_MASK
,
RT5645_PWR_CLK25M_PU
);
ret
=
snd_soc_put_volsw
(
kcontrol
,
ucontrol
);
queue_delayed_work
(
system_power_efficient_wq
,
&
rt5645
->
rcclock_work
,
msecs_to_jiffies
(
200
));
return
ret
;
}
static
const
struct
snd_kcontrol_new
rt5645_snd_controls
[]
=
{
/* Speaker Output Volume */
SOC_DOUBLE
(
"Speaker Channel Switch"
,
RT5645_SPK_VOL
,
RT5645_VOL_L_SFT
,
RT5645_VOL_R_SFT
,
1
,
1
),
SOC_DOUBLE_TLV
(
"Speaker Playback Volume"
,
RT5645_SPK_VOL
,
RT5645_L_VOL_SFT
,
RT5645_R_VOL_SFT
,
39
,
1
,
out_vol_tlv
),
SOC_DOUBLE_EXT_TLV
(
"Speaker Playback Volume"
,
RT5645_SPK_VOL
,
RT5645_L_VOL_SFT
,
RT5645_R_VOL_SFT
,
39
,
1
,
snd_soc_get_volsw
,
rt5645_spk_put_volsw
,
out_vol_tlv
),
/* ClassD modulator Speaker Gain Ratio */
SOC_SINGLE_TLV
(
"Speaker ClassD Playback Volume"
,
RT5645_SPO_CLSD_RATIO
,
...
...
@@ -1498,7 +1519,7 @@ static void hp_amp_power(struct snd_soc_codec *codec, int on)
regmap_write
(
rt5645
->
regmap
,
RT5645_PR_BASE
+
RT5645_MAMP_INT_REG2
,
0xfc00
);
snd_soc_write
(
codec
,
RT5645_DEPOP_M2
,
0x1140
);
msleep
(
4
0
);
msleep
(
7
0
);
rt5645
->
hp_on
=
true
;
}
else
{
/* depop parameters */
...
...
@@ -3122,6 +3143,15 @@ static void rt5645_jack_detect_work(struct work_struct *work)
SND_JACK_BTN_2
|
SND_JACK_BTN_3
);
}
static
void
rt5645_rcclock_work
(
struct
work_struct
*
work
)
{
struct
rt5645_priv
*
rt5645
=
container_of
(
work
,
struct
rt5645_priv
,
rcclock_work
.
work
);
regmap_update_bits
(
rt5645
->
regmap
,
RT5645_MICBIAS
,
RT5645_PWR_CLK25M_MASK
,
RT5645_PWR_CLK25M_PD
);
}
static
irqreturn_t
rt5645_irq
(
int
irq
,
void
*
data
)
{
struct
rt5645_priv
*
rt5645
=
data
;
...
...
@@ -3348,6 +3378,27 @@ static const struct dmi_system_id dmi_platform_intel_braswell[] = {
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"Reks"
),
},
},
{
.
ident
=
"Google Edgar"
,
.
callback
=
strago_quirk_cb
,
.
matches
=
{
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"Edgar"
),
},
},
{
.
ident
=
"Google Wizpig"
,
.
callback
=
strago_quirk_cb
,
.
matches
=
{
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"Wizpig"
),
},
},
{
.
ident
=
"Google Terra"
,
.
callback
=
strago_quirk_cb
,
.
matches
=
{
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"Terra"
),
},
},
{
}
};
...
...
@@ -3587,6 +3638,7 @@ static int rt5645_i2c_probe(struct i2c_client *i2c,
}
INIT_DELAYED_WORK
(
&
rt5645
->
jack_detect_work
,
rt5645_jack_detect_work
);
INIT_DELAYED_WORK
(
&
rt5645
->
rcclock_work
,
rt5645_rcclock_work
);
if
(
rt5645
->
i2c
->
irq
)
{
ret
=
request_threaded_irq
(
rt5645
->
i2c
->
irq
,
NULL
,
rt5645_irq
,
...
...
@@ -3621,6 +3673,7 @@ static int rt5645_i2c_remove(struct i2c_client *i2c)
free_irq
(
i2c
->
irq
,
rt5645
);
cancel_delayed_work_sync
(
&
rt5645
->
jack_detect_work
);
cancel_delayed_work_sync
(
&
rt5645
->
rcclock_work
);
snd_soc_unregister_codec
(
&
i2c
->
dev
);
regulator_bulk_disable
(
ARRAY_SIZE
(
rt5645
->
supplies
),
rt5645
->
supplies
);
...
...
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