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
c44ff31a
Commit
c44ff31a
authored
Nov 10, 2017
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'asoc/topic/intel' into asoc-next
parents
bd26974f
1c0a7de2
Changes
40
Hide whitespace changes
Inline
Side-by-side
Showing
40 changed files
with
1774 additions
and
1056 deletions
+1774
-1056
include/sound/soc-acpi-intel-match.h
include/sound/soc-acpi-intel-match.h
+32
-0
include/sound/soc-acpi.h
include/sound/soc-acpi.h
+111
-0
include/sound/soc.h
include/sound/soc.h
+14
-0
sound/soc/Kconfig
sound/soc/Kconfig
+3
-0
sound/soc/Makefile
sound/soc/Makefile
+6
-0
sound/soc/codecs/hdac_hdmi.c
sound/soc/codecs/hdac_hdmi.c
+44
-7
sound/soc/intel/Kconfig
sound/soc/intel/Kconfig
+25
-277
sound/soc/intel/Makefile
sound/soc/intel/Makefile
+1
-1
sound/soc/intel/atom/sst-mfld-platform-compress.c
sound/soc/intel/atom/sst-mfld-platform-compress.c
+1
-1
sound/soc/intel/atom/sst-mfld-platform.h
sound/soc/intel/atom/sst-mfld-platform.h
+1
-1
sound/soc/intel/atom/sst/sst_acpi.c
sound/soc/intel/atom/sst/sst_acpi.c
+23
-289
sound/soc/intel/atom/sst/sst_loader.c
sound/soc/intel/atom/sst/sst_loader.c
+0
-1
sound/soc/intel/atom/sst/sst_stream.c
sound/soc/intel/atom/sst/sst_stream.c
+0
-1
sound/soc/intel/boards/Kconfig
sound/soc/intel/boards/Kconfig
+265
-0
sound/soc/intel/boards/bxt_da7219_max98357a.c
sound/soc/intel/boards/bxt_da7219_max98357a.c
+1
-15
sound/soc/intel/boards/bytcht_da7213.c
sound/soc/intel/boards/bytcht_da7213.c
+7
-16
sound/soc/intel/boards/bytcht_es8316.c
sound/soc/intel/boards/bytcht_es8316.c
+2
-25
sound/soc/intel/boards/bytcht_nocodec.c
sound/soc/intel/boards/bytcht_nocodec.c
+1
-9
sound/soc/intel/boards/bytcr_rt5640.c
sound/soc/intel/boards/bytcr_rt5640.c
+48
-70
sound/soc/intel/boards/bytcr_rt5651.c
sound/soc/intel/boards/bytcr_rt5651.c
+261
-36
sound/soc/intel/boards/cht_bsw_max98090_ti.c
sound/soc/intel/boards/cht_bsw_max98090_ti.c
+152
-27
sound/soc/intel/boards/cht_bsw_rt5645.c
sound/soc/intel/boards/cht_bsw_rt5645.c
+52
-76
sound/soc/intel/boards/cht_bsw_rt5672.c
sound/soc/intel/boards/cht_bsw_rt5672.c
+19
-49
sound/soc/intel/boards/kbl_rt5663_max98927.c
sound/soc/intel/boards/kbl_rt5663_max98927.c
+69
-7
sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c
sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c
+1
-0
sound/soc/intel/boards/skl_nau88l25_max98357a.c
sound/soc/intel/boards/skl_nau88l25_max98357a.c
+1
-15
sound/soc/intel/boards/skl_nau88l25_ssm4567.c
sound/soc/intel/boards/skl_nau88l25_ssm4567.c
+1
-15
sound/soc/intel/common/Makefile
sound/soc/intel/common/Makefile
+2
-2
sound/soc/intel/common/soc-acpi-intel-byt-match.c
sound/soc/intel/common/soc-acpi-intel-byt-match.c
+196
-0
sound/soc/intel/common/soc-acpi-intel-cht-match.c
sound/soc/intel/common/soc-acpi-intel-cht-match.c
+194
-0
sound/soc/intel/common/soc-acpi-intel-hsw-bdw-match.c
sound/soc/intel/common/soc-acpi-intel-hsw-bdw-match.c
+64
-0
sound/soc/intel/common/sst-acpi.c
sound/soc/intel/common/sst-acpi.c
+10
-26
sound/soc/intel/common/sst-firmware.c
sound/soc/intel/common/sst-firmware.c
+1
-2
sound/soc/intel/skylake/skl-messages.c
sound/soc/intel/skylake/skl-messages.c
+14
-9
sound/soc/intel/skylake/skl-pcm.c
sound/soc/intel/skylake/skl-pcm.c
+42
-4
sound/soc/intel/skylake/skl-topology.c
sound/soc/intel/skylake/skl-topology.c
+44
-24
sound/soc/intel/skylake/skl-topology.h
sound/soc/intel/skylake/skl-topology.h
+5
-2
sound/soc/intel/skylake/skl.c
sound/soc/intel/skylake/skl.c
+29
-21
sound/soc/intel/skylake/skl.h
sound/soc/intel/skylake/skl.h
+3
-1
sound/soc/soc-acpi.c
sound/soc/soc-acpi.c
+29
-27
No files found.
include/sound/soc-acpi-intel-match.h
0 → 100644
View file @
c44ff31a
/*
* Copyright (C) 2017, Intel Corporation. All rights reserved.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version
* 2 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#ifndef __LINUX_SND_SOC_ACPI_INTEL_MATCH_H
#define __LINUX_SND_SOC_ACPI_INTEL_MATCH_H
#include <linux/stddef.h>
#include <linux/acpi.h>
/*
* these tables are not constants, some fields can be used for
* pdata or machine ops
*/
extern
struct
snd_soc_acpi_mach
snd_soc_acpi_intel_haswell_machines
[];
extern
struct
snd_soc_acpi_mach
snd_soc_acpi_intel_broadwell_machines
[];
extern
struct
snd_soc_acpi_mach
snd_soc_acpi_intel_baytrail_legacy_machines
[];
extern
struct
snd_soc_acpi_mach
snd_soc_acpi_intel_baytrail_machines
[];
extern
struct
snd_soc_acpi_mach
snd_soc_acpi_intel_cherrytrail_machines
[];
#endif
sound/soc/intel/common/sst
-acpi.h
→
include/sound/soc
-acpi.h
View file @
c44ff31a
...
...
@@ -12,10 +12,13 @@
*
*/
#ifndef __LINUX_SND_SOC_ACPI_H
#define __LINUX_SND_SOC_ACPI_H
#include <linux/stddef.h>
#include <linux/acpi.h>
struct
s
st
_acpi_package_context
{
struct
s
nd_soc
_acpi_package_context
{
char
*
name
;
/* package name */
int
length
;
/* number of elements */
struct
acpi_buffer
*
format
;
...
...
@@ -25,58 +28,84 @@ struct sst_acpi_package_context {
#if IS_ENABLED(CONFIG_ACPI)
/* translation fron HID to I2C name, needed for DAI codec_name */
const
char
*
s
st
_acpi_find_name_from_hid
(
const
u8
hid
[
ACPI_ID_LEN
]);
bool
s
st
_acpi_find_package_from_hid
(
const
u8
hid
[
ACPI_ID_LEN
],
struct
s
st
_acpi_package_context
*
ctx
);
const
char
*
s
nd_soc
_acpi_find_name_from_hid
(
const
u8
hid
[
ACPI_ID_LEN
]);
bool
s
nd_soc
_acpi_find_package_from_hid
(
const
u8
hid
[
ACPI_ID_LEN
],
struct
s
nd_soc
_acpi_package_context
*
ctx
);
#else
static
inline
const
char
*
sst_acpi_find_name_from_hid
(
const
u8
hid
[
ACPI_ID_LEN
])
static
inline
const
char
*
snd_soc_acpi_find_name_from_hid
(
const
u8
hid
[
ACPI_ID_LEN
])
{
return
NULL
;
}
static
inline
bool
sst_acpi_find_package_from_hid
(
const
u8
hid
[
ACPI_ID_LEN
],
struct
sst_acpi_package_context
*
ctx
)
static
inline
bool
snd_soc_acpi_find_package_from_hid
(
const
u8
hid
[
ACPI_ID_LEN
],
struct
snd_soc_acpi_package_context
*
ctx
)
{
return
false
;
}
#endif
/* acpi match */
struct
sst_acpi_mach
*
sst_acpi_find_machine
(
struct
sst_acpi_mach
*
machines
);
struct
snd_soc_acpi_mach
*
snd_soc_acpi_find_machine
(
struct
snd_soc_acpi_mach
*
machines
);
/* acpi check hid */
bool
s
st
_acpi_check_hid
(
const
u8
hid
[
ACPI_ID_LEN
]);
bool
s
nd_soc
_acpi_check_hid
(
const
u8
hid
[
ACPI_ID_LEN
]);
/**
* snd_soc_acpi_mach: ACPI-based machine descriptor. Most of the fields are
* related to the hardware, except for the firmware and topology file names.
* A platform supported by legacy and Sound Open Firmware (SOF) would expose
* all firmware/topology related fields.
*
* @id: ACPI ID (usually the codec's) used to find a matching machine driver.
* @drv_name: machine driver name
* @fw_filename: firmware file name. Used when SOF is not enabled.
* @board: board name
* @machine_quirk: pointer to quirk, usually based on DMI information when
* ACPI ID alone is not sufficient, wrong or misleading
* @quirk_data: data used to uniquely identify a machine, usually a list of
* audio codecs whose presence if checked with ACPI
* @pdata: intended for platform data or machine specific-ops. This structure
* is not constant since this field may be updated at run-time
* @sof_fw_filename: Sound Open Firmware file name, if enabled
* @sof_tplg_filename: Sound Open Firmware topology file name, if enabled
* @asoc_plat_name: ASoC platform name, used for binding machine drivers
* if non NULL
* @new_mach_data: machine driver private data fixup
*/
/* Descriptor for SST ASoC machine driver */
struct
sst_acpi_mach
{
/* ACPI ID for the matching machine driver. Audio codec for instance */
struct
snd_soc_acpi_mach
{
const
u8
id
[
ACPI_ID_LEN
];
/* machine driver name */
const
char
*
drv_name
;
/* firmware file name */
const
char
*
fw_filename
;
/* board name */
const
char
*
board
;
struct
s
st
_acpi_mach
*
(
*
machine_quirk
)(
void
*
arg
);
struct
s
nd_soc
_acpi_mach
*
(
*
machine_quirk
)(
void
*
arg
);
const
void
*
quirk_data
;
void
*
pdata
;
const
char
*
sof_fw_filename
;
const
char
*
sof_tplg_filename
;
const
char
*
asoc_plat_name
;
struct
platform_device
*
(
*
new_mach_data
)(
void
*
pdata
);
};
#define S
ST
_ACPI_MAX_CODECS 3
#define S
ND_SOC
_ACPI_MAX_CODECS 3
/**
* struct s
st_codecs: Structure to hold secondary codec information apart from
*
the matched one, this data will be passed to the quirk function to match
* with the ACPI detected devices
* struct s
nd_soc_acpi_codecs: Structure to hold secondary codec information
*
apart from the matched one, this data will be passed to the quirk function
*
to match
with the ACPI detected devices
*
* @num_codecs: number of secondary codecs used in the platform
* @codecs: holds the codec IDs
*
*/
struct
s
st
_codecs
{
struct
s
nd_soc_acpi
_codecs
{
int
num_codecs
;
u8
codecs
[
S
ST
_ACPI_MAX_CODECS
][
ACPI_ID_LEN
];
u8
codecs
[
S
ND_SOC
_ACPI_MAX_CODECS
][
ACPI_ID_LEN
];
};
/* check all codecs */
struct
sst_acpi_mach
*
sst_acpi_codec_list
(
void
*
arg
);
struct
snd_soc_acpi_mach
*
snd_soc_acpi_codec_list
(
void
*
arg
);
#endif
include/sound/soc.h
View file @
c44ff31a
...
...
@@ -1821,6 +1821,20 @@ struct snd_soc_dai *snd_soc_find_dai(
#include <sound/soc-dai.h>
static
inline
struct
snd_soc_dai
*
snd_soc_card_get_codec_dai
(
struct
snd_soc_card
*
card
,
const
char
*
dai_name
)
{
struct
snd_soc_pcm_runtime
*
rtd
;
list_for_each_entry
(
rtd
,
&
card
->
rtd_list
,
list
)
{
if
(
!
strcmp
(
rtd
->
codec_dai
->
name
,
dai_name
))
return
rtd
->
codec_dai
;
}
return
NULL
;
}
#ifdef CONFIG_DEBUG_FS
extern
struct
dentry
*
snd_soc_debugfs_root
;
#endif
...
...
sound/soc/Kconfig
View file @
c44ff31a
...
...
@@ -36,6 +36,9 @@ config SND_SOC_COMPRESS
config SND_SOC_TOPOLOGY
bool
config SND_SOC_ACPI
tristate
# All the supported SoCs
source "sound/soc/adi/Kconfig"
source "sound/soc/amd/Kconfig"
...
...
sound/soc/Makefile
View file @
c44ff31a
...
...
@@ -15,6 +15,12 @@ ifneq ($(CONFIG_SND_SOC_AC97_BUS),)
snd-soc-core-objs
+=
soc-ac97.o
endif
ifneq
($(CONFIG_SND_SOC_ACPI),)
snd-soc-acpi-objs
:=
soc-acpi.o
endif
obj-$(CONFIG_SND_SOC_ACPI)
+=
snd-soc-acpi.o
obj-$(CONFIG_SND_SOC)
+=
snd-soc-core.o
obj-$(CONFIG_SND_SOC)
+=
codecs/
obj-$(CONFIG_SND_SOC)
+=
generic/
...
...
sound/soc/codecs/hdac_hdmi.c
View file @
c44ff31a
...
...
@@ -942,7 +942,8 @@ static int hdac_hdmi_create_pin_port_muxs(struct hdac_ext_device *edev,
if
(
!
se
)
return
-
ENOMEM
;
sprintf
(
kc_name
,
"Pin %d port %d Input"
,
pin
->
nid
,
port
->
id
);
snprintf
(
kc_name
,
NAME_SIZE
,
"Pin %d port %d Input"
,
pin
->
nid
,
port
->
id
);
kc
->
name
=
devm_kstrdup
(
&
edev
->
hdac
.
dev
,
kc_name
,
GFP_KERNEL
);
if
(
!
kc
->
name
)
return
-
ENOMEM
;
...
...
@@ -1452,6 +1453,8 @@ static int hdac_hdmi_parse_and_map_nid(struct hdac_ext_device *edev,
int
i
,
num_nodes
;
struct
hdac_device
*
hdac
=
&
edev
->
hdac
;
struct
hdac_hdmi_priv
*
hdmi
=
edev
->
private_data
;
struct
hdac_hdmi_cvt
*
temp_cvt
,
*
cvt_next
;
struct
hdac_hdmi_pin
*
temp_pin
,
*
pin_next
;
int
ret
;
hdac_hdmi_skl_enable_all_pins
(
hdac
);
...
...
@@ -1481,32 +1484,54 @@ static int hdac_hdmi_parse_and_map_nid(struct hdac_ext_device *edev,
case
AC_WID_AUD_OUT
:
ret
=
hdac_hdmi_add_cvt
(
edev
,
nid
);
if
(
ret
<
0
)
return
ret
;
goto
free_widgets
;
break
;
case
AC_WID_PIN
:
ret
=
hdac_hdmi_add_pin
(
edev
,
nid
);
if
(
ret
<
0
)
return
ret
;
goto
free_widgets
;
break
;
}
}
hdac
->
end_nid
=
nid
;
if
(
!
hdmi
->
num_pin
||
!
hdmi
->
num_cvt
)
return
-
EIO
;
if
(
!
hdmi
->
num_pin
||
!
hdmi
->
num_cvt
)
{
ret
=
-
EIO
;
goto
free_widgets
;
}
ret
=
hdac_hdmi_create_dais
(
hdac
,
dais
,
hdmi
,
hdmi
->
num_cvt
);
if
(
ret
)
{
dev_err
(
&
hdac
->
dev
,
"Failed to create dais with err: %d
\n
"
,
ret
);
return
ret
;
goto
free_widgets
;
}
*
num_dais
=
hdmi
->
num_cvt
;
ret
=
hdac_hdmi_init_dai_map
(
edev
);
if
(
ret
<
0
)
goto
free_widgets
;
return
ret
;
free_widgets:
list_for_each_entry_safe
(
temp_cvt
,
cvt_next
,
&
hdmi
->
cvt_list
,
head
)
{
list_del
(
&
temp_cvt
->
head
);
kfree
(
temp_cvt
->
name
);
kfree
(
temp_cvt
);
}
list_for_each_entry_safe
(
temp_pin
,
pin_next
,
&
hdmi
->
pin_list
,
head
)
{
for
(
i
=
0
;
i
<
temp_pin
->
num_ports
;
i
++
)
temp_pin
->
ports
[
i
].
pin
=
NULL
;
kfree
(
temp_pin
->
ports
);
list_del
(
&
temp_pin
->
head
);
kfree
(
temp_pin
);
}
return
hdac_hdmi_init_dai_map
(
edev
)
;
return
ret
;
}
static
void
hdac_hdmi_eld_notify_cb
(
void
*
aptr
,
int
port
,
int
pipe
)
...
...
@@ -1894,6 +1919,9 @@ static void hdac_hdmi_set_chmap(struct hdac_device *hdac, int pcm_idx,
struct
hdac_hdmi_pcm
*
pcm
=
get_hdmi_pcm_from_id
(
hdmi
,
pcm_idx
);
struct
hdac_hdmi_port
*
port
;
if
(
!
pcm
)
return
;
if
(
list_empty
(
&
pcm
->
port_list
))
return
;
...
...
@@ -1912,6 +1940,9 @@ static bool is_hdac_hdmi_pcm_attached(struct hdac_device *hdac, int pcm_idx)
struct
hdac_hdmi_priv
*
hdmi
=
edev
->
private_data
;
struct
hdac_hdmi_pcm
*
pcm
=
get_hdmi_pcm_from_id
(
hdmi
,
pcm_idx
);
if
(
!
pcm
)
return
false
;
if
(
list_empty
(
&
pcm
->
port_list
))
return
false
;
...
...
@@ -1925,6 +1956,9 @@ static int hdac_hdmi_get_spk_alloc(struct hdac_device *hdac, int pcm_idx)
struct
hdac_hdmi_pcm
*
pcm
=
get_hdmi_pcm_from_id
(
hdmi
,
pcm_idx
);
struct
hdac_hdmi_port
*
port
;
if
(
!
pcm
)
return
0
;
if
(
list_empty
(
&
pcm
->
port_list
))
return
0
;
...
...
@@ -1978,6 +2012,9 @@ static int hdac_hdmi_dev_probe(struct hdac_ext_device *edev)
hdmi_priv
->
chmap
.
ops
.
is_pcm_attached
=
is_hdac_hdmi_pcm_attached
;
hdmi_priv
->
chmap
.
ops
.
get_spk_alloc
=
hdac_hdmi_get_spk_alloc
;
if
(
!
hdac_id
)
return
-
ENODEV
;
if
(
hdac_id
->
driver_data
)
hdmi_priv
->
drv_data
=
(
struct
hdac_hdmi_drv_data
*
)
hdac_id
->
driver_data
;
...
...
sound/soc/intel/Kconfig
View file @
c44ff31a
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_ATOM_HIFI2_PLATFORM
select SND_SST_IPC_PCI
help
This adds support for ASoC machine driver for Intel(R) MID Medfield platform
used as alsa device in audio substem in Intel(R) MID devices
Say Y if you have such a device.
If unsure select "N".
config SND_SST_ATOM_HIFI2_PLATFORM
tristate
select SND_SOC_COMPRESS
config SND_SST_IPC
tristate
...
...
@@ -27,10 +11,12 @@ config SND_SST_IPC_ACPI
select SND_SOC_INTEL_SST
select IOSF_MBI
config SND_SOC_INTEL_COMMON
tristate
config SND_SOC_INTEL_SST
tristate
select SND_SOC_INTEL_SST_ACPI if ACPI
select SND_SOC_INTEL_SST_MATCH if ACPI
config SND_SOC_INTEL_SST_FIRMWARE
tristate
...
...
@@ -39,280 +25,42 @@ config SND_SOC_INTEL_SST_FIRMWARE
config SND_SOC_INTEL_SST_ACPI
tristate
config SND_SOC_
INTEL_SST
_MATCH
config SND_SOC_
ACPI_INTEL
_MATCH
tristate
select SND_SOC_ACPI if ACPI
config SND_SOC_INTEL_SST_TOPLEVEL
tristate "Intel ASoC SST drivers"
depends on X86 || COMPILE_TEST
select SND_SOC_INTEL_MACH
select SND_SOC_INTEL_COMMON
config SND_SOC_INTEL_HASWELL
tristate
tristate "Intel ASoC SST driver for Haswell/Broadwell"
depends on SND_SOC_INTEL_SST_TOPLEVEL && SND_DMA_SGBUF
depends on DMADEVICES
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 DMADEVICES
select SND_SOC_INTEL_HASWELL
select SND_SOC_RT5640
help
This adds support for the Lynxpoint Audio DSP on Intel(R) Haswell
Ultrabook platforms.
Say Y if you have such a device.
If unsure select "N".
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_SKYLAKE
select SND_SOC_DA7219
select SND_SOC_MAX98357A
select SND_SOC_DMIC
select SND_SOC_HDAC_HDMI
select SND_HDA_DSP_LOADER
help
This adds support for ASoC machine driver for Broxton-P platforms
with DA7219 + MAX98357A I2S audio codec.
Say Y if you have such a device.
If unsure select "N".
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_SKYLAKE
select SND_SOC_RT298
select SND_SOC_DMIC
select SND_SOC_HDAC_HDMI
select SND_HDA_DSP_LOADER
help
This adds support for ASoC machine driver for Broxton platforms
with RT286 I2S audio codec.
Say Y if you have such a device.
If unsure select "N".
config SND_SOC_INTEL_BYT_RT5640_MACH
tristate "ASoC Audio driver for Intel Baytrail with RT5640 codec"
depends on X86_INTEL_LPSS && I2C
tristate "Intel ASoC SST driver for Baytrail (legacy)"
depends on SND_SOC_INTEL_SST_TOPLEVEL
depends on DMADEVICES
depends on SND_SST_IPC_ACPI = n
select SND_SOC_INTEL_BAYTRAIL
select SND_SOC_RT5640
help
This adds audio driver for Intel Baytrail platform based boards
with the RT5640 audio codec. This driver is deprecated, use
SND_SOC_INTEL_BYTCR_RT5640_MACH instead for better functionality.
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 DMADEVICES
depends on SND_SST_IPC_ACPI = n
select SND_SOC_INTEL_BAYTRAIL
select SND_SOC_MAX98090
help
This adds audio driver for Intel Baytrail platform based boards
with the MAX98090 audio codec.
config SND_SOC_INTEL_BDW_RT5677_MACH
tristate "ASoC Audio driver for Intel Broadwell with RT5677 codec"
depends on X86_INTEL_LPSS && GPIOLIB && I2C
depends on DMADEVICES
select SND_SOC_INTEL_HASWELL
select SND_SOC_RT5677
help
This adds support for Intel Broadwell platform based boards with
the RT5677 audio codec.
config SND_SOC_INTEL_BROADWELL_MACH
tristate "ASoC Audio DSP support for Intel Broadwell Wildcatpoint"
depends on X86_INTEL_LPSS && I2C && I2C_DESIGNWARE_PLATFORM
depends on DMADEVICES
select SND_SOC_INTEL_HASWELL
select SND_SOC_RT286
help
This adds support for the Wilcatpoint Audio DSP on Intel(R) Broadwell
Ultrabook platforms.
Say Y if you have such a device.
If unsure select "N".
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_ATOM_HIFI2_PLATFORM
select SND_SST_IPC_ACPI
select SND_SOC_INTEL_SST_MATCH if ACPI
help
This adds support for ASoC machine driver for Intel(R) Baytrail and Baytrail-CR
platforms with RT5640 audio codec.
Say Y if you have such a device.
If unsure select "N".
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_ATOM_HIFI2_PLATFORM
select SND_SST_IPC_ACPI
select SND_SOC_INTEL_SST_MATCH if ACPI
help
This adds support for ASoC machine driver for Intel(R) Baytrail and Baytrail-CR
platforms with RT5651 audio codec.
Say Y if you have such a device.
If unsure select "N".
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_ATOM_HIFI2_PLATFORM
select SND_SST_IPC_ACPI
select SND_SOC_INTEL_SST_MATCH if ACPI
help
This adds support for ASoC machine driver for Intel(R) Cherrytrail & Braswell
platforms with RT5672 audio codec.
Say Y if you have such a device.
If unsure select "N".
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_ATOM_HIFI2_PLATFORM
select SND_SST_IPC_ACPI
select SND_SOC_INTEL_SST_MATCH if ACPI
help
This adds support for ASoC machine driver for Intel(R) Cherrytrail & Braswell
platforms with RT5645/5650 audio codec.
If unsure select "N".
config SND_SOC_INTEL_CHT_BSW_MAX98090_TI_MACH
tristate "ASoC Audio driver for Intel Cherrytrail & Braswell with MAX98090 & TI codec"
depends on X86_INTEL_LPSS && I2C && ACPI
select SND_SOC_MAX98090
select SND_SOC_TS3A227E
select SND_SST_ATOM_HIFI2_PLATFORM
select SND_SST_IPC_ACPI
select SND_SOC_INTEL_SST_MATCH if ACPI
help
This adds support for ASoC machine driver for Intel(R) Cherrytrail & Braswell
platforms with MAX98090 audio codec it also can support TI jack chip as aux device.
If unsure select "N".
config SND_SOC_INTEL_BYT_CHT_DA7213_MACH
tristate "ASoC Audio driver for Intel Baytrail & Cherrytrail with DA7212/7213 codec"
depends on X86_INTEL_LPSS && I2C && ACPI
select SND_SOC_DA7213
select SND_SST_ATOM_HIFI2_PLATFORM
select SND_SST_IPC_ACPI
select SND_SOC_INTEL_SST_MATCH if ACPI
help
This adds support for ASoC machine driver for Intel(R) Baytrail & CherryTrail
platforms with DA7212/7213 audio codec.
If unsure select "N".
config SND_SOC_INTEL_BYT_CHT_ES8316_MACH
tristate "ASoC Audio driver for Intel Baytrail & Cherrytrail with ES8316 codec"
depends on X86_INTEL_LPSS && I2C && ACPI
select SND_SOC_ES8316
select SND_SST_ATOM_HIFI2_PLATFORM
select SND_SST_IPC_ACPI
select SND_SOC_INTEL_SST_MATCH if ACPI
help
This adds support for ASoC machine driver for Intel(R) Baytrail &
Cherrytrail platforms with ES8316 audio codec.
If unsure select "N".
config SND_SOC_INTEL_BYT_CHT_NOCODEC_MACH
tristate "ASoC Audio driver for Intel Baytrail & Cherrytrail platform with no codec (MinnowBoard MAX, Up)"
depends on X86_INTEL_LPSS && I2C && ACPI
select SND_SST_ATOM_HIFI2_PLATFORM
select SND_SST_IPC_ACPI
select SND_SOC_INTEL_SST_MATCH if ACPI
help
This adds support for ASoC machine driver for the MinnowBoard Max or
Up boards and provides access to I2S signals on the Low-Speed
connector
If unsure select "N".
config SND_SOC_INTEL_KBL_RT5663_MAX98927_MACH
tristate "ASoC Audio driver for KBL with RT5663 and MAX98927 in I2S Mode"
depends on X86_INTEL_LPSS && I2C
select SND_SOC_INTEL_SST
select SND_SOC_INTEL_SKYLAKE
select SND_SOC_RT5663
select SND_SOC_MAX98927
select SND_SOC_DMIC
select SND_SOC_HDAC_HDMI
help
This adds support for ASoC Onboard Codec I2S machine driver. This will
create an alsa sound card for RT5663 + MAX98927.
Say Y if you have such a device.
If unsure select "N".
select SND_SOC_INTEL_SST_FIRMWARE
config SND_SOC_INTEL_KBL_RT5663_RT5514_MAX98927_MACH
tristate "ASoC Audio driver for KBL with RT5663, RT5514 and MAX98927 in I2S Mode"
depends on X86_INTEL_LPSS && I2C && SPI
select SND_SOC_INTEL_SST
select SND_SOC_INTEL_SKYLAKE
select SND_SOC_RT5663
select SND_SOC_RT5514
select SND_SOC_RT5514_SPI
select SND_SOC_MAX98927
select SND_SOC_HDAC_HDMI
help
This adds support for ASoC Onboard Codec I2S machine driver. This will
create an alsa sound card for RT5663 + RT5514 + MAX98927.
Say Y if you have such a device.
If unsure select "N".
config SND_SST_ATOM_HIFI2_PLATFORM
tristate "Intel ASoC SST driver for HiFi2 platforms (*field, *trail)"
depends on SND_SOC_INTEL_SST_TOPLEVEL && X86
select SND_SOC_COMPRESS
config SND_SOC_INTEL_SKYLAKE
tristate
tristate "Intel ASoC SST driver for SKL/BXT/KBL/GLK/CNL"
depends on SND_SOC_INTEL_SST_TOPLEVEL && PCI && ACPI
select SND_HDA_EXT_CORE
select SND_HDA_DSP_LOADER
select SND_SOC_TOPOLOGY
select SND_SOC_INTEL_SST
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_SKYLAKE
select SND_SOC_RT286
select SND_SOC_DMIC
select SND_SOC_HDAC_HDMI
help
This adds support for ASoC machine driver for Skylake platforms
with RT286 I2S audio codec.
Say Y if you have such a device.
If unsure select "N".
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_SKYLAKE
select SND_SOC_NAU8825
select SND_SOC_SSM4567
select SND_SOC_DMIC
select SND_SOC_HDAC_HDMI
help
This adds support for ASoC Onboard Codec I2S machine driver. This will
create an alsa sound card for NAU88L25 + SSM4567.
Say Y if you have such a device.
If unsure select "N".
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_SKYLAKE
select SND_SOC_NAU8825
select SND_SOC_MAX98357A
select SND_SOC_DMIC
select SND_SOC_HDAC_HDMI
help
This adds support for ASoC Onboard Codec I2S machine driver. This will
create an alsa sound card for NAU88L25 + MAX98357A.
Say Y if you have such a device.
If unsure select "N".
# ASoC codec drivers
source "sound/soc/intel/boards/Kconfig"
sound/soc/intel/Makefile
View file @
c44ff31a
# SPDX-License-Identifier: GPL-2.0
# Core support
obj-$(CONFIG_SND_SOC_INTEL_
SST
)
+=
common/
obj-$(CONFIG_SND_SOC_INTEL_
COMMON
)
+=
common/
# Platform Support
obj-$(CONFIG_SND_SOC_INTEL_HASWELL)
+=
haswell/
...
...
sound/soc/intel/atom/sst-mfld-platform-compress.c
View file @
c44ff31a
...
...
@@ -259,7 +259,7 @@ static int sst_platform_compr_set_metadata(struct snd_compr_stream *cstream,
return
stream
->
compr_ops
->
set_metadata
(
sst
->
dev
,
stream
->
id
,
metadata
);
}
struct
snd_compr_ops
sst_platform_compr_ops
=
{
const
struct
snd_compr_ops
sst_platform_compr_ops
=
{
.
open
=
sst_platform_compr_open
,
.
free
=
sst_platform_compr_free
,
...
...
sound/soc/intel/atom/sst-mfld-platform.h
View file @
c44ff31a
...
...
@@ -25,7 +25,7 @@
#include "sst-atom-controls.h"
extern
struct
sst_device
*
sst
;
extern
struct
snd_compr_ops
sst_platform_compr_ops
;
extern
const
struct
snd_compr_ops
sst_platform_compr_ops
;
#define SST_MONO 1
#define SST_STEREO 2
...
...
sound/soc/intel/atom/sst/sst_acpi.c
View file @
c44ff31a
...
...
@@ -23,7 +23,6 @@
#include <linux/interrupt.h>
#include <linux/slab.h>
#include <linux/io.h>
#include <linux/miscdevice.h>
#include <linux/platform_device.h>
#include <linux/firmware.h>
#include <linux/pm_runtime.h>
...
...
@@ -41,9 +40,10 @@
#include <acpi/acpi_bus.h>
#include <asm/cpu_device_id.h>
#include <asm/iosf_mbi.h>
#include <sound/soc-acpi.h>
#include <sound/soc-acpi-intel-match.h>
#include "../sst-mfld-platform.h"
#include "../../common/sst-dsp.h"
#include "../../common/sst-acpi.h"
#include "sst.h"
/* LPE viewpoint addresses */
...
...
@@ -239,19 +239,26 @@ static int sst_platform_get_resources(struct intel_sst_drv *ctx)
return
0
;
}
static
int
is_byt
(
void
)
{
bool
status
=
false
;
static
const
struct
x86_cpu_id
cpu_ids
[]
=
{
{
X86_VENDOR_INTEL
,
6
,
55
},
/* Valleyview, Bay Trail */
{}
};
if
(
x86_match_cpu
(
cpu_ids
))
status
=
true
;
return
status
;
}
static
int
is_byt_cr
(
struct
device
*
dev
,
bool
*
bytcr
)
{
int
status
=
0
;
if
(
IS_ENABLED
(
CONFIG_IOSF_MBI
))
{
static
const
struct
x86_cpu_id
cpu_ids
[]
=
{
{
X86_VENDOR_INTEL
,
6
,
55
},
/* Valleyview, Bay Trail */
{}
};
u32
bios_status
;
if
(
!
x86_match_cpu
(
cpu_ids
)
||
!
iosf_mbi_available
())
{
if
(
!
is_byt
(
)
||
!
iosf_mbi_available
())
{
/* bail silently */
return
status
;
}
...
...
@@ -285,7 +292,7 @@ static int sst_acpi_probe(struct platform_device *pdev)
int
ret
=
0
;
struct
intel_sst_drv
*
ctx
;
const
struct
acpi_device_id
*
id
;
struct
s
st
_acpi_mach
*
mach
;
struct
s
nd_soc
_acpi_mach
*
mach
;
struct
platform_device
*
mdev
;
struct
platform_device
*
plat_dev
;
struct
sst_platform_info
*
pdata
;
...
...
@@ -297,13 +304,17 @@ static int sst_acpi_probe(struct platform_device *pdev)
return
-
ENODEV
;
dev_dbg
(
dev
,
"for %s
\n
"
,
id
->
id
);
mach
=
(
struct
s
st
_acpi_mach
*
)
id
->
driver_data
;
mach
=
s
st
_acpi_find_machine
(
mach
);
mach
=
(
struct
s
nd_soc
_acpi_mach
*
)
id
->
driver_data
;
mach
=
s
nd_soc
_acpi_find_machine
(
mach
);
if
(
mach
==
NULL
)
{
dev_err
(
dev
,
"No matching machine driver found
\n
"
);
return
-
ENODEV
;
}
if
(
is_byt
())
mach
->
pdata
=
&
byt_rvp_platform_data
;
else
mach
->
pdata
=
&
chv_platform_data
;
pdata
=
mach
->
pdata
;
ret
=
kstrtouint
(
id
->
id
,
16
,
&
dev_id
);
...
...
@@ -381,286 +392,9 @@ static int sst_acpi_remove(struct platform_device *pdev)
return
0
;
}
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
)
{
cht_machine_id
=
CHT_SURFACE_MACH
;
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_VERSION
,
"ThinkPad 10"
),
},
},
{
.
callback
=
byt_thinkpad10_quirk_cb
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"LENOVO"
),
DMI_MATCH
(
DMI_PRODUCT_VERSION
,
"ThinkPad Tablet B"
),
},
},
{
.
callback
=
byt_thinkpad10_quirk_cb
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"LENOVO"
),
DMI_MATCH
(
DMI_PRODUCT_VERSION
,
"Lenovo Miix 2 10"
),
},
},
{
}
};
static
const
struct
dmi_system_id
cht_table
[]
=
{
{
.
callback
=
cht_surface_quirk_cb
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"Microsoft Corporation"
),
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"Surface 3"
),
},
},
{
}
};
static
struct
sst_acpi_mach
cht_surface_mach
=
{
.
id
=
"10EC5640"
,
.
drv_name
=
"cht-bsw-rt5645"
,
.
fw_filename
=
"intel/fw_sst_22a8.bin"
,
.
board
=
"cht-bsw"
,
.
pdata
=
&
chv_platform_data
,
};
static
struct
sst_acpi_mach
byt_thinkpad_10
=
{
.
id
=
"10EC5640"
,
.
drv_name
=
"cht-bsw-rt5672"
,
.
fw_filename
=
"intel/fw_sst_0f28.bin"
,
.
board
=
"cht-bsw"
,
.
pdata
=
&
byt_rvp_platform_data
,
};
static
struct
sst_acpi_mach
*
cht_quirk
(
void
*
arg
)
{
struct
sst_acpi_mach
*
mach
=
arg
;
dmi_check_system
(
cht_table
);
if
(
cht_machine_id
==
CHT_SURFACE_MACH
)
return
&
cht_surface_mach
;
else
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
[]
=
{
{
.
id
=
"10EC5640"
,
.
drv_name
=
"bytcr_rt5640"
,
.
fw_filename
=
"intel/fw_sst_0f28.bin"
,
.
board
=
"bytcr_rt5640"
,
.
machine_quirk
=
byt_quirk
,
.
pdata
=
&
byt_rvp_platform_data
,
},
{
.
id
=
"10EC5642"
,
.
drv_name
=
"bytcr_rt5640"
,
.
fw_filename
=
"intel/fw_sst_0f28.bin"
,
.
board
=
"bytcr_rt5640"
,
.
pdata
=
&
byt_rvp_platform_data
},
{
.
id
=
"INTCCFFD"
,
.
drv_name
=
"bytcr_rt5640"
,
.
fw_filename
=
"intel/fw_sst_0f28.bin"
,
.
board
=
"bytcr_rt5640"
,
.
pdata
=
&
byt_rvp_platform_data
},
{
.
id
=
"10EC5651"
,
.
drv_name
=
"bytcr_rt5651"
,
.
fw_filename
=
"intel/fw_sst_0f28.bin"
,
.
board
=
"bytcr_rt5651"
,
.
pdata
=
&
byt_rvp_platform_data
},
{
.
id
=
"DLGS7212"
,
.
drv_name
=
"bytcht_da7213"
,
.
fw_filename
=
"intel/fw_sst_0f28.bin"
,
.
board
=
"bytcht_da7213"
,
.
pdata
=
&
byt_rvp_platform_data
},
{
.
id
=
"DLGS7213"
,
.
drv_name
=
"bytcht_da7213"
,
.
fw_filename
=
"intel/fw_sst_0f28.bin"
,
.
board
=
"bytcht_da7213"
,
.
pdata
=
&
byt_rvp_platform_data
},
/* some Baytrail platforms rely on RT5645, use CHT machine driver */
{
.
id
=
"10EC5645"
,
.
drv_name
=
"cht-bsw-rt5645"
,
.
fw_filename
=
"intel/fw_sst_0f28.bin"
,
.
board
=
"cht-bsw"
,
.
pdata
=
&
byt_rvp_platform_data
},
{
.
id
=
"10EC5648"
,
.
drv_name
=
"cht-bsw-rt5645"
,
.
fw_filename
=
"intel/fw_sst_0f28.bin"
,
.
board
=
"cht-bsw"
,
.
pdata
=
&
byt_rvp_platform_data
},
#if IS_ENABLED(CONFIG_SND_SOC_INTEL_BYT_CHT_NOCODEC_MACH)
/*
* This is always last in the table so that it is selected only when
* enabled explicitly and there is no codec-related information in SSDT
*/
{
.
id
=
"80860F28"
,
.
drv_name
=
"bytcht_nocodec"
,
.
fw_filename
=
"intel/fw_sst_0f28.bin"
,
.
board
=
"bytcht_nocodec"
,
.
pdata
=
&
byt_rvp_platform_data
},
#endif
{},
};
/* Cherryview-based platforms: CherryTrail and Braswell */
static
struct
sst_acpi_mach
sst_acpi_chv
[]
=
{
{
.
id
=
"10EC5670"
,
.
drv_name
=
"cht-bsw-rt5672"
,
.
fw_filename
=
"intel/fw_sst_22a8.bin"
,
.
board
=
"cht-bsw"
,
.
pdata
=
&
chv_platform_data
},
{
.
id
=
"10EC5672"
,
.
drv_name
=
"cht-bsw-rt5672"
,
.
fw_filename
=
"intel/fw_sst_22a8.bin"
,
.
board
=
"cht-bsw"
,
.
pdata
=
&
chv_platform_data
},
{
.
id
=
"10EC5645"
,
.
drv_name
=
"cht-bsw-rt5645"
,
.
fw_filename
=
"intel/fw_sst_22a8.bin"
,
.
board
=
"cht-bsw"
,
.
pdata
=
&
chv_platform_data
},
{
.
id
=
"10EC5650"
,
.
drv_name
=
"cht-bsw-rt5645"
,
.
fw_filename
=
"intel/fw_sst_22a8.bin"
,
.
board
=
"cht-bsw"
,
.
pdata
=
&
chv_platform_data
},
{
.
id
=
"10EC3270"
,
.
drv_name
=
"cht-bsw-rt5645"
,
.
fw_filename
=
"intel/fw_sst_22a8.bin"
,
.
board
=
"cht-bsw"
,
.
pdata
=
&
chv_platform_data
},
{
.
id
=
"193C9890"
,
.
drv_name
=
"cht-bsw-max98090"
,
.
fw_filename
=
"intel/fw_sst_22a8.bin"
,
.
board
=
"cht-bsw"
,
.
pdata
=
&
chv_platform_data
},
{
.
id
=
"DLGS7212"
,
.
drv_name
=
"bytcht_da7213"
,
.
fw_filename
=
"intel/fw_sst_22a8.bin"
,
.
board
=
"bytcht_da7213"
,
.
pdata
=
&
chv_platform_data
},
{
.
id
=
"DLGS7213"
,
.
drv_name
=
"bytcht_da7213"
,
.
fw_filename
=
"intel/fw_sst_22a8.bin"
,
.
board
=
"bytcht_da7213"
,
.
pdata
=
&
chv_platform_data
},
{
.
id
=
"ESSX8316"
,
.
drv_name
=
"bytcht_es8316"
,
.
fw_filename
=
"intel/fw_sst_22a8.bin"
,
.
board
=
"bytcht_es8316"
,
.
pdata
=
&
chv_platform_data
},
/* some CHT-T platforms rely on RT5640, use Baytrail machine driver */
{
.
id
=
"10EC5640"
,
.
drv_name
=
"bytcr_rt5640"
,
.
fw_filename
=
"intel/fw_sst_22a8.bin"
,
.
board
=
"bytcr_rt5640"
,
.
machine_quirk
=
cht_quirk
,
.
pdata
=
&
chv_platform_data
},
{
.
id
=
"10EC3276"
,
.
drv_name
=
"bytcr_rt5640"
,
.
fw_filename
=
"intel/fw_sst_22a8.bin"
,
.
board
=
"bytcr_rt5640"
,
.
pdata
=
&
chv_platform_data
},
/* some CHT-T platforms rely on RT5651, use Baytrail machine driver */
{
.
id
=
"10EC5651"
,
.
drv_name
=
"bytcr_rt5651"
,
.
fw_filename
=
"intel/fw_sst_22a8.bin"
,
.
board
=
"bytcr_rt5651"
,
.
pdata
=
&
chv_platform_data
},
#if IS_ENABLED(CONFIG_SND_SOC_INTEL_BYT_CHT_NOCODEC_MACH)
/*
* This is always last in the table so that it is selected only when
* enabled explicitly and there is no codec-related information in SSDT
*/
{
.
id
=
"808622A8"
,
.
drv_name
=
"bytcht_nocodec"
,
.
fw_filename
=
"intel/fw_sst_22a8.bin"
,
.
board
=
"bytcht_nocodec"
,
.
pdata
=
&
chv_platform_data
},
#endif
{},
};
static
const
struct
acpi_device_id
sst_acpi_ids
[]
=
{
{
"80860F28"
,
(
unsigned
long
)
&
s
st_acpi_bytcr
},
{
"808622A8"
,
(
unsigned
long
)
&
sst_acpi_chv
},
{
"80860F28"
,
(
unsigned
long
)
&
s
nd_soc_acpi_intel_baytrail_machines
},
{
"808622A8"
,
(
unsigned
long
)
&
snd_soc_acpi_intel_cherrytrail_machines
},
{
},
};
...
...
sound/soc/intel/atom/sst/sst_loader.c
View file @
c44ff31a
...
...
@@ -415,7 +415,6 @@ int sst_load_fw(struct intel_sst_drv *sst_drv_ctx)
return
ret_val
;
}
BUG_ON
(
!
sst_drv_ctx
->
fw_in_mem
);
block
=
sst_create_block
(
sst_drv_ctx
,
0
,
FW_DWNL_ID
);
if
(
block
==
NULL
)
return
-
ENOMEM
;
...
...
sound/soc/intel/atom/sst/sst_stream.c
View file @
c44ff31a
...
...
@@ -45,7 +45,6 @@ int sst_alloc_stream_mrfld(struct intel_sst_drv *sst_drv_ctx, void *params)
void
*
data
=
NULL
;
dev_dbg
(
sst_drv_ctx
->
dev
,
"Enter
\n
"
);
BUG_ON
(
!
params
);
str_params
=
(
struct
snd_sst_params
*
)
params
;
memset
(
&
alloc_param
,
0
,
sizeof
(
alloc_param
));
...
...
sound/soc/intel/boards/Kconfig
0 → 100644
View file @
c44ff31a
config SND_SOC_INTEL_MACH
tristate "Intel Audio machine drivers"
depends on SND_SOC_INTEL_SST_TOPLEVEL
select SND_SOC_ACPI_INTEL_MATCH if ACPI
if SND_SOC_INTEL_MACH
config SND_MFLD_MACHINE
tristate "SOC Machine Audio driver for Intel Medfield MID platform"
depends on INTEL_SCU_IPC
select SND_SOC_SN95031
depends on SND_SST_ATOM_HIFI2_PLATFORM
select SND_SST_IPC_PCI
help
This adds support for ASoC machine driver for Intel(R) MID Medfield platform
used as alsa device in audio substem in Intel(R) MID devices
Say Y if you have such a device.
If unsure select "N".
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 SND_SOC_INTEL_HASWELL
select SND_SOC_RT5640
help
This adds support for the Lynxpoint Audio DSP on Intel(R) Haswell
Ultrabook platforms.
Say Y if you have such a device.
If unsure select "N".
config SND_SOC_INTEL_BDW_RT5677_MACH
tristate "ASoC Audio driver for Intel Broadwell with RT5677 codec"
depends on X86_INTEL_LPSS && GPIOLIB && I2C
depends on SND_SOC_INTEL_HASWELL
select SND_SOC_RT5677
help
This adds support for Intel Broadwell platform based boards with
the RT5677 audio codec.
config SND_SOC_INTEL_BROADWELL_MACH
tristate "ASoC Audio DSP support for Intel Broadwell Wildcatpoint"
depends on X86_INTEL_LPSS && I2C && I2C_DESIGNWARE_PLATFORM
depends on SND_SOC_INTEL_HASWELL
select SND_SOC_RT286
help
This adds support for the Wilcatpoint Audio DSP on Intel(R) Broadwell
Ultrabook platforms.
Say Y if you have such a device.
If unsure select "N".
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 SND_SST_IPC_ACPI = n
depends on SND_SOC_INTEL_BAYTRAIL
select SND_SOC_MAX98090
help
This adds audio driver for Intel Baytrail platform based boards
with the MAX98090 audio codec.
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 SND_SST_IPC_ACPI = n
depends on SND_SOC_INTEL_BAYTRAIL
select SND_SOC_RT5640
help
This adds audio driver for Intel Baytrail platform based boards
with the RT5640 audio codec. This driver is deprecated, use
SND_SOC_INTEL_BYTCR_RT5640_MACH instead for better functionality.
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
depends on SND_SST_ATOM_HIFI2_PLATFORM
select SND_SST_IPC_ACPI
help
This adds support for ASoC machine driver for Intel(R) Baytrail and Baytrail-CR
platforms with RT5640 audio codec.
Say Y if you have such a device.
If unsure select "N".
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
depends on SND_SST_ATOM_HIFI2_PLATFORM
select SND_SST_IPC_ACPI
help
This adds support for ASoC machine driver for Intel(R) Baytrail and Baytrail-CR
platforms with RT5651 audio codec.
Say Y if you have such a device.
If unsure select "N".
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
depends on SND_SST_ATOM_HIFI2_PLATFORM
select SND_SST_IPC_ACPI
help
This adds support for ASoC machine driver for Intel(R) Cherrytrail & Braswell
platforms with RT5672 audio codec.
Say Y if you have such a device.
If unsure select "N".
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
depends on SND_SST_ATOM_HIFI2_PLATFORM
select SND_SST_IPC_ACPI
help
This adds support for ASoC machine driver for Intel(R) Cherrytrail & Braswell
platforms with RT5645/5650 audio codec.
If unsure select "N".
config SND_SOC_INTEL_CHT_BSW_MAX98090_TI_MACH
tristate "ASoC Audio driver for Intel Cherrytrail & Braswell with MAX98090 & TI codec"
depends on X86_INTEL_LPSS && I2C && ACPI
select SND_SOC_MAX98090
select SND_SOC_TS3A227E
depends on SND_SST_ATOM_HIFI2_PLATFORM
select SND_SST_IPC_ACPI
help
This adds support for ASoC machine driver for Intel(R) Cherrytrail & Braswell
platforms with MAX98090 audio codec it also can support TI jack chip as aux device.
If unsure select "N".
config SND_SOC_INTEL_BYT_CHT_DA7213_MACH
tristate "ASoC Audio driver for Intel Baytrail & Cherrytrail with DA7212/7213 codec"
depends on X86_INTEL_LPSS && I2C && ACPI
select SND_SOC_DA7213
depends on SND_SST_ATOM_HIFI2_PLATFORM
select SND_SST_IPC_ACPI
help
This adds support for ASoC machine driver for Intel(R) Baytrail & CherryTrail
platforms with DA7212/7213 audio codec.
If unsure select "N".
config SND_SOC_INTEL_BYT_CHT_ES8316_MACH
tristate "ASoC Audio driver for Intel Baytrail & Cherrytrail with ES8316 codec"
depends on X86_INTEL_LPSS && I2C && ACPI
select SND_SOC_ES8316
depends on SND_SST_ATOM_HIFI2_PLATFORM
select SND_SST_IPC_ACPI
help
This adds support for ASoC machine driver for Intel(R) Baytrail &
Cherrytrail platforms with ES8316 audio codec.
If unsure select "N".
config SND_SOC_INTEL_BYT_CHT_NOCODEC_MACH
tristate "ASoC Audio driver for Intel Baytrail & Cherrytrail platform with no codec (MinnowBoard MAX, Up)"
depends on X86_INTEL_LPSS && I2C && ACPI
depends on SND_SST_ATOM_HIFI2_PLATFORM
select SND_SST_IPC_ACPI
help
This adds support for ASoC machine driver for the MinnowBoard Max or
Up boards and provides access to I2S signals on the Low-Speed
connector
If unsure select "N".
config SND_SOC_INTEL_SKL_RT286_MACH
tristate "ASoC Audio driver for SKL with RT286 I2S mode"
depends on X86 && ACPI && I2C
depends on SND_SOC_INTEL_SKYLAKE
select SND_SOC_RT286
select SND_SOC_DMIC
select SND_SOC_HDAC_HDMI
help
This adds support for ASoC machine driver for Skylake platforms
with RT286 I2S audio codec.
Say Y if you have such a device.
If unsure select "N".
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
depends on SND_SOC_INTEL_SKYLAKE
select SND_SOC_NAU8825
select SND_SOC_SSM4567
select SND_SOC_DMIC
select SND_SOC_HDAC_HDMI
help
This adds support for ASoC Onboard Codec I2S machine driver. This will
create an alsa sound card for NAU88L25 + SSM4567.
Say Y if you have such a device.
If unsure select "N".
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
depends on SND_SOC_INTEL_SKYLAKE
select SND_SOC_NAU8825
select SND_SOC_MAX98357A
select SND_SOC_DMIC
select SND_SOC_HDAC_HDMI
help
This adds support for ASoC Onboard Codec I2S machine driver. This will
create an alsa sound card for NAU88L25 + MAX98357A.
Say Y if you have such a device.
If unsure select "N".
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
depends on SND_SOC_INTEL_SKYLAKE
select SND_SOC_DA7219
select SND_SOC_MAX98357A
select SND_SOC_DMIC
select SND_SOC_HDAC_HDMI
select SND_HDA_DSP_LOADER
help
This adds support for ASoC machine driver for Broxton-P platforms
with DA7219 + MAX98357A I2S audio codec.
Say Y if you have such a device.
If unsure select "N".
config SND_SOC_INTEL_BXT_RT298_MACH
tristate "ASoC Audio driver for Broxton with RT298 I2S mode"
depends on X86 && ACPI && I2C
depends on SND_SOC_INTEL_SKYLAKE
select SND_SOC_RT298
select SND_SOC_DMIC
select SND_SOC_HDAC_HDMI
select SND_HDA_DSP_LOADER
help
This adds support for ASoC machine driver for Broxton platforms
with RT286 I2S audio codec.
Say Y if you have such a device.
If unsure select "N".
config SND_SOC_INTEL_KBL_RT5663_MAX98927_MACH
tristate "ASoC Audio driver for KBL with RT5663 and MAX98927 in I2S Mode"
depends on X86_INTEL_LPSS && I2C
select SND_SOC_INTEL_SST
depends on SND_SOC_INTEL_SKYLAKE
select SND_SOC_RT5663
select SND_SOC_MAX98927
select SND_SOC_DMIC
select SND_SOC_HDAC_HDMI
help
This adds support for ASoC Onboard Codec I2S machine driver. This will
create an alsa sound card for RT5663 + MAX98927.
Say Y if you have such a device.
If unsure select "N".
config SND_SOC_INTEL_KBL_RT5663_RT5514_MAX98927_MACH
tristate "ASoC Audio driver for KBL with RT5663, RT5514 and MAX98927 in I2S Mode"
depends on X86_INTEL_LPSS && I2C && SPI
select SND_SOC_INTEL_SST
depends on SND_SOC_INTEL_SKYLAKE
select SND_SOC_RT5663
select SND_SOC_RT5514
select SND_SOC_RT5514_SPI
select SND_SOC_MAX98927
select SND_SOC_HDAC_HDMI
help
This adds support for ASoC Onboard Codec I2S machine driver. This will
create an alsa sound card for RT5663 + RT5514 + MAX98927.
Say Y if you have such a device.
If unsure select "N".
endif
sound/soc/intel/boards/bxt_da7219_max98357a.c
View file @
c44ff31a
...
...
@@ -55,20 +55,6 @@ enum {
BXT_DPCM_AUDIO_HDMI3_PB
,
};
static
inline
struct
snd_soc_dai
*
bxt_get_codec_dai
(
struct
snd_soc_card
*
card
)
{
struct
snd_soc_pcm_runtime
*
rtd
;
list_for_each_entry
(
rtd
,
&
card
->
rtd_list
,
list
)
{
if
(
!
strncmp
(
rtd
->
codec_dai
->
name
,
BXT_DIALOG_CODEC_DAI
,
strlen
(
BXT_DIALOG_CODEC_DAI
)))
return
rtd
->
codec_dai
;
}
return
NULL
;
}
static
int
platform_clock_control
(
struct
snd_soc_dapm_widget
*
w
,
struct
snd_kcontrol
*
k
,
int
event
)
{
...
...
@@ -77,7 +63,7 @@ static int platform_clock_control(struct snd_soc_dapm_widget *w,
struct
snd_soc_card
*
card
=
dapm
->
card
;
struct
snd_soc_dai
*
codec_dai
;
codec_dai
=
bxt_get_codec_dai
(
card
);
codec_dai
=
snd_soc_card_get_codec_dai
(
card
,
BXT_DIALOG_CODEC_DAI
);
if
(
!
codec_dai
)
{
dev_err
(
card
->
dev
,
"Codec dai not found; Unable to set/unset codec pll
\n
"
);
return
-
EIO
;
...
...
sound/soc/intel/boards/bytcht_da7213.c
View file @
c44ff31a
...
...
@@ -27,9 +27,9 @@
#include <sound/pcm.h>
#include <sound/pcm_params.h>
#include <sound/soc.h>
#include <sound/soc-acpi.h>
#include "../../codecs/da7213.h"
#include "../atom/sst-atom-controls.h"
#include "../common/sst-acpi.h"
static
const
struct
snd_kcontrol_new
controls
[]
=
{
SOC_DAPM_PIN_SWITCH
(
"Headphone Jack"
),
...
...
@@ -185,19 +185,11 @@ static struct snd_soc_dai_link dailink[] = {
.
dpcm_playback
=
1
,
.
ops
=
&
aif1_ops
,
},
[
MERR_DPCM_COMPR
]
=
{
.
name
=
"Compressed Port"
,
.
stream_name
=
"Compress"
,
.
cpu_dai_name
=
"compress-cpu-dai"
,
.
codec_dai_name
=
"snd-soc-dummy-dai"
,
.
codec_name
=
"snd-soc-dummy"
,
.
platform_name
=
"sst-mfld-platform"
,
},
/* CODEC<->CODEC link */
/* back ends */
{
.
name
=
"SSP2-Codec"
,
.
id
=
1
,
.
id
=
0
,
.
cpu_dai_name
=
"ssp2-port"
,
.
platform_name
=
"sst-mfld-platform"
,
.
no_pcm
=
1
,
...
...
@@ -231,19 +223,18 @@ static char codec_name[16]; /* i2c-<HID>:00 with HID being 8 chars */
static
int
bytcht_da7213_probe
(
struct
platform_device
*
pdev
)
{
int
ret_val
=
0
;
int
i
;
struct
snd_soc_card
*
card
;
struct
s
st
_acpi_mach
*
mach
;
struct
s
nd_soc
_acpi_mach
*
mach
;
const
char
*
i2c_name
=
NULL
;
int
dai_index
=
0
;
int
ret_val
=
0
;
int
i
;
mach
=
(
&
pdev
->
dev
)
->
platform_data
;
card
=
&
bytcht_da7213_card
;
card
->
dev
=
&
pdev
->
dev
;
/* fix index of codec dai */
dai_index
=
MERR_DPCM_COMPR
+
1
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
dailink
);
i
++
)
{
if
(
!
strcmp
(
dailink
[
i
].
codec_name
,
"i2c-DLGS7213:00"
))
{
dai_index
=
i
;
...
...
@@ -252,8 +243,8 @@ static int bytcht_da7213_probe(struct platform_device *pdev)
}
/* fixup codec name based on HID */
i2c_name
=
s
st
_acpi_find_name_from_hid
(
mach
->
id
);
if
(
i2c_name
!=
NULL
)
{
i2c_name
=
s
nd_soc
_acpi_find_name_from_hid
(
mach
->
id
);
if
(
i2c_name
)
{
snprintf
(
codec_name
,
sizeof
(
codec_name
),
"%s%s"
,
"i2c-"
,
i2c_name
);
dailink
[
dai_index
].
codec_name
=
codec_name
;
...
...
sound/soc/intel/boards/bytcht_es8316.c
View file @
c44ff31a
...
...
@@ -29,28 +29,14 @@
#include <sound/pcm.h>
#include <sound/pcm_params.h>
#include <sound/soc.h>
#include <sound/soc-acpi.h>
#include "../atom/sst-atom-controls.h"
#include "../common/sst-acpi.h"
#include "../common/sst-dsp.h"
struct
byt_cht_es8316_private
{
struct
clk
*
mclk
;
};
#define CODEC_DAI1 "ES8316 HiFi"
static
inline
struct
snd_soc_dai
*
get_codec_dai
(
struct
snd_soc_card
*
card
)
{
struct
snd_soc_pcm_runtime
*
rtd
;
list_for_each_entry
(
rtd
,
&
card
->
rtd_list
,
list
)
{
if
(
!
strncmp
(
rtd
->
codec_dai
->
name
,
CODEC_DAI1
,
strlen
(
CODEC_DAI1
)))
return
rtd
->
codec_dai
;
}
return
NULL
;
}
static
const
struct
snd_soc_dapm_widget
byt_cht_es8316_widgets
[]
=
{
SND_SOC_DAPM_HP
(
"Headphone"
,
NULL
),
...
...
@@ -208,22 +194,13 @@ static struct snd_soc_dai_link byt_cht_es8316_dais[] = {
.
ops
=
&
byt_cht_es8316_aif1_ops
,
},
[
MERR_DPCM_COMPR
]
=
{
.
name
=
"Compressed Port"
,
.
stream_name
=
"Compress"
,
.
cpu_dai_name
=
"compress-cpu-dai"
,
.
codec_dai_name
=
"snd-soc-dummy-dai"
,
.
codec_name
=
"snd-soc-dummy"
,
.
platform_name
=
"sst-mfld-platform"
,
},
/* back ends */
{
/* Only SSP2 has been tested here, so BYT-CR platforms that
* require SSP0 will not work.
*/
.
name
=
"SSP2-Codec"
,
.
id
=
1
,
.
id
=
0
,
.
cpu_dai_name
=
"ssp2-port"
,
.
platform_name
=
"sst-mfld-platform"
,
.
no_pcm
=
1
,
...
...
sound/soc/intel/boards/bytcht_nocodec.c
View file @
c44ff31a
...
...
@@ -133,19 +133,11 @@ static struct snd_soc_dai_link dais[] = {
.
dpcm_playback
=
1
,
.
ops
=
&
aif1_ops
,
},
[
MERR_DPCM_COMPR
]
=
{
.
name
=
"Compressed Port"
,
.
stream_name
=
"Compress"
,
.
cpu_dai_name
=
"compress-cpu-dai"
,
.
codec_dai_name
=
"snd-soc-dummy-dai"
,
.
codec_name
=
"snd-soc-dummy"
,
.
platform_name
=
"sst-mfld-platform"
,
},
/* CODEC<->CODEC link */
/* back ends */
{
.
name
=
"SSP2-LowSpeed Connector"
,
.
id
=
1
,
.
id
=
0
,
.
cpu_dai_name
=
"ssp2-port"
,
.
platform_name
=
"sst-mfld-platform"
,
.
no_pcm
=
1
,
...
...
sound/soc/intel/boards/bytcr_rt5640.c
View file @
c44ff31a
...
...
@@ -22,19 +22,19 @@
#include <linux/moduleparam.h>
#include <linux/platform_device.h>
#include <linux/acpi.h>
#include <linux/clk.h>
#include <linux/device.h>
#include <linux/dmi.h>
#include <linux/slab.h>
#include <asm/cpu_device_id.h>
#include <asm/platform_sst_audio.h>
#include <linux/clk.h>
#include <sound/pcm.h>
#include <sound/pcm_params.h>
#include <sound/soc.h>
#include <sound/jack.h>
#include <sound/soc-acpi.h>
#include "../../codecs/rt5640.h"
#include "../atom/sst-atom-controls.h"
#include "../common/sst-acpi.h"
#include "../common/sst-dsp.h"
enum
{
...
...
@@ -44,13 +44,13 @@ enum {
BYT_RT5640_IN3_MAP
,
};
#define BYT_RT5640_MAP(quirk) ((quirk) &
0xff
)
#define BYT_RT5640_MAP(quirk) ((quirk) &
GENMASK(7, 0)
)
#define BYT_RT5640_DMIC_EN BIT(16)
#define BYT_RT5640_MONO_SPEAKER BIT(17)
#define BYT_RT5640_DIFF_MIC BIT(18)
/* defaut is single-ended */
#define BYT_RT5640_SSP2_AIF2
BIT(19)
/* default is using AIF1 */
#define BYT_RT5640_SSP0_AIF1
BIT(20)
#define BYT_RT5640_SSP0_AIF2
BIT(21)
#define BYT_RT5640_SSP2_AIF2 BIT(19)
/* default is using AIF1 */
#define BYT_RT5640_SSP0_AIF1 BIT(20)
#define BYT_RT5640_SSP0_AIF2 BIT(21)
#define BYT_RT5640_MCLK_EN BIT(22)
#define BYT_RT5640_MCLK_25MHZ BIT(23)
...
...
@@ -145,22 +145,6 @@ static void log_quirks(struct device *dev)
#define BYT_CODEC_DAI1 "rt5640-aif1"
#define BYT_CODEC_DAI2 "rt5640-aif2"
static
inline
struct
snd_soc_dai
*
byt_get_codec_dai
(
struct
snd_soc_card
*
card
)
{
struct
snd_soc_pcm_runtime
*
rtd
;
list_for_each_entry
(
rtd
,
&
card
->
rtd_list
,
list
)
{
if
(
!
strncmp
(
rtd
->
codec_dai
->
name
,
BYT_CODEC_DAI1
,
strlen
(
BYT_CODEC_DAI1
)))
return
rtd
->
codec_dai
;
if
(
!
strncmp
(
rtd
->
codec_dai
->
name
,
BYT_CODEC_DAI2
,
strlen
(
BYT_CODEC_DAI2
)))
return
rtd
->
codec_dai
;
}
return
NULL
;
}
static
int
platform_clock_control
(
struct
snd_soc_dapm_widget
*
w
,
struct
snd_kcontrol
*
k
,
int
event
)
{
...
...
@@ -170,7 +154,10 @@ static int platform_clock_control(struct snd_soc_dapm_widget *w,
struct
byt_rt5640_private
*
priv
=
snd_soc_card_get_drvdata
(
card
);
int
ret
;
codec_dai
=
byt_get_codec_dai
(
card
);
codec_dai
=
snd_soc_card_get_codec_dai
(
card
,
BYT_CODEC_DAI1
);
if
(
!
codec_dai
)
codec_dai
=
snd_soc_card_get_codec_dai
(
card
,
BYT_CODEC_DAI2
);
if
(
!
codec_dai
)
{
dev_err
(
card
->
dev
,
"Codec dai not found; Unable to set platform clock
\n
"
);
...
...
@@ -178,7 +165,7 @@ static int platform_clock_control(struct snd_soc_dapm_widget *w,
}
if
(
SND_SOC_DAPM_EVENT_ON
(
event
))
{
if
(
(
byt_rt5640_quirk
&
BYT_RT5640_MCLK_EN
)
&&
priv
->
mclk
)
{
if
(
byt_rt5640_quirk
&
BYT_RT5640_MCLK_EN
)
{
ret
=
clk_prepare_enable
(
priv
->
mclk
);
if
(
ret
<
0
)
{
dev_err
(
card
->
dev
,
...
...
@@ -199,7 +186,7 @@ static int platform_clock_control(struct snd_soc_dapm_widget *w,
48000
*
512
,
SND_SOC_CLOCK_IN
);
if
(
!
ret
)
{
if
(
(
byt_rt5640_quirk
&
BYT_RT5640_MCLK_EN
)
&&
priv
->
mclk
)
if
(
byt_rt5640_quirk
&
BYT_RT5640_MCLK_EN
)
clk_disable_unprepare
(
priv
->
mclk
);
}
}
...
...
@@ -376,8 +363,8 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {
DMI_EXACT_MATCH
(
DMI_SYS_VENDOR
,
"ASUSTeK COMPUTER INC."
),
DMI_EXACT_MATCH
(
DMI_PRODUCT_NAME
,
"T100TA"
),
},
.
driver_data
=
(
unsigned
long
*
)(
BYT_RT5640_IN1_MAP
|
BYT_RT5640_MCLK_EN
),
.
driver_data
=
(
void
*
)(
BYT_RT5640_IN1_MAP
|
BYT_RT5640_MCLK_EN
),
},
{
.
callback
=
byt_rt5640_quirk_cb
,
...
...
@@ -385,12 +372,11 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {
DMI_EXACT_MATCH
(
DMI_SYS_VENDOR
,
"ASUSTeK COMPUTER INC."
),
DMI_EXACT_MATCH
(
DMI_PRODUCT_NAME
,
"T100TAF"
),
},
.
driver_data
=
(
unsigned
long
*
)(
BYT_RT5640_IN1_MAP
|
BYT_RT5640_MONO_SPEAKER
|
BYT_RT5640_DIFF_MIC
|
BYT_RT5640_SSP0_AIF2
|
BYT_RT5640_MCLK_EN
),
.
driver_data
=
(
void
*
)(
BYT_RT5640_IN1_MAP
|
BYT_RT5640_MONO_SPEAKER
|
BYT_RT5640_DIFF_MIC
|
BYT_RT5640_SSP0_AIF2
|
BYT_RT5640_MCLK_EN
),
},
{
.
callback
=
byt_rt5640_quirk_cb
,
...
...
@@ -398,9 +384,9 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {
DMI_EXACT_MATCH
(
DMI_SYS_VENDOR
,
"DellInc."
),
DMI_EXACT_MATCH
(
DMI_PRODUCT_NAME
,
"Venue 8 Pro 5830"
),
},
.
driver_data
=
(
unsigned
long
*
)(
BYT_RT5640_DMIC2_MAP
|
BYT_RT5640_DMIC_EN
|
BYT_RT5640_MCLK_EN
),
.
driver_data
=
(
void
*
)(
BYT_RT5640_DMIC2_MAP
|
BYT_RT5640_DMIC_EN
|
BYT_RT5640_MCLK_EN
),
},
{
.
callback
=
byt_rt5640_quirk_cb
,
...
...
@@ -408,8 +394,8 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {
DMI_EXACT_MATCH
(
DMI_SYS_VENDOR
,
"Hewlett-Packard"
),
DMI_EXACT_MATCH
(
DMI_PRODUCT_NAME
,
"HP ElitePad 1000 G2"
),
},
.
driver_data
=
(
unsigned
long
*
)(
BYT_RT5640_IN1_MAP
|
BYT_RT5640_MCLK_EN
),
.
driver_data
=
(
void
*
)(
BYT_RT5640_IN1_MAP
|
BYT_RT5640_MCLK_EN
),
},
{
.
callback
=
byt_rt5640_quirk_cb
,
...
...
@@ -417,8 +403,8 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {
DMI_MATCH
(
DMI_SYS_VENDOR
,
"Circuitco"
),
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"Minnowboard Max B3 PLATFORM"
),
},
.
driver_data
=
(
unsigned
long
*
)(
BYT_RT5640_DMIC1_MAP
|
BYT_RT5640_DMIC_EN
),
.
driver_data
=
(
void
*
)(
BYT_RT5640_DMIC1_MAP
|
BYT_RT5640_DMIC_EN
),
},
{
.
callback
=
byt_rt5640_quirk_cb
,
...
...
@@ -426,9 +412,9 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {
DMI_MATCH
(
DMI_BOARD_VENDOR
,
"TECLAST"
),
DMI_MATCH
(
DMI_BOARD_NAME
,
"tPAD"
),
},
.
driver_data
=
(
unsigned
long
*
)(
BYT_RT5640_IN3_MAP
|
BYT_RT5640_MCLK_EN
|
BYT_RT5640_SSP0_AIF1
),
.
driver_data
=
(
void
*
)(
BYT_RT5640_IN3_MAP
|
BYT_RT5640_MCLK_EN
|
BYT_RT5640_SSP0_AIF1
),
},
{
.
callback
=
byt_rt5640_quirk_cb
,
...
...
@@ -436,7 +422,7 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {
DMI_MATCH
(
DMI_SYS_VENDOR
,
"Acer"
),
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"Aspire SW5-012"
),
},
.
driver_data
=
(
unsigned
long
*
)(
BYT_RT5640_IN1_MAP
|
.
driver_data
=
(
void
*
)(
BYT_RT5640_IN1_MAP
|
BYT_RT5640_MCLK_EN
|
BYT_RT5640_SSP0_AIF1
),
...
...
@@ -446,9 +432,9 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"Insyde"
),
},
.
driver_data
=
(
unsigned
long
*
)(
BYT_RT5640_IN3_MAP
|
BYT_RT5640_MCLK_EN
|
BYT_RT5640_SSP0_AIF1
),
.
driver_data
=
(
void
*
)(
BYT_RT5640_IN3_MAP
|
BYT_RT5640_MCLK_EN
|
BYT_RT5640_SSP0_AIF1
),
},
{}
...
...
@@ -456,12 +442,12 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {
static
int
byt_rt5640_init
(
struct
snd_soc_pcm_runtime
*
runtime
)
{
int
ret
;
struct
snd_soc_codec
*
codec
=
runtime
->
codec
;
struct
snd_soc_card
*
card
=
runtime
->
card
;
const
struct
snd_soc_dapm_route
*
custom_map
;
struct
byt_rt5640_private
*
priv
=
snd_soc_card_get_drvdata
(
card
);
struct
snd_soc_codec
*
codec
=
runtime
->
codec
;
const
struct
snd_soc_dapm_route
*
custom_map
;
int
num_routes
;
int
ret
;
card
->
dapm
.
idle_bias_off
=
true
;
...
...
@@ -549,7 +535,7 @@ static int byt_rt5640_init(struct snd_soc_pcm_runtime *runtime)
snd_soc_dapm_ignore_suspend
(
&
card
->
dapm
,
"Headphone"
);
snd_soc_dapm_ignore_suspend
(
&
card
->
dapm
,
"Speaker"
);
if
(
(
byt_rt5640_quirk
&
BYT_RT5640_MCLK_EN
)
&&
priv
->
mclk
)
{
if
(
byt_rt5640_quirk
&
BYT_RT5640_MCLK_EN
)
{
/*
* The firmware might enable the clock at
* boot (this information may or may not
...
...
@@ -692,19 +678,11 @@ static struct snd_soc_dai_link byt_rt5640_dais[] = {
.
dynamic
=
1
,
.
dpcm_playback
=
1
,
.
ops
=
&
byt_rt5640_aif1_ops
,
},
[
MERR_DPCM_COMPR
]
=
{
.
name
=
"Baytrail Compressed Port"
,
.
stream_name
=
"Baytrail Compress"
,
.
cpu_dai_name
=
"compress-cpu-dai"
,
.
codec_dai_name
=
"snd-soc-dummy-dai"
,
.
codec_name
=
"snd-soc-dummy"
,
.
platform_name
=
"sst-mfld-platform"
,
},
/* back ends */
{
.
name
=
"SSP2-Codec"
,
.
id
=
1
,
.
id
=
0
,
.
cpu_dai_name
=
"ssp2-port"
,
/* overwritten for ssp0 routing */
.
platform_name
=
"sst-mfld-platform"
,
.
no_pcm
=
1
,
...
...
@@ -758,12 +736,12 @@ struct acpi_chan_package { /* ACPICA seems to require 64 bit integers */
static
int
snd_byt_rt5640_mc_probe
(
struct
platform_device
*
pdev
)
{
int
ret_val
=
0
;
struct
s
st
_acpi_mach
*
mach
;
struct
byt_rt5640_private
*
priv
;
struct
s
nd_soc
_acpi_mach
*
mach
;
const
char
*
i2c_name
=
NULL
;
int
ret_val
=
0
;
int
dai_index
=
0
;
int
i
;
int
dai_index
;
struct
byt_rt5640_private
*
priv
;
is_bytcr
=
false
;
priv
=
devm_kzalloc
(
&
pdev
->
dev
,
sizeof
(
*
priv
),
GFP_ATOMIC
);
...
...
@@ -776,7 +754,6 @@ static int snd_byt_rt5640_mc_probe(struct platform_device *pdev)
snd_soc_card_set_drvdata
(
&
byt_rt5640_card
,
priv
);
/* fix index of codec dai */
dai_index
=
MERR_DPCM_COMPR
+
1
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
byt_rt5640_dais
);
i
++
)
{
if
(
!
strcmp
(
byt_rt5640_dais
[
i
].
codec_name
,
"i2c-10EC5640:00"
))
{
dai_index
=
i
;
...
...
@@ -785,8 +762,8 @@ static int snd_byt_rt5640_mc_probe(struct platform_device *pdev)
}
/* fixup codec name based on HID */
i2c_name
=
s
st
_acpi_find_name_from_hid
(
mach
->
id
);
if
(
i2c_name
!=
NULL
)
{
i2c_name
=
s
nd_soc
_acpi_find_name_from_hid
(
mach
->
id
);
if
(
i2c_name
)
{
snprintf
(
byt_rt5640_codec_name
,
sizeof
(
byt_rt5640_codec_name
),
"%s%s"
,
"i2c-"
,
i2c_name
);
...
...
@@ -819,7 +796,7 @@ static int snd_byt_rt5640_mc_probe(struct platform_device *pdev)
/* format specified: 2 64-bit integers */
struct
acpi_buffer
format
=
{
sizeof
(
"NN"
),
"NN"
};
struct
acpi_buffer
state
=
{
0
,
NULL
};
struct
s
st
_acpi_package_context
pkg_ctx
;
struct
s
nd_soc
_acpi_package_context
pkg_ctx
;
bool
pkg_found
=
false
;
state
.
length
=
sizeof
(
chan_package
);
...
...
@@ -831,7 +808,8 @@ static int snd_byt_rt5640_mc_probe(struct platform_device *pdev)
pkg_ctx
.
state
=
&
state
;
pkg_ctx
.
data_valid
=
false
;
pkg_found
=
sst_acpi_find_package_from_hid
(
mach
->
id
,
&
pkg_ctx
);
pkg_found
=
snd_soc_acpi_find_package_from_hid
(
mach
->
id
,
&
pkg_ctx
);
if
(
pkg_found
)
{
if
(
chan_package
.
aif_value
==
1
)
{
dev_info
(
&
pdev
->
dev
,
"BIOS Routing: AIF1 connected
\n
"
);
...
...
@@ -891,7 +869,7 @@ static int snd_byt_rt5640_mc_probe(struct platform_device *pdev)
byt_rt5640_cpu_dai_name
;
}
if
(
(
byt_rt5640_quirk
&
BYT_RT5640_MCLK_EN
)
&&
(
is_valleyview
())
)
{
if
(
byt_rt5640_quirk
&
BYT_RT5640_MCLK_EN
)
{
priv
->
mclk
=
devm_clk_get
(
&
pdev
->
dev
,
"pmc_plt_clk_3"
);
if
(
IS_ERR
(
priv
->
mclk
))
{
ret_val
=
PTR_ERR
(
priv
->
mclk
);
...
...
sound/soc/intel/boards/bytcr_rt5651.c
View file @
c44ff31a
...
...
@@ -21,24 +21,124 @@
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/acpi.h>
#include <linux/clk.h>
#include <linux/device.h>
#include <linux/dmi.h>
#include <linux/slab.h>
#include <asm/platform_sst_audio.h>
#include <sound/pcm.h>
#include <sound/pcm_params.h>
#include <sound/soc.h>
#include <sound/jack.h>
#include <sound/soc-acpi.h>
#include "../../codecs/rt5651.h"
#include "../atom/sst-atom-controls.h"
enum
{
BYT_RT5651_DMIC_MAP
,
BYT_RT5651_IN1_MAP
,
BYT_RT5651_IN2_MAP
,
};
#define BYT_RT5651_MAP(quirk) ((quirk) & GENMASK(7, 0))
#define BYT_RT5651_DMIC_EN BIT(16)
#define BYT_RT5651_MCLK_EN BIT(17)
#define BYT_RT5651_MCLK_25MHZ BIT(18)
struct
byt_rt5651_private
{
struct
clk
*
mclk
;
struct
snd_soc_jack
jack
;
};
static
unsigned
long
byt_rt5651_quirk
=
BYT_RT5651_DMIC_MAP
|
BYT_RT5651_DMIC_EN
|
BYT_RT5651_MCLK_EN
;
static
void
log_quirks
(
struct
device
*
dev
)
{
if
(
BYT_RT5651_MAP
(
byt_rt5651_quirk
)
==
BYT_RT5651_DMIC_MAP
)
dev_info
(
dev
,
"quirk DMIC_MAP enabled"
);
if
(
BYT_RT5651_MAP
(
byt_rt5651_quirk
)
==
BYT_RT5651_IN1_MAP
)
dev_info
(
dev
,
"quirk IN1_MAP enabled"
);
if
(
BYT_RT5651_MAP
(
byt_rt5651_quirk
)
==
BYT_RT5651_IN2_MAP
)
dev_info
(
dev
,
"quirk IN2_MAP enabled"
);
if
(
byt_rt5651_quirk
&
BYT_RT5651_DMIC_EN
)
dev_info
(
dev
,
"quirk DMIC enabled"
);
if
(
byt_rt5651_quirk
&
BYT_RT5651_MCLK_EN
)
dev_info
(
dev
,
"quirk MCLK_EN enabled"
);
if
(
byt_rt5651_quirk
&
BYT_RT5651_MCLK_25MHZ
)
dev_info
(
dev
,
"quirk MCLK_25MHZ enabled"
);
}
#define BYT_CODEC_DAI1 "rt5651-aif1"
static
int
platform_clock_control
(
struct
snd_soc_dapm_widget
*
w
,
struct
snd_kcontrol
*
k
,
int
event
)
{
struct
snd_soc_dapm_context
*
dapm
=
w
->
dapm
;
struct
snd_soc_card
*
card
=
dapm
->
card
;
struct
snd_soc_dai
*
codec_dai
;
struct
byt_rt5651_private
*
priv
=
snd_soc_card_get_drvdata
(
card
);
int
ret
;
codec_dai
=
snd_soc_card_get_codec_dai
(
card
,
BYT_CODEC_DAI1
);
if
(
!
codec_dai
)
{
dev_err
(
card
->
dev
,
"Codec dai not found; Unable to set platform clock
\n
"
);
return
-
EIO
;
}
if
(
SND_SOC_DAPM_EVENT_ON
(
event
))
{
if
(
byt_rt5651_quirk
&
BYT_RT5651_MCLK_EN
)
{
ret
=
clk_prepare_enable
(
priv
->
mclk
);
if
(
ret
<
0
)
{
dev_err
(
card
->
dev
,
"could not configure MCLK state"
);
return
ret
;
}
}
ret
=
snd_soc_dai_set_sysclk
(
codec_dai
,
RT5651_SCLK_S_PLL1
,
48000
*
512
,
SND_SOC_CLOCK_IN
);
}
else
{
/*
* Set codec clock source to internal clock before
* turning off the platform clock. Codec needs clock
* for Jack detection and button press
*/
ret
=
snd_soc_dai_set_sysclk
(
codec_dai
,
RT5651_SCLK_S_RCCLK
,
48000
*
512
,
SND_SOC_CLOCK_IN
);
if
(
!
ret
)
if
(
byt_rt5651_quirk
&
BYT_RT5651_MCLK_EN
)
clk_disable_unprepare
(
priv
->
mclk
);
}
if
(
ret
<
0
)
{
dev_err
(
card
->
dev
,
"can't set codec sysclk: %d
\n
"
,
ret
);
return
ret
;
}
return
0
;
}
static
const
struct
snd_soc_dapm_widget
byt_rt5651_widgets
[]
=
{
SND_SOC_DAPM_HP
(
"Headphone"
,
NULL
),
SND_SOC_DAPM_MIC
(
"Headset Mic"
,
NULL
),
SND_SOC_DAPM_MIC
(
"Internal Mic"
,
NULL
),
SND_SOC_DAPM_SPK
(
"Speaker"
,
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
),
};
static
const
struct
snd_soc_dapm_route
byt_rt5651_audio_map
[]
=
{
{
"Headphone"
,
NULL
,
"Platform Clock"
},
{
"Headset Mic"
,
NULL
,
"Platform Clock"
},
{
"Internal Mic"
,
NULL
,
"Platform Clock"
},
{
"Speaker"
,
NULL
,
"Platform Clock"
},
{
"AIF1 Playback"
,
NULL
,
"ssp2 Tx"
},
{
"ssp2 Tx"
,
NULL
,
"codec_out0"
},
{
"ssp2 Tx"
,
NULL
,
"codec_out1"
},
...
...
@@ -47,38 +147,30 @@ static const struct snd_soc_dapm_route byt_rt5651_audio_map[] = {
{
"ssp2 Rx"
,
NULL
,
"AIF1 Capture"
},
{
"Headset Mic"
,
NULL
,
"micbias1"
},
/* lowercase for rt5651 */
{
"IN2P"
,
NULL
,
"Headset Mic"
},
{
"Headphone"
,
NULL
,
"HPOL"
},
{
"Headphone"
,
NULL
,
"HPOR"
},
{
"Speaker"
,
NULL
,
"LOUTL"
},
{
"Speaker"
,
NULL
,
"LOUTR"
},
};
static
const
struct
snd_soc_dapm_route
byt_rt5651_intmic_dmic1_map
[]
=
{
{
"DMIC1"
,
NULL
,
"Internal Mic"
},
};
static
const
struct
snd_soc_dapm_route
byt_rt5651_intmic_dmic2_map
[]
=
{
{
"DMIC2"
,
NULL
,
"Internal Mic"
},
static
const
struct
snd_soc_dapm_route
byt_rt5651_intmic_dmic_map
[]
=
{
{
"IN2P"
,
NULL
,
"Headset Mic"
},
{
"DMIC L1"
,
NULL
,
"Internal Mic"
},
{
"DMIC R1"
,
NULL
,
"Internal Mic"
},
};
static
const
struct
snd_soc_dapm_route
byt_rt5651_intmic_in1_map
[]
=
{
{
"Internal Mic"
,
NULL
,
"micbias1"
},
{
"IN2P"
,
NULL
,
"Headset Mic"
},
{
"IN1P"
,
NULL
,
"Internal Mic"
},
};
enum
{
BYT_RT5651_DMIC1_MAP
,
BYT_RT5651_DMIC2_MAP
,
BYT_RT5651_IN1_MAP
,
static
const
struct
snd_soc_dapm_route
byt_rt5651_intmic_in2_map
[]
=
{
{
"Internal Mic"
,
NULL
,
"micbias1"
}
,
{
"IN1P"
,
NULL
,
"Headset Mic"
}
,
{
"IN2P"
,
NULL
,
"Internal Mic"
}
,
};
#define BYT_RT5651_MAP(quirk) ((quirk) & 0xff)
#define BYT_RT5651_DMIC_EN BIT(16)
static
unsigned
long
byt_rt5651_quirk
=
BYT_RT5651_DMIC1_MAP
|
BYT_RT5651_DMIC_EN
;
static
const
struct
snd_kcontrol_new
byt_rt5651_controls
[]
=
{
SOC_DAPM_PIN_SWITCH
(
"Headphone"
),
SOC_DAPM_PIN_SWITCH
(
"Headset Mic"
),
...
...
@@ -86,6 +178,17 @@ static const struct snd_kcontrol_new byt_rt5651_controls[] = {
SOC_DAPM_PIN_SWITCH
(
"Speaker"
),
};
static
struct
snd_soc_jack_pin
bytcr_jack_pins
[]
=
{
{
.
pin
=
"Headphone"
,
.
mask
=
SND_JACK_HEADPHONE
,
},
{
.
pin
=
"Headset Mic"
,
.
mask
=
SND_JACK_MICROPHONE
,
},
};
static
int
byt_rt5651_aif1_hw_params
(
struct
snd_pcm_substream
*
substream
,
struct
snd_pcm_hw_params
*
params
)
{
...
...
@@ -103,9 +206,26 @@ static int byt_rt5651_aif1_hw_params(struct snd_pcm_substream *substream,
return
ret
;
}
ret
=
snd_soc_dai_set_pll
(
codec_dai
,
0
,
RT5651_PLL1_S_BCLK1
,
params_rate
(
params
)
*
50
,
params_rate
(
params
)
*
512
);
if
(
!
(
byt_rt5651_quirk
&
BYT_RT5651_MCLK_EN
))
{
/* 2x25 bit slots on SSP2 */
ret
=
snd_soc_dai_set_pll
(
codec_dai
,
0
,
RT5651_PLL1_S_BCLK1
,
params_rate
(
params
)
*
50
,
params_rate
(
params
)
*
512
);
}
else
{
if
(
byt_rt5651_quirk
&
BYT_RT5651_MCLK_25MHZ
)
{
ret
=
snd_soc_dai_set_pll
(
codec_dai
,
0
,
RT5651_PLL1_S_MCLK
,
25000000
,
params_rate
(
params
)
*
512
);
}
else
{
ret
=
snd_soc_dai_set_pll
(
codec_dai
,
0
,
RT5651_PLL1_S_MCLK
,
19200000
,
params_rate
(
params
)
*
512
);
}
}
if
(
ret
<
0
)
{
dev_err
(
rtd
->
dev
,
"can't set codec pll: %d
\n
"
,
ret
);
return
ret
;
...
...
@@ -114,33 +234,60 @@ static int byt_rt5651_aif1_hw_params(struct snd_pcm_substream *substream,
return
0
;
}
static
int
byt_rt5651_quirk_cb
(
const
struct
dmi_system_id
*
id
)
{
byt_rt5651_quirk
=
(
unsigned
long
)
id
->
driver_data
;
return
1
;
}
static
const
struct
dmi_system_id
byt_rt5651_quirk_table
[]
=
{
{
.
callback
=
byt_rt5651_quirk_cb
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"Circuitco"
),
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"Minnowboard Max B3 PLATFORM"
),
},
.
driver_data
=
(
void
*
)(
BYT_RT5651_DMIC_MAP
|
BYT_RT5651_DMIC_EN
),
},
{
.
callback
=
byt_rt5651_quirk_cb
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"KIANO"
),
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"KIANO SlimNote 14.2"
),
},
.
driver_data
=
(
void
*
)(
BYT_RT5651_IN2_MAP
),
},
{}
};
static
int
byt_rt5651_init
(
struct
snd_soc_pcm_runtime
*
runtime
)
{
int
ret
;
struct
snd_soc_card
*
card
=
runtime
->
card
;
struct
snd_soc_codec
*
codec
=
runtime
->
codec
;
struct
byt_rt5651_private
*
priv
=
snd_soc_card_get_drvdata
(
card
);
const
struct
snd_soc_dapm_route
*
custom_map
;
int
num_routes
;
int
ret
;
card
->
dapm
.
idle_bias_off
=
true
;
dmi_check_system
(
byt_rt5651_quirk_table
);
switch
(
BYT_RT5651_MAP
(
byt_rt5651_quirk
))
{
case
BYT_RT5651_IN1_MAP
:
custom_map
=
byt_rt5651_intmic_in1_map
;
num_routes
=
ARRAY_SIZE
(
byt_rt5651_intmic_in1_map
);
break
;
case
BYT_RT5651_
DMIC
2_MAP
:
custom_map
=
byt_rt5651_intmic_
dmic
2_map
;
num_routes
=
ARRAY_SIZE
(
byt_rt5651_intmic_
dmic
2_map
);
case
BYT_RT5651_
IN
2_MAP
:
custom_map
=
byt_rt5651_intmic_
in
2_map
;
num_routes
=
ARRAY_SIZE
(
byt_rt5651_intmic_
in
2_map
);
break
;
default:
custom_map
=
byt_rt5651_intmic_dmic
1
_map
;
num_routes
=
ARRAY_SIZE
(
byt_rt5651_intmic_dmic
1
_map
);
custom_map
=
byt_rt5651_intmic_dmic_map
;
num_routes
=
ARRAY_SIZE
(
byt_rt5651_intmic_dmic_map
);
}
ret
=
snd_soc_dapm_add_routes
(
&
card
->
dapm
,
custom_map
,
num_routes
);
if
(
ret
)
return
ret
;
ret
=
snd_soc_add_card_controls
(
card
,
byt_rt5651_controls
,
ARRAY_SIZE
(
byt_rt5651_controls
));
...
...
@@ -151,6 +298,40 @@ static int byt_rt5651_init(struct snd_soc_pcm_runtime *runtime)
snd_soc_dapm_ignore_suspend
(
&
card
->
dapm
,
"Headphone"
);
snd_soc_dapm_ignore_suspend
(
&
card
->
dapm
,
"Speaker"
);
if
(
byt_rt5651_quirk
&
BYT_RT5651_MCLK_EN
)
{
/*
* The firmware might enable the clock at
* boot (this information may or may not
* be reflected in the enable clock register).
* To change the rate we must disable the clock
* first to cover these cases. Due to common
* clock framework restrictions that do not allow
* to disable a clock that has not been enabled,
* we need to enable the clock first.
*/
ret
=
clk_prepare_enable
(
priv
->
mclk
);
if
(
!
ret
)
clk_disable_unprepare
(
priv
->
mclk
);
if
(
byt_rt5651_quirk
&
BYT_RT5651_MCLK_25MHZ
)
ret
=
clk_set_rate
(
priv
->
mclk
,
25000000
);
else
ret
=
clk_set_rate
(
priv
->
mclk
,
19200000
);
if
(
ret
)
dev_err
(
card
->
dev
,
"unable to set MCLK rate
\n
"
);
}
ret
=
snd_soc_card_jack_new
(
runtime
->
card
,
"Headset"
,
SND_JACK_HEADSET
,
&
priv
->
jack
,
bytcr_jack_pins
,
ARRAY_SIZE
(
bytcr_jack_pins
));
if
(
ret
)
{
dev_err
(
runtime
->
dev
,
"Headset jack creation failed %d
\n
"
,
ret
);
return
ret
;
}
rt5651_set_jack_detect
(
codec
,
&
priv
->
jack
);
return
ret
;
}
...
...
@@ -253,19 +434,11 @@ static struct snd_soc_dai_link byt_rt5651_dais[] = {
.
dpcm_playback
=
1
,
.
ops
=
&
byt_rt5651_aif1_ops
,
},
[
MERR_DPCM_COMPR
]
=
{
.
name
=
"Compressed Port"
,
.
stream_name
=
"Compress"
,
.
cpu_dai_name
=
"compress-cpu-dai"
,
.
codec_dai_name
=
"snd-soc-dummy-dai"
,
.
codec_name
=
"snd-soc-dummy"
,
.
platform_name
=
"sst-mfld-platform"
,
},
/* CODEC<->CODEC link */
/* back ends */
{
.
name
=
"SSP2-Codec"
,
.
id
=
1
,
.
id
=
0
,
.
cpu_dai_name
=
"ssp2-port"
,
.
platform_name
=
"sst-mfld-platform"
,
.
no_pcm
=
1
,
...
...
@@ -296,13 +469,65 @@ static struct snd_soc_card byt_rt5651_card = {
.
fully_routed
=
true
,
};
static
char
byt_rt5651_codec_name
[
16
];
/* i2c-<HID>:00 with HID being 8 chars */
static
int
snd_byt_rt5651_mc_probe
(
struct
platform_device
*
pdev
)
{
struct
byt_rt5651_private
*
priv
;
struct
snd_soc_acpi_mach
*
mach
;
const
char
*
i2c_name
=
NULL
;
int
ret_val
=
0
;
int
dai_index
=
0
;
int
i
;
priv
=
devm_kzalloc
(
&
pdev
->
dev
,
sizeof
(
*
priv
),
GFP_ATOMIC
);
if
(
!
priv
)
return
-
ENOMEM
;
/* register the soc card */
byt_rt5651_card
.
dev
=
&
pdev
->
dev
;
mach
=
byt_rt5651_card
.
dev
->
platform_data
;
snd_soc_card_set_drvdata
(
&
byt_rt5651_card
,
priv
);
/* fix index of codec dai */
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
byt_rt5651_dais
);
i
++
)
{
if
(
!
strcmp
(
byt_rt5651_dais
[
i
].
codec_name
,
"i2c-10EC5651:00"
))
{
dai_index
=
i
;
break
;
}
}
/* fixup codec name based on HID */
i2c_name
=
snd_soc_acpi_find_name_from_hid
(
mach
->
id
);
if
(
i2c_name
)
{
snprintf
(
byt_rt5651_codec_name
,
sizeof
(
byt_rt5651_codec_name
),
"%s%s"
,
"i2c-"
,
i2c_name
);
byt_rt5651_dais
[
dai_index
].
codec_name
=
byt_rt5651_codec_name
;
}
/* check quirks before creating card */
dmi_check_system
(
byt_rt5651_quirk_table
);
log_quirks
(
&
pdev
->
dev
);
if
(
byt_rt5651_quirk
&
BYT_RT5651_MCLK_EN
)
{
priv
->
mclk
=
devm_clk_get
(
&
pdev
->
dev
,
"pmc_plt_clk_3"
);
if
(
IS_ERR
(
priv
->
mclk
))
{
dev_err
(
&
pdev
->
dev
,
"Failed to get MCLK from pmc_plt_clk_3: %ld
\n
"
,
PTR_ERR
(
priv
->
mclk
));
/*
* Fall back to bit clock usage for -ENOENT (clock not
* available likely due to missing dependencies), bail
* for all other errors, including -EPROBE_DEFER
*/
if
(
ret_val
!=
-
ENOENT
)
return
ret_val
;
byt_rt5651_quirk
&=
~
BYT_RT5651_MCLK_EN
;
}
}
ret_val
=
devm_snd_soc_register_card
(
&
pdev
->
dev
,
&
byt_rt5651_card
);
if
(
ret_val
)
{
...
...
sound/soc/intel/boards/cht_bsw_max98090_ti.c
View file @
c44ff31a
...
...
@@ -23,6 +23,7 @@
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <linux/acpi.h>
#include <linux/clk.h>
#include <sound/pcm.h>
#include <sound/pcm_params.h>
#include <sound/soc.h>
...
...
@@ -35,15 +36,48 @@
#define CHT_CODEC_DAI "HiFi"
struct
cht_mc_private
{
struct
clk
*
mclk
;
struct
snd_soc_jack
jack
;
bool
ts3a227e_present
;
};
static
int
platform_clock_control
(
struct
snd_soc_dapm_widget
*
w
,
struct
snd_kcontrol
*
k
,
int
event
)
{
struct
snd_soc_dapm_context
*
dapm
=
w
->
dapm
;
struct
snd_soc_card
*
card
=
dapm
->
card
;
struct
snd_soc_dai
*
codec_dai
;
struct
cht_mc_private
*
ctx
=
snd_soc_card_get_drvdata
(
card
);
int
ret
;
codec_dai
=
snd_soc_card_get_codec_dai
(
card
,
CHT_CODEC_DAI
);
if
(
!
codec_dai
)
{
dev_err
(
card
->
dev
,
"Codec dai not found; Unable to set platform clock
\n
"
);
return
-
EIO
;
}
if
(
SND_SOC_DAPM_EVENT_ON
(
event
))
{
ret
=
clk_prepare_enable
(
ctx
->
mclk
);
if
(
ret
<
0
)
{
dev_err
(
card
->
dev
,
"could not configure MCLK state"
);
return
ret
;
}
}
else
{
clk_disable_unprepare
(
ctx
->
mclk
);
}
return
0
;
}
static
const
struct
snd_soc_dapm_widget
cht_dapm_widgets
[]
=
{
SND_SOC_DAPM_HP
(
"Headphone"
,
NULL
),
SND_SOC_DAPM_MIC
(
"Headset Mic"
,
NULL
),
SND_SOC_DAPM_MIC
(
"Int Mic"
,
NULL
),
SND_SOC_DAPM_SPK
(
"Ext Spk"
,
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
),
};
static
const
struct
snd_soc_dapm_route
cht_audio_map
[]
=
{
...
...
@@ -60,6 +94,10 @@ static const struct snd_soc_dapm_route cht_audio_map[] = {
{
"codec_in0"
,
NULL
,
"ssp2 Rx"
},
{
"codec_in1"
,
NULL
,
"ssp2 Rx"
},
{
"ssp2 Rx"
,
NULL
,
"HiFi Capture"
},
{
"Headphone"
,
NULL
,
"Platform Clock"
},
{
"Headset Mic"
,
NULL
,
"Platform Clock"
},
{
"Int Mic"
,
NULL
,
"Platform Clock"
},
{
"Ext Spk"
,
NULL
,
"Platform Clock"
},
};
static
const
struct
snd_kcontrol_new
cht_mc_controls
[]
=
{
...
...
@@ -109,6 +147,40 @@ static struct notifier_block cht_jack_nb = {
.
notifier_call
=
cht_ti_jack_event
,
};
static
struct
snd_soc_jack_pin
hs_jack_pins
[]
=
{
{
.
pin
=
"Headphone"
,
.
mask
=
SND_JACK_HEADPHONE
,
},
{
.
pin
=
"Headset Mic"
,
.
mask
=
SND_JACK_MICROPHONE
,
},
};
static
struct
snd_soc_jack_gpio
hs_jack_gpios
[]
=
{
{
.
name
=
"hp"
,
.
report
=
SND_JACK_HEADPHONE
|
SND_JACK_LINEOUT
,
.
debounce_time
=
200
,
},
{
.
name
=
"mic"
,
.
invert
=
1
,
.
report
=
SND_JACK_MICROPHONE
,
.
debounce_time
=
200
,
},
};
static
const
struct
acpi_gpio_params
hp_gpios
=
{
0
,
0
,
false
};
static
const
struct
acpi_gpio_params
mic_gpios
=
{
1
,
0
,
false
};
static
const
struct
acpi_gpio_mapping
acpi_max98090_gpios
[]
=
{
{
"hp-gpios"
,
&
hp_gpios
,
1
},
{
"mic-gpios"
,
&
mic_gpios
,
1
},
{},
};
static
int
cht_codec_init
(
struct
snd_soc_pcm_runtime
*
runtime
)
{
int
ret
;
...
...
@@ -116,30 +188,55 @@ static int cht_codec_init(struct snd_soc_pcm_runtime *runtime)
struct
cht_mc_private
*
ctx
=
snd_soc_card_get_drvdata
(
runtime
->
card
);
struct
snd_soc_jack
*
jack
=
&
ctx
->
jack
;
/**
* TI supports 4 butons headset detection
* KEY_MEDIA
* KEY_VOICECOMMAND
* KEY_VOLUMEUP
* KEY_VOLUMEDOWN
*/
if
(
ctx
->
ts3a227e_present
)
jack_type
=
SND_JACK_HEADPHONE
|
SND_JACK_MICROPHONE
|
SND_JACK_BTN_0
|
SND_JACK_BTN_1
|
SND_JACK_BTN_2
|
SND_JACK_BTN_3
;
else
jack_type
=
SND_JACK_HEADPHONE
|
SND_JACK_MICROPHONE
;
if
(
ctx
->
ts3a227e_present
)
{
/*
* The jack has already been created in the
* cht_max98090_headset_init() function.
*/
snd_soc_jack_notifier_register
(
jack
,
&
cht_jack_nb
);
return
0
;
}
ret
=
snd_soc_card_jack_new
(
runtime
->
card
,
"Headset Jack"
,
jack_type
,
jack
,
NULL
,
0
);
jack_type
=
SND_JACK_HEADPHONE
|
SND_JACK_MICROPHONE
;
ret
=
snd_soc_card_jack_new
(
runtime
->
card
,
"Headset Jack"
,
jack_type
,
jack
,
hs_jack_pins
,
ARRAY_SIZE
(
hs_jack_pins
));
if
(
ret
)
{
dev_err
(
runtime
->
dev
,
"Headset Jack creation failed %d
\n
"
,
ret
);
return
ret
;
}
if
(
ctx
->
ts3a227e_present
)
snd_soc_jack_notifier_register
(
jack
,
&
cht_jack_nb
);
ret
=
snd_soc_jack_add_gpiods
(
runtime
->
card
->
dev
->
parent
,
jack
,
ARRAY_SIZE
(
hs_jack_gpios
),
hs_jack_gpios
);
if
(
ret
)
{
/*
* flag error but don't bail if jack detect is broken
* due to platform issues or bad BIOS/configuration
*/
dev_err
(
runtime
->
dev
,
"jack detection gpios not added, error %d
\n
"
,
ret
);
}
/*
* The firmware might enable the clock at
* boot (this information may or may not
* be reflected in the enable clock register).
* To change the rate we must disable the clock
* first to cover these cases. Due to common
* clock framework restrictions that do not allow
* to disable a clock that has not been enabled,
* we need to enable the clock first.
*/
ret
=
clk_prepare_enable
(
ctx
->
mclk
);
if
(
!
ret
)
clk_disable_unprepare
(
ctx
->
mclk
);
ret
=
clk_set_rate
(
ctx
->
mclk
,
CHT_PLAT_CLK_3_HZ
);
if
(
ret
)
dev_err
(
runtime
->
dev
,
"unable to set MCLK rate
\n
"
);
return
ret
;
}
...
...
@@ -188,8 +285,29 @@ static int cht_max98090_headset_init(struct snd_soc_component *component)
{
struct
snd_soc_card
*
card
=
component
->
card
;
struct
cht_mc_private
*
ctx
=
snd_soc_card_get_drvdata
(
card
);
struct
snd_soc_jack
*
jack
=
&
ctx
->
jack
;
int
jack_type
;
int
ret
;
return
ts3a227e_enable_jack_detect
(
component
,
&
ctx
->
jack
);
/*
* TI supports 4 butons headset detection
* KEY_MEDIA
* KEY_VOICECOMMAND
* KEY_VOLUMEUP
* KEY_VOLUMEDOWN
*/
jack_type
=
SND_JACK_HEADPHONE
|
SND_JACK_MICROPHONE
|
SND_JACK_BTN_0
|
SND_JACK_BTN_1
|
SND_JACK_BTN_2
|
SND_JACK_BTN_3
;
ret
=
snd_soc_card_jack_new
(
card
,
"Headset Jack"
,
jack_type
,
jack
,
NULL
,
0
);
if
(
ret
)
{
dev_err
(
card
->
dev
,
"Headset Jack creation failed %d
\n
"
,
ret
);
return
ret
;
}
return
ts3a227e_enable_jack_detect
(
component
,
jack
);
}
static
const
struct
snd_soc_ops
cht_aif1_ops
=
{
...
...
@@ -232,18 +350,10 @@ static struct snd_soc_dai_link cht_dailink[] = {
.
dpcm_playback
=
1
,
.
ops
=
&
cht_aif1_ops
,
},
[
MERR_DPCM_COMPR
]
=
{
.
name
=
"Compressed Port"
,
.
stream_name
=
"Compress"
,
.
cpu_dai_name
=
"compress-cpu-dai"
,
.
codec_dai_name
=
"snd-soc-dummy-dai"
,
.
codec_name
=
"snd-soc-dummy"
,
.
platform_name
=
"sst-mfld-platform"
,
},
/* back ends */
{
.
name
=
"SSP2-Codec"
,
.
id
=
1
,
.
id
=
0
,
.
cpu_dai_name
=
"ssp2-port"
,
.
platform_name
=
"sst-mfld-platform"
,
.
no_pcm
=
1
,
...
...
@@ -277,6 +387,7 @@ static struct snd_soc_card snd_soc_card_cht = {
static
int
snd_cht_mc_probe
(
struct
platform_device
*
pdev
)
{
struct
device
*
dev
=
&
pdev
->
dev
;
int
ret_val
=
0
;
struct
cht_mc_private
*
drv
;
...
...
@@ -289,11 +400,25 @@ static int snd_cht_mc_probe(struct platform_device *pdev)
/* no need probe TI jack detection chip */
snd_soc_card_cht
.
aux_dev
=
NULL
;
snd_soc_card_cht
.
num_aux_devs
=
0
;
ret_val
=
devm_acpi_dev_add_driver_gpios
(
dev
->
parent
,
acpi_max98090_gpios
);
if
(
ret_val
)
dev_dbg
(
dev
,
"Unable to add GPIO mapping table
\n
"
);
}
/* register the soc card */
snd_soc_card_cht
.
dev
=
&
pdev
->
dev
;
snd_soc_card_set_drvdata
(
&
snd_soc_card_cht
,
drv
);
drv
->
mclk
=
devm_clk_get
(
&
pdev
->
dev
,
"pmc_plt_clk_3"
);
if
(
IS_ERR
(
drv
->
mclk
))
{
dev_err
(
&
pdev
->
dev
,
"Failed to get MCLK from pmc_plt_clk_3: %ld
\n
"
,
PTR_ERR
(
drv
->
mclk
));
return
PTR_ERR
(
drv
->
mclk
);
}
ret_val
=
devm_snd_soc_register_card
(
&
pdev
->
dev
,
&
snd_soc_card_cht
);
if
(
ret_val
)
{
dev_err
(
&
pdev
->
dev
,
...
...
sound/soc/intel/boards/cht_bsw_rt5645.c
View file @
c44ff31a
...
...
@@ -21,20 +21,20 @@
*/
#include <linux/module.h>
#include <linux/acpi.h>
#include <linux/platform_device.h>
#include <linux/acpi.h>
#include <linux/clk.h>
#include <linux/dmi.h>
#include <linux/slab.h>
#include <asm/cpu_device_id.h>
#include <asm/platform_sst_audio.h>
#include <linux/clk.h>
#include <sound/pcm.h>
#include <sound/pcm_params.h>
#include <sound/soc.h>
#include <sound/jack.h>
#include <sound/soc-acpi.h>
#include "../../codecs/rt5645.h"
#include "../atom/sst-atom-controls.h"
#include "../common/sst-acpi.h"
#define CHT_PLAT_CLK_3_HZ 19200000
#define CHT_CODEC_DAI1 "rt5645-aif1"
...
...
@@ -53,7 +53,7 @@ struct cht_mc_private {
struct
clk
*
mclk
;
};
#define CHT_RT5645_MAP(quirk) ((quirk) &
0xff
)
#define CHT_RT5645_MAP(quirk) ((quirk) &
GENMASK(7, 0)
)
#define CHT_RT5645_SSP2_AIF2 BIT(16)
/* default is using AIF1 */
#define CHT_RT5645_SSP0_AIF1 BIT(17)
#define CHT_RT5645_SSP0_AIF2 BIT(18)
...
...
@@ -70,21 +70,6 @@ static void log_quirks(struct device *dev)
dev_info
(
dev
,
"quirk SSP0_AIF2 enabled"
);
}
static
inline
struct
snd_soc_dai
*
cht_get_codec_dai
(
struct
snd_soc_card
*
card
)
{
struct
snd_soc_pcm_runtime
*
rtd
;
list_for_each_entry
(
rtd
,
&
card
->
rtd_list
,
list
)
{
if
(
!
strncmp
(
rtd
->
codec_dai
->
name
,
CHT_CODEC_DAI1
,
strlen
(
CHT_CODEC_DAI1
)))
return
rtd
->
codec_dai
;
if
(
!
strncmp
(
rtd
->
codec_dai
->
name
,
CHT_CODEC_DAI2
,
strlen
(
CHT_CODEC_DAI2
)))
return
rtd
->
codec_dai
;
}
return
NULL
;
}
static
int
platform_clock_control
(
struct
snd_soc_dapm_widget
*
w
,
struct
snd_kcontrol
*
k
,
int
event
)
{
...
...
@@ -94,20 +79,21 @@ static int platform_clock_control(struct snd_soc_dapm_widget *w,
struct
cht_mc_private
*
ctx
=
snd_soc_card_get_drvdata
(
card
);
int
ret
;
codec_dai
=
cht_get_codec_dai
(
card
);
codec_dai
=
snd_soc_card_get_codec_dai
(
card
,
CHT_CODEC_DAI1
);
if
(
!
codec_dai
)
codec_dai
=
snd_soc_card_get_codec_dai
(
card
,
CHT_CODEC_DAI2
);
if
(
!
codec_dai
)
{
dev_err
(
card
->
dev
,
"Codec dai not found; Unable to set platform clock
\n
"
);
return
-
EIO
;
}
if
(
SND_SOC_DAPM_EVENT_ON
(
event
))
{
if
(
ctx
->
mclk
)
{
ret
=
clk_prepare_enable
(
ctx
->
mclk
);
if
(
ret
<
0
)
{
dev_err
(
card
->
dev
,
"could not configure MCLK state"
);
return
ret
;
}
ret
=
clk_prepare_enable
(
ctx
->
mclk
);
if
(
ret
<
0
)
{
dev_err
(
card
->
dev
,
"could not configure MCLK state"
);
return
ret
;
}
}
else
{
/* Set codec sysclk source to its internal clock because codec PLL will
...
...
@@ -122,8 +108,7 @@ static int platform_clock_control(struct snd_soc_dapm_widget *w,
return
ret
;
}
if
(
ctx
->
mclk
)
clk_disable_unprepare
(
ctx
->
mclk
);
clk_disable_unprepare
(
ctx
->
mclk
);
}
return
0
;
...
...
@@ -258,11 +243,11 @@ static const struct dmi_system_id cht_rt5645_quirk_table[] = {
static
int
cht_codec_init
(
struct
snd_soc_pcm_runtime
*
runtime
)
{
int
ret
;
int
jack_type
;
struct
snd_soc_codec
*
codec
=
runtime
->
codec
;
struct
snd_soc_card
*
card
=
runtime
->
card
;
struct
cht_mc_private
*
ctx
=
snd_soc_card_get_drvdata
(
runtime
->
card
);
struct
snd_soc_codec
*
codec
=
runtime
->
codec
;
int
jack_type
;
int
ret
;
if
((
cht_rt5645_quirk
&
CHT_RT5645_SSP2_AIF2
)
||
(
cht_rt5645_quirk
&
CHT_RT5645_SSP0_AIF2
))
{
...
...
@@ -320,26 +305,26 @@ static int cht_codec_init(struct snd_soc_pcm_runtime *runtime)
rt5645_set_jack_detect
(
codec
,
&
ctx
->
jack
,
&
ctx
->
jack
,
&
ctx
->
jack
);
if
(
ctx
->
mclk
)
{
/*
* The firmware might enable the clock at
* boot (this information may or may not
* be reflected in the enable clock register).
* To change the rate we must disable the clock
* first to cover these cases. Due to common
* clock framework restrictions that do not allow
* to disable a clock that has not been enabled,
* we need to enable the clock first.
*/
ret
=
clk_prepare_enable
(
ctx
->
mclk
);
if
(
!
ret
)
clk_disable_unprepare
(
ctx
->
mclk
);
ret
=
clk_set_rate
(
ctx
->
mclk
,
CHT_PLAT_CLK_3_HZ
);
/*
* The firmware might enable the clock at
* boot (this information may or may not
* be reflected in the enable clock register).
* To change the rate we must disable the clock
* first to cover these cases. Due to common
* clock framework restrictions that do not allow
* to disable a clock that has not been enabled,
* we need to enable the clock first.
*/
ret
=
clk_prepare_enable
(
ctx
->
mclk
);
if
(
!
ret
)
clk_disable_unprepare
(
ctx
->
mclk
);
ret
=
clk_set_rate
(
ctx
->
mclk
,
CHT_PLAT_CLK_3_HZ
);
if
(
ret
)
dev_err
(
runtime
->
dev
,
"unable to set MCLK rate
\n
"
);
if
(
ret
)
dev_err
(
runtime
->
dev
,
"unable to set MCLK rate
\n
"
);
}
return
ret
;
}
...
...
@@ -460,19 +445,11 @@ static struct snd_soc_dai_link cht_dailink[] = {
.
dpcm_playback
=
1
,
.
ops
=
&
cht_aif1_ops
,
},
[
MERR_DPCM_COMPR
]
=
{
.
name
=
"Compressed Port"
,
.
stream_name
=
"Compress"
,
.
cpu_dai_name
=
"compress-cpu-dai"
,
.
codec_dai_name
=
"snd-soc-dummy-dai"
,
.
codec_name
=
"snd-soc-dummy"
,
.
platform_name
=
"sst-mfld-platform"
,
},
/* CODEC<->CODEC link */
/* back ends */
{
.
name
=
"SSP2-Codec"
,
.
id
=
1
,
.
id
=
0
,
.
cpu_dai_name
=
"ssp2-port"
,
.
platform_name
=
"sst-mfld-platform"
,
.
no_pcm
=
1
,
...
...
@@ -545,15 +522,15 @@ struct acpi_chan_package { /* ACPICA seems to require 64 bit integers */
static
int
snd_cht_mc_probe
(
struct
platform_device
*
pdev
)
{
int
ret_val
=
0
;
int
i
;
struct
cht_mc_private
*
drv
;
struct
snd_soc_card
*
card
=
snd_soc_cards
[
0
].
soc_card
;
struct
sst_acpi_mach
*
mach
;
struct
snd_soc_acpi_mach
*
mach
;
struct
cht_mc_private
*
drv
;
const
char
*
i2c_name
=
NULL
;
int
dai_index
=
0
;
bool
found
=
false
;
bool
is_bytcr
=
false
;
int
dai_index
=
0
;
int
ret_val
=
0
;
int
i
;
drv
=
devm_kzalloc
(
&
pdev
->
dev
,
sizeof
(
*
drv
),
GFP_ATOMIC
);
if
(
!
drv
)
...
...
@@ -589,8 +566,8 @@ static int snd_cht_mc_probe(struct platform_device *pdev)
}
/* fixup codec name based on HID */
i2c_name
=
s
st
_acpi_find_name_from_hid
(
mach
->
id
);
if
(
i2c_name
!=
NULL
)
{
i2c_name
=
s
nd_soc
_acpi_find_name_from_hid
(
mach
->
id
);
if
(
i2c_name
)
{
snprintf
(
cht_rt5645_codec_name
,
sizeof
(
cht_rt5645_codec_name
),
"%s%s"
,
"i2c-"
,
i2c_name
);
cht_dailink
[
dai_index
].
codec_name
=
cht_rt5645_codec_name
;
...
...
@@ -622,7 +599,7 @@ static int snd_cht_mc_probe(struct platform_device *pdev)
/* format specified: 2 64-bit integers */
struct
acpi_buffer
format
=
{
sizeof
(
"NN"
),
"NN"
};
struct
acpi_buffer
state
=
{
0
,
NULL
};
struct
s
st
_acpi_package_context
pkg_ctx
;
struct
s
nd_soc
_acpi_package_context
pkg_ctx
;
bool
pkg_found
=
false
;
state
.
length
=
sizeof
(
chan_package
);
...
...
@@ -634,7 +611,8 @@ static int snd_cht_mc_probe(struct platform_device *pdev)
pkg_ctx
.
state
=
&
state
;
pkg_ctx
.
data_valid
=
false
;
pkg_found
=
sst_acpi_find_package_from_hid
(
mach
->
id
,
&
pkg_ctx
);
pkg_found
=
snd_soc_acpi_find_package_from_hid
(
mach
->
id
,
&
pkg_ctx
);
if
(
pkg_found
)
{
if
(
chan_package
.
aif_value
==
1
)
{
dev_info
(
&
pdev
->
dev
,
"BIOS Routing: AIF1 connected
\n
"
);
...
...
@@ -682,14 +660,12 @@ static int snd_cht_mc_probe(struct platform_device *pdev)
cht_rt5645_cpu_dai_name
;
}
if
(
is_valleyview
())
{
drv
->
mclk
=
devm_clk_get
(
&
pdev
->
dev
,
"pmc_plt_clk_3"
);
if
(
IS_ERR
(
drv
->
mclk
))
{
dev_err
(
&
pdev
->
dev
,
"Failed to get MCLK from pmc_plt_clk_3: %ld
\n
"
,
PTR_ERR
(
drv
->
mclk
));
return
PTR_ERR
(
drv
->
mclk
);
}
drv
->
mclk
=
devm_clk_get
(
&
pdev
->
dev
,
"pmc_plt_clk_3"
);
if
(
IS_ERR
(
drv
->
mclk
))
{
dev_err
(
&
pdev
->
dev
,
"Failed to get MCLK from pmc_plt_clk_3: %ld
\n
"
,
PTR_ERR
(
drv
->
mclk
));
return
PTR_ERR
(
drv
->
mclk
);
}
snd_soc_card_set_drvdata
(
card
,
drv
);
...
...
sound/soc/intel/boards/cht_bsw_rt5672.c
View file @
c44ff31a
...
...
@@ -20,14 +20,14 @@
#include <linux/platform_device.h>
#include <linux/slab.h>
#include <linux/clk.h>
#include <asm/cpu_device_id.h>
#include <sound/pcm.h>
#include <sound/pcm_params.h>
#include <sound/soc.h>
#include <sound/jack.h>
#include <sound/soc-acpi.h>
#include "../../codecs/rt5670.h"
#include "../atom/sst-atom-controls.h"
#include "../common/sst-acpi.h"
/* The platform clock #3 outputs 19.2Mhz clock to codec as I2S MCLK */
#define CHT_PLAT_CLK_3_HZ 19200000
...
...
@@ -51,18 +51,6 @@ static struct snd_soc_jack_pin cht_bsw_headset_pins[] = {
},
};
static
inline
struct
snd_soc_dai
*
cht_get_codec_dai
(
struct
snd_soc_card
*
card
)
{
struct
snd_soc_pcm_runtime
*
rtd
;
list_for_each_entry
(
rtd
,
&
card
->
rtd_list
,
list
)
{
if
(
!
strncmp
(
rtd
->
codec_dai
->
name
,
CHT_CODEC_DAI
,
strlen
(
CHT_CODEC_DAI
)))
return
rtd
->
codec_dai
;
}
return
NULL
;
}
static
int
platform_clock_control
(
struct
snd_soc_dapm_widget
*
w
,
struct
snd_kcontrol
*
k
,
int
event
)
{
...
...
@@ -72,7 +60,7 @@ static int platform_clock_control(struct snd_soc_dapm_widget *w,
struct
cht_mc_private
*
ctx
=
snd_soc_card_get_drvdata
(
card
);
int
ret
;
codec_dai
=
cht_get_codec_dai
(
card
);
codec_dai
=
snd_soc_card_get_codec_dai
(
card
,
CHT_CODEC_DAI
);
if
(
!
codec_dai
)
{
dev_err
(
card
->
dev
,
"Codec dai not found; Unable to set platform clock
\n
"
);
return
-
EIO
;
...
...
@@ -315,20 +303,12 @@ static struct snd_soc_dai_link cht_dailink[] = {
.
dpcm_playback
=
1
,
.
ops
=
&
cht_aif1_ops
,
},
[
MERR_DPCM_COMPR
]
=
{
.
name
=
"Compressed Port"
,
.
stream_name
=
"Compress"
,
.
cpu_dai_name
=
"compress-cpu-dai"
,
.
codec_dai_name
=
"snd-soc-dummy-dai"
,
.
codec_name
=
"snd-soc-dummy"
,
.
platform_name
=
"sst-mfld-platform"
,
},
/* Back End DAI links */
{
/* SSP2 - Codec */
.
name
=
"SSP2-Codec"
,
.
id
=
1
,
.
id
=
0
,
.
cpu_dai_name
=
"ssp2-port"
,
.
platform_name
=
"sst-mfld-platform"
,
.
no_pcm
=
1
,
...
...
@@ -348,9 +328,11 @@ static struct snd_soc_dai_link cht_dailink[] = {
static
int
cht_suspend_pre
(
struct
snd_soc_card
*
card
)
{
struct
snd_soc_component
*
component
;
struct
cht_mc_private
*
ctx
=
snd_soc_card_get_drvdata
(
card
);
list_for_each_entry
(
component
,
&
card
->
component_dev_list
,
card_list
)
{
if
(
!
strcmp
(
component
->
name
,
"i2c-10EC5670:00"
))
{
if
(
!
strncmp
(
component
->
name
,
ctx
->
codec_name
,
sizeof
(
ctx
->
codec_name
)))
{
struct
snd_soc_codec
*
codec
=
snd_soc_component_to_codec
(
component
);
dev_dbg
(
codec
->
dev
,
"disabling jack detect before going to suspend.
\n
"
);
...
...
@@ -364,9 +346,11 @@ static int cht_suspend_pre(struct snd_soc_card *card)
static
int
cht_resume_post
(
struct
snd_soc_card
*
card
)
{
struct
snd_soc_component
*
component
;
struct
cht_mc_private
*
ctx
=
snd_soc_card_get_drvdata
(
card
);
list_for_each_entry
(
component
,
&
card
->
component_dev_list
,
card_list
)
{
if
(
!
strcmp
(
component
->
name
,
"i2c-10EC5670:00"
))
{
if
(
!
strncmp
(
component
->
name
,
ctx
->
codec_name
,
sizeof
(
ctx
->
codec_name
)))
{
struct
snd_soc_codec
*
codec
=
snd_soc_component_to_codec
(
component
);
dev_dbg
(
codec
->
dev
,
"enabling jack detect for resume.
\n
"
);
...
...
@@ -380,7 +364,7 @@ static int cht_resume_post(struct snd_soc_card *card)
/* SoC card */
static
struct
snd_soc_card
snd_soc_card_cht
=
{
.
name
=
"ch
errytrailcraudio
"
,
.
name
=
"ch
t-bsw-rt5672
"
,
.
owner
=
THIS_MODULE
,
.
dai_link
=
cht_dailink
,
.
num_links
=
ARRAY_SIZE
(
cht_dailink
),
...
...
@@ -394,25 +378,13 @@ static struct snd_soc_card snd_soc_card_cht = {
.
resume_post
=
cht_resume_post
,
};
static
bool
is_valleyview
(
void
)
{
static
const
struct
x86_cpu_id
cpu_ids
[]
=
{
{
X86_VENDOR_INTEL
,
6
,
55
},
/* Valleyview, Bay Trail */
{}
};
if
(
!
x86_match_cpu
(
cpu_ids
))
return
false
;
return
true
;
}
#define RT5672_I2C_DEFAULT "i2c-10EC5670:00"
static
int
snd_cht_mc_probe
(
struct
platform_device
*
pdev
)
{
int
ret_val
=
0
;
struct
cht_mc_private
*
drv
;
struct
s
st
_acpi_mach
*
mach
=
pdev
->
dev
.
platform_data
;
struct
s
nd_soc
_acpi_mach
*
mach
=
pdev
->
dev
.
platform_data
;
const
char
*
i2c_name
;
int
i
;
...
...
@@ -424,7 +396,7 @@ static int snd_cht_mc_probe(struct platform_device *pdev)
/* fixup codec name based on HID */
if
(
mach
)
{
i2c_name
=
s
st
_acpi_find_name_from_hid
(
mach
->
id
);
i2c_name
=
s
nd_soc
_acpi_find_name_from_hid
(
mach
->
id
);
if
(
i2c_name
)
{
snprintf
(
drv
->
codec_name
,
sizeof
(
drv
->
codec_name
),
"i2c-%s"
,
i2c_name
);
...
...
@@ -439,14 +411,12 @@ static int snd_cht_mc_probe(struct platform_device *pdev)
}
}
if
(
is_valleyview
())
{
drv
->
mclk
=
devm_clk_get
(
&
pdev
->
dev
,
"pmc_plt_clk_3"
);
if
(
IS_ERR
(
drv
->
mclk
))
{
dev_err
(
&
pdev
->
dev
,
"Failed to get MCLK from pmc_plt_clk_3: %ld
\n
"
,
PTR_ERR
(
drv
->
mclk
));
return
PTR_ERR
(
drv
->
mclk
);
}
drv
->
mclk
=
devm_clk_get
(
&
pdev
->
dev
,
"pmc_plt_clk_3"
);
if
(
IS_ERR
(
drv
->
mclk
))
{
dev_err
(
&
pdev
->
dev
,
"Failed to get MCLK from pmc_plt_clk_3: %ld
\n
"
,
PTR_ERR
(
drv
->
mclk
));
return
PTR_ERR
(
drv
->
mclk
);
}
snd_soc_card_set_drvdata
(
&
snd_soc_card_cht
,
drv
);
...
...
sound/soc/intel/boards/kbl_rt5663_max98927.c
View file @
c44ff31a
...
...
@@ -17,6 +17,7 @@
* GNU General Public License for more details.
*/
#include <linux/input.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <sound/core.h>
...
...
@@ -208,6 +209,7 @@ static int kabylake_rt5663_codec_init(struct snd_soc_pcm_runtime *rtd)
int
ret
;
struct
kbl_rt5663_private
*
ctx
=
snd_soc_card_get_drvdata
(
rtd
->
card
);
struct
snd_soc_codec
*
codec
=
rtd
->
codec
;
struct
snd_soc_jack
*
jack
;
/*
* Headset buttons map to the google Reference headset.
...
...
@@ -221,6 +223,13 @@ static int kabylake_rt5663_codec_init(struct snd_soc_pcm_runtime *rtd)
dev_err
(
rtd
->
dev
,
"Headset Jack creation failed %d
\n
"
,
ret
);
return
ret
;
}
jack
=
&
ctx
->
kabylake_headset
;
snd_jack_set_key
(
jack
->
jack
,
SND_JACK_BTN_0
,
KEY_MEDIA
);
snd_jack_set_key
(
jack
->
jack
,
SND_JACK_BTN_1
,
KEY_VOICECOMMAND
);
snd_jack_set_key
(
jack
->
jack
,
SND_JACK_BTN_2
,
KEY_VOLUMEUP
);
snd_jack_set_key
(
jack
->
jack
,
SND_JACK_BTN_3
,
KEY_VOLUMEDOWN
);
rt5663_set_jack_detect
(
codec
,
&
ctx
->
kabylake_headset
);
return
ret
;
}
...
...
@@ -341,13 +350,28 @@ static int kabylake_ssp_fixup(struct snd_soc_pcm_runtime *rtd,
struct
snd_interval
*
channels
=
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
;
/* The ADSP will convert the FE rate to 48k, stereo */
rate
->
min
=
rate
->
max
=
48000
;
channels
->
min
=
channels
->
max
=
2
;
/* set SSP1 to 24 bit */
snd_mask_none
(
fmt
);
snd_mask_set
(
fmt
,
SNDRV_PCM_FORMAT_S24_LE
);
/*
* 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"
))
{
rate
->
min
=
rate
->
max
=
48000
;
channels
->
min
=
channels
->
max
=
2
;
snd_mask_none
(
fmt
);
snd_mask_set
(
fmt
,
SNDRV_PCM_FORMAT_S24_LE
);
}
/*
* 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"
))
snd_mask_set
(
fmt
,
SNDRV_PCM_FORMAT_S16_LE
);
return
0
;
}
...
...
@@ -390,6 +414,43 @@ static int kabylake_dmic_fixup(struct snd_soc_pcm_runtime *rtd,
return
0
;
}
static
int
kabylake_ssp0_hw_params
(
struct
snd_pcm_substream
*
substream
,
struct
snd_pcm_hw_params
*
params
)
{
struct
snd_soc_pcm_runtime
*
rtd
=
substream
->
private_data
;
int
ret
=
0
,
j
;
for
(
j
=
0
;
j
<
rtd
->
num_codecs
;
j
++
)
{
struct
snd_soc_dai
*
codec_dai
=
rtd
->
codec_dais
[
j
];
if
(
!
strcmp
(
codec_dai
->
component
->
name
,
MAXIM_DEV0_NAME
))
{
/*
* Use channel 4 and 5 for the first amp
*/
ret
=
snd_soc_dai_set_tdm_slot
(
codec_dai
,
0x30
,
3
,
8
,
16
);
if
(
ret
<
0
)
{
dev_err
(
rtd
->
dev
,
"set TDM slot err:%d
\n
"
,
ret
);
return
ret
;
}
}
if
(
!
strcmp
(
codec_dai
->
component
->
name
,
MAXIM_DEV1_NAME
))
{
/*
* Use channel 6 and 7 for the second amp
*/
ret
=
snd_soc_dai_set_tdm_slot
(
codec_dai
,
0xC0
,
3
,
8
,
16
);
if
(
ret
<
0
)
{
dev_err
(
rtd
->
dev
,
"set TDM slot err:%d
\n
"
,
ret
);
return
ret
;
}
}
}
return
ret
;
}
static
struct
snd_soc_ops
kabylake_ssp0_ops
=
{
.
hw_params
=
kabylake_ssp0_hw_params
,
};
static
unsigned
int
channels_dmic
[]
=
{
2
,
4
,
};
...
...
@@ -593,12 +654,13 @@ static struct snd_soc_dai_link kabylake_dais[] = {
.
no_pcm
=
1
,
.
codecs
=
max98927_codec_components
,
.
num_codecs
=
ARRAY_SIZE
(
max98927_codec_components
),
.
dai_fmt
=
SND_SOC_DAIFMT_
I2S
|
.
dai_fmt
=
SND_SOC_DAIFMT_
DSP_B
|
SND_SOC_DAIFMT_NB_NF
|
SND_SOC_DAIFMT_CBS_CFS
,
.
ignore_pmdown_time
=
1
,
.
be_hw_params_fixup
=
kabylake_ssp_fixup
,
.
dpcm_playback
=
1
,
.
ops
=
&
kabylake_ssp0_ops
,
},
{
/* SSP1 - Codec */
...
...
sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c
View file @
c44ff31a
...
...
@@ -302,6 +302,7 @@ static int kabylake_ssp_fixup(struct snd_soc_pcm_runtime *rtd,
* 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"
))
{
rate
->
min
=
rate
->
max
=
48000
;
channels
->
min
=
channels
->
max
=
2
;
...
...
sound/soc/intel/boards/skl_nau88l25_max98357a.c
View file @
c44ff31a
...
...
@@ -54,20 +54,6 @@ enum {
SKL_DPCM_AUDIO_HDMI3_PB
,
};
static
inline
struct
snd_soc_dai
*
skl_get_codec_dai
(
struct
snd_soc_card
*
card
)
{
struct
snd_soc_pcm_runtime
*
rtd
;
list_for_each_entry
(
rtd
,
&
card
->
rtd_list
,
list
)
{
if
(
!
strncmp
(
rtd
->
codec_dai
->
name
,
SKL_NUVOTON_CODEC_DAI
,
strlen
(
SKL_NUVOTON_CODEC_DAI
)))
return
rtd
->
codec_dai
;
}
return
NULL
;
}
static
int
platform_clock_control
(
struct
snd_soc_dapm_widget
*
w
,
struct
snd_kcontrol
*
k
,
int
event
)
{
...
...
@@ -76,7 +62,7 @@ static int platform_clock_control(struct snd_soc_dapm_widget *w,
struct
snd_soc_dai
*
codec_dai
;
int
ret
;
codec_dai
=
s
kl_get_codec_dai
(
card
);
codec_dai
=
s
nd_soc_card_get_codec_dai
(
card
,
SKL_NUVOTON_CODEC_DAI
);
if
(
!
codec_dai
)
{
dev_err
(
card
->
dev
,
"Codec dai not found; Unable to set platform clock
\n
"
);
return
-
EIO
;
...
...
sound/soc/intel/boards/skl_nau88l25_ssm4567.c
View file @
c44ff31a
...
...
@@ -57,20 +57,6 @@ enum {
SKL_DPCM_AUDIO_HDMI3_PB
,
};
static
inline
struct
snd_soc_dai
*
skl_get_codec_dai
(
struct
snd_soc_card
*
card
)
{
struct
snd_soc_pcm_runtime
*
rtd
;
list_for_each_entry
(
rtd
,
&
card
->
rtd_list
,
list
)
{
if
(
!
strncmp
(
rtd
->
codec_dai
->
name
,
SKL_NUVOTON_CODEC_DAI
,
strlen
(
SKL_NUVOTON_CODEC_DAI
)))
return
rtd
->
codec_dai
;
}
return
NULL
;
}
static
const
struct
snd_kcontrol_new
skylake_controls
[]
=
{
SOC_DAPM_PIN_SWITCH
(
"Headphone Jack"
),
SOC_DAPM_PIN_SWITCH
(
"Headset Mic"
),
...
...
@@ -86,7 +72,7 @@ static int platform_clock_control(struct snd_soc_dapm_widget *w,
struct
snd_soc_dai
*
codec_dai
;
int
ret
;
codec_dai
=
s
kl_get_codec_dai
(
card
);
codec_dai
=
s
nd_soc_card_get_codec_dai
(
card
,
SKL_NUVOTON_CODEC_DAI
);
if
(
!
codec_dai
)
{
dev_err
(
card
->
dev
,
"Codec dai not found
\n
"
);
return
-
EIO
;
...
...
sound/soc/intel/common/Makefile
View file @
c44ff31a
# SPDX-License-Identifier: GPL-2.0
snd-soc-sst-dsp-objs
:=
sst-dsp.o
snd-soc-sst-acpi-objs
:=
sst-acpi.o
snd-soc-sst-match-objs
:=
sst-match-acpi.o
snd-soc-sst-ipc-objs
:=
sst-ipc.o
snd-soc-sst-firmware-objs
:=
sst-firmware.o
snd-soc-acpi-intel-match-objs
:=
soc-acpi-intel-byt-match.o soc-acpi-intel-cht-match.o soc-acpi-intel-hsw-bdw-match.o
obj-$(CONFIG_SND_SOC_INTEL_SST)
+=
snd-soc-sst-dsp.o snd-soc-sst-ipc.o
obj-$(CONFIG_SND_SOC_INTEL_SST_ACPI)
+=
snd-soc-sst-acpi.o
obj-$(CONFIG_SND_SOC_INTEL_SST_MATCH)
+=
snd-soc-sst-match.o
obj-$(CONFIG_SND_SOC_INTEL_SST_FIRMWARE)
+=
snd-soc-sst-firmware.o
obj-$(CONFIG_SND_SOC_ACPI_INTEL_MATCH)
+=
snd-soc-acpi-intel-match.o
sound/soc/intel/common/soc-acpi-intel-byt-match.c
0 → 100644
View file @
c44ff31a
/*
* soc-apci-intel-byt-match.c - tables and support for BYT ACPI enumeration.
*
* Copyright (c) 2017, Intel Corporation.
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*/
#include <linux/dmi.h>
#include <sound/soc-acpi.h>
#include <sound/soc-acpi-intel-match.h>
static
unsigned
long
byt_machine_id
;
#define BYT_THINKPAD_10 1
static
int
byt_thinkpad10_quirk_cb
(
const
struct
dmi_system_id
*
id
)
{
byt_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_VERSION
,
"ThinkPad 10"
),
},
},
{
.
callback
=
byt_thinkpad10_quirk_cb
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"LENOVO"
),
DMI_MATCH
(
DMI_PRODUCT_VERSION
,
"ThinkPad Tablet B"
),
},
},
{
.
callback
=
byt_thinkpad10_quirk_cb
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"LENOVO"
),
DMI_MATCH
(
DMI_PRODUCT_VERSION
,
"Lenovo Miix 2 10"
),
},
},
{
}
};
static
struct
snd_soc_acpi_mach
byt_thinkpad_10
=
{
.
id
=
"10EC5640"
,
.
drv_name
=
"cht-bsw-rt5672"
,
.
fw_filename
=
"intel/fw_sst_0f28.bin"
,
.
board
=
"cht-bsw"
,
.
sof_fw_filename
=
"intel/reef-byt.ri"
,
.
sof_tplg_filename
=
"intel/reef-byt-rt5670.tplg"
,
.
asoc_plat_name
=
"sst-mfld-platform"
,
};
static
struct
snd_soc_acpi_mach
*
byt_quirk
(
void
*
arg
)
{
struct
snd_soc_acpi_mach
*
mach
=
arg
;
dmi_check_system
(
byt_table
);
if
(
byt_machine_id
==
BYT_THINKPAD_10
)
return
&
byt_thinkpad_10
;
else
return
mach
;
}
struct
snd_soc_acpi_mach
snd_soc_acpi_intel_baytrail_legacy_machines
[]
=
{
{
.
id
=
"10EC5640"
,
.
drv_name
=
"byt-rt5640"
,
.
fw_filename
=
"intel/fw_sst_0f28.bin-48kHz_i2s_master"
,
},
{
.
id
=
"193C9890"
,
.
drv_name
=
"byt-max98090"
,
.
fw_filename
=
"intel/fw_sst_0f28.bin-48kHz_i2s_master"
,
},
{}
};
EXPORT_SYMBOL_GPL
(
snd_soc_acpi_intel_baytrail_legacy_machines
);
struct
snd_soc_acpi_mach
snd_soc_acpi_intel_baytrail_machines
[]
=
{
{
.
id
=
"10EC5640"
,
.
drv_name
=
"bytcr_rt5640"
,
.
fw_filename
=
"intel/fw_sst_0f28.bin"
,
.
board
=
"bytcr_rt5640"
,
.
machine_quirk
=
byt_quirk
,
.
sof_fw_filename
=
"intel/reef-byt.ri"
,
.
sof_tplg_filename
=
"intel/reef-byt-rt5640.tplg"
,
.
asoc_plat_name
=
"sst-mfld-platform"
,
},
{
.
id
=
"10EC5642"
,
.
drv_name
=
"bytcr_rt5640"
,
.
fw_filename
=
"intel/fw_sst_0f28.bin"
,
.
board
=
"bytcr_rt5640"
,
.
sof_fw_filename
=
"intel/reef-byt.ri"
,
.
sof_tplg_filename
=
"intel/reef-byt-rt5640.tplg"
,
.
asoc_plat_name
=
"sst-mfld-platform"
,
},
{
.
id
=
"INTCCFFD"
,
.
drv_name
=
"bytcr_rt5640"
,
.
fw_filename
=
"intel/fw_sst_0f28.bin"
,
.
board
=
"bytcr_rt5640"
,
.
sof_fw_filename
=
"intel/reef-byt.ri"
,
.
sof_tplg_filename
=
"intel/reef-byt-rt5640.tplg"
,
.
asoc_plat_name
=
"sst-mfld-platform"
,
},
{
.
id
=
"10EC5651"
,
.
drv_name
=
"bytcr_rt5651"
,
.
fw_filename
=
"intel/fw_sst_0f28.bin"
,
.
board
=
"bytcr_rt5651"
,
.
sof_fw_filename
=
"intel/reef-byt.ri"
,
.
sof_tplg_filename
=
"intel/reef-byt-rt5651.tplg"
,
.
asoc_plat_name
=
"sst-mfld-platform"
,
},
{
.
id
=
"DLGS7212"
,
.
drv_name
=
"bytcht_da7213"
,
.
fw_filename
=
"intel/fw_sst_0f28.bin"
,
.
board
=
"bytcht_da7213"
,
.
sof_fw_filename
=
"intel/reef-byt.ri"
,
.
sof_tplg_filename
=
"intel/reef-byt-da7213.tplg"
,
.
asoc_plat_name
=
"sst-mfld-platform"
,
},
{
.
id
=
"DLGS7213"
,
.
drv_name
=
"bytcht_da7213"
,
.
fw_filename
=
"intel/fw_sst_0f28.bin"
,
.
board
=
"bytcht_da7213"
,
.
sof_fw_filename
=
"intel/reef-byt.ri"
,
.
sof_tplg_filename
=
"intel/reef-byt-da7213.tplg"
,
.
asoc_plat_name
=
"sst-mfld-platform"
,
},
/* some Baytrail platforms rely on RT5645, use CHT machine driver */
{
.
id
=
"10EC5645"
,
.
drv_name
=
"cht-bsw-rt5645"
,
.
fw_filename
=
"intel/fw_sst_0f28.bin"
,
.
board
=
"cht-bsw"
,
.
sof_fw_filename
=
"intel/reef-byt.ri"
,
.
sof_tplg_filename
=
"intel/reef-byt-rt5645.tplg"
,
.
asoc_plat_name
=
"sst-mfld-platform"
,
},
{
.
id
=
"10EC5648"
,
.
drv_name
=
"cht-bsw-rt5645"
,
.
fw_filename
=
"intel/fw_sst_0f28.bin"
,
.
board
=
"cht-bsw"
,
.
sof_fw_filename
=
"intel/reef-byt.ri"
,
.
sof_tplg_filename
=
"intel/reef-byt-rt5645.tplg"
,
.
asoc_plat_name
=
"sst-mfld-platform"
,
},
/* use CHT driver to Baytrail Chromebooks */
{
.
id
=
"193C9890"
,
.
drv_name
=
"cht-bsw-max98090"
,
.
fw_filename
=
"intel/fw_sst_0f28.bin"
,
.
board
=
"cht-bsw"
,
.
sof_fw_filename
=
"intel/reef-byt.ri"
,
.
sof_tplg_filename
=
"intel/reef-byt-max98090.tplg"
,
.
asoc_plat_name
=
"sst-mfld-platform"
,
},
#if IS_ENABLED(CONFIG_SND_SOC_INTEL_BYT_CHT_NOCODEC_MACH)
/*
* This is always last in the table so that it is selected only when
* enabled explicitly and there is no codec-related information in SSDT
*/
{
.
id
=
"80860F28"
,
.
drv_name
=
"bytcht_nocodec"
,
.
fw_filename
=
"intel/fw_sst_0f28.bin"
,
.
board
=
"bytcht_nocodec"
,
},
#endif
{},
};
EXPORT_SYMBOL_GPL
(
snd_soc_acpi_intel_baytrail_machines
);
MODULE_LICENSE
(
"GPL v2"
);
MODULE_DESCRIPTION
(
"Intel Common ACPI Match module"
);
sound/soc/intel/common/soc-acpi-intel-cht-match.c
0 → 100644
View file @
c44ff31a
/*
* soc-apci-intel-cht-match.c - tables and support for CHT ACPI enumeration.
*
* Copyright (c) 2017, Intel Corporation.
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*/
#include <linux/dmi.h>
#include <sound/soc-acpi.h>
#include <sound/soc-acpi-intel-match.h>
static
unsigned
long
cht_machine_id
;
#define CHT_SURFACE_MACH 1
static
int
cht_surface_quirk_cb
(
const
struct
dmi_system_id
*
id
)
{
cht_machine_id
=
CHT_SURFACE_MACH
;
return
1
;
}
static
const
struct
dmi_system_id
cht_table
[]
=
{
{
.
callback
=
cht_surface_quirk_cb
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"Microsoft Corporation"
),
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"Surface 3"
),
},
},
{
}
};
static
struct
snd_soc_acpi_mach
cht_surface_mach
=
{
.
id
=
"10EC5640"
,
.
drv_name
=
"cht-bsw-rt5645"
,
.
fw_filename
=
"intel/fw_sst_22a8.bin"
,
.
board
=
"cht-bsw"
,
.
sof_fw_filename
=
"intel/reef-cht.ri"
,
.
sof_tplg_filename
=
"intel/reef-cht-rt5645.tplg"
,
.
asoc_plat_name
=
"sst-mfld-platform"
,
};
static
struct
snd_soc_acpi_mach
*
cht_quirk
(
void
*
arg
)
{
struct
snd_soc_acpi_mach
*
mach
=
arg
;
dmi_check_system
(
cht_table
);
if
(
cht_machine_id
==
CHT_SURFACE_MACH
)
return
&
cht_surface_mach
;
else
return
mach
;
}
/* Cherryview-based platforms: CherryTrail and Braswell */
struct
snd_soc_acpi_mach
snd_soc_acpi_intel_cherrytrail_machines
[]
=
{
{
.
id
=
"10EC5670"
,
.
drv_name
=
"cht-bsw-rt5672"
,
.
fw_filename
=
"intel/fw_sst_22a8.bin"
,
.
board
=
"cht-bsw"
,
.
sof_fw_filename
=
"intel/reef-cht.ri"
,
.
sof_tplg_filename
=
"intel/reef-cht-rt5670.tplg"
,
.
asoc_plat_name
=
"sst-mfld-platform"
,
},
{
.
id
=
"10EC5672"
,
.
drv_name
=
"cht-bsw-rt5672"
,
.
fw_filename
=
"intel/fw_sst_22a8.bin"
,
.
board
=
"cht-bsw"
,
.
sof_fw_filename
=
"intel/reef-cht.ri"
,
.
sof_tplg_filename
=
"intel/reef-cht-rt5670.tplg"
,
.
asoc_plat_name
=
"sst-mfld-platform"
,
},
{
.
id
=
"10EC5645"
,
.
drv_name
=
"cht-bsw-rt5645"
,
.
fw_filename
=
"intel/fw_sst_22a8.bin"
,
.
board
=
"cht-bsw"
,
.
sof_fw_filename
=
"intel/reef-cht.ri"
,
.
sof_tplg_filename
=
"intel/reef-cht-rt5645.tplg"
,
.
asoc_plat_name
=
"sst-mfld-platform"
,
},
{
.
id
=
"10EC5650"
,
.
drv_name
=
"cht-bsw-rt5645"
,
.
fw_filename
=
"intel/fw_sst_22a8.bin"
,
.
board
=
"cht-bsw"
,
.
sof_fw_filename
=
"intel/reef-cht.ri"
,
.
sof_tplg_filename
=
"intel/reef-cht-rt5645.tplg"
,
.
asoc_plat_name
=
"sst-mfld-platform"
,
},
{
.
id
=
"10EC3270"
,
.
drv_name
=
"cht-bsw-rt5645"
,
.
fw_filename
=
"intel/fw_sst_22a8.bin"
,
.
board
=
"cht-bsw"
,
.
sof_fw_filename
=
"intel/reef-cht.ri"
,
.
sof_tplg_filename
=
"intel/reef-cht-rt5645.tplg"
,
.
asoc_plat_name
=
"sst-mfld-platform"
,
},
{
.
id
=
"193C9890"
,
.
drv_name
=
"cht-bsw-max98090"
,
.
fw_filename
=
"intel/fw_sst_22a8.bin"
,
.
board
=
"cht-bsw"
,
.
sof_fw_filename
=
"intel/reef-cht.ri"
,
.
sof_tplg_filename
=
"intel/reef-cht-max98090.tplg"
,
.
asoc_plat_name
=
"sst-mfld-platform"
,
},
{
.
id
=
"DLGS7212"
,
.
drv_name
=
"bytcht_da7213"
,
.
fw_filename
=
"intel/fw_sst_22a8.bin"
,
.
board
=
"bytcht_da7213"
,
.
sof_fw_filename
=
"intel/reef-cht.ri"
,
.
sof_tplg_filename
=
"intel/reef-cht-da7213.tplg"
,
.
asoc_plat_name
=
"sst-mfld-platform"
,
},
{
.
id
=
"DLGS7213"
,
.
drv_name
=
"bytcht_da7213"
,
.
fw_filename
=
"intel/fw_sst_22a8.bin"
,
.
board
=
"bytcht_da7213"
,
.
sof_fw_filename
=
"intel/reef-cht.ri"
,
.
sof_tplg_filename
=
"intel/reef-cht-da7213.tplg"
,
.
asoc_plat_name
=
"sst-mfld-platform"
,
},
{
.
id
=
"ESSX8316"
,
.
drv_name
=
"bytcht_es8316"
,
.
fw_filename
=
"intel/fw_sst_22a8.bin"
,
.
board
=
"bytcht_es8316"
,
.
sof_fw_filename
=
"intel/reef-cht.ri"
,
.
sof_tplg_filename
=
"intel/reef-cht-es8316.tplg"
,
.
asoc_plat_name
=
"sst-mfld-platform"
,
},
/* some CHT-T platforms rely on RT5640, use Baytrail machine driver */
{
.
id
=
"10EC5640"
,
.
drv_name
=
"bytcr_rt5640"
,
.
fw_filename
=
"intel/fw_sst_22a8.bin"
,
.
board
=
"bytcr_rt5640"
,
.
machine_quirk
=
cht_quirk
,
.
sof_fw_filename
=
"intel/reef-cht.ri"
,
.
sof_tplg_filename
=
"intel/reef-cht-rt5640.tplg"
,
.
asoc_plat_name
=
"sst-mfld-platform"
,
},
{
.
id
=
"10EC3276"
,
.
drv_name
=
"bytcr_rt5640"
,
.
fw_filename
=
"intel/fw_sst_22a8.bin"
,
.
board
=
"bytcr_rt5640"
,
.
sof_fw_filename
=
"intel/reef-cht.ri"
,
.
sof_tplg_filename
=
"intel/reef-cht-rt5640.tplg"
,
.
asoc_plat_name
=
"sst-mfld-platform"
,
},
/* some CHT-T platforms rely on RT5651, use Baytrail machine driver */
{
.
id
=
"10EC5651"
,
.
drv_name
=
"bytcr_rt5651"
,
.
fw_filename
=
"intel/fw_sst_22a8.bin"
,
.
board
=
"bytcr_rt5651"
,
.
sof_fw_filename
=
"intel/reef-cht.ri"
,
.
sof_tplg_filename
=
"intel/reef-cht-rt5651.tplg"
,
.
asoc_plat_name
=
"sst-mfld-platform"
,
},
#if IS_ENABLED(CONFIG_SND_SOC_INTEL_BYT_CHT_NOCODEC_MACH)
/*
* This is always last in the table so that it is selected only when
* enabled explicitly and there is no codec-related information in SSDT
*/
{
.
id
=
"808622A8"
,
.
drv_name
=
"bytcht_nocodec"
,
.
fw_filename
=
"intel/fw_sst_22a8.bin"
,
.
board
=
"bytcht_nocodec"
,
},
#endif
{},
};
EXPORT_SYMBOL_GPL
(
snd_soc_acpi_intel_cherrytrail_machines
);
MODULE_LICENSE
(
"GPL v2"
);
MODULE_DESCRIPTION
(
"Intel Common ACPI Match module"
);
sound/soc/intel/common/soc-acpi-intel-hsw-bdw-match.c
0 → 100644
View file @
c44ff31a
/*
* soc-apci-intel-hsw-bdw-match.c - tables and support for ACPI enumeration.
*
* Copyright (c) 2017, Intel Corporation.
*
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*/
#include <linux/dmi.h>
#include <sound/soc-acpi.h>
#include <sound/soc-acpi-intel-match.h>
struct
snd_soc_acpi_mach
snd_soc_acpi_intel_haswell_machines
[]
=
{
{
.
id
=
"INT33CA"
,
.
drv_name
=
"haswell-audio"
,
.
fw_filename
=
"intel/IntcSST1.bin"
,
.
sof_fw_filename
=
"intel/reef-hsw.ri"
,
.
sof_tplg_filename
=
"intel/reef-hsw.tplg"
,
.
asoc_plat_name
=
"haswell-pcm-audio"
,
},
{}
};
EXPORT_SYMBOL_GPL
(
snd_soc_acpi_intel_haswell_machines
);
struct
snd_soc_acpi_mach
snd_soc_acpi_intel_broadwell_machines
[]
=
{
{
.
id
=
"INT343A"
,
.
drv_name
=
"broadwell-audio"
,
.
fw_filename
=
"intel/IntcSST2.bin"
,
.
sof_fw_filename
=
"intel/reef-bdw.ri"
,
.
sof_tplg_filename
=
"intel/reef-bdw-rt286.tplg"
,
.
asoc_plat_name
=
"haswell-pcm-audio"
,
},
{
.
id
=
"RT5677CE"
,
.
drv_name
=
"bdw-rt5677"
,
.
fw_filename
=
"intel/IntcSST2.bin"
,
.
sof_fw_filename
=
"intel/reef-bdw.ri"
,
.
sof_tplg_filename
=
"intel/reef-bdw-rt286.tplg"
,
.
asoc_plat_name
=
"haswell-pcm-audio"
,
},
{
.
id
=
"INT33CA"
,
.
drv_name
=
"haswell-audio"
,
.
fw_filename
=
"intel/IntcSST2.bin"
,
.
sof_fw_filename
=
"intel/reef-bdw.ri"
,
.
sof_tplg_filename
=
"intel/reef-bdw-rt5640.tplg"
,
.
asoc_plat_name
=
"haswell-pcm-audio"
,
},
{}
};
EXPORT_SYMBOL_GPL
(
snd_soc_acpi_intel_broadwell_machines
);
MODULE_LICENSE
(
"GPL v2"
);
MODULE_DESCRIPTION
(
"Intel Common ACPI Match module"
);
sound/soc/intel/common/sst-acpi.c
View file @
c44ff31a
...
...
@@ -21,7 +21,8 @@
#include <linux/platform_device.h>
#include "sst-dsp.h"
#include "sst-acpi.h"
#include <sound/soc-acpi.h>
#include <sound/soc-acpi-intel-match.h>
#define SST_LPT_DSP_DMA_ADDR_OFFSET 0x0F0000
#define SST_WPT_DSP_DMA_ADDR_OFFSET 0x0FE000
...
...
@@ -30,7 +31,7 @@
/* Descriptor for setting up SST platform data */
struct
sst_acpi_desc
{
const
char
*
drv_name
;
struct
s
st
_acpi_mach
*
machines
;
struct
s
nd_soc
_acpi_mach
*
machines
;
/* Platform resource indexes. Must set to -1 if not used */
int
resindex_lpe_base
;
int
resindex_pcicfg_base
;
...
...
@@ -49,7 +50,7 @@ struct sst_acpi_priv {
struct
platform_device
*
pdev_pcm
;
struct
sst_pdata
sst_pdata
;
struct
sst_acpi_desc
*
desc
;
struct
s
st
_acpi_mach
*
mach
;
struct
s
nd_soc
_acpi_mach
*
mach
;
};
static
void
sst_acpi_fw_cb
(
const
struct
firmware
*
fw
,
void
*
context
)
...
...
@@ -59,7 +60,7 @@ static void sst_acpi_fw_cb(const struct firmware *fw, void *context)
struct
sst_acpi_priv
*
sst_acpi
=
platform_get_drvdata
(
pdev
);
struct
sst_pdata
*
sst_pdata
=
&
sst_acpi
->
sst_pdata
;
struct
sst_acpi_desc
*
desc
=
sst_acpi
->
desc
;
struct
s
st
_acpi_mach
*
mach
=
sst_acpi
->
mach
;
struct
s
nd_soc
_acpi_mach
*
mach
=
sst_acpi
->
mach
;
sst_pdata
->
fw
=
fw
;
if
(
!
fw
)
{
...
...
@@ -85,7 +86,7 @@ static int sst_acpi_probe(struct platform_device *pdev)
struct
device
*
dev
=
&
pdev
->
dev
;
struct
sst_acpi_priv
*
sst_acpi
;
struct
sst_pdata
*
sst_pdata
;
struct
s
st
_acpi_mach
*
mach
;
struct
s
nd_soc
_acpi_mach
*
mach
;
struct
sst_acpi_desc
*
desc
;
struct
resource
*
mmio
;
int
ret
=
0
;
...
...
@@ -99,7 +100,7 @@ static int sst_acpi_probe(struct platform_device *pdev)
return
-
ENODEV
;
desc
=
(
struct
sst_acpi_desc
*
)
id
->
driver_data
;
mach
=
s
st
_acpi_find_machine
(
desc
->
machines
);
mach
=
s
nd_soc
_acpi_find_machine
(
desc
->
machines
);
if
(
mach
==
NULL
)
{
dev_err
(
dev
,
"No matching ASoC machine driver found
\n
"
);
return
-
ENODEV
;
...
...
@@ -179,14 +180,9 @@ static int sst_acpi_remove(struct platform_device *pdev)
return
0
;
}
static
struct
sst_acpi_mach
haswell_machines
[]
=
{
{
"INT33CA"
,
"haswell-audio"
,
"intel/IntcSST1.bin"
,
NULL
,
NULL
,
NULL
},
{}
};
static
struct
sst_acpi_desc
sst_acpi_haswell_desc
=
{
.
drv_name
=
"haswell-pcm-audio"
,
.
machines
=
haswell_machines
,
.
machines
=
snd_soc_acpi_intel_
haswell_machines
,
.
resindex_lpe_base
=
0
,
.
resindex_pcicfg_base
=
1
,
.
resindex_fw_base
=
-
1
,
...
...
@@ -197,15 +193,9 @@ static struct sst_acpi_desc sst_acpi_haswell_desc = {
.
dma_size
=
SST_LPT_DSP_DMA_SIZE
,
};
static
struct
sst_acpi_mach
broadwell_machines
[]
=
{
{
"INT343A"
,
"broadwell-audio"
,
"intel/IntcSST2.bin"
,
NULL
,
NULL
,
NULL
},
{
"RT5677CE"
,
"bdw-rt5677"
,
"intel/IntcSST2.bin"
,
NULL
,
NULL
,
NULL
},
{}
};
static
struct
sst_acpi_desc
sst_acpi_broadwell_desc
=
{
.
drv_name
=
"haswell-pcm-audio"
,
.
machines
=
broadwell_machines
,
.
machines
=
snd_soc_acpi_intel_
broadwell_machines
,
.
resindex_lpe_base
=
0
,
.
resindex_pcicfg_base
=
1
,
.
resindex_fw_base
=
-
1
,
...
...
@@ -217,15 +207,9 @@ static struct sst_acpi_desc sst_acpi_broadwell_desc = {
};
#if !IS_ENABLED(CONFIG_SND_SST_IPC_ACPI)
static
struct
sst_acpi_mach
baytrail_machines
[]
=
{
{
"10EC5640"
,
"byt-rt5640"
,
"intel/fw_sst_0f28.bin-48kHz_i2s_master"
,
NULL
,
NULL
,
NULL
},
{
"193C9890"
,
"byt-max98090"
,
"intel/fw_sst_0f28.bin-48kHz_i2s_master"
,
NULL
,
NULL
,
NULL
},
{}
};
static
struct
sst_acpi_desc
sst_acpi_baytrail_desc
=
{
.
drv_name
=
"baytrail-pcm-audio"
,
.
machines
=
baytrail
_machines
,
.
machines
=
snd_soc_acpi_intel_baytrail_legacy
_machines
,
.
resindex_lpe_base
=
0
,
.
resindex_pcicfg_base
=
1
,
.
resindex_fw_base
=
2
,
...
...
sound/soc/intel/common/sst-firmware.c
View file @
c44ff31a
...
...
@@ -19,6 +19,7 @@
#include <linux/sched.h>
#include <linux/firmware.h>
#include <linux/export.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/dma-mapping.h>
#include <linux/dmaengine.h>
...
...
@@ -274,7 +275,6 @@ int sst_dma_new(struct sst_dsp *sst)
struct
sst_pdata
*
sst_pdata
=
sst
->
pdata
;
struct
sst_dma
*
dma
;
struct
resource
mem
;
const
char
*
dma_dev_name
;
int
ret
=
0
;
if
(
sst
->
pdata
->
resindex_dma_base
==
-
1
)
...
...
@@ -285,7 +285,6 @@ int sst_dma_new(struct sst_dsp *sst)
* is attached to the ADSP IP. */
switch
(
sst
->
pdata
->
dma_engine
)
{
case
SST_DMA_TYPE_DW
:
dma_dev_name
=
"dw_dmac"
;
break
;
default:
dev_err
(
sst
->
dev
,
"error: invalid DMA engine %d
\n
"
,
...
...
sound/soc/intel/skylake/skl-messages.c
View file @
c44ff31a
...
...
@@ -613,8 +613,10 @@ static void skl_setup_cpr_gateway_cfg(struct skl_sst *ctx,
}
#define DMA_CONTROL_ID 5
#define DMA_I2S_BLOB_SIZE 21
int
skl_dsp_set_dma_control
(
struct
skl_sst
*
ctx
,
struct
skl_module_cfg
*
mconfig
)
int
skl_dsp_set_dma_control
(
struct
skl_sst
*
ctx
,
u32
*
caps
,
u32
caps_size
,
u32
node_id
)
{
struct
skl_dma_control
*
dma_ctrl
;
struct
skl_ipc_large_config_msg
msg
=
{
0
};
...
...
@@ -624,24 +626,27 @@ int skl_dsp_set_dma_control(struct skl_sst *ctx, struct skl_module_cfg *mconfig)
/*
* if blob size zero, then return
*/
if
(
mconfig
->
formats_config
.
caps_size
==
0
)
if
(
caps_size
==
0
)
return
0
;
msg
.
large_param_id
=
DMA_CONTROL_ID
;
msg
.
param_data_size
=
sizeof
(
struct
skl_dma_control
)
+
mconfig
->
formats_config
.
caps_size
;
msg
.
param_data_size
=
sizeof
(
struct
skl_dma_control
)
+
caps_size
;
dma_ctrl
=
kzalloc
(
msg
.
param_data_size
,
GFP_KERNEL
);
if
(
dma_ctrl
==
NULL
)
return
-
ENOMEM
;
dma_ctrl
->
node_id
=
skl_get_node_id
(
ctx
,
mconfig
)
;
dma_ctrl
->
node_id
=
node_id
;
/* size in dwords */
dma_ctrl
->
config_length
=
mconfig
->
formats_config
.
caps_size
/
4
;
/*
* NHLT blob may contain additional configs along with i2s blob.
* firmware expects only the i2s blob size as the config_length.
* So fix to i2s blob size.
* size in dwords.
*/
dma_ctrl
->
config_length
=
DMA_I2S_BLOB_SIZE
;
memcpy
(
dma_ctrl
->
config_data
,
mconfig
->
formats_config
.
caps
,
mconfig
->
formats_config
.
caps_size
);
memcpy
(
dma_ctrl
->
config_data
,
caps
,
caps_size
);
err
=
skl_ipc_set_large_config
(
&
ctx
->
ipc
,
&
msg
,
(
u32
*
)
dma_ctrl
);
...
...
sound/soc/intel/skylake/skl-pcm.c
View file @
c44ff31a
...
...
@@ -653,7 +653,7 @@ static const struct snd_soc_dai_ops skl_link_dai_ops = {
.
trigger
=
skl_link_pcm_trigger
,
};
static
struct
snd_soc_dai_driver
skl_
platform
_dai
[]
=
{
static
struct
snd_soc_dai_driver
skl_
fe
_dai
[]
=
{
{
.
name
=
"System Pin"
,
.
ops
=
&
skl_pcm_dai_ops
,
...
...
@@ -797,8 +797,10 @@ static struct snd_soc_dai_driver skl_platform_dai[] = {
.
sig_bits
=
32
,
},
},
};
/* BE CPU Dais */
static
struct
snd_soc_dai_driver
skl_platform_dai
[]
=
{
{
.
name
=
"SSP0 Pin"
,
.
ops
=
&
skl_be_ssp_dai_ops
,
...
...
@@ -976,6 +978,14 @@ static struct snd_soc_dai_driver skl_platform_dai[] = {
},
};
int
skl_dai_load
(
struct
snd_soc_component
*
cmp
,
struct
snd_soc_dai_driver
*
pcm_dai
)
{
pcm_dai
->
ops
=
&
skl_pcm_dai_ops
;
return
0
;
}
static
int
skl_platform_open
(
struct
snd_pcm_substream
*
substream
)
{
struct
snd_soc_pcm_runtime
*
rtd
=
substream
->
private_data
;
...
...
@@ -1363,6 +1373,8 @@ int skl_platform_register(struct device *dev)
int
ret
;
struct
hdac_ext_bus
*
ebus
=
dev_get_drvdata
(
dev
);
struct
skl
*
skl
=
ebus_to_skl
(
ebus
);
struct
snd_soc_dai_driver
*
dais
;
int
num_dais
=
ARRAY_SIZE
(
skl_platform_dai
);
INIT_LIST_HEAD
(
&
skl
->
ppl_list
);
INIT_LIST_HEAD
(
&
skl
->
bind_list
);
...
...
@@ -1372,14 +1384,38 @@ int skl_platform_register(struct device *dev)
dev_err
(
dev
,
"soc platform registration failed %d
\n
"
,
ret
);
return
ret
;
}
skl
->
dais
=
kmemdup
(
skl_platform_dai
,
sizeof
(
skl_platform_dai
),
GFP_KERNEL
);
if
(
!
skl
->
dais
)
{
ret
=
-
ENOMEM
;
goto
err
;
}
if
(
!
skl
->
use_tplg_pcm
)
{
dais
=
krealloc
(
skl
->
dais
,
sizeof
(
skl_fe_dai
)
+
sizeof
(
skl_platform_dai
),
GFP_KERNEL
);
if
(
!
dais
)
{
ret
=
-
ENOMEM
;
goto
err
;
}
skl
->
dais
=
dais
;
memcpy
(
&
skl
->
dais
[
ARRAY_SIZE
(
skl_platform_dai
)],
skl_fe_dai
,
sizeof
(
skl_fe_dai
));
num_dais
+=
ARRAY_SIZE
(
skl_fe_dai
);
}
ret
=
snd_soc_register_component
(
dev
,
&
skl_component
,
skl_platform_dai
,
ARRAY_SIZE
(
skl_platform_dai
));
skl
->
dais
,
num_dais
);
if
(
ret
)
{
dev_err
(
dev
,
"soc component registration failed %d
\n
"
,
ret
);
snd_soc_unregister_platform
(
dev
)
;
goto
err
;
}
return
0
;
err:
snd_soc_unregister_platform
(
dev
);
return
ret
;
}
...
...
@@ -1399,5 +1435,7 @@ int skl_platform_unregister(struct device *dev)
snd_soc_unregister_component
(
dev
);
snd_soc_unregister_platform
(
dev
);
kfree
(
skl
->
dais
);
return
0
;
}
sound/soc/intel/skylake/skl-topology.c
View file @
c44ff31a
...
...
@@ -2036,21 +2036,45 @@ static int skl_tplg_add_pipe(struct device *dev,
return
0
;
}
static
int
skl_tplg_fill_pin
(
struct
device
*
dev
,
u32
tkn
,
static
int
skl_tplg_get_uuid
(
struct
device
*
dev
,
u8
*
guid
,
struct
snd_soc_tplg_vendor_uuid_elem
*
uuid_tkn
)
{
if
(
uuid_tkn
->
token
==
SKL_TKN_UUID
)
{
memcpy
(
guid
,
&
uuid_tkn
->
uuid
,
16
);
return
0
;
}
dev_err
(
dev
,
"Not an UUID token %d
\n
"
,
uuid_tkn
->
token
);
return
-
EINVAL
;
}
static
int
skl_tplg_fill_pin
(
struct
device
*
dev
,
struct
snd_soc_tplg_vendor_value_elem
*
tkn_elem
,
struct
skl_module_pin
*
m_pin
,
int
pin_index
,
u32
value
)
int
pin_index
)
{
switch
(
tkn
)
{
int
ret
;
switch
(
tkn_elem
->
token
)
{
case
SKL_TKN_U32_PIN_MOD_ID
:
m_pin
[
pin_index
].
id
.
module_id
=
value
;
m_pin
[
pin_index
].
id
.
module_id
=
tkn_elem
->
value
;
break
;
case
SKL_TKN_U32_PIN_INST_ID
:
m_pin
[
pin_index
].
id
.
instance_id
=
value
;
m_pin
[
pin_index
].
id
.
instance_id
=
tkn_elem
->
value
;
break
;
case
SKL_TKN_UUID
:
ret
=
skl_tplg_get_uuid
(
dev
,
m_pin
[
pin_index
].
id
.
mod_uuid
.
b
,
(
struct
snd_soc_tplg_vendor_uuid_elem
*
)
tkn_elem
);
if
(
ret
<
0
)
return
ret
;
break
;
default:
dev_err
(
dev
,
"%d Not a pin token
\n
"
,
value
);
dev_err
(
dev
,
"%d Not a pin token
\n
"
,
tkn_elem
->
token
);
return
-
EINVAL
;
}
...
...
@@ -2083,9 +2107,7 @@ static int skl_tplg_fill_pins_info(struct device *dev,
return
-
EINVAL
;
}
ret
=
skl_tplg_fill_pin
(
dev
,
tkn_elem
->
token
,
m_pin
,
pin_count
,
tkn_elem
->
value
);
ret
=
skl_tplg_fill_pin
(
dev
,
tkn_elem
,
m_pin
,
pin_count
);
if
(
ret
<
0
)
return
ret
;
...
...
@@ -2170,19 +2192,6 @@ static int skl_tplg_widget_fill_fmt(struct device *dev,
return
skl_tplg_fill_fmt
(
dev
,
dst_fmt
,
tkn
,
val
);
}
static
int
skl_tplg_get_uuid
(
struct
device
*
dev
,
struct
skl_module_cfg
*
mconfig
,
struct
snd_soc_tplg_vendor_uuid_elem
*
uuid_tkn
)
{
if
(
uuid_tkn
->
token
==
SKL_TKN_UUID
)
memcpy
(
&
mconfig
->
guid
,
&
uuid_tkn
->
uuid
,
16
);
else
{
dev_err
(
dev
,
"Not an UUID token tkn %d
\n
"
,
uuid_tkn
->
token
);
return
-
EINVAL
;
}
return
0
;
}
static
void
skl_tplg_fill_pin_dynamic_val
(
struct
skl_module_pin
*
mpin
,
u32
pin_count
,
u32
value
)
{
...
...
@@ -2488,6 +2497,7 @@ static int skl_tplg_get_token(struct device *dev,
case
SKL_TKN_U32_PIN_MOD_ID
:
case
SKL_TKN_U32_PIN_INST_ID
:
case
SKL_TKN_UUID
:
ret
=
skl_tplg_fill_pins_info
(
dev
,
mconfig
,
tkn_elem
,
dir
,
pin_index
);
...
...
@@ -2550,6 +2560,7 @@ static int skl_tplg_get_tokens(struct device *dev,
struct
snd_soc_tplg_vendor_value_elem
*
tkn_elem
;
int
tkn_count
=
0
,
ret
;
int
off
=
0
,
tuple_size
=
0
;
bool
is_module_guid
=
true
;
if
(
block_size
<=
0
)
return
-
EINVAL
;
...
...
@@ -2565,7 +2576,15 @@ static int skl_tplg_get_tokens(struct device *dev,
continue
;
case
SND_SOC_TPLG_TUPLE_TYPE_UUID
:
ret
=
skl_tplg_get_uuid
(
dev
,
mconfig
,
array
->
uuid
);
if
(
is_module_guid
)
{
ret
=
skl_tplg_get_uuid
(
dev
,
mconfig
->
guid
,
array
->
uuid
);
is_module_guid
=
false
;
}
else
{
ret
=
skl_tplg_get_token
(
dev
,
array
->
value
,
skl
,
mconfig
);
}
if
(
ret
<
0
)
return
ret
;
...
...
@@ -3331,6 +3350,7 @@ static struct snd_soc_tplg_ops skl_tplg_ops = {
.
io_ops
=
skl_tplg_kcontrol_ops
,
.
io_ops_count
=
ARRAY_SIZE
(
skl_tplg_kcontrol_ops
),
.
manifest
=
skl_manifest_load
,
.
dai_load
=
skl_dai_load
,
};
/*
...
...
@@ -3404,7 +3424,7 @@ int skl_tplg_init(struct snd_soc_platform *platform, struct hdac_ext_bus *ebus)
ret
=
request_firmware
(
&
fw
,
skl
->
tplg_name
,
bus
->
dev
);
if
(
ret
<
0
)
{
dev_
err
(
bus
->
dev
,
"tplg fw %s load failed with %d
\
n
"
,
dev_
info
(
bus
->
dev
,
"tplg fw %s load failed with %d, falling back to dfw_sst.bi
n"
,
skl
->
tplg_name
,
ret
);
ret
=
request_firmware
(
&
fw
,
"dfw_sst.bin"
,
bus
->
dev
);
if
(
ret
<
0
)
{
...
...
sound/soc/intel/skylake/skl-topology.h
View file @
c44ff31a
...
...
@@ -456,8 +456,8 @@ static inline struct skl *get_skl_ctx(struct device *dev)
int
skl_tplg_be_update_params
(
struct
snd_soc_dai
*
dai
,
struct
skl_pipe_params
*
params
);
int
skl_dsp_set_dma_control
(
struct
skl_sst
*
ctx
,
struct
skl_module_cfg
*
mconfig
);
int
skl_dsp_set_dma_control
(
struct
skl_sst
*
ctx
,
u32
*
caps
,
u32
caps_size
,
u32
node_id
);
void
skl_tplg_set_be_dmic_config
(
struct
snd_soc_dai
*
dai
,
struct
skl_pipe_params
*
params
,
int
stream
);
int
skl_tplg_init
(
struct
snd_soc_platform
*
platform
,
...
...
@@ -502,4 +502,7 @@ 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
);
int
skl_dai_load
(
struct
snd_soc_component
*
cmp
,
struct
snd_soc_dai_driver
*
pcm_dai
);
#endif
sound/soc/intel/skylake/skl.c
View file @
c44ff31a
...
...
@@ -28,7 +28,7 @@
#include <linux/firmware.h>
#include <linux/delay.h>
#include <sound/pcm.h>
#include
"../common/sst-acpi.h"
#include
<sound/soc-acpi.h>
#include <sound/hda_register.h>
#include <sound/hdaudio.h>
#include <sound/hda_i915.h>
...
...
@@ -439,10 +439,10 @@ static int skl_machine_device_register(struct skl *skl, void *driver_data)
{
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
&
skl
->
ebus
);
struct
platform_device
*
pdev
;
struct
s
st
_acpi_mach
*
mach
=
driver_data
;
struct
s
nd_soc
_acpi_mach
*
mach
=
driver_data
;
int
ret
;
mach
=
s
st
_acpi_find_machine
(
mach
);
mach
=
s
nd_soc
_acpi_find_machine
(
mach
);
if
(
mach
==
NULL
)
{
dev_err
(
bus
->
dev
,
"No matching machine driver found
\n
"
);
return
-
ENODEV
;
...
...
@@ -462,8 +462,11 @@ static int skl_machine_device_register(struct skl *skl, void *driver_data)
return
-
EIO
;
}
if
(
mach
->
pdata
)
if
(
mach
->
pdata
)
{
skl
->
use_tplg_pcm
=
((
struct
skl_machine_pdata
*
)
mach
->
pdata
)
->
use_tplg_pcm
;
dev_set_drvdata
(
&
pdev
->
dev
,
mach
->
pdata
);
}
skl
->
i2s_dev
=
pdev
;
...
...
@@ -875,33 +878,36 @@ static void skl_remove(struct pci_dev *pci)
dev_set_drvdata
(
&
pci
->
dev
,
NULL
);
}
static
struct
s
st
_codecs
skl_codecs
=
{
static
struct
s
nd_soc_acpi
_codecs
skl_codecs
=
{
.
num_codecs
=
1
,
.
codecs
=
{
"10508825"
}
};
static
struct
s
st
_codecs
kbl_codecs
=
{
static
struct
s
nd_soc_acpi
_codecs
kbl_codecs
=
{
.
num_codecs
=
1
,
.
codecs
=
{
"10508825"
}
};
static
struct
s
st
_codecs
bxt_codecs
=
{
static
struct
s
nd_soc_acpi
_codecs
bxt_codecs
=
{
.
num_codecs
=
1
,
.
codecs
=
{
"MX98357A"
}
};
static
struct
s
st
_codecs
kbl_poppy_codecs
=
{
static
struct
s
nd_soc_acpi
_codecs
kbl_poppy_codecs
=
{
.
num_codecs
=
1
,
.
codecs
=
{
"10EC5663"
}
};
static
struct
s
st
_codecs
kbl_5663_5514_codecs
=
{
static
struct
s
nd_soc_acpi
_codecs
kbl_5663_5514_codecs
=
{
.
num_codecs
=
2
,
.
codecs
=
{
"10EC5663"
,
"10EC5514"
}
};
static
struct
skl_machine_pdata
cnl_pdata
=
{
.
use_tplg_pcm
=
true
,
};
static
struct
s
st
_acpi_mach
sst_skl_devdata
[]
=
{
static
struct
s
nd_soc
_acpi_mach
sst_skl_devdata
[]
=
{
{
.
id
=
"INT343A"
,
.
drv_name
=
"skl_alc286s_i2s"
,
...
...
@@ -911,7 +917,7 @@ static struct sst_acpi_mach sst_skl_devdata[] = {
.
id
=
"INT343B"
,
.
drv_name
=
"skl_n88l25_s4567"
,
.
fw_filename
=
"intel/dsp_fw_release.bin"
,
.
machine_quirk
=
s
st
_acpi_codec_list
,
.
machine_quirk
=
s
nd_soc
_acpi_codec_list
,
.
quirk_data
=
&
skl_codecs
,
.
pdata
=
&
skl_dmic_data
},
...
...
@@ -919,14 +925,14 @@ static struct sst_acpi_mach sst_skl_devdata[] = {
.
id
=
"MX98357A"
,
.
drv_name
=
"skl_n88l25_m98357a"
,
.
fw_filename
=
"intel/dsp_fw_release.bin"
,
.
machine_quirk
=
s
st
_acpi_codec_list
,
.
machine_quirk
=
s
nd_soc
_acpi_codec_list
,
.
quirk_data
=
&
skl_codecs
,
.
pdata
=
&
skl_dmic_data
},
{}
};
static
struct
s
st
_acpi_mach
sst_bxtp_devdata
[]
=
{
static
struct
s
nd_soc
_acpi_mach
sst_bxtp_devdata
[]
=
{
{
.
id
=
"INT343A"
,
.
drv_name
=
"bxt_alc298s_i2s"
,
...
...
@@ -936,13 +942,13 @@ static struct sst_acpi_mach sst_bxtp_devdata[] = {
.
id
=
"DLGS7219"
,
.
drv_name
=
"bxt_da7219_max98357a_i2s"
,
.
fw_filename
=
"intel/dsp_fw_bxtn.bin"
,
.
machine_quirk
=
s
st
_acpi_codec_list
,
.
machine_quirk
=
s
nd_soc
_acpi_codec_list
,
.
quirk_data
=
&
bxt_codecs
,
},
{}
};
static
struct
s
st
_acpi_mach
sst_kbl_devdata
[]
=
{
static
struct
s
nd_soc
_acpi_mach
sst_kbl_devdata
[]
=
{
{
.
id
=
"INT343A"
,
.
drv_name
=
"kbl_alc286s_i2s"
,
...
...
@@ -952,7 +958,7 @@ static struct sst_acpi_mach sst_kbl_devdata[] = {
.
id
=
"INT343B"
,
.
drv_name
=
"kbl_n88l25_s4567"
,
.
fw_filename
=
"intel/dsp_fw_kbl.bin"
,
.
machine_quirk
=
s
st
_acpi_codec_list
,
.
machine_quirk
=
s
nd_soc
_acpi_codec_list
,
.
quirk_data
=
&
kbl_codecs
,
.
pdata
=
&
skl_dmic_data
},
...
...
@@ -960,7 +966,7 @@ static struct sst_acpi_mach sst_kbl_devdata[] = {
.
id
=
"MX98357A"
,
.
drv_name
=
"kbl_n88l25_m98357a"
,
.
fw_filename
=
"intel/dsp_fw_kbl.bin"
,
.
machine_quirk
=
s
st
_acpi_codec_list
,
.
machine_quirk
=
s
nd_soc
_acpi_codec_list
,
.
quirk_data
=
&
kbl_codecs
,
.
pdata
=
&
skl_dmic_data
},
...
...
@@ -968,7 +974,7 @@ static struct sst_acpi_mach sst_kbl_devdata[] = {
.
id
=
"MX98927"
,
.
drv_name
=
"kbl_r5514_5663_max"
,
.
fw_filename
=
"intel/dsp_fw_kbl.bin"
,
.
machine_quirk
=
s
st
_acpi_codec_list
,
.
machine_quirk
=
s
nd_soc
_acpi_codec_list
,
.
quirk_data
=
&
kbl_5663_5514_codecs
,
.
pdata
=
&
skl_dmic_data
},
...
...
@@ -976,7 +982,7 @@ static struct sst_acpi_mach sst_kbl_devdata[] = {
.
id
=
"MX98927"
,
.
drv_name
=
"kbl_rt5663_m98927"
,
.
fw_filename
=
"intel/dsp_fw_kbl.bin"
,
.
machine_quirk
=
s
st
_acpi_codec_list
,
.
machine_quirk
=
s
nd_soc
_acpi_codec_list
,
.
quirk_data
=
&
kbl_poppy_codecs
,
.
pdata
=
&
skl_dmic_data
},
...
...
@@ -989,7 +995,7 @@ static struct sst_acpi_mach sst_kbl_devdata[] = {
{}
};
static
struct
s
st
_acpi_mach
sst_glk_devdata
[]
=
{
static
struct
s
nd_soc
_acpi_mach
sst_glk_devdata
[]
=
{
{
.
id
=
"INT343A"
,
.
drv_name
=
"glk_alc298s_i2s"
,
...
...
@@ -998,12 +1004,14 @@ static struct sst_acpi_mach sst_glk_devdata[] = {
{}
};
static
const
struct
s
st
_acpi_mach
sst_cnl_devdata
[]
=
{
static
const
struct
s
nd_soc
_acpi_mach
sst_cnl_devdata
[]
=
{
{
.
id
=
"INT34C2"
,
.
drv_name
=
"cnl_rt274"
,
.
fw_filename
=
"intel/dsp_fw_cnl.bin"
,
.
pdata
=
&
cnl_pdata
,
},
{}
};
/* PCI IDs */
...
...
sound/soc/intel/skylake/skl.h
View file @
c44ff31a
...
...
@@ -53,6 +53,7 @@ struct skl {
struct
platform_device
*
dmic_dev
;
struct
platform_device
*
i2s_dev
;
struct
snd_soc_platform
*
platform
;
struct
snd_soc_dai_driver
*
dais
;
struct
nhlt_acpi_table
*
nhlt
;
/* nhlt ptr */
struct
skl_sst
*
skl_sst
;
/* sst skl ctx */
...
...
@@ -73,6 +74,7 @@ struct skl {
struct
skl_debug
*
debugfs
;
u8
nr_modules
;
struct
skl_module
**
modules
;
bool
use_tplg_pcm
;
};
#define skl_to_ebus(s) (&(s)->ebus)
...
...
@@ -85,9 +87,9 @@ struct skl_dma_params {
u8
stream_tag
;
};
/* to pass dmic data */
struct
skl_machine_pdata
{
u32
dmic_num
;
bool
use_tplg_pcm
;
/* use dais and dai links from topology */
};
struct
skl_dsp_ops
{
...
...
sound/soc/
intel/common/sst-match
-acpi.c
→
sound/soc/
soc
-acpi.c
View file @
c44ff31a
/*
* s
st_match_apci.c - SST (LPE) match
for ACPI enumeration.
* s
oc-apci.c - support
for ACPI enumeration.
*
* Copyright (c) 2013-15, Intel Corporation.
*
...
...
@@ -14,9 +14,9 @@
* more details.
*/
#include
"sst-acpi.h"
#include
<sound/soc-acpi.h>
static
acpi_status
s
st
_acpi_find_name
(
acpi_handle
handle
,
u32
level
,
static
acpi_status
s
nd_soc
_acpi_find_name
(
acpi_handle
handle
,
u32
level
,
void
*
context
,
void
**
ret
)
{
struct
acpi_device
*
adev
;
...
...
@@ -34,12 +34,12 @@ static acpi_status sst_acpi_find_name(acpi_handle handle, u32 level,
return
AE_OK
;
}
const
char
*
s
st
_acpi_find_name_from_hid
(
const
u8
hid
[
ACPI_ID_LEN
])
const
char
*
s
nd_soc
_acpi_find_name_from_hid
(
const
u8
hid
[
ACPI_ID_LEN
])
{
const
char
*
name
=
NULL
;
acpi_status
status
;
status
=
acpi_get_devices
(
hid
,
s
st
_acpi_find_name
,
NULL
,
status
=
acpi_get_devices
(
hid
,
s
nd_soc
_acpi_find_name
,
NULL
,
(
void
**
)
&
name
);
if
(
ACPI_FAILURE
(
status
)
||
name
[
0
]
==
'\0'
)
...
...
@@ -47,9 +47,9 @@ const char *sst_acpi_find_name_from_hid(const u8 hid[ACPI_ID_LEN])
return
name
;
}
EXPORT_SYMBOL_GPL
(
s
st
_acpi_find_name_from_hid
);
EXPORT_SYMBOL_GPL
(
s
nd_soc
_acpi_find_name_from_hid
);
static
acpi_status
s
st
_acpi_mach_match
(
acpi_handle
handle
,
u32
level
,
static
acpi_status
s
nd_soc
_acpi_mach_match
(
acpi_handle
handle
,
u32
level
,
void
*
context
,
void
**
ret
)
{
unsigned
long
long
sta
;
...
...
@@ -63,26 +63,27 @@ static acpi_status sst_acpi_mach_match(acpi_handle handle, u32 level,
return
AE_OK
;
}
bool
s
st
_acpi_check_hid
(
const
u8
hid
[
ACPI_ID_LEN
])
bool
s
nd_soc
_acpi_check_hid
(
const
u8
hid
[
ACPI_ID_LEN
])
{
acpi_status
status
;
bool
found
=
false
;
status
=
acpi_get_devices
(
hid
,
s
st
_acpi_mach_match
,
&
found
,
NULL
);
status
=
acpi_get_devices
(
hid
,
s
nd_soc
_acpi_mach_match
,
&
found
,
NULL
);
if
(
ACPI_FAILURE
(
status
))
return
false
;
return
found
;
}
EXPORT_SYMBOL_GPL
(
s
st
_acpi_check_hid
);
EXPORT_SYMBOL_GPL
(
s
nd_soc
_acpi_check_hid
);
struct
sst_acpi_mach
*
sst_acpi_find_machine
(
struct
sst_acpi_mach
*
machines
)
struct
snd_soc_acpi_mach
*
snd_soc_acpi_find_machine
(
struct
snd_soc_acpi_mach
*
machines
)
{
struct
s
st
_acpi_mach
*
mach
;
struct
s
nd_soc
_acpi_mach
*
mach
;
for
(
mach
=
machines
;
mach
->
id
[
0
];
mach
++
)
{
if
(
s
st
_acpi_check_hid
(
mach
->
id
)
==
true
)
{
if
(
s
nd_soc
_acpi_check_hid
(
mach
->
id
)
==
true
)
{
if
(
mach
->
machine_quirk
==
NULL
)
return
mach
;
...
...
@@ -92,14 +93,14 @@ struct sst_acpi_mach *sst_acpi_find_machine(struct sst_acpi_mach *machines)
}
return
NULL
;
}
EXPORT_SYMBOL_GPL
(
s
st
_acpi_find_machine
);
EXPORT_SYMBOL_GPL
(
s
nd_soc
_acpi_find_machine
);
static
acpi_status
s
st
_acpi_find_package
(
acpi_handle
handle
,
u32
level
,
void
*
context
,
void
**
ret
)
static
acpi_status
s
nd_soc
_acpi_find_package
(
acpi_handle
handle
,
u32
level
,
void
*
context
,
void
**
ret
)
{
struct
acpi_device
*
adev
;
acpi_status
status
=
AE_OK
;
struct
s
st
_acpi_package_context
*
pkg_ctx
=
context
;
struct
s
nd_soc
_acpi_package_context
*
pkg_ctx
=
context
;
pkg_ctx
->
data_valid
=
false
;
...
...
@@ -137,37 +138,38 @@ static acpi_status sst_acpi_find_package(acpi_handle handle, u32 level,
return
AE_OK
;
}
bool
s
st
_acpi_find_package_from_hid
(
const
u8
hid
[
ACPI_ID_LEN
],
struct
s
st
_acpi_package_context
*
ctx
)
bool
s
nd_soc
_acpi_find_package_from_hid
(
const
u8
hid
[
ACPI_ID_LEN
],
struct
s
nd_soc
_acpi_package_context
*
ctx
)
{
acpi_status
status
;
status
=
acpi_get_devices
(
hid
,
s
st
_acpi_find_package
,
ctx
,
NULL
);
status
=
acpi_get_devices
(
hid
,
s
nd_soc
_acpi_find_package
,
ctx
,
NULL
);
if
(
ACPI_FAILURE
(
status
)
||
!
ctx
->
data_valid
)
return
false
;
return
true
;
}
EXPORT_SYMBOL_GPL
(
s
st
_acpi_find_package_from_hid
);
EXPORT_SYMBOL_GPL
(
s
nd_soc
_acpi_find_package_from_hid
);
struct
s
st_acpi_mach
*
sst
_acpi_codec_list
(
void
*
arg
)
struct
s
nd_soc_acpi_mach
*
snd_soc
_acpi_codec_list
(
void
*
arg
)
{
struct
sst_acpi_mach
*
mach
=
arg
;
struct
sst_codecs
*
codec_list
=
(
struct
sst_codecs
*
)
mach
->
quirk_data
;
struct
snd_soc_acpi_mach
*
mach
=
arg
;
struct
snd_soc_acpi_codecs
*
codec_list
=
(
struct
snd_soc_acpi_codecs
*
)
mach
->
quirk_data
;
int
i
;
if
(
mach
->
quirk_data
==
NULL
)
return
mach
;
for
(
i
=
0
;
i
<
codec_list
->
num_codecs
;
i
++
)
{
if
(
s
st
_acpi_check_hid
(
codec_list
->
codecs
[
i
])
!=
true
)
if
(
s
nd_soc
_acpi_check_hid
(
codec_list
->
codecs
[
i
])
!=
true
)
return
NULL
;
}
return
mach
;
}
EXPORT_SYMBOL_GPL
(
s
st
_acpi_codec_list
);
EXPORT_SYMBOL_GPL
(
s
nd_soc
_acpi_codec_list
);
MODULE_LICENSE
(
"GPL v2"
);
MODULE_DESCRIPTION
(
"
Intel Common ACPI Match
module"
);
MODULE_DESCRIPTION
(
"
ALSA SoC ACPI
module"
);
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