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
2e700424
Commit
2e700424
authored
Sep 01, 2017
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'asoc/topic/component' into asoc-next
parents
ab99d987
44c07365
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
177 additions
and
56 deletions
+177
-56
include/sound/soc.h
include/sound/soc.h
+24
-8
sound/soc/soc-core.c
sound/soc/soc-core.c
+131
-48
sound/soc/soc-jack.c
sound/soc/soc-jack.c
+22
-0
No files found.
include/sound/soc.h
View file @
2e700424
...
...
@@ -469,10 +469,10 @@ int snd_soc_register_codec(struct device *dev,
struct
snd_soc_dai_driver
*
dai_drv
,
int
num_dai
);
void
snd_soc_unregister_codec
(
struct
device
*
dev
);
int
snd_soc_register_component
(
struct
device
*
dev
,
const
struct
snd_soc_component_driver
*
c
mpnt_drv
,
const
struct
snd_soc_component_driver
*
c
omponent_driver
,
struct
snd_soc_dai_driver
*
dai_drv
,
int
num_dai
);
int
devm_snd_soc_register_component
(
struct
device
*
dev
,
const
struct
snd_soc_component_driver
*
c
mpnt_drv
,
const
struct
snd_soc_component_driver
*
c
omponent_driver
,
struct
snd_soc_dai_driver
*
dai_drv
,
int
num_dai
);
void
snd_soc_unregister_component
(
struct
device
*
dev
);
int
snd_soc_cache_init
(
struct
snd_soc_codec
*
codec
);
...
...
@@ -795,6 +795,14 @@ struct snd_soc_component_driver {
int
(
*
suspend
)(
struct
snd_soc_component
*
);
int
(
*
resume
)(
struct
snd_soc_component
*
);
/* component wide operations */
int
(
*
set_sysclk
)(
struct
snd_soc_component
*
component
,
int
clk_id
,
int
source
,
unsigned
int
freq
,
int
dir
);
int
(
*
set_pll
)(
struct
snd_soc_component
*
component
,
int
pll_id
,
int
source
,
unsigned
int
freq_in
,
unsigned
int
freq_out
);
int
(
*
set_jack
)(
struct
snd_soc_component
*
component
,
struct
snd_soc_jack
*
jack
,
void
*
data
);
/* DT */
int
(
*
of_xlate_dai_name
)(
struct
snd_soc_component
*
component
,
struct
of_phandle_args
*
args
,
...
...
@@ -858,12 +866,6 @@ struct snd_soc_component {
/* Don't use these, use snd_soc_component_get_dapm() */
struct
snd_soc_dapm_context
dapm
;
const
struct
snd_kcontrol_new
*
controls
;
unsigned
int
num_controls
;
const
struct
snd_soc_dapm_widget
*
dapm_widgets
;
unsigned
int
num_dapm_widgets
;
const
struct
snd_soc_dapm_route
*
dapm_routes
;
unsigned
int
num_dapm_routes
;
struct
snd_soc_codec
*
codec
;
int
(
*
probe
)(
struct
snd_soc_component
*
);
...
...
@@ -871,6 +873,13 @@ struct snd_soc_component {
int
(
*
suspend
)(
struct
snd_soc_component
*
);
int
(
*
resume
)(
struct
snd_soc_component
*
);
int
(
*
set_sysclk
)(
struct
snd_soc_component
*
component
,
int
clk_id
,
int
source
,
unsigned
int
freq
,
int
dir
);
int
(
*
set_pll
)(
struct
snd_soc_component
*
component
,
int
pll_id
,
int
source
,
unsigned
int
freq_in
,
unsigned
int
freq_out
);
int
(
*
set_jack
)(
struct
snd_soc_component
*
component
,
struct
snd_soc_jack
*
jack
,
void
*
data
);
/* machine specific init */
int
(
*
init
)(
struct
snd_soc_component
*
component
);
...
...
@@ -1465,6 +1474,13 @@ void snd_soc_component_async_complete(struct snd_soc_component *component);
int
snd_soc_component_test_bits
(
struct
snd_soc_component
*
component
,
unsigned
int
reg
,
unsigned
int
mask
,
unsigned
int
value
);
/* component wide operations */
int
snd_soc_component_set_sysclk
(
struct
snd_soc_component
*
component
,
int
clk_id
,
int
source
,
unsigned
int
freq
,
int
dir
);
int
snd_soc_component_set_pll
(
struct
snd_soc_component
*
component
,
int
pll_id
,
int
source
,
unsigned
int
freq_in
,
unsigned
int
freq_out
);
#ifdef CONFIG_REGMAP
void
snd_soc_component_init_regmap
(
struct
snd_soc_component
*
component
,
...
...
sound/soc/soc-core.c
View file @
2e700424
...
...
@@ -1451,9 +1451,10 @@ static int soc_probe_component(struct snd_soc_card *card,
soc_init_component_debugfs
(
component
);
if
(
component
->
dapm_widgets
)
{
ret
=
snd_soc_dapm_new_controls
(
dapm
,
component
->
dapm_widgets
,
component
->
num_dapm_widgets
);
if
(
component
->
driver
->
dapm_widgets
)
{
ret
=
snd_soc_dapm_new_controls
(
dapm
,
component
->
driver
->
dapm_widgets
,
component
->
driver
->
num_dapm_widgets
);
if
(
ret
!=
0
)
{
dev_err
(
component
->
dev
,
...
...
@@ -1495,12 +1496,14 @@ static int soc_probe_component(struct snd_soc_card *card,
}
}
if
(
component
->
controls
)
snd_soc_add_component_controls
(
component
,
component
->
controls
,
component
->
num_controls
);
if
(
component
->
dapm_routes
)
snd_soc_dapm_add_routes
(
dapm
,
component
->
dapm_routes
,
component
->
num_dapm_routes
);
if
(
component
->
driver
->
controls
)
snd_soc_add_component_controls
(
component
,
component
->
driver
->
controls
,
component
->
driver
->
num_controls
);
if
(
component
->
driver
->
dapm_routes
)
snd_soc_dapm_add_routes
(
dapm
,
component
->
driver
->
dapm_routes
,
component
->
driver
->
num_dapm_routes
);
list_add
(
&
dapm
->
list
,
&
card
->
dapm_list
);
list_add
(
&
component
->
card_list
,
&
card
->
component_dev_list
);
...
...
@@ -2587,11 +2590,9 @@ int snd_soc_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id,
{
if
(
dai
->
driver
&&
dai
->
driver
->
ops
->
set_sysclk
)
return
dai
->
driver
->
ops
->
set_sysclk
(
dai
,
clk_id
,
freq
,
dir
);
else
if
(
dai
->
codec
&&
dai
->
codec
->
driver
->
set_sysclk
)
return
dai
->
codec
->
driver
->
set_sysclk
(
dai
->
codec
,
clk_id
,
0
,
freq
,
dir
);
else
return
-
ENOTSUPP
;
return
snd_soc_component_set_sysclk
(
dai
->
component
,
clk_id
,
0
,
freq
,
dir
);
}
EXPORT_SYMBOL_GPL
(
snd_soc_dai_set_sysclk
);
...
...
@@ -2616,6 +2617,32 @@ int snd_soc_codec_set_sysclk(struct snd_soc_codec *codec, int clk_id,
}
EXPORT_SYMBOL_GPL
(
snd_soc_codec_set_sysclk
);
/**
* snd_soc_component_set_sysclk - configure COMPONENT system or master clock.
* @component: COMPONENT
* @clk_id: DAI specific clock ID
* @source: Source for the clock
* @freq: new clock frequency in Hz
* @dir: new clock direction - input/output.
*
* Configures the CODEC master (MCLK) or system (SYSCLK) clocking.
*/
int
snd_soc_component_set_sysclk
(
struct
snd_soc_component
*
component
,
int
clk_id
,
int
source
,
unsigned
int
freq
,
int
dir
)
{
/* will be removed */
if
(
component
->
set_sysclk
)
return
component
->
set_sysclk
(
component
,
clk_id
,
source
,
freq
,
dir
);
if
(
component
->
driver
->
set_sysclk
)
return
component
->
driver
->
set_sysclk
(
component
,
clk_id
,
source
,
freq
,
dir
);
return
-
ENOTSUPP
;
}
EXPORT_SYMBOL_GPL
(
snd_soc_component_set_sysclk
);
/**
* snd_soc_dai_set_clkdiv - configure DAI clock dividers.
* @dai: DAI
...
...
@@ -2652,11 +2679,9 @@ int snd_soc_dai_set_pll(struct snd_soc_dai *dai, int pll_id, int source,
if
(
dai
->
driver
&&
dai
->
driver
->
ops
->
set_pll
)
return
dai
->
driver
->
ops
->
set_pll
(
dai
,
pll_id
,
source
,
freq_in
,
freq_out
);
else
if
(
dai
->
codec
&&
dai
->
codec
->
driver
->
set_pll
)
return
dai
->
codec
->
driver
->
set_pll
(
dai
->
codec
,
pll_id
,
source
,
freq_in
,
freq_out
);
else
return
-
EINVAL
;
return
snd_soc_component_set_pll
(
dai
->
component
,
pll_id
,
source
,
freq_in
,
freq_out
);
}
EXPORT_SYMBOL_GPL
(
snd_soc_dai_set_pll
);
...
...
@@ -2681,6 +2706,33 @@ int snd_soc_codec_set_pll(struct snd_soc_codec *codec, int pll_id, int source,
}
EXPORT_SYMBOL_GPL
(
snd_soc_codec_set_pll
);
/*
* snd_soc_component_set_pll - configure component PLL.
* @component: COMPONENT
* @pll_id: DAI specific PLL ID
* @source: DAI specific source for the PLL
* @freq_in: PLL input clock frequency in Hz
* @freq_out: requested PLL output clock frequency in Hz
*
* Configures and enables PLL to generate output clock based on input clock.
*/
int
snd_soc_component_set_pll
(
struct
snd_soc_component
*
component
,
int
pll_id
,
int
source
,
unsigned
int
freq_in
,
unsigned
int
freq_out
)
{
/* will be removed */
if
(
component
->
set_pll
)
return
component
->
set_pll
(
component
,
pll_id
,
source
,
freq_in
,
freq_out
);
if
(
component
->
driver
->
set_pll
)
return
component
->
driver
->
set_pll
(
component
,
pll_id
,
source
,
freq_in
,
freq_out
);
return
-
EINVAL
;
}
EXPORT_SYMBOL_GPL
(
snd_soc_component_set_pll
);
/**
* snd_soc_dai_set_bclk_ratio - configure BCLK to sample rate ratio.
* @dai: DAI
...
...
@@ -3171,6 +3223,9 @@ static int snd_soc_component_initialize(struct snd_soc_component *component,
component
->
remove
=
component
->
driver
->
remove
;
component
->
suspend
=
component
->
driver
->
suspend
;
component
->
resume
=
component
->
driver
->
resume
;
component
->
set_sysclk
=
component
->
driver
->
set_sysclk
;
component
->
set_pll
=
component
->
driver
->
set_pll
;
component
->
set_jack
=
component
->
driver
->
set_jack
;
dapm
=
&
component
->
dapm
;
dapm
->
dev
=
dev
;
...
...
@@ -3182,13 +3237,6 @@ static int snd_soc_component_initialize(struct snd_soc_component *component,
if
(
driver
->
stream_event
)
dapm
->
stream_event
=
snd_soc_component_stream_event
;
component
->
controls
=
driver
->
controls
;
component
->
num_controls
=
driver
->
num_controls
;
component
->
dapm_widgets
=
driver
->
dapm_widgets
;
component
->
num_dapm_widgets
=
driver
->
num_dapm_widgets
;
component
->
dapm_routes
=
driver
->
dapm_routes
;
component
->
num_dapm_routes
=
driver
->
num_dapm_routes
;
INIT_LIST_HEAD
(
&
component
->
dai_list
);
mutex_init
(
&
component
->
io_mutex
);
...
...
@@ -3280,40 +3328,40 @@ static void snd_soc_component_del_unlocked(struct snd_soc_component *component)
}
int
snd_soc_register_component
(
struct
device
*
dev
,
const
struct
snd_soc_component_driver
*
c
mpnt_drv
,
const
struct
snd_soc_component_driver
*
c
omponent_driver
,
struct
snd_soc_dai_driver
*
dai_drv
,
int
num_dai
)
{
struct
snd_soc_component
*
c
mp
nt
;
struct
snd_soc_component
*
c
ompone
nt
;
int
ret
;
c
mpnt
=
kzalloc
(
sizeof
(
*
cmp
nt
),
GFP_KERNEL
);
if
(
!
c
mp
nt
)
{
c
omponent
=
kzalloc
(
sizeof
(
*
compone
nt
),
GFP_KERNEL
);
if
(
!
c
ompone
nt
)
{
dev_err
(
dev
,
"ASoC: Failed to allocate memory
\n
"
);
return
-
ENOMEM
;
}
ret
=
snd_soc_component_initialize
(
c
mpnt
,
cmpnt_drv
,
dev
);
ret
=
snd_soc_component_initialize
(
c
omponent
,
component_driver
,
dev
);
if
(
ret
)
goto
err_free
;
c
mp
nt
->
ignore_pmdown_time
=
true
;
c
mp
nt
->
registered_as_component
=
true
;
c
ompone
nt
->
ignore_pmdown_time
=
true
;
c
ompone
nt
->
registered_as_component
=
true
;
ret
=
snd_soc_register_dais
(
c
mp
nt
,
dai_drv
,
num_dai
,
true
);
ret
=
snd_soc_register_dais
(
c
ompone
nt
,
dai_drv
,
num_dai
,
true
);
if
(
ret
<
0
)
{
dev_err
(
dev
,
"ASoC: Failed to register DAIs: %d
\n
"
,
ret
);
goto
err_cleanup
;
}
snd_soc_component_add
(
c
mp
nt
);
snd_soc_component_add
(
c
ompone
nt
);
return
0
;
err_cleanup:
snd_soc_component_cleanup
(
c
mp
nt
);
snd_soc_component_cleanup
(
c
ompone
nt
);
err_free:
kfree
(
c
mp
nt
);
kfree
(
c
ompone
nt
);
return
ret
;
}
EXPORT_SYMBOL_GPL
(
snd_soc_register_component
);
...
...
@@ -3325,22 +3373,26 @@ EXPORT_SYMBOL_GPL(snd_soc_register_component);
*/
void
snd_soc_unregister_component
(
struct
device
*
dev
)
{
struct
snd_soc_component
*
cmpnt
;
struct
snd_soc_component
*
component
;
int
found
=
0
;
mutex_lock
(
&
client_mutex
);
list_for_each_entry
(
cmpnt
,
&
component_list
,
list
)
{
if
(
dev
==
cmpnt
->
dev
&&
cmpnt
->
registered_as_component
)
goto
found
;
list_for_each_entry
(
component
,
&
component_list
,
list
)
{
if
(
dev
!=
component
->
dev
||
!
component
->
registered_as_component
)
continue
;
snd_soc_tplg_component_remove
(
component
,
SND_SOC_TPLG_INDEX_ALL
);
snd_soc_component_del_unlocked
(
component
);
found
=
1
;
break
;
}
mutex_unlock
(
&
client_mutex
);
return
;
found:
snd_soc_tplg_component_remove
(
cmpnt
,
SND_SOC_TPLG_INDEX_ALL
);
snd_soc_component_del_unlocked
(
cmpnt
);
mutex_unlock
(
&
client_mutex
);
snd_soc_component_cleanup
(
cmpnt
);
kfree
(
cmpnt
);
if
(
found
)
{
snd_soc_component_cleanup
(
component
);
kfree
(
component
);
}
}
EXPORT_SYMBOL_GPL
(
snd_soc_unregister_component
);
...
...
@@ -3557,6 +3609,31 @@ static int snd_soc_codec_drv_read(struct snd_soc_component *component,
return
0
;
}
static
int
snd_soc_codec_set_sysclk_
(
struct
snd_soc_component
*
component
,
int
clk_id
,
int
source
,
unsigned
int
freq
,
int
dir
)
{
struct
snd_soc_codec
*
codec
=
snd_soc_component_to_codec
(
component
);
return
snd_soc_codec_set_sysclk
(
codec
,
clk_id
,
source
,
freq
,
dir
);
}
static
int
snd_soc_codec_set_pll_
(
struct
snd_soc_component
*
component
,
int
pll_id
,
int
source
,
unsigned
int
freq_in
,
unsigned
int
freq_out
)
{
struct
snd_soc_codec
*
codec
=
snd_soc_component_to_codec
(
component
);
return
snd_soc_codec_set_pll
(
codec
,
pll_id
,
source
,
freq_in
,
freq_out
);
}
static
int
snd_soc_codec_set_jack_
(
struct
snd_soc_component
*
component
,
struct
snd_soc_jack
*
jack
,
void
*
data
)
{
struct
snd_soc_codec
*
codec
=
snd_soc_component_to_codec
(
component
);
return
snd_soc_codec_set_jack
(
codec
,
jack
,
data
);
}
static
int
snd_soc_codec_set_bias_level
(
struct
snd_soc_dapm_context
*
dapm
,
enum
snd_soc_bias_level
level
)
{
...
...
@@ -3608,6 +3685,12 @@ int snd_soc_register_codec(struct device *dev,
codec
->
component
.
write
=
snd_soc_codec_drv_write
;
if
(
codec_drv
->
read
)
codec
->
component
.
read
=
snd_soc_codec_drv_read
;
if
(
codec_drv
->
set_sysclk
)
codec
->
component
.
set_sysclk
=
snd_soc_codec_set_sysclk_
;
if
(
codec_drv
->
set_pll
)
codec
->
component
.
set_pll
=
snd_soc_codec_set_pll_
;
if
(
codec_drv
->
set_jack
)
codec
->
component
.
set_jack
=
snd_soc_codec_set_jack_
;
codec
->
component
.
ignore_pmdown_time
=
codec_drv
->
ignore_pmdown_time
;
dapm
=
snd_soc_codec_get_dapm
(
codec
);
...
...
sound/soc/soc-jack.c
View file @
2e700424
...
...
@@ -40,6 +40,28 @@ int snd_soc_codec_set_jack(struct snd_soc_codec *codec,
}
EXPORT_SYMBOL_GPL
(
snd_soc_codec_set_jack
);
/**
* snd_soc_component_set_jack - configure component jack.
* @component: COMPONENTs
* @jack: structure to use for the jack
* @data: can be used if codec driver need extra data for configuring jack
*
* Configures and enables jack detection function.
*/
int
snd_soc_component_set_jack
(
struct
snd_soc_component
*
component
,
struct
snd_soc_jack
*
jack
,
void
*
data
)
{
/* will be removed */
if
(
component
->
set_jack
)
return
component
->
set_jack
(
component
,
jack
,
data
);
if
(
component
->
driver
->
set_jack
)
return
component
->
driver
->
set_jack
(
component
,
jack
,
data
);
return
-
ENOTSUPP
;
}
EXPORT_SYMBOL_GPL
(
snd_soc_component_set_jack
);
/**
* snd_soc_card_jack_new - Create a new jack
* @card: ASoC card
...
...
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