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
c8f7dbdb
Commit
c8f7dbdb
authored
Jul 31, 2020
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'asoc/for-5.8' into asoc-linus
parents
92ed3019
5aef1ff2
Changes
20
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
186 additions
and
98 deletions
+186
-98
drivers/spi/spi-lantiq-ssc.c
drivers/spi/spi-lantiq-ssc.c
+1
-1
sound/soc/codecs/max98357a.c
sound/soc/codecs/max98357a.c
+40
-10
sound/soc/codecs/max98390.c
sound/soc/codecs/max98390.c
+1
-1
sound/soc/fsl/fsl_sai.c
sound/soc/fsl/fsl_sai.c
+3
-2
sound/soc/fsl/fsl_sai.h
sound/soc/fsl/fsl_sai.h
+1
-1
sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c
sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c
+32
-9
sound/soc/intel/boards/skl_hda_dsp_common.h
sound/soc/intel/boards/skl_hda_dsp_common.h
+1
-0
sound/soc/intel/boards/skl_hda_dsp_generic.c
sound/soc/intel/boards/skl_hda_dsp_generic.c
+11
-6
sound/soc/intel/common/soc-acpi-intel-ehl-match.c
sound/soc/intel/common/soc-acpi-intel-ehl-match.c
+1
-1
sound/soc/meson/axg-card.c
sound/soc/meson/axg-card.c
+11
-9
sound/soc/meson/axg-tdm-formatter.c
sound/soc/meson/axg-tdm-formatter.c
+6
-5
sound/soc/meson/axg-tdm-formatter.h
sound/soc/meson/axg-tdm-formatter.h
+0
-1
sound/soc/meson/axg-tdm-interface.c
sound/soc/meson/axg-tdm-interface.c
+17
-9
sound/soc/meson/axg-tdmin.c
sound/soc/meson/axg-tdmin.c
+15
-1
sound/soc/meson/axg-tdmout.c
sound/soc/meson/axg-tdmout.c
+0
-3
sound/soc/meson/gx-card.c
sound/soc/meson/gx-card.c
+9
-9
sound/soc/meson/meson-card-utils.c
sound/soc/meson/meson-card-utils.c
+0
-4
sound/soc/soc-core.c
sound/soc/soc-core.c
+4
-1
sound/soc/soc-dai.c
sound/soc/soc-dai.c
+9
-7
sound/soc/soc-pcm.c
sound/soc/soc-pcm.c
+24
-18
No files found.
drivers/spi/spi-lantiq-ssc.c
View file @
c8f7dbdb
...
...
@@ -899,7 +899,7 @@ static int lantiq_ssc_probe(struct platform_device *pdev)
master
->
bits_per_word_mask
=
SPI_BPW_RANGE_MASK
(
2
,
8
)
|
SPI_BPW_MASK
(
16
)
|
SPI_BPW_MASK
(
32
);
spi
->
wq
=
alloc_ordered_workqueue
(
dev_name
(
dev
),
0
);
spi
->
wq
=
alloc_ordered_workqueue
(
dev_name
(
dev
),
WQ_MEM_RECLAIM
);
if
(
!
spi
->
wq
)
{
err
=
-
ENOMEM
;
goto
err_clk_put
;
...
...
sound/soc/codecs/max98357a.c
View file @
c8f7dbdb
...
...
@@ -23,36 +23,61 @@
struct
max98357a_priv
{
struct
gpio_desc
*
sdmode
;
unsigned
int
sdmode_delay
;
int
sdmode_switch
;
};
static
int
max98357a_
sdmode_event
(
struct
snd_soc_dapm_widget
*
w
,
struct
snd_kcontrol
*
kcontrol
,
int
event
)
static
int
max98357a_
daiops_trigger
(
struct
snd_pcm_substream
*
substream
,
int
cmd
,
struct
snd_soc_dai
*
dai
)
{
struct
snd_soc_component
*
component
=
snd_soc_dapm_to_component
(
w
->
dapm
);
struct
snd_soc_component
*
component
=
dai
->
component
;
struct
max98357a_priv
*
max98357a
=
snd_soc_component_get_drvdata
(
component
);
if
(
!
max98357a
->
sdmode
)
return
0
;
if
(
event
&
SND_SOC_DAPM_POST_PMU
)
{
msleep
(
max98357a
->
sdmode_delay
);
gpiod_set_value
(
max98357a
->
sdmode
,
1
);
dev_dbg
(
component
->
dev
,
"set sdmode to 1"
);
}
else
if
(
event
&
SND_SOC_DAPM_PRE_PMD
)
{
switch
(
cmd
)
{
case
SNDRV_PCM_TRIGGER_START
:
case
SNDRV_PCM_TRIGGER_RESUME
:
case
SNDRV_PCM_TRIGGER_PAUSE_RELEASE
:
mdelay
(
max98357a
->
sdmode_delay
);
if
(
max98357a
->
sdmode_switch
)
{
gpiod_set_value
(
max98357a
->
sdmode
,
1
);
dev_dbg
(
component
->
dev
,
"set sdmode to 1"
);
}
break
;
case
SNDRV_PCM_TRIGGER_STOP
:
case
SNDRV_PCM_TRIGGER_SUSPEND
:
case
SNDRV_PCM_TRIGGER_PAUSE_PUSH
:
gpiod_set_value
(
max98357a
->
sdmode
,
0
);
dev_dbg
(
component
->
dev
,
"set sdmode to 0"
);
break
;
}
return
0
;
}
static
int
max98357a_sdmode_event
(
struct
snd_soc_dapm_widget
*
w
,
struct
snd_kcontrol
*
kcontrol
,
int
event
)
{
struct
snd_soc_component
*
component
=
snd_soc_dapm_to_component
(
w
->
dapm
);
struct
max98357a_priv
*
max98357a
=
snd_soc_component_get_drvdata
(
component
);
if
(
event
&
SND_SOC_DAPM_POST_PMU
)
max98357a
->
sdmode_switch
=
1
;
else
if
(
event
&
SND_SOC_DAPM_POST_PMD
)
max98357a
->
sdmode_switch
=
0
;
return
0
;
}
static
const
struct
snd_soc_dapm_widget
max98357a_dapm_widgets
[]
=
{
SND_SOC_DAPM_OUTPUT
(
"Speaker"
),
SND_SOC_DAPM_OUT_DRV_E
(
"SD_MODE"
,
SND_SOC_NOPM
,
0
,
0
,
NULL
,
0
,
max98357a_sdmode_event
,
SND_SOC_DAPM_POST_PMU
|
SND_SOC_DAPM_P
RE
_PMD
),
SND_SOC_DAPM_POST_PMU
|
SND_SOC_DAPM_P
OST
_PMD
),
};
static
const
struct
snd_soc_dapm_route
max98357a_dapm_routes
[]
=
{
...
...
@@ -71,6 +96,10 @@ static const struct snd_soc_component_driver max98357a_component_driver = {
.
non_legacy_dai_naming
=
1
,
};
static
const
struct
snd_soc_dai_ops
max98357a_dai_ops
=
{
.
trigger
=
max98357a_daiops_trigger
,
};
static
struct
snd_soc_dai_driver
max98357a_dai_driver
=
{
.
name
=
"HiFi"
,
.
playback
=
{
...
...
@@ -90,6 +119,7 @@ static struct snd_soc_dai_driver max98357a_dai_driver = {
.
channels_min
=
1
,
.
channels_max
=
2
,
},
.
ops
=
&
max98357a_dai_ops
,
};
static
int
max98357a_platform_probe
(
struct
platform_device
*
pdev
)
...
...
sound/soc/codecs/max98390.c
View file @
c8f7dbdb
...
...
@@ -678,7 +678,7 @@ static const struct snd_kcontrol_new max98390_dai_controls =
static
const
struct
snd_soc_dapm_widget
max98390_dapm_widgets
[]
=
{
SND_SOC_DAPM_DAC_E
(
"Amp Enable"
,
"HiFi Playback"
,
MAX98390_R203A_AMP_EN
,
0
,
0
,
max98390_dac_event
,
SND_SOC_NOPM
,
0
,
0
,
max98390_dac_event
,
SND_SOC_DAPM_POST_PMU
|
SND_SOC_DAPM_POST_PMD
),
SND_SOC_DAPM_MUX
(
"DAI Sel Mux"
,
SND_SOC_NOPM
,
0
,
0
,
&
max98390_dai_controls
),
...
...
sound/soc/fsl/fsl_sai.c
View file @
c8f7dbdb
...
...
@@ -680,10 +680,11 @@ static int fsl_sai_dai_probe(struct snd_soc_dai *cpu_dai)
regmap_write
(
sai
->
regmap
,
FSL_SAI_RCSR
(
ofs
),
0
);
regmap_update_bits
(
sai
->
regmap
,
FSL_SAI_TCR1
(
ofs
),
FSL_SAI_CR1_RFW_MASK
,
FSL_SAI_CR1_RFW_MASK
(
sai
->
soc_data
->
fifo_depth
)
,
sai
->
soc_data
->
fifo_depth
-
FSL_SAI_MAXBURST_TX
);
regmap_update_bits
(
sai
->
regmap
,
FSL_SAI_RCR1
(
ofs
),
FSL_SAI_CR1_RFW_MASK
,
FSL_SAI_MAXBURST_RX
-
1
);
FSL_SAI_CR1_RFW_MASK
(
sai
->
soc_data
->
fifo_depth
),
FSL_SAI_MAXBURST_RX
-
1
);
snd_soc_dai_init_dma_data
(
cpu_dai
,
&
sai
->
dma_params_tx
,
&
sai
->
dma_params_rx
);
...
...
sound/soc/fsl/fsl_sai.h
View file @
c8f7dbdb
...
...
@@ -94,7 +94,7 @@
#define FSL_SAI_CSR_FRDE BIT(0)
/* SAI Transmit and Receive Configuration 1 Register */
#define FSL_SAI_CR1_RFW_MASK
0x1f
#define FSL_SAI_CR1_RFW_MASK
(x) ((x) - 1)
/* SAI Transmit and Receive Configuration 2 Register */
#define FSL_SAI_CR2_SYNC BIT(30)
...
...
sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c
View file @
c8f7dbdb
...
...
@@ -336,22 +336,45 @@ static int kabylake_ssp_fixup(struct snd_soc_pcm_runtime *rtd,
struct
snd_interval
*
chan
=
hw_param_interval
(
params
,
SNDRV_PCM_HW_PARAM_CHANNELS
);
struct
snd_mask
*
fmt
=
hw_param_mask
(
params
,
SNDRV_PCM_HW_PARAM_FORMAT
);
struct
snd_soc_dpcm
*
dpcm
=
container_of
(
params
,
struct
snd_soc_dpcm
,
hw_params
);
struct
snd_soc_dai_link
*
fe_dai_link
=
dpcm
->
fe
->
dai_link
;
struct
snd_soc_dai_link
*
be_dai_link
=
dpcm
->
be
->
dai_link
;
struct
snd_soc_dpcm
*
dpcm
,
*
rtd_dpcm
=
NULL
;
/*
* The following loop will be called only for playback stream
* In this platform, there is only one playback device on every SSP
*/
for_each_dpcm_fe
(
rtd
,
SNDRV_PCM_STREAM_PLAYBACK
,
dpcm
)
{
rtd_dpcm
=
dpcm
;
break
;
}
/*
* This following loop will be called only for capture stream
* In this platform, there is only one capture device on every SSP
*/
for_each_dpcm_fe
(
rtd
,
SNDRV_PCM_STREAM_CAPTURE
,
dpcm
)
{
rtd_dpcm
=
dpcm
;
break
;
}
if
(
!
rtd_dpcm
)
return
-
EINVAL
;
/*
* The above 2 loops are mutually exclusive based on the stream direction,
* thus rtd_dpcm variable will never be overwritten
*/
/*
* The ADSP will convert the FE rate to 48k, stereo, 24 bit
*/
if
(
!
strcmp
(
fe_
dai_link
->
name
,
"Kbl Audio Port"
)
||
!
strcmp
(
fe_
dai_link
->
name
,
"Kbl Audio Headset Playback"
)
||
!
strcmp
(
fe_
dai_link
->
name
,
"Kbl Audio Capture Port"
))
{
if
(
!
strcmp
(
rtd_dpcm
->
fe
->
dai_link
->
name
,
"Kbl Audio Port"
)
||
!
strcmp
(
rtd_dpcm
->
fe
->
dai_link
->
name
,
"Kbl Audio Headset Playback"
)
||
!
strcmp
(
rtd_dpcm
->
fe
->
dai_link
->
name
,
"Kbl Audio Capture Port"
))
{
rate
->
min
=
rate
->
max
=
48000
;
chan
->
min
=
chan
->
max
=
2
;
snd_mask_none
(
fmt
);
snd_mask_set_format
(
fmt
,
SNDRV_PCM_FORMAT_S24_LE
);
}
else
if
(
!
strcmp
(
fe_
dai_link
->
name
,
"Kbl Audio DMIC cap"
))
{
}
else
if
(
!
strcmp
(
rtd_dpcm
->
fe
->
dai_link
->
name
,
"Kbl Audio DMIC cap"
))
{
if
(
params_channels
(
params
)
==
2
||
DMIC_CH
(
dmic_constraints
)
==
2
)
chan
->
min
=
chan
->
max
=
2
;
...
...
@@ -362,7 +385,7 @@ static int kabylake_ssp_fixup(struct snd_soc_pcm_runtime *rtd,
* The speaker on the SSP0 supports S16_LE and not S24_LE.
* thus changing the mask here
*/
if
(
!
strcmp
(
be_
dai_link
->
name
,
"SSP0-Codec"
))
if
(
!
strcmp
(
rtd_dpcm
->
be
->
dai_link
->
name
,
"SSP0-Codec"
))
snd_mask_set_format
(
fmt
,
SNDRV_PCM_FORMAT_S16_LE
);
return
0
;
...
...
sound/soc/intel/boards/skl_hda_dsp_common.h
View file @
c8f7dbdb
...
...
@@ -33,6 +33,7 @@ struct skl_hda_private {
int
dai_index
;
const
char
*
platform_name
;
bool
common_hdmi_codec_drv
;
bool
idisp_codec
;
};
extern
struct
snd_soc_dai_link
skl_hda_be_dai_links
[
HDA_DSP_MAX_BE_DAI_LINKS
];
...
...
sound/soc/intel/boards/skl_hda_dsp_generic.c
View file @
c8f7dbdb
...
...
@@ -79,6 +79,9 @@ skl_hda_add_dai_link(struct snd_soc_card *card, struct snd_soc_dai_link *link)
link
->
platforms
->
name
=
ctx
->
platform_name
;
link
->
nonatomic
=
1
;
if
(
!
ctx
->
idisp_codec
)
return
0
;
if
(
strstr
(
link
->
name
,
"HDMI"
))
{
ret
=
skl_hda_hdmi_add_pcm
(
card
,
ctx
->
pcm_count
);
...
...
@@ -118,19 +121,20 @@ static char hda_soc_components[30];
static
int
skl_hda_fill_card_info
(
struct
snd_soc_acpi_mach_params
*
mach_params
)
{
struct
snd_soc_card
*
card
=
&
hda_soc_card
;
struct
skl_hda_private
*
ctx
=
snd_soc_card_get_drvdata
(
card
);
struct
snd_soc_dai_link
*
dai_link
;
u32
codec_count
,
codec_mask
,
idisp_mask
;
u32
codec_count
,
codec_mask
;
int
i
,
num_links
,
num_route
;
codec_mask
=
mach_params
->
codec_mask
;
codec_count
=
hweight_long
(
codec_mask
);
idisp_mask
=
codec_mask
&
IDISP_CODEC_MASK
;
ctx
->
idisp_codec
=
!!
(
codec_mask
&
IDISP_CODEC_MASK
)
;
if
(
!
codec_count
||
codec_count
>
2
||
(
codec_count
==
2
&&
!
idisp_mask
))
(
codec_count
==
2
&&
!
ctx
->
idisp_codec
))
return
-
EINVAL
;
if
(
codec_mask
==
idisp_mask
)
{
if
(
codec_mask
==
IDISP_CODEC_MASK
)
{
/* topology with iDisp as the only HDA codec */
num_links
=
IDISP_DAI_COUNT
+
DMIC_DAI_COUNT
;
num_route
=
IDISP_ROUTE_COUNT
;
...
...
@@ -152,7 +156,7 @@ static int skl_hda_fill_card_info(struct snd_soc_acpi_mach_params *mach_params)
num_route
=
ARRAY_SIZE
(
skl_hda_map
);
card
->
dapm_widgets
=
skl_hda_widgets
;
card
->
num_dapm_widgets
=
ARRAY_SIZE
(
skl_hda_widgets
);
if
(
!
idisp_mask
)
{
if
(
!
ctx
->
idisp_codec
)
{
for
(
i
=
0
;
i
<
IDISP_DAI_COUNT
;
i
++
)
{
skl_hda_be_dai_links
[
i
].
codecs
=
dummy_codec
;
skl_hda_be_dai_links
[
i
].
num_codecs
=
...
...
@@ -211,6 +215,8 @@ static int skl_hda_audio_probe(struct platform_device *pdev)
if
(
!
mach
)
return
-
EINVAL
;
snd_soc_card_set_drvdata
(
&
hda_soc_card
,
ctx
);
ret
=
skl_hda_fill_card_info
(
&
mach
->
mach_params
);
if
(
ret
<
0
)
{
dev_err
(
&
pdev
->
dev
,
"Unsupported HDAudio/iDisp configuration found
\n
"
);
...
...
@@ -223,7 +229,6 @@ static int skl_hda_audio_probe(struct platform_device *pdev)
ctx
->
common_hdmi_codec_drv
=
mach
->
mach_params
.
common_hdmi_codec_drv
;
hda_soc_card
.
dev
=
&
pdev
->
dev
;
snd_soc_card_set_drvdata
(
&
hda_soc_card
,
ctx
);
if
(
mach
->
mach_params
.
dmic_num
>
0
)
{
snprintf
(
hda_soc_components
,
sizeof
(
hda_soc_components
),
...
...
sound/soc/intel/common/soc-acpi-intel-ehl-match.c
View file @
c8f7dbdb
...
...
@@ -12,7 +12,7 @@
struct
snd_soc_acpi_mach
snd_soc_acpi_intel_ehl_machines
[]
=
{
{
.
id
=
"
INTC1027
"
,
.
id
=
"
10EC5660
"
,
.
drv_name
=
"ehl_rt5660"
,
.
sof_fw_filename
=
"sof-ehl.ri"
,
.
sof_tplg_filename
=
"sof-ehl-rt5660.tplg"
,
...
...
sound/soc/meson/axg-card.c
View file @
c8f7dbdb
...
...
@@ -116,7 +116,7 @@ static int axg_card_add_tdm_loopback(struct snd_soc_card *card,
lb
=
&
card
->
dai_link
[
*
index
+
1
];
lb
->
name
=
kasprintf
(
GFP_KERNEL
,
"%s-lb"
,
pad
->
name
);
lb
->
name
=
devm_kasprintf
(
card
->
dev
,
GFP_KERNEL
,
"%s-lb"
,
pad
->
name
);
if
(
!
lb
->
name
)
return
-
ENOMEM
;
...
...
@@ -327,20 +327,22 @@ static int axg_card_add_link(struct snd_soc_card *card, struct device_node *np,
return
ret
;
if
(
axg_card_cpu_is_playback_fe
(
dai_link
->
cpus
->
of_node
))
ret
=
meson_card_set_fe_link
(
card
,
dai_link
,
np
,
true
);
ret
urn
meson_card_set_fe_link
(
card
,
dai_link
,
np
,
true
);
else
if
(
axg_card_cpu_is_capture_fe
(
dai_link
->
cpus
->
of_node
))
ret
=
meson_card_set_fe_link
(
card
,
dai_link
,
np
,
false
);
else
ret
=
meson_card_set_be_link
(
card
,
dai_link
,
np
);
return
meson_card_set_fe_link
(
card
,
dai_link
,
np
,
false
);
ret
=
meson_card_set_be_link
(
card
,
dai_link
,
np
);
if
(
ret
)
return
ret
;
if
(
axg_card_cpu_is_tdm_iface
(
dai_link
->
cpus
->
of_node
))
ret
=
axg_card_parse_tdm
(
card
,
np
,
index
);
else
if
(
axg_card_cpu_is_codec
(
dai_link
->
cpus
->
of_node
))
{
if
(
axg_card_cpu_is_codec
(
dai_link
->
cpus
->
of_node
))
{
dai_link
->
params
=
&
codec_params
;
dai_link
->
no_pcm
=
0
;
/* link is not a DPCM BE */
}
else
{
dai_link
->
no_pcm
=
1
;
snd_soc_dai_link_set_capabilities
(
dai_link
);
if
(
axg_card_cpu_is_tdm_iface
(
dai_link
->
cpus
->
of_node
))
ret
=
axg_card_parse_tdm
(
card
,
np
,
index
);
}
return
ret
;
...
...
sound/soc/meson/axg-tdm-formatter.c
View file @
c8f7dbdb
...
...
@@ -70,7 +70,7 @@ EXPORT_SYMBOL_GPL(axg_tdm_formatter_set_channel_masks);
static
int
axg_tdm_formatter_enable
(
struct
axg_tdm_formatter
*
formatter
)
{
struct
axg_tdm_stream
*
ts
=
formatter
->
stream
;
bool
invert
=
formatter
->
drv
->
quirks
->
invert_sclk
;
bool
invert
;
int
ret
;
/* Do nothing if the formatter is already enabled */
...
...
@@ -96,11 +96,12 @@ static int axg_tdm_formatter_enable(struct axg_tdm_formatter *formatter)
return
ret
;
/*
* If sclk is inverted, invert it back and provide the inversion
* required by the formatter
* If sclk is inverted, it means the bit should latched on the
* rising edge which is what our HW expects. If not, we need to
* invert it before the formatter.
*/
invert
^
=
axg_tdm_sclk_invert
(
ts
->
iface
->
fmt
);
ret
=
clk_set_phase
(
formatter
->
sclk
,
invert
?
180
:
0
);
invert
=
axg_tdm_sclk_invert
(
ts
->
iface
->
fmt
);
ret
=
clk_set_phase
(
formatter
->
sclk
,
invert
?
0
:
18
0
);
if
(
ret
)
return
ret
;
...
...
sound/soc/meson/axg-tdm-formatter.h
View file @
c8f7dbdb
...
...
@@ -16,7 +16,6 @@ struct snd_kcontrol;
struct
axg_tdm_formatter_hw
{
unsigned
int
skew_offset
;
bool
invert_sclk
;
};
struct
axg_tdm_formatter_ops
{
...
...
sound/soc/meson/axg-tdm-interface.c
View file @
c8f7dbdb
...
...
@@ -119,18 +119,25 @@ static int axg_tdm_iface_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
{
struct
axg_tdm_iface
*
iface
=
snd_soc_dai_get_drvdata
(
dai
);
/* These modes are not supported */
if
(
fmt
&
(
SND_SOC_DAIFMT_CBS_CFM
|
SND_SOC_DAIFMT_CBM_CFS
))
{
switch
(
fmt
&
SND_SOC_DAIFMT_MASTER_MASK
)
{
case
SND_SOC_DAIFMT_CBS_CFS
:
if
(
!
iface
->
mclk
)
{
dev_err
(
dai
->
dev
,
"cpu clock master: mclk missing
\n
"
);
return
-
ENODEV
;
}
break
;
case
SND_SOC_DAIFMT_CBM_CFM
:
break
;
case
SND_SOC_DAIFMT_CBS_CFM
:
case
SND_SOC_DAIFMT_CBM_CFS
:
dev_err
(
dai
->
dev
,
"only CBS_CFS and CBM_CFM are supported
\n
"
);
/* Fall-through */
default:
return
-
EINVAL
;
}
/* If the TDM interface is the clock master, it requires mclk */
if
(
!
iface
->
mclk
&&
(
fmt
&
SND_SOC_DAIFMT_CBS_CFS
))
{
dev_err
(
dai
->
dev
,
"cpu clock master: mclk missing
\n
"
);
return
-
ENODEV
;
}
iface
->
fmt
=
fmt
;
return
0
;
}
...
...
@@ -319,7 +326,8 @@ static int axg_tdm_iface_hw_params(struct snd_pcm_substream *substream,
if
(
ret
)
return
ret
;
if
(
iface
->
fmt
&
SND_SOC_DAIFMT_CBS_CFS
)
{
if
((
iface
->
fmt
&
SND_SOC_DAIFMT_MASTER_MASK
)
==
SND_SOC_DAIFMT_CBS_CFS
)
{
ret
=
axg_tdm_iface_set_sclk
(
dai
,
params
);
if
(
ret
)
return
ret
;
...
...
sound/soc/meson/axg-tdmin.c
View file @
c8f7dbdb
...
...
@@ -228,15 +228,29 @@ static const struct axg_tdm_formatter_driver axg_tdmin_drv = {
.
regmap_cfg
=
&
axg_tdmin_regmap_cfg
,
.
ops
=
&
axg_tdmin_ops
,
.
quirks
=
&
(
const
struct
axg_tdm_formatter_hw
)
{
.
invert_sclk
=
false
,
.
skew_offset
=
2
,
},
};
static
const
struct
axg_tdm_formatter_driver
g12a_tdmin_drv
=
{
.
component_drv
=
&
axg_tdmin_component_drv
,
.
regmap_cfg
=
&
axg_tdmin_regmap_cfg
,
.
ops
=
&
axg_tdmin_ops
,
.
quirks
=
&
(
const
struct
axg_tdm_formatter_hw
)
{
.
skew_offset
=
3
,
},
};
static
const
struct
of_device_id
axg_tdmin_of_match
[]
=
{
{
.
compatible
=
"amlogic,axg-tdmin"
,
.
data
=
&
axg_tdmin_drv
,
},
{
.
compatible
=
"amlogic,g12a-tdmin"
,
.
data
=
&
g12a_tdmin_drv
,
},
{
.
compatible
=
"amlogic,sm1-tdmin"
,
.
data
=
&
g12a_tdmin_drv
,
},
{}
};
MODULE_DEVICE_TABLE
(
of
,
axg_tdmin_of_match
);
...
...
sound/soc/meson/axg-tdmout.c
View file @
c8f7dbdb
...
...
@@ -238,7 +238,6 @@ static const struct axg_tdm_formatter_driver axg_tdmout_drv = {
.
regmap_cfg
=
&
axg_tdmout_regmap_cfg
,
.
ops
=
&
axg_tdmout_ops
,
.
quirks
=
&
(
const
struct
axg_tdm_formatter_hw
)
{
.
invert_sclk
=
true
,
.
skew_offset
=
1
,
},
};
...
...
@@ -248,7 +247,6 @@ static const struct axg_tdm_formatter_driver g12a_tdmout_drv = {
.
regmap_cfg
=
&
axg_tdmout_regmap_cfg
,
.
ops
=
&
axg_tdmout_ops
,
.
quirks
=
&
(
const
struct
axg_tdm_formatter_hw
)
{
.
invert_sclk
=
true
,
.
skew_offset
=
2
,
},
};
...
...
@@ -309,7 +307,6 @@ static const struct axg_tdm_formatter_driver sm1_tdmout_drv = {
.
regmap_cfg
=
&
axg_tdmout_regmap_cfg
,
.
ops
=
&
axg_tdmout_ops
,
.
quirks
=
&
(
const
struct
axg_tdm_formatter_hw
)
{
.
invert_sclk
=
true
,
.
skew_offset
=
2
,
},
};
...
...
sound/soc/meson/gx-card.c
View file @
c8f7dbdb
...
...
@@ -96,21 +96,21 @@ static int gx_card_add_link(struct snd_soc_card *card, struct device_node *np,
return
ret
;
if
(
gx_card_cpu_identify
(
dai_link
->
cpus
,
"FIFO"
))
ret
=
meson_card_set_fe_link
(
card
,
dai_link
,
np
,
true
);
else
ret
=
meson_card_set_be_link
(
card
,
dai_link
,
np
);
return
meson_card_set_fe_link
(
card
,
dai_link
,
np
,
true
);
ret
=
meson_card_set_be_link
(
card
,
dai_link
,
np
);
if
(
ret
)
return
ret
;
/* Check if the cpu is the i2s encoder and parse i2s data */
if
(
gx_card_cpu_identify
(
dai_link
->
cpus
,
"I2S Encoder"
))
ret
=
gx_card_parse_i2s
(
card
,
np
,
index
);
/* Or apply codec to codec params if necessary */
else
if
(
gx_card_cpu_identify
(
dai_link
->
cpus
,
"CODEC CTRL"
))
{
if
(
gx_card_cpu_identify
(
dai_link
->
cpus
,
"CODEC CTRL"
))
{
dai_link
->
params
=
&
codec_params
;
dai_link
->
no_pcm
=
0
;
/* link is not a DPCM BE */
}
else
{
dai_link
->
no_pcm
=
1
;
snd_soc_dai_link_set_capabilities
(
dai_link
);
/* Check if the cpu is the i2s encoder and parse i2s data */
if
(
gx_card_cpu_identify
(
dai_link
->
cpus
,
"I2S Encoder"
))
ret
=
gx_card_parse_i2s
(
card
,
np
,
index
);
}
return
ret
;
...
...
sound/soc/meson/meson-card-utils.c
View file @
c8f7dbdb
...
...
@@ -147,10 +147,6 @@ int meson_card_set_be_link(struct snd_soc_card *card,
struct
device_node
*
np
;
int
ret
,
num_codecs
;
link
->
no_pcm
=
1
;
link
->
dpcm_playback
=
1
;
link
->
dpcm_capture
=
1
;
num_codecs
=
of_get_child_count
(
node
);
if
(
!
num_codecs
)
{
dev_err
(
card
->
dev
,
"be link %s has no codec
\n
"
,
...
...
sound/soc/soc-core.c
View file @
c8f7dbdb
...
...
@@ -446,7 +446,6 @@ static struct snd_soc_pcm_runtime *soc_new_pcm_runtime(
dev
->
parent
=
card
->
dev
;
dev
->
release
=
soc_release_rtd_dev
;
dev
->
groups
=
soc_dev_attr_groups
;
dev_set_name
(
dev
,
"%s"
,
dai_link
->
name
);
...
...
@@ -503,6 +502,10 @@ static struct snd_soc_pcm_runtime *soc_new_pcm_runtime(
/* see for_each_card_rtds */
list_add_tail
(
&
rtd
->
list
,
&
card
->
rtd_list
);
ret
=
device_add_groups
(
dev
,
soc_dev_attr_groups
);
if
(
ret
<
0
)
goto
free_rtd
;
return
rtd
;
free_rtd:
...
...
sound/soc/soc-dai.c
View file @
c8f7dbdb
...
...
@@ -400,28 +400,30 @@ void snd_soc_dai_link_set_capabilities(struct snd_soc_dai_link *dai_link)
struct
snd_soc_dai_link_component
*
codec
;
struct
snd_soc_dai
*
dai
;
bool
supported
[
SNDRV_PCM_STREAM_LAST
+
1
];
bool
supported_cpu
;
bool
supported_codec
;
int
direction
;
int
i
;
for_each_pcm_streams
(
direction
)
{
supported
[
direction
]
=
true
;
supported_cpu
=
false
;
supported_codec
=
false
;
for_each_link_cpus
(
dai_link
,
i
,
cpu
)
{
dai
=
snd_soc_find_dai
(
cpu
);
if
(
!
dai
||
!
snd_soc_dai_stream_valid
(
dai
,
direction
))
{
supported
[
direction
]
=
fals
e
;
if
(
dai
&&
snd_soc_dai_stream_valid
(
dai
,
direction
))
{
supported
_cpu
=
tru
e
;
break
;
}
}
if
(
!
supported
[
direction
])
continue
;
for_each_link_codecs
(
dai_link
,
i
,
codec
)
{
dai
=
snd_soc_find_dai
(
codec
);
if
(
!
dai
||
!
snd_soc_dai_stream_valid
(
dai
,
direction
))
{
supported
[
direction
]
=
fals
e
;
if
(
dai
&&
snd_soc_dai_stream_valid
(
dai
,
direction
))
{
supported
_codec
=
tru
e
;
break
;
}
}
supported
[
direction
]
=
supported_cpu
&&
supported_codec
;
}
dai_link
->
dpcm_playback
=
supported
[
SNDRV_PCM_STREAM_PLAYBACK
];
...
...
sound/soc/soc-pcm.c
View file @
c8f7dbdb
...
...
@@ -2802,30 +2802,36 @@ int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num)
if
(
rtd
->
dai_link
->
dpcm_playback
)
{
stream
=
SNDRV_PCM_STREAM_PLAYBACK
;
for_each_rtd_cpu_dais
(
rtd
,
i
,
cpu_dai
)
if
(
!
snd_soc_dai_stream_valid
(
cpu_dai
,
stream
))
{
dev_err
(
rtd
->
card
->
dev
,
"CPU DAI %s for rtd %s does not support playback
\n
"
,
cpu_dai
->
name
,
rtd
->
dai_link
->
stream_name
);
return
-
EINVAL
;
for_each_rtd_cpu_dais
(
rtd
,
i
,
cpu_dai
)
{
if
(
snd_soc_dai_stream_valid
(
cpu_dai
,
stream
))
{
playback
=
1
;
break
;
}
playback
=
1
;
}
if
(
!
playback
)
{
dev_err
(
rtd
->
card
->
dev
,
"No CPU DAIs support playback for stream %s
\n
"
,
rtd
->
dai_link
->
stream_name
);
return
-
EINVAL
;
}
}
if
(
rtd
->
dai_link
->
dpcm_capture
)
{
stream
=
SNDRV_PCM_STREAM_CAPTURE
;
for_each_rtd_cpu_dais
(
rtd
,
i
,
cpu_dai
)
if
(
!
snd_soc_dai_stream_valid
(
cpu_dai
,
stream
))
{
dev_err
(
rtd
->
card
->
dev
,
"CPU DAI %s for rtd %s does not support capture
\n
"
,
cpu_dai
->
name
,
rtd
->
dai_link
->
stream_name
);
return
-
EINVAL
;
for_each_rtd_cpu_dais
(
rtd
,
i
,
cpu_dai
)
{
if
(
snd_soc_dai_stream_valid
(
cpu_dai
,
stream
))
{
capture
=
1
;
break
;
}
capture
=
1
;
}
if
(
!
capture
)
{
dev_err
(
rtd
->
card
->
dev
,
"No CPU DAIs support capture for stream %s
\n
"
,
rtd
->
dai_link
->
stream_name
);
return
-
EINVAL
;
}
}
}
else
{
/* Adapt stream for codec2codec links */
...
...
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