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
d1113af4
Commit
d1113af4
authored
Apr 12, 2015
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'asoc/topic/core' into asoc-next
parents
89a88dd3
a5053a8e
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
135 additions
and
189 deletions
+135
-189
include/sound/soc-dapm.h
include/sound/soc-dapm.h
+0
-2
include/sound/soc-dpcm.h
include/sound/soc-dpcm.h
+1
-1
sound/soc/codecs/wm8350.c
sound/soc/codecs/wm8350.c
+11
-14
sound/soc/codecs/wm8753.c
sound/soc/codecs/wm8753.c
+25
-48
sound/soc/codecs/wm8971.c
sound/soc/codecs/wm8971.c
+30
-69
sound/soc/soc-core.c
sound/soc/soc-core.c
+56
-48
sound/soc/soc-dapm.c
sound/soc/soc-dapm.c
+3
-0
sound/soc/soc-pcm.c
sound/soc/soc-pcm.c
+9
-7
No files found.
include/sound/soc-dapm.h
View file @
d1113af4
...
...
@@ -586,8 +586,6 @@ struct snd_soc_dapm_update {
/* DAPM context */
struct
snd_soc_dapm_context
{
enum
snd_soc_bias_level
bias_level
;
enum
snd_soc_bias_level
suspend_bias_level
;
struct
delayed_work
delayed_work
;
unsigned
int
idle_bias_off
:
1
;
/* Use BIAS_OFF instead of STANDBY */
/* Go to BIAS_OFF in suspend if the DAPM context is idle */
unsigned
int
suspend_bias_off
:
1
;
...
...
include/sound/soc-dpcm.h
View file @
d1113af4
...
...
@@ -135,7 +135,7 @@ void snd_soc_dpcm_be_set_state(struct snd_soc_pcm_runtime *be, int stream,
/* internal use only */
int
soc_dpcm_be_digital_mute
(
struct
snd_soc_pcm_runtime
*
fe
,
int
mute
);
int
soc_dpcm_debugfs_add
(
struct
snd_soc_pcm_runtime
*
rtd
);
void
soc_dpcm_debugfs_add
(
struct
snd_soc_pcm_runtime
*
rtd
);
int
soc_dpcm_runtime_update
(
struct
snd_soc_card
*
);
int
dpcm_path_get
(
struct
snd_soc_pcm_runtime
*
fe
,
...
...
sound/soc/codecs/wm8350.c
View file @
d1113af4
...
...
@@ -69,14 +69,14 @@ struct wm8350_data {
struct
regulator_bulk_data
supplies
[
ARRAY_SIZE
(
supply_names
)];
int
fll_freq_out
;
int
fll_freq_in
;
struct
delayed_work
pga_work
;
};
/*
* Ramp OUT1 PGA volume to minimise pops at stream startup and shutdown.
*/
static
inline
int
wm8350_out1_ramp_step
(
struct
snd_soc_codec
*
codec
)
static
inline
int
wm8350_out1_ramp_step
(
struct
wm8350_data
*
wm8350_data
)
{
struct
wm8350_data
*
wm8350_data
=
snd_soc_codec_get_drvdata
(
codec
);
struct
wm8350_output
*
out1
=
&
wm8350_data
->
out1
;
struct
wm8350
*
wm8350
=
wm8350_data
->
wm8350
;
int
left_complete
=
0
,
right_complete
=
0
;
...
...
@@ -140,9 +140,8 @@ static inline int wm8350_out1_ramp_step(struct snd_soc_codec *codec)
/*
* Ramp OUT2 PGA volume to minimise pops at stream startup and shutdown.
*/
static
inline
int
wm8350_out2_ramp_step
(
struct
snd_soc_codec
*
codec
)
static
inline
int
wm8350_out2_ramp_step
(
struct
wm8350_data
*
wm8350_data
)
{
struct
wm8350_data
*
wm8350_data
=
snd_soc_codec_get_drvdata
(
codec
);
struct
wm8350_output
*
out2
=
&
wm8350_data
->
out2
;
struct
wm8350
*
wm8350
=
wm8350_data
->
wm8350
;
int
left_complete
=
0
,
right_complete
=
0
;
...
...
@@ -210,10 +209,8 @@ static inline int wm8350_out2_ramp_step(struct snd_soc_codec *codec)
*/
static
void
wm8350_pga_work
(
struct
work_struct
*
work
)
{
struct
snd_soc_dapm_context
*
dapm
=
container_of
(
work
,
struct
snd_soc_dapm_context
,
delayed_work
.
work
);
struct
snd_soc_codec
*
codec
=
snd_soc_dapm_to_codec
(
dapm
);
struct
wm8350_data
*
wm8350_data
=
snd_soc_codec_get_drvdata
(
codec
);
struct
wm8350_data
*
wm8350_data
=
container_of
(
work
,
struct
wm8350_data
,
pga_work
.
work
);
struct
wm8350_output
*
out1
=
&
wm8350_data
->
out1
,
*
out2
=
&
wm8350_data
->
out2
;
int
i
,
out1_complete
,
out2_complete
;
...
...
@@ -226,9 +223,9 @@ static void wm8350_pga_work(struct work_struct *work)
for
(
i
=
0
;
i
<=
63
;
i
++
)
{
out1_complete
=
1
,
out2_complete
=
1
;
if
(
out1
->
ramp
!=
WM8350_RAMP_NONE
)
out1_complete
=
wm8350_out1_ramp_step
(
codec
);
out1_complete
=
wm8350_out1_ramp_step
(
wm8350_data
);
if
(
out2
->
ramp
!=
WM8350_RAMP_NONE
)
out2_complete
=
wm8350_out2_ramp_step
(
codec
);
out2_complete
=
wm8350_out2_ramp_step
(
wm8350_data
);
/* ramp finished ? */
if
(
out1_complete
&&
out2_complete
)
...
...
@@ -283,7 +280,7 @@ static int pga_event(struct snd_soc_dapm_widget *w,
out
->
ramp
=
WM8350_RAMP_UP
;
out
->
active
=
1
;
schedule_delayed_work
(
&
codec
->
dapm
.
delayed
_work
,
schedule_delayed_work
(
&
wm8350_data
->
pga
_work
,
msecs_to_jiffies
(
1
));
break
;
...
...
@@ -291,7 +288,7 @@ static int pga_event(struct snd_soc_dapm_widget *w,
out
->
ramp
=
WM8350_RAMP_DOWN
;
out
->
active
=
0
;
schedule_delayed_work
(
&
codec
->
dapm
.
delayed
_work
,
schedule_delayed_work
(
&
wm8350_data
->
pga
_work
,
msecs_to_jiffies
(
1
));
break
;
}
...
...
@@ -1492,7 +1489,7 @@ static int wm8350_codec_probe(struct snd_soc_codec *codec)
/* Put the codec into reset if it wasn't already */
wm8350_clear_bits
(
wm8350
,
WM8350_POWER_MGMT_5
,
WM8350_CODEC_ENA
);
INIT_DELAYED_WORK
(
&
codec
->
dapm
.
delayed
_work
,
wm8350_pga_work
);
INIT_DELAYED_WORK
(
&
priv
->
pga
_work
,
wm8350_pga_work
);
INIT_DELAYED_WORK
(
&
priv
->
hpl
.
work
,
wm8350_hpl_work
);
INIT_DELAYED_WORK
(
&
priv
->
hpr
.
work
,
wm8350_hpr_work
);
...
...
@@ -1578,7 +1575,7 @@ static int wm8350_codec_remove(struct snd_soc_codec *codec)
/* if there was any work waiting then we run it now and
* wait for its completion */
flush_delayed_work
(
&
codec
->
dapm
.
delayed
_work
);
flush_delayed_work
(
&
priv
->
pga
_work
);
wm8350_clear_bits
(
wm8350
,
WM8350_POWER_MGMT_5
,
WM8350_CODEC_ENA
);
...
...
sound/soc/codecs/wm8753.c
View file @
d1113af4
...
...
@@ -153,6 +153,7 @@ struct wm8753_priv {
unsigned
int
hifi_fmt
;
int
dai_func
;
struct
delayed_work
charge_work
;
};
#define wm8753_reset(c) snd_soc_write(c, WM8753_RESET, 0)
...
...
@@ -1326,9 +1327,19 @@ static int wm8753_mute(struct snd_soc_dai *dai, int mute)
return
0
;
}
static
void
wm8753_charge_work
(
struct
work_struct
*
work
)
{
struct
wm8753_priv
*
wm8753
=
container_of
(
work
,
struct
wm8753_priv
,
charge_work
.
work
);
/* Set to 500k */
regmap_update_bits
(
wm8753
->
regmap
,
WM8753_PWR1
,
0x0180
,
0x0100
);
}
static
int
wm8753_set_bias_level
(
struct
snd_soc_codec
*
codec
,
enum
snd_soc_bias_level
level
)
{
struct
wm8753_priv
*
wm8753
=
snd_soc_codec_get_drvdata
(
codec
);
u16
pwr_reg
=
snd_soc_read
(
codec
,
WM8753_PWR1
)
&
0xfe3e
;
switch
(
level
)
{
...
...
@@ -1337,14 +1348,22 @@ static int wm8753_set_bias_level(struct snd_soc_codec *codec,
snd_soc_write
(
codec
,
WM8753_PWR1
,
pwr_reg
|
0x00c0
);
break
;
case
SND_SOC_BIAS_PREPARE
:
/*
set vmid to 5k for quick power up
*/
snd_soc_write
(
codec
,
WM8753_PWR1
,
pwr_reg
|
0x01c1
);
/*
Wait until fully charged
*/
flush_delayed_work
(
&
wm8753
->
charge_work
);
break
;
case
SND_SOC_BIAS_STANDBY
:
/* mute dac and set vmid to 500k, enable VREF */
snd_soc_write
(
codec
,
WM8753_PWR1
,
pwr_reg
|
0x0141
);
if
(
codec
->
dapm
.
bias_level
==
SND_SOC_BIAS_OFF
)
{
/* set vmid to 5k for quick power up */
snd_soc_write
(
codec
,
WM8753_PWR1
,
pwr_reg
|
0x01c1
);
schedule_delayed_work
(
&
wm8753
->
charge_work
,
msecs_to_jiffies
(
caps_charge
));
}
else
{
/* mute dac and set vmid to 500k, enable VREF */
snd_soc_write
(
codec
,
WM8753_PWR1
,
pwr_reg
|
0x0141
);
}
break
;
case
SND_SOC_BIAS_OFF
:
cancel_delayed_work_sync
(
&
wm8753
->
charge_work
);
snd_soc_write
(
codec
,
WM8753_PWR1
,
0x0001
);
break
;
}
...
...
@@ -1428,38 +1447,12 @@ static struct snd_soc_dai_driver wm8753_dai[] = {
},
};
static
void
wm8753_work
(
struct
work_struct
*
work
)
{
struct
snd_soc_dapm_context
*
dapm
=
container_of
(
work
,
struct
snd_soc_dapm_context
,
delayed_work
.
work
);
struct
snd_soc_codec
*
codec
=
snd_soc_dapm_to_codec
(
dapm
);
wm8753_set_bias_level
(
codec
,
dapm
->
bias_level
);
}
static
int
wm8753_suspend
(
struct
snd_soc_codec
*
codec
)
{
wm8753_set_bias_level
(
codec
,
SND_SOC_BIAS_OFF
);
return
0
;
}
static
int
wm8753_resume
(
struct
snd_soc_codec
*
codec
)
{
struct
wm8753_priv
*
wm8753
=
snd_soc_codec_get_drvdata
(
codec
);
regcache_sync
(
wm8753
->
regmap
);
wm8753_set_bias_level
(
codec
,
SND_SOC_BIAS_STANDBY
);
/* charge wm8753 caps */
if
(
codec
->
dapm
.
suspend_bias_level
==
SND_SOC_BIAS_ON
)
{
wm8753_set_bias_level
(
codec
,
SND_SOC_BIAS_PREPARE
);
codec
->
dapm
.
bias_level
=
SND_SOC_BIAS_ON
;
queue_delayed_work
(
system_power_efficient_wq
,
&
codec
->
dapm
.
delayed_work
,
msecs_to_jiffies
(
caps_charge
));
}
return
0
;
}
...
...
@@ -1468,7 +1461,7 @@ static int wm8753_probe(struct snd_soc_codec *codec)
struct
wm8753_priv
*
wm8753
=
snd_soc_codec_get_drvdata
(
codec
);
int
ret
;
INIT_DELAYED_WORK
(
&
codec
->
dapm
.
delayed_work
,
wm8753
_work
);
INIT_DELAYED_WORK
(
&
wm8753
->
charge_work
,
wm8753_charge
_work
);
ret
=
wm8753_reset
(
codec
);
if
(
ret
<
0
)
{
...
...
@@ -1476,14 +1469,8 @@ static int wm8753_probe(struct snd_soc_codec *codec)
return
ret
;
}
wm8753_set_bias_level
(
codec
,
SND_SOC_BIAS_STANDBY
);
wm8753
->
dai_func
=
0
;
/* charge output caps */
wm8753_set_bias_level
(
codec
,
SND_SOC_BIAS_PREPARE
);
schedule_delayed_work
(
&
codec
->
dapm
.
delayed_work
,
msecs_to_jiffies
(
caps_charge
));
/* set the update bits */
snd_soc_update_bits
(
codec
,
WM8753_LDAC
,
0x0100
,
0x0100
);
snd_soc_update_bits
(
codec
,
WM8753_RDAC
,
0x0100
,
0x0100
);
...
...
@@ -1499,21 +1486,11 @@ static int wm8753_probe(struct snd_soc_codec *codec)
return
0
;
}
/* power down chip */
static
int
wm8753_remove
(
struct
snd_soc_codec
*
codec
)
{
flush_delayed_work
(
&
codec
->
dapm
.
delayed_work
);
wm8753_set_bias_level
(
codec
,
SND_SOC_BIAS_OFF
);
return
0
;
}
static
struct
snd_soc_codec_driver
soc_codec_dev_wm8753
=
{
.
probe
=
wm8753_probe
,
.
remove
=
wm8753_remove
,
.
suspend
=
wm8753_suspend
,
.
resume
=
wm8753_resume
,
.
set_bias_level
=
wm8753_set_bias_level
,
.
suspend_bias_off
=
true
,
.
controls
=
wm8753_snd_controls
,
.
num_controls
=
ARRAY_SIZE
(
wm8753_snd_controls
),
...
...
sound/soc/codecs/wm8971.c
View file @
d1113af4
...
...
@@ -31,11 +31,11 @@
#define WM8971_REG_COUNT 43
static
struct
workqueue_struct
*
wm8971_workq
=
NULL
;
/* codec private data */
struct
wm8971_priv
{
unsigned
int
sysclk
;
struct
delayed_work
charge_work
;
struct
regmap
*
regmap
;
};
/*
...
...
@@ -552,9 +552,19 @@ static int wm8971_mute(struct snd_soc_dai *dai, int mute)
return
0
;
}
static
void
wm8971_charge_work
(
struct
work_struct
*
work
)
{
struct
wm8971_priv
*
wm8971
=
container_of
(
work
,
struct
wm8971_priv
,
charge_work
.
work
);
/* Set to 500k */
regmap_update_bits
(
wm8971
->
regmap
,
WM8971_PWR1
,
0x0180
,
0x0100
);
}
static
int
wm8971_set_bias_level
(
struct
snd_soc_codec
*
codec
,
enum
snd_soc_bias_level
level
)
{
struct
wm8971_priv
*
wm8971
=
snd_soc_codec_get_drvdata
(
codec
);
u16
pwr_reg
=
snd_soc_read
(
codec
,
WM8971_PWR1
)
&
0xfe3e
;
switch
(
level
)
{
...
...
@@ -563,15 +573,24 @@ static int wm8971_set_bias_level(struct snd_soc_codec *codec,
snd_soc_write
(
codec
,
WM8971_PWR1
,
pwr_reg
|
0x00c1
);
break
;
case
SND_SOC_BIAS_PREPARE
:
/* Wait until fully charged */
flush_delayed_work
(
&
wm8971
->
charge_work
);
break
;
case
SND_SOC_BIAS_STANDBY
:
if
(
codec
->
dapm
.
bias_level
==
SND_SOC_BIAS_OFF
)
if
(
codec
->
dapm
.
bias_level
==
SND_SOC_BIAS_OFF
)
{
snd_soc_cache_sync
(
codec
);
/* charge output caps - set vmid to 5k for quick power up */
snd_soc_write
(
codec
,
WM8971_PWR1
,
pwr_reg
|
0x01c0
);
queue_delayed_work
(
system_power_efficient_wq
,
&
wm8971
->
charge_work
,
msecs_to_jiffies
(
1000
));
}
else
{
/* mute dac and set vmid to 500k, enable VREF */
snd_soc_write
(
codec
,
WM8971_PWR1
,
pwr_reg
|
0x0140
);
}
/* mute dac and set vmid to 500k, enable VREF */
snd_soc_write
(
codec
,
WM8971_PWR1
,
pwr_reg
|
0x0140
);
break
;
case
SND_SOC_BIAS_OFF
:
cancel_delayed_work_sync
(
&
wm8971
->
charge_work
);
snd_soc_write
(
codec
,
WM8971_PWR1
,
0x0001
);
break
;
}
...
...
@@ -610,58 +629,14 @@ static struct snd_soc_dai_driver wm8971_dai = {
.
ops
=
&
wm8971_dai_ops
,
};
static
void
wm8971_work
(
struct
work_struct
*
work
)
{
struct
snd_soc_dapm_context
*
dapm
=
container_of
(
work
,
struct
snd_soc_dapm_context
,
delayed_work
.
work
);
struct
snd_soc_codec
*
codec
=
snd_soc_dapm_to_codec
(
dapm
);
wm8971_set_bias_level
(
codec
,
codec
->
dapm
.
bias_level
);
}
static
int
wm8971_suspend
(
struct
snd_soc_codec
*
codec
)
{
wm8971_set_bias_level
(
codec
,
SND_SOC_BIAS_OFF
);
return
0
;
}
static
int
wm8971_resume
(
struct
snd_soc_codec
*
codec
)
{
u16
reg
;
wm8971_set_bias_level
(
codec
,
SND_SOC_BIAS_STANDBY
);
/* charge wm8971 caps */
if
(
codec
->
dapm
.
suspend_bias_level
==
SND_SOC_BIAS_ON
)
{
reg
=
snd_soc_read
(
codec
,
WM8971_PWR1
)
&
0xfe3e
;
snd_soc_write
(
codec
,
WM8971_PWR1
,
reg
|
0x01c0
);
codec
->
dapm
.
bias_level
=
SND_SOC_BIAS_ON
;
queue_delayed_work
(
wm8971_workq
,
&
codec
->
dapm
.
delayed_work
,
msecs_to_jiffies
(
1000
));
}
return
0
;
}
static
int
wm8971_probe
(
struct
snd_soc_codec
*
codec
)
{
int
ret
=
0
;
u16
reg
;
struct
wm8971_priv
*
wm8971
=
snd_soc_codec_get_drvdata
(
codec
);
INIT_DELAYED_WORK
(
&
codec
->
dapm
.
delayed_work
,
wm8971_work
);
wm8971_workq
=
create_workqueue
(
"wm8971"
);
if
(
wm8971_workq
==
NULL
)
return
-
ENOMEM
;
INIT_DELAYED_WORK
(
&
wm8971
->
charge_work
,
wm8971_charge_work
);
wm8971_reset
(
codec
);
/* charge output caps - set vmid to 5k for quick power up */
reg
=
snd_soc_read
(
codec
,
WM8971_PWR1
)
&
0xfe3e
;
snd_soc_write
(
codec
,
WM8971_PWR1
,
reg
|
0x01c0
);
codec
->
dapm
.
bias_level
=
SND_SOC_BIAS_STANDBY
;
queue_delayed_work
(
wm8971_workq
,
&
codec
->
dapm
.
delayed_work
,
msecs_to_jiffies
(
1000
));
/* set the update bits */
snd_soc_update_bits
(
codec
,
WM8971_LDAC
,
0x0100
,
0x0100
);
snd_soc_update_bits
(
codec
,
WM8971_RDAC
,
0x0100
,
0x0100
);
...
...
@@ -672,26 +647,13 @@ static int wm8971_probe(struct snd_soc_codec *codec)
snd_soc_update_bits
(
codec
,
WM8971_LINVOL
,
0x0100
,
0x0100
);
snd_soc_update_bits
(
codec
,
WM8971_RINVOL
,
0x0100
,
0x0100
);
return
ret
;
}
/* power down chip */
static
int
wm8971_remove
(
struct
snd_soc_codec
*
codec
)
{
wm8971_set_bias_level
(
codec
,
SND_SOC_BIAS_OFF
);
if
(
wm8971_workq
)
destroy_workqueue
(
wm8971_workq
);
return
0
;
}
static
struct
snd_soc_codec_driver
soc_codec_dev_wm8971
=
{
.
probe
=
wm8971_probe
,
.
remove
=
wm8971_remove
,
.
suspend
=
wm8971_suspend
,
.
resume
=
wm8971_resume
,
.
set_bias_level
=
wm8971_set_bias_level
,
.
suspend_bias_off
=
true
,
.
controls
=
wm8971_snd_controls
,
.
num_controls
=
ARRAY_SIZE
(
wm8971_snd_controls
),
...
...
@@ -715,7 +677,6 @@ static int wm8971_i2c_probe(struct i2c_client *i2c,
const
struct
i2c_device_id
*
id
)
{
struct
wm8971_priv
*
wm8971
;
struct
regmap
*
regmap
;
int
ret
;
wm8971
=
devm_kzalloc
(
&
i2c
->
dev
,
sizeof
(
struct
wm8971_priv
),
...
...
@@ -723,9 +684,9 @@ static int wm8971_i2c_probe(struct i2c_client *i2c,
if
(
wm8971
==
NULL
)
return
-
ENOMEM
;
regmap
=
devm_regmap_init_i2c
(
i2c
,
&
wm8971_regmap
);
if
(
IS_ERR
(
regmap
))
return
PTR_ERR
(
regmap
);
wm8971
->
regmap
=
devm_regmap_init_i2c
(
i2c
,
&
wm8971_regmap
);
if
(
IS_ERR
(
wm8971
->
regmap
))
return
PTR_ERR
(
wm8971
->
regmap
);
i2c_set_clientdata
(
i2c
,
wm8971
);
...
...
sound/soc/soc-core.c
View file @
d1113af4
...
...
@@ -292,6 +292,9 @@ static const struct file_operations codec_reg_fops = {
static
void
soc_init_component_debugfs
(
struct
snd_soc_component
*
component
)
{
if
(
!
component
->
card
->
debugfs_card_root
)
return
;
if
(
component
->
debugfs_prefix
)
{
char
*
name
;
...
...
@@ -455,6 +458,9 @@ static const struct file_operations platform_list_fops = {
static
void
soc_init_card_debugfs
(
struct
snd_soc_card
*
card
)
{
if
(
!
snd_soc_debugfs_root
)
return
;
card
->
debugfs_card_root
=
debugfs_create_dir
(
card
->
name
,
snd_soc_debugfs_root
);
if
(
!
card
->
debugfs_card_root
)
{
...
...
@@ -476,6 +482,34 @@ static void soc_cleanup_card_debugfs(struct snd_soc_card *card)
debugfs_remove_recursive
(
card
->
debugfs_card_root
);
}
static
void
snd_soc_debugfs_init
(
void
)
{
snd_soc_debugfs_root
=
debugfs_create_dir
(
"asoc"
,
NULL
);
if
(
IS_ERR
(
snd_soc_debugfs_root
)
||
!
snd_soc_debugfs_root
)
{
pr_warn
(
"ASoC: Failed to create debugfs directory
\n
"
);
snd_soc_debugfs_root
=
NULL
;
return
;
}
if
(
!
debugfs_create_file
(
"codecs"
,
0444
,
snd_soc_debugfs_root
,
NULL
,
&
codec_list_fops
))
pr_warn
(
"ASoC: Failed to create CODEC list debugfs file
\n
"
);
if
(
!
debugfs_create_file
(
"dais"
,
0444
,
snd_soc_debugfs_root
,
NULL
,
&
dai_list_fops
))
pr_warn
(
"ASoC: Failed to create DAI list debugfs file
\n
"
);
if
(
!
debugfs_create_file
(
"platforms"
,
0444
,
snd_soc_debugfs_root
,
NULL
,
&
platform_list_fops
))
pr_warn
(
"ASoC: Failed to create platform list debugfs file
\n
"
);
}
static
void
snd_soc_debugfs_exit
(
void
)
{
debugfs_remove_recursive
(
snd_soc_debugfs_root
);
}
#else
#define soc_init_codec_debugfs NULL
...
...
@@ -497,6 +531,15 @@ static inline void soc_init_card_debugfs(struct snd_soc_card *card)
static
inline
void
soc_cleanup_card_debugfs
(
struct
snd_soc_card
*
card
)
{
}
static
inline
void
snd_soc_debugfs_init
(
void
)
{
}
static
inline
void
snd_soc_debugfs_exit
(
void
)
{
}
#endif
struct
snd_pcm_substream
*
snd_soc_get_dai_substream
(
struct
snd_soc_card
*
card
,
...
...
@@ -595,15 +638,9 @@ int snd_soc_suspend(struct device *dev)
cpu_dai
->
driver
->
suspend
(
cpu_dai
);
}
/* close any waiting streams and save state */
for
(
i
=
0
;
i
<
card
->
num_rtd
;
i
++
)
{
struct
snd_soc_dai
**
codec_dais
=
card
->
rtd
[
i
].
codec_dais
;
/* close any waiting streams */
for
(
i
=
0
;
i
<
card
->
num_rtd
;
i
++
)
flush_delayed_work
(
&
card
->
rtd
[
i
].
delayed_work
);
for
(
j
=
0
;
j
<
card
->
rtd
[
i
].
num_codecs
;
j
++
)
{
codec_dais
[
j
]
->
codec
->
dapm
.
suspend_bias_level
=
codec_dais
[
j
]
->
codec
->
dapm
.
bias_level
;
}
}
for
(
i
=
0
;
i
<
card
->
num_rtd
;
i
++
)
{
...
...
@@ -1322,21 +1359,17 @@ static int soc_probe_link_dais(struct snd_soc_card *card, int num, int order)
}
}
if
(
dai_link
->
dai_fmt
)
snd_soc_runtime_set_dai_fmt
(
rtd
,
dai_link
->
dai_fmt
);
ret
=
soc_post_component_init
(
rtd
,
dai_link
->
name
);
if
(
ret
)
return
ret
;
#ifdef CONFIG_DEBUG_FS
/* add DPCM sysfs entries */
if
(
dai_link
->
dynamic
)
{
ret
=
soc_dpcm_debugfs_add
(
rtd
);
if
(
ret
<
0
)
{
dev_err
(
rtd
->
dev
,
"ASoC: failed to add dpcm sysfs entries: %d
\n
"
,
ret
);
return
ret
;
}
}
if
(
dai_link
->
dynamic
)
soc_dpcm_debugfs_add
(
rtd
);
#endif
if
(
cpu_dai
->
driver
->
compress_dai
)
{
...
...
@@ -1426,7 +1459,6 @@ static void soc_remove_aux_dev(struct snd_soc_card *card, int num)
/* unregister the rtd device */
if
(
rtd
->
dev_registered
)
{
device_remove_file
(
rtd
->
dev
,
&
dev_attr_codec_reg
);
device_unregister
(
rtd
->
dev
);
rtd
->
dev_registered
=
0
;
}
...
...
@@ -1560,6 +1592,8 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card)
goto
base_error
;
}
soc_init_card_debugfs
(
card
);
card
->
dapm
.
bias_level
=
SND_SOC_BIAS_OFF
;
card
->
dapm
.
dev
=
card
->
dev
;
card
->
dapm
.
card
=
card
;
...
...
@@ -1641,12 +1675,6 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card)
snd_soc_dapm_add_routes
(
&
card
->
dapm
,
card
->
of_dapm_routes
,
card
->
num_of_dapm_routes
);
for
(
i
=
0
;
i
<
card
->
num_links
;
i
++
)
{
if
(
card
->
dai_link
[
i
].
dai_fmt
)
snd_soc_runtime_set_dai_fmt
(
&
card
->
rtd
[
i
],
card
->
dai_link
[
i
].
dai_fmt
);
}
snprintf
(
card
->
snd_card
->
shortname
,
sizeof
(
card
->
snd_card
->
shortname
),
"%s"
,
card
->
name
);
snprintf
(
card
->
snd_card
->
longname
,
sizeof
(
card
->
snd_card
->
longname
),
...
...
@@ -1702,6 +1730,7 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card)
if
(
card
->
remove
)
card
->
remove
(
card
);
soc_cleanup_card_debugfs
(
card
);
snd_card_free
(
card
->
snd_card
);
base_error:
...
...
@@ -2380,8 +2409,6 @@ int snd_soc_register_card(struct snd_soc_card *card)
snd_soc_initialize_card_lists
(
card
);
soc_init_card_debugfs
(
card
);
card
->
rtd
=
devm_kzalloc
(
card
->
dev
,
sizeof
(
struct
snd_soc_pcm_runtime
)
*
(
card
->
num_links
+
card
->
num_aux_devs
),
...
...
@@ -2412,7 +2439,7 @@ int snd_soc_register_card(struct snd_soc_card *card)
ret
=
snd_soc_instantiate_card
(
card
);
if
(
ret
!=
0
)
soc_cleanup_card_debugfs
(
card
)
;
return
ret
;
/* deactivate pins to sleep state */
for
(
i
=
0
;
i
<
card
->
num_rtd
;
i
++
)
{
...
...
@@ -3595,26 +3622,7 @@ EXPORT_SYMBOL_GPL(snd_soc_of_get_dai_link_codecs);
static
int
__init
snd_soc_init
(
void
)
{
#ifdef CONFIG_DEBUG_FS
snd_soc_debugfs_root
=
debugfs_create_dir
(
"asoc"
,
NULL
);
if
(
IS_ERR
(
snd_soc_debugfs_root
)
||
!
snd_soc_debugfs_root
)
{
pr_warn
(
"ASoC: Failed to create debugfs directory
\n
"
);
snd_soc_debugfs_root
=
NULL
;
}
if
(
!
debugfs_create_file
(
"codecs"
,
0444
,
snd_soc_debugfs_root
,
NULL
,
&
codec_list_fops
))
pr_warn
(
"ASoC: Failed to create CODEC list debugfs file
\n
"
);
if
(
!
debugfs_create_file
(
"dais"
,
0444
,
snd_soc_debugfs_root
,
NULL
,
&
dai_list_fops
))
pr_warn
(
"ASoC: Failed to create DAI list debugfs file
\n
"
);
if
(
!
debugfs_create_file
(
"platforms"
,
0444
,
snd_soc_debugfs_root
,
NULL
,
&
platform_list_fops
))
pr_warn
(
"ASoC: Failed to create platform list debugfs file
\n
"
);
#endif
snd_soc_debugfs_init
();
snd_soc_util_init
();
return
platform_driver_register
(
&
soc_driver
);
...
...
@@ -3624,9 +3632,9 @@ module_init(snd_soc_init);
static
void
__exit
snd_soc_exit
(
void
)
{
snd_soc_util_exit
();
snd_soc_debugfs_exit
();
#ifdef CONFIG_DEBUG_FS
debugfs_remove_recursive
(
snd_soc_debugfs_root
);
#endif
platform_driver_unregister
(
&
soc_driver
);
}
...
...
sound/soc/soc-dapm.c
View file @
d1113af4
...
...
@@ -1898,6 +1898,9 @@ void snd_soc_dapm_debugfs_init(struct snd_soc_dapm_context *dapm,
{
struct
dentry
*
d
;
if
(
!
parent
)
return
;
dapm
->
debugfs_dapm
=
debugfs_create_dir
(
"dapm"
,
parent
);
if
(
!
dapm
->
debugfs_dapm
)
{
...
...
sound/soc/soc-pcm.c
View file @
d1113af4
...
...
@@ -1097,8 +1097,9 @@ static int dpcm_be_connect(struct snd_soc_pcm_runtime *fe,
stream
?
"<-"
:
"->"
,
be
->
dai_link
->
name
);
#ifdef CONFIG_DEBUG_FS
dpcm
->
debugfs_state
=
debugfs_create_u32
(
be
->
dai_link
->
name
,
0644
,
fe
->
debugfs_dpcm_root
,
&
dpcm
->
state
);
if
(
fe
->
debugfs_dpcm_root
)
dpcm
->
debugfs_state
=
debugfs_create_u32
(
be
->
dai_link
->
name
,
0644
,
fe
->
debugfs_dpcm_root
,
&
dpcm
->
state
);
#endif
return
1
;
}
...
...
@@ -2803,10 +2804,13 @@ static const struct file_operations dpcm_state_fops = {
.
llseek
=
default_llseek
,
};
int
soc_dpcm_debugfs_add
(
struct
snd_soc_pcm_runtime
*
rtd
)
void
soc_dpcm_debugfs_add
(
struct
snd_soc_pcm_runtime
*
rtd
)
{
if
(
!
rtd
->
dai_link
)
return
0
;
return
;
if
(
!
rtd
->
card
->
debugfs_card_root
)
return
;
rtd
->
debugfs_dpcm_root
=
debugfs_create_dir
(
rtd
->
dai_link
->
name
,
rtd
->
card
->
debugfs_card_root
);
...
...
@@ -2814,13 +2818,11 @@ int soc_dpcm_debugfs_add(struct snd_soc_pcm_runtime *rtd)
dev_dbg
(
rtd
->
dev
,
"ASoC: Failed to create dpcm debugfs directory %s
\n
"
,
rtd
->
dai_link
->
name
);
return
-
EINVAL
;
return
;
}
rtd
->
debugfs_dpcm_state
=
debugfs_create_file
(
"state"
,
0444
,
rtd
->
debugfs_dpcm_root
,
rtd
,
&
dpcm_state_fops
);
return
0
;
}
#endif
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