Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
c988e261
Commit
c988e261
authored
May 13, 2016
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'asoc/topic/intel' into asoc-next
parents
35302156
b2047e99
Changes
34
Hide whitespace changes
Inline
Side-by-side
Showing
34 changed files
with
1140 additions
and
68 deletions
+1140
-68
include/sound/hdaudio_ext.h
include/sound/hdaudio_ext.h
+13
-0
include/sound/soc.h
include/sound/soc.h
+1
-1
sound/hda/ext/hdac_ext_bus.c
sound/hda/ext/hdac_ext_bus.c
+3
-0
sound/hda/ext/hdac_ext_controller.c
sound/hda/ext/hdac_ext_controller.c
+66
-0
sound/soc/codecs/hdac_hdmi.c
sound/soc/codecs/hdac_hdmi.c
+30
-2
sound/soc/intel/Kconfig
sound/soc/intel/Kconfig
+16
-0
sound/soc/intel/atom/sst-atom-controls.c
sound/soc/intel/atom/sst-atom-controls.c
+1
-1
sound/soc/intel/boards/Makefile
sound/soc/intel/boards/Makefile
+2
-0
sound/soc/intel/boards/broadwell.c
sound/soc/intel/boards/broadwell.c
+1
-1
sound/soc/intel/boards/bxt_rt298.c
sound/soc/intel/boards/bxt_rt298.c
+353
-0
sound/soc/intel/boards/bytcr_rt5640.c
sound/soc/intel/boards/bytcr_rt5640.c
+1
-1
sound/soc/intel/boards/bytcr_rt5651.c
sound/soc/intel/boards/bytcr_rt5651.c
+1
-1
sound/soc/intel/boards/cht_bsw_max98090_ti.c
sound/soc/intel/boards/cht_bsw_max98090_ti.c
+1
-1
sound/soc/intel/boards/cht_bsw_rt5645.c
sound/soc/intel/boards/cht_bsw_rt5645.c
+1
-1
sound/soc/intel/boards/cht_bsw_rt5672.c
sound/soc/intel/boards/cht_bsw_rt5672.c
+1
-1
sound/soc/intel/boards/haswell.c
sound/soc/intel/boards/haswell.c
+1
-1
sound/soc/intel/boards/skl_nau88l25_max98357a.c
sound/soc/intel/boards/skl_nau88l25_max98357a.c
+6
-7
sound/soc/intel/boards/skl_nau88l25_ssm4567.c
sound/soc/intel/boards/skl_nau88l25_ssm4567.c
+6
-7
sound/soc/intel/boards/skl_rt286.c
sound/soc/intel/boards/skl_rt286.c
+5
-6
sound/soc/intel/common/sst-acpi.h
sound/soc/intel/common/sst-acpi.h
+9
-0
sound/soc/intel/haswell/sst-haswell-pcm.c
sound/soc/intel/haswell/sst-haswell-pcm.c
+1
-1
sound/soc/intel/skylake/Makefile
sound/soc/intel/skylake/Makefile
+1
-1
sound/soc/intel/skylake/bxt-sst.c
sound/soc/intel/skylake/bxt-sst.c
+328
-0
sound/soc/intel/skylake/skl-messages.c
sound/soc/intel/skylake/skl-messages.c
+121
-1
sound/soc/intel/skylake/skl-nhlt.c
sound/soc/intel/skylake/skl-nhlt.c
+9
-6
sound/soc/intel/skylake/skl-pcm.c
sound/soc/intel/skylake/skl-pcm.c
+93
-12
sound/soc/intel/skylake/skl-sst-dsp.c
sound/soc/intel/skylake/skl-sst-dsp.c
+0
-2
sound/soc/intel/skylake/skl-sst-dsp.h
sound/soc/intel/skylake/skl-sst-dsp.h
+14
-1
sound/soc/intel/skylake/skl-sst.c
sound/soc/intel/skylake/skl-sst.c
+10
-3
sound/soc/intel/skylake/skl-topology.c
sound/soc/intel/skylake/skl-topology.c
+2
-4
sound/soc/intel/skylake/skl-topology.h
sound/soc/intel/skylake/skl-topology.h
+1
-1
sound/soc/intel/skylake/skl-tplg-interface.h
sound/soc/intel/skylake/skl-tplg-interface.h
+1
-1
sound/soc/intel/skylake/skl.c
sound/soc/intel/skylake/skl.c
+38
-1
sound/soc/intel/skylake/skl.h
sound/soc/intel/skylake/skl.h
+3
-3
No files found.
include/sound/hdaudio_ext.h
View file @
c988e261
...
...
@@ -14,6 +14,8 @@
* @gtscap: gts capabilities pointer
* @drsmcap: dma resume capabilities pointer
* @hlink_list: link list of HDA links
* @lock: lock for link mgmt
* @cmd_dma_state: state of cmd DMAs: CORB and RIRB
*/
struct
hdac_ext_bus
{
struct
hdac_bus
bus
;
...
...
@@ -27,6 +29,9 @@ struct hdac_ext_bus {
void
__iomem
*
drsmcap
;
struct
list_head
hlink_list
;
struct
mutex
lock
;
bool
cmd_dma_state
;
};
int
snd_hdac_ext_bus_init
(
struct
hdac_ext_bus
*
sbus
,
struct
device
*
dev
,
...
...
@@ -142,6 +147,9 @@ struct hdac_ext_link {
void
__iomem
*
ml_addr
;
/* link output stream reg pointer */
u32
lcaps
;
/* link capablities */
u16
lsdiid
;
/* link sdi identifier */
int
ref_count
;
struct
list_head
list
;
};
...
...
@@ -154,6 +162,11 @@ void snd_hdac_ext_link_set_stream_id(struct hdac_ext_link *link,
void
snd_hdac_ext_link_clear_stream_id
(
struct
hdac_ext_link
*
link
,
int
stream
);
int
snd_hdac_ext_bus_link_get
(
struct
hdac_ext_bus
*
ebus
,
struct
hdac_ext_link
*
link
);
int
snd_hdac_ext_bus_link_put
(
struct
hdac_ext_bus
*
ebus
,
struct
hdac_ext_link
*
link
);
/* update register macro */
#define snd_hdac_updatel(addr, reg, mask, val) \
writel(((readl(addr + reg) & ~(mask)) | (val)), \
...
...
include/sound/soc.h
View file @
c988e261
...
...
@@ -1002,7 +1002,7 @@ struct snd_soc_dai_link {
*/
const
char
*
platform_name
;
struct
device_node
*
platform_of_node
;
int
be_id
;
/* optional ID for machine driver BE
identification */
int
id
;
/* optional ID for machine driver link
identification */
const
struct
snd_soc_pcm_stream
*
params
;
unsigned
int
num_params
;
...
...
sound/hda/ext/hdac_ext_bus.c
View file @
c988e261
...
...
@@ -105,6 +105,9 @@ int snd_hdac_ext_bus_init(struct hdac_ext_bus *ebus, struct device *dev,
INIT_LIST_HEAD
(
&
ebus
->
hlink_list
);
ebus
->
idx
=
idx
++
;
mutex_init
(
&
ebus
->
lock
);
ebus
->
cmd_dma_state
=
true
;
return
0
;
}
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_bus_init
);
...
...
sound/hda/ext/hdac_ext_controller.c
View file @
c988e261
...
...
@@ -186,6 +186,9 @@ int snd_hdac_ext_bus_get_ml_capabilities(struct hdac_ext_bus *ebus)
hlink
->
lcaps
=
readl
(
hlink
->
ml_addr
+
AZX_REG_ML_LCAP
);
hlink
->
lsdiid
=
readw
(
hlink
->
ml_addr
+
AZX_REG_ML_LSDIID
);
/* since link in On, update the ref */
hlink
->
ref_count
=
1
;
list_add_tail
(
&
hlink
->
list
,
&
ebus
->
hlink_list
);
}
...
...
@@ -327,3 +330,66 @@ int snd_hdac_ext_bus_link_power_down_all(struct hdac_ext_bus *ebus)
return
0
;
}
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_bus_link_power_down_all
);
int
snd_hdac_ext_bus_link_get
(
struct
hdac_ext_bus
*
ebus
,
struct
hdac_ext_link
*
link
)
{
int
ret
=
0
;
mutex_lock
(
&
ebus
->
lock
);
/*
* if we move from 0 to 1, count will be 1 so power up this link
* as well, also check the dma status and trigger that
*/
if
(
++
link
->
ref_count
==
1
)
{
if
(
!
ebus
->
cmd_dma_state
)
{
snd_hdac_bus_init_cmd_io
(
&
ebus
->
bus
);
ebus
->
cmd_dma_state
=
true
;
}
ret
=
snd_hdac_ext_bus_link_power_up
(
link
);
}
mutex_unlock
(
&
ebus
->
lock
);
return
ret
;
}
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_bus_link_get
);
int
snd_hdac_ext_bus_link_put
(
struct
hdac_ext_bus
*
ebus
,
struct
hdac_ext_link
*
link
)
{
int
ret
=
0
;
struct
hdac_ext_link
*
hlink
;
bool
link_up
=
false
;
mutex_lock
(
&
ebus
->
lock
);
/*
* if we move from 1 to 0, count will be 0
* so power down this link as well
*/
if
(
--
link
->
ref_count
==
0
)
{
ret
=
snd_hdac_ext_bus_link_power_down
(
link
);
/*
* now check if all links are off, if so turn off
* cmd dma as well
*/
list_for_each_entry
(
hlink
,
&
ebus
->
hlink_list
,
list
)
{
if
(
hlink
->
ref_count
)
{
link_up
=
true
;
break
;
}
}
if
(
!
link_up
)
{
snd_hdac_bus_stop_cmd_io
(
&
ebus
->
bus
);
ebus
->
cmd_dma_state
=
false
;
}
}
mutex_unlock
(
&
ebus
->
lock
);
return
ret
;
}
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_bus_link_put
);
sound/soc/codecs/hdac_hdmi.c
View file @
c988e261
...
...
@@ -1378,10 +1378,18 @@ static int hdmi_codec_probe(struct snd_soc_codec *codec)
struct
snd_soc_dapm_context
*
dapm
=
snd_soc_component_get_dapm
(
&
codec
->
component
);
struct
hdac_hdmi_pin
*
pin
;
struct
hdac_ext_link
*
hlink
=
NULL
;
int
ret
;
edev
->
scodec
=
codec
;
/*
* hold the ref while we probe, also no need to drop the ref on
* exit, we call pm_runtime_suspend() so that will do for us
*/
hlink
=
snd_hdac_ext_bus_get_link
(
edev
->
ebus
,
dev_name
(
&
edev
->
hdac
.
dev
));
snd_hdac_ext_bus_link_get
(
edev
->
ebus
,
hlink
);
ret
=
create_fill_widget_route_map
(
dapm
);
if
(
ret
<
0
)
return
ret
;
...
...
@@ -1480,9 +1488,14 @@ static int hdac_hdmi_dev_probe(struct hdac_ext_device *edev)
struct
hdac_device
*
codec
=
&
edev
->
hdac
;
struct
hdac_hdmi_priv
*
hdmi_priv
;
struct
snd_soc_dai_driver
*
hdmi_dais
=
NULL
;
struct
hdac_ext_link
*
hlink
=
NULL
;
int
num_dais
=
0
;
int
ret
=
0
;
/* hold the ref while we probe */
hlink
=
snd_hdac_ext_bus_get_link
(
edev
->
ebus
,
dev_name
(
&
edev
->
hdac
.
dev
));
snd_hdac_ext_bus_link_get
(
edev
->
ebus
,
hlink
);
hdmi_priv
=
devm_kzalloc
(
&
codec
->
dev
,
sizeof
(
*
hdmi_priv
),
GFP_KERNEL
);
if
(
hdmi_priv
==
NULL
)
return
-
ENOMEM
;
...
...
@@ -1516,8 +1529,12 @@ static int hdac_hdmi_dev_probe(struct hdac_ext_device *edev)
}
/* ASoC specific initialization */
return
snd_soc_register_codec
(
&
codec
->
dev
,
&
hdmi_hda_codec
,
hdmi_dais
,
num_dais
);
ret
=
snd_soc_register_codec
(
&
codec
->
dev
,
&
hdmi_hda_codec
,
hdmi_dais
,
num_dais
);
snd_hdac_ext_bus_link_put
(
edev
->
ebus
,
hlink
);
return
ret
;
}
static
int
hdac_hdmi_dev_remove
(
struct
hdac_ext_device
*
edev
)
...
...
@@ -1556,6 +1573,9 @@ static int hdac_hdmi_runtime_suspend(struct device *dev)
struct
hdac_ext_device
*
edev
=
to_hda_ext_device
(
dev
);
struct
hdac_device
*
hdac
=
&
edev
->
hdac
;
struct
hdac_bus
*
bus
=
hdac
->
bus
;
unsigned
long
timeout
;
struct
hdac_ext_bus
*
ebus
=
hbus_to_ebus
(
bus
);
struct
hdac_ext_link
*
hlink
=
NULL
;
int
err
;
dev_dbg
(
dev
,
"Enter: %s
\n
"
,
__func__
);
...
...
@@ -1579,6 +1599,9 @@ static int hdac_hdmi_runtime_suspend(struct device *dev)
return
err
;
}
hlink
=
snd_hdac_ext_bus_get_link
(
ebus
,
dev_name
(
dev
));
snd_hdac_ext_bus_link_put
(
ebus
,
hlink
);
return
0
;
}
...
...
@@ -1587,6 +1610,8 @@ static int hdac_hdmi_runtime_resume(struct device *dev)
struct
hdac_ext_device
*
edev
=
to_hda_ext_device
(
dev
);
struct
hdac_device
*
hdac
=
&
edev
->
hdac
;
struct
hdac_bus
*
bus
=
hdac
->
bus
;
struct
hdac_ext_bus
*
ebus
=
hbus_to_ebus
(
bus
);
struct
hdac_ext_link
*
hlink
=
NULL
;
int
err
;
dev_dbg
(
dev
,
"Enter: %s
\n
"
,
__func__
);
...
...
@@ -1595,6 +1620,9 @@ static int hdac_hdmi_runtime_resume(struct device *dev)
if
(
!
bus
)
return
0
;
hlink
=
snd_hdac_ext_bus_get_link
(
ebus
,
dev_name
(
dev
));
snd_hdac_ext_bus_link_get
(
ebus
,
hlink
);
err
=
snd_hdac_display_power
(
bus
,
true
);
if
(
err
<
0
)
{
dev_err
(
bus
->
dev
,
"Cannot turn on display power on i915
\n
"
);
...
...
sound/soc/intel/Kconfig
View file @
c988e261
...
...
@@ -58,6 +58,21 @@ config SND_SOC_INTEL_HASWELL_MACH
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_SST
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
...
...
@@ -162,6 +177,7 @@ config SND_SOC_INTEL_CHT_BSW_MAX98090_TI_MACH
config SND_SOC_INTEL_SKYLAKE
tristate
select SND_HDA_EXT_CORE
select SND_HDA_DSP_LOADER
select SND_SOC_TOPOLOGY
select SND_SOC_INTEL_SST
...
...
sound/soc/intel/atom/sst-atom-controls.c
View file @
c988e261
...
...
@@ -195,7 +195,7 @@ static int sst_check_and_send_slot_map(struct sst_data *drv, struct snd_kcontrol
if
(
e
->
w
&&
e
->
w
->
power
)
ret
=
sst_send_slot_map
(
drv
);
else
else
if
(
!
e
->
w
)
dev_err
(
&
drv
->
pdev
->
dev
,
"Slot control: %s doesn't have DAPM widget!!!
\n
"
,
kcontrol
->
id
.
name
);
return
ret
;
...
...
sound/soc/intel/boards/Makefile
View file @
c988e261
...
...
@@ -2,6 +2,7 @@ snd-soc-sst-haswell-objs := haswell.o
snd-soc-sst-byt-rt5640-mach-objs
:=
byt-rt5640.o
snd-soc-sst-byt-max98090-mach-objs
:=
byt-max98090.o
snd-soc-sst-broadwell-objs
:=
broadwell.o
snd-soc-sst-bxt-rt298-objs
:=
bxt_rt298.o
snd-soc-sst-bytcr-rt5640-objs
:=
bytcr_rt5640.o
snd-soc-sst-bytcr-rt5651-objs
:=
bytcr_rt5651.o
snd-soc-sst-cht-bsw-rt5672-objs
:=
cht_bsw_rt5672.o
...
...
@@ -14,6 +15,7 @@ snd-soc-skl_nau88l25_ssm4567-objs := skl_nau88l25_ssm4567.o
obj-$(CONFIG_SND_SOC_INTEL_HASWELL_MACH)
+=
snd-soc-sst-haswell.o
obj-$(CONFIG_SND_SOC_INTEL_BYT_RT5640_MACH)
+=
snd-soc-sst-byt-rt5640-mach.o
obj-$(CONFIG_SND_SOC_INTEL_BYT_MAX98090_MACH)
+=
snd-soc-sst-byt-max98090-mach.o
obj-$(CONFIG_SND_SOC_INTEL_BXT_RT298_MACH)
+=
snd-soc-sst-bxt-rt298.o
obj-$(CONFIG_SND_SOC_INTEL_BROADWELL_MACH)
+=
snd-soc-sst-broadwell.o
obj-$(CONFIG_SND_SOC_INTEL_BYTCR_RT5640_MACH)
+=
snd-soc-sst-bytcr-rt5640.o
obj-$(CONFIG_SND_SOC_INTEL_BYTCR_RT5651_MACH)
+=
snd-soc-sst-bytcr-rt5651.o
...
...
sound/soc/intel/boards/broadwell.c
View file @
c988e261
...
...
@@ -201,7 +201,7 @@ static struct snd_soc_dai_link broadwell_rt286_dais[] = {
{
/* SSP0 - Codec */
.
name
=
"Codec"
,
.
be_
id
=
0
,
.
id
=
0
,
.
cpu_dai_name
=
"snd-soc-dummy-dai"
,
.
platform_name
=
"snd-soc-dummy"
,
.
no_pcm
=
1
,
...
...
sound/soc/intel/boards/bxt_rt298.c
0 → 100644
View file @
c988e261
/*
* Intel Broxton-P I2S Machine Driver
*
* Copyright (C) 2014-2016, Intel Corporation. All rights reserved.
*
* Modified from:
* Intel Skylake I2S Machine driver
*
* 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.
*/
#include <linux/module.h>
#include <linux/platform_device.h>
#include <sound/core.h>
#include <sound/pcm.h>
#include <sound/soc.h>
#include <sound/jack.h>
#include <sound/pcm_params.h>
#include "../../codecs/hdac_hdmi.h"
#include "../../codecs/rt298.h"
static
struct
snd_soc_jack
broxton_headset
;
/* Headset jack detection DAPM pins */
enum
{
BXT_DPCM_AUDIO_PB
=
0
,
BXT_DPCM_AUDIO_CP
,
BXT_DPCM_AUDIO_REF_CP
,
BXT_DPCM_AUDIO_HDMI1_PB
,
BXT_DPCM_AUDIO_HDMI2_PB
,
BXT_DPCM_AUDIO_HDMI3_PB
,
};
static
struct
snd_soc_jack_pin
broxton_headset_pins
[]
=
{
{
.
pin
=
"Mic Jack"
,
.
mask
=
SND_JACK_MICROPHONE
,
},
{
.
pin
=
"Headphone Jack"
,
.
mask
=
SND_JACK_HEADPHONE
,
},
};
static
const
struct
snd_kcontrol_new
broxton_controls
[]
=
{
SOC_DAPM_PIN_SWITCH
(
"Speaker"
),
SOC_DAPM_PIN_SWITCH
(
"Headphone Jack"
),
SOC_DAPM_PIN_SWITCH
(
"Mic Jack"
),
};
static
const
struct
snd_soc_dapm_widget
broxton_widgets
[]
=
{
SND_SOC_DAPM_HP
(
"Headphone Jack"
,
NULL
),
SND_SOC_DAPM_SPK
(
"Speaker"
,
NULL
),
SND_SOC_DAPM_MIC
(
"Mic Jack"
,
NULL
),
SND_SOC_DAPM_MIC
(
"DMIC2"
,
NULL
),
SND_SOC_DAPM_MIC
(
"SoC DMIC"
,
NULL
),
SND_SOC_DAPM_SPK
(
"HDMI1"
,
NULL
),
SND_SOC_DAPM_SPK
(
"HDMI2"
,
NULL
),
SND_SOC_DAPM_SPK
(
"HDMI3"
,
NULL
),
};
static
const
struct
snd_soc_dapm_route
broxton_rt298_map
[]
=
{
/* speaker */
{
"Speaker"
,
NULL
,
"SPOR"
},
{
"Speaker"
,
NULL
,
"SPOL"
},
/* HP jack connectors - unknown if we have jack detect */
{
"Headphone Jack"
,
NULL
,
"HPO Pin"
},
/* other jacks */
{
"MIC1"
,
NULL
,
"Mic Jack"
},
/* digital mics */
{
"DMIC1 Pin"
,
NULL
,
"DMIC2"
},
{
"DMic"
,
NULL
,
"SoC DMIC"
},
{
"HDMI1"
,
NULL
,
"hif5 Output"
},
{
"HDMI2"
,
NULL
,
"hif6 Output"
},
{
"HDMI3"
,
NULL
,
"hif7 Output"
},
/* CODEC BE connections */
{
"AIF1 Playback"
,
NULL
,
"ssp5 Tx"
},
{
"ssp5 Tx"
,
NULL
,
"codec0_out"
},
{
"codec0_in"
,
NULL
,
"ssp5 Rx"
},
{
"ssp5 Rx"
,
NULL
,
"AIF1 Capture"
},
{
"dmic01_hifi"
,
NULL
,
"DMIC01 Rx"
},
{
"DMIC01 Rx"
,
NULL
,
"Capture"
},
{
"hifi3"
,
NULL
,
"iDisp3 Tx"
},
{
"iDisp3 Tx"
,
NULL
,
"iDisp3_out"
},
{
"hifi2"
,
NULL
,
"iDisp2 Tx"
},
{
"iDisp2 Tx"
,
NULL
,
"iDisp2_out"
},
{
"hifi1"
,
NULL
,
"iDisp1 Tx"
},
{
"iDisp1 Tx"
,
NULL
,
"iDisp1_out"
},
};
static
int
broxton_rt298_codec_init
(
struct
snd_soc_pcm_runtime
*
rtd
)
{
struct
snd_soc_codec
*
codec
=
rtd
->
codec
;
int
ret
=
0
;
ret
=
snd_soc_card_jack_new
(
rtd
->
card
,
"Headset"
,
SND_JACK_HEADSET
|
SND_JACK_BTN_0
,
&
broxton_headset
,
broxton_headset_pins
,
ARRAY_SIZE
(
broxton_headset_pins
));
if
(
ret
)
return
ret
;
rt298_mic_detect
(
codec
,
&
broxton_headset
);
return
0
;
}
static
int
broxton_hdmi_init
(
struct
snd_soc_pcm_runtime
*
rtd
)
{
struct
snd_soc_dai
*
dai
=
rtd
->
codec_dai
;
return
hdac_hdmi_jack_init
(
dai
,
BXT_DPCM_AUDIO_HDMI1_PB
+
dai
->
id
);
}
static
int
broxton_ssp5_fixup
(
struct
snd_soc_pcm_runtime
*
rtd
,
struct
snd_pcm_hw_params
*
params
)
{
struct
snd_interval
*
rate
=
hw_param_interval
(
params
,
SNDRV_PCM_HW_PARAM_RATE
);
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
);
/* The ADSP will covert the FE rate to 48k, stereo */
rate
->
min
=
rate
->
max
=
48000
;
channels
->
min
=
channels
->
max
=
2
;
/* set SSP5 to 24 bit */
snd_mask_none
(
fmt
);
snd_mask_set
(
fmt
,
SNDRV_PCM_FORMAT_S24_LE
);
return
0
;
}
static
int
broxton_rt298_hw_params
(
struct
snd_pcm_substream
*
substream
,
struct
snd_pcm_hw_params
*
params
)
{
struct
snd_soc_pcm_runtime
*
rtd
=
substream
->
private_data
;
struct
snd_soc_dai
*
codec_dai
=
rtd
->
codec_dai
;
int
ret
;
ret
=
snd_soc_dai_set_sysclk
(
codec_dai
,
RT298_SCLK_S_PLL
,
19200000
,
SND_SOC_CLOCK_IN
);
if
(
ret
<
0
)
{
dev_err
(
rtd
->
dev
,
"can't set codec sysclk configuration
\n
"
);
return
ret
;
}
return
ret
;
}
static
struct
snd_soc_ops
broxton_rt298_ops
=
{
.
hw_params
=
broxton_rt298_hw_params
,
};
/* broxton digital audio interface glue - connects codec <--> CPU */
static
struct
snd_soc_dai_link
broxton_rt298_dais
[]
=
{
/* Front End DAI links */
[
BXT_DPCM_AUDIO_PB
]
{
.
name
=
"Bxt Audio Port"
,
.
stream_name
=
"Audio"
,
.
cpu_dai_name
=
"System Pin"
,
.
platform_name
=
"0000:00:0e.0"
,
.
nonatomic
=
1
,
.
dynamic
=
1
,
.
codec_name
=
"snd-soc-dummy"
,
.
codec_dai_name
=
"snd-soc-dummy-dai"
,
.
trigger
=
{
SND_SOC_DPCM_TRIGGER_POST
,
SND_SOC_DPCM_TRIGGER_POST
},
.
dpcm_playback
=
1
,
},
[
BXT_DPCM_AUDIO_CP
]
{
.
name
=
"Bxt Audio Capture Port"
,
.
stream_name
=
"Audio Record"
,
.
cpu_dai_name
=
"System Pin"
,
.
platform_name
=
"0000:00:0e.0"
,
.
nonatomic
=
1
,
.
dynamic
=
1
,
.
codec_name
=
"snd-soc-dummy"
,
.
codec_dai_name
=
"snd-soc-dummy-dai"
,
.
trigger
=
{
SND_SOC_DPCM_TRIGGER_POST
,
SND_SOC_DPCM_TRIGGER_POST
},
.
dpcm_capture
=
1
,
},
[
BXT_DPCM_AUDIO_REF_CP
]
{
.
name
=
"Bxt Audio Reference cap"
,
.
stream_name
=
"refcap"
,
.
cpu_dai_name
=
"Reference Pin"
,
.
codec_name
=
"snd-soc-dummy"
,
.
codec_dai_name
=
"snd-soc-dummy-dai"
,
.
platform_name
=
"0000:00:0e.0"
,
.
init
=
NULL
,
.
dpcm_capture
=
1
,
.
nonatomic
=
1
,
.
dynamic
=
1
,
},
[
BXT_DPCM_AUDIO_HDMI1_PB
]
{
.
name
=
"Bxt HDMI Port1"
,
.
stream_name
=
"Hdmi1"
,
.
cpu_dai_name
=
"HDMI1 Pin"
,
.
codec_name
=
"snd-soc-dummy"
,
.
codec_dai_name
=
"snd-soc-dummy-dai"
,
.
platform_name
=
"0000:00:0e.0"
,
.
dpcm_playback
=
1
,
.
init
=
NULL
,
.
nonatomic
=
1
,
.
dynamic
=
1
,
},
[
BXT_DPCM_AUDIO_HDMI2_PB
]
{
.
name
=
"Bxt HDMI Port2"
,
.
stream_name
=
"Hdmi2"
,
.
cpu_dai_name
=
"HDMI2 Pin"
,
.
codec_name
=
"snd-soc-dummy"
,
.
codec_dai_name
=
"snd-soc-dummy-dai"
,
.
platform_name
=
"0000:00:0e.0"
,
.
dpcm_playback
=
1
,
.
init
=
NULL
,
.
nonatomic
=
1
,
.
dynamic
=
1
,
},
[
BXT_DPCM_AUDIO_HDMI3_PB
]
{
.
name
=
"Bxt HDMI Port3"
,
.
stream_name
=
"Hdmi3"
,
.
cpu_dai_name
=
"HDMI3 Pin"
,
.
codec_name
=
"snd-soc-dummy"
,
.
codec_dai_name
=
"snd-soc-dummy-dai"
,
.
platform_name
=
"0000:00:0e.0"
,
.
dpcm_playback
=
1
,
.
init
=
NULL
,
.
nonatomic
=
1
,
.
dynamic
=
1
,
},
/* Back End DAI links */
{
/* SSP5 - Codec */
.
name
=
"SSP5-Codec"
,
.
id
=
0
,
.
cpu_dai_name
=
"SSP5 Pin"
,
.
platform_name
=
"0000:00:0e.0"
,
.
no_pcm
=
1
,
.
codec_name
=
"i2c-INT343A:00"
,
.
codec_dai_name
=
"rt298-aif1"
,
.
init
=
broxton_rt298_codec_init
,
.
dai_fmt
=
SND_SOC_DAIFMT_DSP_A
|
SND_SOC_DAIFMT_NB_NF
|
SND_SOC_DAIFMT_CBS_CFS
,
.
ignore_pmdown_time
=
1
,
.
be_hw_params_fixup
=
broxton_ssp5_fixup
,
.
ops
=
&
broxton_rt298_ops
,
.
dpcm_playback
=
1
,
.
dpcm_capture
=
1
,
},
{
.
name
=
"dmic01"
,
.
id
=
1
,
.
cpu_dai_name
=
"DMIC01 Pin"
,
.
codec_name
=
"dmic-codec"
,
.
codec_dai_name
=
"dmic-hifi"
,
.
platform_name
=
"0000:00:0e.0"
,
.
ignore_suspend
=
1
,
.
dpcm_capture
=
1
,
.
no_pcm
=
1
,
},
{
.
name
=
"iDisp1"
,
.
id
=
3
,
.
cpu_dai_name
=
"iDisp1 Pin"
,
.
codec_name
=
"ehdaudio0D2"
,
.
codec_dai_name
=
"intel-hdmi-hifi1"
,
.
platform_name
=
"0000:00:0e.0"
,
.
init
=
broxton_hdmi_init
,
.
dpcm_playback
=
1
,
.
no_pcm
=
1
,
},
{
.
name
=
"iDisp2"
,
.
id
=
4
,
.
cpu_dai_name
=
"iDisp2 Pin"
,
.
codec_name
=
"ehdaudio0D2"
,
.
codec_dai_name
=
"intel-hdmi-hifi2"
,
.
platform_name
=
"0000:00:0e.0"
,
.
init
=
broxton_hdmi_init
,
.
dpcm_playback
=
1
,
.
no_pcm
=
1
,
},
{
.
name
=
"iDisp3"
,
.
id
=
5
,
.
cpu_dai_name
=
"iDisp3 Pin"
,
.
codec_name
=
"ehdaudio0D2"
,
.
codec_dai_name
=
"intel-hdmi-hifi3"
,
.
platform_name
=
"0000:00:0e.0"
,
.
init
=
broxton_hdmi_init
,
.
dpcm_playback
=
1
,
.
no_pcm
=
1
,
},
};
/* broxton audio machine driver for SPT + RT298S */
static
struct
snd_soc_card
broxton_rt298
=
{
.
name
=
"broxton-rt298"
,
.
owner
=
THIS_MODULE
,
.
dai_link
=
broxton_rt298_dais
,
.
num_links
=
ARRAY_SIZE
(
broxton_rt298_dais
),
.
controls
=
broxton_controls
,
.
num_controls
=
ARRAY_SIZE
(
broxton_controls
),
.
dapm_widgets
=
broxton_widgets
,
.
num_dapm_widgets
=
ARRAY_SIZE
(
broxton_widgets
),
.
dapm_routes
=
broxton_rt298_map
,
.
num_dapm_routes
=
ARRAY_SIZE
(
broxton_rt298_map
),
.
fully_routed
=
true
,
};
static
int
broxton_audio_probe
(
struct
platform_device
*
pdev
)
{
broxton_rt298
.
dev
=
&
pdev
->
dev
;
return
devm_snd_soc_register_card
(
&
pdev
->
dev
,
&
broxton_rt298
);
}
static
struct
platform_driver
broxton_audio
=
{
.
probe
=
broxton_audio_probe
,
.
driver
=
{
.
name
=
"bxt_alc298s_i2s"
,
},
};
module_platform_driver
(
broxton_audio
)
/* Module information */
MODULE_AUTHOR
(
"Ramesh Babu <Ramesh.Babu@intel.com>"
);
MODULE_AUTHOR
(
"Senthilnathan Veppur <senthilnathanx.veppur@intel.com>"
);
MODULE_DESCRIPTION
(
"Intel SST Audio for Broxton"
);
MODULE_LICENSE
(
"GPL v2"
);
MODULE_ALIAS
(
"platform:bxt_alc298s_i2s"
);
sound/soc/intel/boards/bytcr_rt5640.c
View file @
c988e261
...
...
@@ -304,7 +304,7 @@ static struct snd_soc_dai_link byt_rt5640_dais[] = {
/* back ends */
{
.
name
=
"SSP2-Codec"
,
.
be_
id
=
1
,
.
id
=
1
,
.
cpu_dai_name
=
"ssp2-port"
,
.
platform_name
=
"sst-mfld-platform"
,
.
no_pcm
=
1
,
...
...
sound/soc/intel/boards/bytcr_rt5651.c
View file @
c988e261
...
...
@@ -267,7 +267,7 @@ static struct snd_soc_dai_link byt_rt5651_dais[] = {
/* back ends */
{
.
name
=
"SSP2-Codec"
,
.
be_
id
=
1
,
.
id
=
1
,
.
cpu_dai_name
=
"ssp2-port"
,
.
platform_name
=
"sst-mfld-platform"
,
.
no_pcm
=
1
,
...
...
sound/soc/intel/boards/cht_bsw_max98090_ti.c
View file @
c988e261
...
...
@@ -255,7 +255,7 @@ static struct snd_soc_dai_link cht_dailink[] = {
/* back ends */
{
.
name
=
"SSP2-Codec"
,
.
be_
id
=
1
,
.
id
=
1
,
.
cpu_dai_name
=
"ssp2-port"
,
.
platform_name
=
"sst-mfld-platform"
,
.
no_pcm
=
1
,
...
...
sound/soc/intel/boards/cht_bsw_rt5645.c
View file @
c988e261
...
...
@@ -295,7 +295,7 @@ static struct snd_soc_dai_link cht_dailink[] = {
/* back ends */
{
.
name
=
"SSP2-Codec"
,
.
be_
id
=
1
,
.
id
=
1
,
.
cpu_dai_name
=
"ssp2-port"
,
.
platform_name
=
"sst-mfld-platform"
,
.
no_pcm
=
1
,
...
...
sound/soc/intel/boards/cht_bsw_rt5672.c
View file @
c988e261
...
...
@@ -273,7 +273,7 @@ static struct snd_soc_dai_link cht_dailink[] = {
{
/* SSP2 - Codec */
.
name
=
"SSP2-Codec"
,
.
be_
id
=
1
,
.
id
=
1
,
.
cpu_dai_name
=
"ssp2-port"
,
.
platform_name
=
"sst-mfld-platform"
,
.
no_pcm
=
1
,
...
...
sound/soc/intel/boards/haswell.c
View file @
c988e261
...
...
@@ -156,7 +156,7 @@ static struct snd_soc_dai_link haswell_rt5640_dais[] = {
{
/* SSP0 - Codec */
.
name
=
"Codec"
,
.
be_
id
=
0
,
.
id
=
0
,
.
cpu_dai_name
=
"snd-soc-dummy-dai"
,
.
platform_name
=
"snd-soc-dummy"
,
.
no_pcm
=
1
,
...
...
sound/soc/intel/boards/skl_nau88l25_max98357a.c
View file @
c988e261
...
...
@@ -391,7 +391,6 @@ static struct snd_soc_dai_link skylake_dais[] = {
.
platform_name
=
"0000:00:1f.3"
,
.
init
=
NULL
,
.
dpcm_capture
=
1
,
.
ignore_suspend
=
1
,
.
nonatomic
=
1
,
.
dynamic
=
1
,
.
ops
=
&
skylaye_refcap_ops
,
...
...
@@ -456,7 +455,7 @@ static struct snd_soc_dai_link skylake_dais[] = {
{
/* SSP0 - Codec */
.
name
=
"SSP0-Codec"
,
.
be_
id
=
0
,
.
id
=
0
,
.
cpu_dai_name
=
"SSP0 Pin"
,
.
platform_name
=
"0000:00:1f.3"
,
.
no_pcm
=
1
,
...
...
@@ -472,7 +471,7 @@ static struct snd_soc_dai_link skylake_dais[] = {
{
/* SSP1 - Codec */
.
name
=
"SSP1-Codec"
,
.
be_
id
=
1
,
.
id
=
1
,
.
cpu_dai_name
=
"SSP1 Pin"
,
.
platform_name
=
"0000:00:1f.3"
,
.
no_pcm
=
1
,
...
...
@@ -489,7 +488,7 @@ static struct snd_soc_dai_link skylake_dais[] = {
},
{
.
name
=
"dmic01"
,
.
be_
id
=
2
,
.
id
=
2
,
.
cpu_dai_name
=
"DMIC01 Pin"
,
.
codec_name
=
"dmic-codec"
,
.
codec_dai_name
=
"dmic-hifi"
,
...
...
@@ -501,7 +500,7 @@ static struct snd_soc_dai_link skylake_dais[] = {
},
{
.
name
=
"iDisp1"
,
.
be_
id
=
3
,
.
id
=
3
,
.
cpu_dai_name
=
"iDisp1 Pin"
,
.
codec_name
=
"ehdaudio0D2"
,
.
codec_dai_name
=
"intel-hdmi-hifi1"
,
...
...
@@ -512,7 +511,7 @@ static struct snd_soc_dai_link skylake_dais[] = {
},
{
.
name
=
"iDisp2"
,
.
be_
id
=
4
,
.
id
=
4
,
.
cpu_dai_name
=
"iDisp2 Pin"
,
.
codec_name
=
"ehdaudio0D2"
,
.
codec_dai_name
=
"intel-hdmi-hifi2"
,
...
...
@@ -523,7 +522,7 @@ static struct snd_soc_dai_link skylake_dais[] = {
},
{
.
name
=
"iDisp3"
,
.
be_
id
=
5
,
.
id
=
5
,
.
cpu_dai_name
=
"iDisp3 Pin"
,
.
codec_name
=
"ehdaudio0D2"
,
.
codec_dai_name
=
"intel-hdmi-hifi3"
,
...
...
sound/soc/intel/boards/skl_nau88l25_ssm4567.c
View file @
c988e261
...
...
@@ -440,7 +440,6 @@ static struct snd_soc_dai_link skylake_dais[] = {
.
platform_name
=
"0000:00:1f.3"
,
.
init
=
NULL
,
.
dpcm_capture
=
1
,
.
ignore_suspend
=
1
,
.
nonatomic
=
1
,
.
dynamic
=
1
,
.
ops
=
&
skylaye_refcap_ops
,
...
...
@@ -505,7 +504,7 @@ static struct snd_soc_dai_link skylake_dais[] = {
{
/* SSP0 - Codec */
.
name
=
"SSP0-Codec"
,
.
be_
id
=
0
,
.
id
=
0
,
.
cpu_dai_name
=
"SSP0 Pin"
,
.
platform_name
=
"0000:00:1f.3"
,
.
no_pcm
=
1
,
...
...
@@ -523,7 +522,7 @@ static struct snd_soc_dai_link skylake_dais[] = {
{
/* SSP1 - Codec */
.
name
=
"SSP1-Codec"
,
.
be_
id
=
1
,
.
id
=
1
,
.
cpu_dai_name
=
"SSP1 Pin"
,
.
platform_name
=
"0000:00:1f.3"
,
.
no_pcm
=
1
,
...
...
@@ -540,7 +539,7 @@ static struct snd_soc_dai_link skylake_dais[] = {
},
{
.
name
=
"dmic01"
,
.
be_
id
=
2
,
.
id
=
2
,
.
cpu_dai_name
=
"DMIC01 Pin"
,
.
codec_name
=
"dmic-codec"
,
.
codec_dai_name
=
"dmic-hifi"
,
...
...
@@ -552,7 +551,7 @@ static struct snd_soc_dai_link skylake_dais[] = {
},
{
.
name
=
"iDisp1"
,
.
be_
id
=
3
,
.
id
=
3
,
.
cpu_dai_name
=
"iDisp1 Pin"
,
.
codec_name
=
"ehdaudio0D2"
,
.
codec_dai_name
=
"intel-hdmi-hifi1"
,
...
...
@@ -563,7 +562,7 @@ static struct snd_soc_dai_link skylake_dais[] = {
},
{
.
name
=
"iDisp2"
,
.
be_
id
=
4
,
.
id
=
4
,
.
cpu_dai_name
=
"iDisp2 Pin"
,
.
codec_name
=
"ehdaudio0D2"
,
.
codec_dai_name
=
"intel-hdmi-hifi2"
,
...
...
@@ -574,7 +573,7 @@ static struct snd_soc_dai_link skylake_dais[] = {
},
{
.
name
=
"iDisp3"
,
.
be_
id
=
5
,
.
id
=
5
,
.
cpu_dai_name
=
"iDisp3 Pin"
,
.
codec_name
=
"ehdaudio0D2"
,
.
codec_dai_name
=
"intel-hdmi-hifi3"
,
...
...
sound/soc/intel/boards/skl_rt286.c
View file @
c988e261
...
...
@@ -317,7 +317,6 @@ static struct snd_soc_dai_link skylake_rt286_dais[] = {
.
platform_name
=
"0000:00:1f.3"
,
.
init
=
NULL
,
.
dpcm_capture
=
1
,
.
ignore_suspend
=
1
,
.
nonatomic
=
1
,
.
dynamic
=
1
,
},
...
...
@@ -375,7 +374,7 @@ static struct snd_soc_dai_link skylake_rt286_dais[] = {
{
/* SSP0 - Codec */
.
name
=
"SSP0-Codec"
,
.
be_
id
=
0
,
.
id
=
0
,
.
cpu_dai_name
=
"SSP0 Pin"
,
.
platform_name
=
"0000:00:1f.3"
,
.
no_pcm
=
1
,
...
...
@@ -393,7 +392,7 @@ static struct snd_soc_dai_link skylake_rt286_dais[] = {
},
{
.
name
=
"dmic01"
,
.
be_
id
=
1
,
.
id
=
1
,
.
cpu_dai_name
=
"DMIC01 Pin"
,
.
codec_name
=
"dmic-codec"
,
.
codec_dai_name
=
"dmic-hifi"
,
...
...
@@ -405,7 +404,7 @@ static struct snd_soc_dai_link skylake_rt286_dais[] = {
},
{
.
name
=
"iDisp1"
,
.
be_
id
=
2
,
.
id
=
2
,
.
cpu_dai_name
=
"iDisp1 Pin"
,
.
codec_name
=
"ehdaudio0D2"
,
.
codec_dai_name
=
"intel-hdmi-hifi1"
,
...
...
@@ -416,7 +415,7 @@ static struct snd_soc_dai_link skylake_rt286_dais[] = {
},
{
.
name
=
"iDisp2"
,
.
be_
id
=
3
,
.
id
=
3
,
.
cpu_dai_name
=
"iDisp2 Pin"
,
.
codec_name
=
"ehdaudio0D2"
,
.
codec_dai_name
=
"intel-hdmi-hifi2"
,
...
...
@@ -427,7 +426,7 @@ static struct snd_soc_dai_link skylake_rt286_dais[] = {
},
{
.
name
=
"iDisp3"
,
.
be_
id
=
4
,
.
id
=
4
,
.
cpu_dai_name
=
"iDisp3 Pin"
,
.
codec_name
=
"ehdaudio0D2"
,
.
codec_dai_name
=
"intel-hdmi-hifi3"
,
...
...
sound/soc/intel/common/sst-acpi.h
View file @
c988e261
...
...
@@ -12,10 +12,19 @@
*
*/
#include <linux/kconfig.h>
#include <linux/stddef.h>
#include <linux/acpi.h>
/* translation fron HID to I2C name, needed for DAI codec_name */
#if IS_ENABLED(CONFIG_ACPI)
const
char
*
sst_acpi_find_name_from_hid
(
const
u8
hid
[
ACPI_ID_LEN
]);
#else
inline
const
char
*
sst_acpi_find_name_from_hid
(
const
u8
hid
[
ACPI_ID_LEN
])
{
return
NULL
;
}
#endif
/* acpi match */
struct
sst_acpi_mach
*
sst_acpi_find_machine
(
struct
sst_acpi_mach
*
machines
);
...
...
sound/soc/intel/haswell/sst-haswell-pcm.c
View file @
c988e261
...
...
@@ -445,7 +445,7 @@ static int create_adsp_page_table(struct snd_pcm_substream *substream,
pages
=
snd_sgbuf_aligned_pages
(
size
);
dev_dbg
(
rtd
->
dev
,
"generating page table for %p size 0x%z
u
pages %d
\n
"
,
dev_dbg
(
rtd
->
dev
,
"generating page table for %p size 0x%z
x
pages %d
\n
"
,
dma_area
,
size
,
pages
);
for
(
i
=
0
;
i
<
pages
;
i
++
)
{
...
...
sound/soc/intel/skylake/Makefile
View file @
c988e261
...
...
@@ -5,6 +5,6 @@ obj-$(CONFIG_SND_SOC_INTEL_SKYLAKE) += snd-soc-skl.o
# Skylake IPC Support
snd-soc-skl-ipc-objs
:=
skl-sst-ipc.o skl-sst-dsp.o skl-sst-cldma.o
\
skl-sst.o
skl-sst.o
bxt-sst.o
obj-$(CONFIG_SND_SOC_INTEL_SKYLAKE)
+=
snd-soc-skl-ipc.o
sound/soc/intel/skylake/bxt-sst.c
0 → 100644
View file @
c988e261
/*
* bxt-sst.c - DSP library functions for BXT platform
*
* Copyright (C) 2015-16 Intel Corp
* Author:Rafal Redzimski <rafal.f.redzimski@intel.com>
* Jeeja KP <jeeja.kp@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.
*/
#include <linux/module.h>
#include <linux/delay.h>
#include <linux/firmware.h>
#include <linux/device.h>
#include "../common/sst-dsp.h"
#include "../common/sst-dsp-priv.h"
#include "skl-sst-ipc.h"
#define BXT_BASEFW_TIMEOUT 3000
#define BXT_INIT_TIMEOUT 500
#define BXT_IPC_PURGE_FW 0x01004000
#define BXT_ROM_INIT 0x5
#define BXT_ADSP_SRAM0_BASE 0x80000
/* Firmware status window */
#define BXT_ADSP_FW_STATUS BXT_ADSP_SRAM0_BASE
#define BXT_ADSP_ERROR_CODE (BXT_ADSP_FW_STATUS + 0x4)
#define BXT_ADSP_SRAM1_BASE 0xA0000
static
unsigned
int
bxt_get_errorcode
(
struct
sst_dsp
*
ctx
)
{
return
sst_dsp_shim_read
(
ctx
,
BXT_ADSP_ERROR_CODE
);
}
static
int
sst_bxt_prepare_fw
(
struct
sst_dsp
*
ctx
,
const
void
*
fwdata
,
u32
fwsize
)
{
int
stream_tag
,
ret
,
i
;
u32
reg
;
stream_tag
=
ctx
->
dsp_ops
.
prepare
(
ctx
->
dev
,
0x40
,
fwsize
,
&
ctx
->
dmab
);
if
(
stream_tag
<
0
)
{
dev_err
(
ctx
->
dev
,
"Failed to prepare DMA FW loading err: %x
\n
"
,
stream_tag
);
return
stream_tag
;
}
ctx
->
dsp_ops
.
stream_tag
=
stream_tag
;
memcpy
(
ctx
->
dmab
.
area
,
fwdata
,
fwsize
);
/* Purge FW request */
sst_dsp_shim_write
(
ctx
,
SKL_ADSP_REG_HIPCI
,
SKL_ADSP_REG_HIPCI_BUSY
|
BXT_IPC_PURGE_FW
|
(
stream_tag
-
1
));
ret
=
skl_dsp_enable_core
(
ctx
);
if
(
ret
<
0
)
{
dev_err
(
ctx
->
dev
,
"Boot dsp core failed ret: %d
\n
"
,
ret
);
ret
=
-
EIO
;
goto
base_fw_load_failed
;
}
for
(
i
=
BXT_INIT_TIMEOUT
;
i
>
0
;
--
i
)
{
reg
=
sst_dsp_shim_read
(
ctx
,
SKL_ADSP_REG_HIPCIE
);
if
(
reg
&
SKL_ADSP_REG_HIPCIE_DONE
)
{
sst_dsp_shim_update_bits_forced
(
ctx
,
SKL_ADSP_REG_HIPCIE
,
SKL_ADSP_REG_HIPCIE_DONE
,
SKL_ADSP_REG_HIPCIE_DONE
);
break
;
}
mdelay
(
1
);
}
if
(
!
i
)
{
dev_info
(
ctx
->
dev
,
"Waiting for HIPCIE done, reg: 0x%x
\n
"
,
reg
);
sst_dsp_shim_update_bits
(
ctx
,
SKL_ADSP_REG_HIPCIE
,
SKL_ADSP_REG_HIPCIE_DONE
,
SKL_ADSP_REG_HIPCIE_DONE
);
}
/* enable Interrupt */
skl_ipc_int_enable
(
ctx
);
skl_ipc_op_int_enable
(
ctx
);
for
(
i
=
BXT_INIT_TIMEOUT
;
i
>
0
;
--
i
)
{
if
(
SKL_FW_INIT
==
(
sst_dsp_shim_read
(
ctx
,
BXT_ADSP_FW_STATUS
)
&
SKL_FW_STS_MASK
))
{
dev_info
(
ctx
->
dev
,
"ROM loaded, continue FW loading
\n
"
);
break
;
}
mdelay
(
1
);
}
if
(
!
i
)
{
dev_err
(
ctx
->
dev
,
"Timeout for ROM init, HIPCIE: 0x%x
\n
"
,
reg
);
ret
=
-
EIO
;
goto
base_fw_load_failed
;
}
return
ret
;
base_fw_load_failed:
ctx
->
dsp_ops
.
cleanup
(
ctx
->
dev
,
&
ctx
->
dmab
,
stream_tag
);
skl_dsp_disable_core
(
ctx
);
return
ret
;
}
static
int
sst_transfer_fw_host_dma
(
struct
sst_dsp
*
ctx
)
{
int
ret
;
ctx
->
dsp_ops
.
trigger
(
ctx
->
dev
,
true
,
ctx
->
dsp_ops
.
stream_tag
);
ret
=
sst_dsp_register_poll
(
ctx
,
BXT_ADSP_FW_STATUS
,
SKL_FW_STS_MASK
,
BXT_ROM_INIT
,
BXT_BASEFW_TIMEOUT
,
"Firmware boot"
);
ctx
->
dsp_ops
.
trigger
(
ctx
->
dev
,
false
,
ctx
->
dsp_ops
.
stream_tag
);
ctx
->
dsp_ops
.
cleanup
(
ctx
->
dev
,
&
ctx
->
dmab
,
ctx
->
dsp_ops
.
stream_tag
);
return
ret
;
}
static
int
bxt_load_base_firmware
(
struct
sst_dsp
*
ctx
)
{
const
struct
firmware
*
fw
=
NULL
;
struct
skl_sst
*
skl
=
ctx
->
thread_context
;
int
ret
;
ret
=
request_firmware
(
&
fw
,
ctx
->
fw_name
,
ctx
->
dev
);
if
(
ret
<
0
)
{
dev_err
(
ctx
->
dev
,
"Request firmware failed %d
\n
"
,
ret
);
goto
sst_load_base_firmware_failed
;
}
ret
=
sst_bxt_prepare_fw
(
ctx
,
fw
->
data
,
fw
->
size
);
/* Retry Enabling core and ROM load. Retry seemed to help */
if
(
ret
<
0
)
{
ret
=
sst_bxt_prepare_fw
(
ctx
,
fw
->
data
,
fw
->
size
);
if
(
ret
<
0
)
{
dev_err
(
ctx
->
dev
,
"Core En/ROM load fail:%d
\n
"
,
ret
);
goto
sst_load_base_firmware_failed
;
}
}
ret
=
sst_transfer_fw_host_dma
(
ctx
);
if
(
ret
<
0
)
{
dev_err
(
ctx
->
dev
,
"Transfer firmware failed %d
\n
"
,
ret
);
dev_info
(
ctx
->
dev
,
"Error code=0x%x: FW status=0x%x
\n
"
,
sst_dsp_shim_read
(
ctx
,
BXT_ADSP_ERROR_CODE
),
sst_dsp_shim_read
(
ctx
,
BXT_ADSP_FW_STATUS
));
skl_dsp_disable_core
(
ctx
);
}
else
{
dev_dbg
(
ctx
->
dev
,
"Firmware download successful
\n
"
);
ret
=
wait_event_timeout
(
skl
->
boot_wait
,
skl
->
boot_complete
,
msecs_to_jiffies
(
SKL_IPC_BOOT_MSECS
));
if
(
ret
==
0
)
{
dev_err
(
ctx
->
dev
,
"DSP boot fail, FW Ready timeout
\n
"
);
skl_dsp_disable_core
(
ctx
);
ret
=
-
EIO
;
}
else
{
skl_dsp_set_state_locked
(
ctx
,
SKL_DSP_RUNNING
);
ret
=
0
;
}
}
sst_load_base_firmware_failed:
release_firmware
(
fw
);
return
ret
;
}
static
int
bxt_set_dsp_D0
(
struct
sst_dsp
*
ctx
)
{
struct
skl_sst
*
skl
=
ctx
->
thread_context
;
int
ret
;
skl
->
boot_complete
=
false
;
ret
=
skl_dsp_enable_core
(
ctx
);
if
(
ret
<
0
)
{
dev_err
(
ctx
->
dev
,
"enable dsp core failed ret: %d
\n
"
,
ret
);
return
ret
;
}
/* enable interrupt */
skl_ipc_int_enable
(
ctx
);
skl_ipc_op_int_enable
(
ctx
);
ret
=
wait_event_timeout
(
skl
->
boot_wait
,
skl
->
boot_complete
,
msecs_to_jiffies
(
SKL_IPC_BOOT_MSECS
));
if
(
ret
==
0
)
{
dev_err
(
ctx
->
dev
,
"ipc: error DSP boot timeout
\n
"
);
dev_err
(
ctx
->
dev
,
"Error code=0x%x: FW status=0x%x
\n
"
,
sst_dsp_shim_read
(
ctx
,
BXT_ADSP_ERROR_CODE
),
sst_dsp_shim_read
(
ctx
,
BXT_ADSP_FW_STATUS
));
return
-
EIO
;
}
skl_dsp_set_state_locked
(
ctx
,
SKL_DSP_RUNNING
);
return
0
;
}
static
int
bxt_set_dsp_D3
(
struct
sst_dsp
*
ctx
)
{
struct
skl_ipc_dxstate_info
dx
;
struct
skl_sst
*
skl
=
ctx
->
thread_context
;
int
ret
=
0
;
if
(
!
is_skl_dsp_running
(
ctx
))
return
ret
;
dx
.
core_mask
=
SKL_DSP_CORE0_MASK
;
dx
.
dx_mask
=
SKL_IPC_D3_MASK
;
ret
=
skl_ipc_set_dx
(
&
skl
->
ipc
,
SKL_INSTANCE_ID
,
SKL_BASE_FW_MODULE_ID
,
&
dx
);
if
(
ret
<
0
)
{
dev_err
(
ctx
->
dev
,
"Failed to set DSP to D3 state: %d
\n
"
,
ret
);
return
ret
;
}
ret
=
skl_dsp_disable_core
(
ctx
);
if
(
ret
<
0
)
{
dev_err
(
ctx
->
dev
,
"disbale dsp core failed: %d
\n
"
,
ret
);
ret
=
-
EIO
;
}
skl_dsp_set_state_locked
(
ctx
,
SKL_DSP_RESET
);
return
0
;
}
static
struct
skl_dsp_fw_ops
bxt_fw_ops
=
{
.
set_state_D0
=
bxt_set_dsp_D0
,
.
set_state_D3
=
bxt_set_dsp_D3
,
.
load_fw
=
bxt_load_base_firmware
,
.
get_fw_errcode
=
bxt_get_errorcode
,
};
static
struct
sst_ops
skl_ops
=
{
.
irq_handler
=
skl_dsp_sst_interrupt
,
.
write
=
sst_shim32_write
,
.
read
=
sst_shim32_read
,
.
ram_read
=
sst_memcpy_fromio_32
,
.
ram_write
=
sst_memcpy_toio_32
,
.
free
=
skl_dsp_free
,
};
static
struct
sst_dsp_device
skl_dev
=
{
.
thread
=
skl_dsp_irq_thread_handler
,
.
ops
=
&
skl_ops
,
};
int
bxt_sst_dsp_init
(
struct
device
*
dev
,
void
__iomem
*
mmio_base
,
int
irq
,
const
char
*
fw_name
,
struct
skl_dsp_loader_ops
dsp_ops
,
struct
skl_sst
**
dsp
)
{
struct
skl_sst
*
skl
;
struct
sst_dsp
*
sst
;
int
ret
;
skl
=
devm_kzalloc
(
dev
,
sizeof
(
*
skl
),
GFP_KERNEL
);
if
(
skl
==
NULL
)
return
-
ENOMEM
;
skl
->
dev
=
dev
;
skl_dev
.
thread_context
=
skl
;
skl
->
dsp
=
skl_dsp_ctx_init
(
dev
,
&
skl_dev
,
irq
);
if
(
!
skl
->
dsp
)
{
dev_err
(
skl
->
dev
,
"skl_dsp_ctx_init failed
\n
"
);
return
-
ENODEV
;
}
sst
=
skl
->
dsp
;
sst
->
fw_name
=
fw_name
;
sst
->
dsp_ops
=
dsp_ops
;
sst
->
fw_ops
=
bxt_fw_ops
;
sst
->
addr
.
lpe
=
mmio_base
;
sst
->
addr
.
shim
=
mmio_base
;
sst_dsp_mailbox_init
(
sst
,
(
BXT_ADSP_SRAM0_BASE
+
SKL_ADSP_W0_STAT_SZ
),
SKL_ADSP_W0_UP_SZ
,
BXT_ADSP_SRAM1_BASE
,
SKL_ADSP_W1_SZ
);
ret
=
skl_ipc_init
(
dev
,
skl
);
if
(
ret
)
return
ret
;
skl
->
boot_complete
=
false
;
init_waitqueue_head
(
&
skl
->
boot_wait
);
ret
=
sst
->
fw_ops
.
load_fw
(
sst
);
if
(
ret
<
0
)
{
dev_err
(
dev
,
"Load base fw failed: %x"
,
ret
);
return
ret
;
}
if
(
dsp
)
*
dsp
=
skl
;
return
0
;
}
EXPORT_SYMBOL_GPL
(
bxt_sst_dsp_init
);
void
bxt_sst_dsp_cleanup
(
struct
device
*
dev
,
struct
skl_sst
*
ctx
)
{
skl_ipc_free
(
&
ctx
->
ipc
);
ctx
->
dsp
->
cl_dev
.
ops
.
cl_cleanup_controller
(
ctx
->
dsp
);
if
(
ctx
->
dsp
->
addr
.
lpe
)
iounmap
(
ctx
->
dsp
->
addr
.
lpe
);
ctx
->
dsp
->
ops
->
free
(
ctx
->
dsp
);
}
EXPORT_SYMBOL_GPL
(
bxt_sst_dsp_cleanup
);
MODULE_LICENSE
(
"GPL v2"
);
MODULE_DESCRIPTION
(
"Intel Broxton IPC driver"
);
sound/soc/intel/skylake/skl-messages.c
View file @
c988e261
...
...
@@ -72,6 +72,105 @@ static void skl_dsp_enable_notification(struct skl_sst *ctx, bool enable)
skl_ipc_set_large_config
(
&
ctx
->
ipc
,
&
msg
,
(
u32
*
)
&
mask
);
}
static
int
skl_dsp_setup_spib
(
struct
device
*
dev
,
unsigned
int
size
,
int
stream_tag
,
int
enable
)
{
struct
hdac_ext_bus
*
ebus
=
dev_get_drvdata
(
dev
);
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
struct
hdac_stream
*
stream
=
snd_hdac_get_stream
(
bus
,
SNDRV_PCM_STREAM_PLAYBACK
,
stream_tag
);
struct
hdac_ext_stream
*
estream
;
if
(
!
stream
)
return
-
EINVAL
;
estream
=
stream_to_hdac_ext_stream
(
stream
);
/* enable/disable SPIB for this hdac stream */
snd_hdac_ext_stream_spbcap_enable
(
ebus
,
enable
,
stream
->
index
);
/* set the spib value */
snd_hdac_ext_stream_set_spib
(
ebus
,
estream
,
size
);
return
0
;
}
static
int
skl_dsp_prepare
(
struct
device
*
dev
,
unsigned
int
format
,
unsigned
int
size
,
struct
snd_dma_buffer
*
dmab
)
{
struct
hdac_ext_bus
*
ebus
=
dev_get_drvdata
(
dev
);
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
struct
hdac_ext_stream
*
estream
;
struct
hdac_stream
*
stream
;
struct
snd_pcm_substream
substream
;
int
ret
;
if
(
!
bus
)
return
-
ENODEV
;
memset
(
&
substream
,
0
,
sizeof
(
substream
));
substream
.
stream
=
SNDRV_PCM_STREAM_PLAYBACK
;
estream
=
snd_hdac_ext_stream_assign
(
ebus
,
&
substream
,
HDAC_EXT_STREAM_TYPE_HOST
);
if
(
!
estream
)
return
-
ENODEV
;
stream
=
hdac_stream
(
estream
);
/* assign decouple host dma channel */
ret
=
snd_hdac_dsp_prepare
(
stream
,
format
,
size
,
dmab
);
if
(
ret
<
0
)
return
ret
;
skl_dsp_setup_spib
(
dev
,
size
,
stream
->
stream_tag
,
true
);
return
stream
->
stream_tag
;
}
static
int
skl_dsp_trigger
(
struct
device
*
dev
,
bool
start
,
int
stream_tag
)
{
struct
hdac_ext_bus
*
ebus
=
dev_get_drvdata
(
dev
);
struct
hdac_stream
*
stream
;
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
if
(
!
bus
)
return
-
ENODEV
;
stream
=
snd_hdac_get_stream
(
bus
,
SNDRV_PCM_STREAM_PLAYBACK
,
stream_tag
);
if
(
!
stream
)
return
-
EINVAL
;
snd_hdac_dsp_trigger
(
stream
,
start
);
return
0
;
}
static
int
skl_dsp_cleanup
(
struct
device
*
dev
,
struct
snd_dma_buffer
*
dmab
,
int
stream_tag
)
{
struct
hdac_ext_bus
*
ebus
=
dev_get_drvdata
(
dev
);
struct
hdac_stream
*
stream
;
struct
hdac_ext_stream
*
estream
;
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
if
(
!
bus
)
return
-
ENODEV
;
stream
=
snd_hdac_get_stream
(
bus
,
SNDRV_PCM_STREAM_PLAYBACK
,
stream_tag
);
if
(
!
stream
)
return
-
EINVAL
;
estream
=
stream_to_hdac_ext_stream
(
stream
);
skl_dsp_setup_spib
(
dev
,
0
,
stream_tag
,
false
);
snd_hdac_ext_stream_release
(
estream
,
HDAC_EXT_STREAM_TYPE_HOST
);
snd_hdac_dsp_cleanup
(
stream
,
dmab
);
return
0
;
}
static
struct
skl_dsp_loader_ops
skl_get_loader_ops
(
void
)
{
struct
skl_dsp_loader_ops
loader_ops
;
...
...
@@ -84,6 +183,21 @@ static struct skl_dsp_loader_ops skl_get_loader_ops(void)
return
loader_ops
;
};
static
struct
skl_dsp_loader_ops
bxt_get_loader_ops
(
void
)
{
struct
skl_dsp_loader_ops
loader_ops
;
memset
(
&
loader_ops
,
0
,
sizeof
(
loader_ops
));
loader_ops
.
alloc_dma_buf
=
skl_alloc_dma_buf
;
loader_ops
.
free_dma_buf
=
skl_free_dma_buf
;
loader_ops
.
prepare
=
skl_dsp_prepare
;
loader_ops
.
trigger
=
skl_dsp_trigger
;
loader_ops
.
cleanup
=
skl_dsp_cleanup
;
return
loader_ops
;
};
static
const
struct
skl_dsp_ops
dsp_ops
[]
=
{
{
.
id
=
0x9d70
,
...
...
@@ -91,6 +205,12 @@ static const struct skl_dsp_ops dsp_ops[] = {
.
init
=
skl_sst_dsp_init
,
.
cleanup
=
skl_sst_dsp_cleanup
},
{
.
id
=
0x5a98
,
.
loader_ops
=
bxt_get_loader_ops
,
.
init
=
bxt_sst_dsp_init
,
.
cleanup
=
bxt_sst_dsp_cleanup
},
};
static
int
skl_get_dsp_ops
(
int
pci_id
)
...
...
@@ -744,7 +864,7 @@ int skl_init_module(struct skl_sst *ctx,
return
ret
;
}
mconfig
->
m_state
=
SKL_MODULE_INIT_DONE
;
kfree
(
param_data
);
return
ret
;
}
...
...
sound/soc/intel/skylake/skl-nhlt.c
View file @
c988e261
...
...
@@ -25,11 +25,12 @@ static u8 OSC_UUID[16] = {0x6E, 0x88, 0x9F, 0xA6, 0xEB, 0x6C, 0x94, 0x45,
#define DSDT_NHLT_PATH "\\_SB.PCI0.HDAS"
void
*
skl_nhlt_init
(
struct
device
*
dev
)
struct
nhlt_acpi_table
*
skl_nhlt_init
(
struct
device
*
dev
)
{
acpi_handle
handle
;
union
acpi_object
*
obj
;
struct
nhlt_resource_desc
*
nhlt_ptr
=
NULL
;
struct
nhlt_acpi_table
*
nhlt_table
=
NULL
;
if
(
ACPI_FAILURE
(
acpi_get_handle
(
NULL
,
DSDT_NHLT_PATH
,
&
handle
)))
{
dev_err
(
dev
,
"Requested NHLT device not found
\n
"
);
...
...
@@ -39,18 +40,20 @@ void *skl_nhlt_init(struct device *dev)
obj
=
acpi_evaluate_dsm
(
handle
,
OSC_UUID
,
1
,
1
,
NULL
);
if
(
obj
&&
obj
->
type
==
ACPI_TYPE_BUFFER
)
{
nhlt_ptr
=
(
struct
nhlt_resource_desc
*
)
obj
->
buffer
.
pointer
;
return
memremap
(
nhlt_ptr
->
min_addr
,
nhlt_ptr
->
length
,
nhlt_table
=
(
struct
nhlt_acpi_table
*
)
memremap
(
nhlt_ptr
->
min_addr
,
nhlt_ptr
->
length
,
MEMREMAP_WB
);
ACPI_FREE
(
obj
);
return
nhlt_table
;
}
dev_err
(
dev
,
"device specific method to extract NHLT blob failed
\n
"
);
return
NULL
;
}
void
skl_nhlt_free
(
void
*
addr
)
void
skl_nhlt_free
(
struct
nhlt_acpi_table
*
nhlt
)
{
memunmap
(
addr
);
memunmap
(
(
void
*
)
nhlt
);
}
static
struct
nhlt_specific_cfg
*
skl_get_specific_cfg
(
...
...
@@ -120,7 +123,7 @@ struct nhlt_specific_cfg
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
&
skl
->
ebus
);
struct
device
*
dev
=
bus
->
dev
;
struct
nhlt_specific_cfg
*
sp_config
;
struct
nhlt_acpi_table
*
nhlt
=
(
struct
nhlt_acpi_table
*
)
skl
->
nhlt
;
struct
nhlt_acpi_table
*
nhlt
=
skl
->
nhlt
;
u16
bps
=
(
s_fmt
==
16
)
?
16
:
32
;
u8
j
;
...
...
sound/soc/intel/skylake/skl-pcm.c
View file @
c988e261
...
...
@@ -213,7 +213,7 @@ static int skl_be_prepare(struct snd_pcm_substream *substream,
struct
skl_sst
*
ctx
=
skl
->
skl_sst
;
struct
skl_module_cfg
*
mconfig
;
if
(
(
dai
->
playback_active
>
1
)
||
(
dai
->
capture_active
>
1
)
)
if
(
dai
->
playback_widget
->
power
||
dai
->
capture_widget
->
power
)
return
0
;
mconfig
=
skl_tplg_be_get_cpr_module
(
dai
,
substream
->
stream
);
...
...
@@ -402,23 +402,33 @@ static int skl_pcm_trigger(struct snd_pcm_substream *substream, int cmd,
struct
skl_module_cfg
*
mconfig
;
struct
hdac_ext_bus
*
ebus
=
get_bus_ctx
(
substream
);
struct
hdac_ext_stream
*
stream
=
get_hdac_ext_stream
(
substream
);
struct
snd_soc_dapm_widget
*
w
;
int
ret
;
mconfig
=
skl_tplg_fe_get_cpr_module
(
dai
,
substream
->
stream
);
if
(
!
mconfig
)
return
-
EIO
;
if
(
substream
->
stream
==
SNDRV_PCM_STREAM_PLAYBACK
)
w
=
dai
->
playback_widget
;
else
w
=
dai
->
capture_widget
;
switch
(
cmd
)
{
case
SNDRV_PCM_TRIGGER_RESUME
:
skl_pcm_prepare
(
substream
,
dai
);
/*
* enable DMA Resume enable bit for the stream, set the dpib
* & lpib position to resune before starting the DMA
*/
snd_hdac_ext_stream_drsm_enable
(
ebus
,
true
,
hdac_stream
(
stream
)
->
index
);
snd_hdac_ext_stream_set_dpibr
(
ebus
,
stream
,
stream
->
dpib
);
snd_hdac_ext_stream_set_lpib
(
stream
,
stream
->
lpib
);
if
(
!
w
->
ignore_suspend
)
{
skl_pcm_prepare
(
substream
,
dai
);
/*
* enable DMA Resume enable bit for the stream, set the
* dpib & lpib position to resume before starting the
* DMA
*/
snd_hdac_ext_stream_drsm_enable
(
ebus
,
true
,
hdac_stream
(
stream
)
->
index
);
snd_hdac_ext_stream_set_dpibr
(
ebus
,
stream
,
stream
->
dpib
);
snd_hdac_ext_stream_set_lpib
(
stream
,
stream
->
lpib
);
}
case
SNDRV_PCM_TRIGGER_START
:
case
SNDRV_PCM_TRIGGER_PAUSE_RELEASE
:
...
...
@@ -448,7 +458,7 @@ static int skl_pcm_trigger(struct snd_pcm_substream *substream, int cmd,
return
ret
;
ret
=
skl_decoupled_trigger
(
substream
,
cmd
);
if
(
cmd
==
SNDRV_PCM_TRIGGER_SUSPEND
)
{
if
(
(
cmd
==
SNDRV_PCM_TRIGGER_SUSPEND
)
&&
!
w
->
ignore_suspend
)
{
/* save the dpib and lpib positions */
stream
->
dpib
=
readl
(
ebus
->
bus
.
remap_addr
+
AZX_REG_VS_SDXDPIB_XBASE
+
...
...
@@ -523,7 +533,6 @@ static int skl_link_pcm_prepare(struct snd_pcm_substream *substream,
if
(
!
link
)
return
-
EINVAL
;
snd_hdac_ext_bus_link_power_up
(
link
);
snd_hdac_ext_link_stream_reset
(
link_dev
);
snd_hdac_ext_link_stream_setup
(
link_dev
,
format_val
);
...
...
@@ -759,6 +768,78 @@ static struct snd_soc_dai_driver skl_platform_dai[] = {
.
formats
=
SNDRV_PCM_FMTBIT_S16_LE
,
},
},
{
.
name
=
"SSP2 Pin"
,
.
ops
=
&
skl_be_ssp_dai_ops
,
.
playback
=
{
.
stream_name
=
"ssp2 Tx"
,
.
channels_min
=
HDA_STEREO
,
.
channels_max
=
HDA_STEREO
,
.
rates
=
SNDRV_PCM_RATE_48000
,
.
formats
=
SNDRV_PCM_FMTBIT_S16_LE
,
},
.
capture
=
{
.
stream_name
=
"ssp2 Rx"
,
.
channels_min
=
HDA_STEREO
,
.
channels_max
=
HDA_STEREO
,
.
rates
=
SNDRV_PCM_RATE_48000
,
.
formats
=
SNDRV_PCM_FMTBIT_S16_LE
,
},
},
{
.
name
=
"SSP3 Pin"
,
.
ops
=
&
skl_be_ssp_dai_ops
,
.
playback
=
{
.
stream_name
=
"ssp3 Tx"
,
.
channels_min
=
HDA_STEREO
,
.
channels_max
=
HDA_STEREO
,
.
rates
=
SNDRV_PCM_RATE_48000
,
.
formats
=
SNDRV_PCM_FMTBIT_S16_LE
,
},
.
capture
=
{
.
stream_name
=
"ssp3 Rx"
,
.
channels_min
=
HDA_STEREO
,
.
channels_max
=
HDA_STEREO
,
.
rates
=
SNDRV_PCM_RATE_48000
,
.
formats
=
SNDRV_PCM_FMTBIT_S16_LE
,
},
},
{
.
name
=
"SSP4 Pin"
,
.
ops
=
&
skl_be_ssp_dai_ops
,
.
playback
=
{
.
stream_name
=
"ssp4 Tx"
,
.
channels_min
=
HDA_STEREO
,
.
channels_max
=
HDA_STEREO
,
.
rates
=
SNDRV_PCM_RATE_48000
,
.
formats
=
SNDRV_PCM_FMTBIT_S16_LE
,
},
.
capture
=
{
.
stream_name
=
"ssp4 Rx"
,
.
channels_min
=
HDA_STEREO
,
.
channels_max
=
HDA_STEREO
,
.
rates
=
SNDRV_PCM_RATE_48000
,
.
formats
=
SNDRV_PCM_FMTBIT_S16_LE
,
},
},
{
.
name
=
"SSP5 Pin"
,
.
ops
=
&
skl_be_ssp_dai_ops
,
.
playback
=
{
.
stream_name
=
"ssp5 Tx"
,
.
channels_min
=
HDA_STEREO
,
.
channels_max
=
HDA_STEREO
,
.
rates
=
SNDRV_PCM_RATE_48000
,
.
formats
=
SNDRV_PCM_FMTBIT_S16_LE
,
},
.
capture
=
{
.
stream_name
=
"ssp5 Rx"
,
.
channels_min
=
HDA_STEREO
,
.
channels_max
=
HDA_STEREO
,
.
rates
=
SNDRV_PCM_RATE_48000
,
.
formats
=
SNDRV_PCM_FMTBIT_S16_LE
,
},
},
{
.
name
=
"iDisp1 Pin"
,
.
ops
=
&
skl_link_dai_ops
,
...
...
sound/soc/intel/skylake/skl-sst-dsp.c
View file @
c988e261
...
...
@@ -336,8 +336,6 @@ void skl_dsp_free(struct sst_dsp *dsp)
skl_ipc_int_disable
(
dsp
);
free_irq
(
dsp
->
irq
,
dsp
);
dsp
->
cl_dev
.
ops
.
cl_cleanup_controller
(
dsp
);
skl_cldma_int_disable
(
dsp
);
skl_ipc_op_int_disable
(
dsp
);
skl_ipc_int_disable
(
dsp
);
...
...
sound/soc/intel/skylake/skl-sst-dsp.h
View file @
c988e261
...
...
@@ -118,16 +118,25 @@ struct skl_dsp_fw_ops {
int
(
*
set_state_D0
)(
struct
sst_dsp
*
ctx
);
int
(
*
set_state_D3
)(
struct
sst_dsp
*
ctx
);
unsigned
int
(
*
get_fw_errcode
)(
struct
sst_dsp
*
ctx
);
int
(
*
load_mod
)(
struct
sst_dsp
*
ctx
,
u16
mod_id
,
char
*
mod_name
);
int
(
*
load_mod
)(
struct
sst_dsp
*
ctx
,
u16
mod_id
,
u8
*
mod_name
);
int
(
*
unload_mod
)(
struct
sst_dsp
*
ctx
,
u16
mod_id
);
};
struct
skl_dsp_loader_ops
{
int
stream_tag
;
int
(
*
alloc_dma_buf
)(
struct
device
*
dev
,
struct
snd_dma_buffer
*
dmab
,
size_t
size
);
int
(
*
free_dma_buf
)(
struct
device
*
dev
,
struct
snd_dma_buffer
*
dmab
);
int
(
*
prepare
)(
struct
device
*
dev
,
unsigned
int
format
,
unsigned
int
byte_size
,
struct
snd_dma_buffer
*
bufp
);
int
(
*
trigger
)(
struct
device
*
dev
,
bool
start
,
int
stream_tag
);
int
(
*
cleanup
)(
struct
device
*
dev
,
struct
snd_dma_buffer
*
dmab
,
int
stream_tag
);
};
struct
skl_load_module_info
{
...
...
@@ -160,6 +169,10 @@ int skl_dsp_boot(struct sst_dsp *ctx);
int
skl_sst_dsp_init
(
struct
device
*
dev
,
void
__iomem
*
mmio_base
,
int
irq
,
const
char
*
fw_name
,
struct
skl_dsp_loader_ops
dsp_ops
,
struct
skl_sst
**
dsp
);
int
bxt_sst_dsp_init
(
struct
device
*
dev
,
void
__iomem
*
mmio_base
,
int
irq
,
const
char
*
fw_name
,
struct
skl_dsp_loader_ops
dsp_ops
,
struct
skl_sst
**
dsp
);
void
skl_sst_dsp_cleanup
(
struct
device
*
dev
,
struct
skl_sst
*
ctx
);
void
bxt_sst_dsp_cleanup
(
struct
device
*
dev
,
struct
skl_sst
*
ctx
);
#endif
/*__SKL_SST_DSP_H__*/
sound/soc/intel/skylake/skl-sst.c
View file @
c988e261
...
...
@@ -20,6 +20,7 @@
#include <linux/delay.h>
#include <linux/device.h>
#include <linux/err.h>
#include <linux/uuid.h>
#include "../common/sst-dsp.h"
#include "../common/sst-dsp-priv.h"
#include "../common/sst-ipc.h"
...
...
@@ -304,14 +305,16 @@ static int skl_transfer_module(struct sst_dsp *ctx,
return
ret
;
}
static
int
skl_load_module
(
struct
sst_dsp
*
ctx
,
u16
mod_id
,
char
*
guid
)
static
int
skl_load_module
(
struct
sst_dsp
*
ctx
,
u16
mod_id
,
u8
*
guid
)
{
struct
skl_module_table
*
module_entry
=
NULL
;
int
ret
=
0
;
char
mod_name
[
64
];
/* guid str = 32 chars + 4 hyphens */
uuid_le
*
uuid_mod
;
snprintf
(
mod_name
,
sizeof
(
mod_name
),
"%s%s%s"
,
"intel/dsp_fw_"
,
guid
,
".bin"
);
uuid_mod
=
(
uuid_le
*
)
guid
;
snprintf
(
mod_name
,
sizeof
(
mod_name
),
"%s%pUL%s"
,
"intel/dsp_fw_"
,
uuid_mod
,
".bin"
);
module_entry
=
skl_module_get_from_id
(
ctx
,
mod_id
);
if
(
module_entry
==
NULL
)
{
...
...
@@ -451,6 +454,10 @@ void skl_sst_dsp_cleanup(struct device *dev, struct skl_sst *ctx)
skl_clear_module_table
(
ctx
->
dsp
);
skl_ipc_free
(
&
ctx
->
ipc
);
ctx
->
dsp
->
ops
->
free
(
ctx
->
dsp
);
if
(
ctx
->
boot_complete
)
{
ctx
->
dsp
->
cl_dev
.
ops
.
cl_cleanup_controller
(
ctx
->
dsp
);
skl_cldma_int_disable
(
ctx
->
dsp
);
}
}
EXPORT_SYMBOL_GPL
(
skl_sst_dsp_cleanup
);
...
...
sound/soc/intel/skylake/skl-topology.c
View file @
c988e261
...
...
@@ -1564,6 +1564,8 @@ static int skl_tplg_widget_load(struct snd_soc_component *cmpnt,
return
-
ENOMEM
;
w
->
priv
=
mconfig
;
memcpy
(
&
mconfig
->
guid
,
&
dfw_config
->
uuid
,
16
);
mconfig
->
id
.
module_id
=
dfw_config
->
module_id
;
mconfig
->
id
.
instance_id
=
dfw_config
->
instance_id
;
mconfig
->
mcps
=
dfw_config
->
max_mcps
;
...
...
@@ -1593,10 +1595,6 @@ static int skl_tplg_widget_load(struct snd_soc_component *cmpnt,
mconfig
->
time_slot
=
dfw_config
->
time_slot
;
mconfig
->
formats_config
.
caps_size
=
dfw_config
->
caps
.
caps_size
;
if
(
dfw_config
->
is_loadable
)
memcpy
(
mconfig
->
guid
,
dfw_config
->
uuid
,
ARRAY_SIZE
(
dfw_config
->
uuid
));
mconfig
->
m_in_pin
=
devm_kzalloc
(
bus
->
dev
,
(
mconfig
->
max_in_queue
)
*
sizeof
(
*
mconfig
->
m_in_pin
),
GFP_KERNEL
);
...
...
sound/soc/intel/skylake/skl-topology.h
View file @
c988e261
...
...
@@ -281,7 +281,7 @@ enum skl_module_state {
};
struct
skl_module_cfg
{
char
guid
[
SKL_UUID_STR_SZ
];
u8
guid
[
16
];
struct
skl_module_inst_id
id
;
u8
domain
;
bool
homogenous_inputs
;
...
...
sound/soc/intel/skylake/skl-tplg-interface.h
View file @
c988e261
...
...
@@ -181,7 +181,7 @@ struct skl_dfw_pipe {
}
__packed
;
struct
skl_dfw_module
{
char
uuid
[
SKL_UUID_STR_SZ
];
u8
uuid
[
16
];
u16
module_id
;
u16
instance_id
;
...
...
sound/soc/intel/skylake/skl.c
View file @
c988e261
...
...
@@ -229,7 +229,12 @@ static int skl_suspend(struct device *dev)
* running, we need to save the state for these and continue
*/
if
(
skl
->
supend_active
)
{
/* turn off the links and stop the CORB/RIRB DMA if it is On */
snd_hdac_ext_bus_link_power_down_all
(
ebus
);
if
(
ebus
->
cmd_dma_state
)
snd_hdac_bus_stop_cmd_io
(
&
ebus
->
bus
);
enable_irq_wake
(
bus
->
irq
);
pci_save_state
(
pci
);
pci_disable_device
(
pci
);
...
...
@@ -255,6 +260,7 @@ static int skl_resume(struct device *dev)
struct
hdac_ext_bus
*
ebus
=
pci_get_drvdata
(
pci
);
struct
skl
*
skl
=
ebus_to_skl
(
ebus
);
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
struct
hdac_ext_link
*
hlink
=
NULL
;
int
ret
;
/* Turned OFF in HDMI codec driver after codec reconfiguration */
...
...
@@ -276,8 +282,29 @@ static int skl_resume(struct device *dev)
ret
=
pci_enable_device
(
pci
);
snd_hdac_ext_bus_link_power_up_all
(
ebus
);
disable_irq_wake
(
bus
->
irq
);
/*
* turn On the links which are On before active suspend
* and start the CORB/RIRB DMA if On before
* active suspend.
*/
list_for_each_entry
(
hlink
,
&
ebus
->
hlink_list
,
list
)
{
if
(
hlink
->
ref_count
)
snd_hdac_ext_bus_link_power_up
(
hlink
);
}
if
(
ebus
->
cmd_dma_state
)
snd_hdac_bus_init_cmd_io
(
&
ebus
->
bus
);
}
else
{
ret
=
_skl_resume
(
ebus
);
/* turn off the links which are off before suspend */
list_for_each_entry
(
hlink
,
&
ebus
->
hlink_list
,
list
)
{
if
(
!
hlink
->
ref_count
)
snd_hdac_ext_bus_link_power_down
(
hlink
);
}
if
(
!
ebus
->
cmd_dma_state
)
snd_hdac_bus_stop_cmd_io
(
&
ebus
->
bus
);
}
return
ret
;
...
...
@@ -613,6 +640,7 @@ static int skl_probe(struct pci_dev *pci,
struct
skl
*
skl
;
struct
hdac_ext_bus
*
ebus
=
NULL
;
struct
hdac_bus
*
bus
=
NULL
;
struct
hdac_ext_link
*
hlink
=
NULL
;
int
err
;
/* we use ext core ops, so provide NULL for ops here */
...
...
@@ -643,7 +671,7 @@ static int skl_probe(struct pci_dev *pci,
err
=
skl_machine_device_register
(
skl
,
(
void
*
)
pci_id
->
driver_data
);
if
(
err
<
0
)
goto
out_free
;
goto
out_
nhlt_
free
;
err
=
skl_init_dsp
(
skl
);
if
(
err
<
0
)
{
...
...
@@ -679,6 +707,12 @@ static int skl_probe(struct pci_dev *pci,
}
}
/*
* we are done probling so decrement link counts
*/
list_for_each_entry
(
hlink
,
&
ebus
->
hlink_list
,
list
)
snd_hdac_ext_bus_link_put
(
ebus
,
hlink
);
/*configure PM */
pm_runtime_put_noidle
(
bus
->
dev
);
pm_runtime_allow
(
bus
->
dev
);
...
...
@@ -693,6 +727,8 @@ static int skl_probe(struct pci_dev *pci,
skl_free_dsp
(
skl
);
out_mach_free:
skl_machine_device_unregister
(
skl
);
out_nhlt_free:
skl_nhlt_free
(
skl
->
nhlt
);
out_free:
skl
->
init_failed
=
1
;
skl_free
(
ebus
);
...
...
@@ -743,6 +779,7 @@ static void skl_remove(struct pci_dev *pci)
skl_free_dsp
(
skl
);
skl_machine_device_unregister
(
skl
);
skl_dmic_device_unregister
(
skl
);
skl_nhlt_free
(
skl
->
nhlt
);
skl_free
(
ebus
);
dev_set_drvdata
(
&
pci
->
dev
,
NULL
);
}
...
...
sound/soc/intel/skylake/skl.h
View file @
c988e261
...
...
@@ -66,7 +66,7 @@ struct skl {
struct
platform_device
*
dmic_dev
;
struct
platform_device
*
i2s_dev
;
void
*
nhlt
;
/* nhlt ptr */
struct
nhlt_acpi_table
*
nhlt
;
/* nhlt ptr */
struct
skl_sst
*
skl_sst
;
/* sst skl ctx */
struct
skl_dsp_resource
resource
;
...
...
@@ -103,8 +103,8 @@ struct skl_dsp_ops {
int
skl_platform_unregister
(
struct
device
*
dev
);
int
skl_platform_register
(
struct
device
*
dev
);
void
*
skl_nhlt_init
(
struct
device
*
dev
);
void
skl_nhlt_free
(
void
*
addr
);
struct
nhlt_acpi_table
*
skl_nhlt_init
(
struct
device
*
dev
);
void
skl_nhlt_free
(
struct
nhlt_acpi_table
*
addr
);
struct
nhlt_specific_cfg
*
skl_get_ep_blob
(
struct
skl
*
skl
,
u32
instance
,
u8
link_type
,
u8
s_fmt
,
u8
no_ch
,
u32
s_rate
,
u8
dirn
);
...
...
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