Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
9a9b13dd
cloud-kernel
项目概览
openanolis
/
cloud-kernel
大约 2 年 前同步成功
通知
173
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
9a9b13dd
编写于
7月 12, 2018
作者:
T
Takashi Iwai
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'topic/hda-core-intel' into topic/hda-acomp
上级
c5a59d24
cb04ba33
变更
15
展开全部
隐藏空白更改
内联
并排
Showing
15 changed file
with
605 addition
and
674 deletion
+605
-674
include/sound/hdaudio.h
include/sound/hdaudio.h
+29
-0
include/sound/hdaudio_ext.h
include/sound/hdaudio_ext.h
+29
-94
sound/hda/ext/hdac_ext_bus.c
sound/hda/ext/hdac_ext_bus.c
+35
-45
sound/hda/ext/hdac_ext_controller.c
sound/hda/ext/hdac_ext_controller.c
+35
-29
sound/hda/ext/hdac_ext_stream.c
sound/hda/ext/hdac_ext_stream.c
+45
-59
sound/pci/hda/hda_codec.c
sound/pci/hda/hda_codec.c
+51
-17
sound/pci/hda/hda_codec.h
sound/pci/hda/hda_codec.h
+2
-0
sound/soc/codecs/hdac_hdmi.c
sound/soc/codecs/hdac_hdmi.c
+197
-219
sound/soc/intel/skylake/skl-messages.c
sound/soc/intel/skylake/skl-messages.c
+22
-28
sound/soc/intel/skylake/skl-nhlt.c
sound/soc/intel/skylake/skl-nhlt.c
+4
-4
sound/soc/intel/skylake/skl-pcm.c
sound/soc/intel/skylake/skl-pcm.c
+54
-58
sound/soc/intel/skylake/skl-topology.c
sound/soc/intel/skylake/skl-topology.c
+8
-12
sound/soc/intel/skylake/skl-topology.h
sound/soc/intel/skylake/skl-topology.h
+3
-3
sound/soc/intel/skylake/skl.c
sound/soc/intel/skylake/skl.c
+88
-102
sound/soc/intel/skylake/skl.h
sound/soc/intel/skylake/skl.h
+3
-4
未找到文件。
include/sound/hdaudio.h
浏览文件 @
9a9b13dd
...
@@ -188,6 +188,11 @@ struct hdac_driver {
...
@@ -188,6 +188,11 @@ struct hdac_driver {
const
struct
hda_device_id
*
id_table
;
const
struct
hda_device_id
*
id_table
;
int
(
*
match
)(
struct
hdac_device
*
dev
,
struct
hdac_driver
*
drv
);
int
(
*
match
)(
struct
hdac_device
*
dev
,
struct
hdac_driver
*
drv
);
void
(
*
unsol_event
)(
struct
hdac_device
*
dev
,
unsigned
int
event
);
void
(
*
unsol_event
)(
struct
hdac_device
*
dev
,
unsigned
int
event
);
/* fields used by ext bus APIs */
int
(
*
probe
)(
struct
hdac_device
*
dev
);
int
(
*
remove
)(
struct
hdac_device
*
dev
);
void
(
*
shutdown
)(
struct
hdac_device
*
dev
);
};
};
#define drv_to_hdac_driver(_drv) container_of(_drv, struct hdac_driver, driver)
#define drv_to_hdac_driver(_drv) container_of(_drv, struct hdac_driver, driver)
...
@@ -208,6 +213,14 @@ struct hdac_bus_ops {
...
@@ -208,6 +213,14 @@ struct hdac_bus_ops {
int
(
*
link_power
)(
struct
hdac_bus
*
bus
,
bool
enable
);
int
(
*
link_power
)(
struct
hdac_bus
*
bus
,
bool
enable
);
};
};
/*
* ops used for ASoC HDA codec drivers
*/
struct
hdac_ext_bus_ops
{
int
(
*
hdev_attach
)(
struct
hdac_device
*
hdev
);
int
(
*
hdev_detach
)(
struct
hdac_device
*
hdev
);
};
/*
/*
* Lowlevel I/O operators
* Lowlevel I/O operators
*/
*/
...
@@ -250,11 +263,17 @@ struct hdac_rb {
...
@@ -250,11 +263,17 @@ struct hdac_rb {
* @mlcap: MultiLink capabilities pointer
* @mlcap: MultiLink capabilities pointer
* @gtscap: gts capabilities pointer
* @gtscap: gts capabilities pointer
* @drsmcap: dma resume capabilities pointer
* @drsmcap: dma resume capabilities pointer
* @num_streams: streams supported
* @idx: HDA link index
* @hlink_list: link list of HDA links
* @lock: lock for link mgmt
* @cmd_dma_state: state of cmd DMAs: CORB and RIRB
*/
*/
struct
hdac_bus
{
struct
hdac_bus
{
struct
device
*
dev
;
struct
device
*
dev
;
const
struct
hdac_bus_ops
*
ops
;
const
struct
hdac_bus_ops
*
ops
;
const
struct
hdac_io_ops
*
io_ops
;
const
struct
hdac_io_ops
*
io_ops
;
const
struct
hdac_ext_bus_ops
*
ext_ops
;
/* h/w resources */
/* h/w resources */
unsigned
long
addr
;
unsigned
long
addr
;
...
@@ -317,6 +336,16 @@ struct hdac_bus {
...
@@ -317,6 +336,16 @@ struct hdac_bus {
/* i915 component interface */
/* i915 component interface */
struct
i915_audio_component
*
audio_component
;
struct
i915_audio_component
*
audio_component
;
int
i915_power_refcount
;
int
i915_power_refcount
;
/* parameters required for enhanced capabilities */
int
num_streams
;
int
idx
;
struct
list_head
hlink_list
;
struct
mutex
lock
;
bool
cmd_dma_state
;
};
};
int
snd_hdac_bus_init
(
struct
hdac_bus
*
bus
,
struct
device
*
dev
,
int
snd_hdac_bus_init
(
struct
hdac_bus
*
bus
,
struct
device
*
dev
,
...
...
include/sound/hdaudio_ext.h
浏览文件 @
9a9b13dd
...
@@ -4,38 +4,16 @@
...
@@ -4,38 +4,16 @@
#include <sound/hdaudio.h>
#include <sound/hdaudio.h>
/**
int
snd_hdac_ext_bus_init
(
struct
hdac_bus
*
bus
,
struct
device
*
dev
,
* hdac_ext_bus: HDAC extended bus for extended HDA caps
*
* @bus: hdac bus
* @num_streams: streams supported
* @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
;
int
num_streams
;
int
idx
;
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
,
const
struct
hdac_bus_ops
*
ops
,
const
struct
hdac_bus_ops
*
ops
,
const
struct
hdac_io_ops
*
io_ops
);
const
struct
hdac_io_ops
*
io_ops
,
const
struct
hdac_ext_bus_ops
*
ext_ops
);
void
snd_hdac_ext_bus_exit
(
struct
hdac_ext_bus
*
sbus
);
void
snd_hdac_ext_bus_exit
(
struct
hdac_bus
*
bus
);
int
snd_hdac_ext_bus_device_init
(
struct
hdac_ext_bus
*
sbus
,
int
addr
);
int
snd_hdac_ext_bus_device_init
(
struct
hdac_bus
*
bus
,
int
addr
,
struct
hdac_device
*
hdev
);
void
snd_hdac_ext_bus_device_exit
(
struct
hdac_device
*
hdev
);
void
snd_hdac_ext_bus_device_exit
(
struct
hdac_device
*
hdev
);
void
snd_hdac_ext_bus_device_remove
(
struct
hdac_ext_bus
*
ebus
);
void
snd_hdac_ext_bus_device_remove
(
struct
hdac_bus
*
bus
);
#define ebus_to_hbus(ebus) (&(ebus)->bus)
#define hbus_to_ebus(_bus) \
container_of(_bus, struct hdac_ext_bus, bus)
#define HDA_CODEC_REV_EXT_ENTRY(_vid, _rev, _name, drv_data) \
#define HDA_CODEC_REV_EXT_ENTRY(_vid, _rev, _name, drv_data) \
{ .vendor_id = (_vid), .rev_id = (_rev), .name = (_name), \
{ .vendor_id = (_vid), .rev_id = (_rev), .name = (_name), \
...
@@ -44,14 +22,14 @@ void snd_hdac_ext_bus_device_remove(struct hdac_ext_bus *ebus);
...
@@ -44,14 +22,14 @@ void snd_hdac_ext_bus_device_remove(struct hdac_ext_bus *ebus);
#define HDA_CODEC_EXT_ENTRY(_vid, _revid, _name, _drv_data) \
#define HDA_CODEC_EXT_ENTRY(_vid, _revid, _name, _drv_data) \
HDA_CODEC_REV_EXT_ENTRY(_vid, _revid, _name, _drv_data)
HDA_CODEC_REV_EXT_ENTRY(_vid, _revid, _name, _drv_data)
void
snd_hdac_ext_bus_ppcap_enable
(
struct
hdac_
ext_
bus
*
chip
,
bool
enable
);
void
snd_hdac_ext_bus_ppcap_enable
(
struct
hdac_bus
*
chip
,
bool
enable
);
void
snd_hdac_ext_bus_ppcap_int_enable
(
struct
hdac_
ext_
bus
*
chip
,
bool
enable
);
void
snd_hdac_ext_bus_ppcap_int_enable
(
struct
hdac_bus
*
chip
,
bool
enable
);
void
snd_hdac_ext_stream_spbcap_enable
(
struct
hdac_
ext_
bus
*
chip
,
void
snd_hdac_ext_stream_spbcap_enable
(
struct
hdac_bus
*
chip
,
bool
enable
,
int
index
);
bool
enable
,
int
index
);
int
snd_hdac_ext_bus_get_ml_capabilities
(
struct
hdac_
ext_
bus
*
bus
);
int
snd_hdac_ext_bus_get_ml_capabilities
(
struct
hdac_bus
*
bus
);
struct
hdac_ext_link
*
snd_hdac_ext_bus_get_link
(
struct
hdac_
ext_
bus
*
bus
,
struct
hdac_ext_link
*
snd_hdac_ext_bus_get_link
(
struct
hdac_bus
*
bus
,
const
char
*
codec_name
);
const
char
*
codec_name
);
enum
hdac_ext_stream_type
{
enum
hdac_ext_stream_type
{
...
@@ -100,28 +78,28 @@ struct hdac_ext_stream {
...
@@ -100,28 +78,28 @@ struct hdac_ext_stream {
#define stream_to_hdac_ext_stream(s) \
#define stream_to_hdac_ext_stream(s) \
container_of(s, struct hdac_ext_stream, hstream)
container_of(s, struct hdac_ext_stream, hstream)
void
snd_hdac_ext_stream_init
(
struct
hdac_
ext_
bus
*
bus
,
void
snd_hdac_ext_stream_init
(
struct
hdac_bus
*
bus
,
struct
hdac_ext_stream
*
stream
,
int
idx
,
struct
hdac_ext_stream
*
stream
,
int
idx
,
int
direction
,
int
tag
);
int
direction
,
int
tag
);
int
snd_hdac_ext_stream_init_all
(
struct
hdac_
ext_bus
*
e
bus
,
int
start_idx
,
int
snd_hdac_ext_stream_init_all
(
struct
hdac_
bus
*
bus
,
int
start_idx
,
int
num_stream
,
int
dir
);
int
num_stream
,
int
dir
);
void
snd_hdac_stream_free_all
(
struct
hdac_
ext_bus
*
e
bus
);
void
snd_hdac_stream_free_all
(
struct
hdac_
bus
*
bus
);
void
snd_hdac_link_free_all
(
struct
hdac_
ext_bus
*
e
bus
);
void
snd_hdac_link_free_all
(
struct
hdac_
bus
*
bus
);
struct
hdac_ext_stream
*
snd_hdac_ext_stream_assign
(
struct
hdac_
ext_
bus
*
bus
,
struct
hdac_ext_stream
*
snd_hdac_ext_stream_assign
(
struct
hdac_bus
*
bus
,
struct
snd_pcm_substream
*
substream
,
struct
snd_pcm_substream
*
substream
,
int
type
);
int
type
);
void
snd_hdac_ext_stream_release
(
struct
hdac_ext_stream
*
azx_dev
,
int
type
);
void
snd_hdac_ext_stream_release
(
struct
hdac_ext_stream
*
azx_dev
,
int
type
);
void
snd_hdac_ext_stream_decouple
(
struct
hdac_
ext_
bus
*
bus
,
void
snd_hdac_ext_stream_decouple
(
struct
hdac_bus
*
bus
,
struct
hdac_ext_stream
*
azx_dev
,
bool
decouple
);
struct
hdac_ext_stream
*
azx_dev
,
bool
decouple
);
void
snd_hdac_ext_stop_streams
(
struct
hdac_
ext_bus
*
s
bus
);
void
snd_hdac_ext_stop_streams
(
struct
hdac_
bus
*
bus
);
int
snd_hdac_ext_stream_set_spib
(
struct
hdac_
ext_bus
*
e
bus
,
int
snd_hdac_ext_stream_set_spib
(
struct
hdac_
bus
*
bus
,
struct
hdac_ext_stream
*
stream
,
u32
value
);
struct
hdac_ext_stream
*
stream
,
u32
value
);
int
snd_hdac_ext_stream_get_spbmaxfifo
(
struct
hdac_
ext_bus
*
e
bus
,
int
snd_hdac_ext_stream_get_spbmaxfifo
(
struct
hdac_
bus
*
bus
,
struct
hdac_ext_stream
*
stream
);
struct
hdac_ext_stream
*
stream
);
void
snd_hdac_ext_stream_drsm_enable
(
struct
hdac_
ext_bus
*
e
bus
,
void
snd_hdac_ext_stream_drsm_enable
(
struct
hdac_
bus
*
bus
,
bool
enable
,
int
index
);
bool
enable
,
int
index
);
int
snd_hdac_ext_stream_set_dpibr
(
struct
hdac_
ext_bus
*
e
bus
,
int
snd_hdac_ext_stream_set_dpibr
(
struct
hdac_
bus
*
bus
,
struct
hdac_ext_stream
*
stream
,
u32
value
);
struct
hdac_ext_stream
*
stream
,
u32
value
);
int
snd_hdac_ext_stream_set_lpib
(
struct
hdac_ext_stream
*
stream
,
u32
value
);
int
snd_hdac_ext_stream_set_lpib
(
struct
hdac_ext_stream
*
stream
,
u32
value
);
...
@@ -144,17 +122,15 @@ struct hdac_ext_link {
...
@@ -144,17 +122,15 @@ struct hdac_ext_link {
int
snd_hdac_ext_bus_link_power_up
(
struct
hdac_ext_link
*
link
);
int
snd_hdac_ext_bus_link_power_up
(
struct
hdac_ext_link
*
link
);
int
snd_hdac_ext_bus_link_power_down
(
struct
hdac_ext_link
*
link
);
int
snd_hdac_ext_bus_link_power_down
(
struct
hdac_ext_link
*
link
);
int
snd_hdac_ext_bus_link_power_up_all
(
struct
hdac_
ext_bus
*
e
bus
);
int
snd_hdac_ext_bus_link_power_up_all
(
struct
hdac_
bus
*
bus
);
int
snd_hdac_ext_bus_link_power_down_all
(
struct
hdac_
ext_bus
*
e
bus
);
int
snd_hdac_ext_bus_link_power_down_all
(
struct
hdac_
bus
*
bus
);
void
snd_hdac_ext_link_set_stream_id
(
struct
hdac_ext_link
*
link
,
void
snd_hdac_ext_link_set_stream_id
(
struct
hdac_ext_link
*
link
,
int
stream
);
int
stream
);
void
snd_hdac_ext_link_clear_stream_id
(
struct
hdac_ext_link
*
link
,
void
snd_hdac_ext_link_clear_stream_id
(
struct
hdac_ext_link
*
link
,
int
stream
);
int
stream
);
int
snd_hdac_ext_bus_link_get
(
struct
hdac_ext_bus
*
ebus
,
int
snd_hdac_ext_bus_link_get
(
struct
hdac_bus
*
bus
,
struct
hdac_ext_link
*
link
);
struct
hdac_ext_link
*
link
);
int
snd_hdac_ext_bus_link_put
(
struct
hdac_bus
*
bus
,
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 */
/* update register macro */
#define snd_hdac_updatel(addr, reg, mask, val) \
#define snd_hdac_updatel(addr, reg, mask, val) \
...
@@ -181,53 +157,12 @@ struct hda_dai_map {
...
@@ -181,53 +157,12 @@ struct hda_dai_map {
u32
maxbps
;
u32
maxbps
;
};
};
#define HDA_MAX_NIDS 16
/**
* struct hdac_ext_device - HDAC Ext device
*
* @hdac: hdac core device
* @nid_list - the dai map which matches the dai-name with the nid
* @map_cur_idx - the idx in use in dai_map
* @ops - the hda codec ops common to all codec drivers
* @pvt_data - private data, for asoc contains asoc codec object
*/
struct
hdac_ext_device
{
struct
hdac_device
hdev
;
struct
hdac_ext_bus
*
ebus
;
/* soc-dai to nid map */
struct
hda_dai_map
nid_list
[
HDA_MAX_NIDS
];
unsigned
int
map_cur_idx
;
/* codec ops */
struct
hdac_ext_codec_ops
ops
;
struct
snd_card
*
card
;
void
*
scodec
;
void
*
private_data
;
};
struct
hdac_ext_dma_params
{
struct
hdac_ext_dma_params
{
u32
format
;
u32
format
;
u8
stream_tag
;
u8
stream_tag
;
};
};
#define to_ehdac_device(dev) (container_of((dev), \
struct hdac_ext_device, hdev))
/*
* HD-audio codec base driver
*/
struct
hdac_ext_driver
{
struct
hdac_driver
hdac
;
int
(
*
probe
)(
struct
hdac_ext_device
*
dev
);
int
(
*
remove
)(
struct
hdac_ext_device
*
dev
);
void
(
*
shutdown
)(
struct
hdac_ext_device
*
dev
);
};
int
snd_hda_ext_driver_register
(
struct
hdac_ext_driver
*
drv
);
void
snd_hda_ext_driver_unregister
(
struct
hdac_ext_driver
*
drv
);
#define to_ehdac_driver(_drv) container_of(_drv, struct hdac_ext_driver, hdac)
int
snd_hda_ext_driver_register
(
struct
hdac_driver
*
drv
);
void
snd_hda_ext_driver_unregister
(
struct
hdac_driver
*
drv
);
#endif
/* __SOUND_HDAUDIO_EXT_H */
#endif
/* __SOUND_HDAUDIO_EXT_H */
sound/hda/ext/hdac_ext_bus.c
浏览文件 @
9a9b13dd
...
@@ -87,9 +87,10 @@ static const struct hdac_io_ops hdac_ext_default_io = {
...
@@ -87,9 +87,10 @@ static const struct hdac_io_ops hdac_ext_default_io = {
*
*
* Returns 0 if successful, or a negative error code.
* Returns 0 if successful, or a negative error code.
*/
*/
int
snd_hdac_ext_bus_init
(
struct
hdac_
ext_bus
*
e
bus
,
struct
device
*
dev
,
int
snd_hdac_ext_bus_init
(
struct
hdac_
bus
*
bus
,
struct
device
*
dev
,
const
struct
hdac_bus_ops
*
ops
,
const
struct
hdac_bus_ops
*
ops
,
const
struct
hdac_io_ops
*
io_ops
)
const
struct
hdac_io_ops
*
io_ops
,
const
struct
hdac_ext_bus_ops
*
ext_ops
)
{
{
int
ret
;
int
ret
;
static
int
idx
;
static
int
idx
;
...
@@ -98,15 +99,16 @@ int snd_hdac_ext_bus_init(struct hdac_ext_bus *ebus, struct device *dev,
...
@@ -98,15 +99,16 @@ int snd_hdac_ext_bus_init(struct hdac_ext_bus *ebus, struct device *dev,
if
(
io_ops
==
NULL
)
if
(
io_ops
==
NULL
)
io_ops
=
&
hdac_ext_default_io
;
io_ops
=
&
hdac_ext_default_io
;
ret
=
snd_hdac_bus_init
(
&
ebus
->
bus
,
dev
,
ops
,
io_ops
);
ret
=
snd_hdac_bus_init
(
bus
,
dev
,
ops
,
io_ops
);
if
(
ret
<
0
)
if
(
ret
<
0
)
return
ret
;
return
ret
;
INIT_LIST_HEAD
(
&
ebus
->
hlink_list
);
bus
->
ext_ops
=
ext_ops
;
ebus
->
idx
=
idx
++
;
INIT_LIST_HEAD
(
&
bus
->
hlink_list
);
bus
->
idx
=
idx
++
;
mutex_init
(
&
e
bus
->
lock
);
mutex_init
(
&
bus
->
lock
);
e
bus
->
cmd_dma_state
=
true
;
bus
->
cmd_dma_state
=
true
;
return
0
;
return
0
;
}
}
...
@@ -116,10 +118,10 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_init);
...
@@ -116,10 +118,10 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_init);
* snd_hdac_ext_bus_exit - clean up a HD-audio extended bus
* snd_hdac_ext_bus_exit - clean up a HD-audio extended bus
* @ebus: the pointer to extended bus object
* @ebus: the pointer to extended bus object
*/
*/
void
snd_hdac_ext_bus_exit
(
struct
hdac_
ext_bus
*
e
bus
)
void
snd_hdac_ext_bus_exit
(
struct
hdac_
bus
*
bus
)
{
{
snd_hdac_bus_exit
(
&
ebus
->
bus
);
snd_hdac_bus_exit
(
bus
);
WARN_ON
(
!
list_empty
(
&
e
bus
->
hlink_list
));
WARN_ON
(
!
list_empty
(
&
bus
->
hlink_list
));
}
}
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_bus_exit
);
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_bus_exit
);
...
@@ -135,21 +137,15 @@ static void default_release(struct device *dev)
...
@@ -135,21 +137,15 @@ static void default_release(struct device *dev)
*
*
* Returns zero for success or a negative error code.
* Returns zero for success or a negative error code.
*/
*/
int
snd_hdac_ext_bus_device_init
(
struct
hdac_ext_bus
*
ebus
,
int
addr
)
int
snd_hdac_ext_bus_device_init
(
struct
hdac_bus
*
bus
,
int
addr
,
struct
hdac_device
*
hdev
)
{
{
struct
hdac_ext_device
*
edev
;
struct
hdac_device
*
hdev
=
NULL
;
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
char
name
[
15
];
char
name
[
15
];
int
ret
;
int
ret
;
edev
=
kzalloc
(
sizeof
(
*
edev
),
GFP_KERNEL
);
hdev
->
bus
=
bus
;
if
(
!
edev
)
return
-
ENOMEM
;
hdev
=
&
edev
->
hdev
;
edev
->
ebus
=
ebus
;
snprintf
(
name
,
sizeof
(
name
),
"ehdaudio%dD%d"
,
e
bus
->
idx
,
addr
);
snprintf
(
name
,
sizeof
(
name
),
"ehdaudio%dD%d"
,
bus
->
idx
,
addr
);
ret
=
snd_hdac_device_init
(
hdev
,
bus
,
name
,
addr
);
ret
=
snd_hdac_device_init
(
hdev
,
bus
,
name
,
addr
);
if
(
ret
<
0
)
{
if
(
ret
<
0
)
{
...
@@ -176,10 +172,8 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_device_init);
...
@@ -176,10 +172,8 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_device_init);
*/
*/
void
snd_hdac_ext_bus_device_exit
(
struct
hdac_device
*
hdev
)
void
snd_hdac_ext_bus_device_exit
(
struct
hdac_device
*
hdev
)
{
{
struct
hdac_ext_device
*
edev
=
to_ehdac_device
(
hdev
);
snd_hdac_device_exit
(
hdev
);
snd_hdac_device_exit
(
hdev
);
kfree
(
e
dev
);
kfree
(
h
dev
);
}
}
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_bus_device_exit
);
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_bus_device_exit
);
...
@@ -188,14 +182,14 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_device_exit);
...
@@ -188,14 +182,14 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_device_exit);
*
*
* @ebus: HD-audio extended bus
* @ebus: HD-audio extended bus
*/
*/
void
snd_hdac_ext_bus_device_remove
(
struct
hdac_
ext_bus
*
e
bus
)
void
snd_hdac_ext_bus_device_remove
(
struct
hdac_
bus
*
bus
)
{
{
struct
hdac_device
*
codec
,
*
__codec
;
struct
hdac_device
*
codec
,
*
__codec
;
/*
/*
* we need to remove all the codec devices objects created in the
* we need to remove all the codec devices objects created in the
* snd_hdac_ext_bus_device_init
* snd_hdac_ext_bus_device_init
*/
*/
list_for_each_entry_safe
(
codec
,
__codec
,
&
ebus
->
bus
.
codec_list
,
list
)
{
list_for_each_entry_safe
(
codec
,
__codec
,
&
bus
->
codec_list
,
list
)
{
snd_hdac_device_unregister
(
codec
);
snd_hdac_device_unregister
(
codec
);
put_device
(
&
codec
->
dev
);
put_device
(
&
codec
->
dev
);
}
}
...
@@ -204,35 +198,31 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_device_remove);
...
@@ -204,35 +198,31 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_device_remove);
#define dev_to_hdac(dev) (container_of((dev), \
#define dev_to_hdac(dev) (container_of((dev), \
struct hdac_device, dev))
struct hdac_device, dev))
static
inline
struct
hdac_
ext_driver
*
get_e
drv
(
struct
device
*
dev
)
static
inline
struct
hdac_
driver
*
get_h
drv
(
struct
device
*
dev
)
{
{
struct
hdac_driver
*
hdrv
=
drv_to_hdac_driver
(
dev
->
driver
);
struct
hdac_driver
*
hdrv
=
drv_to_hdac_driver
(
dev
->
driver
);
struct
hdac_ext_driver
*
edrv
=
to_ehdac_driver
(
hdrv
);
return
hdrv
;
return
edrv
;
}
}
static
inline
struct
hdac_
ext_device
*
get_e
dev
(
struct
device
*
dev
)
static
inline
struct
hdac_
device
*
get_h
dev
(
struct
device
*
dev
)
{
{
struct
hdac_device
*
hdev
=
dev_to_hdac_dev
(
dev
);
struct
hdac_device
*
hdev
=
dev_to_hdac_dev
(
dev
);
struct
hdac_ext_device
*
edev
=
to_ehdac_device
(
hdev
);
return
hdev
;
return
edev
;
}
}
static
int
hda_ext_drv_probe
(
struct
device
*
dev
)
static
int
hda_ext_drv_probe
(
struct
device
*
dev
)
{
{
return
(
get_
edrv
(
dev
))
->
probe
(
get_e
dev
(
dev
));
return
(
get_
hdrv
(
dev
))
->
probe
(
get_h
dev
(
dev
));
}
}
static
int
hdac_ext_drv_remove
(
struct
device
*
dev
)
static
int
hdac_ext_drv_remove
(
struct
device
*
dev
)
{
{
return
(
get_
edrv
(
dev
))
->
remove
(
get_e
dev
(
dev
));
return
(
get_
hdrv
(
dev
))
->
remove
(
get_h
dev
(
dev
));
}
}
static
void
hdac_ext_drv_shutdown
(
struct
device
*
dev
)
static
void
hdac_ext_drv_shutdown
(
struct
device
*
dev
)
{
{
return
(
get_
edrv
(
dev
))
->
shutdown
(
get_e
dev
(
dev
));
return
(
get_
hdrv
(
dev
))
->
shutdown
(
get_h
dev
(
dev
));
}
}
/**
/**
...
@@ -240,20 +230,20 @@ static void hdac_ext_drv_shutdown(struct device *dev)
...
@@ -240,20 +230,20 @@ static void hdac_ext_drv_shutdown(struct device *dev)
*
*
* @drv: ext hda driver structure
* @drv: ext hda driver structure
*/
*/
int
snd_hda_ext_driver_register
(
struct
hdac_
ext_
driver
*
drv
)
int
snd_hda_ext_driver_register
(
struct
hdac_driver
*
drv
)
{
{
drv
->
hdac
.
type
=
HDA_DEV_ASOC
;
drv
->
type
=
HDA_DEV_ASOC
;
drv
->
hdac
.
driver
.
bus
=
&
snd_hda_bus_type
;
drv
->
driver
.
bus
=
&
snd_hda_bus_type
;
/* we use default match */
/* we use default match */
if
(
drv
->
probe
)
if
(
drv
->
probe
)
drv
->
hdac
.
driver
.
probe
=
hda_ext_drv_probe
;
drv
->
driver
.
probe
=
hda_ext_drv_probe
;
if
(
drv
->
remove
)
if
(
drv
->
remove
)
drv
->
hdac
.
driver
.
remove
=
hdac_ext_drv_remove
;
drv
->
driver
.
remove
=
hdac_ext_drv_remove
;
if
(
drv
->
shutdown
)
if
(
drv
->
shutdown
)
drv
->
hdac
.
driver
.
shutdown
=
hdac_ext_drv_shutdown
;
drv
->
driver
.
shutdown
=
hdac_ext_drv_shutdown
;
return
driver_register
(
&
drv
->
hdac
.
driver
);
return
driver_register
(
&
drv
->
driver
);
}
}
EXPORT_SYMBOL_GPL
(
snd_hda_ext_driver_register
);
EXPORT_SYMBOL_GPL
(
snd_hda_ext_driver_register
);
...
@@ -262,8 +252,8 @@ EXPORT_SYMBOL_GPL(snd_hda_ext_driver_register);
...
@@ -262,8 +252,8 @@ EXPORT_SYMBOL_GPL(snd_hda_ext_driver_register);
*
*
* @drv: ext hda driver structure
* @drv: ext hda driver structure
*/
*/
void
snd_hda_ext_driver_unregister
(
struct
hdac_
ext_
driver
*
drv
)
void
snd_hda_ext_driver_unregister
(
struct
hdac_driver
*
drv
)
{
{
driver_unregister
(
&
drv
->
hdac
.
driver
);
driver_unregister
(
&
drv
->
driver
);
}
}
EXPORT_SYMBOL_GPL
(
snd_hda_ext_driver_unregister
);
EXPORT_SYMBOL_GPL
(
snd_hda_ext_driver_unregister
);
sound/hda/ext/hdac_ext_controller.c
浏览文件 @
9a9b13dd
...
@@ -39,9 +39,8 @@
...
@@ -39,9 +39,8 @@
* @ebus: HD-audio extended core bus
* @ebus: HD-audio extended core bus
* @enable: flag to turn on/off the capability
* @enable: flag to turn on/off the capability
*/
*/
void
snd_hdac_ext_bus_ppcap_enable
(
struct
hdac_
ext_bus
*
e
bus
,
bool
enable
)
void
snd_hdac_ext_bus_ppcap_enable
(
struct
hdac_
bus
*
bus
,
bool
enable
)
{
{
struct
hdac_bus
*
bus
=
&
ebus
->
bus
;
if
(
!
bus
->
ppcap
)
{
if
(
!
bus
->
ppcap
)
{
dev_err
(
bus
->
dev
,
"Address of PP capability is NULL"
);
dev_err
(
bus
->
dev
,
"Address of PP capability is NULL"
);
...
@@ -60,9 +59,8 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_ppcap_enable);
...
@@ -60,9 +59,8 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_ppcap_enable);
* @ebus: HD-audio extended core bus
* @ebus: HD-audio extended core bus
* @enable: flag to enable/disable interrupt
* @enable: flag to enable/disable interrupt
*/
*/
void
snd_hdac_ext_bus_ppcap_int_enable
(
struct
hdac_
ext_bus
*
e
bus
,
bool
enable
)
void
snd_hdac_ext_bus_ppcap_int_enable
(
struct
hdac_
bus
*
bus
,
bool
enable
)
{
{
struct
hdac_bus
*
bus
=
&
ebus
->
bus
;
if
(
!
bus
->
ppcap
)
{
if
(
!
bus
->
ppcap
)
{
dev_err
(
bus
->
dev
,
"Address of PP capability is NULL
\n
"
);
dev_err
(
bus
->
dev
,
"Address of PP capability is NULL
\n
"
);
...
@@ -89,12 +87,11 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_ppcap_int_enable);
...
@@ -89,12 +87,11 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_ppcap_int_enable);
* in hlink_list of extended hdac bus
* in hlink_list of extended hdac bus
* Note: this will be freed on bus exit by driver
* Note: this will be freed on bus exit by driver
*/
*/
int
snd_hdac_ext_bus_get_ml_capabilities
(
struct
hdac_
ext_bus
*
e
bus
)
int
snd_hdac_ext_bus_get_ml_capabilities
(
struct
hdac_
bus
*
bus
)
{
{
int
idx
;
int
idx
;
u32
link_count
;
u32
link_count
;
struct
hdac_ext_link
*
hlink
;
struct
hdac_ext_link
*
hlink
;
struct
hdac_bus
*
bus
=
&
ebus
->
bus
;
link_count
=
readl
(
bus
->
mlcap
+
AZX_REG_ML_MLCD
)
+
1
;
link_count
=
readl
(
bus
->
mlcap
+
AZX_REG_ML_MLCD
)
+
1
;
...
@@ -114,7 +111,7 @@ int snd_hdac_ext_bus_get_ml_capabilities(struct hdac_ext_bus *ebus)
...
@@ -114,7 +111,7 @@ int snd_hdac_ext_bus_get_ml_capabilities(struct hdac_ext_bus *ebus)
/* since link in On, update the ref */
/* since link in On, update the ref */
hlink
->
ref_count
=
1
;
hlink
->
ref_count
=
1
;
list_add_tail
(
&
hlink
->
list
,
&
e
bus
->
hlink_list
);
list_add_tail
(
&
hlink
->
list
,
&
bus
->
hlink_list
);
}
}
return
0
;
return
0
;
...
@@ -127,12 +124,12 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_get_ml_capabilities);
...
@@ -127,12 +124,12 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_get_ml_capabilities);
* @ebus: HD-audio ext core bus
* @ebus: HD-audio ext core bus
*/
*/
void
snd_hdac_link_free_all
(
struct
hdac_
ext_bus
*
e
bus
)
void
snd_hdac_link_free_all
(
struct
hdac_
bus
*
bus
)
{
{
struct
hdac_ext_link
*
l
;
struct
hdac_ext_link
*
l
;
while
(
!
list_empty
(
&
e
bus
->
hlink_list
))
{
while
(
!
list_empty
(
&
bus
->
hlink_list
))
{
l
=
list_first_entry
(
&
e
bus
->
hlink_list
,
struct
hdac_ext_link
,
list
);
l
=
list_first_entry
(
&
bus
->
hlink_list
,
struct
hdac_ext_link
,
list
);
list_del
(
&
l
->
list
);
list_del
(
&
l
->
list
);
kfree
(
l
);
kfree
(
l
);
}
}
...
@@ -144,7 +141,7 @@ EXPORT_SYMBOL_GPL(snd_hdac_link_free_all);
...
@@ -144,7 +141,7 @@ EXPORT_SYMBOL_GPL(snd_hdac_link_free_all);
* @ebus: HD-audio extended core bus
* @ebus: HD-audio extended core bus
* @codec_name: codec name
* @codec_name: codec name
*/
*/
struct
hdac_ext_link
*
snd_hdac_ext_bus_get_link
(
struct
hdac_
ext_bus
*
e
bus
,
struct
hdac_ext_link
*
snd_hdac_ext_bus_get_link
(
struct
hdac_
bus
*
bus
,
const
char
*
codec_name
)
const
char
*
codec_name
)
{
{
int
i
;
int
i
;
...
@@ -153,10 +150,10 @@ struct hdac_ext_link *snd_hdac_ext_bus_get_link(struct hdac_ext_bus *ebus,
...
@@ -153,10 +150,10 @@ struct hdac_ext_link *snd_hdac_ext_bus_get_link(struct hdac_ext_bus *ebus,
if
(
sscanf
(
codec_name
,
"ehdaudio%dD%d"
,
&
bus_idx
,
&
addr
)
!=
2
)
if
(
sscanf
(
codec_name
,
"ehdaudio%dD%d"
,
&
bus_idx
,
&
addr
)
!=
2
)
return
NULL
;
return
NULL
;
if
(
e
bus
->
idx
!=
bus_idx
)
if
(
bus
->
idx
!=
bus_idx
)
return
NULL
;
return
NULL
;
list_for_each_entry
(
hlink
,
&
e
bus
->
hlink_list
,
list
)
{
list_for_each_entry
(
hlink
,
&
bus
->
hlink_list
,
list
)
{
for
(
i
=
0
;
i
<
HDA_MAX_CODECS
;
i
++
)
{
for
(
i
=
0
;
i
<
HDA_MAX_CODECS
;
i
++
)
{
if
(
hlink
->
lsdiid
&
(
0x1
<<
addr
))
if
(
hlink
->
lsdiid
&
(
0x1
<<
addr
))
return
hlink
;
return
hlink
;
...
@@ -219,12 +216,12 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_link_power_down);
...
@@ -219,12 +216,12 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_link_power_down);
* snd_hdac_ext_bus_link_power_up_all -power up all hda link
* snd_hdac_ext_bus_link_power_up_all -power up all hda link
* @ebus: HD-audio extended bus
* @ebus: HD-audio extended bus
*/
*/
int
snd_hdac_ext_bus_link_power_up_all
(
struct
hdac_
ext_bus
*
e
bus
)
int
snd_hdac_ext_bus_link_power_up_all
(
struct
hdac_
bus
*
bus
)
{
{
struct
hdac_ext_link
*
hlink
=
NULL
;
struct
hdac_ext_link
*
hlink
=
NULL
;
int
ret
;
int
ret
;
list_for_each_entry
(
hlink
,
&
e
bus
->
hlink_list
,
list
)
{
list_for_each_entry
(
hlink
,
&
bus
->
hlink_list
,
list
)
{
snd_hdac_updatel
(
hlink
->
ml_addr
,
snd_hdac_updatel
(
hlink
->
ml_addr
,
AZX_REG_ML_LCTL
,
0
,
AZX_MLCTL_SPA
);
AZX_REG_ML_LCTL
,
0
,
AZX_MLCTL_SPA
);
ret
=
check_hdac_link_power_active
(
hlink
,
true
);
ret
=
check_hdac_link_power_active
(
hlink
,
true
);
...
@@ -240,12 +237,12 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_link_power_up_all);
...
@@ -240,12 +237,12 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_link_power_up_all);
* snd_hdac_ext_bus_link_power_down_all -power down all hda link
* snd_hdac_ext_bus_link_power_down_all -power down all hda link
* @ebus: HD-audio extended bus
* @ebus: HD-audio extended bus
*/
*/
int
snd_hdac_ext_bus_link_power_down_all
(
struct
hdac_
ext_bus
*
e
bus
)
int
snd_hdac_ext_bus_link_power_down_all
(
struct
hdac_
bus
*
bus
)
{
{
struct
hdac_ext_link
*
hlink
=
NULL
;
struct
hdac_ext_link
*
hlink
=
NULL
;
int
ret
;
int
ret
;
list_for_each_entry
(
hlink
,
&
e
bus
->
hlink_list
,
list
)
{
list_for_each_entry
(
hlink
,
&
bus
->
hlink_list
,
list
)
{
snd_hdac_updatel
(
hlink
->
ml_addr
,
AZX_REG_ML_LCTL
,
AZX_MLCTL_SPA
,
0
);
snd_hdac_updatel
(
hlink
->
ml_addr
,
AZX_REG_ML_LCTL
,
AZX_MLCTL_SPA
,
0
);
ret
=
check_hdac_link_power_active
(
hlink
,
false
);
ret
=
check_hdac_link_power_active
(
hlink
,
false
);
if
(
ret
<
0
)
if
(
ret
<
0
)
...
@@ -256,39 +253,48 @@ int snd_hdac_ext_bus_link_power_down_all(struct hdac_ext_bus *ebus)
...
@@ -256,39 +253,48 @@ int snd_hdac_ext_bus_link_power_down_all(struct hdac_ext_bus *ebus)
}
}
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_bus_link_power_down_all
);
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_bus_link_power_down_all
);
int
snd_hdac_ext_bus_link_get
(
struct
hdac_
ext_bus
*
e
bus
,
int
snd_hdac_ext_bus_link_get
(
struct
hdac_
bus
*
bus
,
struct
hdac_ext_link
*
link
)
struct
hdac_ext_link
*
link
)
{
{
int
ret
=
0
;
int
ret
=
0
;
mutex_lock
(
&
e
bus
->
lock
);
mutex_lock
(
&
bus
->
lock
);
/*
/*
* if we move from 0 to 1, count will be 1 so power up this link
* 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
* as well, also check the dma status and trigger that
*/
*/
if
(
++
link
->
ref_count
==
1
)
{
if
(
++
link
->
ref_count
==
1
)
{
if
(
!
e
bus
->
cmd_dma_state
)
{
if
(
!
bus
->
cmd_dma_state
)
{
snd_hdac_bus_init_cmd_io
(
&
ebus
->
bus
);
snd_hdac_bus_init_cmd_io
(
bus
);
e
bus
->
cmd_dma_state
=
true
;
bus
->
cmd_dma_state
=
true
;
}
}
ret
=
snd_hdac_ext_bus_link_power_up
(
link
);
ret
=
snd_hdac_ext_bus_link_power_up
(
link
);
/*
* wait for 521usec for codec to report status
* HDA spec section 4.3 - Codec Discovery
*/
udelay
(
521
);
bus
->
codec_mask
=
snd_hdac_chip_readw
(
bus
,
STATESTS
);
dev_dbg
(
bus
->
dev
,
"codec_mask = 0x%lx
\n
"
,
bus
->
codec_mask
);
snd_hdac_chip_writew
(
bus
,
STATESTS
,
bus
->
codec_mask
);
}
}
mutex_unlock
(
&
e
bus
->
lock
);
mutex_unlock
(
&
bus
->
lock
);
return
ret
;
return
ret
;
}
}
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_bus_link_get
);
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_bus_link_get
);
int
snd_hdac_ext_bus_link_put
(
struct
hdac_
ext_bus
*
e
bus
,
int
snd_hdac_ext_bus_link_put
(
struct
hdac_
bus
*
bus
,
struct
hdac_ext_link
*
link
)
struct
hdac_ext_link
*
link
)
{
{
int
ret
=
0
;
int
ret
=
0
;
struct
hdac_ext_link
*
hlink
;
struct
hdac_ext_link
*
hlink
;
bool
link_up
=
false
;
bool
link_up
=
false
;
mutex_lock
(
&
e
bus
->
lock
);
mutex_lock
(
&
bus
->
lock
);
/*
/*
* if we move from 1 to 0, count will be 0
* if we move from 1 to 0, count will be 0
...
@@ -301,7 +307,7 @@ int snd_hdac_ext_bus_link_put(struct hdac_ext_bus *ebus,
...
@@ -301,7 +307,7 @@ int snd_hdac_ext_bus_link_put(struct hdac_ext_bus *ebus,
* now check if all links are off, if so turn off
* now check if all links are off, if so turn off
* cmd dma as well
* cmd dma as well
*/
*/
list_for_each_entry
(
hlink
,
&
e
bus
->
hlink_list
,
list
)
{
list_for_each_entry
(
hlink
,
&
bus
->
hlink_list
,
list
)
{
if
(
hlink
->
ref_count
)
{
if
(
hlink
->
ref_count
)
{
link_up
=
true
;
link_up
=
true
;
break
;
break
;
...
@@ -309,12 +315,12 @@ int snd_hdac_ext_bus_link_put(struct hdac_ext_bus *ebus,
...
@@ -309,12 +315,12 @@ int snd_hdac_ext_bus_link_put(struct hdac_ext_bus *ebus,
}
}
if
(
!
link_up
)
{
if
(
!
link_up
)
{
snd_hdac_bus_stop_cmd_io
(
&
ebus
->
bus
);
snd_hdac_bus_stop_cmd_io
(
bus
);
e
bus
->
cmd_dma_state
=
false
;
bus
->
cmd_dma_state
=
false
;
}
}
}
}
mutex_unlock
(
&
e
bus
->
lock
);
mutex_unlock
(
&
bus
->
lock
);
return
ret
;
return
ret
;
}
}
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_bus_link_put
);
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_bus_link_put
);
sound/hda/ext/hdac_ext_stream.c
浏览文件 @
9a9b13dd
...
@@ -25,7 +25,7 @@
...
@@ -25,7 +25,7 @@
/**
/**
* snd_hdac_ext_stream_init - initialize each stream (aka device)
* snd_hdac_ext_stream_init - initialize each stream (aka device)
* @
ebus: HD-audio ext
core bus
* @
bus: HD-audio
core bus
* @stream: HD-audio ext core stream object to initialize
* @stream: HD-audio ext core stream object to initialize
* @idx: stream index number
* @idx: stream index number
* @direction: stream direction (SNDRV_PCM_STREAM_PLAYBACK or SNDRV_PCM_STREAM_CAPTURE)
* @direction: stream direction (SNDRV_PCM_STREAM_PLAYBACK or SNDRV_PCM_STREAM_CAPTURE)
...
@@ -34,18 +34,16 @@
...
@@ -34,18 +34,16 @@
* initialize the stream, if ppcap is enabled then init those and then
* initialize the stream, if ppcap is enabled then init those and then
* invoke hdac stream initialization routine
* invoke hdac stream initialization routine
*/
*/
void
snd_hdac_ext_stream_init
(
struct
hdac_
ext_bus
*
e
bus
,
void
snd_hdac_ext_stream_init
(
struct
hdac_
bus
*
bus
,
struct
hdac_ext_stream
*
stream
,
struct
hdac_ext_stream
*
stream
,
int
idx
,
int
direction
,
int
tag
)
int
idx
,
int
direction
,
int
tag
)
{
{
struct
hdac_bus
*
bus
=
&
ebus
->
bus
;
if
(
bus
->
ppcap
)
{
if
(
bus
->
ppcap
)
{
stream
->
pphc_addr
=
bus
->
ppcap
+
AZX_PPHC_BASE
+
stream
->
pphc_addr
=
bus
->
ppcap
+
AZX_PPHC_BASE
+
AZX_PPHC_INTERVAL
*
idx
;
AZX_PPHC_INTERVAL
*
idx
;
stream
->
pplc_addr
=
bus
->
ppcap
+
AZX_PPLC_BASE
+
stream
->
pplc_addr
=
bus
->
ppcap
+
AZX_PPLC_BASE
+
AZX_PPLC_MULTI
*
e
bus
->
num_streams
+
AZX_PPLC_MULTI
*
bus
->
num_streams
+
AZX_PPLC_INTERVAL
*
idx
;
AZX_PPLC_INTERVAL
*
idx
;
}
}
...
@@ -71,12 +69,12 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_stream_init);
...
@@ -71,12 +69,12 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_stream_init);
/**
/**
* snd_hdac_ext_stream_init_all - create and initialize the stream objects
* snd_hdac_ext_stream_init_all - create and initialize the stream objects
* for an extended hda bus
* for an extended hda bus
* @
ebus: HD-audio ext
core bus
* @
bus: HD-audio
core bus
* @start_idx: start index for streams
* @start_idx: start index for streams
* @num_stream: number of streams to initialize
* @num_stream: number of streams to initialize
* @dir: direction of streams
* @dir: direction of streams
*/
*/
int
snd_hdac_ext_stream_init_all
(
struct
hdac_
ext_bus
*
e
bus
,
int
start_idx
,
int
snd_hdac_ext_stream_init_all
(
struct
hdac_
bus
*
bus
,
int
start_idx
,
int
num_stream
,
int
dir
)
int
num_stream
,
int
dir
)
{
{
int
stream_tag
=
0
;
int
stream_tag
=
0
;
...
@@ -88,7 +86,7 @@ int snd_hdac_ext_stream_init_all(struct hdac_ext_bus *ebus, int start_idx,
...
@@ -88,7 +86,7 @@ int snd_hdac_ext_stream_init_all(struct hdac_ext_bus *ebus, int start_idx,
if
(
!
stream
)
if
(
!
stream
)
return
-
ENOMEM
;
return
-
ENOMEM
;
tag
=
++
stream_tag
;
tag
=
++
stream_tag
;
snd_hdac_ext_stream_init
(
e
bus
,
stream
,
idx
,
dir
,
tag
);
snd_hdac_ext_stream_init
(
bus
,
stream
,
idx
,
dir
,
tag
);
idx
++
;
idx
++
;
}
}
...
@@ -100,17 +98,16 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_stream_init_all);
...
@@ -100,17 +98,16 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_stream_init_all);
/**
/**
* snd_hdac_stream_free_all - free hdac extended stream objects
* snd_hdac_stream_free_all - free hdac extended stream objects
*
*
* @
ebus: HD-audio ext
core bus
* @
bus: HD-audio
core bus
*/
*/
void
snd_hdac_stream_free_all
(
struct
hdac_
ext_bus
*
e
bus
)
void
snd_hdac_stream_free_all
(
struct
hdac_
bus
*
bus
)
{
{
struct
hdac_stream
*
s
,
*
_s
;
struct
hdac_stream
*
s
,
*
_s
;
struct
hdac_ext_stream
*
stream
;
struct
hdac_ext_stream
*
stream
;
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
list_for_each_entry_safe
(
s
,
_s
,
&
bus
->
stream_list
,
list
)
{
list_for_each_entry_safe
(
s
,
_s
,
&
bus
->
stream_list
,
list
)
{
stream
=
stream_to_hdac_ext_stream
(
s
);
stream
=
stream_to_hdac_ext_stream
(
s
);
snd_hdac_ext_stream_decouple
(
e
bus
,
stream
,
false
);
snd_hdac_ext_stream_decouple
(
bus
,
stream
,
false
);
list_del
(
&
s
->
list
);
list_del
(
&
s
->
list
);
kfree
(
stream
);
kfree
(
stream
);
}
}
...
@@ -119,15 +116,14 @@ EXPORT_SYMBOL_GPL(snd_hdac_stream_free_all);
...
@@ -119,15 +116,14 @@ EXPORT_SYMBOL_GPL(snd_hdac_stream_free_all);
/**
/**
* snd_hdac_ext_stream_decouple - decouple the hdac stream
* snd_hdac_ext_stream_decouple - decouple the hdac stream
* @
ebus: HD-audio ext
core bus
* @
bus: HD-audio
core bus
* @stream: HD-audio ext core stream object to initialize
* @stream: HD-audio ext core stream object to initialize
* @decouple: flag to decouple
* @decouple: flag to decouple
*/
*/
void
snd_hdac_ext_stream_decouple
(
struct
hdac_
ext_bus
*
e
bus
,
void
snd_hdac_ext_stream_decouple
(
struct
hdac_
bus
*
bus
,
struct
hdac_ext_stream
*
stream
,
bool
decouple
)
struct
hdac_ext_stream
*
stream
,
bool
decouple
)
{
{
struct
hdac_stream
*
hstream
=
&
stream
->
hstream
;
struct
hdac_stream
*
hstream
=
&
stream
->
hstream
;
struct
hdac_bus
*
bus
=
&
ebus
->
bus
;
u32
val
;
u32
val
;
int
mask
=
AZX_PPCTL_PROCEN
(
hstream
->
index
);
int
mask
=
AZX_PPCTL_PROCEN
(
hstream
->
index
);
...
@@ -251,19 +247,18 @@ void snd_hdac_ext_link_clear_stream_id(struct hdac_ext_link *link,
...
@@ -251,19 +247,18 @@ void snd_hdac_ext_link_clear_stream_id(struct hdac_ext_link *link,
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_link_clear_stream_id
);
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_link_clear_stream_id
);
static
struct
hdac_ext_stream
*
static
struct
hdac_ext_stream
*
hdac_ext_link_stream_assign
(
struct
hdac_
ext_bus
*
e
bus
,
hdac_ext_link_stream_assign
(
struct
hdac_
bus
*
bus
,
struct
snd_pcm_substream
*
substream
)
struct
snd_pcm_substream
*
substream
)
{
{
struct
hdac_ext_stream
*
res
=
NULL
;
struct
hdac_ext_stream
*
res
=
NULL
;
struct
hdac_stream
*
stream
=
NULL
;
struct
hdac_stream
*
stream
=
NULL
;
struct
hdac_bus
*
hbus
=
&
ebus
->
bus
;
if
(
!
h
bus
->
ppcap
)
{
if
(
!
bus
->
ppcap
)
{
dev_err
(
h
bus
->
dev
,
"stream type not supported
\n
"
);
dev_err
(
bus
->
dev
,
"stream type not supported
\n
"
);
return
NULL
;
return
NULL
;
}
}
list_for_each_entry
(
stream
,
&
h
bus
->
stream_list
,
list
)
{
list_for_each_entry
(
stream
,
&
bus
->
stream_list
,
list
)
{
struct
hdac_ext_stream
*
hstream
=
container_of
(
stream
,
struct
hdac_ext_stream
*
hstream
=
container_of
(
stream
,
struct
hdac_ext_stream
,
struct
hdac_ext_stream
,
hstream
);
hstream
);
...
@@ -277,34 +272,33 @@ hdac_ext_link_stream_assign(struct hdac_ext_bus *ebus,
...
@@ -277,34 +272,33 @@ hdac_ext_link_stream_assign(struct hdac_ext_bus *ebus,
}
}
if
(
!
hstream
->
link_locked
)
{
if
(
!
hstream
->
link_locked
)
{
snd_hdac_ext_stream_decouple
(
e
bus
,
hstream
,
true
);
snd_hdac_ext_stream_decouple
(
bus
,
hstream
,
true
);
res
=
hstream
;
res
=
hstream
;
break
;
break
;
}
}
}
}
if
(
res
)
{
if
(
res
)
{
spin_lock_irq
(
&
h
bus
->
reg_lock
);
spin_lock_irq
(
&
bus
->
reg_lock
);
res
->
link_locked
=
1
;
res
->
link_locked
=
1
;
res
->
link_substream
=
substream
;
res
->
link_substream
=
substream
;
spin_unlock_irq
(
&
h
bus
->
reg_lock
);
spin_unlock_irq
(
&
bus
->
reg_lock
);
}
}
return
res
;
return
res
;
}
}
static
struct
hdac_ext_stream
*
static
struct
hdac_ext_stream
*
hdac_ext_host_stream_assign
(
struct
hdac_
ext_bus
*
e
bus
,
hdac_ext_host_stream_assign
(
struct
hdac_
bus
*
bus
,
struct
snd_pcm_substream
*
substream
)
struct
snd_pcm_substream
*
substream
)
{
{
struct
hdac_ext_stream
*
res
=
NULL
;
struct
hdac_ext_stream
*
res
=
NULL
;
struct
hdac_stream
*
stream
=
NULL
;
struct
hdac_stream
*
stream
=
NULL
;
struct
hdac_bus
*
hbus
=
&
ebus
->
bus
;
if
(
!
h
bus
->
ppcap
)
{
if
(
!
bus
->
ppcap
)
{
dev_err
(
h
bus
->
dev
,
"stream type not supported
\n
"
);
dev_err
(
bus
->
dev
,
"stream type not supported
\n
"
);
return
NULL
;
return
NULL
;
}
}
list_for_each_entry
(
stream
,
&
h
bus
->
stream_list
,
list
)
{
list_for_each_entry
(
stream
,
&
bus
->
stream_list
,
list
)
{
struct
hdac_ext_stream
*
hstream
=
container_of
(
stream
,
struct
hdac_ext_stream
*
hstream
=
container_of
(
stream
,
struct
hdac_ext_stream
,
struct
hdac_ext_stream
,
hstream
);
hstream
);
...
@@ -313,17 +307,17 @@ hdac_ext_host_stream_assign(struct hdac_ext_bus *ebus,
...
@@ -313,17 +307,17 @@ hdac_ext_host_stream_assign(struct hdac_ext_bus *ebus,
if
(
!
stream
->
opened
)
{
if
(
!
stream
->
opened
)
{
if
(
!
hstream
->
decoupled
)
if
(
!
hstream
->
decoupled
)
snd_hdac_ext_stream_decouple
(
e
bus
,
hstream
,
true
);
snd_hdac_ext_stream_decouple
(
bus
,
hstream
,
true
);
res
=
hstream
;
res
=
hstream
;
break
;
break
;
}
}
}
}
if
(
res
)
{
if
(
res
)
{
spin_lock_irq
(
&
h
bus
->
reg_lock
);
spin_lock_irq
(
&
bus
->
reg_lock
);
res
->
hstream
.
opened
=
1
;
res
->
hstream
.
opened
=
1
;
res
->
hstream
.
running
=
0
;
res
->
hstream
.
running
=
0
;
res
->
hstream
.
substream
=
substream
;
res
->
hstream
.
substream
=
substream
;
spin_unlock_irq
(
&
h
bus
->
reg_lock
);
spin_unlock_irq
(
&
bus
->
reg_lock
);
}
}
return
res
;
return
res
;
...
@@ -331,7 +325,7 @@ hdac_ext_host_stream_assign(struct hdac_ext_bus *ebus,
...
@@ -331,7 +325,7 @@ hdac_ext_host_stream_assign(struct hdac_ext_bus *ebus,
/**
/**
* snd_hdac_ext_stream_assign - assign a stream for the PCM
* snd_hdac_ext_stream_assign - assign a stream for the PCM
* @
ebus: HD-audio ext
core bus
* @
bus: HD-audio
core bus
* @substream: PCM substream to assign
* @substream: PCM substream to assign
* @type: type of stream (coupled, host or link stream)
* @type: type of stream (coupled, host or link stream)
*
*
...
@@ -346,27 +340,26 @@ hdac_ext_host_stream_assign(struct hdac_ext_bus *ebus,
...
@@ -346,27 +340,26 @@ hdac_ext_host_stream_assign(struct hdac_ext_bus *ebus,
* the same stream object when it's used beforehand. when a stream is
* the same stream object when it's used beforehand. when a stream is
* decoupled, it becomes a host stream and link stream.
* decoupled, it becomes a host stream and link stream.
*/
*/
struct
hdac_ext_stream
*
snd_hdac_ext_stream_assign
(
struct
hdac_
ext_bus
*
e
bus
,
struct
hdac_ext_stream
*
snd_hdac_ext_stream_assign
(
struct
hdac_
bus
*
bus
,
struct
snd_pcm_substream
*
substream
,
struct
snd_pcm_substream
*
substream
,
int
type
)
int
type
)
{
{
struct
hdac_ext_stream
*
hstream
=
NULL
;
struct
hdac_ext_stream
*
hstream
=
NULL
;
struct
hdac_stream
*
stream
=
NULL
;
struct
hdac_stream
*
stream
=
NULL
;
struct
hdac_bus
*
hbus
=
&
ebus
->
bus
;
switch
(
type
)
{
switch
(
type
)
{
case
HDAC_EXT_STREAM_TYPE_COUPLED
:
case
HDAC_EXT_STREAM_TYPE_COUPLED
:
stream
=
snd_hdac_stream_assign
(
h
bus
,
substream
);
stream
=
snd_hdac_stream_assign
(
bus
,
substream
);
if
(
stream
)
if
(
stream
)
hstream
=
container_of
(
stream
,
hstream
=
container_of
(
stream
,
struct
hdac_ext_stream
,
hstream
);
struct
hdac_ext_stream
,
hstream
);
return
hstream
;
return
hstream
;
case
HDAC_EXT_STREAM_TYPE_HOST
:
case
HDAC_EXT_STREAM_TYPE_HOST
:
return
hdac_ext_host_stream_assign
(
e
bus
,
substream
);
return
hdac_ext_host_stream_assign
(
bus
,
substream
);
case
HDAC_EXT_STREAM_TYPE_LINK
:
case
HDAC_EXT_STREAM_TYPE_LINK
:
return
hdac_ext_link_stream_assign
(
e
bus
,
substream
);
return
hdac_ext_link_stream_assign
(
bus
,
substream
);
default:
default:
return
NULL
;
return
NULL
;
...
@@ -384,7 +377,6 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_stream_assign);
...
@@ -384,7 +377,6 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_stream_assign);
void
snd_hdac_ext_stream_release
(
struct
hdac_ext_stream
*
stream
,
int
type
)
void
snd_hdac_ext_stream_release
(
struct
hdac_ext_stream
*
stream
,
int
type
)
{
{
struct
hdac_bus
*
bus
=
stream
->
hstream
.
bus
;
struct
hdac_bus
*
bus
=
stream
->
hstream
.
bus
;
struct
hdac_ext_bus
*
ebus
=
hbus_to_ebus
(
bus
);
switch
(
type
)
{
switch
(
type
)
{
case
HDAC_EXT_STREAM_TYPE_COUPLED
:
case
HDAC_EXT_STREAM_TYPE_COUPLED
:
...
@@ -393,13 +385,13 @@ void snd_hdac_ext_stream_release(struct hdac_ext_stream *stream, int type)
...
@@ -393,13 +385,13 @@ void snd_hdac_ext_stream_release(struct hdac_ext_stream *stream, int type)
case
HDAC_EXT_STREAM_TYPE_HOST
:
case
HDAC_EXT_STREAM_TYPE_HOST
:
if
(
stream
->
decoupled
&&
!
stream
->
link_locked
)
if
(
stream
->
decoupled
&&
!
stream
->
link_locked
)
snd_hdac_ext_stream_decouple
(
e
bus
,
stream
,
false
);
snd_hdac_ext_stream_decouple
(
bus
,
stream
,
false
);
snd_hdac_stream_release
(
&
stream
->
hstream
);
snd_hdac_stream_release
(
&
stream
->
hstream
);
break
;
break
;
case
HDAC_EXT_STREAM_TYPE_LINK
:
case
HDAC_EXT_STREAM_TYPE_LINK
:
if
(
stream
->
decoupled
&&
!
stream
->
hstream
.
opened
)
if
(
stream
->
decoupled
&&
!
stream
->
hstream
.
opened
)
snd_hdac_ext_stream_decouple
(
e
bus
,
stream
,
false
);
snd_hdac_ext_stream_decouple
(
bus
,
stream
,
false
);
spin_lock_irq
(
&
bus
->
reg_lock
);
spin_lock_irq
(
&
bus
->
reg_lock
);
stream
->
link_locked
=
0
;
stream
->
link_locked
=
0
;
stream
->
link_substream
=
NULL
;
stream
->
link_substream
=
NULL
;
...
@@ -415,16 +407,15 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_stream_release);
...
@@ -415,16 +407,15 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_stream_release);
/**
/**
* snd_hdac_ext_stream_spbcap_enable - enable SPIB for a stream
* snd_hdac_ext_stream_spbcap_enable - enable SPIB for a stream
* @
ebus: HD-audio ext
core bus
* @
bus: HD-audio
core bus
* @enable: flag to enable/disable SPIB
* @enable: flag to enable/disable SPIB
* @index: stream index for which SPIB need to be enabled
* @index: stream index for which SPIB need to be enabled
*/
*/
void
snd_hdac_ext_stream_spbcap_enable
(
struct
hdac_
ext_bus
*
e
bus
,
void
snd_hdac_ext_stream_spbcap_enable
(
struct
hdac_
bus
*
bus
,
bool
enable
,
int
index
)
bool
enable
,
int
index
)
{
{
u32
mask
=
0
;
u32
mask
=
0
;
u32
register_mask
=
0
;
u32
register_mask
=
0
;
struct
hdac_bus
*
bus
=
&
ebus
->
bus
;
if
(
!
bus
->
spbcap
)
{
if
(
!
bus
->
spbcap
)
{
dev_err
(
bus
->
dev
,
"Address of SPB capability is NULL
\n
"
);
dev_err
(
bus
->
dev
,
"Address of SPB capability is NULL
\n
"
);
...
@@ -446,14 +437,13 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_stream_spbcap_enable);
...
@@ -446,14 +437,13 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_stream_spbcap_enable);
/**
/**
* snd_hdac_ext_stream_set_spib - sets the spib value of a stream
* snd_hdac_ext_stream_set_spib - sets the spib value of a stream
* @
ebus: HD-audio ext
core bus
* @
bus: HD-audio
core bus
* @stream: hdac_ext_stream
* @stream: hdac_ext_stream
* @value: spib value to set
* @value: spib value to set
*/
*/
int
snd_hdac_ext_stream_set_spib
(
struct
hdac_
ext_bus
*
e
bus
,
int
snd_hdac_ext_stream_set_spib
(
struct
hdac_
bus
*
bus
,
struct
hdac_ext_stream
*
stream
,
u32
value
)
struct
hdac_ext_stream
*
stream
,
u32
value
)
{
{
struct
hdac_bus
*
bus
=
&
ebus
->
bus
;
if
(
!
bus
->
spbcap
)
{
if
(
!
bus
->
spbcap
)
{
dev_err
(
bus
->
dev
,
"Address of SPB capability is NULL
\n
"
);
dev_err
(
bus
->
dev
,
"Address of SPB capability is NULL
\n
"
);
...
@@ -468,15 +458,14 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_stream_set_spib);
...
@@ -468,15 +458,14 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_stream_set_spib);
/**
/**
* snd_hdac_ext_stream_get_spbmaxfifo - gets the spib value of a stream
* snd_hdac_ext_stream_get_spbmaxfifo - gets the spib value of a stream
* @
ebus: HD-audio ext
core bus
* @
bus: HD-audio
core bus
* @stream: hdac_ext_stream
* @stream: hdac_ext_stream
*
*
* Return maxfifo for the stream
* Return maxfifo for the stream
*/
*/
int
snd_hdac_ext_stream_get_spbmaxfifo
(
struct
hdac_
ext_bus
*
e
bus
,
int
snd_hdac_ext_stream_get_spbmaxfifo
(
struct
hdac_
bus
*
bus
,
struct
hdac_ext_stream
*
stream
)
struct
hdac_ext_stream
*
stream
)
{
{
struct
hdac_bus
*
bus
=
&
ebus
->
bus
;
if
(
!
bus
->
spbcap
)
{
if
(
!
bus
->
spbcap
)
{
dev_err
(
bus
->
dev
,
"Address of SPB capability is NULL
\n
"
);
dev_err
(
bus
->
dev
,
"Address of SPB capability is NULL
\n
"
);
...
@@ -490,11 +479,10 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_stream_get_spbmaxfifo);
...
@@ -490,11 +479,10 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_stream_get_spbmaxfifo);
/**
/**
* snd_hdac_ext_stop_streams - stop all stream if running
* snd_hdac_ext_stop_streams - stop all stream if running
* @
ebus: HD-audio ext
core bus
* @
bus: HD-audio
core bus
*/
*/
void
snd_hdac_ext_stop_streams
(
struct
hdac_
ext_bus
*
e
bus
)
void
snd_hdac_ext_stop_streams
(
struct
hdac_
bus
*
bus
)
{
{
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
struct
hdac_stream
*
stream
;
struct
hdac_stream
*
stream
;
if
(
bus
->
chip_init
)
{
if
(
bus
->
chip_init
)
{
...
@@ -507,16 +495,15 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_stop_streams);
...
@@ -507,16 +495,15 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_stop_streams);
/**
/**
* snd_hdac_ext_stream_drsm_enable - enable DMA resume for a stream
* snd_hdac_ext_stream_drsm_enable - enable DMA resume for a stream
* @
ebus: HD-audio ext
core bus
* @
bus: HD-audio
core bus
* @enable: flag to enable/disable DRSM
* @enable: flag to enable/disable DRSM
* @index: stream index for which DRSM need to be enabled
* @index: stream index for which DRSM need to be enabled
*/
*/
void
snd_hdac_ext_stream_drsm_enable
(
struct
hdac_
ext_bus
*
e
bus
,
void
snd_hdac_ext_stream_drsm_enable
(
struct
hdac_
bus
*
bus
,
bool
enable
,
int
index
)
bool
enable
,
int
index
)
{
{
u32
mask
=
0
;
u32
mask
=
0
;
u32
register_mask
=
0
;
u32
register_mask
=
0
;
struct
hdac_bus
*
bus
=
&
ebus
->
bus
;
if
(
!
bus
->
drsmcap
)
{
if
(
!
bus
->
drsmcap
)
{
dev_err
(
bus
->
dev
,
"Address of DRSM capability is NULL
\n
"
);
dev_err
(
bus
->
dev
,
"Address of DRSM capability is NULL
\n
"
);
...
@@ -538,14 +525,13 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_stream_drsm_enable);
...
@@ -538,14 +525,13 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_stream_drsm_enable);
/**
/**
* snd_hdac_ext_stream_set_dpibr - sets the dpibr value of a stream
* snd_hdac_ext_stream_set_dpibr - sets the dpibr value of a stream
* @
ebus: HD-audio ext
core bus
* @
bus: HD-audio
core bus
* @stream: hdac_ext_stream
* @stream: hdac_ext_stream
* @value: dpib value to set
* @value: dpib value to set
*/
*/
int
snd_hdac_ext_stream_set_dpibr
(
struct
hdac_
ext_bus
*
e
bus
,
int
snd_hdac_ext_stream_set_dpibr
(
struct
hdac_
bus
*
bus
,
struct
hdac_ext_stream
*
stream
,
u32
value
)
struct
hdac_ext_stream
*
stream
,
u32
value
)
{
{
struct
hdac_bus
*
bus
=
&
ebus
->
bus
;
if
(
!
bus
->
drsmcap
)
{
if
(
!
bus
->
drsmcap
)
{
dev_err
(
bus
->
dev
,
"Address of DRSM capability is NULL
\n
"
);
dev_err
(
bus
->
dev
,
"Address of DRSM capability is NULL
\n
"
);
...
@@ -560,7 +546,7 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_stream_set_dpibr);
...
@@ -560,7 +546,7 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_stream_set_dpibr);
/**
/**
* snd_hdac_ext_stream_set_lpib - sets the lpib value of a stream
* snd_hdac_ext_stream_set_lpib - sets the lpib value of a stream
* @
ebus: HD-audio ext
core bus
* @
bus: HD-audio
core bus
* @stream: hdac_ext_stream
* @stream: hdac_ext_stream
* @value: lpib value to set
* @value: lpib value to set
*/
*/
...
...
sound/pci/hda/hda_codec.c
浏览文件 @
9a9b13dd
...
@@ -858,6 +858,39 @@ static void snd_hda_codec_dev_release(struct device *dev)
...
@@ -858,6 +858,39 @@ static void snd_hda_codec_dev_release(struct device *dev)
kfree
(
codec
);
kfree
(
codec
);
}
}
#define DEV_NAME_LEN 31
static
int
snd_hda_codec_device_init
(
struct
hda_bus
*
bus
,
struct
snd_card
*
card
,
unsigned
int
codec_addr
,
struct
hda_codec
**
codecp
)
{
char
name
[
DEV_NAME_LEN
];
struct
hda_codec
*
codec
;
int
err
;
dev_dbg
(
card
->
dev
,
"%s: entry
\n
"
,
__func__
);
if
(
snd_BUG_ON
(
!
bus
))
return
-
EINVAL
;
if
(
snd_BUG_ON
(
codec_addr
>
HDA_MAX_CODEC_ADDRESS
))
return
-
EINVAL
;
codec
=
kzalloc
(
sizeof
(
*
codec
),
GFP_KERNEL
);
if
(
!
codec
)
return
-
ENOMEM
;
sprintf
(
name
,
"hdaudioC%dD%d"
,
card
->
number
,
codec_addr
);
err
=
snd_hdac_device_init
(
&
codec
->
core
,
&
bus
->
core
,
name
,
codec_addr
);
if
(
err
<
0
)
{
kfree
(
codec
);
return
err
;
}
codec
->
core
.
type
=
HDA_DEV_LEGACY
;
*
codecp
=
codec
;
return
err
;
}
/**
/**
* snd_hda_codec_new - create a HDA codec
* snd_hda_codec_new - create a HDA codec
* @bus: the bus to assign
* @bus: the bus to assign
...
@@ -869,7 +902,19 @@ static void snd_hda_codec_dev_release(struct device *dev)
...
@@ -869,7 +902,19 @@ static void snd_hda_codec_dev_release(struct device *dev)
int
snd_hda_codec_new
(
struct
hda_bus
*
bus
,
struct
snd_card
*
card
,
int
snd_hda_codec_new
(
struct
hda_bus
*
bus
,
struct
snd_card
*
card
,
unsigned
int
codec_addr
,
struct
hda_codec
**
codecp
)
unsigned
int
codec_addr
,
struct
hda_codec
**
codecp
)
{
{
struct
hda_codec
*
codec
;
int
ret
;
ret
=
snd_hda_codec_device_init
(
bus
,
card
,
codec_addr
,
codecp
);
if
(
ret
<
0
)
return
ret
;
return
snd_hda_codec_device_new
(
bus
,
card
,
codec_addr
,
*
codecp
);
}
EXPORT_SYMBOL_GPL
(
snd_hda_codec_new
);
int
snd_hda_codec_device_new
(
struct
hda_bus
*
bus
,
struct
snd_card
*
card
,
unsigned
int
codec_addr
,
struct
hda_codec
*
codec
)
{
char
component
[
31
];
char
component
[
31
];
hda_nid_t
fg
;
hda_nid_t
fg
;
int
err
;
int
err
;
...
@@ -879,25 +924,14 @@ int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card,
...
@@ -879,25 +924,14 @@ int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card,
.
dev_free
=
snd_hda_codec_dev_free
,
.
dev_free
=
snd_hda_codec_dev_free
,
};
};
dev_dbg
(
card
->
dev
,
"%s: entry
\n
"
,
__func__
);
if
(
snd_BUG_ON
(
!
bus
))
if
(
snd_BUG_ON
(
!
bus
))
return
-
EINVAL
;
return
-
EINVAL
;
if
(
snd_BUG_ON
(
codec_addr
>
HDA_MAX_CODEC_ADDRESS
))
if
(
snd_BUG_ON
(
codec_addr
>
HDA_MAX_CODEC_ADDRESS
))
return
-
EINVAL
;
return
-
EINVAL
;
codec
=
kzalloc
(
sizeof
(
*
codec
),
GFP_KERNEL
);
if
(
!
codec
)
return
-
ENOMEM
;
sprintf
(
component
,
"hdaudioC%dD%d"
,
card
->
number
,
codec_addr
);
err
=
snd_hdac_device_init
(
&
codec
->
core
,
&
bus
->
core
,
component
,
codec_addr
);
if
(
err
<
0
)
{
kfree
(
codec
);
return
err
;
}
codec
->
core
.
dev
.
release
=
snd_hda_codec_dev_release
;
codec
->
core
.
dev
.
release
=
snd_hda_codec_dev_release
;
codec
->
core
.
type
=
HDA_DEV_LEGACY
;
codec
->
core
.
exec_verb
=
codec_exec_verb
;
codec
->
core
.
exec_verb
=
codec_exec_verb
;
codec
->
bus
=
bus
;
codec
->
bus
=
bus
;
...
@@ -957,15 +991,13 @@ int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card,
...
@@ -957,15 +991,13 @@ int snd_hda_codec_new(struct hda_bus *bus, struct snd_card *card,
if
(
err
<
0
)
if
(
err
<
0
)
goto
error
;
goto
error
;
if
(
codecp
)
*
codecp
=
codec
;
return
0
;
return
0
;
error:
error:
put_device
(
hda_codec_dev
(
codec
));
put_device
(
hda_codec_dev
(
codec
));
return
err
;
return
err
;
}
}
EXPORT_SYMBOL_GPL
(
snd_hda_codec_new
);
EXPORT_SYMBOL_GPL
(
snd_hda_codec_
device_
new
);
/**
/**
* snd_hda_codec_update_widgets - Refresh widget caps and pin defaults
* snd_hda_codec_update_widgets - Refresh widget caps and pin defaults
...
@@ -2992,6 +3024,7 @@ int snd_hda_codec_build_controls(struct hda_codec *codec)
...
@@ -2992,6 +3024,7 @@ int snd_hda_codec_build_controls(struct hda_codec *codec)
sync_power_up_states
(
codec
);
sync_power_up_states
(
codec
);
return
0
;
return
0
;
}
}
EXPORT_SYMBOL_GPL
(
snd_hda_codec_build_controls
);
/*
/*
* PCM stuff
* PCM stuff
...
@@ -3197,6 +3230,7 @@ int snd_hda_codec_parse_pcms(struct hda_codec *codec)
...
@@ -3197,6 +3230,7 @@ int snd_hda_codec_parse_pcms(struct hda_codec *codec)
return
0
;
return
0
;
}
}
EXPORT_SYMBOL_GPL
(
snd_hda_codec_parse_pcms
);
/* assign all PCMs of the given codec */
/* assign all PCMs of the given codec */
int
snd_hda_codec_build_pcms
(
struct
hda_codec
*
codec
)
int
snd_hda_codec_build_pcms
(
struct
hda_codec
*
codec
)
...
...
sound/pci/hda/hda_codec.h
浏览文件 @
9a9b13dd
...
@@ -308,6 +308,8 @@ struct hda_codec {
...
@@ -308,6 +308,8 @@ struct hda_codec {
*/
*/
int
snd_hda_codec_new
(
struct
hda_bus
*
bus
,
struct
snd_card
*
card
,
int
snd_hda_codec_new
(
struct
hda_bus
*
bus
,
struct
snd_card
*
card
,
unsigned
int
codec_addr
,
struct
hda_codec
**
codecp
);
unsigned
int
codec_addr
,
struct
hda_codec
**
codecp
);
int
snd_hda_codec_device_new
(
struct
hda_bus
*
bus
,
struct
snd_card
*
card
,
unsigned
int
codec_addr
,
struct
hda_codec
*
codec
);
int
snd_hda_codec_configure
(
struct
hda_codec
*
codec
);
int
snd_hda_codec_configure
(
struct
hda_codec
*
codec
);
int
snd_hda_codec_update_widgets
(
struct
hda_codec
*
codec
);
int
snd_hda_codec_update_widgets
(
struct
hda_codec
*
codec
);
...
...
sound/soc/codecs/hdac_hdmi.c
浏览文件 @
9a9b13dd
此差异已折叠。
点击以展开。
sound/soc/intel/skylake/skl-messages.c
浏览文件 @
9a9b13dd
...
@@ -33,8 +33,7 @@
...
@@ -33,8 +33,7 @@
static
int
skl_alloc_dma_buf
(
struct
device
*
dev
,
static
int
skl_alloc_dma_buf
(
struct
device
*
dev
,
struct
snd_dma_buffer
*
dmab
,
size_t
size
)
struct
snd_dma_buffer
*
dmab
,
size_t
size
)
{
{
struct
hdac_ext_bus
*
ebus
=
dev_get_drvdata
(
dev
);
struct
hdac_bus
*
bus
=
dev_get_drvdata
(
dev
);
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
if
(
!
bus
)
if
(
!
bus
)
return
-
ENODEV
;
return
-
ENODEV
;
...
@@ -44,8 +43,7 @@ static int skl_alloc_dma_buf(struct device *dev,
...
@@ -44,8 +43,7 @@ static int skl_alloc_dma_buf(struct device *dev,
static
int
skl_free_dma_buf
(
struct
device
*
dev
,
struct
snd_dma_buffer
*
dmab
)
static
int
skl_free_dma_buf
(
struct
device
*
dev
,
struct
snd_dma_buffer
*
dmab
)
{
{
struct
hdac_ext_bus
*
ebus
=
dev_get_drvdata
(
dev
);
struct
hdac_bus
*
bus
=
dev_get_drvdata
(
dev
);
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
if
(
!
bus
)
if
(
!
bus
)
return
-
ENODEV
;
return
-
ENODEV
;
...
@@ -89,8 +87,7 @@ void skl_dsp_enable_notification(struct skl_sst *ctx, bool enable)
...
@@ -89,8 +87,7 @@ void skl_dsp_enable_notification(struct skl_sst *ctx, bool enable)
static
int
skl_dsp_setup_spib
(
struct
device
*
dev
,
unsigned
int
size
,
static
int
skl_dsp_setup_spib
(
struct
device
*
dev
,
unsigned
int
size
,
int
stream_tag
,
int
enable
)
int
stream_tag
,
int
enable
)
{
{
struct
hdac_ext_bus
*
ebus
=
dev_get_drvdata
(
dev
);
struct
hdac_bus
*
bus
=
dev_get_drvdata
(
dev
);
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
struct
hdac_stream
*
stream
=
snd_hdac_get_stream
(
bus
,
struct
hdac_stream
*
stream
=
snd_hdac_get_stream
(
bus
,
SNDRV_PCM_STREAM_PLAYBACK
,
stream_tag
);
SNDRV_PCM_STREAM_PLAYBACK
,
stream_tag
);
struct
hdac_ext_stream
*
estream
;
struct
hdac_ext_stream
*
estream
;
...
@@ -100,10 +97,10 @@ static int skl_dsp_setup_spib(struct device *dev, unsigned int size,
...
@@ -100,10 +97,10 @@ static int skl_dsp_setup_spib(struct device *dev, unsigned int size,
estream
=
stream_to_hdac_ext_stream
(
stream
);
estream
=
stream_to_hdac_ext_stream
(
stream
);
/* enable/disable SPIB for this hdac stream */
/* enable/disable SPIB for this hdac stream */
snd_hdac_ext_stream_spbcap_enable
(
e
bus
,
enable
,
stream
->
index
);
snd_hdac_ext_stream_spbcap_enable
(
bus
,
enable
,
stream
->
index
);
/* set the spib value */
/* set the spib value */
snd_hdac_ext_stream_set_spib
(
e
bus
,
estream
,
size
);
snd_hdac_ext_stream_set_spib
(
bus
,
estream
,
size
);
return
0
;
return
0
;
}
}
...
@@ -111,8 +108,7 @@ static int skl_dsp_setup_spib(struct device *dev, unsigned int size,
...
@@ -111,8 +108,7 @@ static int skl_dsp_setup_spib(struct device *dev, unsigned int size,
static
int
skl_dsp_prepare
(
struct
device
*
dev
,
unsigned
int
format
,
static
int
skl_dsp_prepare
(
struct
device
*
dev
,
unsigned
int
format
,
unsigned
int
size
,
struct
snd_dma_buffer
*
dmab
)
unsigned
int
size
,
struct
snd_dma_buffer
*
dmab
)
{
{
struct
hdac_ext_bus
*
ebus
=
dev_get_drvdata
(
dev
);
struct
hdac_bus
*
bus
=
dev_get_drvdata
(
dev
);
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
struct
hdac_ext_stream
*
estream
;
struct
hdac_ext_stream
*
estream
;
struct
hdac_stream
*
stream
;
struct
hdac_stream
*
stream
;
struct
snd_pcm_substream
substream
;
struct
snd_pcm_substream
substream
;
...
@@ -124,7 +120,7 @@ static int skl_dsp_prepare(struct device *dev, unsigned int format,
...
@@ -124,7 +120,7 @@ static int skl_dsp_prepare(struct device *dev, unsigned int format,
memset
(
&
substream
,
0
,
sizeof
(
substream
));
memset
(
&
substream
,
0
,
sizeof
(
substream
));
substream
.
stream
=
SNDRV_PCM_STREAM_PLAYBACK
;
substream
.
stream
=
SNDRV_PCM_STREAM_PLAYBACK
;
estream
=
snd_hdac_ext_stream_assign
(
e
bus
,
&
substream
,
estream
=
snd_hdac_ext_stream_assign
(
bus
,
&
substream
,
HDAC_EXT_STREAM_TYPE_HOST
);
HDAC_EXT_STREAM_TYPE_HOST
);
if
(
!
estream
)
if
(
!
estream
)
return
-
ENODEV
;
return
-
ENODEV
;
...
@@ -143,9 +139,8 @@ static int skl_dsp_prepare(struct device *dev, unsigned int format,
...
@@ -143,9 +139,8 @@ static int skl_dsp_prepare(struct device *dev, unsigned int format,
static
int
skl_dsp_trigger
(
struct
device
*
dev
,
bool
start
,
int
stream_tag
)
static
int
skl_dsp_trigger
(
struct
device
*
dev
,
bool
start
,
int
stream_tag
)
{
{
struct
hdac_
ext_bus
*
e
bus
=
dev_get_drvdata
(
dev
);
struct
hdac_
bus
*
bus
=
dev_get_drvdata
(
dev
);
struct
hdac_stream
*
stream
;
struct
hdac_stream
*
stream
;
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
if
(
!
bus
)
if
(
!
bus
)
return
-
ENODEV
;
return
-
ENODEV
;
...
@@ -163,10 +158,9 @@ static int skl_dsp_trigger(struct device *dev, bool start, int stream_tag)
...
@@ -163,10 +158,9 @@ static int skl_dsp_trigger(struct device *dev, bool start, int stream_tag)
static
int
skl_dsp_cleanup
(
struct
device
*
dev
,
static
int
skl_dsp_cleanup
(
struct
device
*
dev
,
struct
snd_dma_buffer
*
dmab
,
int
stream_tag
)
struct
snd_dma_buffer
*
dmab
,
int
stream_tag
)
{
{
struct
hdac_
ext_bus
*
e
bus
=
dev_get_drvdata
(
dev
);
struct
hdac_
bus
*
bus
=
dev_get_drvdata
(
dev
);
struct
hdac_stream
*
stream
;
struct
hdac_stream
*
stream
;
struct
hdac_ext_stream
*
estream
;
struct
hdac_ext_stream
*
estream
;
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
if
(
!
bus
)
if
(
!
bus
)
return
-
ENODEV
;
return
-
ENODEV
;
...
@@ -270,8 +264,7 @@ const struct skl_dsp_ops *skl_get_dsp_ops(int pci_id)
...
@@ -270,8 +264,7 @@ const struct skl_dsp_ops *skl_get_dsp_ops(int pci_id)
int
skl_init_dsp
(
struct
skl
*
skl
)
int
skl_init_dsp
(
struct
skl
*
skl
)
{
{
void
__iomem
*
mmio_base
;
void
__iomem
*
mmio_base
;
struct
hdac_ext_bus
*
ebus
=
&
skl
->
ebus
;
struct
hdac_bus
*
bus
=
skl_to_bus
(
skl
);
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
struct
skl_dsp_loader_ops
loader_ops
;
struct
skl_dsp_loader_ops
loader_ops
;
int
irq
=
bus
->
irq
;
int
irq
=
bus
->
irq
;
const
struct
skl_dsp_ops
*
ops
;
const
struct
skl_dsp_ops
*
ops
;
...
@@ -279,8 +272,8 @@ int skl_init_dsp(struct skl *skl)
...
@@ -279,8 +272,8 @@ int skl_init_dsp(struct skl *skl)
int
ret
;
int
ret
;
/* enable ppcap interrupt */
/* enable ppcap interrupt */
snd_hdac_ext_bus_ppcap_enable
(
&
skl
->
e
bus
,
true
);
snd_hdac_ext_bus_ppcap_enable
(
bus
,
true
);
snd_hdac_ext_bus_ppcap_int_enable
(
&
skl
->
e
bus
,
true
);
snd_hdac_ext_bus_ppcap_int_enable
(
bus
,
true
);
/* read the BAR of the ADSP MMIO */
/* read the BAR of the ADSP MMIO */
mmio_base
=
pci_ioremap_bar
(
skl
->
pci
,
4
);
mmio_base
=
pci_ioremap_bar
(
skl
->
pci
,
4
);
...
@@ -335,12 +328,11 @@ int skl_init_dsp(struct skl *skl)
...
@@ -335,12 +328,11 @@ int skl_init_dsp(struct skl *skl)
int
skl_free_dsp
(
struct
skl
*
skl
)
int
skl_free_dsp
(
struct
skl
*
skl
)
{
{
struct
hdac_ext_bus
*
ebus
=
&
skl
->
ebus
;
struct
hdac_bus
*
bus
=
skl_to_bus
(
skl
);
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
struct
skl_sst
*
ctx
=
skl
->
skl_sst
;
struct
skl_sst
*
ctx
=
skl
->
skl_sst
;
/* disable ppcap interrupt */
/* disable ppcap interrupt */
snd_hdac_ext_bus_ppcap_int_enable
(
&
skl
->
e
bus
,
false
);
snd_hdac_ext_bus_ppcap_int_enable
(
bus
,
false
);
ctx
->
dsp_ops
->
cleanup
(
bus
->
dev
,
ctx
);
ctx
->
dsp_ops
->
cleanup
(
bus
->
dev
,
ctx
);
...
@@ -383,10 +375,11 @@ int skl_suspend_late_dsp(struct skl *skl)
...
@@ -383,10 +375,11 @@ int skl_suspend_late_dsp(struct skl *skl)
int
skl_suspend_dsp
(
struct
skl
*
skl
)
int
skl_suspend_dsp
(
struct
skl
*
skl
)
{
{
struct
skl_sst
*
ctx
=
skl
->
skl_sst
;
struct
skl_sst
*
ctx
=
skl
->
skl_sst
;
struct
hdac_bus
*
bus
=
skl_to_bus
(
skl
);
int
ret
;
int
ret
;
/* if ppcap is not supported return 0 */
/* if ppcap is not supported return 0 */
if
(
!
skl
->
ebus
.
bus
.
ppcap
)
if
(
!
bus
->
ppcap
)
return
0
;
return
0
;
ret
=
skl_dsp_sleep
(
ctx
->
dsp
);
ret
=
skl_dsp_sleep
(
ctx
->
dsp
);
...
@@ -394,8 +387,8 @@ int skl_suspend_dsp(struct skl *skl)
...
@@ -394,8 +387,8 @@ int skl_suspend_dsp(struct skl *skl)
return
ret
;
return
ret
;
/* disable ppcap interrupt */
/* disable ppcap interrupt */
snd_hdac_ext_bus_ppcap_int_enable
(
&
skl
->
e
bus
,
false
);
snd_hdac_ext_bus_ppcap_int_enable
(
bus
,
false
);
snd_hdac_ext_bus_ppcap_enable
(
&
skl
->
e
bus
,
false
);
snd_hdac_ext_bus_ppcap_enable
(
bus
,
false
);
return
0
;
return
0
;
}
}
...
@@ -403,15 +396,16 @@ int skl_suspend_dsp(struct skl *skl)
...
@@ -403,15 +396,16 @@ int skl_suspend_dsp(struct skl *skl)
int
skl_resume_dsp
(
struct
skl
*
skl
)
int
skl_resume_dsp
(
struct
skl
*
skl
)
{
{
struct
skl_sst
*
ctx
=
skl
->
skl_sst
;
struct
skl_sst
*
ctx
=
skl
->
skl_sst
;
struct
hdac_bus
*
bus
=
skl_to_bus
(
skl
);
int
ret
;
int
ret
;
/* if ppcap is not supported return 0 */
/* if ppcap is not supported return 0 */
if
(
!
skl
->
ebus
.
bus
.
ppcap
)
if
(
!
bus
->
ppcap
)
return
0
;
return
0
;
/* enable ppcap interrupt */
/* enable ppcap interrupt */
snd_hdac_ext_bus_ppcap_enable
(
&
skl
->
e
bus
,
true
);
snd_hdac_ext_bus_ppcap_enable
(
bus
,
true
);
snd_hdac_ext_bus_ppcap_int_enable
(
&
skl
->
e
bus
,
true
);
snd_hdac_ext_bus_ppcap_int_enable
(
bus
,
true
);
/* check if DSP 1st boot is done */
/* check if DSP 1st boot is done */
if
(
skl
->
skl_sst
->
is_first_boot
==
true
)
if
(
skl
->
skl_sst
->
is_first_boot
==
true
)
...
...
sound/soc/intel/skylake/skl-nhlt.c
浏览文件 @
9a9b13dd
...
@@ -141,7 +141,7 @@ struct nhlt_specific_cfg
...
@@ -141,7 +141,7 @@ struct nhlt_specific_cfg
{
{
struct
nhlt_fmt
*
fmt
;
struct
nhlt_fmt
*
fmt
;
struct
nhlt_endpoint
*
epnt
;
struct
nhlt_endpoint
*
epnt
;
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
&
skl
->
ebus
);
struct
hdac_bus
*
bus
=
skl_to_bus
(
skl
);
struct
device
*
dev
=
bus
->
dev
;
struct
device
*
dev
=
bus
->
dev
;
struct
nhlt_specific_cfg
*
sp_config
;
struct
nhlt_specific_cfg
*
sp_config
;
struct
nhlt_acpi_table
*
nhlt
=
skl
->
nhlt
;
struct
nhlt_acpi_table
*
nhlt
=
skl
->
nhlt
;
...
@@ -228,7 +228,7 @@ static void skl_nhlt_trim_space(char *trim)
...
@@ -228,7 +228,7 @@ static void skl_nhlt_trim_space(char *trim)
int
skl_nhlt_update_topology_bin
(
struct
skl
*
skl
)
int
skl_nhlt_update_topology_bin
(
struct
skl
*
skl
)
{
{
struct
nhlt_acpi_table
*
nhlt
=
(
struct
nhlt_acpi_table
*
)
skl
->
nhlt
;
struct
nhlt_acpi_table
*
nhlt
=
(
struct
nhlt_acpi_table
*
)
skl
->
nhlt
;
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
&
skl
->
ebus
);
struct
hdac_bus
*
bus
=
skl_to_bus
(
skl
);
struct
device
*
dev
=
bus
->
dev
;
struct
device
*
dev
=
bus
->
dev
;
dev_dbg
(
dev
,
"oem_id %.6s, oem_table_id %8s oem_revision %d
\n
"
,
dev_dbg
(
dev
,
"oem_id %.6s, oem_table_id %8s oem_revision %d
\n
"
,
...
@@ -248,8 +248,8 @@ static ssize_t skl_nhlt_platform_id_show(struct device *dev,
...
@@ -248,8 +248,8 @@ static ssize_t skl_nhlt_platform_id_show(struct device *dev,
struct
device_attribute
*
attr
,
char
*
buf
)
struct
device_attribute
*
attr
,
char
*
buf
)
{
{
struct
pci_dev
*
pci
=
to_pci_dev
(
dev
);
struct
pci_dev
*
pci
=
to_pci_dev
(
dev
);
struct
hdac_
ext_bus
*
e
bus
=
pci_get_drvdata
(
pci
);
struct
hdac_
bus
*
bus
=
pci_get_drvdata
(
pci
);
struct
skl
*
skl
=
ebus_to_skl
(
e
bus
);
struct
skl
*
skl
=
bus_to_skl
(
bus
);
struct
nhlt_acpi_table
*
nhlt
=
(
struct
nhlt_acpi_table
*
)
skl
->
nhlt
;
struct
nhlt_acpi_table
*
nhlt
=
(
struct
nhlt_acpi_table
*
)
skl
->
nhlt
;
char
platform_id
[
32
];
char
platform_id
[
32
];
...
...
sound/soc/intel/skylake/skl-pcm.c
浏览文件 @
9a9b13dd
...
@@ -67,16 +67,15 @@ struct hdac_ext_stream *get_hdac_ext_stream(struct snd_pcm_substream *substream)
...
@@ -67,16 +67,15 @@ struct hdac_ext_stream *get_hdac_ext_stream(struct snd_pcm_substream *substream)
return
substream
->
runtime
->
private_data
;
return
substream
->
runtime
->
private_data
;
}
}
static
struct
hdac_
ext_
bus
*
get_bus_ctx
(
struct
snd_pcm_substream
*
substream
)
static
struct
hdac_bus
*
get_bus_ctx
(
struct
snd_pcm_substream
*
substream
)
{
{
struct
hdac_ext_stream
*
stream
=
get_hdac_ext_stream
(
substream
);
struct
hdac_ext_stream
*
stream
=
get_hdac_ext_stream
(
substream
);
struct
hdac_stream
*
hstream
=
hdac_stream
(
stream
);
struct
hdac_stream
*
hstream
=
hdac_stream
(
stream
);
struct
hdac_bus
*
bus
=
hstream
->
bus
;
struct
hdac_bus
*
bus
=
hstream
->
bus
;
return
bus
;
return
hbus_to_ebus
(
bus
);
}
}
static
int
skl_substream_alloc_pages
(
struct
hdac_
ext_bus
*
e
bus
,
static
int
skl_substream_alloc_pages
(
struct
hdac_
bus
*
bus
,
struct
snd_pcm_substream
*
substream
,
struct
snd_pcm_substream
*
substream
,
size_t
size
)
size_t
size
)
{
{
...
@@ -95,7 +94,7 @@ static int skl_substream_free_pages(struct hdac_bus *bus,
...
@@ -95,7 +94,7 @@ static int skl_substream_free_pages(struct hdac_bus *bus,
return
snd_pcm_lib_free_pages
(
substream
);
return
snd_pcm_lib_free_pages
(
substream
);
}
}
static
void
skl_set_pcm_constrains
(
struct
hdac_
ext_bus
*
e
bus
,
static
void
skl_set_pcm_constrains
(
struct
hdac_
bus
*
bus
,
struct
snd_pcm_runtime
*
runtime
)
struct
snd_pcm_runtime
*
runtime
)
{
{
snd_pcm_hw_constraint_integer
(
runtime
,
SNDRV_PCM_HW_PARAM_PERIODS
);
snd_pcm_hw_constraint_integer
(
runtime
,
SNDRV_PCM_HW_PARAM_PERIODS
);
...
@@ -105,9 +104,9 @@ static void skl_set_pcm_constrains(struct hdac_ext_bus *ebus,
...
@@ -105,9 +104,9 @@ static void skl_set_pcm_constrains(struct hdac_ext_bus *ebus,
20
,
178000000
);
20
,
178000000
);
}
}
static
enum
hdac_ext_stream_type
skl_get_host_stream_type
(
struct
hdac_
ext_bus
*
e
bus
)
static
enum
hdac_ext_stream_type
skl_get_host_stream_type
(
struct
hdac_
bus
*
bus
)
{
{
if
(
(
ebus_to_hbus
(
ebus
))
->
ppcap
)
if
(
bus
->
ppcap
)
return
HDAC_EXT_STREAM_TYPE_HOST
;
return
HDAC_EXT_STREAM_TYPE_HOST
;
else
else
return
HDAC_EXT_STREAM_TYPE_COUPLED
;
return
HDAC_EXT_STREAM_TYPE_COUPLED
;
...
@@ -123,9 +122,9 @@ static enum hdac_ext_stream_type skl_get_host_stream_type(struct hdac_ext_bus *e
...
@@ -123,9 +122,9 @@ static enum hdac_ext_stream_type skl_get_host_stream_type(struct hdac_ext_bus *e
static
void
skl_set_suspend_active
(
struct
snd_pcm_substream
*
substream
,
static
void
skl_set_suspend_active
(
struct
snd_pcm_substream
*
substream
,
struct
snd_soc_dai
*
dai
,
bool
enable
)
struct
snd_soc_dai
*
dai
,
bool
enable
)
{
{
struct
hdac_
ext_bus
*
e
bus
=
dev_get_drvdata
(
dai
->
dev
);
struct
hdac_
bus
*
bus
=
dev_get_drvdata
(
dai
->
dev
);
struct
snd_soc_dapm_widget
*
w
;
struct
snd_soc_dapm_widget
*
w
;
struct
skl
*
skl
=
ebus_to_skl
(
e
bus
);
struct
skl
*
skl
=
bus_to_skl
(
bus
);
if
(
substream
->
stream
==
SNDRV_PCM_STREAM_PLAYBACK
)
if
(
substream
->
stream
==
SNDRV_PCM_STREAM_PLAYBACK
)
w
=
dai
->
playback_widget
;
w
=
dai
->
playback_widget
;
...
@@ -140,8 +139,7 @@ static void skl_set_suspend_active(struct snd_pcm_substream *substream,
...
@@ -140,8 +139,7 @@ static void skl_set_suspend_active(struct snd_pcm_substream *substream,
int
skl_pcm_host_dma_prepare
(
struct
device
*
dev
,
struct
skl_pipe_params
*
params
)
int
skl_pcm_host_dma_prepare
(
struct
device
*
dev
,
struct
skl_pipe_params
*
params
)
{
{
struct
hdac_ext_bus
*
ebus
=
dev_get_drvdata
(
dev
);
struct
hdac_bus
*
bus
=
dev_get_drvdata
(
dev
);
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
unsigned
int
format_val
;
unsigned
int
format_val
;
struct
hdac_stream
*
hstream
;
struct
hdac_stream
*
hstream
;
struct
hdac_ext_stream
*
stream
;
struct
hdac_ext_stream
*
stream
;
...
@@ -153,7 +151,7 @@ int skl_pcm_host_dma_prepare(struct device *dev, struct skl_pipe_params *params)
...
@@ -153,7 +151,7 @@ int skl_pcm_host_dma_prepare(struct device *dev, struct skl_pipe_params *params)
return
-
EINVAL
;
return
-
EINVAL
;
stream
=
stream_to_hdac_ext_stream
(
hstream
);
stream
=
stream_to_hdac_ext_stream
(
hstream
);
snd_hdac_ext_stream_decouple
(
e
bus
,
stream
,
true
);
snd_hdac_ext_stream_decouple
(
bus
,
stream
,
true
);
format_val
=
snd_hdac_calc_stream_format
(
params
->
s_freq
,
format_val
=
snd_hdac_calc_stream_format
(
params
->
s_freq
,
params
->
ch
,
params
->
format
,
params
->
host_bps
,
0
);
params
->
ch
,
params
->
format
,
params
->
host_bps
,
0
);
...
@@ -177,8 +175,7 @@ int skl_pcm_host_dma_prepare(struct device *dev, struct skl_pipe_params *params)
...
@@ -177,8 +175,7 @@ int skl_pcm_host_dma_prepare(struct device *dev, struct skl_pipe_params *params)
int
skl_pcm_link_dma_prepare
(
struct
device
*
dev
,
struct
skl_pipe_params
*
params
)
int
skl_pcm_link_dma_prepare
(
struct
device
*
dev
,
struct
skl_pipe_params
*
params
)
{
{
struct
hdac_ext_bus
*
ebus
=
dev_get_drvdata
(
dev
);
struct
hdac_bus
*
bus
=
dev_get_drvdata
(
dev
);
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
unsigned
int
format_val
;
unsigned
int
format_val
;
struct
hdac_stream
*
hstream
;
struct
hdac_stream
*
hstream
;
struct
hdac_ext_stream
*
stream
;
struct
hdac_ext_stream
*
stream
;
...
@@ -190,7 +187,7 @@ int skl_pcm_link_dma_prepare(struct device *dev, struct skl_pipe_params *params)
...
@@ -190,7 +187,7 @@ int skl_pcm_link_dma_prepare(struct device *dev, struct skl_pipe_params *params)
return
-
EINVAL
;
return
-
EINVAL
;
stream
=
stream_to_hdac_ext_stream
(
hstream
);
stream
=
stream_to_hdac_ext_stream
(
hstream
);
snd_hdac_ext_stream_decouple
(
e
bus
,
stream
,
true
);
snd_hdac_ext_stream_decouple
(
bus
,
stream
,
true
);
format_val
=
snd_hdac_calc_stream_format
(
params
->
s_freq
,
params
->
ch
,
format_val
=
snd_hdac_calc_stream_format
(
params
->
s_freq
,
params
->
ch
,
params
->
format
,
params
->
link_bps
,
0
);
params
->
format
,
params
->
link_bps
,
0
);
...
@@ -201,7 +198,7 @@ int skl_pcm_link_dma_prepare(struct device *dev, struct skl_pipe_params *params)
...
@@ -201,7 +198,7 @@ int skl_pcm_link_dma_prepare(struct device *dev, struct skl_pipe_params *params)
snd_hdac_ext_link_stream_setup
(
stream
,
format_val
);
snd_hdac_ext_link_stream_setup
(
stream
,
format_val
);
list_for_each_entry
(
link
,
&
e
bus
->
hlink_list
,
list
)
{
list_for_each_entry
(
link
,
&
bus
->
hlink_list
,
list
)
{
if
(
link
->
index
==
params
->
link_index
)
if
(
link
->
index
==
params
->
link_index
)
snd_hdac_ext_link_set_stream_id
(
link
,
snd_hdac_ext_link_set_stream_id
(
link
,
hstream
->
stream_tag
);
hstream
->
stream_tag
);
...
@@ -215,7 +212,7 @@ int skl_pcm_link_dma_prepare(struct device *dev, struct skl_pipe_params *params)
...
@@ -215,7 +212,7 @@ int skl_pcm_link_dma_prepare(struct device *dev, struct skl_pipe_params *params)
static
int
skl_pcm_open
(
struct
snd_pcm_substream
*
substream
,
static
int
skl_pcm_open
(
struct
snd_pcm_substream
*
substream
,
struct
snd_soc_dai
*
dai
)
struct
snd_soc_dai
*
dai
)
{
{
struct
hdac_
ext_bus
*
e
bus
=
dev_get_drvdata
(
dai
->
dev
);
struct
hdac_
bus
*
bus
=
dev_get_drvdata
(
dai
->
dev
);
struct
hdac_ext_stream
*
stream
;
struct
hdac_ext_stream
*
stream
;
struct
snd_pcm_runtime
*
runtime
=
substream
->
runtime
;
struct
snd_pcm_runtime
*
runtime
=
substream
->
runtime
;
struct
skl_dma_params
*
dma_params
;
struct
skl_dma_params
*
dma_params
;
...
@@ -224,12 +221,12 @@ static int skl_pcm_open(struct snd_pcm_substream *substream,
...
@@ -224,12 +221,12 @@ static int skl_pcm_open(struct snd_pcm_substream *substream,
dev_dbg
(
dai
->
dev
,
"%s: %s
\n
"
,
__func__
,
dai
->
name
);
dev_dbg
(
dai
->
dev
,
"%s: %s
\n
"
,
__func__
,
dai
->
name
);
stream
=
snd_hdac_ext_stream_assign
(
e
bus
,
substream
,
stream
=
snd_hdac_ext_stream_assign
(
bus
,
substream
,
skl_get_host_stream_type
(
e
bus
));
skl_get_host_stream_type
(
bus
));
if
(
stream
==
NULL
)
if
(
stream
==
NULL
)
return
-
EBUSY
;
return
-
EBUSY
;
skl_set_pcm_constrains
(
e
bus
,
runtime
);
skl_set_pcm_constrains
(
bus
,
runtime
);
/*
/*
* disable WALLCLOCK timestamps for capture streams
* disable WALLCLOCK timestamps for capture streams
...
@@ -301,7 +298,7 @@ static int skl_pcm_hw_params(struct snd_pcm_substream *substream,
...
@@ -301,7 +298,7 @@ static int skl_pcm_hw_params(struct snd_pcm_substream *substream,
struct
snd_pcm_hw_params
*
params
,
struct
snd_pcm_hw_params
*
params
,
struct
snd_soc_dai
*
dai
)
struct
snd_soc_dai
*
dai
)
{
{
struct
hdac_
ext_bus
*
e
bus
=
dev_get_drvdata
(
dai
->
dev
);
struct
hdac_
bus
*
bus
=
dev_get_drvdata
(
dai
->
dev
);
struct
hdac_ext_stream
*
stream
=
get_hdac_ext_stream
(
substream
);
struct
hdac_ext_stream
*
stream
=
get_hdac_ext_stream
(
substream
);
struct
snd_pcm_runtime
*
runtime
=
substream
->
runtime
;
struct
snd_pcm_runtime
*
runtime
=
substream
->
runtime
;
struct
skl_pipe_params
p_params
=
{
0
};
struct
skl_pipe_params
p_params
=
{
0
};
...
@@ -309,7 +306,7 @@ static int skl_pcm_hw_params(struct snd_pcm_substream *substream,
...
@@ -309,7 +306,7 @@ static int skl_pcm_hw_params(struct snd_pcm_substream *substream,
int
ret
,
dma_id
;
int
ret
,
dma_id
;
dev_dbg
(
dai
->
dev
,
"%s: %s
\n
"
,
__func__
,
dai
->
name
);
dev_dbg
(
dai
->
dev
,
"%s: %s
\n
"
,
__func__
,
dai
->
name
);
ret
=
skl_substream_alloc_pages
(
e
bus
,
substream
,
ret
=
skl_substream_alloc_pages
(
bus
,
substream
,
params_buffer_bytes
(
params
));
params_buffer_bytes
(
params
));
if
(
ret
<
0
)
if
(
ret
<
0
)
return
ret
;
return
ret
;
...
@@ -343,14 +340,14 @@ static void skl_pcm_close(struct snd_pcm_substream *substream,
...
@@ -343,14 +340,14 @@ static void skl_pcm_close(struct snd_pcm_substream *substream,
struct
snd_soc_dai
*
dai
)
struct
snd_soc_dai
*
dai
)
{
{
struct
hdac_ext_stream
*
stream
=
get_hdac_ext_stream
(
substream
);
struct
hdac_ext_stream
*
stream
=
get_hdac_ext_stream
(
substream
);
struct
hdac_
ext_bus
*
e
bus
=
dev_get_drvdata
(
dai
->
dev
);
struct
hdac_
bus
*
bus
=
dev_get_drvdata
(
dai
->
dev
);
struct
skl_dma_params
*
dma_params
=
NULL
;
struct
skl_dma_params
*
dma_params
=
NULL
;
struct
skl
*
skl
=
ebus_to_skl
(
e
bus
);
struct
skl
*
skl
=
bus_to_skl
(
bus
);
struct
skl_module_cfg
*
mconfig
;
struct
skl_module_cfg
*
mconfig
;
dev_dbg
(
dai
->
dev
,
"%s: %s
\n
"
,
__func__
,
dai
->
name
);
dev_dbg
(
dai
->
dev
,
"%s: %s
\n
"
,
__func__
,
dai
->
name
);
snd_hdac_ext_stream_release
(
stream
,
skl_get_host_stream_type
(
e
bus
));
snd_hdac_ext_stream_release
(
stream
,
skl_get_host_stream_type
(
bus
));
dma_params
=
snd_soc_dai_get_dma_data
(
dai
,
substream
);
dma_params
=
snd_soc_dai_get_dma_data
(
dai
,
substream
);
/*
/*
...
@@ -380,7 +377,7 @@ static void skl_pcm_close(struct snd_pcm_substream *substream,
...
@@ -380,7 +377,7 @@ static void skl_pcm_close(struct snd_pcm_substream *substream,
static
int
skl_pcm_hw_free
(
struct
snd_pcm_substream
*
substream
,
static
int
skl_pcm_hw_free
(
struct
snd_pcm_substream
*
substream
,
struct
snd_soc_dai
*
dai
)
struct
snd_soc_dai
*
dai
)
{
{
struct
hdac_
ext_bus
*
e
bus
=
dev_get_drvdata
(
dai
->
dev
);
struct
hdac_
bus
*
bus
=
dev_get_drvdata
(
dai
->
dev
);
struct
hdac_ext_stream
*
stream
=
get_hdac_ext_stream
(
substream
);
struct
hdac_ext_stream
*
stream
=
get_hdac_ext_stream
(
substream
);
struct
skl
*
skl
=
get_skl_ctx
(
dai
->
dev
);
struct
skl
*
skl
=
get_skl_ctx
(
dai
->
dev
);
struct
skl_module_cfg
*
mconfig
;
struct
skl_module_cfg
*
mconfig
;
...
@@ -400,7 +397,7 @@ static int skl_pcm_hw_free(struct snd_pcm_substream *substream,
...
@@ -400,7 +397,7 @@ static int skl_pcm_hw_free(struct snd_pcm_substream *substream,
snd_hdac_stream_cleanup
(
hdac_stream
(
stream
));
snd_hdac_stream_cleanup
(
hdac_stream
(
stream
));
hdac_stream
(
stream
)
->
prepared
=
0
;
hdac_stream
(
stream
)
->
prepared
=
0
;
return
skl_substream_free_pages
(
ebus_to_hbus
(
ebus
)
,
substream
);
return
skl_substream_free_pages
(
bus
,
substream
);
}
}
static
int
skl_be_hw_params
(
struct
snd_pcm_substream
*
substream
,
static
int
skl_be_hw_params
(
struct
snd_pcm_substream
*
substream
,
...
@@ -420,8 +417,7 @@ static int skl_be_hw_params(struct snd_pcm_substream *substream,
...
@@ -420,8 +417,7 @@ static int skl_be_hw_params(struct snd_pcm_substream *substream,
static
int
skl_decoupled_trigger
(
struct
snd_pcm_substream
*
substream
,
static
int
skl_decoupled_trigger
(
struct
snd_pcm_substream
*
substream
,
int
cmd
)
int
cmd
)
{
{
struct
hdac_ext_bus
*
ebus
=
get_bus_ctx
(
substream
);
struct
hdac_bus
*
bus
=
get_bus_ctx
(
substream
);
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
struct
hdac_ext_stream
*
stream
;
struct
hdac_ext_stream
*
stream
;
int
start
;
int
start
;
unsigned
long
cookie
;
unsigned
long
cookie
;
...
@@ -470,7 +466,7 @@ static int skl_pcm_trigger(struct snd_pcm_substream *substream, int cmd,
...
@@ -470,7 +466,7 @@ static int skl_pcm_trigger(struct snd_pcm_substream *substream, int cmd,
struct
skl
*
skl
=
get_skl_ctx
(
dai
->
dev
);
struct
skl
*
skl
=
get_skl_ctx
(
dai
->
dev
);
struct
skl_sst
*
ctx
=
skl
->
skl_sst
;
struct
skl_sst
*
ctx
=
skl
->
skl_sst
;
struct
skl_module_cfg
*
mconfig
;
struct
skl_module_cfg
*
mconfig
;
struct
hdac_
ext_bus
*
e
bus
=
get_bus_ctx
(
substream
);
struct
hdac_
bus
*
bus
=
get_bus_ctx
(
substream
);
struct
hdac_ext_stream
*
stream
=
get_hdac_ext_stream
(
substream
);
struct
hdac_ext_stream
*
stream
=
get_hdac_ext_stream
(
substream
);
struct
snd_soc_dapm_widget
*
w
;
struct
snd_soc_dapm_widget
*
w
;
int
ret
;
int
ret
;
...
@@ -492,9 +488,9 @@ static int skl_pcm_trigger(struct snd_pcm_substream *substream, int cmd,
...
@@ -492,9 +488,9 @@ static int skl_pcm_trigger(struct snd_pcm_substream *substream, int cmd,
* dpib & lpib position to resume before starting the
* dpib & lpib position to resume before starting the
* DMA
* DMA
*/
*/
snd_hdac_ext_stream_drsm_enable
(
e
bus
,
true
,
snd_hdac_ext_stream_drsm_enable
(
bus
,
true
,
hdac_stream
(
stream
)
->
index
);
hdac_stream
(
stream
)
->
index
);
snd_hdac_ext_stream_set_dpibr
(
e
bus
,
stream
,
snd_hdac_ext_stream_set_dpibr
(
bus
,
stream
,
stream
->
lpib
);
stream
->
lpib
);
snd_hdac_ext_stream_set_lpib
(
stream
,
stream
->
lpib
);
snd_hdac_ext_stream_set_lpib
(
stream
,
stream
->
lpib
);
}
}
...
@@ -528,14 +524,14 @@ static int skl_pcm_trigger(struct snd_pcm_substream *substream, int cmd,
...
@@ -528,14 +524,14 @@ static int skl_pcm_trigger(struct snd_pcm_substream *substream, int cmd,
ret
=
skl_decoupled_trigger
(
substream
,
cmd
);
ret
=
skl_decoupled_trigger
(
substream
,
cmd
);
if
((
cmd
==
SNDRV_PCM_TRIGGER_SUSPEND
)
&&
!
w
->
ignore_suspend
)
{
if
((
cmd
==
SNDRV_PCM_TRIGGER_SUSPEND
)
&&
!
w
->
ignore_suspend
)
{
/* save the dpib and lpib positions */
/* save the dpib and lpib positions */
stream
->
dpib
=
readl
(
ebus
->
bus
.
remap_addr
+
stream
->
dpib
=
readl
(
bus
->
remap_addr
+
AZX_REG_VS_SDXDPIB_XBASE
+
AZX_REG_VS_SDXDPIB_XBASE
+
(
AZX_REG_VS_SDXDPIB_XINTERVAL
*
(
AZX_REG_VS_SDXDPIB_XINTERVAL
*
hdac_stream
(
stream
)
->
index
));
hdac_stream
(
stream
)
->
index
));
stream
->
lpib
=
snd_hdac_stream_get_pos_lpib
(
stream
->
lpib
=
snd_hdac_stream_get_pos_lpib
(
hdac_stream
(
stream
));
hdac_stream
(
stream
));
snd_hdac_ext_stream_decouple
(
e
bus
,
stream
,
false
);
snd_hdac_ext_stream_decouple
(
bus
,
stream
,
false
);
}
}
break
;
break
;
...
@@ -546,11 +542,12 @@ static int skl_pcm_trigger(struct snd_pcm_substream *substream, int cmd,
...
@@ -546,11 +542,12 @@ static int skl_pcm_trigger(struct snd_pcm_substream *substream, int cmd,
return
0
;
return
0
;
}
}
static
int
skl_link_hw_params
(
struct
snd_pcm_substream
*
substream
,
static
int
skl_link_hw_params
(
struct
snd_pcm_substream
*
substream
,
struct
snd_pcm_hw_params
*
params
,
struct
snd_pcm_hw_params
*
params
,
struct
snd_soc_dai
*
dai
)
struct
snd_soc_dai
*
dai
)
{
{
struct
hdac_
ext_bus
*
e
bus
=
dev_get_drvdata
(
dai
->
dev
);
struct
hdac_
bus
*
bus
=
dev_get_drvdata
(
dai
->
dev
);
struct
hdac_ext_stream
*
link_dev
;
struct
hdac_ext_stream
*
link_dev
;
struct
snd_soc_pcm_runtime
*
rtd
=
snd_pcm_substream_chip
(
substream
);
struct
snd_soc_pcm_runtime
*
rtd
=
snd_pcm_substream_chip
(
substream
);
struct
snd_soc_dai
*
codec_dai
=
rtd
->
codec_dai
;
struct
snd_soc_dai
*
codec_dai
=
rtd
->
codec_dai
;
...
@@ -558,14 +555,14 @@ static int skl_link_hw_params(struct snd_pcm_substream *substream,
...
@@ -558,14 +555,14 @@ static int skl_link_hw_params(struct snd_pcm_substream *substream,
struct
hdac_ext_link
*
link
;
struct
hdac_ext_link
*
link
;
int
stream_tag
;
int
stream_tag
;
link_dev
=
snd_hdac_ext_stream_assign
(
e
bus
,
substream
,
link_dev
=
snd_hdac_ext_stream_assign
(
bus
,
substream
,
HDAC_EXT_STREAM_TYPE_LINK
);
HDAC_EXT_STREAM_TYPE_LINK
);
if
(
!
link_dev
)
if
(
!
link_dev
)
return
-
EBUSY
;
return
-
EBUSY
;
snd_soc_dai_set_dma_data
(
dai
,
substream
,
(
void
*
)
link_dev
);
snd_soc_dai_set_dma_data
(
dai
,
substream
,
(
void
*
)
link_dev
);
link
=
snd_hdac_ext_bus_get_link
(
e
bus
,
codec_dai
->
component
->
name
);
link
=
snd_hdac_ext_bus_get_link
(
bus
,
codec_dai
->
component
->
name
);
if
(
!
link
)
if
(
!
link
)
return
-
EINVAL
;
return
-
EINVAL
;
...
@@ -610,7 +607,7 @@ static int skl_link_pcm_trigger(struct snd_pcm_substream *substream,
...
@@ -610,7 +607,7 @@ static int skl_link_pcm_trigger(struct snd_pcm_substream *substream,
{
{
struct
hdac_ext_stream
*
link_dev
=
struct
hdac_ext_stream
*
link_dev
=
snd_soc_dai_get_dma_data
(
dai
,
substream
);
snd_soc_dai_get_dma_data
(
dai
,
substream
);
struct
hdac_
ext_bus
*
e
bus
=
get_bus_ctx
(
substream
);
struct
hdac_
bus
*
bus
=
get_bus_ctx
(
substream
);
struct
hdac_ext_stream
*
stream
=
get_hdac_ext_stream
(
substream
);
struct
hdac_ext_stream
*
stream
=
get_hdac_ext_stream
(
substream
);
dev_dbg
(
dai
->
dev
,
"In %s cmd=%d
\n
"
,
__func__
,
cmd
);
dev_dbg
(
dai
->
dev
,
"In %s cmd=%d
\n
"
,
__func__
,
cmd
);
...
@@ -626,7 +623,7 @@ static int skl_link_pcm_trigger(struct snd_pcm_substream *substream,
...
@@ -626,7 +623,7 @@ static int skl_link_pcm_trigger(struct snd_pcm_substream *substream,
case
SNDRV_PCM_TRIGGER_STOP
:
case
SNDRV_PCM_TRIGGER_STOP
:
snd_hdac_ext_link_stream_clear
(
link_dev
);
snd_hdac_ext_link_stream_clear
(
link_dev
);
if
(
cmd
==
SNDRV_PCM_TRIGGER_SUSPEND
)
if
(
cmd
==
SNDRV_PCM_TRIGGER_SUSPEND
)
snd_hdac_ext_stream_decouple
(
e
bus
,
stream
,
false
);
snd_hdac_ext_stream_decouple
(
bus
,
stream
,
false
);
break
;
break
;
default:
default:
...
@@ -638,7 +635,7 @@ static int skl_link_pcm_trigger(struct snd_pcm_substream *substream,
...
@@ -638,7 +635,7 @@ static int skl_link_pcm_trigger(struct snd_pcm_substream *substream,
static
int
skl_link_hw_free
(
struct
snd_pcm_substream
*
substream
,
static
int
skl_link_hw_free
(
struct
snd_pcm_substream
*
substream
,
struct
snd_soc_dai
*
dai
)
struct
snd_soc_dai
*
dai
)
{
{
struct
hdac_
ext_bus
*
e
bus
=
dev_get_drvdata
(
dai
->
dev
);
struct
hdac_
bus
*
bus
=
dev_get_drvdata
(
dai
->
dev
);
struct
snd_soc_pcm_runtime
*
rtd
=
snd_pcm_substream_chip
(
substream
);
struct
snd_soc_pcm_runtime
*
rtd
=
snd_pcm_substream_chip
(
substream
);
struct
hdac_ext_stream
*
link_dev
=
struct
hdac_ext_stream
*
link_dev
=
snd_soc_dai_get_dma_data
(
dai
,
substream
);
snd_soc_dai_get_dma_data
(
dai
,
substream
);
...
@@ -648,7 +645,7 @@ static int skl_link_hw_free(struct snd_pcm_substream *substream,
...
@@ -648,7 +645,7 @@ static int skl_link_hw_free(struct snd_pcm_substream *substream,
link_dev
->
link_prepared
=
0
;
link_dev
->
link_prepared
=
0
;
link
=
snd_hdac_ext_bus_get_link
(
e
bus
,
rtd
->
codec_dai
->
component
->
name
);
link
=
snd_hdac_ext_bus_get_link
(
bus
,
rtd
->
codec_dai
->
component
->
name
);
if
(
!
link
)
if
(
!
link
)
return
-
EINVAL
;
return
-
EINVAL
;
...
@@ -1041,8 +1038,7 @@ static int skl_platform_open(struct snd_pcm_substream *substream)
...
@@ -1041,8 +1038,7 @@ static int skl_platform_open(struct snd_pcm_substream *substream)
static
int
skl_coupled_trigger
(
struct
snd_pcm_substream
*
substream
,
static
int
skl_coupled_trigger
(
struct
snd_pcm_substream
*
substream
,
int
cmd
)
int
cmd
)
{
{
struct
hdac_ext_bus
*
ebus
=
get_bus_ctx
(
substream
);
struct
hdac_bus
*
bus
=
get_bus_ctx
(
substream
);
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
struct
hdac_ext_stream
*
stream
;
struct
hdac_ext_stream
*
stream
;
struct
snd_pcm_substream
*
s
;
struct
snd_pcm_substream
*
s
;
bool
start
;
bool
start
;
...
@@ -1115,9 +1111,9 @@ static int skl_coupled_trigger(struct snd_pcm_substream *substream,
...
@@ -1115,9 +1111,9 @@ static int skl_coupled_trigger(struct snd_pcm_substream *substream,
static
int
skl_platform_pcm_trigger
(
struct
snd_pcm_substream
*
substream
,
static
int
skl_platform_pcm_trigger
(
struct
snd_pcm_substream
*
substream
,
int
cmd
)
int
cmd
)
{
{
struct
hdac_
ext_bus
*
e
bus
=
get_bus_ctx
(
substream
);
struct
hdac_
bus
*
bus
=
get_bus_ctx
(
substream
);
if
(
!
(
ebus_to_hbus
(
ebus
))
->
ppcap
)
if
(
!
bus
->
ppcap
)
return
skl_coupled_trigger
(
substream
,
cmd
);
return
skl_coupled_trigger
(
substream
,
cmd
);
return
0
;
return
0
;
...
@@ -1127,7 +1123,7 @@ static snd_pcm_uframes_t skl_platform_pcm_pointer
...
@@ -1127,7 +1123,7 @@ static snd_pcm_uframes_t skl_platform_pcm_pointer
(
struct
snd_pcm_substream
*
substream
)
(
struct
snd_pcm_substream
*
substream
)
{
{
struct
hdac_ext_stream
*
hstream
=
get_hdac_ext_stream
(
substream
);
struct
hdac_ext_stream
*
hstream
=
get_hdac_ext_stream
(
substream
);
struct
hdac_
ext_bus
*
e
bus
=
get_bus_ctx
(
substream
);
struct
hdac_
bus
*
bus
=
get_bus_ctx
(
substream
);
unsigned
int
pos
;
unsigned
int
pos
;
/*
/*
...
@@ -1152,12 +1148,12 @@ static snd_pcm_uframes_t skl_platform_pcm_pointer
...
@@ -1152,12 +1148,12 @@ static snd_pcm_uframes_t skl_platform_pcm_pointer
*/
*/
if
(
substream
->
stream
==
SNDRV_PCM_STREAM_PLAYBACK
)
{
if
(
substream
->
stream
==
SNDRV_PCM_STREAM_PLAYBACK
)
{
pos
=
readl
(
ebus
->
bus
.
remap_addr
+
AZX_REG_VS_SDXDPIB_XBASE
+
pos
=
readl
(
bus
->
remap_addr
+
AZX_REG_VS_SDXDPIB_XBASE
+
(
AZX_REG_VS_SDXDPIB_XINTERVAL
*
(
AZX_REG_VS_SDXDPIB_XINTERVAL
*
hdac_stream
(
hstream
)
->
index
));
hdac_stream
(
hstream
)
->
index
));
}
else
{
}
else
{
udelay
(
20
);
udelay
(
20
);
readl
(
ebus
->
bus
.
remap_addr
+
readl
(
bus
->
remap_addr
+
AZX_REG_VS_SDXDPIB_XBASE
+
AZX_REG_VS_SDXDPIB_XBASE
+
(
AZX_REG_VS_SDXDPIB_XINTERVAL
*
(
AZX_REG_VS_SDXDPIB_XINTERVAL
*
hdac_stream
(
hstream
)
->
index
));
hdac_stream
(
hstream
)
->
index
));
...
@@ -1242,11 +1238,11 @@ static void skl_pcm_free(struct snd_pcm *pcm)
...
@@ -1242,11 +1238,11 @@ static void skl_pcm_free(struct snd_pcm *pcm)
static
int
skl_pcm_new
(
struct
snd_soc_pcm_runtime
*
rtd
)
static
int
skl_pcm_new
(
struct
snd_soc_pcm_runtime
*
rtd
)
{
{
struct
snd_soc_dai
*
dai
=
rtd
->
cpu_dai
;
struct
snd_soc_dai
*
dai
=
rtd
->
cpu_dai
;
struct
hdac_
ext_bus
*
e
bus
=
dev_get_drvdata
(
dai
->
dev
);
struct
hdac_
bus
*
bus
=
dev_get_drvdata
(
dai
->
dev
);
struct
snd_pcm
*
pcm
=
rtd
->
pcm
;
struct
snd_pcm
*
pcm
=
rtd
->
pcm
;
unsigned
int
size
;
unsigned
int
size
;
int
retval
=
0
;
int
retval
=
0
;
struct
skl
*
skl
=
ebus_to_skl
(
e
bus
);
struct
skl
*
skl
=
bus_to_skl
(
bus
);
if
(
dai
->
driver
->
playback
.
channels_min
||
if
(
dai
->
driver
->
playback
.
channels_min
||
dai
->
driver
->
capture
.
channels_min
)
{
dai
->
driver
->
capture
.
channels_min
)
{
...
@@ -1356,19 +1352,19 @@ static int skl_populate_modules(struct skl *skl)
...
@@ -1356,19 +1352,19 @@ static int skl_populate_modules(struct skl *skl)
static
int
skl_platform_soc_probe
(
struct
snd_soc_component
*
component
)
static
int
skl_platform_soc_probe
(
struct
snd_soc_component
*
component
)
{
{
struct
hdac_
ext_bus
*
e
bus
=
dev_get_drvdata
(
component
->
dev
);
struct
hdac_
bus
*
bus
=
dev_get_drvdata
(
component
->
dev
);
struct
skl
*
skl
=
ebus_to_skl
(
e
bus
);
struct
skl
*
skl
=
bus_to_skl
(
bus
);
const
struct
skl_dsp_ops
*
ops
;
const
struct
skl_dsp_ops
*
ops
;
int
ret
;
int
ret
;
pm_runtime_get_sync
(
component
->
dev
);
pm_runtime_get_sync
(
component
->
dev
);
if
(
(
ebus_to_hbus
(
ebus
))
->
ppcap
)
{
if
(
bus
->
ppcap
)
{
skl
->
component
=
component
;
skl
->
component
=
component
;
/* init debugfs */
/* init debugfs */
skl
->
debugfs
=
skl_debugfs_init
(
skl
);
skl
->
debugfs
=
skl_debugfs_init
(
skl
);
ret
=
skl_tplg_init
(
component
,
e
bus
);
ret
=
skl_tplg_init
(
component
,
bus
);
if
(
ret
<
0
)
{
if
(
ret
<
0
)
{
dev_err
(
component
->
dev
,
"Failed to init topology!
\n
"
);
dev_err
(
component
->
dev
,
"Failed to init topology!
\n
"
);
return
ret
;
return
ret
;
...
@@ -1425,10 +1421,10 @@ static const struct snd_soc_component_driver skl_component = {
...
@@ -1425,10 +1421,10 @@ static const struct snd_soc_component_driver skl_component = {
int
skl_platform_register
(
struct
device
*
dev
)
int
skl_platform_register
(
struct
device
*
dev
)
{
{
int
ret
;
int
ret
;
struct
hdac_ext_bus
*
ebus
=
dev_get_drvdata
(
dev
);
struct
skl
*
skl
=
ebus_to_skl
(
ebus
);
struct
snd_soc_dai_driver
*
dais
;
struct
snd_soc_dai_driver
*
dais
;
int
num_dais
=
ARRAY_SIZE
(
skl_platform_dai
);
int
num_dais
=
ARRAY_SIZE
(
skl_platform_dai
);
struct
hdac_bus
*
bus
=
dev_get_drvdata
(
dev
);
struct
skl
*
skl
=
bus_to_skl
(
bus
);
INIT_LIST_HEAD
(
&
skl
->
ppl_list
);
INIT_LIST_HEAD
(
&
skl
->
ppl_list
);
INIT_LIST_HEAD
(
&
skl
->
bind_list
);
INIT_LIST_HEAD
(
&
skl
->
bind_list
);
...
@@ -1464,8 +1460,8 @@ int skl_platform_register(struct device *dev)
...
@@ -1464,8 +1460,8 @@ int skl_platform_register(struct device *dev)
int
skl_platform_unregister
(
struct
device
*
dev
)
int
skl_platform_unregister
(
struct
device
*
dev
)
{
{
struct
hdac_
ext_bus
*
e
bus
=
dev_get_drvdata
(
dev
);
struct
hdac_
bus
*
bus
=
dev_get_drvdata
(
dev
);
struct
skl
*
skl
=
ebus_to_skl
(
e
bus
);
struct
skl
*
skl
=
bus_to_skl
(
bus
);
struct
skl_module_deferred_bind
*
modules
,
*
tmp
;
struct
skl_module_deferred_bind
*
modules
,
*
tmp
;
if
(
!
list_empty
(
&
skl
->
bind_list
))
{
if
(
!
list_empty
(
&
skl
->
bind_list
))
{
...
...
sound/soc/intel/skylake/skl-topology.c
浏览文件 @
9a9b13dd
...
@@ -934,7 +934,7 @@ static int skl_tplg_find_moduleid_from_uuid(struct skl *skl,
...
@@ -934,7 +934,7 @@ static int skl_tplg_find_moduleid_from_uuid(struct skl *skl,
struct
soc_bytes_ext
*
sb
=
(
void
*
)
k
->
private_value
;
struct
soc_bytes_ext
*
sb
=
(
void
*
)
k
->
private_value
;
struct
skl_algo_data
*
bc
=
(
struct
skl_algo_data
*
)
sb
->
dobj
.
private
;
struct
skl_algo_data
*
bc
=
(
struct
skl_algo_data
*
)
sb
->
dobj
.
private
;
struct
skl_kpb_params
*
uuid_params
,
*
params
;
struct
skl_kpb_params
*
uuid_params
,
*
params
;
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
skl_to_ebus
(
skl
)
);
struct
hdac_bus
*
bus
=
skl_to_bus
(
skl
);
int
i
,
size
,
module_id
;
int
i
,
size
,
module_id
;
if
(
bc
->
set_params
==
SKL_PARAM_BIND
&&
bc
->
max
)
{
if
(
bc
->
set_params
==
SKL_PARAM_BIND
&&
bc
->
max
)
{
...
@@ -3029,9 +3029,8 @@ static int skl_tplg_widget_load(struct snd_soc_component *cmpnt,
...
@@ -3029,9 +3029,8 @@ static int skl_tplg_widget_load(struct snd_soc_component *cmpnt,
struct
snd_soc_tplg_dapm_widget
*
tplg_w
)
struct
snd_soc_tplg_dapm_widget
*
tplg_w
)
{
{
int
ret
;
int
ret
;
struct
hdac_ext_bus
*
ebus
=
snd_soc_component_get_drvdata
(
cmpnt
);
struct
hdac_bus
*
bus
=
snd_soc_component_get_drvdata
(
cmpnt
);
struct
skl
*
skl
=
ebus_to_skl
(
ebus
);
struct
skl
*
skl
=
bus_to_skl
(
bus
);
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
struct
skl_module_cfg
*
mconfig
;
struct
skl_module_cfg
*
mconfig
;
if
(
!
tplg_w
->
priv
.
size
)
if
(
!
tplg_w
->
priv
.
size
)
...
@@ -3137,8 +3136,7 @@ static int skl_tplg_control_load(struct snd_soc_component *cmpnt,
...
@@ -3137,8 +3136,7 @@ static int skl_tplg_control_load(struct snd_soc_component *cmpnt,
struct
soc_bytes_ext
*
sb
;
struct
soc_bytes_ext
*
sb
;
struct
snd_soc_tplg_bytes_control
*
tplg_bc
;
struct
snd_soc_tplg_bytes_control
*
tplg_bc
;
struct
snd_soc_tplg_enum_control
*
tplg_ec
;
struct
snd_soc_tplg_enum_control
*
tplg_ec
;
struct
hdac_ext_bus
*
ebus
=
snd_soc_component_get_drvdata
(
cmpnt
);
struct
hdac_bus
*
bus
=
snd_soc_component_get_drvdata
(
cmpnt
);
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
struct
soc_enum
*
se
;
struct
soc_enum
*
se
;
switch
(
hdr
->
ops
.
info
)
{
switch
(
hdr
->
ops
.
info
)
{
...
@@ -3622,9 +3620,8 @@ static int skl_tplg_get_manifest_data(struct snd_soc_tplg_manifest *manifest,
...
@@ -3622,9 +3620,8 @@ static int skl_tplg_get_manifest_data(struct snd_soc_tplg_manifest *manifest,
static
int
skl_manifest_load
(
struct
snd_soc_component
*
cmpnt
,
static
int
skl_manifest_load
(
struct
snd_soc_component
*
cmpnt
,
struct
snd_soc_tplg_manifest
*
manifest
)
struct
snd_soc_tplg_manifest
*
manifest
)
{
{
struct
hdac_ext_bus
*
ebus
=
snd_soc_component_get_drvdata
(
cmpnt
);
struct
hdac_bus
*
bus
=
snd_soc_component_get_drvdata
(
cmpnt
);
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
struct
skl
*
skl
=
bus_to_skl
(
bus
);
struct
skl
*
skl
=
ebus_to_skl
(
ebus
);
/* proceed only if we have private data defined */
/* proceed only if we have private data defined */
if
(
manifest
->
priv
.
size
==
0
)
if
(
manifest
->
priv
.
size
==
0
)
...
@@ -3713,12 +3710,11 @@ static void skl_tplg_set_pipe_type(struct skl *skl, struct skl_pipe *pipe)
...
@@ -3713,12 +3710,11 @@ static void skl_tplg_set_pipe_type(struct skl *skl, struct skl_pipe *pipe)
/*
/*
* SKL topology init routine
* SKL topology init routine
*/
*/
int
skl_tplg_init
(
struct
snd_soc_component
*
component
,
struct
hdac_
ext_bus
*
e
bus
)
int
skl_tplg_init
(
struct
snd_soc_component
*
component
,
struct
hdac_
bus
*
bus
)
{
{
int
ret
;
int
ret
;
const
struct
firmware
*
fw
;
const
struct
firmware
*
fw
;
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
struct
skl
*
skl
=
bus_to_skl
(
bus
);
struct
skl
*
skl
=
ebus_to_skl
(
ebus
);
struct
skl_pipeline
*
ppl
;
struct
skl_pipeline
*
ppl
;
ret
=
request_firmware
(
&
fw
,
skl
->
tplg_name
,
bus
->
dev
);
ret
=
request_firmware
(
&
fw
,
skl
->
tplg_name
,
bus
->
dev
);
...
...
sound/soc/intel/skylake/skl-topology.h
浏览文件 @
9a9b13dd
...
@@ -458,9 +458,9 @@ enum skl_channel {
...
@@ -458,9 +458,9 @@ enum skl_channel {
static
inline
struct
skl
*
get_skl_ctx
(
struct
device
*
dev
)
static
inline
struct
skl
*
get_skl_ctx
(
struct
device
*
dev
)
{
{
struct
hdac_
ext_bus
*
e
bus
=
dev_get_drvdata
(
dev
);
struct
hdac_
bus
*
bus
=
dev_get_drvdata
(
dev
);
return
ebus_to_skl
(
e
bus
);
return
bus_to_skl
(
bus
);
}
}
int
skl_tplg_be_update_params
(
struct
snd_soc_dai
*
dai
,
int
skl_tplg_be_update_params
(
struct
snd_soc_dai
*
dai
,
...
@@ -470,7 +470,7 @@ int skl_dsp_set_dma_control(struct skl_sst *ctx, u32 *caps,
...
@@ -470,7 +470,7 @@ int skl_dsp_set_dma_control(struct skl_sst *ctx, u32 *caps,
void
skl_tplg_set_be_dmic_config
(
struct
snd_soc_dai
*
dai
,
void
skl_tplg_set_be_dmic_config
(
struct
snd_soc_dai
*
dai
,
struct
skl_pipe_params
*
params
,
int
stream
);
struct
skl_pipe_params
*
params
,
int
stream
);
int
skl_tplg_init
(
struct
snd_soc_component
*
component
,
int
skl_tplg_init
(
struct
snd_soc_component
*
component
,
struct
hdac_
ext_
bus
*
ebus
);
struct
hdac_bus
*
ebus
);
struct
skl_module_cfg
*
skl_tplg_fe_get_cpr_module
(
struct
skl_module_cfg
*
skl_tplg_fe_get_cpr_module
(
struct
snd_soc_dai
*
dai
,
int
stream
);
struct
snd_soc_dai
*
dai
,
int
stream
);
int
skl_tplg_update_pipe_params
(
struct
device
*
dev
,
int
skl_tplg_update_pipe_params
(
struct
device
*
dev
,
...
...
sound/soc/intel/skylake/skl.c
浏览文件 @
9a9b13dd
...
@@ -54,7 +54,7 @@ static void skl_update_pci_byte(struct pci_dev *pci, unsigned int reg,
...
@@ -54,7 +54,7 @@ static void skl_update_pci_byte(struct pci_dev *pci, unsigned int reg,
static
void
skl_init_pci
(
struct
skl
*
skl
)
static
void
skl_init_pci
(
struct
skl
*
skl
)
{
{
struct
hdac_
ext_bus
*
ebus
=
&
skl
->
ebus
;
struct
hdac_
bus
*
bus
=
skl_to_bus
(
skl
)
;
/*
/*
* Clear bits 0-2 of PCI register TCSEL (at offset 0x44)
* Clear bits 0-2 of PCI register TCSEL (at offset 0x44)
...
@@ -63,7 +63,7 @@ static void skl_init_pci(struct skl *skl)
...
@@ -63,7 +63,7 @@ static void skl_init_pci(struct skl *skl)
* codecs.
* codecs.
* The PCI register TCSEL is defined in the Intel manuals.
* The PCI register TCSEL is defined in the Intel manuals.
*/
*/
dev_dbg
(
ebus_to_hbus
(
ebus
)
->
dev
,
"Clearing TCSEL
\n
"
);
dev_dbg
(
bus
->
dev
,
"Clearing TCSEL
\n
"
);
skl_update_pci_byte
(
skl
->
pci
,
AZX_PCIREG_TCSEL
,
0x07
,
0
);
skl_update_pci_byte
(
skl
->
pci
,
AZX_PCIREG_TCSEL
,
0x07
,
0
);
}
}
...
@@ -103,8 +103,7 @@ static void skl_enable_miscbdcge(struct device *dev, bool enable)
...
@@ -103,8 +103,7 @@ static void skl_enable_miscbdcge(struct device *dev, bool enable)
static
void
skl_clock_power_gating
(
struct
device
*
dev
,
bool
enable
)
static
void
skl_clock_power_gating
(
struct
device
*
dev
,
bool
enable
)
{
{
struct
pci_dev
*
pci
=
to_pci_dev
(
dev
);
struct
pci_dev
*
pci
=
to_pci_dev
(
dev
);
struct
hdac_ext_bus
*
ebus
=
pci_get_drvdata
(
pci
);
struct
hdac_bus
*
bus
=
pci_get_drvdata
(
pci
);
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
u32
val
;
u32
val
;
/* Update PDCGE bit of CGCTL register */
/* Update PDCGE bit of CGCTL register */
...
@@ -127,7 +126,6 @@ static void skl_clock_power_gating(struct device *dev, bool enable)
...
@@ -127,7 +126,6 @@ static void skl_clock_power_gating(struct device *dev, bool enable)
*/
*/
static
int
skl_init_chip
(
struct
hdac_bus
*
bus
,
bool
full_reset
)
static
int
skl_init_chip
(
struct
hdac_bus
*
bus
,
bool
full_reset
)
{
{
struct
hdac_ext_bus
*
ebus
=
hbus_to_ebus
(
bus
);
struct
hdac_ext_link
*
hlink
;
struct
hdac_ext_link
*
hlink
;
int
ret
;
int
ret
;
...
@@ -135,7 +133,7 @@ static int skl_init_chip(struct hdac_bus *bus, bool full_reset)
...
@@ -135,7 +133,7 @@ static int skl_init_chip(struct hdac_bus *bus, bool full_reset)
ret
=
snd_hdac_bus_init_chip
(
bus
,
full_reset
);
ret
=
snd_hdac_bus_init_chip
(
bus
,
full_reset
);
/* Reset stream-to-link mapping */
/* Reset stream-to-link mapping */
list_for_each_entry
(
hlink
,
&
e
bus
->
hlink_list
,
list
)
list_for_each_entry
(
hlink
,
&
bus
->
hlink_list
,
list
)
bus
->
io_ops
->
reg_writel
(
0
,
hlink
->
ml_addr
+
AZX_REG_ML_LOSIDV
);
bus
->
io_ops
->
reg_writel
(
0
,
hlink
->
ml_addr
+
AZX_REG_ML_LOSIDV
);
skl_enable_miscbdcge
(
bus
->
dev
,
true
);
skl_enable_miscbdcge
(
bus
->
dev
,
true
);
...
@@ -146,8 +144,7 @@ static int skl_init_chip(struct hdac_bus *bus, bool full_reset)
...
@@ -146,8 +144,7 @@ static int skl_init_chip(struct hdac_bus *bus, bool full_reset)
void
skl_update_d0i3c
(
struct
device
*
dev
,
bool
enable
)
void
skl_update_d0i3c
(
struct
device
*
dev
,
bool
enable
)
{
{
struct
pci_dev
*
pci
=
to_pci_dev
(
dev
);
struct
pci_dev
*
pci
=
to_pci_dev
(
dev
);
struct
hdac_ext_bus
*
ebus
=
pci_get_drvdata
(
pci
);
struct
hdac_bus
*
bus
=
pci_get_drvdata
(
pci
);
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
u8
reg
;
u8
reg
;
int
timeout
=
50
;
int
timeout
=
50
;
...
@@ -197,8 +194,7 @@ static void skl_stream_update(struct hdac_bus *bus, struct hdac_stream *hstr)
...
@@ -197,8 +194,7 @@ static void skl_stream_update(struct hdac_bus *bus, struct hdac_stream *hstr)
static
irqreturn_t
skl_interrupt
(
int
irq
,
void
*
dev_id
)
static
irqreturn_t
skl_interrupt
(
int
irq
,
void
*
dev_id
)
{
{
struct
hdac_ext_bus
*
ebus
=
dev_id
;
struct
hdac_bus
*
bus
=
dev_id
;
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
u32
status
;
u32
status
;
if
(
!
pm_runtime_active
(
bus
->
dev
))
if
(
!
pm_runtime_active
(
bus
->
dev
))
...
@@ -227,8 +223,7 @@ static irqreturn_t skl_interrupt(int irq, void *dev_id)
...
@@ -227,8 +223,7 @@ static irqreturn_t skl_interrupt(int irq, void *dev_id)
static
irqreturn_t
skl_threaded_handler
(
int
irq
,
void
*
dev_id
)
static
irqreturn_t
skl_threaded_handler
(
int
irq
,
void
*
dev_id
)
{
{
struct
hdac_ext_bus
*
ebus
=
dev_id
;
struct
hdac_bus
*
bus
=
dev_id
;
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
u32
status
;
u32
status
;
status
=
snd_hdac_chip_readl
(
bus
,
INTSTS
);
status
=
snd_hdac_chip_readl
(
bus
,
INTSTS
);
...
@@ -238,16 +233,15 @@ static irqreturn_t skl_threaded_handler(int irq, void *dev_id)
...
@@ -238,16 +233,15 @@ static irqreturn_t skl_threaded_handler(int irq, void *dev_id)
return
IRQ_HANDLED
;
return
IRQ_HANDLED
;
}
}
static
int
skl_acquire_irq
(
struct
hdac_
ext_bus
*
e
bus
,
int
do_disconnect
)
static
int
skl_acquire_irq
(
struct
hdac_
bus
*
bus
,
int
do_disconnect
)
{
{
struct
skl
*
skl
=
ebus_to_skl
(
ebus
);
struct
skl
*
skl
=
bus_to_skl
(
bus
);
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
int
ret
;
int
ret
;
ret
=
request_threaded_irq
(
skl
->
pci
->
irq
,
skl_interrupt
,
ret
=
request_threaded_irq
(
skl
->
pci
->
irq
,
skl_interrupt
,
skl_threaded_handler
,
skl_threaded_handler
,
IRQF_SHARED
,
IRQF_SHARED
,
KBUILD_MODNAME
,
e
bus
);
KBUILD_MODNAME
,
bus
);
if
(
ret
)
{
if
(
ret
)
{
dev_err
(
bus
->
dev
,
dev_err
(
bus
->
dev
,
"unable to grab IRQ %d, disabling device
\n
"
,
"unable to grab IRQ %d, disabling device
\n
"
,
...
@@ -264,21 +258,20 @@ static int skl_acquire_irq(struct hdac_ext_bus *ebus, int do_disconnect)
...
@@ -264,21 +258,20 @@ static int skl_acquire_irq(struct hdac_ext_bus *ebus, int do_disconnect)
static
int
skl_suspend_late
(
struct
device
*
dev
)
static
int
skl_suspend_late
(
struct
device
*
dev
)
{
{
struct
pci_dev
*
pci
=
to_pci_dev
(
dev
);
struct
pci_dev
*
pci
=
to_pci_dev
(
dev
);
struct
hdac_
ext_bus
*
e
bus
=
pci_get_drvdata
(
pci
);
struct
hdac_
bus
*
bus
=
pci_get_drvdata
(
pci
);
struct
skl
*
skl
=
ebus_to_skl
(
e
bus
);
struct
skl
*
skl
=
bus_to_skl
(
bus
);
return
skl_suspend_late_dsp
(
skl
);
return
skl_suspend_late_dsp
(
skl
);
}
}
#ifdef CONFIG_PM
#ifdef CONFIG_PM
static
int
_skl_suspend
(
struct
hdac_
ext_bus
*
e
bus
)
static
int
_skl_suspend
(
struct
hdac_
bus
*
bus
)
{
{
struct
skl
*
skl
=
ebus_to_skl
(
ebus
);
struct
skl
*
skl
=
bus_to_skl
(
bus
);
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
struct
pci_dev
*
pci
=
to_pci_dev
(
bus
->
dev
);
struct
pci_dev
*
pci
=
to_pci_dev
(
bus
->
dev
);
int
ret
;
int
ret
;
snd_hdac_ext_bus_link_power_down_all
(
e
bus
);
snd_hdac_ext_bus_link_power_down_all
(
bus
);
ret
=
skl_suspend_dsp
(
skl
);
ret
=
skl_suspend_dsp
(
skl
);
if
(
ret
<
0
)
if
(
ret
<
0
)
...
@@ -295,10 +288,9 @@ static int _skl_suspend(struct hdac_ext_bus *ebus)
...
@@ -295,10 +288,9 @@ static int _skl_suspend(struct hdac_ext_bus *ebus)
return
0
;
return
0
;
}
}
static
int
_skl_resume
(
struct
hdac_
ext_bus
*
e
bus
)
static
int
_skl_resume
(
struct
hdac_
bus
*
bus
)
{
{
struct
skl
*
skl
=
ebus_to_skl
(
ebus
);
struct
skl
*
skl
=
bus_to_skl
(
bus
);
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
skl_init_pci
(
skl
);
skl_init_pci
(
skl
);
skl_init_chip
(
bus
,
true
);
skl_init_chip
(
bus
,
true
);
...
@@ -314,9 +306,8 @@ static int _skl_resume(struct hdac_ext_bus *ebus)
...
@@ -314,9 +306,8 @@ static int _skl_resume(struct hdac_ext_bus *ebus)
static
int
skl_suspend
(
struct
device
*
dev
)
static
int
skl_suspend
(
struct
device
*
dev
)
{
{
struct
pci_dev
*
pci
=
to_pci_dev
(
dev
);
struct
pci_dev
*
pci
=
to_pci_dev
(
dev
);
struct
hdac_ext_bus
*
ebus
=
pci_get_drvdata
(
pci
);
struct
hdac_bus
*
bus
=
pci_get_drvdata
(
pci
);
struct
skl
*
skl
=
ebus_to_skl
(
ebus
);
struct
skl
*
skl
=
bus_to_skl
(
bus
);
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
int
ret
=
0
;
int
ret
=
0
;
/*
/*
...
@@ -325,15 +316,15 @@ static int skl_suspend(struct device *dev)
...
@@ -325,15 +316,15 @@ static int skl_suspend(struct device *dev)
*/
*/
if
(
skl
->
supend_active
)
{
if
(
skl
->
supend_active
)
{
/* turn off the links and stop the CORB/RIRB DMA if it is On */
/* turn off the links and stop the CORB/RIRB DMA if it is On */
snd_hdac_ext_bus_link_power_down_all
(
e
bus
);
snd_hdac_ext_bus_link_power_down_all
(
bus
);
if
(
e
bus
->
cmd_dma_state
)
if
(
bus
->
cmd_dma_state
)
snd_hdac_bus_stop_cmd_io
(
&
ebus
->
bus
);
snd_hdac_bus_stop_cmd_io
(
bus
);
enable_irq_wake
(
bus
->
irq
);
enable_irq_wake
(
bus
->
irq
);
pci_save_state
(
pci
);
pci_save_state
(
pci
);
}
else
{
}
else
{
ret
=
_skl_suspend
(
e
bus
);
ret
=
_skl_suspend
(
bus
);
if
(
ret
<
0
)
if
(
ret
<
0
)
return
ret
;
return
ret
;
skl
->
skl_sst
->
fw_loaded
=
false
;
skl
->
skl_sst
->
fw_loaded
=
false
;
...
@@ -352,9 +343,8 @@ static int skl_suspend(struct device *dev)
...
@@ -352,9 +343,8 @@ static int skl_suspend(struct device *dev)
static
int
skl_resume
(
struct
device
*
dev
)
static
int
skl_resume
(
struct
device
*
dev
)
{
{
struct
pci_dev
*
pci
=
to_pci_dev
(
dev
);
struct
pci_dev
*
pci
=
to_pci_dev
(
dev
);
struct
hdac_ext_bus
*
ebus
=
pci_get_drvdata
(
pci
);
struct
hdac_bus
*
bus
=
pci_get_drvdata
(
pci
);
struct
skl
*
skl
=
ebus_to_skl
(
ebus
);
struct
skl
*
skl
=
bus_to_skl
(
bus
);
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
struct
hdac_ext_link
*
hlink
=
NULL
;
struct
hdac_ext_link
*
hlink
=
NULL
;
int
ret
;
int
ret
;
...
@@ -374,32 +364,32 @@ static int skl_resume(struct device *dev)
...
@@ -374,32 +364,32 @@ static int skl_resume(struct device *dev)
*/
*/
if
(
skl
->
supend_active
)
{
if
(
skl
->
supend_active
)
{
pci_restore_state
(
pci
);
pci_restore_state
(
pci
);
snd_hdac_ext_bus_link_power_up_all
(
e
bus
);
snd_hdac_ext_bus_link_power_up_all
(
bus
);
disable_irq_wake
(
bus
->
irq
);
disable_irq_wake
(
bus
->
irq
);
/*
/*
* turn On the links which are On before active suspend
* turn On the links which are On before active suspend
* and start the CORB/RIRB DMA if On before
* and start the CORB/RIRB DMA if On before
* active suspend.
* active suspend.
*/
*/
list_for_each_entry
(
hlink
,
&
e
bus
->
hlink_list
,
list
)
{
list_for_each_entry
(
hlink
,
&
bus
->
hlink_list
,
list
)
{
if
(
hlink
->
ref_count
)
if
(
hlink
->
ref_count
)
snd_hdac_ext_bus_link_power_up
(
hlink
);
snd_hdac_ext_bus_link_power_up
(
hlink
);
}
}
if
(
ebus
->
cmd_dma_state
)
snd_hdac_bus_init_cmd_io
(
&
ebus
->
bus
);
ret
=
0
;
ret
=
0
;
if
(
bus
->
cmd_dma_state
)
snd_hdac_bus_init_cmd_io
(
bus
);
}
else
{
}
else
{
ret
=
_skl_resume
(
e
bus
);
ret
=
_skl_resume
(
bus
);
/* turn off the links which are off before suspend */
/* turn off the links which are off before suspend */
list_for_each_entry
(
hlink
,
&
e
bus
->
hlink_list
,
list
)
{
list_for_each_entry
(
hlink
,
&
bus
->
hlink_list
,
list
)
{
if
(
!
hlink
->
ref_count
)
if
(
!
hlink
->
ref_count
)
snd_hdac_ext_bus_link_power_down
(
hlink
);
snd_hdac_ext_bus_link_power_down
(
hlink
);
}
}
if
(
!
e
bus
->
cmd_dma_state
)
if
(
!
bus
->
cmd_dma_state
)
snd_hdac_bus_stop_cmd_io
(
&
ebus
->
bus
);
snd_hdac_bus_stop_cmd_io
(
bus
);
}
}
return
ret
;
return
ret
;
...
@@ -410,23 +400,21 @@ static int skl_resume(struct device *dev)
...
@@ -410,23 +400,21 @@ static int skl_resume(struct device *dev)
static
int
skl_runtime_suspend
(
struct
device
*
dev
)
static
int
skl_runtime_suspend
(
struct
device
*
dev
)
{
{
struct
pci_dev
*
pci
=
to_pci_dev
(
dev
);
struct
pci_dev
*
pci
=
to_pci_dev
(
dev
);
struct
hdac_ext_bus
*
ebus
=
pci_get_drvdata
(
pci
);
struct
hdac_bus
*
bus
=
pci_get_drvdata
(
pci
);
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
dev_dbg
(
bus
->
dev
,
"in %s
\n
"
,
__func__
);
dev_dbg
(
bus
->
dev
,
"in %s
\n
"
,
__func__
);
return
_skl_suspend
(
e
bus
);
return
_skl_suspend
(
bus
);
}
}
static
int
skl_runtime_resume
(
struct
device
*
dev
)
static
int
skl_runtime_resume
(
struct
device
*
dev
)
{
{
struct
pci_dev
*
pci
=
to_pci_dev
(
dev
);
struct
pci_dev
*
pci
=
to_pci_dev
(
dev
);
struct
hdac_ext_bus
*
ebus
=
pci_get_drvdata
(
pci
);
struct
hdac_bus
*
bus
=
pci_get_drvdata
(
pci
);
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
dev_dbg
(
bus
->
dev
,
"in %s
\n
"
,
__func__
);
dev_dbg
(
bus
->
dev
,
"in %s
\n
"
,
__func__
);
return
_skl_resume
(
e
bus
);
return
_skl_resume
(
bus
);
}
}
#endif
/* CONFIG_PM */
#endif
/* CONFIG_PM */
...
@@ -439,20 +427,19 @@ static const struct dev_pm_ops skl_pm = {
...
@@ -439,20 +427,19 @@ static const struct dev_pm_ops skl_pm = {
/*
/*
* destructor
* destructor
*/
*/
static
int
skl_free
(
struct
hdac_
ext_bus
*
e
bus
)
static
int
skl_free
(
struct
hdac_
bus
*
bus
)
{
{
struct
skl
*
skl
=
ebus_to_skl
(
ebus
);
struct
skl
*
skl
=
bus_to_skl
(
bus
);
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
skl
->
init_done
=
0
;
/* to be sure */
skl
->
init_done
=
0
;
/* to be sure */
snd_hdac_ext_stop_streams
(
e
bus
);
snd_hdac_ext_stop_streams
(
bus
);
if
(
bus
->
irq
>=
0
)
if
(
bus
->
irq
>=
0
)
free_irq
(
bus
->
irq
,
(
void
*
)
e
bus
);
free_irq
(
bus
->
irq
,
(
void
*
)
bus
);
snd_hdac_bus_free_stream_pages
(
bus
);
snd_hdac_bus_free_stream_pages
(
bus
);
snd_hdac_stream_free_all
(
e
bus
);
snd_hdac_stream_free_all
(
bus
);
snd_hdac_link_free_all
(
e
bus
);
snd_hdac_link_free_all
(
bus
);
if
(
bus
->
remap_addr
)
if
(
bus
->
remap_addr
)
iounmap
(
bus
->
remap_addr
);
iounmap
(
bus
->
remap_addr
);
...
@@ -460,11 +447,11 @@ static int skl_free(struct hdac_ext_bus *ebus)
...
@@ -460,11 +447,11 @@ static int skl_free(struct hdac_ext_bus *ebus)
pci_release_regions
(
skl
->
pci
);
pci_release_regions
(
skl
->
pci
);
pci_disable_device
(
skl
->
pci
);
pci_disable_device
(
skl
->
pci
);
snd_hdac_ext_bus_exit
(
e
bus
);
snd_hdac_ext_bus_exit
(
bus
);
cancel_work_sync
(
&
skl
->
probe_work
);
cancel_work_sync
(
&
skl
->
probe_work
);
if
(
IS_ENABLED
(
CONFIG_SND_SOC_HDAC_HDMI
))
if
(
IS_ENABLED
(
CONFIG_SND_SOC_HDAC_HDMI
))
snd_hdac_i915_exit
(
&
ebus
->
bus
);
snd_hdac_i915_exit
(
bus
);
return
0
;
return
0
;
}
}
...
@@ -488,8 +475,8 @@ static struct skl_ssp_clk skl_ssp_clks[] = {
...
@@ -488,8 +475,8 @@ static struct skl_ssp_clk skl_ssp_clks[] = {
static
int
skl_find_machine
(
struct
skl
*
skl
,
void
*
driver_data
)
static
int
skl_find_machine
(
struct
skl
*
skl
,
void
*
driver_data
)
{
{
struct
hdac_bus
*
bus
=
skl_to_bus
(
skl
);
struct
snd_soc_acpi_mach
*
mach
=
driver_data
;
struct
snd_soc_acpi_mach
*
mach
=
driver_data
;
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
&
skl
->
ebus
);
struct
skl_machine_pdata
*
pdata
;
struct
skl_machine_pdata
*
pdata
;
mach
=
snd_soc_acpi_find_machine
(
mach
);
mach
=
snd_soc_acpi_find_machine
(
mach
);
...
@@ -510,7 +497,7 @@ static int skl_find_machine(struct skl *skl, void *driver_data)
...
@@ -510,7 +497,7 @@ static int skl_find_machine(struct skl *skl, void *driver_data)
static
int
skl_machine_device_register
(
struct
skl
*
skl
)
static
int
skl_machine_device_register
(
struct
skl
*
skl
)
{
{
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
&
skl
->
ebus
);
struct
hdac_bus
*
bus
=
skl_to_bus
(
skl
);
struct
snd_soc_acpi_mach
*
mach
=
skl
->
mach
;
struct
snd_soc_acpi_mach
*
mach
=
skl
->
mach
;
struct
platform_device
*
pdev
;
struct
platform_device
*
pdev
;
int
ret
;
int
ret
;
...
@@ -544,7 +531,7 @@ static void skl_machine_device_unregister(struct skl *skl)
...
@@ -544,7 +531,7 @@ static void skl_machine_device_unregister(struct skl *skl)
static
int
skl_dmic_device_register
(
struct
skl
*
skl
)
static
int
skl_dmic_device_register
(
struct
skl
*
skl
)
{
{
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
&
skl
->
ebus
);
struct
hdac_bus
*
bus
=
skl_to_bus
(
skl
);
struct
platform_device
*
pdev
;
struct
platform_device
*
pdev
;
int
ret
;
int
ret
;
...
@@ -643,12 +630,13 @@ static void skl_clock_device_unregister(struct skl *skl)
...
@@ -643,12 +630,13 @@ static void skl_clock_device_unregister(struct skl *skl)
/*
/*
* Probe the given codec address
* Probe the given codec address
*/
*/
static
int
probe_codec
(
struct
hdac_
ext_bus
*
e
bus
,
int
addr
)
static
int
probe_codec
(
struct
hdac_
bus
*
bus
,
int
addr
)
{
{
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
unsigned
int
cmd
=
(
addr
<<
28
)
|
(
AC_NODE_ROOT
<<
20
)
|
unsigned
int
cmd
=
(
addr
<<
28
)
|
(
AC_NODE_ROOT
<<
20
)
|
(
AC_VERB_PARAMETERS
<<
8
)
|
AC_PAR_VENDOR_ID
;
(
AC_VERB_PARAMETERS
<<
8
)
|
AC_PAR_VENDOR_ID
;
unsigned
int
res
=
-
1
;
unsigned
int
res
=
-
1
;
struct
skl
*
skl
=
bus_to_skl
(
bus
);
struct
hdac_device
*
hdev
;
mutex_lock
(
&
bus
->
cmd_mutex
);
mutex_lock
(
&
bus
->
cmd_mutex
);
snd_hdac_bus_send_cmd
(
bus
,
cmd
);
snd_hdac_bus_send_cmd
(
bus
,
cmd
);
...
@@ -658,13 +646,16 @@ static int probe_codec(struct hdac_ext_bus *ebus, int addr)
...
@@ -658,13 +646,16 @@ static int probe_codec(struct hdac_ext_bus *ebus, int addr)
return
-
EIO
;
return
-
EIO
;
dev_dbg
(
bus
->
dev
,
"codec #%d probed OK
\n
"
,
addr
);
dev_dbg
(
bus
->
dev
,
"codec #%d probed OK
\n
"
,
addr
);
return
snd_hdac_ext_bus_device_init
(
ebus
,
addr
);
hdev
=
devm_kzalloc
(
&
skl
->
pci
->
dev
,
sizeof
(
*
hdev
),
GFP_KERNEL
);
if
(
!
hdev
)
return
-
ENOMEM
;
return
snd_hdac_ext_bus_device_init
(
bus
,
addr
,
hdev
);
}
}
/* Codec initialization */
/* Codec initialization */
static
void
skl_codec_create
(
struct
hdac_
ext_bus
*
e
bus
)
static
void
skl_codec_create
(
struct
hdac_
bus
*
bus
)
{
{
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
int
c
,
max_slots
;
int
c
,
max_slots
;
max_slots
=
HDA_MAX_CODECS
;
max_slots
=
HDA_MAX_CODECS
;
...
@@ -672,7 +663,7 @@ static void skl_codec_create(struct hdac_ext_bus *ebus)
...
@@ -672,7 +663,7 @@ static void skl_codec_create(struct hdac_ext_bus *ebus)
/* First try to probe all given codec slots */
/* First try to probe all given codec slots */
for
(
c
=
0
;
c
<
max_slots
;
c
++
)
{
for
(
c
=
0
;
c
<
max_slots
;
c
++
)
{
if
((
bus
->
codec_mask
&
(
1
<<
c
)))
{
if
((
bus
->
codec_mask
&
(
1
<<
c
)))
{
if
(
probe_codec
(
e
bus
,
c
)
<
0
)
{
if
(
probe_codec
(
bus
,
c
)
<
0
)
{
/*
/*
* Some BIOSen give you wrong codec addresses
* Some BIOSen give you wrong codec addresses
* that don't exist
* that don't exist
...
@@ -722,8 +713,7 @@ static int skl_i915_init(struct hdac_bus *bus)
...
@@ -722,8 +713,7 @@ static int skl_i915_init(struct hdac_bus *bus)
static
void
skl_probe_work
(
struct
work_struct
*
work
)
static
void
skl_probe_work
(
struct
work_struct
*
work
)
{
{
struct
skl
*
skl
=
container_of
(
work
,
struct
skl
,
probe_work
);
struct
skl
*
skl
=
container_of
(
work
,
struct
skl
,
probe_work
);
struct
hdac_ext_bus
*
ebus
=
&
skl
->
ebus
;
struct
hdac_bus
*
bus
=
skl_to_bus
(
skl
);
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
struct
hdac_ext_link
*
hlink
=
NULL
;
struct
hdac_ext_link
*
hlink
=
NULL
;
int
err
;
int
err
;
...
@@ -744,7 +734,7 @@ static void skl_probe_work(struct work_struct *work)
...
@@ -744,7 +734,7 @@ static void skl_probe_work(struct work_struct *work)
dev_info
(
bus
->
dev
,
"no hda codecs found!
\n
"
);
dev_info
(
bus
->
dev
,
"no hda codecs found!
\n
"
);
/* create codec instances */
/* create codec instances */
skl_codec_create
(
e
bus
);
skl_codec_create
(
bus
);
/* register platform dai and controls */
/* register platform dai and controls */
err
=
skl_platform_register
(
bus
->
dev
);
err
=
skl_platform_register
(
bus
->
dev
);
...
@@ -773,8 +763,8 @@ static void skl_probe_work(struct work_struct *work)
...
@@ -773,8 +763,8 @@ static void skl_probe_work(struct work_struct *work)
/*
/*
* we are done probing so decrement link counts
* we are done probing so decrement link counts
*/
*/
list_for_each_entry
(
hlink
,
&
e
bus
->
hlink_list
,
list
)
list_for_each_entry
(
hlink
,
&
bus
->
hlink_list
,
list
)
snd_hdac_ext_bus_link_put
(
e
bus
,
hlink
);
snd_hdac_ext_bus_link_put
(
bus
,
hlink
);
/* configure PM */
/* configure PM */
pm_runtime_put_noidle
(
bus
->
dev
);
pm_runtime_put_noidle
(
bus
->
dev
);
...
@@ -796,7 +786,7 @@ static int skl_create(struct pci_dev *pci,
...
@@ -796,7 +786,7 @@ static int skl_create(struct pci_dev *pci,
struct
skl
**
rskl
)
struct
skl
**
rskl
)
{
{
struct
skl
*
skl
;
struct
skl
*
skl
;
struct
hdac_
ext_bus
*
e
bus
;
struct
hdac_
bus
*
bus
;
int
err
;
int
err
;
...
@@ -811,23 +801,22 @@ static int skl_create(struct pci_dev *pci,
...
@@ -811,23 +801,22 @@ static int skl_create(struct pci_dev *pci,
pci_disable_device
(
pci
);
pci_disable_device
(
pci
);
return
-
ENOMEM
;
return
-
ENOMEM
;
}
}
ebus
=
&
skl
->
ebus
;
snd_hdac_ext_bus_init
(
ebus
,
&
pci
->
dev
,
&
bus_core_ops
,
io_ops
);
bus
=
skl_to_bus
(
skl
);
ebus
->
bus
.
use_posbuf
=
1
;
snd_hdac_ext_bus_init
(
bus
,
&
pci
->
dev
,
&
bus_core_ops
,
io_ops
,
NULL
);
bus
->
use_posbuf
=
1
;
skl
->
pci
=
pci
;
skl
->
pci
=
pci
;
INIT_WORK
(
&
skl
->
probe_work
,
skl_probe_work
);
INIT_WORK
(
&
skl
->
probe_work
,
skl_probe_work
);
bus
->
bdl_pos_adj
=
0
;
ebus
->
bus
.
bdl_pos_adj
=
0
;
*
rskl
=
skl
;
*
rskl
=
skl
;
return
0
;
return
0
;
}
}
static
int
skl_first_init
(
struct
hdac_
ext_bus
*
e
bus
)
static
int
skl_first_init
(
struct
hdac_
bus
*
bus
)
{
{
struct
skl
*
skl
=
ebus_to_skl
(
ebus
);
struct
skl
*
skl
=
bus_to_skl
(
bus
);
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
struct
pci_dev
*
pci
=
skl
->
pci
;
struct
pci_dev
*
pci
=
skl
->
pci
;
int
err
;
int
err
;
unsigned
short
gcap
;
unsigned
short
gcap
;
...
@@ -848,7 +837,7 @@ static int skl_first_init(struct hdac_ext_bus *ebus)
...
@@ -848,7 +837,7 @@ static int skl_first_init(struct hdac_ext_bus *ebus)
snd_hdac_bus_parse_capabilities
(
bus
);
snd_hdac_bus_parse_capabilities
(
bus
);
if
(
skl_acquire_irq
(
e
bus
,
0
)
<
0
)
if
(
skl_acquire_irq
(
bus
,
0
)
<
0
)
return
-
EBUSY
;
return
-
EBUSY
;
pci_set_master
(
pci
);
pci_set_master
(
pci
);
...
@@ -872,14 +861,14 @@ static int skl_first_init(struct hdac_ext_bus *ebus)
...
@@ -872,14 +861,14 @@ static int skl_first_init(struct hdac_ext_bus *ebus)
if
(
!
pb_streams
&&
!
cp_streams
)
if
(
!
pb_streams
&&
!
cp_streams
)
return
-
EIO
;
return
-
EIO
;
e
bus
->
num_streams
=
cp_streams
+
pb_streams
;
bus
->
num_streams
=
cp_streams
+
pb_streams
;
/* initialize streams */
/* initialize streams */
snd_hdac_ext_stream_init_all
snd_hdac_ext_stream_init_all
(
e
bus
,
0
,
cp_streams
,
SNDRV_PCM_STREAM_CAPTURE
);
(
bus
,
0
,
cp_streams
,
SNDRV_PCM_STREAM_CAPTURE
);
start_idx
=
cp_streams
;
start_idx
=
cp_streams
;
snd_hdac_ext_stream_init_all
snd_hdac_ext_stream_init_all
(
e
bus
,
start_idx
,
pb_streams
,
SNDRV_PCM_STREAM_PLAYBACK
);
(
bus
,
start_idx
,
pb_streams
,
SNDRV_PCM_STREAM_PLAYBACK
);
err
=
snd_hdac_bus_alloc_stream_pages
(
bus
);
err
=
snd_hdac_bus_alloc_stream_pages
(
bus
);
if
(
err
<
0
)
if
(
err
<
0
)
...
@@ -895,7 +884,6 @@ static int skl_probe(struct pci_dev *pci,
...
@@ -895,7 +884,6 @@ static int skl_probe(struct pci_dev *pci,
const
struct
pci_device_id
*
pci_id
)
const
struct
pci_device_id
*
pci_id
)
{
{
struct
skl
*
skl
;
struct
skl
*
skl
;
struct
hdac_ext_bus
*
ebus
=
NULL
;
struct
hdac_bus
*
bus
=
NULL
;
struct
hdac_bus
*
bus
=
NULL
;
int
err
;
int
err
;
...
@@ -904,10 +892,9 @@ static int skl_probe(struct pci_dev *pci,
...
@@ -904,10 +892,9 @@ static int skl_probe(struct pci_dev *pci,
if
(
err
<
0
)
if
(
err
<
0
)
return
err
;
return
err
;
ebus
=
&
skl
->
ebus
;
bus
=
skl_to_bus
(
skl
);
bus
=
ebus_to_hbus
(
ebus
);
err
=
skl_first_init
(
e
bus
);
err
=
skl_first_init
(
bus
);
if
(
err
<
0
)
if
(
err
<
0
)
goto
out_free
;
goto
out_free
;
...
@@ -928,7 +915,7 @@ static int skl_probe(struct pci_dev *pci,
...
@@ -928,7 +915,7 @@ static int skl_probe(struct pci_dev *pci,
skl_nhlt_update_topology_bin
(
skl
);
skl_nhlt_update_topology_bin
(
skl
);
pci_set_drvdata
(
skl
->
pci
,
e
bus
);
pci_set_drvdata
(
skl
->
pci
,
bus
);
skl_dmic_data
.
dmic_num
=
skl_get_dmic_geo
(
skl
);
skl_dmic_data
.
dmic_num
=
skl_get_dmic_geo
(
skl
);
...
@@ -952,7 +939,7 @@ static int skl_probe(struct pci_dev *pci,
...
@@ -952,7 +939,7 @@ static int skl_probe(struct pci_dev *pci,
skl
->
skl_sst
->
clock_power_gating
=
skl_clock_power_gating
;
skl
->
skl_sst
->
clock_power_gating
=
skl_clock_power_gating
;
}
}
if
(
bus
->
mlcap
)
if
(
bus
->
mlcap
)
snd_hdac_ext_bus_get_ml_capabilities
(
e
bus
);
snd_hdac_ext_bus_get_ml_capabilities
(
bus
);
snd_hdac_bus_stop_chip
(
bus
);
snd_hdac_bus_stop_chip
(
bus
);
...
@@ -972,31 +959,30 @@ static int skl_probe(struct pci_dev *pci,
...
@@ -972,31 +959,30 @@ static int skl_probe(struct pci_dev *pci,
out_nhlt_free:
out_nhlt_free:
skl_nhlt_free
(
skl
->
nhlt
);
skl_nhlt_free
(
skl
->
nhlt
);
out_free:
out_free:
skl_free
(
e
bus
);
skl_free
(
bus
);
return
err
;
return
err
;
}
}
static
void
skl_shutdown
(
struct
pci_dev
*
pci
)
static
void
skl_shutdown
(
struct
pci_dev
*
pci
)
{
{
struct
hdac_ext_bus
*
ebus
=
pci_get_drvdata
(
pci
);
struct
hdac_bus
*
bus
=
pci_get_drvdata
(
pci
);
struct
hdac_bus
*
bus
=
ebus_to_hbus
(
ebus
);
struct
hdac_stream
*
s
;
struct
hdac_stream
*
s
;
struct
hdac_ext_stream
*
stream
;
struct
hdac_ext_stream
*
stream
;
struct
skl
*
skl
;
struct
skl
*
skl
;
if
(
ebus
==
NULL
)
if
(
!
bus
)
return
;
return
;
skl
=
ebus_to_skl
(
e
bus
);
skl
=
bus_to_skl
(
bus
);
if
(
!
skl
->
init_done
)
if
(
!
skl
->
init_done
)
return
;
return
;
snd_hdac_ext_stop_streams
(
e
bus
);
snd_hdac_ext_stop_streams
(
bus
);
list_for_each_entry
(
s
,
&
bus
->
stream_list
,
list
)
{
list_for_each_entry
(
s
,
&
bus
->
stream_list
,
list
)
{
stream
=
stream_to_hdac_ext_stream
(
s
);
stream
=
stream_to_hdac_ext_stream
(
s
);
snd_hdac_ext_stream_decouple
(
e
bus
,
stream
,
false
);
snd_hdac_ext_stream_decouple
(
bus
,
stream
,
false
);
}
}
snd_hdac_bus_stop_chip
(
bus
);
snd_hdac_bus_stop_chip
(
bus
);
...
@@ -1004,15 +990,15 @@ static void skl_shutdown(struct pci_dev *pci)
...
@@ -1004,15 +990,15 @@ static void skl_shutdown(struct pci_dev *pci)
static
void
skl_remove
(
struct
pci_dev
*
pci
)
static
void
skl_remove
(
struct
pci_dev
*
pci
)
{
{
struct
hdac_
ext_bus
*
e
bus
=
pci_get_drvdata
(
pci
);
struct
hdac_
bus
*
bus
=
pci_get_drvdata
(
pci
);
struct
skl
*
skl
=
ebus_to_skl
(
e
bus
);
struct
skl
*
skl
=
bus_to_skl
(
bus
);
release_firmware
(
skl
->
tplg
);
release_firmware
(
skl
->
tplg
);
pm_runtime_get_noresume
(
&
pci
->
dev
);
pm_runtime_get_noresume
(
&
pci
->
dev
);
/* codec removal, invoke bus_device_remove */
/* codec removal, invoke bus_device_remove */
snd_hdac_ext_bus_device_remove
(
e
bus
);
snd_hdac_ext_bus_device_remove
(
bus
);
skl
->
debugfs
=
NULL
;
skl
->
debugfs
=
NULL
;
skl_platform_unregister
(
&
pci
->
dev
);
skl_platform_unregister
(
&
pci
->
dev
);
...
@@ -1022,7 +1008,7 @@ static void skl_remove(struct pci_dev *pci)
...
@@ -1022,7 +1008,7 @@ static void skl_remove(struct pci_dev *pci)
skl_clock_device_unregister
(
skl
);
skl_clock_device_unregister
(
skl
);
skl_nhlt_remove_sysfs
(
skl
);
skl_nhlt_remove_sysfs
(
skl
);
skl_nhlt_free
(
skl
->
nhlt
);
skl_nhlt_free
(
skl
->
nhlt
);
skl_free
(
e
bus
);
skl_free
(
bus
);
dev_set_drvdata
(
&
pci
->
dev
,
NULL
);
dev_set_drvdata
(
&
pci
->
dev
,
NULL
);
}
}
...
...
sound/soc/intel/skylake/skl.h
浏览文件 @
9a9b13dd
...
@@ -71,7 +71,7 @@ struct skl_fw_config {
...
@@ -71,7 +71,7 @@ struct skl_fw_config {
};
};
struct
skl
{
struct
skl
{
struct
hdac_
ext_bus
e
bus
;
struct
hdac_
bus
h
bus
;
struct
pci_dev
*
pci
;
struct
pci_dev
*
pci
;
unsigned
int
init_done
:
1
;
/* delayed init status */
unsigned
int
init_done
:
1
;
/* delayed init status */
...
@@ -105,9 +105,8 @@ struct skl {
...
@@ -105,9 +105,8 @@ struct skl {
struct
snd_soc_acpi_mach
*
mach
;
struct
snd_soc_acpi_mach
*
mach
;
};
};
#define skl_to_ebus(s) (&(s)->ebus)
#define skl_to_bus(s) (&(s)->hbus)
#define ebus_to_skl(sbus) \
#define bus_to_skl(bus) container_of(bus, struct skl, hbus)
container_of(sbus, struct skl, sbus)
/* to pass dai dma data */
/* to pass dai dma data */
struct
skl_dma_params
{
struct
skl_dma_params
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录