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
16b57114
Commit
16b57114
authored
Feb 19, 2017
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'asoc/topic/intel' into asoc-next
parents
c7bb6d80
7ba8ba3f
Changes
37
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
37 changed files
with
1945 additions
and
845 deletions
+1945
-845
include/sound/soc.h
include/sound/soc.h
+4
-0
sound/hda/ext/hdac_ext_stream.c
sound/hda/ext/hdac_ext_stream.c
+9
-6
sound/soc/codecs/hdac_hdmi.c
sound/soc/codecs/hdac_hdmi.c
+818
-509
sound/soc/codecs/hdac_hdmi.h
sound/soc/codecs/hdac_hdmi.h
+4
-1
sound/soc/codecs/rt298.c
sound/soc/codecs/rt298.c
+7
-0
sound/soc/codecs/rt5640.c
sound/soc/codecs/rt5640.c
+1
-0
sound/soc/codecs/rt5645.c
sound/soc/codecs/rt5645.c
+2
-0
sound/soc/codecs/rt5670.c
sound/soc/codecs/rt5670.c
+1
-0
sound/soc/intel/Kconfig
sound/soc/intel/Kconfig
+20
-31
sound/soc/intel/Makefile
sound/soc/intel/Makefile
+1
-1
sound/soc/intel/atom/Makefile
sound/soc/intel/atom/Makefile
+4
-3
sound/soc/intel/atom/sst-atom-controls.c
sound/soc/intel/atom/sst-atom-controls.c
+2
-2
sound/soc/intel/atom/sst-mfld-platform-pcm.c
sound/soc/intel/atom/sst-mfld-platform-pcm.c
+3
-2
sound/soc/intel/atom/sst/sst_acpi.c
sound/soc/intel/atom/sst/sst_acpi.c
+50
-2
sound/soc/intel/atom/sst/sst_ipc.c
sound/soc/intel/atom/sst/sst_ipc.c
+0
-2
sound/soc/intel/atom/sst/sst_stream.c
sound/soc/intel/atom/sst/sst_stream.c
+0
-2
sound/soc/intel/boards/broadwell.c
sound/soc/intel/boards/broadwell.c
+2
-0
sound/soc/intel/boards/bxt_da7219_max98357a.c
sound/soc/intel/boards/bxt_da7219_max98357a.c
+71
-5
sound/soc/intel/boards/bxt_rt298.c
sound/soc/intel/boards/bxt_rt298.c
+73
-5
sound/soc/intel/boards/bytcr_rt5640.c
sound/soc/intel/boards/bytcr_rt5640.c
+10
-0
sound/soc/intel/boards/cht_bsw_rt5645.c
sound/soc/intel/boards/cht_bsw_rt5645.c
+349
-48
sound/soc/intel/boards/skl_nau88l25_max98357a.c
sound/soc/intel/boards/skl_nau88l25_max98357a.c
+26
-8
sound/soc/intel/boards/skl_nau88l25_ssm4567.c
sound/soc/intel/boards/skl_nau88l25_ssm4567.c
+26
-7
sound/soc/intel/boards/skl_rt286.c
sound/soc/intel/boards/skl_rt286.c
+23
-7
sound/soc/intel/common/sst-dsp.c
sound/soc/intel/common/sst-dsp.c
+26
-26
sound/soc/intel/skylake/bxt-sst.c
sound/soc/intel/skylake/bxt-sst.c
+22
-42
sound/soc/intel/skylake/skl-messages.c
sound/soc/intel/skylake/skl-messages.c
+7
-0
sound/soc/intel/skylake/skl-nhlt.c
sound/soc/intel/skylake/skl-nhlt.c
+49
-9
sound/soc/intel/skylake/skl-pcm.c
sound/soc/intel/skylake/skl-pcm.c
+91
-83
sound/soc/intel/skylake/skl-sst-dsp.h
sound/soc/intel/skylake/skl-sst-dsp.h
+1
-3
sound/soc/intel/skylake/skl-sst-ipc.h
sound/soc/intel/skylake/skl-sst-ipc.h
+3
-2
sound/soc/intel/skylake/skl-topology.c
sound/soc/intel/skylake/skl-topology.c
+71
-26
sound/soc/intel/skylake/skl-topology.h
sound/soc/intel/skylake/skl-topology.h
+19
-0
sound/soc/intel/skylake/skl-tplg-interface.h
sound/soc/intel/skylake/skl-tplg-interface.h
+0
-12
sound/soc/intel/skylake/skl.c
sound/soc/intel/skylake/skl.c
+12
-0
sound/soc/intel/skylake/skl.h
sound/soc/intel/skylake/skl.h
+4
-1
sound/soc/soc-core.c
sound/soc/soc-core.c
+134
-0
No files found.
include/sound/soc.h
View file @
16b57114
...
...
@@ -497,6 +497,8 @@ void snd_soc_runtime_deactivate(struct snd_soc_pcm_runtime *rtd, int stream);
int
snd_soc_runtime_set_dai_fmt
(
struct
snd_soc_pcm_runtime
*
rtd
,
unsigned
int
dai_fmt
);
int
snd_soc_set_dmi_name
(
struct
snd_soc_card
*
card
,
const
char
*
flavour
);
/* Utility functions to get clock rates from various things */
int
snd_soc_calc_frame_size
(
int
sample_size
,
int
channels
,
int
tdm_slots
);
int
snd_soc_params_to_frame_size
(
struct
snd_pcm_hw_params
*
params
);
...
...
@@ -1093,6 +1095,8 @@ struct snd_soc_card {
const
char
*
name
;
const
char
*
long_name
;
const
char
*
driver_name
;
char
dmi_longname
[
80
];
struct
device
*
dev
;
struct
snd_card
*
snd_card
;
struct
module
*
owner
;
...
...
sound/hda/ext/hdac_ext_stream.c
View file @
16b57114
...
...
@@ -128,14 +128,17 @@ void snd_hdac_ext_stream_decouple(struct hdac_ext_bus *ebus,
{
struct
hdac_stream
*
hstream
=
&
stream
->
hstream
;
struct
hdac_bus
*
bus
=
&
ebus
->
bus
;
u32
val
;
int
mask
=
AZX_PPCTL_PROCEN
(
hstream
->
index
);
spin_lock_irq
(
&
bus
->
reg_lock
);
if
(
decouple
)
snd_hdac_updatel
(
bus
->
ppcap
,
AZX_REG_PP_PPCTL
,
0
,
AZX_PPCTL_PROCEN
(
hstream
->
index
));
else
snd_hdac_updatel
(
bus
->
ppcap
,
AZX_REG_PP_PPCTL
,
AZX_PPCTL_PROCEN
(
hstream
->
index
),
0
);
val
=
readw
(
bus
->
ppcap
+
AZX_REG_PP_PPCTL
)
&
mask
;
if
(
decouple
&&
!
val
)
snd_hdac_updatel
(
bus
->
ppcap
,
AZX_REG_PP_PPCTL
,
mask
,
mask
);
else
if
(
!
decouple
&&
val
)
snd_hdac_updatel
(
bus
->
ppcap
,
AZX_REG_PP_PPCTL
,
mask
,
0
);
stream
->
decoupled
=
decouple
;
spin_unlock_irq
(
&
bus
->
reg_lock
);
}
...
...
sound/soc/codecs/hdac_hdmi.c
View file @
16b57114
This diff is collapsed.
Click to expand it.
sound/soc/codecs/hdac_hdmi.h
View file @
16b57114
#ifndef __HDAC_HDMI_H__
#define __HDAC_HDMI_H__
int
hdac_hdmi_jack_init
(
struct
snd_soc_dai
*
dai
,
int
pcm
);
int
hdac_hdmi_jack_init
(
struct
snd_soc_dai
*
dai
,
int
pcm
,
struct
snd_soc_jack
*
jack
);
int
hdac_hdmi_jack_port_init
(
struct
snd_soc_codec
*
codec
,
struct
snd_soc_dapm_context
*
dapm
);
#endif
/* __HDAC_HDMI_H__ */
sound/soc/codecs/rt298.c
View file @
16b57114
...
...
@@ -1163,6 +1163,13 @@ static const struct dmi_system_id force_combo_jack_table[] = {
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"Broxton P"
)
}
},
{
.
ident
=
"Intel Gemini Lake"
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"Intel Corp"
),
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"Geminilake"
)
}
},
{
}
};
...
...
sound/soc/codecs/rt5640.c
View file @
16b57114
...
...
@@ -2313,6 +2313,7 @@ MODULE_DEVICE_TABLE(of, rt5640_of_match);
#ifdef CONFIG_ACPI
static
const
struct
acpi_device_id
rt5640_acpi_match
[]
=
{
{
"INT33CA"
,
0
},
{
"10EC3276"
,
0
},
{
"10EC5640"
,
0
},
{
"10EC5642"
,
0
},
{
"INTCCFFD"
,
0
},
...
...
sound/soc/codecs/rt5645.c
View file @
16b57114
...
...
@@ -3545,8 +3545,10 @@ MODULE_DEVICE_TABLE(i2c, rt5645_i2c_id);
#ifdef CONFIG_ACPI
static
const
struct
acpi_device_id
rt5645_acpi_match
[]
=
{
{
"10EC5645"
,
0
},
{
"10EC5648"
,
0
},
{
"10EC5650"
,
0
},
{
"10EC5640"
,
0
},
{
"10EC3270"
,
0
},
{},
};
MODULE_DEVICE_TABLE
(
acpi
,
rt5645_acpi_match
);
...
...
sound/soc/codecs/rt5670.c
View file @
16b57114
...
...
@@ -2814,6 +2814,7 @@ MODULE_DEVICE_TABLE(i2c, rt5670_i2c_id);
static
const
struct
acpi_device_id
rt5670_acpi_match
[]
=
{
{
"10EC5670"
,
0
},
{
"10EC5672"
,
0
},
{
"10EC5640"
,
0
},
/* quirk */
{
},
};
MODULE_DEVICE_TABLE
(
acpi
,
rt5670_acpi_match
);
...
...
sound/soc/intel/Kconfig
View file @
16b57114
...
...
@@ -2,7 +2,7 @@ config SND_MFLD_MACHINE
tristate "SOC Machine Audio driver for Intel Medfield MID platform"
depends on INTEL_SCU_IPC
select SND_SOC_SN95031
select SND_SST_
MFLD
_PLATFORM
select SND_SST_
ATOM_HIFI2
_PLATFORM
select SND_SST_IPC_PCI
help
This adds support for ASoC machine driver for Intel(R) MID Medfield platform
...
...
@@ -10,7 +10,7 @@ config SND_MFLD_MACHINE
Say Y if you have such a device.
If unsure select "N".
config SND_SST_
MFLD
_PLATFORM
config SND_SST_
ATOM_HIFI2
_PLATFORM
tristate
select SND_SOC_COMPRESS
...
...
@@ -31,13 +31,10 @@ config SND_SOC_INTEL_SST
tristate
select SND_SOC_INTEL_SST_ACPI if ACPI
select SND_SOC_INTEL_SST_MATCH if ACPI
depends on (X86 || COMPILE_TEST)
# firmware stuff depends DW_DMAC_CORE; since there is no depends-on from
# the reverse selection, each machine driver needs to select
# SND_SOC_INTEL_SST_FIRMWARE carefully depending on DW_DMAC_CORE
config SND_SOC_INTEL_SST_FIRMWARE
tristate
select DW_DMAC_CORE
config SND_SOC_INTEL_SST_ACPI
tristate
...
...
@@ -47,16 +44,18 @@ config SND_SOC_INTEL_SST_MATCH
config SND_SOC_INTEL_HASWELL
tristate
select SND_SOC_INTEL_SST
select SND_SOC_INTEL_SST_FIRMWARE
config SND_SOC_INTEL_BAYTRAIL
tristate
select SND_SOC_INTEL_SST
select SND_SOC_INTEL_SST_FIRMWARE
config SND_SOC_INTEL_HASWELL_MACH
tristate "ASoC Audio DSP support for Intel Haswell Lynxpoint"
depends on X86_INTEL_LPSS && I2C && I2C_DESIGNWARE_PLATFORM
depends on DW_DMAC_CORE
select SND_SOC_INTEL_SST
depends on DMADEVICES
select SND_SOC_INTEL_HASWELL
select SND_SOC_RT5640
help
...
...
@@ -68,7 +67,6 @@ config SND_SOC_INTEL_HASWELL_MACH
config SND_SOC_INTEL_BXT_DA7219_MAX98357A_MACH
tristate "ASoC Audio driver for Broxton with DA7219 and MAX98357A in I2S Mode"
depends on X86 && ACPI && I2C
select SND_SOC_INTEL_SST
select SND_SOC_INTEL_SKYLAKE
select SND_SOC_DA7219
select SND_SOC_MAX98357A
...
...
@@ -84,7 +82,6 @@ config SND_SOC_INTEL_BXT_DA7219_MAX98357A_MACH
config SND_SOC_INTEL_BXT_RT298_MACH
tristate "ASoC Audio driver for Broxton with RT298 I2S mode"
depends on X86 && ACPI && I2C
select SND_SOC_INTEL_SST
select SND_SOC_INTEL_SKYLAKE
select SND_SOC_RT298
select SND_SOC_DMIC
...
...
@@ -99,9 +96,8 @@ config SND_SOC_INTEL_BXT_RT298_MACH
config SND_SOC_INTEL_BYT_RT5640_MACH
tristate "ASoC Audio driver for Intel Baytrail with RT5640 codec"
depends on X86_INTEL_LPSS && I2C
depends on DW_DMAC_CORE && (SND_SST_IPC_ACPI = n)
select SND_SOC_INTEL_SST
select SND_SOC_INTEL_SST_FIRMWARE
depends on DMADEVICES
depends on SND_SST_IPC_ACPI = n
select SND_SOC_INTEL_BAYTRAIL
select SND_SOC_RT5640
help
...
...
@@ -112,9 +108,8 @@ config SND_SOC_INTEL_BYT_RT5640_MACH
config SND_SOC_INTEL_BYT_MAX98090_MACH
tristate "ASoC Audio driver for Intel Baytrail with MAX98090 codec"
depends on X86_INTEL_LPSS && I2C
depends on DW_DMAC_CORE && (SND_SST_IPC_ACPI = n)
select SND_SOC_INTEL_SST
select SND_SOC_INTEL_SST_FIRMWARE
depends on DMADEVICES
depends on SND_SST_IPC_ACPI = n
select SND_SOC_INTEL_BAYTRAIL
select SND_SOC_MAX98090
help
...
...
@@ -123,9 +118,8 @@ config SND_SOC_INTEL_BYT_MAX98090_MACH
config SND_SOC_INTEL_BDW_RT5677_MACH
tristate "ASoC Audio driver for Intel Broadwell with RT5677 codec"
depends on X86_INTEL_LPSS && GPIOLIB && I2C && DW_DMAC
depends on DW_DMAC_CORE=y
select SND_SOC_INTEL_SST
depends on X86_INTEL_LPSS && GPIOLIB && I2C
depends on DMADEVICES
select SND_SOC_INTEL_HASWELL
select SND_SOC_RT5677
help
...
...
@@ -134,10 +128,8 @@ config SND_SOC_INTEL_BDW_RT5677_MACH
config SND_SOC_INTEL_BROADWELL_MACH
tristate "ASoC Audio DSP support for Intel Broadwell Wildcatpoint"
depends on X86_INTEL_LPSS && I2C && DW_DMAC && \
I2C_DESIGNWARE_PLATFORM
depends on DW_DMAC_CORE
select SND_SOC_INTEL_SST
depends on X86_INTEL_LPSS && I2C && I2C_DESIGNWARE_PLATFORM
depends on DMADEVICES
select SND_SOC_INTEL_HASWELL
select SND_SOC_RT286
help
...
...
@@ -150,7 +142,7 @@ config SND_SOC_INTEL_BYTCR_RT5640_MACH
tristate "ASoC Audio driver for Intel Baytrail and Baytrail-CR with RT5640 codec"
depends on X86 && I2C && ACPI
select SND_SOC_RT5640
select SND_SST_
MFLD
_PLATFORM
select SND_SST_
ATOM_HIFI2
_PLATFORM
select SND_SST_IPC_ACPI
select SND_SOC_INTEL_SST_MATCH if ACPI
help
...
...
@@ -163,7 +155,7 @@ config SND_SOC_INTEL_BYTCR_RT5651_MACH
tristate "ASoC Audio driver for Intel Baytrail and Baytrail-CR with RT5651 codec"
depends on X86 && I2C && ACPI
select SND_SOC_RT5651
select SND_SST_
MFLD
_PLATFORM
select SND_SST_
ATOM_HIFI2
_PLATFORM
select SND_SST_IPC_ACPI
select SND_SOC_INTEL_SST_MATCH if ACPI
help
...
...
@@ -176,7 +168,7 @@ config SND_SOC_INTEL_CHT_BSW_RT5672_MACH
tristate "ASoC Audio driver for Intel Cherrytrail & Braswell with RT5672 codec"
depends on X86_INTEL_LPSS && I2C && ACPI
select SND_SOC_RT5670
select SND_SST_
MFLD
_PLATFORM
select SND_SST_
ATOM_HIFI2
_PLATFORM
select SND_SST_IPC_ACPI
select SND_SOC_INTEL_SST_MATCH if ACPI
help
...
...
@@ -189,7 +181,7 @@ config SND_SOC_INTEL_CHT_BSW_RT5645_MACH
tristate "ASoC Audio driver for Intel Cherrytrail & Braswell with RT5645/5650 codec"
depends on X86_INTEL_LPSS && I2C && ACPI
select SND_SOC_RT5645
select SND_SST_
MFLD
_PLATFORM
select SND_SST_
ATOM_HIFI2
_PLATFORM
select SND_SST_IPC_ACPI
select SND_SOC_INTEL_SST_MATCH if ACPI
help
...
...
@@ -202,7 +194,7 @@ config SND_SOC_INTEL_CHT_BSW_MAX98090_TI_MACH
depends on X86_INTEL_LPSS && I2C && ACPI
select SND_SOC_MAX98090
select SND_SOC_TS3A227E
select SND_SST_
MFLD
_PLATFORM
select SND_SST_
ATOM_HIFI2
_PLATFORM
select SND_SST_IPC_ACPI
select SND_SOC_INTEL_SST_MATCH if ACPI
help
...
...
@@ -220,7 +212,6 @@ config SND_SOC_INTEL_SKYLAKE
config SND_SOC_INTEL_SKL_RT286_MACH
tristate "ASoC Audio driver for SKL with RT286 I2S mode"
depends on X86 && ACPI && I2C
select SND_SOC_INTEL_SST
select SND_SOC_INTEL_SKYLAKE
select SND_SOC_RT286
select SND_SOC_DMIC
...
...
@@ -234,7 +225,6 @@ config SND_SOC_INTEL_SKL_RT286_MACH
config SND_SOC_INTEL_SKL_NAU88L25_SSM4567_MACH
tristate "ASoC Audio driver for SKL with NAU88L25 and SSM4567 in I2S Mode"
depends on X86_INTEL_LPSS && I2C
select SND_SOC_INTEL_SST
select SND_SOC_INTEL_SKYLAKE
select SND_SOC_NAU8825
select SND_SOC_SSM4567
...
...
@@ -249,7 +239,6 @@ config SND_SOC_INTEL_SKL_NAU88L25_SSM4567_MACH
config SND_SOC_INTEL_SKL_NAU88L25_MAX98357A_MACH
tristate "ASoC Audio driver for SKL with NAU88L25 and MAX98357A in I2S Mode"
depends on X86_INTEL_LPSS && I2C
select SND_SOC_INTEL_SST
select SND_SOC_INTEL_SKYLAKE
select SND_SOC_NAU8825
select SND_SOC_MAX98357A
...
...
sound/soc/intel/Makefile
View file @
16b57114
...
...
@@ -4,7 +4,7 @@ obj-$(CONFIG_SND_SOC_INTEL_SST) += common/
# Platform Support
obj-$(CONFIG_SND_SOC_INTEL_HASWELL)
+=
haswell/
obj-$(CONFIG_SND_SOC_INTEL_BAYTRAIL)
+=
baytrail/
obj-$(CONFIG_SND_SST_
MFLD
_PLATFORM)
+=
atom/
obj-$(CONFIG_SND_SST_
ATOM_HIFI2
_PLATFORM)
+=
atom/
obj-$(CONFIG_SND_SOC_INTEL_SKYLAKE)
+=
skylake/
# Machine support
...
...
sound/soc/intel/atom/Makefile
View file @
16b57114
snd-soc-sst-mfld-platform-objs
:=
sst-mfld-platform-pcm.o
\
sst-mfld-platform-compress.o sst-atom-controls.o
snd-soc-sst-atom-hifi2-platform-objs
:=
sst-mfld-platform-pcm.o
\
sst-mfld-platform-compress.o
\
sst-atom-controls.o
obj-$(CONFIG_SND_SST_
MFLD_PLATFORM)
+=
snd-soc-sst-mfld
-platform.o
obj-$(CONFIG_SND_SST_
ATOM_HIFI2_PLATFORM)
+=
snd-soc-sst-atom-hifi2
-platform.o
# DSP driver
obj-$(CONFIG_SND_SST_IPC)
+=
sst/
sound/soc/intel/atom/sst-atom-controls.c
View file @
16b57114
...
...
@@ -1085,8 +1085,8 @@ static const struct snd_soc_dapm_widget sst_dapm_widgets[] = {
SST_PATH_INPUT
(
"sprot_loop_in"
,
SST_TASK_SBA
,
SST_SWM_IN_SPROT_LOOP
,
NULL
),
SST_PATH_INPUT
(
"media_loop1_in"
,
SST_TASK_SBA
,
SST_SWM_IN_MEDIA_LOOP1
,
NULL
),
SST_PATH_INPUT
(
"media_loop2_in"
,
SST_TASK_SBA
,
SST_SWM_IN_MEDIA_LOOP2
,
NULL
),
SST_PATH_MEDIA_LOOP_OUTPUT
(
"sprot_loop_out"
,
SST_TASK_SBA
,
SST_SWM_OUT_SPROT_LOOP
,
SST_FMT_
MON
O
,
sst_set_media_loop
),
SST_PATH_MEDIA_LOOP_OUTPUT
(
"media_loop1_out"
,
SST_TASK_SBA
,
SST_SWM_OUT_MEDIA_LOOP1
,
SST_FMT_
MON
O
,
sst_set_media_loop
),
SST_PATH_MEDIA_LOOP_OUTPUT
(
"sprot_loop_out"
,
SST_TASK_SBA
,
SST_SWM_OUT_SPROT_LOOP
,
SST_FMT_
STERE
O
,
sst_set_media_loop
),
SST_PATH_MEDIA_LOOP_OUTPUT
(
"media_loop1_out"
,
SST_TASK_SBA
,
SST_SWM_OUT_MEDIA_LOOP1
,
SST_FMT_
STERE
O
,
sst_set_media_loop
),
SST_PATH_MEDIA_LOOP_OUTPUT
(
"media_loop2_out"
,
SST_TASK_SBA
,
SST_SWM_OUT_MEDIA_LOOP2
,
SST_FMT_STEREO
,
sst_set_media_loop
),
/* Media Mixers */
...
...
sound/soc/intel/atom/sst-mfld-platform-pcm.c
View file @
16b57114
...
...
@@ -357,14 +357,14 @@ static void sst_media_close(struct snd_pcm_substream *substream,
struct
snd_soc_dai
*
dai
)
{
struct
sst_runtime_stream
*
stream
;
int
ret_val
=
0
,
str_id
;
int
str_id
;
stream
=
substream
->
runtime
->
private_data
;
power_down_sst
(
stream
);
str_id
=
stream
->
stream_info
.
str_id
;
if
(
str_id
)
ret_val
=
stream
->
ops
->
close
(
sst
->
dev
,
str_id
);
stream
->
ops
->
close
(
sst
->
dev
,
str_id
);
module_put
(
sst
->
dev
->
driver
->
owner
);
kfree
(
stream
);
}
...
...
@@ -839,4 +839,5 @@ MODULE_DESCRIPTION("ASoC Intel(R) MID Platform driver");
MODULE_AUTHOR
(
"Vinod Koul <vinod.koul@intel.com>"
);
MODULE_AUTHOR
(
"Harsha Priya <priya.harsha@intel.com>"
);
MODULE_LICENSE
(
"GPL v2"
);
MODULE_ALIAS
(
"platform:sst-atom-hifi2-platform"
);
MODULE_ALIAS
(
"platform:sst-mfld-platform"
);
sound/soc/intel/atom/sst/sst_acpi.c
View file @
16b57114
...
...
@@ -400,6 +400,7 @@ static int sst_acpi_remove(struct platform_device *pdev)
static
unsigned
long
cht_machine_id
;
#define CHT_SURFACE_MACH 1
#define BYT_THINKPAD_10 2
static
int
cht_surface_quirk_cb
(
const
struct
dmi_system_id
*
id
)
{
...
...
@@ -407,6 +408,23 @@ static int cht_surface_quirk_cb(const struct dmi_system_id *id)
return
1
;
}
static
int
byt_thinkpad10_quirk_cb
(
const
struct
dmi_system_id
*
id
)
{
cht_machine_id
=
BYT_THINKPAD_10
;
return
1
;
}
static
const
struct
dmi_system_id
byt_table
[]
=
{
{
.
callback
=
byt_thinkpad10_quirk_cb
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"LENOVO"
),
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"20C3001VHH"
),
},
},
{
}
};
static
const
struct
dmi_system_id
cht_table
[]
=
{
{
...
...
@@ -424,6 +442,10 @@ static struct sst_acpi_mach cht_surface_mach = {
"10EC5640"
,
"cht-bsw-rt5645"
,
"intel/fw_sst_22a8.bin"
,
"cht-bsw"
,
NULL
,
&
chv_platform_data
};
static
struct
sst_acpi_mach
byt_thinkpad_10
=
{
"10EC5640"
,
"cht-bsw-rt5672"
,
"intel/fw_sst_0f28.bin"
,
"cht-bsw"
,
NULL
,
&
byt_rvp_platform_data
};
static
struct
sst_acpi_mach
*
cht_quirk
(
void
*
arg
)
{
struct
sst_acpi_mach
*
mach
=
arg
;
...
...
@@ -436,8 +458,21 @@ static struct sst_acpi_mach *cht_quirk(void *arg)
return
mach
;
}
static
struct
sst_acpi_mach
*
byt_quirk
(
void
*
arg
)
{
struct
sst_acpi_mach
*
mach
=
arg
;
dmi_check_system
(
byt_table
);
if
(
cht_machine_id
==
BYT_THINKPAD_10
)
return
&
byt_thinkpad_10
;
else
return
mach
;
}
static
struct
sst_acpi_mach
sst_acpi_bytcr
[]
=
{
{
"10EC5640"
,
"bytcr_rt5640"
,
"intel/fw_sst_0f28.bin"
,
"bytcr_rt5640"
,
NULL
,
{
"10EC5640"
,
"bytcr_rt5640"
,
"intel/fw_sst_0f28.bin"
,
"bytcr_rt5640"
,
byt_quirk
,
&
byt_rvp_platform_data
},
{
"10EC5642"
,
"bytcr_rt5640"
,
"intel/fw_sst_0f28.bin"
,
"bytcr_rt5640"
,
NULL
,
&
byt_rvp_platform_data
},
...
...
@@ -445,6 +480,12 @@ static struct sst_acpi_mach sst_acpi_bytcr[] = {
&
byt_rvp_platform_data
},
{
"10EC5651"
,
"bytcr_rt5651"
,
"intel/fw_sst_0f28.bin"
,
"bytcr_rt5651"
,
NULL
,
&
byt_rvp_platform_data
},
/* some Baytrail platforms rely on RT5645, use CHT machine driver */
{
"10EC5645"
,
"cht-bsw-rt5645"
,
"intel/fw_sst_0f28.bin"
,
"cht-bsw"
,
NULL
,
&
byt_rvp_platform_data
},
{
"10EC5648"
,
"cht-bsw-rt5645"
,
"intel/fw_sst_0f28.bin"
,
"cht-bsw"
,
NULL
,
&
byt_rvp_platform_data
},
{},
};
...
...
@@ -458,12 +499,19 @@ static struct sst_acpi_mach sst_acpi_chv[] = {
&
chv_platform_data
},
{
"10EC5650"
,
"cht-bsw-rt5645"
,
"intel/fw_sst_22a8.bin"
,
"cht-bsw"
,
NULL
,
&
chv_platform_data
},
{
"10EC3270"
,
"cht-bsw-rt5645"
,
"intel/fw_sst_22a8.bin"
,
"cht-bsw"
,
NULL
,
&
chv_platform_data
},
{
"193C9890"
,
"cht-bsw-max98090"
,
"intel/fw_sst_22a8.bin"
,
"cht-bsw"
,
NULL
,
&
chv_platform_data
},
/* some CHT-T platforms rely on RT5640, use Baytrail machine driver */
{
"10EC5640"
,
"bytcr_rt5640"
,
"intel/fw_sst_22a8.bin"
,
"bytcr_rt5640"
,
cht_quirk
,
&
chv_platform_data
},
{
"10EC3276"
,
"bytcr_rt5640"
,
"intel/fw_sst_22a8.bin"
,
"bytcr_rt5640"
,
NULL
,
&
chv_platform_data
},
/* some CHT-T platforms rely on RT5651, use Baytrail machine driver */
{
"10EC5651"
,
"bytcr_rt5651"
,
"intel/fw_sst_22a8.bin"
,
"bytcr_rt5651"
,
NULL
,
&
chv_platform_data
},
{},
};
...
...
sound/soc/intel/atom/sst/sst_ipc.c
View file @
16b57114
...
...
@@ -260,10 +260,8 @@ static void process_fw_async_msg(struct intel_sst_drv *sst_drv_ctx,
u32
data_size
,
i
;
void
*
data_offset
;
struct
stream_info
*
stream
;
union
ipc_header_high
msg_high
;
u32
msg_low
,
pipe_id
;
msg_high
=
msg
->
mrfld_header
.
p
.
header_high
;
msg_low
=
msg
->
mrfld_header
.
p
.
header_low_payload
;
msg_id
=
((
struct
ipc_dsp_hdr
*
)
msg
->
mailbox_data
)
->
cmd_id
;
data_offset
=
(
msg
->
mailbox_data
+
sizeof
(
struct
ipc_dsp_hdr
));
...
...
sound/soc/intel/atom/sst/sst_stream.c
View file @
16b57114
...
...
@@ -394,7 +394,6 @@ int sst_free_stream(struct intel_sst_drv *sst_drv_ctx, int str_id)
{
int
retval
=
0
;
struct
stream_info
*
str_info
;
struct
intel_sst_ops
*
ops
;
dev_dbg
(
sst_drv_ctx
->
dev
,
"SST DBG:sst_free_stream for %d
\n
"
,
str_id
);
...
...
@@ -407,7 +406,6 @@ int sst_free_stream(struct intel_sst_drv *sst_drv_ctx, int str_id)
str_info
=
get_stream_info
(
sst_drv_ctx
,
str_id
);
if
(
!
str_info
)
return
-
EINVAL
;
ops
=
sst_drv_ctx
->
ops
;
mutex_lock
(
&
str_info
->
lock
);
if
(
str_info
->
status
!=
STREAM_UN_INIT
)
{
...
...
sound/soc/intel/boards/broadwell.c
View file @
16b57114
...
...
@@ -270,6 +270,8 @@ static int broadwell_audio_probe(struct platform_device *pdev)
{
broadwell_rt286
.
dev
=
&
pdev
->
dev
;
snd_soc_set_dmi_name
(
&
broadwell_rt286
,
NULL
);
return
devm_snd_soc_register_card
(
&
pdev
->
dev
,
&
broadwell_rt286
);
}
...
...
sound/soc/intel/boards/bxt_da7219_max98357a.c
View file @
16b57114
...
...
@@ -33,6 +33,17 @@
#define QUAD_CHANNEL 4
static
struct
snd_soc_jack
broxton_headset
;
static
struct
snd_soc_jack
broxton_hdmi
[
3
];
struct
bxt_hdmi_pcm
{
struct
list_head
head
;
struct
snd_soc_dai
*
codec_dai
;
int
device
;
};
struct
bxt_card_private
{
struct
list_head
hdmi_pcm_list
;
};
enum
{
BXT_DPCM_AUDIO_PB
=
0
,
...
...
@@ -84,9 +95,9 @@ static const struct snd_soc_dapm_route broxton_map[] = {
{
"codec0_in"
,
NULL
,
"ssp1 Rx"
},
{
"ssp1 Rx"
,
NULL
,
"Capture"
},
{
"HDMI1"
,
NULL
,
"hif5 Output"
},
{
"HDMI2"
,
NULL
,
"hif6 Output"
},
{
"HDMI
3"
,
NULL
,
"hif7
Output"
},
{
"HDMI1"
,
NULL
,
"hif5
-0
Output"
},
{
"HDMI2"
,
NULL
,
"hif6
-0
Output"
},
{
"HDMI
2"
,
NULL
,
"hif7-0
Output"
},
{
"hifi3"
,
NULL
,
"iDisp3 Tx"
},
{
"iDisp3 Tx"
,
NULL
,
"iDisp3_out"
},
...
...
@@ -147,9 +158,20 @@ static int broxton_da7219_codec_init(struct snd_soc_pcm_runtime *rtd)
static
int
broxton_hdmi_init
(
struct
snd_soc_pcm_runtime
*
rtd
)
{
struct
bxt_card_private
*
ctx
=
snd_soc_card_get_drvdata
(
rtd
->
card
);
struct
snd_soc_dai
*
dai
=
rtd
->
codec_dai
;
struct
bxt_hdmi_pcm
*
pcm
;
pcm
=
devm_kzalloc
(
rtd
->
card
->
dev
,
sizeof
(
*
pcm
),
GFP_KERNEL
);
if
(
!
pcm
)
return
-
ENOMEM
;
return
hdac_hdmi_jack_init
(
dai
,
BXT_DPCM_AUDIO_HDMI1_PB
+
dai
->
id
);
pcm
->
device
=
BXT_DPCM_AUDIO_HDMI1_PB
+
dai
->
id
;
pcm
->
codec_dai
=
dai
;
list_add_tail
(
&
pcm
->
head
,
&
ctx
->
hdmi_pcm_list
);
return
0
;
}
static
int
broxton_da7219_fe_init
(
struct
snd_soc_pcm_runtime
*
rtd
)
...
...
@@ -357,7 +379,6 @@ static struct snd_soc_dai_link broxton_dais[] = {
.
platform_name
=
"0000:00:0e.0"
,
.
init
=
NULL
,
.
dpcm_capture
=
1
,
.
ignore_suspend
=
1
,
.
nonatomic
=
1
,
.
dynamic
=
1
,
.
ops
=
&
broxton_refcap_ops
,
...
...
@@ -497,6 +518,40 @@ static struct snd_soc_dai_link broxton_dais[] = {
},
};
#define NAME_SIZE 32
static
int
bxt_card_late_probe
(
struct
snd_soc_card
*
card
)
{
struct
bxt_card_private
*
ctx
=
snd_soc_card_get_drvdata
(
card
);
struct
bxt_hdmi_pcm
*
pcm
;
struct
snd_soc_codec
*
codec
=
NULL
;
int
err
,
i
=
0
;
char
jack_name
[
NAME_SIZE
];
list_for_each_entry
(
pcm
,
&
ctx
->
hdmi_pcm_list
,
head
)
{
codec
=
pcm
->
codec_dai
->
codec
;
snprintf
(
jack_name
,
sizeof
(
jack_name
),
"HDMI/DP, pcm=%d Jack"
,
pcm
->
device
);
err
=
snd_soc_card_jack_new
(
card
,
jack_name
,
SND_JACK_AVOUT
,
&
broxton_hdmi
[
i
],
NULL
,
0
);
if
(
err
)
return
err
;
err
=
hdac_hdmi_jack_init
(
pcm
->
codec_dai
,
pcm
->
device
,
&
broxton_hdmi
[
i
]);
if
(
err
<
0
)
return
err
;
i
++
;
}
if
(
!
codec
)
return
-
EINVAL
;
return
hdac_hdmi_jack_port_init
(
codec
,
&
card
->
dapm
);
}
/* broxton audio machine driver for SPT + da7219 */
static
struct
snd_soc_card
broxton_audio_card
=
{
.
name
=
"bxtda7219max"
,
...
...
@@ -510,11 +565,22 @@ static struct snd_soc_card broxton_audio_card = {
.
dapm_routes
=
broxton_map
,
.
num_dapm_routes
=
ARRAY_SIZE
(
broxton_map
),
.
fully_routed
=
true
,
.
late_probe
=
bxt_card_late_probe
,
};
static
int
broxton_audio_probe
(
struct
platform_device
*
pdev
)
{
struct
bxt_card_private
*
ctx
;
ctx
=
devm_kzalloc
(
&
pdev
->
dev
,
sizeof
(
*
ctx
),
GFP_ATOMIC
);
if
(
!
ctx
)
return
-
ENOMEM
;
INIT_LIST_HEAD
(
&
ctx
->
hdmi_pcm_list
);
broxton_audio_card
.
dev
=
&
pdev
->
dev
;
snd_soc_card_set_drvdata
(
&
broxton_audio_card
,
ctx
);
return
devm_snd_soc_register_card
(
&
pdev
->
dev
,
&
broxton_audio_card
);
}
...
...
sound/soc/intel/boards/bxt_rt298.c
View file @
16b57114
...
...
@@ -26,8 +26,19 @@
#include "../../codecs/hdac_hdmi.h"
#include "../../codecs/rt298.h"
static
struct
snd_soc_jack
broxton_headset
;
/* Headset jack detection DAPM pins */
static
struct
snd_soc_jack
broxton_headset
;
static
struct
snd_soc_jack
broxton_hdmi
[
3
];
struct
bxt_hdmi_pcm
{
struct
list_head
head
;
struct
snd_soc_dai
*
codec_dai
;
int
device
;
};
struct
bxt_rt286_private
{
struct
list_head
hdmi_pcm_list
;
};
enum
{
BXT_DPCM_AUDIO_PB
=
0
,
...
...
@@ -82,9 +93,9 @@ static const struct snd_soc_dapm_route broxton_rt298_map[] = {
{
"DMIC1 Pin"
,
NULL
,
"DMIC2"
},
{
"DMic"
,
NULL
,
"SoC DMIC"
},
{
"HDMI1"
,
NULL
,
"hif5 Output"
},
{
"HDMI2"
,
NULL
,
"hif6 Output"
},
{
"HDMI
3"
,
NULL
,
"hif7
Output"
},
{
"HDMI1"
,
NULL
,
"hif5
-0
Output"
},
{
"HDMI2"
,
NULL
,
"hif6
-0
Output"
},
{
"HDMI
2"
,
NULL
,
"hif7-0
Output"
},
/* CODEC BE connections */
{
"AIF1 Playback"
,
NULL
,
"ssp5 Tx"
},
...
...
@@ -139,9 +150,20 @@ static int broxton_rt298_codec_init(struct snd_soc_pcm_runtime *rtd)
static
int
broxton_hdmi_init
(
struct
snd_soc_pcm_runtime
*
rtd
)
{
struct
bxt_rt286_private
*
ctx
=
snd_soc_card_get_drvdata
(
rtd
->
card
);
struct
snd_soc_dai
*
dai
=
rtd
->
codec_dai
;
struct
bxt_hdmi_pcm
*
pcm
;
return
hdac_hdmi_jack_init
(
dai
,
BXT_DPCM_AUDIO_HDMI1_PB
+
dai
->
id
);
pcm
=
devm_kzalloc
(
rtd
->
card
->
dev
,
sizeof
(
*
pcm
),
GFP_KERNEL
);
if
(
!
pcm
)
return
-
ENOMEM
;
pcm
->
device
=
BXT_DPCM_AUDIO_HDMI1_PB
+
dai
->
id
;
pcm
->
codec_dai
=
dai
;
list_add_tail
(
&
pcm
->
head
,
&
ctx
->
hdmi_pcm_list
);
return
0
;
}
static
int
broxton_ssp5_fixup
(
struct
snd_soc_pcm_runtime
*
rtd
,
...
...
@@ -432,6 +454,41 @@ static struct snd_soc_dai_link broxton_rt298_dais[] = {
},
};
#define NAME_SIZE 32
static
int
bxt_card_late_probe
(
struct
snd_soc_card
*
card
)
{
struct
bxt_rt286_private
*
ctx
=
snd_soc_card_get_drvdata
(
card
);
struct
bxt_hdmi_pcm
*
pcm
;
struct
snd_soc_codec
*
codec
=
NULL
;
int
err
,
i
=
0
;
char
jack_name
[
NAME_SIZE
];
list_for_each_entry
(
pcm
,
&
ctx
->
hdmi_pcm_list
,
head
)
{
codec
=
pcm
->
codec_dai
->
codec
;
snprintf
(
jack_name
,
sizeof
(
jack_name
),
"HDMI/DP, pcm=%d Jack"
,
pcm
->
device
);
err
=
snd_soc_card_jack_new
(
card
,
jack_name
,
SND_JACK_AVOUT
,
&
broxton_hdmi
[
i
],
NULL
,
0
);
if
(
err
)
return
err
;
err
=
hdac_hdmi_jack_init
(
pcm
->
codec_dai
,
pcm
->
device
,
&
broxton_hdmi
[
i
]);
if
(
err
<
0
)
return
err
;
i
++
;
}
if
(
!
codec
)
return
-
EINVAL
;
return
hdac_hdmi_jack_port_init
(
codec
,
&
card
->
dapm
);
}
/* broxton audio machine driver for SPT + RT298S */
static
struct
snd_soc_card
broxton_rt298
=
{
.
name
=
"broxton-rt298"
,
...
...
@@ -445,11 +502,22 @@ static struct snd_soc_card broxton_rt298 = {
.
dapm_routes
=
broxton_rt298_map
,
.
num_dapm_routes
=
ARRAY_SIZE
(
broxton_rt298_map
),
.
fully_routed
=
true
,
.
late_probe
=
bxt_card_late_probe
,
};
static
int
broxton_audio_probe
(
struct
platform_device
*
pdev
)
{
struct
bxt_rt286_private
*
ctx
;
ctx
=
devm_kzalloc
(
&
pdev
->
dev
,
sizeof
(
*
ctx
),
GFP_ATOMIC
);
if
(
!
ctx
)
return
-
ENOMEM
;
INIT_LIST_HEAD
(
&
ctx
->
hdmi_pcm_list
);
broxton_rt298
.
dev
=
&
pdev
->
dev
;
snd_soc_card_set_drvdata
(
&
broxton_rt298
,
ctx
);
return
devm_snd_soc_register_card
(
&
pdev
->
dev
,
&
broxton_rt298
);
}
...
...
sound/soc/intel/boards/bytcr_rt5640.c
View file @
16b57114
...
...
@@ -386,6 +386,16 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {
BYT_RT5640_MCLK_EN
|
BYT_RT5640_SSP0_AIF1
),
},
{
.
callback
=
byt_rt5640_quirk_cb
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"Insyde"
),
},
.
driver_data
=
(
unsigned
long
*
)(
BYT_RT5640_IN3_MAP
|
BYT_RT5640_MCLK_EN
|
BYT_RT5640_SSP0_AIF1
),
},
{}
};
...
...
sound/soc/intel/boards/cht_bsw_rt5645.c
View file @
16b57114
This diff is collapsed.
Click to expand it.
sound/soc/intel/boards/skl_nau88l25_max98357a.c
View file @
16b57114
...
...
@@ -32,6 +32,7 @@
static
struct
snd_soc_jack
skylake_headset
;
static
struct
snd_soc_card
skylake_audio_card
;
static
const
struct
snd_pcm_hw_constraint_list
*
dmic_constraints
;
static
struct
snd_soc_jack
skylake_hdmi
[
3
];
struct
skl_hdmi_pcm
{
struct
list_head
head
;
...
...
@@ -111,8 +112,8 @@ static const struct snd_soc_dapm_widget skylake_widgets[] = {
SND_SOC_DAPM_MIC
(
"Headset Mic"
,
NULL
),
SND_SOC_DAPM_SPK
(
"Spk"
,
NULL
),
SND_SOC_DAPM_MIC
(
"SoC DMIC"
,
NULL
),
SND_SOC_DAPM_SPK
(
"DP"
,
NULL
),
SND_SOC_DAPM_SPK
(
"
HDMI
"
,
NULL
),
SND_SOC_DAPM_SPK
(
"DP
1
"
,
NULL
),
SND_SOC_DAPM_SPK
(
"
DP2
"
,
NULL
),
SND_SOC_DAPM_SUPPLY
(
"Platform Clock"
,
SND_SOC_NOPM
,
0
,
0
,
platform_clock_control
,
SND_SOC_DAPM_PRE_PMU
|
SND_SOC_DAPM_POST_PMD
),
...
...
@@ -130,9 +131,6 @@ static const struct snd_soc_dapm_route skylake_map[] = {
{
"MIC"
,
NULL
,
"Headset Mic"
},
{
"DMic"
,
NULL
,
"SoC DMIC"
},
{
"HDMI"
,
NULL
,
"hif5 Output"
},
{
"DP"
,
NULL
,
"hif6 Output"
},
/* CODEC BE connections */
{
"HiFi Playback"
,
NULL
,
"ssp0 Tx"
},
{
"ssp0 Tx"
,
NULL
,
"codec0_out"
},
...
...
@@ -603,19 +601,39 @@ static struct snd_soc_dai_link skylake_dais[] = {
},
};
#define NAME_SIZE 32
static
int
skylake_card_late_probe
(
struct
snd_soc_card
*
card
)
{
struct
skl_nau8825_private
*
ctx
=
snd_soc_card_get_drvdata
(
card
);
struct
skl_hdmi_pcm
*
pcm
;
int
err
;
struct
snd_soc_codec
*
codec
=
NULL
;
int
err
,
i
=
0
;
char
jack_name
[
NAME_SIZE
];
list_for_each_entry
(
pcm
,
&
ctx
->
hdmi_pcm_list
,
head
)
{
err
=
hdac_hdmi_jack_init
(
pcm
->
codec_dai
,
pcm
->
device
);
codec
=
pcm
->
codec_dai
->
codec
;
snprintf
(
jack_name
,
sizeof
(
jack_name
),
"HDMI/DP, pcm=%d Jack"
,
pcm
->
device
);
err
=
snd_soc_card_jack_new
(
card
,
jack_name
,
SND_JACK_AVOUT
,
&
skylake_hdmi
[
i
],
NULL
,
0
);
if
(
err
)
return
err
;
err
=
hdac_hdmi_jack_init
(
pcm
->
codec_dai
,
pcm
->
device
,
&
skylake_hdmi
[
i
]);
if
(
err
<
0
)
return
err
;
i
++
;
}
return
0
;
if
(
!
codec
)
return
-
EINVAL
;
return
hdac_hdmi_jack_port_init
(
codec
,
&
card
->
dapm
);
}
/* skylake audio machine driver for SPT + NAU88L25 */
...
...
sound/soc/intel/boards/skl_nau88l25_ssm4567.c
View file @
16b57114
...
...
@@ -36,6 +36,7 @@
static
struct
snd_soc_jack
skylake_headset
;
static
struct
snd_soc_card
skylake_audio_card
;
static
const
struct
snd_pcm_hw_constraint_list
*
dmic_constraints
;
static
struct
snd_soc_jack
skylake_hdmi
[
3
];
struct
skl_hdmi_pcm
{
struct
list_head
head
;
...
...
@@ -115,8 +116,8 @@ static const struct snd_soc_dapm_widget skylake_widgets[] = {
SND_SOC_DAPM_SPK
(
"Left Speaker"
,
NULL
),
SND_SOC_DAPM_SPK
(
"Right Speaker"
,
NULL
),
SND_SOC_DAPM_MIC
(
"SoC DMIC"
,
NULL
),
SND_SOC_DAPM_SPK
(
"DP"
,
NULL
),
SND_SOC_DAPM_SPK
(
"
HDMI
"
,
NULL
),
SND_SOC_DAPM_SPK
(
"DP
1
"
,
NULL
),
SND_SOC_DAPM_SPK
(
"
DP2
"
,
NULL
),
SND_SOC_DAPM_SUPPLY
(
"Platform Clock"
,
SND_SOC_NOPM
,
0
,
0
,
platform_clock_control
,
SND_SOC_DAPM_PRE_PMU
|
SND_SOC_DAPM_POST_PMD
),
...
...
@@ -135,8 +136,6 @@ static const struct snd_soc_dapm_route skylake_map[] = {
{
"MIC"
,
NULL
,
"Headset Mic"
},
{
"DMic"
,
NULL
,
"SoC DMIC"
},
{
"HDMI"
,
NULL
,
"hif5 Output"
},
{
"DP"
,
NULL
,
"hif6 Output"
},
/* CODEC BE connections */
{
"Left Playback"
,
NULL
,
"ssp0 Tx"
},
{
"Right Playback"
,
NULL
,
"ssp0 Tx"
},
...
...
@@ -653,19 +652,39 @@ static struct snd_soc_dai_link skylake_dais[] = {
},
};
#define NAME_SIZE 32
static
int
skylake_card_late_probe
(
struct
snd_soc_card
*
card
)
{
struct
skl_nau88125_private
*
ctx
=
snd_soc_card_get_drvdata
(
card
);
struct
skl_hdmi_pcm
*
pcm
;
int
err
;
struct
snd_soc_codec
*
codec
=
NULL
;
int
err
,
i
=
0
;
char
jack_name
[
NAME_SIZE
];
list_for_each_entry
(
pcm
,
&
ctx
->
hdmi_pcm_list
,
head
)
{
err
=
hdac_hdmi_jack_init
(
pcm
->
codec_dai
,
pcm
->
device
);
codec
=
pcm
->
codec_dai
->
codec
;
snprintf
(
jack_name
,
sizeof
(
jack_name
),
"HDMI/DP, pcm=%d Jack"
,
pcm
->
device
);
err
=
snd_soc_card_jack_new
(
card
,
jack_name
,
SND_JACK_AVOUT
,
&
skylake_hdmi
[
i
],
NULL
,
0
);
if
(
err
)
return
err
;
err
=
hdac_hdmi_jack_init
(
pcm
->
codec_dai
,
pcm
->
device
,
&
skylake_hdmi
[
i
]);
if
(
err
<
0
)
return
err
;
i
++
;
}
return
0
;
if
(
!
codec
)
return
-
EINVAL
;
return
hdac_hdmi_jack_port_init
(
codec
,
&
card
->
dapm
);
}
/* skylake audio machine driver for SPT + NAU88L25 */
...
...
sound/soc/intel/boards/skl_rt286.c
View file @
16b57114
...
...
@@ -29,6 +29,7 @@
#include "../../codecs/hdac_hdmi.h"
static
struct
snd_soc_jack
skylake_headset
;
static
struct
snd_soc_jack
skylake_hdmi
[
3
];
struct
skl_hdmi_pcm
{
struct
list_head
head
;
...
...
@@ -94,10 +95,6 @@ static const struct snd_soc_dapm_route skylake_rt286_map[] = {
{
"DMIC1 Pin"
,
NULL
,
"DMIC2"
},
{
"DMic"
,
NULL
,
"SoC DMIC"
},
{
"HDMI1"
,
NULL
,
"hif5 Output"
},
{
"HDMI2"
,
NULL
,
"hif6 Output"
},
{
"HDMI3"
,
NULL
,
"hif7 Output"
},
/* CODEC BE connections */
{
"AIF1 Playback"
,
NULL
,
"ssp0 Tx"
},
{
"ssp0 Tx"
,
NULL
,
"codec0_out"
},
...
...
@@ -458,19 +455,38 @@ static struct snd_soc_dai_link skylake_rt286_dais[] = {
},
};
#define NAME_SIZE 32
static
int
skylake_card_late_probe
(
struct
snd_soc_card
*
card
)
{
struct
skl_rt286_private
*
ctx
=
snd_soc_card_get_drvdata
(
card
);
struct
skl_hdmi_pcm
*
pcm
;
int
err
;
struct
snd_soc_codec
*
codec
=
NULL
;
int
err
,
i
=
0
;
char
jack_name
[
NAME_SIZE
];
list_for_each_entry
(
pcm
,
&
ctx
->
hdmi_pcm_list
,
head
)
{
err
=
hdac_hdmi_jack_init
(
pcm
->
codec_dai
,
pcm
->
device
);
codec
=
pcm
->
codec_dai
->
codec
;
snprintf
(
jack_name
,
sizeof
(
jack_name
),
"HDMI/DP, pcm=%d Jack"
,
pcm
->
device
);
err
=
snd_soc_card_jack_new
(
card
,
jack_name
,
SND_JACK_AVOUT
,
&
skylake_hdmi
[
i
],
NULL
,
0
);
if
(
err
)
return
err
;
err
=
hdac_hdmi_jack_init
(
pcm
->
codec_dai
,
pcm
->
device
,
&
skylake_hdmi
[
i
]);
if
(
err
<
0
)
return
err
;
i
++
;
}
return
0
;
if
(
!
codec
)
return
-
EINVAL
;
return
hdac_hdmi_jack_port_init
(
codec
,
&
card
->
dapm
);
}
/* skylake audio machine driver for SPT + RT286S */
...
...
sound/soc/intel/common/sst-dsp.c
View file @
16b57114
...
...
@@ -252,44 +252,44 @@ void sst_dsp_shim_update_bits_forced(struct sst_dsp *sst, u32 offset,
EXPORT_SYMBOL_GPL
(
sst_dsp_shim_update_bits_forced
);
int
sst_dsp_register_poll
(
struct
sst_dsp
*
ctx
,
u32
offset
,
u32
mask
,
u32
target
,
u32
time
out
,
char
*
operation
)
u32
target
,
u32
time
,
char
*
operation
)
{
int
time
,
ret
;
u32
reg
;
bool
done
=
false
;
unsigned
long
timeout
;
int
k
=
0
,
s
=
500
;
/*
* we will poll for couple of ms using mdelay, if not successful
* then go to longer sleep using usleep_range
* split the loop into sleeps of varying resolution. more accurately,
* the range of wakeups are:
* Phase 1(first 5ms): min sleep 0.5ms; max sleep 1ms.
* Phase 2:( 5ms to 10ms) : min sleep 0.5ms; max sleep 10ms
* (usleep_range (500, 1000) and usleep_range(5000, 10000) are
* both possible in this phase depending on whether k > 10 or not).
* Phase 3: (beyond 10 ms) min sleep 5ms; max sleep 10ms.
*/
/* check if set state successful */
for
(
time
=
0
;
time
<
5
;
time
++
)
{
if
((
sst_dsp_shim_read_unlocked
(
ctx
,
offset
)
&
mask
)
==
target
)
{
done
=
true
;
break
;
}
mdelay
(
1
);
timeout
=
jiffies
+
msecs_to_jiffies
(
time
);
while
(((
sst_dsp_shim_read_unlocked
(
ctx
,
offset
)
&
mask
)
!=
target
)
&&
time_before
(
jiffies
,
timeout
))
{
k
++
;
if
(
k
>
10
)
s
=
5000
;
usleep_range
(
s
,
2
*
s
);
}
if
(
done
==
false
)
{
/* sleeping in 10ms steps so adjust timeout value */
timeout
/=
10
;
reg
=
sst_dsp_shim_read_unlocked
(
ctx
,
offset
);
for
(
time
=
0
;
time
<
timeout
;
time
++
)
{
if
((
sst_dsp_shim_read_unlocked
(
ctx
,
offset
)
&
mask
)
==
target
)
break
;
if
((
reg
&
mask
)
==
target
)
{
dev_dbg
(
ctx
->
dev
,
"FW Poll Status: reg=%#x %s successful
\n
"
,
reg
,
operation
)
;
usleep_range
(
5000
,
10000
);
}
return
0
;
}
reg
=
sst_dsp_shim_read_unlocked
(
ctx
,
offset
);
dev_dbg
(
ctx
->
dev
,
"FW Poll Status: reg=%#x %s %s
\n
"
,
reg
,
operation
,
(
time
<
timeout
)
?
"successful"
:
"timedout"
);
ret
=
time
<
timeout
?
0
:
-
ETIME
;
return
ret
;
dev_dbg
(
ctx
->
dev
,
"FW Poll Status: reg=%#x %s timedout
\n
"
,
reg
,
operation
);
return
-
ETIME
;
}
EXPORT_SYMBOL_GPL
(
sst_dsp_register_poll
);
...
...
sound/soc/intel/skylake/bxt-sst.c
View file @
16b57114
...
...
@@ -23,7 +23,6 @@
#include "../common/sst-dsp.h"
#include "../common/sst-dsp-priv.h"
#include "skl-sst-ipc.h"
#include "skl-tplg-interface.h"
#define BXT_BASEFW_TIMEOUT 3000
#define BXT_INIT_TIMEOUT 500
...
...
@@ -52,7 +51,7 @@ static unsigned int bxt_get_errorcode(struct sst_dsp *ctx)
}
static
int
bxt_load_library
(
struct
sst_dsp
*
ctx
,
struct
skl_
dfw_manifest
*
minfo
)
bxt_load_library
(
struct
sst_dsp
*
ctx
,
struct
skl_
lib_info
*
linfo
,
int
lib_count
)
{
struct
snd_dma_buffer
dmab
;
struct
skl_sst
*
skl
=
ctx
->
thread_context
;
...
...
@@ -61,11 +60,11 @@ bxt_load_library(struct sst_dsp *ctx, struct skl_dfw_manifest *minfo)
int
ret
=
0
,
i
,
dma_id
,
stream_tag
;
/* library indices start from 1 to N. 0 represents base FW */
for
(
i
=
1
;
i
<
minfo
->
lib_count
;
i
++
)
{
ret
=
request_firmware
(
&
fw
,
minfo
->
lib
[
i
].
name
,
ctx
->
dev
);
for
(
i
=
1
;
i
<
lib_count
;
i
++
)
{
ret
=
request_firmware
(
&
fw
,
linfo
[
i
].
name
,
ctx
->
dev
);
if
(
ret
<
0
)
{
dev_err
(
ctx
->
dev
,
"Request lib %s failed:%d
\n
"
,
minfo
->
lib
[
i
].
name
,
ret
);
linfo
[
i
].
name
,
ret
);
return
ret
;
}
...
...
@@ -96,7 +95,7 @@ bxt_load_library(struct sst_dsp *ctx, struct skl_dfw_manifest *minfo)
ret
=
skl_sst_ipc_load_library
(
&
skl
->
ipc
,
dma_id
,
i
);
if
(
ret
<
0
)
dev_err
(
ctx
->
dev
,
"IPC Load Lib for %s fail: %d
\n
"
,
minfo
->
lib
[
i
].
name
,
ret
);
linfo
[
i
].
name
,
ret
);
ctx
->
dsp_ops
.
trigger
(
ctx
->
dev
,
false
,
stream_tag
);
ctx
->
dsp_ops
.
cleanup
(
ctx
->
dev
,
&
dmab
,
stream_tag
);
...
...
@@ -119,8 +118,7 @@ bxt_load_library(struct sst_dsp *ctx, struct skl_dfw_manifest *minfo)
static
int
sst_bxt_prepare_fw
(
struct
sst_dsp
*
ctx
,
const
void
*
fwdata
,
u32
fwsize
)
{
int
stream_tag
,
ret
,
i
;
u32
reg
;
int
stream_tag
,
ret
;
stream_tag
=
ctx
->
dsp_ops
.
prepare
(
ctx
->
dev
,
0x40
,
fwsize
,
&
ctx
->
dmab
);
if
(
stream_tag
<=
0
)
{
...
...
@@ -153,23 +151,13 @@ static int sst_bxt_prepare_fw(struct sst_dsp *ctx,
}
/* Step 4: Wait for DONE Bit */
for
(
i
=
BXT_INIT_TIMEOUT
;
i
>
0
;
--
i
)
{
reg
=
sst_dsp_shim_read
(
ctx
,
SKL_ADSP_REG_HIPCIE
);
if
(
reg
&
SKL_ADSP_REG_HIPCIE_DONE
)
{
sst_dsp_shim_update_bits_forced
(
ctx
,
SKL_ADSP_REG_HIPCIE
,
ret
=
sst_dsp_register_poll
(
ctx
,
SKL_ADSP_REG_HIPCIE
,
SKL_ADSP_REG_HIPCIE_DONE
,
SKL_ADSP_REG_HIPCIE_DONE
);
break
;
}
mdelay
(
1
);
}
if
(
!
i
)
{
dev_info
(
ctx
->
dev
,
"Waiting for HIPCIE done, reg: 0x%x
\n
"
,
reg
);
sst_dsp_shim_update_bits
(
ctx
,
SKL_ADSP_REG_HIPCIE
,
SKL_ADSP_REG_HIPCIE_DONE
,
SKL_ADSP_REG_HIPCIE_DONE
);
SKL_ADSP_REG_HIPCIE_DONE
,
BXT_INIT_TIMEOUT
,
"HIPCIE Done"
);
if
(
ret
<
0
)
{
dev_err
(
ctx
->
dev
,
"Timout for Purge Request%d
\n
"
,
ret
);
goto
base_fw_load_failed
;
}
/* Step 5: power down core1 */
...
...
@@ -184,19 +172,10 @@ static int sst_bxt_prepare_fw(struct sst_dsp *ctx,
skl_ipc_op_int_enable
(
ctx
);
/* Step 7: Wait for ROM init */
for
(
i
=
BXT_INIT_TIMEOUT
;
i
>
0
;
--
i
)
{
if
(
SKL_FW_INIT
==
(
sst_dsp_shim_read
(
ctx
,
BXT_ADSP_FW_STATUS
)
&
SKL_FW_STS_MASK
))
{
dev_info
(
ctx
->
dev
,
"ROM loaded, continue FW loading
\n
"
);
break
;
}
mdelay
(
1
);
}
if
(
!
i
)
{
dev_err
(
ctx
->
dev
,
"Timeout for ROM init, HIPCIE: 0x%x
\n
"
,
reg
);
ret
=
-
EIO
;
ret
=
sst_dsp_register_poll
(
ctx
,
BXT_ADSP_FW_STATUS
,
SKL_FW_STS_MASK
,
SKL_FW_INIT
,
BXT_INIT_TIMEOUT
,
"ROM Load"
);
if
(
ret
<
0
)
{
dev_err
(
ctx
->
dev
,
"Timeout for ROM init, ret:%d
\n
"
,
ret
);
goto
base_fw_load_failed
;
}
...
...
@@ -432,7 +411,6 @@ static int bxt_set_dsp_D0(struct sst_dsp *ctx, unsigned int core_id)
int
ret
;
struct
skl_ipc_dxstate_info
dx
;
unsigned
int
core_mask
=
SKL_DSP_CORE_MASK
(
core_id
);
struct
skl_dfw_manifest
*
minfo
=
&
skl
->
manifest
;
if
(
skl
->
fw_loaded
==
false
)
{
skl
->
boot_complete
=
false
;
...
...
@@ -442,8 +420,9 @@ static int bxt_set_dsp_D0(struct sst_dsp *ctx, unsigned int core_id)
return
ret
;
}
if
(
minfo
->
lib_count
>
1
)
{
ret
=
bxt_load_library
(
ctx
,
minfo
);
if
(
skl
->
lib_count
>
1
)
{
ret
=
bxt_load_library
(
ctx
,
skl
->
lib_info
,
skl
->
lib_count
);
if
(
ret
<
0
)
{
dev_err
(
ctx
->
dev
,
"reload libs failed: %d
\n
"
,
ret
);
return
ret
;
...
...
@@ -640,8 +619,9 @@ int bxt_sst_init_fw(struct device *dev, struct skl_sst *ctx)
skl_dsp_init_core_state
(
sst
);
if
(
ctx
->
manifest
.
lib_count
>
1
)
{
ret
=
sst
->
fw_ops
.
load_library
(
sst
,
&
ctx
->
manifest
);
if
(
ctx
->
lib_count
>
1
)
{
ret
=
sst
->
fw_ops
.
load_library
(
sst
,
ctx
->
lib_info
,
ctx
->
lib_count
);
if
(
ret
<
0
)
{
dev_err
(
dev
,
"Load Library failed : %x
\n
"
,
ret
);
return
ret
;
...
...
sound/soc/intel/skylake/skl-messages.c
View file @
16b57114
...
...
@@ -220,6 +220,13 @@ static const struct skl_dsp_ops dsp_ops[] = {
.
init_fw
=
bxt_sst_init_fw
,
.
cleanup
=
bxt_sst_dsp_cleanup
},
{
.
id
=
0x3198
,
.
loader_ops
=
bxt_get_loader_ops
,
.
init
=
bxt_sst_dsp_init
,
.
init_fw
=
bxt_sst_init_fw
,
.
cleanup
=
bxt_sst_dsp_cleanup
},
};
const
struct
skl_dsp_ops
*
skl_get_dsp_ops
(
int
pci_id
)
...
...
sound/soc/intel/skylake/skl-nhlt.c
View file @
16b57114
...
...
@@ -102,14 +102,16 @@ static void dump_config(struct device *dev, u32 instance_id, u8 linktype,
}
static
bool
skl_check_ep_match
(
struct
device
*
dev
,
struct
nhlt_endpoint
*
epnt
,
u32
instance_id
,
u8
link_type
,
u8
dirn
)
u32
instance_id
,
u8
link_type
,
u8
dirn
,
u8
dev_type
)
{
dev_dbg
(
dev
,
"vbus_id=%d link_type=%d dir=%d
\n
"
,
epnt
->
virtual_bus_id
,
epnt
->
linktype
,
epnt
->
direction
);
dev_dbg
(
dev
,
"vbus_id=%d link_type=%d dir=%d dev_type = %d
\n
"
,
epnt
->
virtual_bus_id
,
epnt
->
linktype
,
epnt
->
direction
,
epnt
->
device_type
);
if
((
epnt
->
virtual_bus_id
==
instance_id
)
&&
(
epnt
->
linktype
==
link_type
)
&&
(
epnt
->
direction
==
dirn
))
(
epnt
->
direction
==
dirn
)
&&
(
epnt
->
device_type
==
dev_type
))
return
true
;
else
return
false
;
...
...
@@ -117,7 +119,8 @@ static bool skl_check_ep_match(struct device *dev, struct nhlt_endpoint *epnt,
struct
nhlt_specific_cfg
*
skl_get_ep_blob
(
struct
skl
*
skl
,
u32
instance
,
u8
link_type
,
u8
s_fmt
,
u8
num_ch
,
u32
s_rate
,
u8
dirn
)
u8
s_fmt
,
u8
num_ch
,
u32
s_rate
,
u8
dirn
,
u8
dev_type
)
{
struct
nhlt_fmt
*
fmt
;
struct
nhlt_endpoint
*
epnt
;
...
...
@@ -135,7 +138,8 @@ struct nhlt_specific_cfg
dev_dbg
(
dev
,
"endpoint count =%d
\n
"
,
nhlt
->
endpoint_count
);
for
(
j
=
0
;
j
<
nhlt
->
endpoint_count
;
j
++
)
{
if
(
skl_check_ep_match
(
dev
,
epnt
,
instance
,
link_type
,
dirn
))
{
if
(
skl_check_ep_match
(
dev
,
epnt
,
instance
,
link_type
,
dirn
,
dev_type
))
{
fmt
=
(
struct
nhlt_fmt
*
)(
epnt
->
config
.
caps
+
epnt
->
config
.
size
);
sp_config
=
skl_get_specific_cfg
(
dev
,
fmt
,
num_ch
,
...
...
@@ -189,9 +193,9 @@ int skl_get_dmic_geo(struct skl *skl)
return
dmic_geo
;
}
static
void
skl_nhlt_trim_space
(
struct
skl
*
skl
)
static
void
skl_nhlt_trim_space
(
char
*
trim
)
{
char
*
s
=
skl
->
tplg_name
;
char
*
s
=
trim
;
int
cnt
;
int
i
;
...
...
@@ -218,7 +222,43 @@ int skl_nhlt_update_topology_bin(struct skl *skl)
skl
->
pci_id
,
nhlt
->
header
.
oem_id
,
nhlt
->
header
.
oem_table_id
,
nhlt
->
header
.
oem_revision
,
"-tplg.bin"
);
skl_nhlt_trim_space
(
skl
);
skl_nhlt_trim_space
(
skl
->
tplg_name
);
return
0
;
}
static
ssize_t
skl_nhlt_platform_id_show
(
struct
device
*
dev
,
struct
device_attribute
*
attr
,
char
*
buf
)
{
struct
pci_dev
*
pci
=
to_pci_dev
(
dev
);
struct
hdac_ext_bus
*
ebus
=
pci_get_drvdata
(
pci
);
struct
skl
*
skl
=
ebus_to_skl
(
ebus
);
struct
nhlt_acpi_table
*
nhlt
=
(
struct
nhlt_acpi_table
*
)
skl
->
nhlt
;
char
platform_id
[
32
];
sprintf
(
platform_id
,
"%x-%.6s-%.8s-%d"
,
skl
->
pci_id
,
nhlt
->
header
.
oem_id
,
nhlt
->
header
.
oem_table_id
,
nhlt
->
header
.
oem_revision
);
skl_nhlt_trim_space
(
platform_id
);
return
sprintf
(
buf
,
"%s
\n
"
,
platform_id
);
}
static
DEVICE_ATTR
(
platform_id
,
0444
,
skl_nhlt_platform_id_show
,
NULL
);
int
skl_nhlt_create_sysfs
(
struct
skl
*
skl
)
{
struct
device
*
dev
=
&
skl
->
pci
->
dev
;
if
(
sysfs_create_file
(
&
dev
->
kobj
,
&
dev_attr_platform_id
.
attr
))
dev_warn
(
dev
,
"Error creating sysfs entry
\n
"
);
return
0
;
}
void
skl_nhlt_remove_sysfs
(
struct
skl
*
skl
)
{
struct
device
*
dev
=
&
skl
->
pci
->
dev
;
sysfs_remove_file
(
&
dev
->
kobj
,
&
dev_attr_platform_id
.
attr
);
}
sound/soc/intel/skylake/skl-pcm.c
View file @
16b57114
...
...
@@ -137,6 +137,80 @@ static void skl_set_suspend_active(struct snd_pcm_substream *substream,
skl
->
supend_active
--
;
}
int
skl_pcm_host_dma_prepare
(
struct
device
*
dev
,
struct
skl_pipe_params
*
params
)
{
struct
hdac_ext_bus
*
ebus
=
dev_get_drvdata
(
dev
);
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
unsigned
int
format_val
;
struct
hdac_stream
*
hstream
;
struct
hdac_ext_stream
*
stream
;
int
err
;
hstream
=
snd_hdac_get_stream
(
bus
,
params
->
stream
,
params
->
host_dma_id
+
1
);
if
(
!
hstream
)
return
-
EINVAL
;
stream
=
stream_to_hdac_ext_stream
(
hstream
);
snd_hdac_ext_stream_decouple
(
ebus
,
stream
,
true
);
format_val
=
snd_hdac_calc_stream_format
(
params
->
s_freq
,
params
->
ch
,
params
->
format
,
32
,
0
);
dev_dbg
(
dev
,
"format_val=%d, rate=%d, ch=%d, format=%d
\n
"
,
format_val
,
params
->
s_freq
,
params
->
ch
,
params
->
format
);
snd_hdac_stream_reset
(
hdac_stream
(
stream
));
err
=
snd_hdac_stream_set_params
(
hdac_stream
(
stream
),
format_val
);
if
(
err
<
0
)
return
err
;
err
=
snd_hdac_stream_setup
(
hdac_stream
(
stream
));
if
(
err
<
0
)
return
err
;
hdac_stream
(
stream
)
->
prepared
=
1
;
return
0
;
}
int
skl_pcm_link_dma_prepare
(
struct
device
*
dev
,
struct
skl_pipe_params
*
params
)
{
struct
hdac_ext_bus
*
ebus
=
dev_get_drvdata
(
dev
);
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
unsigned
int
format_val
;
struct
hdac_stream
*
hstream
;
struct
hdac_ext_stream
*
stream
;
struct
hdac_ext_link
*
link
;
hstream
=
snd_hdac_get_stream
(
bus
,
params
->
stream
,
params
->
link_dma_id
+
1
);
if
(
!
hstream
)
return
-
EINVAL
;
stream
=
stream_to_hdac_ext_stream
(
hstream
);
snd_hdac_ext_stream_decouple
(
ebus
,
stream
,
true
);
format_val
=
snd_hdac_calc_stream_format
(
params
->
s_freq
,
params
->
ch
,
params
->
format
,
24
,
0
);
dev_dbg
(
dev
,
"format_val=%d, rate=%d, ch=%d, format=%d
\n
"
,
format_val
,
params
->
s_freq
,
params
->
ch
,
params
->
format
);
snd_hdac_ext_link_stream_reset
(
stream
);
snd_hdac_ext_link_stream_setup
(
stream
,
format_val
);
list_for_each_entry
(
link
,
&
ebus
->
hlink_list
,
list
)
{
if
(
link
->
index
==
params
->
link_index
)
snd_hdac_ext_link_set_stream_id
(
link
,
hstream
->
stream_tag
);
}
stream
->
link_prepared
=
1
;
return
0
;
}
static
int
skl_pcm_open
(
struct
snd_pcm_substream
*
substream
,
struct
snd_soc_dai
*
dai
)
{
...
...
@@ -188,32 +262,6 @@ static int skl_pcm_open(struct snd_pcm_substream *substream,
return
0
;
}
static
int
skl_get_format
(
struct
snd_pcm_substream
*
substream
,
struct
snd_soc_dai
*
dai
)
{
struct
snd_soc_pcm_runtime
*
rtd
=
snd_pcm_substream_chip
(
substream
);
struct
skl_dma_params
*
dma_params
;
struct
hdac_ext_bus
*
ebus
=
dev_get_drvdata
(
dai
->
dev
);
int
format_val
=
0
;
if
((
ebus_to_hbus
(
ebus
))
->
ppcap
)
{
struct
snd_pcm_runtime
*
runtime
=
substream
->
runtime
;
format_val
=
snd_hdac_calc_stream_format
(
runtime
->
rate
,
runtime
->
channels
,
runtime
->
format
,
32
,
0
);
}
else
{
struct
snd_soc_dai
*
codec_dai
=
rtd
->
codec_dai
;
dma_params
=
snd_soc_dai_get_dma_data
(
codec_dai
,
substream
);
if
(
dma_params
)
format_val
=
dma_params
->
format
;
}
return
format_val
;
}
static
int
skl_be_prepare
(
struct
snd_pcm_substream
*
substream
,
struct
snd_soc_dai
*
dai
)
{
...
...
@@ -234,37 +282,19 @@ static int skl_be_prepare(struct snd_pcm_substream *substream,
static
int
skl_pcm_prepare
(
struct
snd_pcm_substream
*
substream
,
struct
snd_soc_dai
*
dai
)
{
struct
hdac_ext_stream
*
stream
=
get_hdac_ext_stream
(
substream
);
struct
skl
*
skl
=
get_skl_ctx
(
dai
->
dev
);
unsigned
int
format_val
;
int
err
;
struct
skl_module_cfg
*
mconfig
;
dev_dbg
(
dai
->
dev
,
"%s: %s
\n
"
,
__func__
,
dai
->
name
);
mconfig
=
skl_tplg_fe_get_cpr_module
(
dai
,
substream
->
stream
);
format_val
=
skl_get_format
(
substream
,
dai
);
dev_dbg
(
dai
->
dev
,
"stream_tag=%d formatvalue=%d
\n
"
,
hdac_stream
(
stream
)
->
stream_tag
,
format_val
);
snd_hdac_stream_reset
(
hdac_stream
(
stream
));
/* In case of XRUN recovery, reset the FW pipe to clean state */
if
(
mconfig
&&
(
substream
->
runtime
->
status
->
state
==
SNDRV_PCM_STATE_XRUN
))
skl_reset_pipe
(
skl
->
skl_sst
,
mconfig
->
pipe
);
err
=
snd_hdac_stream_set_params
(
hdac_stream
(
stream
),
format_val
);
if
(
err
<
0
)
return
err
;
err
=
snd_hdac_stream_setup
(
hdac_stream
(
stream
));
if
(
err
<
0
)
return
err
;
hdac_stream
(
stream
)
->
prepared
=
1
;
return
err
;
return
0
;
}
static
int
skl_pcm_hw_params
(
struct
snd_pcm_substream
*
substream
,
...
...
@@ -295,6 +325,7 @@ static int skl_pcm_hw_params(struct snd_pcm_substream *substream,
p_params
.
s_freq
=
params_rate
(
params
);
p_params
.
host_dma_id
=
dma_id
;
p_params
.
stream
=
substream
->
stream
;
p_params
.
format
=
params_format
(
params
);
m_cfg
=
skl_tplg_fe_get_cpr_module
(
dai
,
p_params
.
stream
);
if
(
m_cfg
)
...
...
@@ -438,7 +469,6 @@ static int skl_pcm_trigger(struct snd_pcm_substream *substream, int cmd,
switch
(
cmd
)
{
case
SNDRV_PCM_TRIGGER_RESUME
:
if
(
!
w
->
ignore_suspend
)
{
skl_pcm_prepare
(
substream
,
dai
);
/*
* enable DMA Resume enable bit for the stream, set the
* dpib & lpib position to resume before starting the
...
...
@@ -447,7 +477,7 @@ static int skl_pcm_trigger(struct snd_pcm_substream *substream, int cmd,
snd_hdac_ext_stream_drsm_enable
(
ebus
,
true
,
hdac_stream
(
stream
)
->
index
);
snd_hdac_ext_stream_set_dpibr
(
ebus
,
stream
,
stream
->
d
pib
);
stream
->
l
pib
);
snd_hdac_ext_stream_set_lpib
(
stream
,
stream
->
lpib
);
}
...
...
@@ -459,7 +489,6 @@ static int skl_pcm_trigger(struct snd_pcm_substream *substream, int cmd,
* pipeline is started but there is a delay in starting the
* DMA channel on the host.
*/
snd_hdac_ext_stream_decouple
(
ebus
,
stream
,
true
);
ret
=
skl_decoupled_trigger
(
substream
,
cmd
);
if
(
ret
<
0
)
return
ret
;
...
...
@@ -506,9 +535,10 @@ static int skl_link_hw_params(struct snd_pcm_substream *substream,
struct
hdac_ext_bus
*
ebus
=
dev_get_drvdata
(
dai
->
dev
);
struct
hdac_ext_stream
*
link_dev
;
struct
snd_soc_pcm_runtime
*
rtd
=
snd_pcm_substream_chip
(
substream
);
struct
hdac_ext_dma_params
*
dma_params
;
struct
snd_soc_dai
*
codec_dai
=
rtd
->
codec_dai
;
struct
skl_pipe_params
p_params
=
{
0
};
struct
hdac_ext_link
*
link
;
int
stream_tag
;
link_dev
=
snd_hdac_ext_stream_assign
(
ebus
,
substream
,
HDAC_EXT_STREAM_TYPE_LINK
);
...
...
@@ -517,16 +547,22 @@ static int skl_link_hw_params(struct snd_pcm_substream *substream,
snd_soc_dai_set_dma_data
(
dai
,
substream
,
(
void
*
)
link_dev
);
link
=
snd_hdac_ext_bus_get_link
(
ebus
,
rtd
->
codec
->
component
.
name
);
if
(
!
link
)
return
-
EINVAL
;
stream_tag
=
hdac_stream
(
link_dev
)
->
stream_tag
;
/* set the stream tag in the codec dai dma params */
dma_params
=
snd_soc_dai_get_dma_data
(
codec_dai
,
substream
);
if
(
dma_params
)
dma_params
->
stream_tag
=
hdac_stream
(
link_dev
)
->
stream_tag
;
snd_soc_dai_set_tdm_slot
(
codec_dai
,
stream_tag
,
0
,
0
,
0
);
p_params
.
s_fmt
=
snd_pcm_format_width
(
params_format
(
params
));
p_params
.
ch
=
params_channels
(
params
);
p_params
.
s_freq
=
params_rate
(
params
);
p_params
.
stream
=
substream
->
stream
;
p_params
.
link_dma_id
=
hdac_stream
(
link_dev
)
->
stream_tag
-
1
;
p_params
.
link_dma_id
=
stream_tag
-
1
;
p_params
.
link_index
=
link
->
index
;
p_params
.
format
=
params_format
(
params
);
return
skl_tplg_be_update_params
(
dai
,
&
p_params
);
}
...
...
@@ -534,41 +570,15 @@ static int skl_link_hw_params(struct snd_pcm_substream *substream,
static
int
skl_link_pcm_prepare
(
struct
snd_pcm_substream
*
substream
,
struct
snd_soc_dai
*
dai
)
{
struct
snd_soc_pcm_runtime
*
rtd
=
snd_pcm_substream_chip
(
substream
);
struct
hdac_ext_bus
*
ebus
=
dev_get_drvdata
(
dai
->
dev
);
struct
hdac_ext_stream
*
link_dev
=
snd_soc_dai_get_dma_data
(
dai
,
substream
);
unsigned
int
format_val
=
0
;
struct
skl_dma_params
*
dma_params
;
struct
snd_soc_dai
*
codec_dai
=
rtd
->
codec_dai
;
struct
hdac_ext_link
*
link
;
struct
skl
*
skl
=
get_skl_ctx
(
dai
->
dev
);
struct
skl_module_cfg
*
mconfig
=
NULL
;
dma_params
=
(
struct
skl_dma_params
*
)
snd_soc_dai_get_dma_data
(
codec_dai
,
substream
);
if
(
dma_params
)
format_val
=
dma_params
->
format
;
dev_dbg
(
dai
->
dev
,
"stream_tag=%d formatvalue=%d codec_dai_name=%s
\n
"
,
hdac_stream
(
link_dev
)
->
stream_tag
,
format_val
,
codec_dai
->
name
);
link
=
snd_hdac_ext_bus_get_link
(
ebus
,
rtd
->
codec
->
component
.
name
);
if
(
!
link
)
return
-
EINVAL
;
snd_hdac_ext_link_stream_reset
(
link_dev
);
/* In case of XRUN recovery, reset the FW pipe to clean state */
mconfig
=
skl_tplg_be_get_cpr_module
(
dai
,
substream
->
stream
);
if
(
mconfig
&&
(
substream
->
runtime
->
status
->
state
==
SNDRV_PCM_STATE_XRUN
))
if
(
mconfig
&&
!
mconfig
->
pipe
->
passthru
&&
(
substream
->
runtime
->
status
->
state
==
SNDRV_PCM_STATE_XRUN
))
skl_reset_pipe
(
skl
->
skl_sst
,
mconfig
->
pipe
);
snd_hdac_ext_link_stream_setup
(
link_dev
,
format_val
);
snd_hdac_ext_link_set_stream_id
(
link
,
hdac_stream
(
link_dev
)
->
stream_tag
);
link_dev
->
link_prepared
=
1
;
return
0
;
}
...
...
@@ -583,10 +593,8 @@ static int skl_link_pcm_trigger(struct snd_pcm_substream *substream,
dev_dbg
(
dai
->
dev
,
"In %s cmd=%d
\n
"
,
__func__
,
cmd
);
switch
(
cmd
)
{
case
SNDRV_PCM_TRIGGER_RESUME
:
skl_link_pcm_prepare
(
substream
,
dai
);
case
SNDRV_PCM_TRIGGER_START
:
case
SNDRV_PCM_TRIGGER_PAUSE_RELEASE
:
snd_hdac_ext_stream_decouple
(
ebus
,
stream
,
true
);
snd_hdac_ext_link_stream_start
(
link_dev
);
break
;
...
...
sound/soc/intel/skylake/skl-sst-dsp.h
View file @
16b57114
...
...
@@ -19,7 +19,6 @@
#include <linux/interrupt.h>
#include <sound/memalloc.h>
#include "skl-sst-cldma.h"
#include "skl-tplg-interface.h"
#include "skl-topology.h"
struct
sst_dsp
;
...
...
@@ -145,7 +144,7 @@ struct skl_dsp_fw_ops {
int
(
*
load_fw
)(
struct
sst_dsp
*
ctx
);
/* FW module parser/loader */
int
(
*
load_library
)(
struct
sst_dsp
*
ctx
,
struct
skl_
dfw_manifest
*
minfo
);
struct
skl_
lib_info
*
linfo
,
int
count
);
int
(
*
parse_fw
)(
struct
sst_dsp
*
ctx
);
int
(
*
set_state_D0
)(
struct
sst_dsp
*
ctx
,
unsigned
int
core_id
);
int
(
*
set_state_D3
)(
struct
sst_dsp
*
ctx
,
unsigned
int
core_id
);
...
...
@@ -236,5 +235,4 @@ int skl_get_pvt_instance_id_map(struct skl_sst *ctx,
void
skl_freeup_uuid_list
(
struct
skl_sst
*
ctx
);
int
skl_dsp_strip_extended_manifest
(
struct
firmware
*
fw
);
#endif
/*__SKL_SST_DSP_H__*/
sound/soc/intel/skylake/skl-sst-ipc.h
View file @
16b57114
...
...
@@ -97,8 +97,9 @@ struct skl_sst {
/* multi-core */
struct
skl_dsp_cores
cores
;
/* tplg manifest */
struct
skl_dfw_manifest
manifest
;
/* library info */
struct
skl_lib_info
lib_info
[
SKL_MAX_LIB
];
int
lib_count
;
/* Callback to update D0i3C register */
void
(
*
update_d0i3c
)(
struct
device
*
dev
,
bool
enable
);
...
...
sound/soc/intel/skylake/skl-topology.c
View file @
16b57114
...
...
@@ -330,6 +330,31 @@ static void skl_tplg_update_buffer_size(struct skl_sst *ctx,
multiplier
;
}
static
u8
skl_tplg_be_dev_type
(
int
dev_type
)
{
int
ret
;
switch
(
dev_type
)
{
case
SKL_DEVICE_BT
:
ret
=
NHLT_DEVICE_BT
;
break
;
case
SKL_DEVICE_DMIC
:
ret
=
NHLT_DEVICE_DMIC
;
break
;
case
SKL_DEVICE_I2S
:
ret
=
NHLT_DEVICE_I2S
;
break
;
default:
ret
=
NHLT_DEVICE_INVALID
;
break
;
}
return
ret
;
}
static
int
skl_tplg_update_be_blob
(
struct
snd_soc_dapm_widget
*
w
,
struct
skl_sst
*
ctx
)
{
...
...
@@ -338,6 +363,7 @@ static int skl_tplg_update_be_blob(struct snd_soc_dapm_widget *w,
u32
ch
,
s_freq
,
s_fmt
;
struct
nhlt_specific_cfg
*
cfg
;
struct
skl
*
skl
=
get_skl_ctx
(
ctx
->
dev
);
u8
dev_type
=
skl_tplg_be_dev_type
(
m_cfg
->
dev_type
);
/* check if we already have blob */
if
(
m_cfg
->
formats_config
.
caps_size
>
0
)
...
...
@@ -374,7 +400,7 @@ static int skl_tplg_update_be_blob(struct snd_soc_dapm_widget *w,
/* update the blob based on virtual bus_id and default params */
cfg
=
skl_get_ep_blob
(
skl
,
m_cfg
->
vbus_id
,
link_type
,
s_fmt
,
ch
,
s_freq
,
dir
);
s_fmt
,
ch
,
s_freq
,
dir
,
dev_type
);
if
(
cfg
)
{
m_cfg
->
formats_config
.
caps_size
=
cfg
->
size
;
m_cfg
->
formats_config
.
caps
=
(
u32
*
)
&
cfg
->
caps
;
...
...
@@ -496,6 +522,20 @@ static int skl_tplg_set_module_init_data(struct snd_soc_dapm_widget *w)
return
0
;
}
static
int
skl_tplg_module_prepare
(
struct
skl_sst
*
ctx
,
struct
skl_pipe
*
pipe
,
struct
snd_soc_dapm_widget
*
w
,
struct
skl_module_cfg
*
mcfg
)
{
switch
(
mcfg
->
dev_type
)
{
case
SKL_DEVICE_HDAHOST
:
return
skl_pcm_host_dma_prepare
(
ctx
->
dev
,
pipe
->
p_params
);
case
SKL_DEVICE_HDALINK
:
return
skl_pcm_link_dma_prepare
(
ctx
->
dev
,
pipe
->
p_params
);
}
return
0
;
}
/*
* Inside a pipe instance, we can have various modules. These modules need
* to instantiated in DSP by invoking INIT_MODULE IPC, which is achieved by
...
...
@@ -535,6 +575,11 @@ skl_tplg_init_pipe_modules(struct skl *skl, struct skl_pipe *pipe)
mconfig
->
m_state
=
SKL_MODULE_LOADED
;
}
/* prepare the DMA if the module is gateway cpr */
ret
=
skl_tplg_module_prepare
(
ctx
,
pipe
,
w
,
mconfig
);
if
(
ret
<
0
)
return
ret
;
/* update blob if blob is null for be with default value */
skl_tplg_update_be_blob
(
w
,
ctx
);
...
...
@@ -974,7 +1019,6 @@ static int skl_tplg_mixer_dapm_post_pmd_event(struct snd_soc_dapm_widget *w,
struct
skl_module_cfg
*
src_module
=
NULL
,
*
dst_module
;
struct
skl_sst
*
ctx
=
skl
->
skl_sst
;
struct
skl_pipe
*
s_pipe
=
mconfig
->
pipe
;
int
ret
=
0
;
if
(
s_pipe
->
state
==
SKL_PIPE_INVALID
)
return
-
EINVAL
;
...
...
@@ -996,7 +1040,7 @@ static int skl_tplg_mixer_dapm_post_pmd_event(struct snd_soc_dapm_widget *w,
src_module
=
dst_module
;
}
ret
=
skl_delete_pipe
(
ctx
,
mconfig
->
pipe
);
skl_delete_pipe
(
ctx
,
mconfig
->
pipe
);
return
skl_tplg_unload_pipe_modules
(
ctx
,
s_pipe
);
}
...
...
@@ -1207,6 +1251,7 @@ static void skl_tplg_fill_dma_id(struct skl_module_cfg *mcfg,
switch
(
mcfg
->
dev_type
)
{
case
SKL_DEVICE_HDALINK
:
pipe
->
p_params
->
link_dma_id
=
params
->
link_dma_id
;
pipe
->
p_params
->
link_index
=
params
->
link_index
;
break
;
case
SKL_DEVICE_HDAHOST
:
...
...
@@ -1220,6 +1265,7 @@ static void skl_tplg_fill_dma_id(struct skl_module_cfg *mcfg,
pipe
->
p_params
->
ch
=
params
->
ch
;
pipe
->
p_params
->
s_freq
=
params
->
s_freq
;
pipe
->
p_params
->
stream
=
params
->
stream
;
pipe
->
p_params
->
format
=
params
->
format
;
}
else
{
memcpy
(
pipe
->
p_params
,
params
,
sizeof
(
*
params
));
...
...
@@ -1428,6 +1474,7 @@ static int skl_tplg_be_fill_pipe_params(struct snd_soc_dai *dai,
struct
nhlt_specific_cfg
*
cfg
;
struct
skl
*
skl
=
get_skl_ctx
(
dai
->
dev
);
int
link_type
=
skl_tplg_be_link_type
(
mconfig
->
dev_type
);
u8
dev_type
=
skl_tplg_be_dev_type
(
mconfig
->
dev_type
);
skl_tplg_fill_dma_id
(
mconfig
,
params
);
...
...
@@ -1437,7 +1484,8 @@ static int skl_tplg_be_fill_pipe_params(struct snd_soc_dai *dai,
/* update the blob based on virtual bus_id*/
cfg
=
skl_get_ep_blob
(
skl
,
mconfig
->
vbus_id
,
link_type
,
params
->
s_fmt
,
params
->
ch
,
params
->
s_freq
,
params
->
stream
);
params
->
s_freq
,
params
->
stream
,
dev_type
);
if
(
cfg
)
{
mconfig
->
formats_config
.
caps_size
=
cfg
->
size
;
mconfig
->
formats_config
.
caps
=
(
u32
*
)
&
cfg
->
caps
;
...
...
@@ -2280,20 +2328,21 @@ static int skl_tplg_control_load(struct snd_soc_component *cmpnt,
static
int
skl_tplg_fill_str_mfest_tkn
(
struct
device
*
dev
,
struct
snd_soc_tplg_vendor_string_elem
*
str_elem
,
struct
skl
_dfw_manifest
*
minfo
)
struct
skl
*
skl
)
{
int
tkn_count
=
0
;
static
int
ref_count
;
switch
(
str_elem
->
token
)
{
case
SKL_TKN_STR_LIB_NAME
:
if
(
ref_count
>
minfo
->
lib_count
-
1
)
{
if
(
ref_count
>
skl
->
skl_sst
->
lib_count
-
1
)
{
ref_count
=
0
;
return
-
EINVAL
;
}
strncpy
(
minfo
->
lib
[
ref_count
].
name
,
str_elem
->
string
,
ARRAY_SIZE
(
minfo
->
lib
[
ref_count
].
name
));
strncpy
(
skl
->
skl_sst
->
lib_info
[
ref_count
].
name
,
str_elem
->
string
,
ARRAY_SIZE
(
skl
->
skl_sst
->
lib_info
[
ref_count
].
name
));
ref_count
++
;
tkn_count
++
;
break
;
...
...
@@ -2308,14 +2357,14 @@ static int skl_tplg_fill_str_mfest_tkn(struct device *dev,
static
int
skl_tplg_get_str_tkn
(
struct
device
*
dev
,
struct
snd_soc_tplg_vendor_array
*
array
,
struct
skl
_dfw_manifest
*
minfo
)
struct
skl
*
skl
)
{
int
tkn_count
=
0
,
ret
;
struct
snd_soc_tplg_vendor_string_elem
*
str_elem
;
str_elem
=
(
struct
snd_soc_tplg_vendor_string_elem
*
)
array
->
value
;
while
(
tkn_count
<
array
->
num_elems
)
{
ret
=
skl_tplg_fill_str_mfest_tkn
(
dev
,
str_elem
,
minfo
);
ret
=
skl_tplg_fill_str_mfest_tkn
(
dev
,
str_elem
,
skl
);
str_elem
++
;
if
(
ret
<
0
)
...
...
@@ -2329,13 +2378,13 @@ static int skl_tplg_get_str_tkn(struct device *dev,
static
int
skl_tplg_get_int_tkn
(
struct
device
*
dev
,
struct
snd_soc_tplg_vendor_value_elem
*
tkn_elem
,
struct
skl
_dfw_manifest
*
minfo
)
struct
skl
*
skl
)
{
int
tkn_count
=
0
;
switch
(
tkn_elem
->
token
)
{
case
SKL_TKN_U32_LIB_COUNT
:
minfo
->
lib_count
=
tkn_elem
->
value
;
skl
->
skl_sst
->
lib_count
=
tkn_elem
->
value
;
tkn_count
++
;
break
;
...
...
@@ -2352,7 +2401,7 @@ static int skl_tplg_get_int_tkn(struct device *dev,
* type.
*/
static
int
skl_tplg_get_manifest_tkn
(
struct
device
*
dev
,
char
*
pvt_data
,
struct
skl
_dfw_manifest
*
minfo
,
char
*
pvt_data
,
struct
skl
*
skl
,
int
block_size
)
{
int
tkn_count
=
0
,
ret
;
...
...
@@ -2368,7 +2417,7 @@ static int skl_tplg_get_manifest_tkn(struct device *dev,
off
+=
array
->
size
;
switch
(
array
->
type
)
{
case
SND_SOC_TPLG_TUPLE_TYPE_STRING
:
ret
=
skl_tplg_get_str_tkn
(
dev
,
array
,
minfo
);
ret
=
skl_tplg_get_str_tkn
(
dev
,
array
,
skl
);
if
(
ret
<
0
)
return
ret
;
...
...
@@ -2390,7 +2439,7 @@ static int skl_tplg_get_manifest_tkn(struct device *dev,
while
(
tkn_count
<=
array
->
num_elems
-
1
)
{
ret
=
skl_tplg_get_int_tkn
(
dev
,
tkn_elem
,
minfo
);
tkn_elem
,
skl
);
if
(
ret
<
0
)
return
ret
;
...
...
@@ -2411,7 +2460,7 @@ static int skl_tplg_get_manifest_tkn(struct device *dev,
* preceded by descriptors for type and size of data block.
*/
static
int
skl_tplg_get_manifest_data
(
struct
snd_soc_tplg_manifest
*
manifest
,
struct
device
*
dev
,
struct
skl
_dfw_manifest
*
minfo
)
struct
device
*
dev
,
struct
skl
*
skl
)
{
struct
snd_soc_tplg_vendor_array
*
array
;
int
num_blocks
,
block_size
=
0
,
block_type
,
off
=
0
;
...
...
@@ -2454,7 +2503,7 @@ static int skl_tplg_get_manifest_data(struct snd_soc_tplg_manifest *manifest,
data
=
(
manifest
->
priv
.
data
+
off
);
if
(
block_type
==
SKL_TYPE_TUPLE
)
{
ret
=
skl_tplg_get_manifest_tkn
(
dev
,
data
,
minfo
,
ret
=
skl_tplg_get_manifest_tkn
(
dev
,
data
,
skl
,
block_size
);
if
(
ret
<
0
)
...
...
@@ -2472,27 +2521,23 @@ static int skl_tplg_get_manifest_data(struct snd_soc_tplg_manifest *manifest,
static
int
skl_manifest_load
(
struct
snd_soc_component
*
cmpnt
,
struct
snd_soc_tplg_manifest
*
manifest
)
{
struct
skl_dfw_manifest
*
minfo
;
struct
hdac_ext_bus
*
ebus
=
snd_soc_component_get_drvdata
(
cmpnt
);
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
struct
skl
*
skl
=
ebus_to_skl
(
ebus
);
int
ret
=
0
;
/* proceed only if we have private data defined */
if
(
manifest
->
priv
.
size
==
0
)
return
0
;
minfo
=
&
skl
->
skl_sst
->
manifest
;
skl_tplg_get_manifest_data
(
manifest
,
bus
->
dev
,
minfo
);
skl_tplg_get_manifest_data
(
manifest
,
bus
->
dev
,
skl
);
if
(
minfo
->
lib_count
>
HDA
_MAX_LIB
)
{
if
(
skl
->
skl_sst
->
lib_count
>
SKL
_MAX_LIB
)
{
dev_err
(
bus
->
dev
,
"Exceeding max Library count. Got:%d
\n
"
,
minfo
->
lib_count
);
ret
=
-
EINVAL
;
skl
->
skl_sst
->
lib_count
);
ret
urn
-
EINVAL
;
}
return
ret
;
return
0
;
}
static
struct
snd_soc_tplg_ops
skl_tplg_ops
=
{
...
...
sound/soc/intel/skylake/skl-topology.h
View file @
16b57114
...
...
@@ -254,6 +254,8 @@ struct skl_pipe_params {
u32
s_freq
;
u32
s_fmt
;
u8
linktype
;
snd_pcm_format_t
format
;
int
link_index
;
int
stream
;
};
...
...
@@ -332,6 +334,19 @@ struct skl_pipeline {
struct
list_head
node
;
};
#define SKL_LIB_NAME_LENGTH 128
#define SKL_MAX_LIB 16
struct
skl_lib_info
{
char
name
[
SKL_LIB_NAME_LENGTH
];
const
struct
firmware
*
fw
;
};
struct
skl_manifest
{
u32
lib_count
;
struct
skl_lib_info
lib
[
SKL_MAX_LIB
];
};
static
inline
struct
skl
*
get_skl_ctx
(
struct
device
*
dev
)
{
struct
hdac_ext_bus
*
ebus
=
dev_get_drvdata
(
dev
);
...
...
@@ -383,4 +398,8 @@ int skl_get_module_params(struct skl_sst *ctx, u32 *params, int size,
struct
skl_module_cfg
*
skl_tplg_be_get_cpr_module
(
struct
snd_soc_dai
*
dai
,
int
stream
);
enum
skl_bitdepth
skl_get_bit_depth
(
int
params
);
int
skl_pcm_host_dma_prepare
(
struct
device
*
dev
,
struct
skl_pipe_params
*
params
);
int
skl_pcm_link_dma_prepare
(
struct
device
*
dev
,
struct
skl_pipe_params
*
params
);
#endif
sound/soc/intel/skylake/skl-tplg-interface.h
View file @
16b57114
...
...
@@ -157,18 +157,6 @@ struct skl_dfw_algo_data {
char
params
[
0
];
}
__packed
;
#define LIB_NAME_LENGTH 128
#define HDA_MAX_LIB 16
struct
lib_info
{
char
name
[
LIB_NAME_LENGTH
];
}
__packed
;
struct
skl_dfw_manifest
{
u32
lib_count
;
struct
lib_info
lib
[
HDA_MAX_LIB
];
}
__packed
;
enum
skl_tkn_dir
{
SKL_DIR_IN
,
SKL_DIR_OUT
...
...
sound/soc/intel/skylake/skl.c
View file @
16b57114
...
...
@@ -732,6 +732,10 @@ static int skl_probe(struct pci_dev *pci,
goto
out_display_power_off
;
}
err
=
skl_nhlt_create_sysfs
(
skl
);
if
(
err
<
0
)
goto
out_nhlt_free
;
skl_nhlt_update_topology_bin
(
skl
);
pci_set_drvdata
(
skl
->
pci
,
ebus
);
...
...
@@ -852,6 +856,7 @@ static void skl_remove(struct pci_dev *pci)
skl_free_dsp
(
skl
);
skl_machine_device_unregister
(
skl
);
skl_dmic_device_unregister
(
skl
);
skl_nhlt_remove_sysfs
(
skl
);
skl_nhlt_free
(
skl
->
nhlt
);
skl_free
(
ebus
);
dev_set_drvdata
(
&
pci
->
dev
,
NULL
);
...
...
@@ -878,6 +883,10 @@ static struct sst_acpi_mach sst_kbl_devdata[] = {
{}
};
static
struct
sst_acpi_mach
sst_glk_devdata
[]
=
{
{
"INT343A"
,
"glk_alc298s_i2s"
,
"intel/dsp_fw_glk.bin"
,
NULL
,
NULL
,
NULL
},
};
/* PCI IDs */
static
const
struct
pci_device_id
skl_ids
[]
=
{
/* Sunrise Point-LP */
...
...
@@ -889,6 +898,9 @@ static const struct pci_device_id skl_ids[] = {
/* KBL */
{
PCI_DEVICE
(
0x8086
,
0x9D71
),
.
driver_data
=
(
unsigned
long
)
&
sst_kbl_devdata
},
/* GLK */
{
PCI_DEVICE
(
0x8086
,
0x3198
),
.
driver_data
=
(
unsigned
long
)
&
sst_glk_devdata
},
{
0
,
}
};
MODULE_DEVICE_TABLE
(
pci
,
skl_ids
);
...
...
sound/soc/intel/skylake/skl.h
View file @
16b57114
...
...
@@ -118,7 +118,8 @@ int skl_platform_register(struct device *dev);
struct
nhlt_acpi_table
*
skl_nhlt_init
(
struct
device
*
dev
);
void
skl_nhlt_free
(
struct
nhlt_acpi_table
*
addr
);
struct
nhlt_specific_cfg
*
skl_get_ep_blob
(
struct
skl
*
skl
,
u32
instance
,
u8
link_type
,
u8
s_fmt
,
u8
no_ch
,
u32
s_rate
,
u8
dirn
);
u8
link_type
,
u8
s_fmt
,
u8
no_ch
,
u32
s_rate
,
u8
dirn
,
u8
dev_type
);
int
skl_get_dmic_geo
(
struct
skl
*
skl
);
int
skl_nhlt_update_topology_bin
(
struct
skl
*
skl
);
...
...
@@ -130,5 +131,7 @@ int skl_resume_dsp(struct skl *skl);
void
skl_cleanup_resources
(
struct
skl
*
skl
);
const
struct
skl_dsp_ops
*
skl_get_dsp_ops
(
int
pci_id
);
void
skl_update_d0i3c
(
struct
device
*
dev
,
bool
enable
);
int
skl_nhlt_create_sysfs
(
struct
skl
*
skl
);
void
skl_nhlt_remove_sysfs
(
struct
skl
*
skl
);
#endif
/* __SOUND_SOC_SKL_H */
sound/soc/soc-core.c
View file @
16b57114
...
...
@@ -34,6 +34,7 @@
#include <linux/ctype.h>
#include <linux/slab.h>
#include <linux/of.h>
#include <linux/dmi.h>
#include <sound/core.h>
#include <sound/jack.h>
#include <sound/pcm.h>
...
...
@@ -1888,6 +1889,139 @@ int snd_soc_runtime_set_dai_fmt(struct snd_soc_pcm_runtime *rtd,
}
EXPORT_SYMBOL_GPL
(
snd_soc_runtime_set_dai_fmt
);
/* Trim special characters, and replace '-' with '_' since '-' is used to
* separate different DMI fields in the card long name. Only number and
* alphabet characters and a few separator characters are kept.
*/
static
void
cleanup_dmi_name
(
char
*
name
)
{
int
i
,
j
=
0
;
for
(
i
=
0
;
name
[
i
];
i
++
)
{
if
(
isalnum
(
name
[
i
])
||
(
name
[
i
]
==
'.'
)
||
(
name
[
i
]
==
'_'
))
name
[
j
++
]
=
name
[
i
];
else
if
(
name
[
i
]
==
'-'
)
name
[
j
++
]
=
'_'
;
}
name
[
j
]
=
'\0'
;
}
/**
* snd_soc_set_dmi_name() - Register DMI names to card
* @card: The card to register DMI names
* @flavour: The flavour "differentiator" for the card amongst its peers.
*
* An Intel machine driver may be used by many different devices but are
* difficult for userspace to differentiate, since machine drivers ususally
* use their own name as the card short name and leave the card long name
* blank. To differentiate such devices and fix bugs due to lack of
* device-specific configurations, this function allows DMI info to be used
* as the sound card long name, in the format of
* "vendor-product-version-board"
* (Character '-' is used to separate different DMI fields here).
* This will help the user space to load the device-specific Use Case Manager
* (UCM) configurations for the card.
*
* Possible card long names may be:
* DellInc.-XPS139343-01-0310JH
* ASUSTeKCOMPUTERINC.-T100TA-1.0-T100TA
* Circuitco-MinnowboardMaxD0PLATFORM-D0-MinnowBoardMAX
*
* This function also supports flavoring the card longname to provide
* the extra differentiation, like "vendor-product-version-board-flavor".
*
* We only keep number and alphabet characters and a few separator characters
* in the card long name since UCM in the user space uses the card long names
* as card configuration directory names and AudoConf cannot support special
* charactors like SPACE.
*
* Returns 0 on success, otherwise a negative error code.
*/
int
snd_soc_set_dmi_name
(
struct
snd_soc_card
*
card
,
const
char
*
flavour
)
{
const
char
*
vendor
,
*
product
,
*
product_version
,
*
board
;
size_t
longname_buf_size
=
sizeof
(
card
->
snd_card
->
longname
);
size_t
len
;
if
(
card
->
long_name
)
return
0
;
/* long name already set by driver or from DMI */
/* make up dmi long name as: vendor.product.version.board */
vendor
=
dmi_get_system_info
(
DMI_BOARD_VENDOR
);
if
(
!
vendor
)
{
dev_warn
(
card
->
dev
,
"ASoC: no DMI vendor name!
\n
"
);
return
0
;
}
snprintf
(
card
->
dmi_longname
,
sizeof
(
card
->
snd_card
->
longname
),
"%s"
,
vendor
);
cleanup_dmi_name
(
card
->
dmi_longname
);
product
=
dmi_get_system_info
(
DMI_PRODUCT_NAME
);
if
(
product
)
{
len
=
strlen
(
card
->
dmi_longname
);
snprintf
(
card
->
dmi_longname
+
len
,
longname_buf_size
-
len
,
"-%s"
,
product
);
len
++
;
/* skip the separator "-" */
if
(
len
<
longname_buf_size
)
cleanup_dmi_name
(
card
->
dmi_longname
+
len
);
/* some vendors like Lenovo may only put a self-explanatory
* name in the product version field
*/
product_version
=
dmi_get_system_info
(
DMI_PRODUCT_VERSION
);
if
(
product_version
)
{
len
=
strlen
(
card
->
dmi_longname
);
snprintf
(
card
->
dmi_longname
+
len
,
longname_buf_size
-
len
,
"-%s"
,
product_version
);
len
++
;
if
(
len
<
longname_buf_size
)
cleanup_dmi_name
(
card
->
dmi_longname
+
len
);
}
}
board
=
dmi_get_system_info
(
DMI_BOARD_NAME
);
if
(
board
)
{
len
=
strlen
(
card
->
dmi_longname
);
snprintf
(
card
->
dmi_longname
+
len
,
longname_buf_size
-
len
,
"-%s"
,
board
);
len
++
;
if
(
len
<
longname_buf_size
)
cleanup_dmi_name
(
card
->
dmi_longname
+
len
);
}
else
if
(
!
product
)
{
/* fall back to using legacy name */
dev_warn
(
card
->
dev
,
"ASoC: no DMI board/product name!
\n
"
);
return
0
;
}
/* Add flavour to dmi long name */
if
(
flavour
)
{
len
=
strlen
(
card
->
dmi_longname
);
snprintf
(
card
->
dmi_longname
+
len
,
longname_buf_size
-
len
,
"-%s"
,
flavour
);
len
++
;
if
(
len
<
longname_buf_size
)
cleanup_dmi_name
(
card
->
dmi_longname
+
len
);
}
/* set the card long name */
card
->
long_name
=
card
->
dmi_longname
;
return
0
;
}
EXPORT_SYMBOL_GPL
(
snd_soc_set_dmi_name
);
static
int
snd_soc_instantiate_card
(
struct
snd_soc_card
*
card
)
{
struct
snd_soc_codec
*
codec
;
...
...
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