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
b68cbc1d
Commit
b68cbc1d
authored
Jan 18, 2018
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'asoc/topic/intel' into asoc-next
parents
49fdfe36
e29a22a8
Changes
44
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
44 changed files
with
1071 additions
and
1957 deletions
+1071
-1957
drivers/acpi/utils.c
drivers/acpi/utils.c
+34
-7
drivers/gpio/gpio-merrifield.c
drivers/gpio/gpio-merrifield.c
+10
-1
include/acpi/acpi_bus.h
include/acpi/acpi_bus.h
+3
-0
include/linux/acpi.h
include/linux/acpi.h
+6
-0
include/sound/hdaudio_ext.h
include/sound/hdaudio_ext.h
+2
-2
include/sound/soc-acpi.h
include/sound/soc-acpi.h
+3
-10
include/uapi/sound/snd_sst_tokens.h
include/uapi/sound/snd_sst_tokens.h
+16
-1
sound/hda/ext/hdac_ext_bus.c
sound/hda/ext/hdac_ext_bus.c
+1
-1
sound/soc/codecs/Kconfig
sound/soc/codecs/Kconfig
+0
-4
sound/soc/codecs/Makefile
sound/soc/codecs/Makefile
+0
-1
sound/soc/codecs/hdac_hdmi.c
sound/soc/codecs/hdac_hdmi.c
+175
-181
sound/soc/codecs/sn95031.c
sound/soc/codecs/sn95031.c
+0
-936
sound/soc/codecs/sn95031.h
sound/soc/codecs/sn95031.h
+0
-133
sound/soc/intel/Kconfig
sound/soc/intel/Kconfig
+83
-32
sound/soc/intel/Makefile
sound/soc/intel/Makefile
+1
-1
sound/soc/intel/atom/sst/sst_acpi.c
sound/soc/intel/atom/sst/sst_acpi.c
+3
-0
sound/soc/intel/atom/sst/sst_stream.c
sound/soc/intel/atom/sst/sst_stream.c
+4
-4
sound/soc/intel/boards/Kconfig
sound/soc/intel/boards/Kconfig
+95
-100
sound/soc/intel/boards/bytcht_da7213.c
sound/soc/intel/boards/bytcht_da7213.c
+2
-2
sound/soc/intel/boards/bytcht_es8316.c
sound/soc/intel/boards/bytcht_es8316.c
+25
-1
sound/soc/intel/boards/bytcr_rt5640.c
sound/soc/intel/boards/bytcr_rt5640.c
+2
-2
sound/soc/intel/boards/bytcr_rt5651.c
sound/soc/intel/boards/bytcr_rt5651.c
+45
-5
sound/soc/intel/boards/cht_bsw_rt5645.c
sound/soc/intel/boards/cht_bsw_rt5645.c
+3
-3
sound/soc/intel/boards/cht_bsw_rt5672.c
sound/soc/intel/boards/cht_bsw_rt5672.c
+2
-2
sound/soc/intel/boards/haswell.c
sound/soc/intel/boards/haswell.c
+1
-1
sound/soc/intel/boards/kbl_rt5663_max98927.c
sound/soc/intel/boards/kbl_rt5663_max98927.c
+1
-1
sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c
sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c
+1
-1
sound/soc/intel/boards/mfld_machine.c
sound/soc/intel/boards/mfld_machine.c
+0
-428
sound/soc/intel/common/sst-dsp.c
sound/soc/intel/common/sst-dsp.c
+1
-3
sound/soc/intel/skylake/bxt-sst.c
sound/soc/intel/skylake/bxt-sst.c
+1
-1
sound/soc/intel/skylake/cnl-sst.c
sound/soc/intel/skylake/cnl-sst.c
+1
-1
sound/soc/intel/skylake/skl-i2s.h
sound/soc/intel/skylake/skl-i2s.h
+64
-0
sound/soc/intel/skylake/skl-messages.c
sound/soc/intel/skylake/skl-messages.c
+22
-0
sound/soc/intel/skylake/skl-nhlt.c
sound/soc/intel/skylake/skl-nhlt.c
+155
-0
sound/soc/intel/skylake/skl-pcm.c
sound/soc/intel/skylake/skl-pcm.c
+12
-2
sound/soc/intel/skylake/skl-ssp-clk.h
sound/soc/intel/skylake/skl-ssp-clk.h
+79
-0
sound/soc/intel/skylake/skl-sst-dsp.c
sound/soc/intel/skylake/skl-sst-dsp.c
+10
-4
sound/soc/intel/skylake/skl-sst-dsp.h
sound/soc/intel/skylake/skl-sst-dsp.h
+4
-0
sound/soc/intel/skylake/skl-sst-utils.c
sound/soc/intel/skylake/skl-sst-utils.c
+4
-2
sound/soc/intel/skylake/skl-sst.c
sound/soc/intel/skylake/skl-sst.c
+1
-1
sound/soc/intel/skylake/skl-topology.c
sound/soc/intel/skylake/skl-topology.c
+43
-2
sound/soc/intel/skylake/skl.c
sound/soc/intel/skylake/skl.c
+132
-18
sound/soc/intel/skylake/skl.h
sound/soc/intel/skylake/skl.h
+22
-0
sound/soc/soc-acpi.c
sound/soc/soc-acpi.c
+2
-63
No files found.
drivers/acpi/utils.c
View file @
b68cbc1d
...
...
@@ -737,16 +737,17 @@ bool acpi_dev_found(const char *hid)
}
EXPORT_SYMBOL
(
acpi_dev_found
);
struct
acpi_dev_present_info
{
struct
acpi_dev_match_info
{
const
char
*
dev_name
;
struct
acpi_device_id
hid
[
2
];
const
char
*
uid
;
s64
hrv
;
};
static
int
acpi_dev_
present
_cb
(
struct
device
*
dev
,
void
*
data
)
static
int
acpi_dev_
match
_cb
(
struct
device
*
dev
,
void
*
data
)
{
struct
acpi_device
*
adev
=
to_acpi_device
(
dev
);
struct
acpi_dev_
present
_info
*
match
=
data
;
struct
acpi_dev_
match
_info
*
match
=
data
;
unsigned
long
long
hrv
;
acpi_status
status
;
...
...
@@ -757,6 +758,8 @@ static int acpi_dev_present_cb(struct device *dev, void *data)
strcmp
(
adev
->
pnp
.
unique_id
,
match
->
uid
)))
return
0
;
match
->
dev_name
=
acpi_dev_name
(
adev
);
if
(
match
->
hrv
==
-
1
)
return
1
;
...
...
@@ -789,20 +792,44 @@ static int acpi_dev_present_cb(struct device *dev, void *data)
*/
bool
acpi_dev_present
(
const
char
*
hid
,
const
char
*
uid
,
s64
hrv
)
{
struct
acpi_dev_
present
_info
match
=
{};
struct
acpi_dev_
match
_info
match
=
{};
struct
device
*
dev
;
strlcpy
(
match
.
hid
[
0
].
id
,
hid
,
sizeof
(
match
.
hid
[
0
].
id
));
match
.
uid
=
uid
;
match
.
hrv
=
hrv
;
dev
=
bus_find_device
(
&
acpi_bus_type
,
NULL
,
&
match
,
acpi_dev_present_cb
);
dev
=
bus_find_device
(
&
acpi_bus_type
,
NULL
,
&
match
,
acpi_dev_match_cb
);
return
!!
dev
;
}
EXPORT_SYMBOL
(
acpi_dev_present
);
/**
* acpi_dev_get_first_match_name - Return name of first match of ACPI device
* @hid: Hardware ID of the device.
* @uid: Unique ID of the device, pass NULL to not check _UID
* @hrv: Hardware Revision of the device, pass -1 to not check _HRV
*
* Return device name if a matching device was present
* at the moment of invocation, or NULL otherwise.
*
* See additional information in acpi_dev_present() as well.
*/
const
char
*
acpi_dev_get_first_match_name
(
const
char
*
hid
,
const
char
*
uid
,
s64
hrv
)
{
struct
acpi_dev_match_info
match
=
{};
struct
device
*
dev
;
strlcpy
(
match
.
hid
[
0
].
id
,
hid
,
sizeof
(
match
.
hid
[
0
].
id
));
match
.
uid
=
uid
;
match
.
hrv
=
hrv
;
dev
=
bus_find_device
(
&
acpi_bus_type
,
NULL
,
&
match
,
acpi_dev_match_cb
);
return
dev
?
match
.
dev_name
:
NULL
;
}
EXPORT_SYMBOL
(
acpi_dev_get_first_match_name
);
/*
* acpi_backlight= handling, this is done here rather then in video_detect.c
* because __setup cannot be used in modules.
...
...
drivers/gpio/gpio-merrifield.c
View file @
b68cbc1d
...
...
@@ -9,6 +9,7 @@
* published by the Free Software Foundation.
*/
#include <linux/acpi.h>
#include <linux/bitops.h>
#include <linux/gpio/driver.h>
#include <linux/init.h>
...
...
@@ -380,9 +381,16 @@ static void mrfld_irq_init_hw(struct mrfld_gpio *priv)
}
}
static
const
char
*
mrfld_gpio_get_pinctrl_dev_name
(
void
)
{
const
char
*
dev_name
=
acpi_dev_get_first_match_name
(
"INTC1002"
,
NULL
,
-
1
);
return
dev_name
?
dev_name
:
"pinctrl-merrifield"
;
}
static
int
mrfld_gpio_probe
(
struct
pci_dev
*
pdev
,
const
struct
pci_device_id
*
id
)
{
const
struct
mrfld_gpio_pinrange
*
range
;
const
char
*
pinctrl_dev_name
;
struct
mrfld_gpio
*
priv
;
u32
gpio_base
,
irq_base
;
void
__iomem
*
base
;
...
...
@@ -439,10 +447,11 @@ static int mrfld_gpio_probe(struct pci_dev *pdev, const struct pci_device_id *id
return
retval
;
}
pinctrl_dev_name
=
mrfld_gpio_get_pinctrl_dev_name
();
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
mrfld_gpio_ranges
);
i
++
)
{
range
=
&
mrfld_gpio_ranges
[
i
];
retval
=
gpiochip_add_pin_range
(
&
priv
->
chip
,
"pinctrl-merrifield"
,
pinctrl_dev_name
,
range
->
gpio_base
,
range
->
pin_base
,
range
->
npins
);
...
...
include/acpi/acpi_bus.h
View file @
b68cbc1d
...
...
@@ -91,6 +91,9 @@ acpi_evaluate_dsm_typed(acpi_handle handle, const guid_t *guid, u64 rev,
bool
acpi_dev_found
(
const
char
*
hid
);
bool
acpi_dev_present
(
const
char
*
hid
,
const
char
*
uid
,
s64
hrv
);
const
char
*
acpi_dev_get_first_match_name
(
const
char
*
hid
,
const
char
*
uid
,
s64
hrv
);
#ifdef CONFIG_ACPI
#include <linux/proc_fs.h>
...
...
include/linux/acpi.h
View file @
b68cbc1d
...
...
@@ -640,6 +640,12 @@ static inline bool acpi_dev_present(const char *hid, const char *uid, s64 hrv)
return
false
;
}
static
inline
const
char
*
acpi_dev_get_first_match_name
(
const
char
*
hid
,
const
char
*
uid
,
s64
hrv
)
{
return
NULL
;
}
static
inline
bool
is_acpi_node
(
struct
fwnode_handle
*
fwnode
)
{
return
false
;
...
...
include/sound/hdaudio_ext.h
View file @
b68cbc1d
...
...
@@ -193,7 +193,7 @@ struct hda_dai_map {
* @pvt_data - private data, for asoc contains asoc codec object
*/
struct
hdac_ext_device
{
struct
hdac_device
hd
ac
;
struct
hdac_device
hd
ev
;
struct
hdac_ext_bus
*
ebus
;
/* soc-dai to nid map */
...
...
@@ -213,7 +213,7 @@ struct hdac_ext_dma_params {
u8
stream_tag
;
};
#define to_ehdac_device(dev) (container_of((dev), \
struct hdac_ext_device, hd
ac
))
struct hdac_ext_device, hd
ev
))
/*
* HD-audio codec base driver
*/
...
...
include/sound/soc-acpi.h
View file @
b68cbc1d
...
...
@@ -27,17 +27,13 @@ struct snd_soc_acpi_package_context {
bool
data_valid
;
};
/* codec name is used in DAIs is i2c-<HID>:00 with HID being 8 chars */
#define SND_ACPI_I2C_ID_LEN (4 + ACPI_ID_LEN + 3 + 1)
#if IS_ENABLED(CONFIG_ACPI)
/* translation fron HID to I2C name, needed for DAI codec_name */
const
char
*
snd_soc_acpi_find_name_from_hid
(
const
u8
hid
[
ACPI_ID_LEN
]);
bool
snd_soc_acpi_find_package_from_hid
(
const
u8
hid
[
ACPI_ID_LEN
],
struct
snd_soc_acpi_package_context
*
ctx
);
#else
static
inline
const
char
*
snd_soc_acpi_find_name_from_hid
(
const
u8
hid
[
ACPI_ID_LEN
])
{
return
NULL
;
}
static
inline
bool
snd_soc_acpi_find_package_from_hid
(
const
u8
hid
[
ACPI_ID_LEN
],
struct
snd_soc_acpi_package_context
*
ctx
)
...
...
@@ -50,9 +46,6 @@ snd_soc_acpi_find_package_from_hid(const u8 hid[ACPI_ID_LEN],
struct
snd_soc_acpi_mach
*
snd_soc_acpi_find_machine
(
struct
snd_soc_acpi_mach
*
machines
);
/* acpi check hid */
bool
snd_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.
...
...
include/uapi/sound/snd_sst_tokens.h
View file @
b68cbc1d
...
...
@@ -222,6 +222,17 @@
* %SKL_TKN_MM_U32_NUM_IN_FMT: Number of input formats
* %SKL_TKN_MM_U32_NUM_OUT_FMT: Number of output formats
*
* %SKL_TKN_U32_ASTATE_IDX: Table Index for the A-State entry to be filled
* with kcps and clock source
*
* %SKL_TKN_U32_ASTATE_COUNT: Number of valid entries in A-State table
*
* %SKL_TKN_U32_ASTATE_KCPS: Specifies the core load threshold (in kilo
* cycles per second) below which DSP is clocked
* from source specified by clock source.
*
* %SKL_TKN_U32_ASTATE_CLK_SRC: Clock source for A-State entry
*
* module_id and loadable flags dont have tokens as these values will be
* read from the DSP FW manifest
*
...
...
@@ -309,7 +320,11 @@ enum SKL_TKNS {
SKL_TKN_MM_U32_NUM_IN_FMT
,
SKL_TKN_MM_U32_NUM_OUT_FMT
,
SKL_TKN_MAX
=
SKL_TKN_MM_U32_NUM_OUT_FMT
,
SKL_TKN_U32_ASTATE_IDX
,
SKL_TKN_U32_ASTATE_COUNT
,
SKL_TKN_U32_ASTATE_KCPS
,
SKL_TKN_U32_ASTATE_CLK_SRC
,
SKL_TKN_MAX
=
SKL_TKN_U32_ASTATE_CLK_SRC
,
};
#endif
sound/hda/ext/hdac_ext_bus.c
View file @
b68cbc1d
...
...
@@ -146,7 +146,7 @@ int snd_hdac_ext_bus_device_init(struct hdac_ext_bus *ebus, int addr)
edev
=
kzalloc
(
sizeof
(
*
edev
),
GFP_KERNEL
);
if
(
!
edev
)
return
-
ENOMEM
;
hdev
=
&
edev
->
hd
ac
;
hdev
=
&
edev
->
hd
ev
;
edev
->
ebus
=
ebus
;
snprintf
(
name
,
sizeof
(
name
),
"ehdaudio%dD%d"
,
ebus
->
idx
,
addr
);
...
...
sound/soc/codecs/Kconfig
View file @
b68cbc1d
...
...
@@ -133,7 +133,6 @@ config SND_SOC_ALL_CODECS
select SND_SOC_SGTL5000 if I2C
select SND_SOC_SI476X if MFD_SI476X_CORE
select SND_SOC_SIRF_AUDIO_CODEC
select SND_SOC_SN95031 if INTEL_SCU_IPC
select SND_SOC_SPDIF
select SND_SOC_SSM2518 if I2C
select SND_SOC_SSM2602_SPI if SPI_MASTER
...
...
@@ -818,9 +817,6 @@ config SND_SOC_SIRF_AUDIO_CODEC
tristate "SiRF SoC internal audio codec"
select REGMAP_MMIO
config SND_SOC_SN95031
tristate
config SND_SOC_SPDIF
tristate "S/PDIF CODEC"
...
...
sound/soc/codecs/Makefile
View file @
b68cbc1d
...
...
@@ -140,7 +140,6 @@ snd-soc-sigmadsp-i2c-objs := sigmadsp-i2c.o
snd-soc-sigmadsp-regmap-objs
:=
sigmadsp-regmap.o
snd-soc-si476x-objs
:=
si476x.o
snd-soc-sirf-audio-codec-objs
:=
sirf-audio-codec.o
snd-soc-sn95031-objs
:=
sn95031.o
snd-soc-spdif-tx-objs
:=
spdif_transmitter.o
snd-soc-spdif-rx-objs
:=
spdif_receiver.o
snd-soc-ssm2518-objs
:=
ssm2518.o
...
...
sound/soc/codecs/hdac_hdmi.c
View file @
b68cbc1d
This diff is collapsed.
Click to expand it.
sound/soc/codecs/sn95031.c
deleted
100644 → 0
View file @
49fdfe36
This diff is collapsed.
Click to expand it.
sound/soc/codecs/sn95031.h
deleted
100644 → 0
View file @
49fdfe36
/*
* sn95031.h - TI sn95031 Codec driver
*
* Copyright (C) 2010 Intel Corp
* Author: Vinod Koul <vinod.koul@intel.com>
* Author: Harsha Priya <priya.harsha@intel.com>
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* 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.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
*
*/
#ifndef _SN95031_H
#define _SN95031_H
/*register map*/
#define SN95031_VAUD 0xDB
#define SN95031_VHSP 0xDC
#define SN95031_VHSN 0xDD
#define SN95031_VIHF 0xC9
#define SN95031_AUDPLLCTRL 0x240
#define SN95031_DMICBUF0123 0x241
#define SN95031_DMICBUF45 0x242
#define SN95031_DMICGPO 0x244
#define SN95031_DMICMUX 0x245
#define SN95031_DMICLK 0x246
#define SN95031_MICBIAS 0x247
#define SN95031_ADCCONFIG 0x248
#define SN95031_MICAMP1 0x249
#define SN95031_MICAMP2 0x24A
#define SN95031_NOISEMUX 0x24B
#define SN95031_AUDIOMUX12 0x24C
#define SN95031_AUDIOMUX34 0x24D
#define SN95031_AUDIOSINC 0x24E
#define SN95031_AUDIOTXEN 0x24F
#define SN95031_HSEPRXCTRL 0x250
#define SN95031_IHFRXCTRL 0x251
#define SN95031_HSMIXER 0x256
#define SN95031_DACCONFIG 0x257
#define SN95031_SOFTMUTE 0x258
#define SN95031_HSLVOLCTRL 0x259
#define SN95031_HSRVOLCTRL 0x25A
#define SN95031_IHFLVOLCTRL 0x25B
#define SN95031_IHFRVOLCTRL 0x25C
#define SN95031_DRIVEREN 0x25D
#define SN95031_LOCTL 0x25E
#define SN95031_VIB1C1 0x25F
#define SN95031_VIB1C2 0x260
#define SN95031_VIB1C3 0x261
#define SN95031_VIB1SPIPCM1 0x262
#define SN95031_VIB1SPIPCM2 0x263
#define SN95031_VIB1C5 0x264
#define SN95031_VIB2C1 0x265
#define SN95031_VIB2C2 0x266
#define SN95031_VIB2C3 0x267
#define SN95031_VIB2SPIPCM1 0x268
#define SN95031_VIB2SPIPCM2 0x269
#define SN95031_VIB2C5 0x26A
#define SN95031_BTNCTRL1 0x26B
#define SN95031_BTNCTRL2 0x26C
#define SN95031_PCM1TXSLOT01 0x26D
#define SN95031_PCM1TXSLOT23 0x26E
#define SN95031_PCM1TXSLOT45 0x26F
#define SN95031_PCM1RXSLOT0_3 0x270
#define SN95031_PCM1RXSLOT45 0x271
#define SN95031_PCM2TXSLOT01 0x272
#define SN95031_PCM2TXSLOT23 0x273
#define SN95031_PCM2TXSLOT45 0x274
#define SN95031_PCM2RXSLOT01 0x275
#define SN95031_PCM2RXSLOT23 0x276
#define SN95031_PCM2RXSLOT45 0x277
#define SN95031_PCM1C1 0x278
#define SN95031_PCM1C2 0x279
#define SN95031_PCM1C3 0x27A
#define SN95031_PCM2C1 0x27B
#define SN95031_PCM2C2 0x27C
/*end codec register defn*/
/*vendor defn these are not part of avp*/
#define SN95031_SSR2 0x381
#define SN95031_SSR3 0x382
#define SN95031_SSR5 0x384
#define SN95031_SSR6 0x385
/* ADC registers */
#define SN95031_ADC1CNTL1 0x1C0
#define SN95031_ADC_ENBL 0x10
#define SN95031_ADC_START 0x08
#define SN95031_ADC1CNTL3 0x1C2
#define SN95031_ADCTHERM_ENBL 0x04
#define SN95031_ADCRRDATA_ENBL 0x05
#define SN95031_STOPBIT_MASK 16
#define SN95031_ADCTHERM_MASK 4
#define SN95031_ADC_CHANLS_MAX 15
/* Number of ADC channels */
#define SN95031_ADC_LOOP_MAX (SN95031_ADC_CHANLS_MAX - 1)
#define SN95031_ADC_NO_LOOP 0x07
#define SN95031_AUDIO_GPIO_CTRL 0x070
/* ADC channel code values */
#define SN95031_AUDIO_DETECT_CODE 0x06
/* ADC base addresses */
#define SN95031_ADC_CHNL_START_ADDR 0x1C5
/* increments by 1 */
#define SN95031_ADC_DATA_START_ADDR 0x1D4
/* increments by 2 */
/* multipier to convert to mV */
#define SN95031_ADC_ONE_LSB_MULTIPLIER 2346
struct
mfld_jack_data
{
int
intr_id
;
int
micbias_vol
;
struct
snd_soc_jack
*
mfld_jack
;
};
extern
void
sn95031_jack_detection
(
struct
snd_soc_codec
*
codec
,
struct
mfld_jack_data
*
jack_data
);
#endif
sound/soc/intel/Kconfig
View file @
b68cbc1d
config SND_SOC_INTEL_SST_TOPLEVEL
bool "Intel ASoC SST drivers"
default y
depends on X86 || COMPILE_TEST
select SND_SOC_INTEL_MACH
help
Intel ASoC SST Platform Drivers. If you have a Intel machine that
has an audio controller with a DSP and I2S or DMIC port, then
enable this option by saying Y
Note that the answer to this question doesn't directly affect the
kernel: saying N will just cause the configurator to skip all
the questions about Intel SST drivers.
if SND_SOC_INTEL_SST_TOPLEVEL
config SND_SST_IPC
tristate
# This option controls the IPC core for HiFi2 platforms
config SND_SST_IPC_PCI
tristate
select SND_SST_IPC
# This option controls the PCI-based IPC for HiFi2 platforms
# (Medfield, Merrifield).
config SND_SST_IPC_ACPI
tristate
select SND_SST_IPC
select SND_SOC_INTEL_SST
select IOSF_MBI
# This option controls the ACPI-based IPC for HiFi2 platforms
# (Baytrail, Cherrytrail)
config SND_SOC_INTEL_
COMMON
config SND_SOC_INTEL_
SST_ACPI
tristate
# This option controls ACPI-based probing on
# Haswell/Broadwell/Baytrail legacy and will be set
# when these platforms are enabled
config SND_SOC_INTEL_SST
tristate
select SND_SOC_INTEL_SST_ACPI if ACPI
config SND_SOC_INTEL_SST_FIRMWARE
tristate
select DW_DMAC_CORE
config SND_SOC_INTEL_SST_ACPI
tristate
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
help
Intel ASoC Audio Drivers. If you have a Intel machine that
has audio controller with a DSP and I2S or DMIC port, then
enable this option by saying Y or M
If unsure select "N".
# This option controls firmware download on
# Haswell/Broadwell/Baytrail legacy and will be set
# when these platforms are enabled
config SND_SOC_INTEL_HASWELL
tristate "
Intel ASoC SST driver for Haswell/Broadwell
"
depends on SND_
SOC_INTEL_SST_TOPLEVEL && SND_
DMA_SGBUF
depends on DMADEVICES
tristate "
Haswell/Broadwell Platforms
"
depends on SND_DMA_SGBUF
depends on DMADEVICES
&& ACPI
select SND_SOC_INTEL_SST
select SND_SOC_INTEL_SST_ACPI
select SND_SOC_INTEL_SST_FIRMWARE
select SND_SOC_ACPI_INTEL_MATCH
help
If you have a Intel Haswell or Broadwell platform connected to
an I2S codec, then enable this option by saying Y or m. This is
typically used for Chromebooks. This is a recommended option.
config SND_SOC_INTEL_BAYTRAIL
tristate "Intel ASoC SST driver for Baytrail (legacy)"
depends on SND_SOC_INTEL_SST_TOPLEVEL
depends on DMADEVICES
tristate "Baytrail (legacy) Platforms"
depends on DMADEVICES && ACPI
select SND_SOC_INTEL_SST
select SND_SOC_INTEL_SST_ACPI
select SND_SOC_INTEL_SST_FIRMWARE
select SND_SOC_ACPI_INTEL_MATCH
help
If you have a Intel Baytrail platform connected to an I2S codec,
then enable this option by saying Y or m. This was typically used
for Baytrail Chromebooks but this option is now deprecated and is
not recommended, use SND_SST_ATOM_HIFI2_PLATFORM instead.
config SND_SST_ATOM_HIFI2_PLATFORM_PCI
tristate "PCI HiFi2 (Medfield, Merrifield) Platforms"
depends on X86 && PCI
select SND_SST_IPC_PCI
select SND_SOC_COMPRESS
help
If you have a Intel Medfield or Merrifield/Edison platform, then
enable this option by saying Y or m. Distros will typically not
enable this option: Medfield devices are not available to
developers and while Merrifield/Edison can run a mainline kernel with
limited functionality it will require a firmware file which
is not in the standard firmware tree
config SND_SST_ATOM_HIFI2_PLATFORM
tristate "Intel ASoC SST driver for HiFi2 platforms (*field, *trail)"
depends on SND_SOC_INTEL_SST_TOPLEVEL && X86
tristate "ACPI HiFi2 (Baytrail, Cherrytrail) Platforms"
depends on X86 && ACPI
select SND_SST_IPC_ACPI
select SND_SOC_COMPRESS
select SND_SOC_ACPI_INTEL_MATCH
select IOSF_MBI
help
If you have a Intel Baytrail or Cherrytrail platform with an I2S
codec, then enable this option by saying Y or m. This is a
recommended option
config SND_SOC_INTEL_SKYLAKE
tristate "
Intel ASoC SST driver for SKL/BXT/KBL/GLK/CNL
"
depends on
SND_SOC_INTEL_SST_TOPLEVEL &&
PCI && ACPI
tristate "
SKL/BXT/KBL/GLK/CNL... Platforms
"
depends on PCI && ACPI
select SND_HDA_EXT_CORE
select SND_HDA_DSP_LOADER
select SND_SOC_TOPOLOGY
select SND_SOC_INTEL_SST
select SND_SOC_ACPI_INTEL_MATCH
help
If you have a Intel Skylake/Broxton/ApolloLake/KabyLake/
GeminiLake or CannonLake platform with the DSP enabled in the BIOS
then enable this option by saying Y or m.
config SND_SOC_ACPI_INTEL_MATCH
tristate
select SND_SOC_ACPI if ACPI
# this option controls the compilation of ACPI matching tables and
# helpers and is not meant to be selected by the user.
endif ## SND_SOC_INTEL_SST_TOPLEVEL
# ASoC codec drivers
source "sound/soc/intel/boards/Kconfig"
sound/soc/intel/Makefile
View file @
b68cbc1d
# SPDX-License-Identifier: GPL-2.0
# Core support
obj-$(CONFIG_SND_SOC
_INTEL_COMMON
)
+=
common/
obj-$(CONFIG_SND_SOC)
+=
common/
# Platform Support
obj-$(CONFIG_SND_SOC_INTEL_HASWELL)
+=
haswell/
...
...
sound/soc/intel/atom/sst/sst_acpi.c
View file @
b68cbc1d
...
...
@@ -236,6 +236,9 @@ static int sst_platform_get_resources(struct intel_sst_drv *ctx)
/* Find the IRQ */
ctx
->
irq_num
=
platform_get_irq
(
pdev
,
ctx
->
pdata
->
res_info
->
acpi_ipc_irq_index
);
if
(
ctx
->
irq_num
<=
0
)
return
ctx
->
irq_num
<
0
?
ctx
->
irq_num
:
-
EIO
;
return
0
;
}
...
...
sound/soc/intel/atom/sst/sst_stream.c
View file @
b68cbc1d
...
...
@@ -220,10 +220,10 @@ int sst_send_byte_stream_mrfld(struct intel_sst_drv *sst_drv_ctx,
sst_free_block
(
sst_drv_ctx
,
block
);
out:
test_and_clear_bit
(
pvt_id
,
&
sst_drv_ctx
->
pvt_id
);
return
0
;
return
ret
;
}
/*
/*
*
* sst_pause_stream - Send msg for a pausing stream
* @str_id: stream ID
*
...
...
@@ -261,7 +261,7 @@ int sst_pause_stream(struct intel_sst_drv *sst_drv_ctx, int str_id)
}
}
else
{
retval
=
-
EBADRQC
;
dev_dbg
(
sst_drv_ctx
->
dev
,
"SST DBG:BADRQC for stream
\n
"
);
dev_dbg
(
sst_drv_ctx
->
dev
,
"SST DBG:BADRQC for stream
\n
"
);
}
return
retval
;
...
...
@@ -284,7 +284,7 @@ int sst_resume_stream(struct intel_sst_drv *sst_drv_ctx, int str_id)
if
(
!
str_info
)
return
-
EINVAL
;
if
(
str_info
->
status
==
STREAM_RUNNING
)
return
0
;
return
0
;
if
(
str_info
->
status
==
STREAM_PAUSED
)
{
retval
=
sst_prepare_and_post_msg
(
sst_drv_ctx
,
str_info
->
task_id
,
IPC_CMD
,
IPC_IA_RESUME_STREAM_MRFLD
,
...
...
sound/soc/intel/boards/Kconfig
View file @
b68cbc1d
This diff is collapsed.
Click to expand it.
sound/soc/intel/boards/bytcht_da7213.c
View file @
b68cbc1d
...
...
@@ -219,7 +219,7 @@ static struct snd_soc_card bytcht_da7213_card = {
.
num_dapm_routes
=
ARRAY_SIZE
(
audio_map
),
};
static
char
codec_name
[
16
];
/* i2c-<HID>:00 with HID being 8 chars */
static
char
codec_name
[
SND_ACPI_I2C_ID_LEN
];
static
int
bytcht_da7213_probe
(
struct
platform_device
*
pdev
)
{
...
...
@@ -243,7 +243,7 @@ static int bytcht_da7213_probe(struct platform_device *pdev)
}
/* fixup codec name based on HID */
i2c_name
=
snd_soc_acpi_find_name_from_hid
(
mach
->
id
);
i2c_name
=
acpi_dev_get_first_match_name
(
mach
->
id
,
NULL
,
-
1
);
if
(
i2c_name
)
{
snprintf
(
codec_name
,
sizeof
(
codec_name
),
"%s%s"
,
"i2c-"
,
i2c_name
);
...
...
sound/soc/intel/boards/bytcht_es8316.c
View file @
b68cbc1d
...
...
@@ -232,15 +232,39 @@ static struct snd_soc_card byt_cht_es8316_card = {
.
fully_routed
=
true
,
};
static
char
codec_name
[
SND_ACPI_I2C_ID_LEN
];
static
int
snd_byt_cht_es8316_mc_probe
(
struct
platform_device
*
pdev
)
{
int
ret
=
0
;
struct
byt_cht_es8316_private
*
priv
;
struct
snd_soc_acpi_mach
*
mach
;
const
char
*
i2c_name
=
NULL
;
int
dai_index
=
0
;
int
i
;
int
ret
=
0
;
priv
=
devm_kzalloc
(
&
pdev
->
dev
,
sizeof
(
*
priv
),
GFP_ATOMIC
);
if
(
!
priv
)
return
-
ENOMEM
;
mach
=
(
&
pdev
->
dev
)
->
platform_data
;
/* fix index of codec dai */
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
byt_cht_es8316_dais
);
i
++
)
{
if
(
!
strcmp
(
byt_cht_es8316_dais
[
i
].
codec_name
,
"i2c-ESSX8316:00"
))
{
dai_index
=
i
;
break
;
}
}
/* fixup codec name based on HID */
i2c_name
=
acpi_dev_get_first_match_name
(
mach
->
id
,
NULL
,
-
1
);
if
(
i2c_name
)
{
snprintf
(
codec_name
,
sizeof
(
codec_name
),
"%s%s"
,
"i2c-"
,
i2c_name
);
byt_cht_es8316_dais
[
dai_index
].
codec_name
=
codec_name
;
}
/* register the soc card */
byt_cht_es8316_card
.
dev
=
&
pdev
->
dev
;
snd_soc_card_set_drvdata
(
&
byt_cht_es8316_card
,
priv
);
...
...
sound/soc/intel/boards/bytcr_rt5640.c
View file @
b68cbc1d
...
...
@@ -713,7 +713,7 @@ static struct snd_soc_card byt_rt5640_card = {
.
fully_routed
=
true
,
};
static
char
byt_rt5640_codec_name
[
16
];
/* i2c-<HID>:00 with HID being 8 chars */
static
char
byt_rt5640_codec_name
[
SND_ACPI_I2C_ID_LEN
];
static
char
byt_rt5640_codec_aif_name
[
12
];
/* = "rt5640-aif[1|2]" */
static
char
byt_rt5640_cpu_dai_name
[
10
];
/* = "ssp[0|2]-port" */
...
...
@@ -762,7 +762,7 @@ static int snd_byt_rt5640_mc_probe(struct platform_device *pdev)
}
/* fixup codec name based on HID */
i2c_name
=
snd_soc_acpi_find_name_from_hid
(
mach
->
id
);
i2c_name
=
acpi_dev_get_first_match_name
(
mach
->
id
,
NULL
,
-
1
);
if
(
i2c_name
)
{
snprintf
(
byt_rt5640_codec_name
,
sizeof
(
byt_rt5640_codec_name
),
"%s%s"
,
"i2c-"
,
i2c_name
);
...
...
sound/soc/intel/boards/bytcr_rt5651.c
View file @
b68cbc1d
...
...
@@ -38,6 +38,8 @@ enum {
BYT_RT5651_DMIC_MAP
,
BYT_RT5651_IN1_MAP
,
BYT_RT5651_IN2_MAP
,
BYT_RT5651_IN1_IN2_MAP
,
BYT_RT5651_IN3_MAP
,
};
#define BYT_RT5651_MAP(quirk) ((quirk) & GENMASK(7, 0))
...
...
@@ -62,6 +64,8 @@ static void log_quirks(struct device *dev)
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_MAP
(
byt_rt5651_quirk
)
==
BYT_RT5651_IN3_MAP
)
dev_info
(
dev
,
"quirk IN3_MAP enabled"
);
if
(
byt_rt5651_quirk
&
BYT_RT5651_DMIC_EN
)
dev_info
(
dev
,
"quirk DMIC enabled"
);
if
(
byt_rt5651_quirk
&
BYT_RT5651_MCLK_EN
)
...
...
@@ -127,6 +131,7 @@ static const struct snd_soc_dapm_widget byt_rt5651_widgets[] = {
SND_SOC_DAPM_MIC
(
"Headset Mic"
,
NULL
),
SND_SOC_DAPM_MIC
(
"Internal Mic"
,
NULL
),
SND_SOC_DAPM_SPK
(
"Speaker"
,
NULL
),
SND_SOC_DAPM_LINE
(
"Line In"
,
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
),
...
...
@@ -138,6 +143,7 @@ static const struct snd_soc_dapm_route byt_rt5651_audio_map[] = {
{
"Headset Mic"
,
NULL
,
"Platform Clock"
},
{
"Internal Mic"
,
NULL
,
"Platform Clock"
},
{
"Speaker"
,
NULL
,
"Platform Clock"
},
{
"Line In"
,
NULL
,
"Platform Clock"
},
{
"AIF1 Playback"
,
NULL
,
"ssp2 Tx"
},
{
"ssp2 Tx"
,
NULL
,
"codec_out0"
},
...
...
@@ -151,6 +157,9 @@ static const struct snd_soc_dapm_route byt_rt5651_audio_map[] = {
{
"Headphone"
,
NULL
,
"HPOR"
},
{
"Speaker"
,
NULL
,
"LOUTL"
},
{
"Speaker"
,
NULL
,
"LOUTR"
},
{
"IN2P"
,
NULL
,
"Line In"
},
{
"IN2N"
,
NULL
,
"Line In"
},
};
static
const
struct
snd_soc_dapm_route
byt_rt5651_intmic_dmic_map
[]
=
{
...
...
@@ -171,11 +180,25 @@ static const struct snd_soc_dapm_route byt_rt5651_intmic_in2_map[] = {
{
"IN2P"
,
NULL
,
"Internal Mic"
},
};
static
const
struct
snd_soc_dapm_route
byt_rt5651_intmic_in1_in2_map
[]
=
{
{
"Internal Mic"
,
NULL
,
"micbias1"
},
{
"IN1P"
,
NULL
,
"Internal Mic"
},
{
"IN2P"
,
NULL
,
"Internal Mic"
},
{
"IN3P"
,
NULL
,
"Headset Mic"
},
};
static
const
struct
snd_soc_dapm_route
byt_rt5651_intmic_in3_map
[]
=
{
{
"Internal Mic"
,
NULL
,
"micbias1"
},
{
"IN3P"
,
NULL
,
"Headset Mic"
},
{
"IN1P"
,
NULL
,
"Internal Mic"
},
};
static
const
struct
snd_kcontrol_new
byt_rt5651_controls
[]
=
{
SOC_DAPM_PIN_SWITCH
(
"Headphone"
),
SOC_DAPM_PIN_SWITCH
(
"Headset Mic"
),
SOC_DAPM_PIN_SWITCH
(
"Internal Mic"
),
SOC_DAPM_PIN_SWITCH
(
"Speaker"
),
SOC_DAPM_PIN_SWITCH
(
"Line In"
),
};
static
struct
snd_soc_jack_pin
bytcr_jack_pins
[]
=
{
...
...
@@ -247,8 +270,16 @@ static const struct dmi_system_id byt_rt5651_quirk_table[] = {
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
),
.
driver_data
=
(
void
*
)(
BYT_RT5651_IN3_MAP
),
},
{
.
callback
=
byt_rt5651_quirk_cb
,
.
matches
=
{
DMI_MATCH
(
DMI_SYS_VENDOR
,
"ADI"
),
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"Minnowboard Turbot"
),
},
.
driver_data
=
(
void
*
)(
BYT_RT5651_MCLK_EN
|
BYT_RT5651_IN3_MAP
),
},
{
.
callback
=
byt_rt5651_quirk_cb
,
...
...
@@ -256,7 +287,8 @@ static const struct dmi_system_id byt_rt5651_quirk_table[] = {
DMI_MATCH
(
DMI_SYS_VENDOR
,
"KIANO"
),
DMI_MATCH
(
DMI_PRODUCT_NAME
,
"KIANO SlimNote 14.2"
),
},
.
driver_data
=
(
void
*
)(
BYT_RT5651_IN2_MAP
),
.
driver_data
=
(
void
*
)(
BYT_RT5651_MCLK_EN
|
BYT_RT5651_IN1_IN2_MAP
),
},
{}
};
...
...
@@ -281,6 +313,14 @@ static int byt_rt5651_init(struct snd_soc_pcm_runtime *runtime)
custom_map
=
byt_rt5651_intmic_in2_map
;
num_routes
=
ARRAY_SIZE
(
byt_rt5651_intmic_in2_map
);
break
;
case
BYT_RT5651_IN1_IN2_MAP
:
custom_map
=
byt_rt5651_intmic_in1_in2_map
;
num_routes
=
ARRAY_SIZE
(
byt_rt5651_intmic_in1_in2_map
);
break
;
case
BYT_RT5651_IN3_MAP
:
custom_map
=
byt_rt5651_intmic_in3_map
;
num_routes
=
ARRAY_SIZE
(
byt_rt5651_intmic_in3_map
);
break
;
default:
custom_map
=
byt_rt5651_intmic_dmic_map
;
num_routes
=
ARRAY_SIZE
(
byt_rt5651_intmic_dmic_map
);
...
...
@@ -469,7 +509,7 @@ 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
char
byt_rt5651_codec_name
[
SND_ACPI_I2C_ID_LEN
];
static
int
snd_byt_rt5651_mc_probe
(
struct
platform_device
*
pdev
)
{
...
...
@@ -499,7 +539,7 @@ static int snd_byt_rt5651_mc_probe(struct platform_device *pdev)
}
/* fixup codec name based on HID */
i2c_name
=
snd_soc_acpi_find_name_from_hid
(
mach
->
id
);
i2c_name
=
acpi_dev_get_first_match_name
(
mach
->
id
,
NULL
,
-
1
);
if
(
i2c_name
)
{
snprintf
(
byt_rt5651_codec_name
,
sizeof
(
byt_rt5651_codec_name
),
"%s%s"
,
"i2c-"
,
i2c_name
);
...
...
sound/soc/intel/boards/cht_bsw_rt5645.c
View file @
b68cbc1d
...
...
@@ -49,7 +49,7 @@ struct cht_acpi_card {
struct
cht_mc_private
{
struct
snd_soc_jack
jack
;
struct
cht_acpi_card
*
acpi_card
;
char
codec_name
[
16
];
char
codec_name
[
SND_ACPI_I2C_ID_LEN
];
struct
clk
*
mclk
;
};
...
...
@@ -499,7 +499,7 @@ static struct cht_acpi_card snd_soc_cards[] = {
{
"10EC5650"
,
CODEC_TYPE_RT5650
,
&
snd_soc_card_chtrt5650
},
};
static
char
cht_rt5645_codec_name
[
16
];
/* i2c-<HID>:00 with HID being 8 chars */
static
char
cht_rt5645_codec_name
[
SND_ACPI_I2C_ID_LEN
];
static
char
cht_rt5645_codec_aif_name
[
12
];
/* = "rt5645-aif[1|2]" */
static
char
cht_rt5645_cpu_dai_name
[
10
];
/* = "ssp[0|2]-port" */
...
...
@@ -566,7 +566,7 @@ static int snd_cht_mc_probe(struct platform_device *pdev)
}
/* fixup codec name based on HID */
i2c_name
=
snd_soc_acpi_find_name_from_hid
(
mach
->
id
);
i2c_name
=
acpi_dev_get_first_match_name
(
mach
->
id
,
NULL
,
-
1
);
if
(
i2c_name
)
{
snprintf
(
cht_rt5645_codec_name
,
sizeof
(
cht_rt5645_codec_name
),
"%s%s"
,
"i2c-"
,
i2c_name
);
...
...
sound/soc/intel/boards/cht_bsw_rt5672.c
View file @
b68cbc1d
...
...
@@ -35,7 +35,7 @@
struct
cht_mc_private
{
struct
snd_soc_jack
headset
;
char
codec_name
[
16
];
char
codec_name
[
SND_ACPI_I2C_ID_LEN
];
struct
clk
*
mclk
;
};
...
...
@@ -396,7 +396,7 @@ static int snd_cht_mc_probe(struct platform_device *pdev)
/* fixup codec name based on HID */
if
(
mach
)
{
i2c_name
=
snd_soc_acpi_find_name_from_hid
(
mach
->
id
);
i2c_name
=
acpi_dev_get_first_match_name
(
mach
->
id
,
NULL
,
-
1
);
if
(
i2c_name
)
{
snprintf
(
drv
->
codec_name
,
sizeof
(
drv
->
codec_name
),
"i2c-%s"
,
i2c_name
);
...
...
sound/soc/intel/boards/haswell.c
View file @
b68cbc1d
...
...
@@ -76,7 +76,7 @@ static int haswell_rt5640_hw_params(struct snd_pcm_substream *substream,
}
/* set correct codec filter for DAI format and clock config */
snd_soc_
update_bits
(
rtd
->
codec
,
0x83
,
0xffff
,
0x8000
);
snd_soc_
component_update_bits
(
codec_dai
->
component
,
0x83
,
0xffff
,
0x8000
);
return
ret
;
}
...
...
sound/soc/intel/boards/kbl_rt5663_max98927.c
View file @
b68cbc1d
...
...
@@ -225,7 +225,7 @@ static int kabylake_rt5663_codec_init(struct snd_soc_pcm_runtime *rtd)
}
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_0
,
KEY_
PLAYPAUSE
);
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
);
...
...
sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c
View file @
b68cbc1d
...
...
@@ -195,7 +195,7 @@ static int kabylake_rt5663_codec_init(struct snd_soc_pcm_runtime *rtd)
}
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_0
,
KEY_
PLAYPAUSE
);
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
);
...
...
sound/soc/intel/boards/mfld_machine.c
deleted
100644 → 0
View file @
49fdfe36
This diff is collapsed.
Click to expand it.
sound/soc/intel/common/sst-dsp.c
View file @
b68cbc1d
...
...
@@ -269,7 +269,7 @@ int sst_dsp_register_poll(struct sst_dsp *ctx, u32 offset, u32 mask,
*/
timeout
=
jiffies
+
msecs_to_jiffies
(
time
);
while
(((
sst_dsp_shim_read_unlocked
(
ctx
,
offset
)
&
mask
)
!=
target
)
while
(((
(
reg
=
sst_dsp_shim_read_unlocked
(
ctx
,
offset
)
)
&
mask
)
!=
target
)
&&
time_before
(
jiffies
,
timeout
))
{
k
++
;
if
(
k
>
10
)
...
...
@@ -278,8 +278,6 @@ int sst_dsp_register_poll(struct sst_dsp *ctx, u32 offset, u32 mask,
usleep_range
(
s
,
2
*
s
);
}
reg
=
sst_dsp_shim_read_unlocked
(
ctx
,
offset
);
if
((
reg
&
mask
)
==
target
)
{
dev_dbg
(
ctx
->
dev
,
"FW Poll Status: reg=%#x %s successful
\n
"
,
reg
,
operation
);
...
...
sound/soc/intel/skylake/bxt-sst.c
View file @
b68cbc1d
...
...
@@ -595,7 +595,7 @@ int bxt_sst_dsp_init(struct device *dev, void __iomem *mmio_base, int irq,
INIT_DELAYED_WORK
(
&
skl
->
d0i3
.
work
,
bxt_set_dsp_D0i3
);
skl
->
d0i3
.
state
=
SKL_DSP_D0I3_NONE
;
return
0
;
return
skl_dsp_acquire_irq
(
sst
)
;
}
EXPORT_SYMBOL_GPL
(
bxt_sst_dsp_init
);
...
...
sound/soc/intel/skylake/cnl-sst.c
View file @
b68cbc1d
...
...
@@ -458,7 +458,7 @@ int cnl_sst_dsp_init(struct device *dev, void __iomem *mmio_base, int irq,
cnl
->
boot_complete
=
false
;
init_waitqueue_head
(
&
cnl
->
boot_wait
);
return
0
;
return
skl_dsp_acquire_irq
(
sst
)
;
}
EXPORT_SYMBOL_GPL
(
cnl_sst_dsp_init
);
...
...
sound/soc/intel/skylake/skl-i2s.h
0 → 100644
View file @
b68cbc1d
/*
* skl-i2s.h - i2s blob mapping
*
* Copyright (C) 2017 Intel Corp
* Author: Subhransu S. Prusty < subhransu.s.prusty@intel.com>
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* 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 __SOUND_SOC_SKL_I2S_H
#define __SOUND_SOC_SKL_I2S_H
#define SKL_I2S_MAX_TIME_SLOTS 8
#define SKL_MCLK_DIV_CLK_SRC_MASK GENMASK(17, 16)
#define SKL_MNDSS_DIV_CLK_SRC_MASK GENMASK(21, 20)
#define SKL_SHIFT(x) (ffs(x) - 1)
#define SKL_MCLK_DIV_RATIO_MASK GENMASK(11, 0)
struct
skl_i2s_config
{
u32
ssc0
;
u32
ssc1
;
u32
sscto
;
u32
sspsp
;
u32
sstsa
;
u32
ssrsa
;
u32
ssc2
;
u32
sspsp2
;
u32
ssc3
;
u32
ssioc
;
}
__packed
;
struct
skl_i2s_config_mclk
{
u32
mdivctrl
;
u32
mdivr
;
};
/**
* struct skl_i2s_config_blob_legacy - Structure defines I2S Gateway
* configuration legacy blob
*
* @gtw_attr: Gateway attribute for the I2S Gateway
* @tdm_ts_group: TDM slot mapping against channels in the Gateway.
* @i2s_cfg: I2S HW registers
* @mclk: MCLK clock source and divider values
*/
struct
skl_i2s_config_blob_legacy
{
u32
gtw_attr
;
u32
tdm_ts_group
[
SKL_I2S_MAX_TIME_SLOTS
];
struct
skl_i2s_config
i2s_cfg
;
struct
skl_i2s_config_mclk
mclk
;
};
#endif
/* __SOUND_SOC_SKL_I2S_H */
sound/soc/intel/skylake/skl-messages.c
View file @
b68cbc1d
...
...
@@ -55,6 +55,19 @@ static int skl_free_dma_buf(struct device *dev, struct snd_dma_buffer *dmab)
return
0
;
}
#define SKL_ASTATE_PARAM_ID 4
void
skl_dsp_set_astate_cfg
(
struct
skl_sst
*
ctx
,
u32
cnt
,
void
*
data
)
{
struct
skl_ipc_large_config_msg
msg
=
{
0
};
msg
.
large_param_id
=
SKL_ASTATE_PARAM_ID
;
msg
.
param_data_size
=
(
cnt
*
sizeof
(
struct
skl_astate_param
)
+
sizeof
(
cnt
));
skl_ipc_set_large_config
(
&
ctx
->
ipc
,
&
msg
,
data
);
}
#define NOTIFICATION_PARAM_ID 3
#define NOTIFICATION_MASK 0xf
...
...
@@ -404,11 +417,20 @@ int skl_resume_dsp(struct skl *skl)
if
(
skl
->
skl_sst
->
is_first_boot
==
true
)
return
0
;
/* disable dynamic clock gating during fw and lib download */
ctx
->
enable_miscbdcge
(
ctx
->
dev
,
false
);
ret
=
skl_dsp_wake
(
ctx
->
dsp
);
ctx
->
enable_miscbdcge
(
ctx
->
dev
,
true
);
if
(
ret
<
0
)
return
ret
;
skl_dsp_enable_notification
(
skl
->
skl_sst
,
false
);
if
(
skl
->
cfg
.
astate_cfg
!=
NULL
)
{
skl_dsp_set_astate_cfg
(
skl
->
skl_sst
,
skl
->
cfg
.
astate_cfg
->
count
,
skl
->
cfg
.
astate_cfg
);
}
return
ret
;
}
...
...
sound/soc/intel/skylake/skl-nhlt.c
View file @
b68cbc1d
...
...
@@ -19,6 +19,7 @@
*/
#include <linux/pci.h>
#include "skl.h"
#include "skl-i2s.h"
#define NHLT_ACPI_HEADER_SIG "NHLT"
...
...
@@ -277,3 +278,157 @@ void skl_nhlt_remove_sysfs(struct skl *skl)
sysfs_remove_file
(
&
dev
->
kobj
,
&
dev_attr_platform_id
.
attr
);
}
/*
* Queries NHLT for all the fmt configuration for a particular endpoint and
* stores all possible rates supported in a rate table for the corresponding
* sclk/sclkfs.
*/
static
void
skl_get_ssp_clks
(
struct
skl
*
skl
,
struct
skl_ssp_clk
*
ssp_clks
,
struct
nhlt_fmt
*
fmt
,
u8
id
)
{
struct
skl_i2s_config_blob_legacy
*
i2s_config
;
struct
skl_clk_parent_src
*
parent
;
struct
skl_ssp_clk
*
sclk
,
*
sclkfs
;
struct
nhlt_fmt_cfg
*
fmt_cfg
;
struct
wav_fmt_ext
*
wav_fmt
;
unsigned
long
rate
=
0
;
bool
present
=
false
;
int
rate_index
=
0
;
u16
channels
,
bps
;
u8
clk_src
;
int
i
,
j
;
u32
fs
;
sclk
=
&
ssp_clks
[
SKL_SCLK_OFS
];
sclkfs
=
&
ssp_clks
[
SKL_SCLKFS_OFS
];
if
(
fmt
->
fmt_count
==
0
)
return
;
for
(
i
=
0
;
i
<
fmt
->
fmt_count
;
i
++
)
{
fmt_cfg
=
&
fmt
->
fmt_config
[
i
];
wav_fmt
=
&
fmt_cfg
->
fmt_ext
;
channels
=
wav_fmt
->
fmt
.
channels
;
bps
=
wav_fmt
->
fmt
.
bits_per_sample
;
fs
=
wav_fmt
->
fmt
.
samples_per_sec
;
/*
* In case of TDM configuration on a ssp, there can
* be more than one blob in which channel masks are
* different for each usecase for a specific rate and bps.
* But the sclk rate will be generated for the total
* number of channels used for that endpoint.
*
* So for the given fs and bps, choose blob which has
* the superset of all channels for that endpoint and
* derive the rate.
*/
for
(
j
=
i
;
j
<
fmt
->
fmt_count
;
j
++
)
{
fmt_cfg
=
&
fmt
->
fmt_config
[
j
];
wav_fmt
=
&
fmt_cfg
->
fmt_ext
;
if
((
fs
==
wav_fmt
->
fmt
.
samples_per_sec
)
&&
(
bps
==
wav_fmt
->
fmt
.
bits_per_sample
))
channels
=
max_t
(
u16
,
channels
,
wav_fmt
->
fmt
.
channels
);
}
rate
=
channels
*
bps
*
fs
;
/* check if the rate is added already to the given SSP's sclk */
for
(
j
=
0
;
(
j
<
SKL_MAX_CLK_RATES
)
&&
(
sclk
[
id
].
rate_cfg
[
j
].
rate
!=
0
);
j
++
)
{
if
(
sclk
[
id
].
rate_cfg
[
j
].
rate
==
rate
)
{
present
=
true
;
break
;
}
}
/* Fill rate and parent for sclk/sclkfs */
if
(
!
present
)
{
/* MCLK Divider Source Select */
i2s_config
=
(
struct
skl_i2s_config_blob_legacy
*
)
fmt
->
fmt_config
[
0
].
config
.
caps
;
clk_src
=
((
i2s_config
->
mclk
.
mdivctrl
)
&
SKL_MNDSS_DIV_CLK_SRC_MASK
)
>>
SKL_SHIFT
(
SKL_MNDSS_DIV_CLK_SRC_MASK
);
parent
=
skl_get_parent_clk
(
clk_src
);
/*
* Do not copy the config data if there is no parent
* clock available for this clock source select
*/
if
(
!
parent
)
continue
;
sclk
[
id
].
rate_cfg
[
rate_index
].
rate
=
rate
;
sclk
[
id
].
rate_cfg
[
rate_index
].
config
=
fmt_cfg
;
sclkfs
[
id
].
rate_cfg
[
rate_index
].
rate
=
rate
;
sclkfs
[
id
].
rate_cfg
[
rate_index
].
config
=
fmt_cfg
;
sclk
[
id
].
parent_name
=
parent
->
name
;
sclkfs
[
id
].
parent_name
=
parent
->
name
;
rate_index
++
;
}
}
}
static
void
skl_get_mclk
(
struct
skl
*
skl
,
struct
skl_ssp_clk
*
mclk
,
struct
nhlt_fmt
*
fmt
,
u8
id
)
{
struct
skl_i2s_config_blob_legacy
*
i2s_config
;
struct
nhlt_specific_cfg
*
fmt_cfg
;
struct
skl_clk_parent_src
*
parent
;
u32
clkdiv
,
div_ratio
;
u8
clk_src
;
fmt_cfg
=
&
fmt
->
fmt_config
[
0
].
config
;
i2s_config
=
(
struct
skl_i2s_config_blob_legacy
*
)
fmt_cfg
->
caps
;
/* MCLK Divider Source Select */
clk_src
=
((
i2s_config
->
mclk
.
mdivctrl
)
&
SKL_MCLK_DIV_CLK_SRC_MASK
)
>>
SKL_SHIFT
(
SKL_MCLK_DIV_CLK_SRC_MASK
);
clkdiv
=
i2s_config
->
mclk
.
mdivr
&
SKL_MCLK_DIV_RATIO_MASK
;
/* bypass divider */
div_ratio
=
1
;
if
(
clkdiv
!=
SKL_MCLK_DIV_RATIO_MASK
)
/* Divider is 2 + clkdiv */
div_ratio
=
clkdiv
+
2
;
/* Calculate MCLK rate from source using div value */
parent
=
skl_get_parent_clk
(
clk_src
);
if
(
!
parent
)
return
;
mclk
[
id
].
rate_cfg
[
0
].
rate
=
parent
->
rate
/
div_ratio
;
mclk
[
id
].
rate_cfg
[
0
].
config
=
&
fmt
->
fmt_config
[
0
];
mclk
[
id
].
parent_name
=
parent
->
name
;
}
void
skl_get_clks
(
struct
skl
*
skl
,
struct
skl_ssp_clk
*
ssp_clks
)
{
struct
nhlt_acpi_table
*
nhlt
=
(
struct
nhlt_acpi_table
*
)
skl
->
nhlt
;
struct
nhlt_endpoint
*
epnt
;
struct
nhlt_fmt
*
fmt
;
int
i
;
u8
id
;
epnt
=
(
struct
nhlt_endpoint
*
)
nhlt
->
desc
;
for
(
i
=
0
;
i
<
nhlt
->
endpoint_count
;
i
++
)
{
if
(
epnt
->
linktype
==
NHLT_LINK_SSP
)
{
id
=
epnt
->
virtual_bus_id
;
fmt
=
(
struct
nhlt_fmt
*
)(
epnt
->
config
.
caps
+
epnt
->
config
.
size
);
skl_get_ssp_clks
(
skl
,
ssp_clks
,
fmt
,
id
);
skl_get_mclk
(
skl
,
ssp_clks
,
fmt
,
id
);
}
epnt
=
(
struct
nhlt_endpoint
*
)((
u8
*
)
epnt
+
epnt
->
length
);
}
}
sound/soc/intel/skylake/skl-pcm.c
View file @
b68cbc1d
...
...
@@ -537,7 +537,7 @@ static int skl_link_hw_params(struct snd_pcm_substream *substream,
snd_soc_dai_set_dma_data
(
dai
,
substream
,
(
void
*
)
link_dev
);
link
=
snd_hdac_ext_bus_get_link
(
ebus
,
rtd
->
codec
->
component
.
name
);
link
=
snd_hdac_ext_bus_get_link
(
ebus
,
codec_dai
->
component
->
name
);
if
(
!
link
)
return
-
EINVAL
;
...
...
@@ -620,7 +620,7 @@ static int skl_link_hw_free(struct snd_pcm_substream *substream,
link_dev
->
link_prepared
=
0
;
link
=
snd_hdac_ext_bus_get_link
(
ebus
,
rtd
->
codec
->
component
.
name
);
link
=
snd_hdac_ext_bus_get_link
(
ebus
,
rtd
->
codec
_dai
->
component
->
name
);
if
(
!
link
)
return
-
EINVAL
;
...
...
@@ -1343,7 +1343,11 @@ static int skl_platform_soc_probe(struct snd_soc_platform *platform)
return
-
EIO
;
}
/* disable dynamic clock gating during fw and lib download */
skl
->
skl_sst
->
enable_miscbdcge
(
platform
->
dev
,
false
);
ret
=
ops
->
init_fw
(
platform
->
dev
,
skl
->
skl_sst
);
skl
->
skl_sst
->
enable_miscbdcge
(
platform
->
dev
,
true
);
if
(
ret
<
0
)
{
dev_err
(
platform
->
dev
,
"Failed to boot first fw: %d
\n
"
,
ret
);
return
ret
;
...
...
@@ -1351,6 +1355,12 @@ static int skl_platform_soc_probe(struct snd_soc_platform *platform)
skl_populate_modules
(
skl
);
skl
->
skl_sst
->
update_d0i3c
=
skl_update_d0i3c
;
skl_dsp_enable_notification
(
skl
->
skl_sst
,
false
);
if
(
skl
->
cfg
.
astate_cfg
!=
NULL
)
{
skl_dsp_set_astate_cfg
(
skl
->
skl_sst
,
skl
->
cfg
.
astate_cfg
->
count
,
skl
->
cfg
.
astate_cfg
);
}
}
pm_runtime_mark_last_busy
(
platform
->
dev
);
pm_runtime_put_autosuspend
(
platform
->
dev
);
...
...
sound/soc/intel/skylake/skl-ssp-clk.h
0 → 100644
View file @
b68cbc1d
/*
* skl-ssp-clk.h - Skylake ssp clock information and ipc structure
*
* Copyright (C) 2017 Intel Corp
* Author: Jaikrishna Nemallapudi <jaikrishnax.nemallapudi@intel.com>
* Author: Subhransu S. Prusty <subhransu.s.prusty@intel.com>
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* 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 SOUND_SOC_SKL_SSP_CLK_H
#define SOUND_SOC_SKL_SSP_CLK_H
#define SKL_MAX_SSP 6
/* xtal/cardinal/pll, parent of ssp clocks and mclk */
#define SKL_MAX_CLK_SRC 3
#define SKL_MAX_SSP_CLK_TYPES 3
/* mclk, sclk, sclkfs */
#define SKL_MAX_CLK_CNT (SKL_MAX_SSP * SKL_MAX_SSP_CLK_TYPES)
/* Max number of configurations supported for each clock */
#define SKL_MAX_CLK_RATES 10
#define SKL_SCLK_OFS SKL_MAX_SSP
#define SKL_SCLKFS_OFS (SKL_SCLK_OFS + SKL_MAX_SSP)
enum
skl_clk_type
{
SKL_MCLK
,
SKL_SCLK
,
SKL_SCLK_FS
,
};
enum
skl_clk_src_type
{
SKL_XTAL
,
SKL_CARDINAL
,
SKL_PLL
,
};
struct
skl_clk_parent_src
{
u8
clk_id
;
const
char
*
name
;
unsigned
long
rate
;
const
char
*
parent_name
;
};
struct
skl_clk_rate_cfg_table
{
unsigned
long
rate
;
void
*
config
;
};
/*
* rate for mclk will be in rates[0]. For sclk and sclkfs, rates[] store
* all possible clocks ssp can generate for that platform.
*/
struct
skl_ssp_clk
{
const
char
*
name
;
const
char
*
parent_name
;
struct
skl_clk_rate_cfg_table
rate_cfg
[
SKL_MAX_CLK_RATES
];
};
struct
skl_clk_pdata
{
struct
skl_clk_parent_src
*
parent_clks
;
int
num_clks
;
struct
skl_ssp_clk
*
ssp_clks
;
void
*
pvt_data
;
};
#endif
/* SOUND_SOC_SKL_SSP_CLK_H */
sound/soc/intel/skylake/skl-sst-dsp.c
View file @
b68cbc1d
...
...
@@ -435,16 +435,22 @@ struct sst_dsp *skl_dsp_ctx_init(struct device *dev,
return
NULL
;
}
return
sst
;
}
int
skl_dsp_acquire_irq
(
struct
sst_dsp
*
sst
)
{
struct
sst_dsp_device
*
sst_dev
=
sst
->
sst_dev
;
int
ret
;
/* Register the ISR */
ret
=
request_threaded_irq
(
sst
->
irq
,
sst
->
ops
->
irq_handler
,
sst_dev
->
thread
,
IRQF_SHARED
,
"AudioDSP"
,
sst
);
if
(
ret
)
{
if
(
ret
)
dev_err
(
sst
->
dev
,
"unable to grab threaded IRQ %d, disabling device
\n
"
,
sst
->
irq
);
return
NULL
;
}
return
ss
t
;
return
re
t
;
}
void
skl_dsp_free
(
struct
sst_dsp
*
dsp
)
...
...
sound/soc/intel/skylake/skl-sst-dsp.h
View file @
b68cbc1d
...
...
@@ -206,6 +206,7 @@ int skl_cldma_wait_interruptible(struct sst_dsp *ctx);
void
skl_dsp_set_state_locked
(
struct
sst_dsp
*
ctx
,
int
state
);
struct
sst_dsp
*
skl_dsp_ctx_init
(
struct
device
*
dev
,
struct
sst_dsp_device
*
sst_dev
,
int
irq
);
int
skl_dsp_acquire_irq
(
struct
sst_dsp
*
sst
);
bool
is_skl_dsp_running
(
struct
sst_dsp
*
ctx
);
unsigned
int
skl_dsp_get_enabled_cores
(
struct
sst_dsp
*
ctx
);
...
...
@@ -251,6 +252,9 @@ void skl_freeup_uuid_list(struct skl_sst *ctx);
int
skl_dsp_strip_extended_manifest
(
struct
firmware
*
fw
);
void
skl_dsp_enable_notification
(
struct
skl_sst
*
ctx
,
bool
enable
);
void
skl_dsp_set_astate_cfg
(
struct
skl_sst
*
ctx
,
u32
cnt
,
void
*
data
);
int
skl_sst_ctx_init
(
struct
device
*
dev
,
int
irq
,
const
char
*
fw_name
,
struct
skl_dsp_loader_ops
dsp_ops
,
struct
skl_sst
**
dsp
,
struct
sst_dsp_device
*
skl_dev
);
...
...
sound/soc/intel/skylake/skl-sst-utils.c
View file @
b68cbc1d
...
...
@@ -178,7 +178,8 @@ static inline int skl_pvtid_128(struct uuid_module *module)
* skl_get_pvt_id: generate a private id for use as module id
*
* @ctx: driver context
* @mconfig: module configuration data
* @uuid_mod: module's uuid
* @instance_id: module's instance id
*
* This generates a 128 bit private unique id for a module TYPE so that
* module instance is unique
...
...
@@ -208,7 +209,8 @@ EXPORT_SYMBOL_GPL(skl_get_pvt_id);
* skl_put_pvt_id: free up the private id allocated
*
* @ctx: driver context
* @mconfig: module configuration data
* @uuid_mod: module's uuid
* @pvt_id: module pvt id
*
* This frees a 128 bit private unique id previously generated
*/
...
...
sound/soc/intel/skylake/skl-sst.c
View file @
b68cbc1d
...
...
@@ -569,7 +569,7 @@ int skl_sst_dsp_init(struct device *dev, void __iomem *mmio_base, int irq,
sst
->
fw_ops
=
skl_fw_ops
;
return
0
;
return
skl_dsp_acquire_irq
(
sst
)
;
}
EXPORT_SYMBOL_GPL
(
skl_sst_dsp_init
);
...
...
sound/soc/intel/skylake/skl-topology.c
View file @
b68cbc1d
...
...
@@ -190,7 +190,6 @@ skl_tplg_free_pipe_mcps(struct skl *skl, struct skl_module_cfg *mconfig)
u8
res_idx
=
mconfig
->
res_idx
;
struct
skl_module_res
*
res
=
&
mconfig
->
module
->
resources
[
res_idx
];
res
=
&
mconfig
->
module
->
resources
[
res_idx
];
skl
->
resource
.
mcps
-=
res
->
cps
;
}
...
...
@@ -3056,11 +3055,13 @@ static int skl_tplg_get_int_tkn(struct device *dev,
struct
snd_soc_tplg_vendor_value_elem
*
tkn_elem
,
struct
skl
*
skl
)
{
int
tkn_count
=
0
,
ret
;
int
tkn_count
=
0
,
ret
,
size
;
static
int
mod_idx
,
res_val_idx
,
intf_val_idx
,
dir
,
pin_idx
;
struct
skl_module_res
*
res
=
NULL
;
struct
skl_module_iface
*
fmt
=
NULL
;
struct
skl_module
*
mod
=
NULL
;
static
struct
skl_astate_param
*
astate_table
;
static
int
astate_cfg_idx
,
count
;
int
i
;
if
(
skl
->
modules
)
{
...
...
@@ -3093,6 +3094,46 @@ static int skl_tplg_get_int_tkn(struct device *dev,
mod_idx
=
tkn_elem
->
value
;
break
;
case
SKL_TKN_U32_ASTATE_COUNT
:
if
(
astate_table
!=
NULL
)
{
dev_err
(
dev
,
"More than one entry for A-State count"
);
return
-
EINVAL
;
}
if
(
tkn_elem
->
value
>
SKL_MAX_ASTATE_CFG
)
{
dev_err
(
dev
,
"Invalid A-State count %d
\n
"
,
tkn_elem
->
value
);
return
-
EINVAL
;
}
size
=
tkn_elem
->
value
*
sizeof
(
struct
skl_astate_param
)
+
sizeof
(
count
);
skl
->
cfg
.
astate_cfg
=
devm_kzalloc
(
dev
,
size
,
GFP_KERNEL
);
if
(
!
skl
->
cfg
.
astate_cfg
)
return
-
ENOMEM
;
astate_table
=
skl
->
cfg
.
astate_cfg
->
astate_table
;
count
=
skl
->
cfg
.
astate_cfg
->
count
=
tkn_elem
->
value
;
break
;
case
SKL_TKN_U32_ASTATE_IDX
:
if
(
tkn_elem
->
value
>=
count
)
{
dev_err
(
dev
,
"Invalid A-State index %d
\n
"
,
tkn_elem
->
value
);
return
-
EINVAL
;
}
astate_cfg_idx
=
tkn_elem
->
value
;
break
;
case
SKL_TKN_U32_ASTATE_KCPS
:
astate_table
[
astate_cfg_idx
].
kcps
=
tkn_elem
->
value
;
break
;
case
SKL_TKN_U32_ASTATE_CLK_SRC
:
astate_table
[
astate_cfg_idx
].
clk_src
=
tkn_elem
->
value
;
break
;
case
SKL_TKN_U8_IN_PIN_TYPE
:
case
SKL_TKN_U8_OUT_PIN_TYPE
:
case
SKL_TKN_U8_IN_QUEUE_COUNT
:
...
...
sound/soc/intel/skylake/skl.c
View file @
b68cbc1d
...
...
@@ -355,6 +355,7 @@ static int skl_resume(struct device *dev)
if
(
ebus
->
cmd_dma_state
)
snd_hdac_bus_init_cmd_io
(
&
ebus
->
bus
);
ret
=
0
;
}
else
{
ret
=
_skl_resume
(
ebus
);
...
...
@@ -435,19 +436,51 @@ static int skl_free(struct hdac_ext_bus *ebus)
return
0
;
}
static
int
skl_machine_device_register
(
struct
skl
*
skl
,
void
*
driver_data
)
/*
* For each ssp there are 3 clocks (mclk/sclk/sclkfs).
* e.g. for ssp0, clocks will be named as
* "ssp0_mclk", "ssp0_sclk", "ssp0_sclkfs"
* So for skl+, there are 6 ssps, so 18 clocks will be created.
*/
static
struct
skl_ssp_clk
skl_ssp_clks
[]
=
{
{.
name
=
"ssp0_mclk"
},
{.
name
=
"ssp1_mclk"
},
{.
name
=
"ssp2_mclk"
},
{.
name
=
"ssp3_mclk"
},
{.
name
=
"ssp4_mclk"
},
{.
name
=
"ssp5_mclk"
},
{.
name
=
"ssp0_sclk"
},
{.
name
=
"ssp1_sclk"
},
{.
name
=
"ssp2_sclk"
},
{.
name
=
"ssp3_sclk"
},
{.
name
=
"ssp4_sclk"
},
{.
name
=
"ssp5_sclk"
},
{.
name
=
"ssp0_sclkfs"
},
{.
name
=
"ssp1_sclkfs"
},
{.
name
=
"ssp2_sclkfs"
},
{.
name
=
"ssp3_sclkfs"
},
{.
name
=
"ssp4_sclkfs"
},
{.
name
=
"ssp5_sclkfs"
},
};
static
int
skl_find_machine
(
struct
skl
*
skl
,
void
*
driver_data
)
{
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
&
skl
->
ebus
);
struct
platform_device
*
pdev
;
struct
snd_soc_acpi_mach
*
mach
=
driver_data
;
int
ret
;
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
&
skl
->
ebus
);
struct
skl_machine_pdata
*
pdata
;
mach
=
snd_soc_acpi_find_machine
(
mach
);
if
(
mach
==
NULL
)
{
dev_err
(
bus
->
dev
,
"No matching machine driver found
\n
"
);
return
-
ENODEV
;
}
skl
->
mach
=
mach
;
skl
->
fw_name
=
mach
->
fw_filename
;
pdata
=
skl
->
mach
->
pdata
;
if
(
mach
->
pdata
)
skl
->
use_tplg_pcm
=
pdata
->
use_tplg_pcm
;
return
0
;
}
static
int
skl_machine_device_register
(
struct
skl
*
skl
)
{
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
&
skl
->
ebus
);
struct
snd_soc_acpi_mach
*
mach
=
skl
->
mach
;
struct
platform_device
*
pdev
;
int
ret
;
pdev
=
platform_device_alloc
(
mach
->
drv_name
,
-
1
);
if
(
pdev
==
NULL
)
{
...
...
@@ -462,11 +495,8 @@ static int skl_machine_device_register(struct skl *skl, void *driver_data)
return
-
EIO
;
}
if
(
mach
->
pdata
)
{
skl
->
use_tplg_pcm
=
((
struct
skl_machine_pdata
*
)
mach
->
pdata
)
->
use_tplg_pcm
;
if
(
mach
->
pdata
)
dev_set_drvdata
(
&
pdev
->
dev
,
mach
->
pdata
);
}
skl
->
i2s_dev
=
pdev
;
...
...
@@ -509,6 +539,74 @@ static void skl_dmic_device_unregister(struct skl *skl)
platform_device_unregister
(
skl
->
dmic_dev
);
}
static
struct
skl_clk_parent_src
skl_clk_src
[]
=
{
{
.
clk_id
=
SKL_XTAL
,
.
name
=
"xtal"
},
{
.
clk_id
=
SKL_CARDINAL
,
.
name
=
"cardinal"
,
.
rate
=
24576000
},
{
.
clk_id
=
SKL_PLL
,
.
name
=
"pll"
,
.
rate
=
96000000
},
};
struct
skl_clk_parent_src
*
skl_get_parent_clk
(
u8
clk_id
)
{
unsigned
int
i
;
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
skl_clk_src
);
i
++
)
{
if
(
skl_clk_src
[
i
].
clk_id
==
clk_id
)
return
&
skl_clk_src
[
i
];
}
return
NULL
;
}
static
void
init_skl_xtal_rate
(
int
pci_id
)
{
switch
(
pci_id
)
{
case
0x9d70
:
case
0x9d71
:
skl_clk_src
[
0
].
rate
=
24000000
;
return
;
default:
skl_clk_src
[
0
].
rate
=
19200000
;
return
;
}
}
static
int
skl_clock_device_register
(
struct
skl
*
skl
)
{
struct
platform_device_info
pdevinfo
=
{
NULL
};
struct
skl_clk_pdata
*
clk_pdata
;
clk_pdata
=
devm_kzalloc
(
&
skl
->
pci
->
dev
,
sizeof
(
*
clk_pdata
),
GFP_KERNEL
);
if
(
!
clk_pdata
)
return
-
ENOMEM
;
init_skl_xtal_rate
(
skl
->
pci
->
device
);
clk_pdata
->
parent_clks
=
skl_clk_src
;
clk_pdata
->
ssp_clks
=
skl_ssp_clks
;
clk_pdata
->
num_clks
=
ARRAY_SIZE
(
skl_ssp_clks
);
/* Query NHLT to fill the rates and parent */
skl_get_clks
(
skl
,
clk_pdata
->
ssp_clks
);
clk_pdata
->
pvt_data
=
skl
;
/* Register Platform device */
pdevinfo
.
parent
=
&
skl
->
pci
->
dev
;
pdevinfo
.
id
=
-
1
;
pdevinfo
.
name
=
"skl-ssp-clk"
;
pdevinfo
.
data
=
clk_pdata
;
pdevinfo
.
size_data
=
sizeof
(
*
clk_pdata
);
skl
->
clk_dev
=
platform_device_register_full
(
&
pdevinfo
);
return
PTR_ERR_OR_ZERO
(
skl
->
clk_dev
);
}
static
void
skl_clock_device_unregister
(
struct
skl
*
skl
)
{
if
(
skl
->
clk_dev
)
platform_device_unregister
(
skl
->
clk_dev
);
}
/*
* Probe the given codec address
*/
...
...
@@ -615,18 +713,30 @@ static void skl_probe_work(struct work_struct *work)
/* create codec instances */
skl_codec_create
(
ebus
);
/* register platform dai and controls */
err
=
skl_platform_register
(
bus
->
dev
);
if
(
err
<
0
)
{
dev_err
(
bus
->
dev
,
"platform register failed: %d
\n
"
,
err
);
return
;
}
if
(
bus
->
ppcap
)
{
err
=
skl_machine_device_register
(
skl
);
if
(
err
<
0
)
{
dev_err
(
bus
->
dev
,
"machine register failed: %d
\n
"
,
err
);
goto
out_err
;
}
}
if
(
IS_ENABLED
(
CONFIG_SND_SOC_HDAC_HDMI
))
{
err
=
snd_hdac_display_power
(
bus
,
false
);
if
(
err
<
0
)
{
dev_err
(
bus
->
dev
,
"Cannot turn off display power on i915
\n
"
);
skl_machine_device_unregister
(
skl
);
return
;
}
}
/* register platform dai and controls */
err
=
skl_platform_register
(
bus
->
dev
);
if
(
err
<
0
)
return
;
/*
* we are done probing so decrement link counts
*/
...
...
@@ -791,18 +901,21 @@ static int skl_probe(struct pci_dev *pci,
/* check if dsp is there */
if
(
bus
->
ppcap
)
{
err
=
skl_machine_device_register
(
skl
,
(
void
*
)
pci_id
->
driver_data
);
/* create device for dsp clk */
err
=
skl_clock_device_register
(
skl
);
if
(
err
<
0
)
goto
out_clk_free
;
err
=
skl_find_machine
(
skl
,
(
void
*
)
pci_id
->
driver_data
);
if
(
err
<
0
)
goto
out_nhlt_free
;
err
=
skl_init_dsp
(
skl
);
if
(
err
<
0
)
{
dev_dbg
(
bus
->
dev
,
"error failed to register dsp
\n
"
);
goto
out_
mach
_free
;
goto
out_
nhlt
_free
;
}
skl
->
skl_sst
->
enable_miscbdcge
=
skl_enable_miscbdcge
;
}
if
(
bus
->
mlcap
)
snd_hdac_ext_bus_get_ml_capabilities
(
ebus
);
...
...
@@ -820,8 +933,8 @@ static int skl_probe(struct pci_dev *pci,
out_dsp_free:
skl_free_dsp
(
skl
);
out_
mach
_free:
skl_
machine
_device_unregister
(
skl
);
out_
clk
_free:
skl_
clock
_device_unregister
(
skl
);
out_nhlt_free:
skl_nhlt_free
(
skl
->
nhlt
);
out_free:
...
...
@@ -872,6 +985,7 @@ static void skl_remove(struct pci_dev *pci)
skl_free_dsp
(
skl
);
skl_machine_device_unregister
(
skl
);
skl_dmic_device_unregister
(
skl
);
skl_clock_device_unregister
(
skl
);
skl_nhlt_remove_sysfs
(
skl
);
skl_nhlt_free
(
skl
->
nhlt
);
skl_free
(
ebus
);
...
...
sound/soc/intel/skylake/skl.h
View file @
b68cbc1d
...
...
@@ -25,9 +25,12 @@
#include <sound/hdaudio_ext.h>
#include <sound/soc.h>
#include "skl-nhlt.h"
#include "skl-ssp-clk.h"
#define SKL_SUSPEND_DELAY 2000
#define SKL_MAX_ASTATE_CFG 3
#define AZX_PCIREG_PGCTL 0x44
#define AZX_PGCTL_LSRMD_MASK (1 << 4)
#define AZX_PCIREG_CGCTL 0x48
...
...
@@ -45,6 +48,20 @@ struct skl_dsp_resource {
struct
skl_debug
;
struct
skl_astate_param
{
u32
kcps
;
u32
clk_src
;
};
struct
skl_astate_config
{
u32
count
;
struct
skl_astate_param
astate_table
[
0
];
};
struct
skl_fw_config
{
struct
skl_astate_config
*
astate_cfg
;
};
struct
skl
{
struct
hdac_ext_bus
ebus
;
struct
pci_dev
*
pci
;
...
...
@@ -52,6 +69,7 @@ struct skl {
unsigned
int
init_done
:
1
;
/* delayed init status */
struct
platform_device
*
dmic_dev
;
struct
platform_device
*
i2s_dev
;
struct
platform_device
*
clk_dev
;
struct
snd_soc_platform
*
platform
;
struct
snd_soc_dai_driver
*
dais
;
...
...
@@ -75,6 +93,8 @@ struct skl {
u8
nr_modules
;
struct
skl_module
**
modules
;
bool
use_tplg_pcm
;
struct
skl_fw_config
cfg
;
struct
snd_soc_acpi_mach
*
mach
;
};
#define skl_to_ebus(s) (&(s)->ebus)
...
...
@@ -125,6 +145,8 @@ const struct skl_dsp_ops *skl_get_dsp_ops(int pci_id);
void
skl_update_d0i3c
(
struct
device
*
dev
,
bool
enable
);
int
skl_nhlt_create_sysfs
(
struct
skl
*
skl
);
void
skl_nhlt_remove_sysfs
(
struct
skl
*
skl
);
void
skl_get_clks
(
struct
skl
*
skl
,
struct
skl_ssp_clk
*
ssp_clks
);
struct
skl_clk_parent_src
*
skl_get_parent_clk
(
u8
clk_id
);
struct
skl_module_cfg
;
...
...
sound/soc/soc-acpi.c
View file @
b68cbc1d
...
...
@@ -16,74 +16,13 @@
#include <sound/soc-acpi.h>
static
acpi_status
snd_soc_acpi_find_name
(
acpi_handle
handle
,
u32
level
,
void
*
context
,
void
**
ret
)
{
struct
acpi_device
*
adev
;
const
char
*
name
=
NULL
;
if
(
acpi_bus_get_device
(
handle
,
&
adev
))
return
AE_OK
;
if
(
adev
->
status
.
present
&&
adev
->
status
.
functional
)
{
name
=
acpi_dev_name
(
adev
);
*
(
const
char
**
)
ret
=
name
;
return
AE_CTRL_TERMINATE
;
}
return
AE_OK
;
}
const
char
*
snd_soc_acpi_find_name_from_hid
(
const
u8
hid
[
ACPI_ID_LEN
])
{
const
char
*
name
=
NULL
;
acpi_status
status
;
status
=
acpi_get_devices
(
hid
,
snd_soc_acpi_find_name
,
NULL
,
(
void
**
)
&
name
);
if
(
ACPI_FAILURE
(
status
)
||
name
[
0
]
==
'\0'
)
return
NULL
;
return
name
;
}
EXPORT_SYMBOL_GPL
(
snd_soc_acpi_find_name_from_hid
);
static
acpi_status
snd_soc_acpi_mach_match
(
acpi_handle
handle
,
u32
level
,
void
*
context
,
void
**
ret
)
{
unsigned
long
long
sta
;
acpi_status
status
;
*
(
bool
*
)
context
=
true
;
status
=
acpi_evaluate_integer
(
handle
,
"_STA"
,
NULL
,
&
sta
);
if
(
ACPI_FAILURE
(
status
)
||
!
(
sta
&
ACPI_STA_DEVICE_PRESENT
))
*
(
bool
*
)
context
=
false
;
return
AE_OK
;
}
bool
snd_soc_acpi_check_hid
(
const
u8
hid
[
ACPI_ID_LEN
])
{
acpi_status
status
;
bool
found
=
false
;
status
=
acpi_get_devices
(
hid
,
snd_soc_acpi_mach_match
,
&
found
,
NULL
);
if
(
ACPI_FAILURE
(
status
))
return
false
;
return
found
;
}
EXPORT_SYMBOL_GPL
(
snd_soc_acpi_check_hid
);
struct
snd_soc_acpi_mach
*
snd_soc_acpi_find_machine
(
struct
snd_soc_acpi_mach
*
machines
)
{
struct
snd_soc_acpi_mach
*
mach
;
for
(
mach
=
machines
;
mach
->
id
[
0
];
mach
++
)
{
if
(
snd_soc_acpi_check_hid
(
mach
->
id
)
==
true
)
{
if
(
acpi_dev_present
(
mach
->
id
,
NULL
,
-
1
)
)
{
if
(
mach
->
machine_quirk
)
mach
=
mach
->
machine_quirk
(
mach
);
return
mach
;
...
...
@@ -161,7 +100,7 @@ struct snd_soc_acpi_mach *snd_soc_acpi_codec_list(void *arg)
return
mach
;
for
(
i
=
0
;
i
<
codec_list
->
num_codecs
;
i
++
)
{
if
(
snd_soc_acpi_check_hid
(
codec_list
->
codecs
[
i
])
!=
true
)
if
(
!
acpi_dev_present
(
codec_list
->
codecs
[
i
],
NULL
,
-
1
)
)
return
NULL
;
}
...
...
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