Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
a293e8ec
Commit
a293e8ec
authored
Oct 20, 2022
by
Takashi Iwai
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'topic/hda-ext-cleanup' into for-next
Signed-off-by:
Takashi Iwai
<
tiwai@suse.de
>
parents
4881bda5
62582341
Changes
18
Hide whitespace changes
Inline
Side-by-side
Showing
18 changed files
with
343 additions
and
362 deletions
+343
-362
include/sound/hdaudio.h
include/sound/hdaudio.h
+26
-0
include/sound/hdaudio_ext.h
include/sound/hdaudio_ext.h
+16
-50
sound/hda/ext/hdac_ext_controller.c
sound/hda/ext/hdac_ext_controller.c
+67
-49
sound/hda/ext/hdac_ext_stream.c
sound/hda/ext/hdac_ext_stream.c
+20
-183
sound/hda/hdac_stream.c
sound/hda/hdac_stream.c
+136
-0
sound/soc/codecs/hda.c
sound/soc/codecs/hda.c
+2
-2
sound/soc/codecs/hdac_hda.c
sound/soc/codecs/hdac_hda.c
+3
-3
sound/soc/codecs/hdac_hdmi.c
sound/soc/codecs/hdac_hdmi.c
+4
-4
sound/soc/intel/avs/core.c
sound/soc/intel/avs/core.c
+1
-1
sound/soc/intel/avs/loader.c
sound/soc/intel/avs/loader.c
+8
-8
sound/soc/intel/avs/pcm.c
sound/soc/intel/avs/pcm.c
+8
-8
sound/soc/intel/skylake/skl-messages.c
sound/soc/intel/skylake/skl-messages.c
+2
-4
sound/soc/intel/skylake/skl-pcm.c
sound/soc/intel/skylake/skl-pcm.c
+17
-18
sound/soc/intel/skylake/skl.c
sound/soc/intel/skylake/skl.c
+1
-1
sound/soc/sof/intel/hda-dai.c
sound/soc/sof/intel/hda-dai.c
+21
-21
sound/soc/sof/intel/hda-pcm.c
sound/soc/sof/intel/hda-pcm.c
+1
-2
sound/soc/sof/intel/hda-stream.c
sound/soc/sof/intel/hda-stream.c
+9
-7
sound/soc/sof/intel/hda.c
sound/soc/sof/intel/hda.c
+1
-1
No files found.
include/sound/hdaudio.h
View file @
a293e8ec
...
@@ -495,6 +495,13 @@ static inline u16 snd_hdac_reg_readw(struct hdac_bus *bus, void __iomem *addr)
...
@@ -495,6 +495,13 @@ static inline u16 snd_hdac_reg_readw(struct hdac_bus *bus, void __iomem *addr)
snd_hdac_chip_writeb(chip, reg, \
snd_hdac_chip_writeb(chip, reg, \
(snd_hdac_chip_readb(chip, reg) & ~(mask)) | (val))
(snd_hdac_chip_readb(chip, reg) & ~(mask)) | (val))
/* update register macro */
#define snd_hdac_updatel(addr, reg, mask, val) \
writel(((readl(addr + reg) & ~(mask)) | (val)), addr + reg)
#define snd_hdac_updatew(addr, reg, mask, val) \
writew(((readw(addr + reg) & ~(mask)) | (val)), addr + reg)
/*
/*
* HD-audio stream
* HD-audio stream
*/
*/
...
@@ -511,6 +518,13 @@ struct hdac_stream {
...
@@ -511,6 +518,13 @@ struct hdac_stream {
void
__iomem
*
sd_addr
;
/* stream descriptor pointer */
void
__iomem
*
sd_addr
;
/* stream descriptor pointer */
void
__iomem
*
spib_addr
;
/* software position in buffers stream pointer */
void
__iomem
*
fifo_addr
;
/* software position Max fifos stream pointer */
void
__iomem
*
dpibr_addr
;
/* DMA position in buffer resume pointer */
u32
dpib
;
/* DMA position in buffer */
u32
lpib
;
/* Linear position in buffer */
u32
sd_int_sta_mask
;
/* stream int status mask */
u32
sd_int_sta_mask
;
/* stream int status mask */
/* pcm support */
/* pcm support */
...
@@ -575,6 +589,18 @@ void snd_hdac_stream_timecounter_init(struct hdac_stream *azx_dev,
...
@@ -575,6 +589,18 @@ void snd_hdac_stream_timecounter_init(struct hdac_stream *azx_dev,
int
snd_hdac_get_stream_stripe_ctl
(
struct
hdac_bus
*
bus
,
int
snd_hdac_get_stream_stripe_ctl
(
struct
hdac_bus
*
bus
,
struct
snd_pcm_substream
*
substream
);
struct
snd_pcm_substream
*
substream
);
void
snd_hdac_stream_spbcap_enable
(
struct
hdac_bus
*
chip
,
bool
enable
,
int
index
);
int
snd_hdac_stream_set_spib
(
struct
hdac_bus
*
bus
,
struct
hdac_stream
*
azx_dev
,
u32
value
);
int
snd_hdac_stream_get_spbmaxfifo
(
struct
hdac_bus
*
bus
,
struct
hdac_stream
*
azx_dev
);
void
snd_hdac_stream_drsm_enable
(
struct
hdac_bus
*
bus
,
bool
enable
,
int
index
);
int
snd_hdac_stream_set_dpibr
(
struct
hdac_bus
*
bus
,
struct
hdac_stream
*
azx_dev
,
u32
value
);
int
snd_hdac_stream_set_lpib
(
struct
hdac_stream
*
azx_dev
,
u32
value
);
/*
/*
* macros for easy use
* macros for easy use
*/
*/
...
...
include/sound/hdaudio_ext.h
View file @
a293e8ec
...
@@ -23,13 +23,10 @@ void snd_hdac_ext_bus_device_remove(struct hdac_bus *bus);
...
@@ -23,13 +23,10 @@ void snd_hdac_ext_bus_device_remove(struct hdac_bus *bus);
void
snd_hdac_ext_bus_ppcap_enable
(
struct
hdac_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_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_bus
*
chip
,
bool
enable
,
int
index
);
int
snd_hdac_ext_bus_get_ml_capabilities
(
struct
hdac_bus
*
bus
);
int
snd_hdac_ext_bus_get_ml_capabilities
(
struct
hdac_bus
*
bus
);
struct
hdac_ext_link
*
snd_hdac_ext_bus_
link_at
(
struct
hdac_bus
*
bus
,
int
addr
);
struct
hdac_ext_link
*
snd_hdac_ext_bus_
get_hlink_by_addr
(
struct
hdac_bus
*
bus
,
int
addr
);
struct
hdac_ext_link
*
snd_hdac_ext_bus_get_
link
(
struct
hdac_bus
*
bus
,
struct
hdac_ext_link
*
snd_hdac_ext_bus_get_
hlink_by_name
(
struct
hdac_bus
*
bus
,
const
char
*
codec_name
);
const
char
*
codec_name
);
enum
hdac_ext_stream_type
{
enum
hdac_ext_stream_type
{
HDAC_EXT_STREAM_TYPE_COUPLED
=
0
,
HDAC_EXT_STREAM_TYPE_COUPLED
=
0
,
...
@@ -43,11 +40,6 @@ enum hdac_ext_stream_type {
...
@@ -43,11 +40,6 @@ enum hdac_ext_stream_type {
* @hstream: hdac_stream
* @hstream: hdac_stream
* @pphc_addr: processing pipe host stream pointer
* @pphc_addr: processing pipe host stream pointer
* @pplc_addr: processing pipe link stream pointer
* @pplc_addr: processing pipe link stream pointer
* @spib_addr: software position in buffers stream pointer
* @fifo_addr: software position Max fifos stream pointer
* @dpibr_addr: DMA position in buffer resume pointer
* @dpib: DMA position in buffer
* @lpib: Linear position in buffer
* @decoupled: stream host and link is decoupled
* @decoupled: stream host and link is decoupled
* @link_locked: link is locked
* @link_locked: link is locked
* @link_prepared: link is prepared
* @link_prepared: link is prepared
...
@@ -59,13 +51,6 @@ struct hdac_ext_stream {
...
@@ -59,13 +51,6 @@ struct hdac_ext_stream {
void
__iomem
*
pphc_addr
;
void
__iomem
*
pphc_addr
;
void
__iomem
*
pplc_addr
;
void
__iomem
*
pplc_addr
;
void
__iomem
*
spib_addr
;
void
__iomem
*
fifo_addr
;
void
__iomem
*
dpibr_addr
;
u32
dpib
;
u32
lpib
;
bool
decoupled
:
1
;
bool
decoupled
:
1
;
bool
link_locked
:
1
;
bool
link_locked
:
1
;
bool
link_prepared
;
bool
link_prepared
;
...
@@ -80,7 +65,7 @@ struct hdac_ext_stream {
...
@@ -80,7 +65,7 @@ struct hdac_ext_stream {
int
snd_hdac_ext_stream_init_all
(
struct
hdac_bus
*
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_ext_stream_free_all
(
struct
hdac_bus
*
bus
);
void
snd_hdac_ext_stream_free_all
(
struct
hdac_bus
*
bus
);
void
snd_hdac_link_free_all
(
struct
hdac_bus
*
bus
);
void
snd_hdac_
ext_
link_free_all
(
struct
hdac_bus
*
bus
);
struct
hdac_ext_stream
*
snd_hdac_ext_stream_assign
(
struct
hdac_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
);
...
@@ -90,20 +75,10 @@ void snd_hdac_ext_stream_decouple_locked(struct hdac_bus *bus,
...
@@ -90,20 +75,10 @@ void snd_hdac_ext_stream_decouple_locked(struct hdac_bus *bus,
void
snd_hdac_ext_stream_decouple
(
struct
hdac_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
);
int
snd_hdac_ext_stream_set_spib
(
struct
hdac_bus
*
bus
,
void
snd_hdac_ext_stream_start
(
struct
hdac_ext_stream
*
hext_stream
);
struct
hdac_ext_stream
*
hext_stream
,
u32
value
);
void
snd_hdac_ext_stream_clear
(
struct
hdac_ext_stream
*
hext_stream
);
int
snd_hdac_ext_stream_get_spbmaxfifo
(
struct
hdac_bus
*
bus
,
void
snd_hdac_ext_stream_reset
(
struct
hdac_ext_stream
*
hext_stream
);
struct
hdac_ext_stream
*
hext_stream
);
int
snd_hdac_ext_stream_setup
(
struct
hdac_ext_stream
*
hext_stream
,
int
fmt
);
void
snd_hdac_ext_stream_drsm_enable
(
struct
hdac_bus
*
bus
,
bool
enable
,
int
index
);
int
snd_hdac_ext_stream_set_dpibr
(
struct
hdac_bus
*
bus
,
struct
hdac_ext_stream
*
hext_stream
,
u32
value
);
int
snd_hdac_ext_stream_set_lpib
(
struct
hdac_ext_stream
*
hext_stream
,
u32
value
);
void
snd_hdac_ext_link_stream_start
(
struct
hdac_ext_stream
*
hext_stream
);
void
snd_hdac_ext_link_stream_clear
(
struct
hdac_ext_stream
*
hext_stream
);
void
snd_hdac_ext_link_stream_reset
(
struct
hdac_ext_stream
*
hext_stream
);
int
snd_hdac_ext_link_stream_setup
(
struct
hdac_ext_stream
*
hext_stream
,
int
fmt
);
struct
hdac_ext_link
{
struct
hdac_ext_link
{
struct
hdac_bus
*
bus
;
struct
hdac_bus
*
bus
;
...
@@ -117,29 +92,20 @@ struct hdac_ext_link {
...
@@ -117,29 +92,20 @@ struct hdac_ext_link {
struct
list_head
list
;
struct
list_head
list
;
};
};
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
*
h
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
*
h
link
);
int
snd_hdac_ext_bus_link_power_up_all
(
struct
hdac_bus
*
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_bus
*
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_
bus_link_set_stream_id
(
struct
hdac_ext_link
*
h
link
,
int
stream
);
int
stream
);
void
snd_hdac_ext_
link_clear_stream_id
(
struct
hdac_ext_link
*
link
,
void
snd_hdac_ext_
bus_link_clear_stream_id
(
struct
hdac_ext_link
*
h
link
,
int
stream
);
int
stream
);
int
snd_hdac_ext_bus_link_get
(
struct
hdac_bus
*
bus
,
struct
hdac_ext_link
*
link
);
int
snd_hdac_ext_bus_link_get
(
struct
hdac_bus
*
bus
,
struct
hdac_ext_link
*
h
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_bus
*
bus
,
struct
hdac_ext_link
*
h
link
);
void
snd_hdac_ext_bus_link_power
(
struct
hdac_device
*
codec
,
bool
enable
);
void
snd_hdac_ext_bus_link_power
(
struct
hdac_device
*
codec
,
bool
enable
);
/* update register macro */
#define snd_hdac_updatel(addr, reg, mask, val) \
writel(((readl(addr + reg) & ~(mask)) | (val)), \
addr + reg)
#define snd_hdac_updatew(addr, reg, mask, val) \
writew(((readw(addr + reg) & ~(mask)) | (val)), \
addr + reg)
#define snd_hdac_adsp_writeb(chip, reg, value) \
#define snd_hdac_adsp_writeb(chip, reg, value) \
snd_hdac_reg_writeb(chip, (chip)->dsp_ba + (reg), value)
snd_hdac_reg_writeb(chip, (chip)->dsp_ba + (reg), value)
#define snd_hdac_adsp_readb(chip, reg) \
#define snd_hdac_adsp_readb(chip, reg) \
...
...
sound/hda/ext/hdac_ext_controller.c
View file @
a293e8ec
...
@@ -108,50 +108,48 @@ int snd_hdac_ext_bus_get_ml_capabilities(struct hdac_bus *bus)
...
@@ -108,50 +108,48 @@ int snd_hdac_ext_bus_get_ml_capabilities(struct hdac_bus *bus)
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_bus_get_ml_capabilities
);
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_bus_get_ml_capabilities
);
/**
/**
* snd_hdac_link_free_all- free hdac extended link objects
* snd_hdac_
ext_
link_free_all- free hdac extended link objects
*
*
* @bus: the pointer to HDAC bus object
* @bus: the pointer to HDAC bus object
*/
*/
void
snd_hdac_link_free_all
(
struct
hdac_bus
*
bus
)
void
snd_hdac_
ext_
link_free_all
(
struct
hdac_bus
*
bus
)
{
{
struct
hdac_ext_link
*
l
;
struct
hdac_ext_link
*
hlink
;
while
(
!
list_empty
(
&
bus
->
hlink_list
))
{
while
(
!
list_empty
(
&
bus
->
hlink_list
))
{
l
=
list_first_entry
(
&
bus
->
hlink_list
,
struct
hdac_ext_link
,
list
);
hlink
=
list_first_entry
(
&
bus
->
hlink_list
,
struct
hdac_ext_link
,
list
);
list_del
(
&
l
->
list
);
list_del
(
&
hlink
->
list
);
kfree
(
l
);
kfree
(
hlink
);
}
}
}
}
EXPORT_SYMBOL_GPL
(
snd_hdac_link_free_all
);
EXPORT_SYMBOL_GPL
(
snd_hdac_
ext_
link_free_all
);
/**
/**
* snd_hdac_ext_bus_
link_at - get
link at specified address
* snd_hdac_ext_bus_
get_hlink_by_addr - get h
link at specified address
* @bus: link's parent bus device
* @bus:
h
link's parent bus device
* @addr: codec device address
* @addr: codec device address
*
*
* Returns
link object or NULL if matching
link is not found.
* Returns
hlink object or NULL if matching h
link is not found.
*/
*/
struct
hdac_ext_link
*
snd_hdac_ext_bus_
link_at
(
struct
hdac_bus
*
bus
,
int
addr
)
struct
hdac_ext_link
*
snd_hdac_ext_bus_
get_hlink_by_addr
(
struct
hdac_bus
*
bus
,
int
addr
)
{
{
struct
hdac_ext_link
*
hlink
;
struct
hdac_ext_link
*
hlink
;
int
i
;
list_for_each_entry
(
hlink
,
&
bus
->
hlink_list
,
list
)
list_for_each_entry
(
hlink
,
&
bus
->
hlink_list
,
list
)
for
(
i
=
0
;
i
<
HDA_MAX_CODECS
;
i
++
)
if
(
hlink
->
lsdiid
&
(
0x1
<<
addr
))
if
(
hlink
->
lsdiid
&
(
0x1
<<
addr
))
return
hlink
;
return
hlink
;
return
NULL
;
return
NULL
;
}
}
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_bus_
link_at
);
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_bus_
get_hlink_by_addr
);
/**
/**
* snd_hdac_ext_bus_get_
link - get
link based on codec name
* snd_hdac_ext_bus_get_
hlink_by_name - get h
link based on codec name
* @bus: the pointer to HDAC bus object
* @bus: the pointer to HDAC bus object
* @codec_name: codec name
* @codec_name: codec name
*/
*/
struct
hdac_ext_link
*
snd_hdac_ext_bus_get_
link
(
struct
hdac_bus
*
bus
,
struct
hdac_ext_link
*
snd_hdac_ext_bus_get_
hlink_by_name
(
struct
hdac_bus
*
bus
,
const
char
*
codec_name
)
const
char
*
codec_name
)
{
{
int
bus_idx
,
addr
;
int
bus_idx
,
addr
;
...
@@ -162,11 +160,11 @@ struct hdac_ext_link *snd_hdac_ext_bus_get_link(struct hdac_bus *bus,
...
@@ -162,11 +160,11 @@ struct hdac_ext_link *snd_hdac_ext_bus_get_link(struct hdac_bus *bus,
if
(
addr
<
0
||
addr
>
31
)
if
(
addr
<
0
||
addr
>
31
)
return
NULL
;
return
NULL
;
return
snd_hdac_ext_bus_
link_at
(
bus
,
addr
);
return
snd_hdac_ext_bus_
get_hlink_by_addr
(
bus
,
addr
);
}
}
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_bus_get_
link
);
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_bus_get_
hlink_by_name
);
static
int
check_hdac_link_power_active
(
struct
hdac_ext_link
*
link
,
bool
enable
)
static
int
check_hdac_link_power_active
(
struct
hdac_ext_link
*
h
link
,
bool
enable
)
{
{
int
timeout
;
int
timeout
;
u32
val
;
u32
val
;
...
@@ -176,7 +174,7 @@ static int check_hdac_link_power_active(struct hdac_ext_link *link, bool enable)
...
@@ -176,7 +174,7 @@ static int check_hdac_link_power_active(struct hdac_ext_link *link, bool enable)
timeout
=
150
;
timeout
=
150
;
do
{
do
{
val
=
readl
(
link
->
ml_addr
+
AZX_REG_ML_LCTL
);
val
=
readl
(
h
link
->
ml_addr
+
AZX_REG_ML_LCTL
);
if
(
enable
)
{
if
(
enable
)
{
if
(((
val
&
mask
)
>>
AZX_ML_LCTL_CPA_SHIFT
))
if
(((
val
&
mask
)
>>
AZX_ML_LCTL_CPA_SHIFT
))
return
0
;
return
0
;
...
@@ -192,26 +190,26 @@ static int check_hdac_link_power_active(struct hdac_ext_link *link, bool enable)
...
@@ -192,26 +190,26 @@ static int check_hdac_link_power_active(struct hdac_ext_link *link, bool enable)
/**
/**
* snd_hdac_ext_bus_link_power_up -power up hda link
* snd_hdac_ext_bus_link_power_up -power up hda link
* @link: HD-audio extended link
* @
h
link: HD-audio extended 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
*
h
link
)
{
{
snd_hdac_updatel
(
link
->
ml_addr
,
AZX_REG_ML_LCTL
,
snd_hdac_updatel
(
h
link
->
ml_addr
,
AZX_REG_ML_LCTL
,
AZX_ML_LCTL_SPA
,
AZX_ML_LCTL_SPA
);
AZX_ML_LCTL_SPA
,
AZX_ML_LCTL_SPA
);
return
check_hdac_link_power_active
(
link
,
true
);
return
check_hdac_link_power_active
(
h
link
,
true
);
}
}
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_bus_link_power_up
);
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_bus_link_power_up
);
/**
/**
* snd_hdac_ext_bus_link_power_down -power down hda link
* snd_hdac_ext_bus_link_power_down -power down hda link
* @link: HD-audio extended link
* @
h
link: HD-audio extended 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
*
h
link
)
{
{
snd_hdac_updatel
(
link
->
ml_addr
,
AZX_REG_ML_LCTL
,
AZX_ML_LCTL_SPA
,
0
);
snd_hdac_updatel
(
h
link
->
ml_addr
,
AZX_REG_ML_LCTL
,
AZX_ML_LCTL_SPA
,
0
);
return
check_hdac_link_power_active
(
link
,
false
);
return
check_hdac_link_power_active
(
h
link
,
false
);
}
}
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_bus_link_power_down
);
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_bus_link_power_down
);
...
@@ -225,9 +223,7 @@ int snd_hdac_ext_bus_link_power_up_all(struct hdac_bus *bus)
...
@@ -225,9 +223,7 @@ int snd_hdac_ext_bus_link_power_up_all(struct hdac_bus *bus)
int
ret
;
int
ret
;
list_for_each_entry
(
hlink
,
&
bus
->
hlink_list
,
list
)
{
list_for_each_entry
(
hlink
,
&
bus
->
hlink_list
,
list
)
{
snd_hdac_updatel
(
hlink
->
ml_addr
,
AZX_REG_ML_LCTL
,
ret
=
snd_hdac_ext_bus_link_power_up
(
hlink
);
AZX_ML_LCTL_SPA
,
AZX_ML_LCTL_SPA
);
ret
=
check_hdac_link_power_active
(
hlink
,
true
);
if
(
ret
<
0
)
if
(
ret
<
0
)
return
ret
;
return
ret
;
}
}
...
@@ -246,9 +242,7 @@ int snd_hdac_ext_bus_link_power_down_all(struct hdac_bus *bus)
...
@@ -246,9 +242,7 @@ int snd_hdac_ext_bus_link_power_down_all(struct hdac_bus *bus)
int
ret
;
int
ret
;
list_for_each_entry
(
hlink
,
&
bus
->
hlink_list
,
list
)
{
list_for_each_entry
(
hlink
,
&
bus
->
hlink_list
,
list
)
{
snd_hdac_updatel
(
hlink
->
ml_addr
,
AZX_REG_ML_LCTL
,
ret
=
snd_hdac_ext_bus_link_power_down
(
hlink
);
AZX_ML_LCTL_SPA
,
0
);
ret
=
check_hdac_link_power_active
(
hlink
,
false
);
if
(
ret
<
0
)
if
(
ret
<
0
)
return
ret
;
return
ret
;
}
}
...
@@ -257,8 +251,32 @@ int snd_hdac_ext_bus_link_power_down_all(struct hdac_bus *bus)
...
@@ -257,8 +251,32 @@ int snd_hdac_ext_bus_link_power_down_all(struct hdac_bus *bus)
}
}
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_bus_link_power_down_all
);
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_bus_link_power_down_all
);
/**
* snd_hdac_ext_bus_link_set_stream_id - maps stream id to link output
* @link: HD-audio ext link to set up
* @stream: stream id
*/
void
snd_hdac_ext_bus_link_set_stream_id
(
struct
hdac_ext_link
*
link
,
int
stream
)
{
snd_hdac_updatew
(
link
->
ml_addr
,
AZX_REG_ML_LOSIDV
,
(
1
<<
stream
),
1
<<
stream
);
}
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_bus_link_set_stream_id
);
/**
* snd_hdac_ext_bus_link_clear_stream_id - maps stream id to link output
* @link: HD-audio ext link to set up
* @stream: stream id
*/
void
snd_hdac_ext_bus_link_clear_stream_id
(
struct
hdac_ext_link
*
link
,
int
stream
)
{
snd_hdac_updatew
(
link
->
ml_addr
,
AZX_REG_ML_LOSIDV
,
(
1
<<
stream
),
0
);
}
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_bus_link_clear_stream_id
);
int
snd_hdac_ext_bus_link_get
(
struct
hdac_bus
*
bus
,
int
snd_hdac_ext_bus_link_get
(
struct
hdac_bus
*
bus
,
struct
hdac_ext_link
*
link
)
struct
hdac_ext_link
*
h
link
)
{
{
unsigned
long
codec_mask
;
unsigned
long
codec_mask
;
int
ret
=
0
;
int
ret
=
0
;
...
@@ -269,18 +287,18 @@ int snd_hdac_ext_bus_link_get(struct hdac_bus *bus,
...
@@ -269,18 +287,18 @@ int snd_hdac_ext_bus_link_get(struct hdac_bus *bus,
* 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
(
++
h
link
->
ref_count
==
1
)
{
if
(
!
bus
->
cmd_dma_state
)
{
if
(
!
bus
->
cmd_dma_state
)
{
snd_hdac_bus_init_cmd_io
(
bus
);
snd_hdac_bus_init_cmd_io
(
bus
);
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
(
h
link
);
/*
/*
* clear the register to invalidate all the output streams
* clear the register to invalidate all the output streams
*/
*/
snd_hdac_updatew
(
link
->
ml_addr
,
AZX_REG_ML_LOSIDV
,
snd_hdac_updatew
(
h
link
->
ml_addr
,
AZX_REG_ML_LOSIDV
,
AZX_ML_LOSIDV_STREAM_MASK
,
0
);
AZX_ML_LOSIDV_STREAM_MASK
,
0
);
/*
/*
* wait for 521usec for codec to report status
* wait for 521usec for codec to report status
...
@@ -300,10 +318,10 @@ int snd_hdac_ext_bus_link_get(struct hdac_bus *bus,
...
@@ -300,10 +318,10 @@ int snd_hdac_ext_bus_link_get(struct hdac_bus *bus,
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_bus
*
bus
,
int
snd_hdac_ext_bus_link_put
(
struct
hdac_bus
*
bus
,
struct
hdac_ext_link
*
link
)
struct
hdac_ext_link
*
h
link
)
{
{
int
ret
=
0
;
int
ret
=
0
;
struct
hdac_ext_link
*
hlink
;
struct
hdac_ext_link
*
hlink
_tmp
;
bool
link_up
=
false
;
bool
link_up
=
false
;
mutex_lock
(
&
bus
->
lock
);
mutex_lock
(
&
bus
->
lock
);
...
@@ -312,15 +330,15 @@ int snd_hdac_ext_bus_link_put(struct hdac_bus *bus,
...
@@ -312,15 +330,15 @@ int snd_hdac_ext_bus_link_put(struct hdac_bus *bus,
* if we move from 1 to 0, count will be 0
* if we move from 1 to 0, count will be 0
* so power down this link as well
* so power down this link as well
*/
*/
if
(
--
link
->
ref_count
==
0
)
{
if
(
--
h
link
->
ref_count
==
0
)
{
ret
=
snd_hdac_ext_bus_link_power_down
(
link
);
ret
=
snd_hdac_ext_bus_link_power_down
(
h
link
);
/*
/*
* 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
,
&
bus
->
hlink_list
,
list
)
{
list_for_each_entry
(
hlink
_tmp
,
&
bus
->
hlink_list
,
list
)
{
if
(
hlink
->
ref_count
)
{
if
(
hlink
_tmp
->
ref_count
)
{
link_up
=
true
;
link_up
=
true
;
break
;
break
;
}
}
...
@@ -341,7 +359,7 @@ static void hdac_ext_codec_link_up(struct hdac_device *codec)
...
@@ -341,7 +359,7 @@ static void hdac_ext_codec_link_up(struct hdac_device *codec)
{
{
const
char
*
devname
=
dev_name
(
&
codec
->
dev
);
const
char
*
devname
=
dev_name
(
&
codec
->
dev
);
struct
hdac_ext_link
*
hlink
=
struct
hdac_ext_link
*
hlink
=
snd_hdac_ext_bus_get_
link
(
codec
->
bus
,
devname
);
snd_hdac_ext_bus_get_
hlink_by_name
(
codec
->
bus
,
devname
);
if
(
hlink
)
if
(
hlink
)
snd_hdac_ext_bus_link_get
(
codec
->
bus
,
hlink
);
snd_hdac_ext_bus_link_get
(
codec
->
bus
,
hlink
);
...
@@ -351,7 +369,7 @@ static void hdac_ext_codec_link_down(struct hdac_device *codec)
...
@@ -351,7 +369,7 @@ static void hdac_ext_codec_link_down(struct hdac_device *codec)
{
{
const
char
*
devname
=
dev_name
(
&
codec
->
dev
);
const
char
*
devname
=
dev_name
(
&
codec
->
dev
);
struct
hdac_ext_link
*
hlink
=
struct
hdac_ext_link
*
hlink
=
snd_hdac_ext_bus_get_
link
(
codec
->
bus
,
devname
);
snd_hdac_ext_bus_get_
hlink_by_name
(
codec
->
bus
,
devname
);
if
(
hlink
)
if
(
hlink
)
snd_hdac_ext_bus_link_put
(
codec
->
bus
,
hlink
);
snd_hdac_ext_bus_link_put
(
codec
->
bus
,
hlink
);
...
...
sound/hda/ext/hdac_ext_stream.c
View file @
a293e8ec
...
@@ -39,20 +39,6 @@ static void snd_hdac_ext_stream_init(struct hdac_bus *bus,
...
@@ -39,20 +39,6 @@ static void snd_hdac_ext_stream_init(struct hdac_bus *bus,
AZX_PPLC_INTERVAL
*
idx
;
AZX_PPLC_INTERVAL
*
idx
;
}
}
if
(
bus
->
spbcap
)
{
hext_stream
->
spib_addr
=
bus
->
spbcap
+
AZX_SPB_BASE
+
AZX_SPB_INTERVAL
*
idx
+
AZX_SPB_SPIB
;
hext_stream
->
fifo_addr
=
bus
->
spbcap
+
AZX_SPB_BASE
+
AZX_SPB_INTERVAL
*
idx
+
AZX_SPB_MAXFIFO
;
}
if
(
bus
->
drsmcap
)
hext_stream
->
dpibr_addr
=
bus
->
drsmcap
+
AZX_DRSM_BASE
+
AZX_DRSM_INTERVAL
*
idx
;
hext_stream
->
decoupled
=
false
;
hext_stream
->
decoupled
=
false
;
snd_hdac_stream_init
(
bus
,
&
hext_stream
->
hstream
,
idx
,
direction
,
tag
);
snd_hdac_stream_init
(
bus
,
&
hext_stream
->
hstream
,
idx
,
direction
,
tag
);
}
}
...
@@ -140,36 +126,36 @@ void snd_hdac_ext_stream_decouple(struct hdac_bus *bus,
...
@@ -140,36 +126,36 @@ void snd_hdac_ext_stream_decouple(struct hdac_bus *bus,
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_stream_decouple
);
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_stream_decouple
);
/**
/**
* snd_hdac_ext_
link_
stream_start - start a stream
* snd_hdac_ext_stream_start - start a stream
* @hext_stream: HD-audio ext core stream to start
* @hext_stream: HD-audio ext core stream to start
*/
*/
void
snd_hdac_ext_
link_
stream_start
(
struct
hdac_ext_stream
*
hext_stream
)
void
snd_hdac_ext_stream_start
(
struct
hdac_ext_stream
*
hext_stream
)
{
{
snd_hdac_updatel
(
hext_stream
->
pplc_addr
,
AZX_REG_PPLCCTL
,
snd_hdac_updatel
(
hext_stream
->
pplc_addr
,
AZX_REG_PPLCCTL
,
AZX_PPLCCTL_RUN
,
AZX_PPLCCTL_RUN
);
AZX_PPLCCTL_RUN
,
AZX_PPLCCTL_RUN
);
}
}
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_
link_
stream_start
);
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_stream_start
);
/**
/**
* snd_hdac_ext_
link_
stream_clear - stop a stream DMA
* snd_hdac_ext_stream_clear - stop a stream DMA
* @hext_stream: HD-audio ext core stream to stop
* @hext_stream: HD-audio ext core stream to stop
*/
*/
void
snd_hdac_ext_
link_
stream_clear
(
struct
hdac_ext_stream
*
hext_stream
)
void
snd_hdac_ext_stream_clear
(
struct
hdac_ext_stream
*
hext_stream
)
{
{
snd_hdac_updatel
(
hext_stream
->
pplc_addr
,
AZX_REG_PPLCCTL
,
AZX_PPLCCTL_RUN
,
0
);
snd_hdac_updatel
(
hext_stream
->
pplc_addr
,
AZX_REG_PPLCCTL
,
AZX_PPLCCTL_RUN
,
0
);
}
}
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_
link_
stream_clear
);
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_stream_clear
);
/**
/**
* snd_hdac_ext_
link_
stream_reset - reset a stream
* snd_hdac_ext_stream_reset - reset a stream
* @hext_stream: HD-audio ext core stream to reset
* @hext_stream: HD-audio ext core stream to reset
*/
*/
void
snd_hdac_ext_
link_
stream_reset
(
struct
hdac_ext_stream
*
hext_stream
)
void
snd_hdac_ext_stream_reset
(
struct
hdac_ext_stream
*
hext_stream
)
{
{
unsigned
char
val
;
unsigned
char
val
;
int
timeout
;
int
timeout
;
snd_hdac_ext_
link_
stream_clear
(
hext_stream
);
snd_hdac_ext_stream_clear
(
hext_stream
);
snd_hdac_updatel
(
hext_stream
->
pplc_addr
,
AZX_REG_PPLCCTL
,
snd_hdac_updatel
(
hext_stream
->
pplc_addr
,
AZX_REG_PPLCCTL
,
AZX_PPLCCTL_STRST
,
AZX_PPLCCTL_STRST
);
AZX_PPLCCTL_STRST
,
AZX_PPLCCTL_STRST
);
...
@@ -196,20 +182,20 @@ void snd_hdac_ext_link_stream_reset(struct hdac_ext_stream *hext_stream)
...
@@ -196,20 +182,20 @@ void snd_hdac_ext_link_stream_reset(struct hdac_ext_stream *hext_stream)
}
while
(
--
timeout
);
}
while
(
--
timeout
);
}
}
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_
link_
stream_reset
);
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_stream_reset
);
/**
/**
* snd_hdac_ext_
link_
stream_setup - set up the SD for streaming
* snd_hdac_ext_stream_setup - set up the SD for streaming
* @hext_stream: HD-audio ext core stream to set up
* @hext_stream: HD-audio ext core stream to set up
* @fmt: stream format
* @fmt: stream format
*/
*/
int
snd_hdac_ext_
link_
stream_setup
(
struct
hdac_ext_stream
*
hext_stream
,
int
fmt
)
int
snd_hdac_ext_stream_setup
(
struct
hdac_ext_stream
*
hext_stream
,
int
fmt
)
{
{
struct
hdac_stream
*
hstream
=
&
hext_stream
->
hstream
;
struct
hdac_stream
*
hstream
=
&
hext_stream
->
hstream
;
unsigned
int
val
;
unsigned
int
val
;
/* make sure the run bit is zero for SD */
/* make sure the run bit is zero for SD */
snd_hdac_ext_
link_
stream_clear
(
hext_stream
);
snd_hdac_ext_stream_clear
(
hext_stream
);
/* program the stream_tag */
/* program the stream_tag */
val
=
readl
(
hext_stream
->
pplc_addr
+
AZX_REG_PPLCCTL
);
val
=
readl
(
hext_stream
->
pplc_addr
+
AZX_REG_PPLCCTL
);
val
=
(
val
&
~
AZX_PPLCCTL_STRM_MASK
)
|
val
=
(
val
&
~
AZX_PPLCCTL_STRM_MASK
)
|
...
@@ -221,35 +207,11 @@ int snd_hdac_ext_link_stream_setup(struct hdac_ext_stream *hext_stream, int fmt)
...
@@ -221,35 +207,11 @@ int snd_hdac_ext_link_stream_setup(struct hdac_ext_stream *hext_stream, int fmt)
return
0
;
return
0
;
}
}
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_link_stream_setup
);
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_stream_setup
);
/**
* snd_hdac_ext_link_set_stream_id - maps stream id to link output
* @link: HD-audio ext link to set up
* @stream: stream id
*/
void
snd_hdac_ext_link_set_stream_id
(
struct
hdac_ext_link
*
link
,
int
stream
)
{
snd_hdac_updatew
(
link
->
ml_addr
,
AZX_REG_ML_LOSIDV
,
(
1
<<
stream
),
1
<<
stream
);
}
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_link_set_stream_id
);
/**
* snd_hdac_ext_link_clear_stream_id - maps stream id to link output
* @link: HD-audio ext link to set up
* @stream: stream id
*/
void
snd_hdac_ext_link_clear_stream_id
(
struct
hdac_ext_link
*
link
,
int
stream
)
{
snd_hdac_updatew
(
link
->
ml_addr
,
AZX_REG_ML_LOSIDV
,
(
1
<<
stream
),
0
);
}
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_bus
*
bus
,
hdac_ext_link_
dma_
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
*
hstream
=
NULL
;
struct
hdac_stream
*
hstream
=
NULL
;
...
@@ -284,8 +246,8 @@ hdac_ext_link_stream_assign(struct hdac_bus *bus,
...
@@ -284,8 +246,8 @@ hdac_ext_link_stream_assign(struct hdac_bus *bus,
}
}
static
struct
hdac_ext_stream
*
static
struct
hdac_ext_stream
*
hdac_ext_host_stream_assign
(
struct
hdac_bus
*
bus
,
hdac_ext_host_
dma_
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
*
hstream
=
NULL
;
struct
hdac_stream
*
hstream
=
NULL
;
...
@@ -353,10 +315,10 @@ struct hdac_ext_stream *snd_hdac_ext_stream_assign(struct hdac_bus *bus,
...
@@ -353,10 +315,10 @@ struct hdac_ext_stream *snd_hdac_ext_stream_assign(struct hdac_bus *bus,
return
hext_stream
;
return
hext_stream
;
case
HDAC_EXT_STREAM_TYPE_HOST
:
case
HDAC_EXT_STREAM_TYPE_HOST
:
return
hdac_ext_host_stream_assign
(
bus
,
substream
);
return
hdac_ext_host_
dma_
stream_assign
(
bus
,
substream
);
case
HDAC_EXT_STREAM_TYPE_LINK
:
case
HDAC_EXT_STREAM_TYPE_LINK
:
return
hdac_ext_link_stream_assign
(
bus
,
substream
);
return
hdac_ext_link_
dma_
stream_assign
(
bus
,
substream
);
default:
default:
return
NULL
;
return
NULL
;
...
@@ -405,128 +367,3 @@ void snd_hdac_ext_stream_release(struct hdac_ext_stream *hext_stream, int type)
...
@@ -405,128 +367,3 @@ void snd_hdac_ext_stream_release(struct hdac_ext_stream *hext_stream, int type)
}
}
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_stream_release
);
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_stream_release
);
/**
* snd_hdac_ext_stream_spbcap_enable - enable SPIB for a stream
* @bus: HD-audio core bus
* @enable: flag to enable/disable SPIB
* @index: stream index for which SPIB need to be enabled
*/
void
snd_hdac_ext_stream_spbcap_enable
(
struct
hdac_bus
*
bus
,
bool
enable
,
int
index
)
{
u32
mask
=
0
;
if
(
!
bus
->
spbcap
)
{
dev_err
(
bus
->
dev
,
"Address of SPB capability is NULL
\n
"
);
return
;
}
mask
|=
(
1
<<
index
);
if
(
enable
)
snd_hdac_updatel
(
bus
->
spbcap
,
AZX_REG_SPB_SPBFCCTL
,
mask
,
mask
);
else
snd_hdac_updatel
(
bus
->
spbcap
,
AZX_REG_SPB_SPBFCCTL
,
mask
,
0
);
}
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_stream_spbcap_enable
);
/**
* snd_hdac_ext_stream_set_spib - sets the spib value of a stream
* @bus: HD-audio core bus
* @hext_stream: hdac_ext_stream
* @value: spib value to set
*/
int
snd_hdac_ext_stream_set_spib
(
struct
hdac_bus
*
bus
,
struct
hdac_ext_stream
*
hext_stream
,
u32
value
)
{
if
(
!
bus
->
spbcap
)
{
dev_err
(
bus
->
dev
,
"Address of SPB capability is NULL
\n
"
);
return
-
EINVAL
;
}
writel
(
value
,
hext_stream
->
spib_addr
);
return
0
;
}
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_stream_set_spib
);
/**
* snd_hdac_ext_stream_get_spbmaxfifo - gets the spib value of a stream
* @bus: HD-audio core bus
* @hext_stream: hdac_ext_stream
*
* Return maxfifo for the stream
*/
int
snd_hdac_ext_stream_get_spbmaxfifo
(
struct
hdac_bus
*
bus
,
struct
hdac_ext_stream
*
hext_stream
)
{
if
(
!
bus
->
spbcap
)
{
dev_err
(
bus
->
dev
,
"Address of SPB capability is NULL
\n
"
);
return
-
EINVAL
;
}
return
readl
(
hext_stream
->
fifo_addr
);
}
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_stream_get_spbmaxfifo
);
/**
* snd_hdac_ext_stream_drsm_enable - enable DMA resume for a stream
* @bus: HD-audio core bus
* @enable: flag to enable/disable DRSM
* @index: stream index for which DRSM need to be enabled
*/
void
snd_hdac_ext_stream_drsm_enable
(
struct
hdac_bus
*
bus
,
bool
enable
,
int
index
)
{
u32
mask
=
0
;
if
(
!
bus
->
drsmcap
)
{
dev_err
(
bus
->
dev
,
"Address of DRSM capability is NULL
\n
"
);
return
;
}
mask
|=
(
1
<<
index
);
if
(
enable
)
snd_hdac_updatel
(
bus
->
drsmcap
,
AZX_REG_DRSM_CTL
,
mask
,
mask
);
else
snd_hdac_updatel
(
bus
->
drsmcap
,
AZX_REG_DRSM_CTL
,
mask
,
0
);
}
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_stream_drsm_enable
);
/**
* snd_hdac_ext_stream_set_dpibr - sets the dpibr value of a stream
* @bus: HD-audio core bus
* @hext_stream: hdac_ext_stream
* @value: dpib value to set
*/
int
snd_hdac_ext_stream_set_dpibr
(
struct
hdac_bus
*
bus
,
struct
hdac_ext_stream
*
hext_stream
,
u32
value
)
{
if
(
!
bus
->
drsmcap
)
{
dev_err
(
bus
->
dev
,
"Address of DRSM capability is NULL
\n
"
);
return
-
EINVAL
;
}
writel
(
value
,
hext_stream
->
dpibr_addr
);
return
0
;
}
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_stream_set_dpibr
);
/**
* snd_hdac_ext_stream_set_lpib - sets the lpib value of a stream
* @hext_stream: hdac_ext_stream
* @value: lpib value to set
*/
int
snd_hdac_ext_stream_set_lpib
(
struct
hdac_ext_stream
*
hext_stream
,
u32
value
)
{
snd_hdac_stream_writel
(
&
hext_stream
->
hstream
,
SD_LPIB
,
value
);
return
0
;
}
EXPORT_SYMBOL_GPL
(
snd_hdac_ext_stream_set_lpib
);
sound/hda/hdac_stream.c
View file @
a293e8ec
...
@@ -103,6 +103,20 @@ void snd_hdac_stream_init(struct hdac_bus *bus, struct hdac_stream *azx_dev,
...
@@ -103,6 +103,20 @@ void snd_hdac_stream_init(struct hdac_bus *bus, struct hdac_stream *azx_dev,
azx_dev
->
stream_tag
=
tag
;
azx_dev
->
stream_tag
=
tag
;
snd_hdac_dsp_lock_init
(
azx_dev
);
snd_hdac_dsp_lock_init
(
azx_dev
);
list_add_tail
(
&
azx_dev
->
list
,
&
bus
->
stream_list
);
list_add_tail
(
&
azx_dev
->
list
,
&
bus
->
stream_list
);
if
(
bus
->
spbcap
)
{
azx_dev
->
spib_addr
=
bus
->
spbcap
+
AZX_SPB_BASE
+
AZX_SPB_INTERVAL
*
idx
+
AZX_SPB_SPIB
;
azx_dev
->
fifo_addr
=
bus
->
spbcap
+
AZX_SPB_BASE
+
AZX_SPB_INTERVAL
*
idx
+
AZX_SPB_MAXFIFO
;
}
if
(
bus
->
drsmcap
)
azx_dev
->
dpibr_addr
=
bus
->
drsmcap
+
AZX_DRSM_BASE
+
AZX_DRSM_INTERVAL
*
idx
;
}
}
EXPORT_SYMBOL_GPL
(
snd_hdac_stream_init
);
EXPORT_SYMBOL_GPL
(
snd_hdac_stream_init
);
...
@@ -718,6 +732,128 @@ void snd_hdac_stream_sync(struct hdac_stream *azx_dev, bool start,
...
@@ -718,6 +732,128 @@ void snd_hdac_stream_sync(struct hdac_stream *azx_dev, bool start,
}
}
EXPORT_SYMBOL_GPL
(
snd_hdac_stream_sync
);
EXPORT_SYMBOL_GPL
(
snd_hdac_stream_sync
);
/**
* snd_hdac_stream_spbcap_enable - enable SPIB for a stream
* @bus: HD-audio core bus
* @enable: flag to enable/disable SPIB
* @index: stream index for which SPIB need to be enabled
*/
void
snd_hdac_stream_spbcap_enable
(
struct
hdac_bus
*
bus
,
bool
enable
,
int
index
)
{
u32
mask
=
0
;
if
(
!
bus
->
spbcap
)
{
dev_err
(
bus
->
dev
,
"Address of SPB capability is NULL
\n
"
);
return
;
}
mask
|=
(
1
<<
index
);
if
(
enable
)
snd_hdac_updatel
(
bus
->
spbcap
,
AZX_REG_SPB_SPBFCCTL
,
mask
,
mask
);
else
snd_hdac_updatel
(
bus
->
spbcap
,
AZX_REG_SPB_SPBFCCTL
,
mask
,
0
);
}
EXPORT_SYMBOL_GPL
(
snd_hdac_stream_spbcap_enable
);
/**
* snd_hdac_stream_set_spib - sets the spib value of a stream
* @bus: HD-audio core bus
* @azx_dev: hdac_stream
* @value: spib value to set
*/
int
snd_hdac_stream_set_spib
(
struct
hdac_bus
*
bus
,
struct
hdac_stream
*
azx_dev
,
u32
value
)
{
if
(
!
bus
->
spbcap
)
{
dev_err
(
bus
->
dev
,
"Address of SPB capability is NULL
\n
"
);
return
-
EINVAL
;
}
writel
(
value
,
azx_dev
->
spib_addr
);
return
0
;
}
EXPORT_SYMBOL_GPL
(
snd_hdac_stream_set_spib
);
/**
* snd_hdac_stream_get_spbmaxfifo - gets the spib value of a stream
* @bus: HD-audio core bus
* @azx_dev: hdac_stream
*
* Return maxfifo for the stream
*/
int
snd_hdac_stream_get_spbmaxfifo
(
struct
hdac_bus
*
bus
,
struct
hdac_stream
*
azx_dev
)
{
if
(
!
bus
->
spbcap
)
{
dev_err
(
bus
->
dev
,
"Address of SPB capability is NULL
\n
"
);
return
-
EINVAL
;
}
return
readl
(
azx_dev
->
fifo_addr
);
}
EXPORT_SYMBOL_GPL
(
snd_hdac_stream_get_spbmaxfifo
);
/**
* snd_hdac_stream_drsm_enable - enable DMA resume for a stream
* @bus: HD-audio core bus
* @enable: flag to enable/disable DRSM
* @index: stream index for which DRSM need to be enabled
*/
void
snd_hdac_stream_drsm_enable
(
struct
hdac_bus
*
bus
,
bool
enable
,
int
index
)
{
u32
mask
=
0
;
if
(
!
bus
->
drsmcap
)
{
dev_err
(
bus
->
dev
,
"Address of DRSM capability is NULL
\n
"
);
return
;
}
mask
|=
(
1
<<
index
);
if
(
enable
)
snd_hdac_updatel
(
bus
->
drsmcap
,
AZX_REG_DRSM_CTL
,
mask
,
mask
);
else
snd_hdac_updatel
(
bus
->
drsmcap
,
AZX_REG_DRSM_CTL
,
mask
,
0
);
}
EXPORT_SYMBOL_GPL
(
snd_hdac_stream_drsm_enable
);
/**
* snd_hdac_stream_set_dpibr - sets the dpibr value of a stream
* @bus: HD-audio core bus
* @azx_dev: hdac_stream
* @value: dpib value to set
*/
int
snd_hdac_stream_set_dpibr
(
struct
hdac_bus
*
bus
,
struct
hdac_stream
*
azx_dev
,
u32
value
)
{
if
(
!
bus
->
drsmcap
)
{
dev_err
(
bus
->
dev
,
"Address of DRSM capability is NULL
\n
"
);
return
-
EINVAL
;
}
writel
(
value
,
azx_dev
->
dpibr_addr
);
return
0
;
}
EXPORT_SYMBOL_GPL
(
snd_hdac_stream_set_dpibr
);
/**
* snd_hdac_stream_set_lpib - sets the lpib value of a stream
* @azx_dev: hdac_stream
* @value: lpib value to set
*/
int
snd_hdac_stream_set_lpib
(
struct
hdac_stream
*
azx_dev
,
u32
value
)
{
snd_hdac_stream_writel
(
azx_dev
,
SD_LPIB
,
value
);
return
0
;
}
EXPORT_SYMBOL_GPL
(
snd_hdac_stream_set_lpib
);
#ifdef CONFIG_SND_HDA_DSP_LOADER
#ifdef CONFIG_SND_HDA_DSP_LOADER
/**
/**
* snd_hdac_dsp_prepare - prepare for DSP loading
* snd_hdac_dsp_prepare - prepare for DSP loading
...
...
sound/soc/codecs/hda.c
View file @
a293e8ec
...
@@ -181,7 +181,7 @@ static int hda_codec_probe(struct snd_soc_component *component)
...
@@ -181,7 +181,7 @@ static int hda_codec_probe(struct snd_soc_component *component)
!
pm_runtime_status_suspended
(
&
hdev
->
dev
));
!
pm_runtime_status_suspended
(
&
hdev
->
dev
));
#endif
#endif
hlink
=
snd_hdac_ext_bus_
link_at
(
bus
,
hdev
->
addr
);
hlink
=
snd_hdac_ext_bus_
get_hlink_by_addr
(
bus
,
hdev
->
addr
);
if
(
!
hlink
)
{
if
(
!
hlink
)
{
dev_err
(
&
hdev
->
dev
,
"hdac link not found
\n
"
);
dev_err
(
&
hdev
->
dev
,
"hdac link not found
\n
"
);
return
-
EIO
;
return
-
EIO
;
...
@@ -289,7 +289,7 @@ static void hda_codec_remove(struct snd_soc_component *component)
...
@@ -289,7 +289,7 @@ static void hda_codec_remove(struct snd_soc_component *component)
if
(
hda_codec_is_display
(
codec
))
if
(
hda_codec_is_display
(
codec
))
snd_hdac_display_power
(
bus
,
hdev
->
addr
,
false
);
snd_hdac_display_power
(
bus
,
hdev
->
addr
,
false
);
hlink
=
snd_hdac_ext_bus_
link_at
(
bus
,
hdev
->
addr
);
hlink
=
snd_hdac_ext_bus_
get_hlink_by_addr
(
bus
,
hdev
->
addr
);
if
(
hlink
)
if
(
hlink
)
snd_hdac_ext_bus_link_put
(
bus
,
hlink
);
snd_hdac_ext_bus_link_put
(
bus
,
hlink
);
/*
/*
...
...
sound/soc/codecs/hdac_hda.c
View file @
a293e8ec
...
@@ -400,7 +400,7 @@ static int hdac_hda_codec_probe(struct snd_soc_component *component)
...
@@ -400,7 +400,7 @@ static int hdac_hda_codec_probe(struct snd_soc_component *component)
hda_codec_patch_t
patch
;
hda_codec_patch_t
patch
;
int
ret
;
int
ret
;
hlink
=
snd_hdac_ext_bus_get_
link
(
hdev
->
bus
,
dev_name
(
&
hdev
->
dev
));
hlink
=
snd_hdac_ext_bus_get_
hlink_by_name
(
hdev
->
bus
,
dev_name
(
&
hdev
->
dev
));
if
(
!
hlink
)
{
if
(
!
hlink
)
{
dev_err
(
&
hdev
->
dev
,
"hdac link not found
\n
"
);
dev_err
(
&
hdev
->
dev
,
"hdac link not found
\n
"
);
return
-
EIO
;
return
-
EIO
;
...
@@ -516,7 +516,7 @@ static void hdac_hda_codec_remove(struct snd_soc_component *component)
...
@@ -516,7 +516,7 @@ static void hdac_hda_codec_remove(struct snd_soc_component *component)
struct
hda_codec
*
codec
=
hda_pvt
->
codec
;
struct
hda_codec
*
codec
=
hda_pvt
->
codec
;
struct
hdac_ext_link
*
hlink
=
NULL
;
struct
hdac_ext_link
*
hlink
=
NULL
;
hlink
=
snd_hdac_ext_bus_get_
link
(
hdev
->
bus
,
dev_name
(
&
hdev
->
dev
));
hlink
=
snd_hdac_ext_bus_get_
hlink_by_name
(
hdev
->
bus
,
dev_name
(
&
hdev
->
dev
));
if
(
!
hlink
)
{
if
(
!
hlink
)
{
dev_err
(
&
hdev
->
dev
,
"hdac link not found
\n
"
);
dev_err
(
&
hdev
->
dev
,
"hdac link not found
\n
"
);
return
;
return
;
...
@@ -584,7 +584,7 @@ static int hdac_hda_dev_probe(struct hdac_device *hdev)
...
@@ -584,7 +584,7 @@ static int hdac_hda_dev_probe(struct hdac_device *hdev)
int
ret
;
int
ret
;
/* hold the ref while we probe */
/* hold the ref while we probe */
hlink
=
snd_hdac_ext_bus_get_
link
(
hdev
->
bus
,
dev_name
(
&
hdev
->
dev
));
hlink
=
snd_hdac_ext_bus_get_
hlink_by_name
(
hdev
->
bus
,
dev_name
(
&
hdev
->
dev
));
if
(
!
hlink
)
{
if
(
!
hlink
)
{
dev_err
(
&
hdev
->
dev
,
"hdac link not found
\n
"
);
dev_err
(
&
hdev
->
dev
,
"hdac link not found
\n
"
);
return
-
EIO
;
return
-
EIO
;
...
...
sound/soc/codecs/hdac_hdmi.c
View file @
a293e8ec
...
@@ -1967,7 +1967,7 @@ static int hdmi_codec_probe(struct snd_soc_component *component)
...
@@ -1967,7 +1967,7 @@ static int hdmi_codec_probe(struct snd_soc_component *component)
* hold the ref while we probe, also no need to drop the ref on
* hold the ref while we probe, also no need to drop the ref on
* exit, we call pm_runtime_suspend() so that will do for us
* exit, we call pm_runtime_suspend() so that will do for us
*/
*/
hlink
=
snd_hdac_ext_bus_get_
link
(
hdev
->
bus
,
dev_name
(
&
hdev
->
dev
));
hlink
=
snd_hdac_ext_bus_get_
hlink_by_name
(
hdev
->
bus
,
dev_name
(
&
hdev
->
dev
));
if
(
!
hlink
)
{
if
(
!
hlink
)
{
dev_err
(
&
hdev
->
dev
,
"hdac link not found
\n
"
);
dev_err
(
&
hdev
->
dev
,
"hdac link not found
\n
"
);
return
-
EIO
;
return
-
EIO
;
...
@@ -2144,7 +2144,7 @@ static int hdac_hdmi_dev_probe(struct hdac_device *hdev)
...
@@ -2144,7 +2144,7 @@ static int hdac_hdmi_dev_probe(struct hdac_device *hdev)
const
struct
hda_device_id
*
hdac_id
=
hdac_get_device_id
(
hdev
,
hdrv
);
const
struct
hda_device_id
*
hdac_id
=
hdac_get_device_id
(
hdev
,
hdrv
);
/* hold the ref while we probe */
/* hold the ref while we probe */
hlink
=
snd_hdac_ext_bus_get_
link
(
hdev
->
bus
,
dev_name
(
&
hdev
->
dev
));
hlink
=
snd_hdac_ext_bus_get_
hlink_by_name
(
hdev
->
bus
,
dev_name
(
&
hdev
->
dev
));
if
(
!
hlink
)
{
if
(
!
hlink
)
{
dev_err
(
&
hdev
->
dev
,
"hdac link not found
\n
"
);
dev_err
(
&
hdev
->
dev
,
"hdac link not found
\n
"
);
return
-
EIO
;
return
-
EIO
;
...
@@ -2244,7 +2244,7 @@ static int hdac_hdmi_runtime_suspend(struct device *dev)
...
@@ -2244,7 +2244,7 @@ static int hdac_hdmi_runtime_suspend(struct device *dev)
snd_hdac_codec_read
(
hdev
,
hdev
->
afg
,
0
,
AC_VERB_SET_POWER_STATE
,
snd_hdac_codec_read
(
hdev
,
hdev
->
afg
,
0
,
AC_VERB_SET_POWER_STATE
,
AC_PWRST_D3
);
AC_PWRST_D3
);
hlink
=
snd_hdac_ext_bus_get_
link
(
bus
,
dev_name
(
dev
));
hlink
=
snd_hdac_ext_bus_get_
hlink_by_name
(
bus
,
dev_name
(
dev
));
if
(
!
hlink
)
{
if
(
!
hlink
)
{
dev_err
(
dev
,
"hdac link not found
\n
"
);
dev_err
(
dev
,
"hdac link not found
\n
"
);
return
-
EIO
;
return
-
EIO
;
...
@@ -2270,7 +2270,7 @@ static int hdac_hdmi_runtime_resume(struct device *dev)
...
@@ -2270,7 +2270,7 @@ static int hdac_hdmi_runtime_resume(struct device *dev)
if
(
!
bus
)
if
(
!
bus
)
return
0
;
return
0
;
hlink
=
snd_hdac_ext_bus_get_
link
(
bus
,
dev_name
(
dev
));
hlink
=
snd_hdac_ext_bus_get_
hlink_by_name
(
bus
,
dev_name
(
dev
));
if
(
!
hlink
)
{
if
(
!
hlink
)
{
dev_err
(
dev
,
"hdac link not found
\n
"
);
dev_err
(
dev
,
"hdac link not found
\n
"
);
return
-
EIO
;
return
-
EIO
;
...
...
sound/soc/intel/avs/core.c
View file @
a293e8ec
...
@@ -504,7 +504,7 @@ static void avs_pci_remove(struct pci_dev *pci)
...
@@ -504,7 +504,7 @@ static void avs_pci_remove(struct pci_dev *pci)
snd_hdac_bus_free_stream_pages
(
bus
);
snd_hdac_bus_free_stream_pages
(
bus
);
snd_hdac_ext_stream_free_all
(
bus
);
snd_hdac_ext_stream_free_all
(
bus
);
/* reverse ml_capabilities */
/* reverse ml_capabilities */
snd_hdac_link_free_all
(
bus
);
snd_hdac_
ext_
link_free_all
(
bus
);
snd_hdac_ext_bus_exit
(
bus
);
snd_hdac_ext_bus_exit
(
bus
);
avs_dsp_core_disable
(
adev
,
GENMASK
(
adev
->
hw_cfg
.
dsp_cores
-
1
,
0
));
avs_dsp_core_disable
(
adev
,
GENMASK
(
adev
->
hw_cfg
.
dsp_cores
-
1
,
0
));
...
...
sound/soc/intel/avs/loader.c
View file @
a293e8ec
...
@@ -369,8 +369,8 @@ int avs_hda_load_basefw(struct avs_dev *adev, struct firmware *fw)
...
@@ -369,8 +369,8 @@ int avs_hda_load_basefw(struct avs_dev *adev, struct firmware *fw)
goto
release_stream
;
goto
release_stream
;
/* enable SPIB for hda stream */
/* enable SPIB for hda stream */
snd_hdac_
ext_
stream_spbcap_enable
(
bus
,
true
,
hstream
->
index
);
snd_hdac_stream_spbcap_enable
(
bus
,
true
,
hstream
->
index
);
ret
=
snd_hdac_
ext_stream_set_spib
(
bus
,
e
stream
,
fw
->
size
);
ret
=
snd_hdac_
stream_set_spib
(
bus
,
h
stream
,
fw
->
size
);
if
(
ret
)
if
(
ret
)
goto
cleanup_resources
;
goto
cleanup_resources
;
...
@@ -400,8 +400,8 @@ int avs_hda_load_basefw(struct avs_dev *adev, struct firmware *fw)
...
@@ -400,8 +400,8 @@ int avs_hda_load_basefw(struct avs_dev *adev, struct firmware *fw)
cleanup_resources:
cleanup_resources:
/* disable SPIB for hda stream */
/* disable SPIB for hda stream */
snd_hdac_
ext_
stream_spbcap_enable
(
bus
,
false
,
hstream
->
index
);
snd_hdac_stream_spbcap_enable
(
bus
,
false
,
hstream
->
index
);
snd_hdac_
ext_stream_set_spib
(
bus
,
e
stream
,
0
);
snd_hdac_
stream_set_spib
(
bus
,
h
stream
,
0
);
snd_hdac_dsp_cleanup
(
hstream
,
&
dmab
);
snd_hdac_dsp_cleanup
(
hstream
,
&
dmab
);
release_stream:
release_stream:
...
@@ -436,8 +436,8 @@ int avs_hda_load_library(struct avs_dev *adev, struct firmware *lib, u32 id)
...
@@ -436,8 +436,8 @@ int avs_hda_load_library(struct avs_dev *adev, struct firmware *lib, u32 id)
goto
release_stream
;
goto
release_stream
;
/* enable SPIB for hda stream */
/* enable SPIB for hda stream */
snd_hdac_
ext_
stream_spbcap_enable
(
bus
,
true
,
stream
->
index
);
snd_hdac_stream_spbcap_enable
(
bus
,
true
,
stream
->
index
);
snd_hdac_
ext_stream_set_spib
(
bus
,
e
stream
,
lib
->
size
);
snd_hdac_
stream_set_spib
(
bus
,
stream
,
lib
->
size
);
memcpy
(
dmab
.
area
,
lib
->
data
,
lib
->
size
);
memcpy
(
dmab
.
area
,
lib
->
data
,
lib
->
size
);
...
@@ -451,8 +451,8 @@ int avs_hda_load_library(struct avs_dev *adev, struct firmware *lib, u32 id)
...
@@ -451,8 +451,8 @@ int avs_hda_load_library(struct avs_dev *adev, struct firmware *lib, u32 id)
}
}
/* disable SPIB for hda stream */
/* disable SPIB for hda stream */
snd_hdac_
ext_
stream_spbcap_enable
(
bus
,
false
,
stream
->
index
);
snd_hdac_stream_spbcap_enable
(
bus
,
false
,
stream
->
index
);
snd_hdac_
ext_stream_set_spib
(
bus
,
e
stream
,
0
);
snd_hdac_
stream_set_spib
(
bus
,
stream
,
0
);
snd_hdac_dsp_cleanup
(
stream
,
&
dmab
);
snd_hdac_dsp_cleanup
(
stream
,
&
dmab
);
release_stream:
release_stream:
...
...
sound/soc/intel/avs/pcm.c
View file @
a293e8ec
...
@@ -292,12 +292,12 @@ static int avs_dai_hda_be_hw_free(struct snd_pcm_substream *substream, struct sn
...
@@ -292,12 +292,12 @@ static int avs_dai_hda_be_hw_free(struct snd_pcm_substream *substream, struct sn
/* clear link <-> stream mapping */
/* clear link <-> stream mapping */
codec
=
dev_to_hda_codec
(
asoc_rtd_to_codec
(
rtd
,
0
)
->
dev
);
codec
=
dev_to_hda_codec
(
asoc_rtd_to_codec
(
rtd
,
0
)
->
dev
);
link
=
snd_hdac_ext_bus_
link_at
(
&
codec
->
bus
->
core
,
codec
->
core
.
addr
);
link
=
snd_hdac_ext_bus_
get_hlink_by_addr
(
&
codec
->
bus
->
core
,
codec
->
core
.
addr
);
if
(
!
link
)
if
(
!
link
)
return
-
EINVAL
;
return
-
EINVAL
;
if
(
substream
->
stream
==
SNDRV_PCM_STREAM_PLAYBACK
)
if
(
substream
->
stream
==
SNDRV_PCM_STREAM_PLAYBACK
)
snd_hdac_ext_link_clear_stream_id
(
link
,
hdac_stream
(
link_stream
)
->
stream_tag
);
snd_hdac_ext_
bus_
link_clear_stream_id
(
link
,
hdac_stream
(
link_stream
)
->
stream_tag
);
return
0
;
return
0
;
}
}
...
@@ -322,15 +322,15 @@ static int avs_dai_hda_be_prepare(struct snd_pcm_substream *substream, struct sn
...
@@ -322,15 +322,15 @@ static int avs_dai_hda_be_prepare(struct snd_pcm_substream *substream, struct sn
runtime
->
sample_bits
,
0
);
runtime
->
sample_bits
,
0
);
snd_hdac_ext_stream_decouple
(
bus
,
link_stream
,
true
);
snd_hdac_ext_stream_decouple
(
bus
,
link_stream
,
true
);
snd_hdac_ext_
link_
stream_reset
(
link_stream
);
snd_hdac_ext_stream_reset
(
link_stream
);
snd_hdac_ext_
link_
stream_setup
(
link_stream
,
format_val
);
snd_hdac_ext_stream_setup
(
link_stream
,
format_val
);
link
=
snd_hdac_ext_bus_
link_at
(
bus
,
codec
->
core
.
addr
);
link
=
snd_hdac_ext_bus_
get_hlink_by_addr
(
bus
,
codec
->
core
.
addr
);
if
(
!
link
)
if
(
!
link
)
return
-
EINVAL
;
return
-
EINVAL
;
if
(
substream
->
stream
==
SNDRV_PCM_STREAM_PLAYBACK
)
if
(
substream
->
stream
==
SNDRV_PCM_STREAM_PLAYBACK
)
snd_hdac_ext_link_set_stream_id
(
link
,
hdac_stream
(
link_stream
)
->
stream_tag
);
snd_hdac_ext_
bus_
link_set_stream_id
(
link
,
hdac_stream
(
link_stream
)
->
stream_tag
);
ret
=
avs_dai_prepare
(
to_avs_dev
(
dai
->
dev
),
substream
,
dai
);
ret
=
avs_dai_prepare
(
to_avs_dev
(
dai
->
dev
),
substream
,
dai
);
if
(
ret
)
if
(
ret
)
...
@@ -355,7 +355,7 @@ static int avs_dai_hda_be_trigger(struct snd_pcm_substream *substream, int cmd,
...
@@ -355,7 +355,7 @@ static int avs_dai_hda_be_trigger(struct snd_pcm_substream *substream, int cmd,
switch
(
cmd
)
{
switch
(
cmd
)
{
case
SNDRV_PCM_TRIGGER_START
:
case
SNDRV_PCM_TRIGGER_START
:
case
SNDRV_PCM_TRIGGER_PAUSE_RELEASE
:
case
SNDRV_PCM_TRIGGER_PAUSE_RELEASE
:
snd_hdac_ext_
link_
stream_start
(
link_stream
);
snd_hdac_ext_stream_start
(
link_stream
);
ret
=
avs_path_run
(
data
->
path
,
AVS_TPLG_TRIGGER_AUTO
);
ret
=
avs_path_run
(
data
->
path
,
AVS_TPLG_TRIGGER_AUTO
);
if
(
ret
<
0
)
if
(
ret
<
0
)
...
@@ -368,7 +368,7 @@ static int avs_dai_hda_be_trigger(struct snd_pcm_substream *substream, int cmd,
...
@@ -368,7 +368,7 @@ static int avs_dai_hda_be_trigger(struct snd_pcm_substream *substream, int cmd,
if
(
ret
<
0
)
if
(
ret
<
0
)
dev_err
(
dai
->
dev
,
"pause BE path failed: %d
\n
"
,
ret
);
dev_err
(
dai
->
dev
,
"pause BE path failed: %d
\n
"
,
ret
);
snd_hdac_ext_
link_
stream_clear
(
link_stream
);
snd_hdac_ext_stream_clear
(
link_stream
);
if
(
cmd
==
SNDRV_PCM_TRIGGER_STOP
)
{
if
(
cmd
==
SNDRV_PCM_TRIGGER_STOP
)
{
ret
=
avs_path_reset
(
data
->
path
);
ret
=
avs_path_reset
(
data
->
path
);
...
...
sound/soc/intel/skylake/skl-messages.c
View file @
a293e8ec
...
@@ -53,17 +53,15 @@ static int skl_dsp_setup_spib(struct device *dev, unsigned int size,
...
@@ -53,17 +53,15 @@ static int skl_dsp_setup_spib(struct device *dev, unsigned int size,
struct
hdac_bus
*
bus
=
dev_get_drvdata
(
dev
);
struct
hdac_bus
*
bus
=
dev_get_drvdata
(
dev
);
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
;
if
(
!
stream
)
if
(
!
stream
)
return
-
EINVAL
;
return
-
EINVAL
;
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
(
bus
,
enable
,
stream
->
index
);
snd_hdac_stream_spbcap_enable
(
bus
,
enable
,
stream
->
index
);
/* set the spib value */
/* set the spib value */
snd_hdac_
ext_stream_set_spib
(
bus
,
e
stream
,
size
);
snd_hdac_
stream_set_spib
(
bus
,
stream
,
size
);
return
0
;
return
0
;
}
}
...
...
sound/soc/intel/skylake/skl-pcm.c
View file @
a293e8ec
...
@@ -190,16 +190,16 @@ int skl_pcm_link_dma_prepare(struct device *dev, struct skl_pipe_params *params)
...
@@ -190,16 +190,16 @@ int skl_pcm_link_dma_prepare(struct device *dev, struct skl_pipe_params *params)
dev_dbg
(
dev
,
"format_val=%d, rate=%d, ch=%d, format=%d
\n
"
,
dev_dbg
(
dev
,
"format_val=%d, rate=%d, ch=%d, format=%d
\n
"
,
format_val
,
params
->
s_freq
,
params
->
ch
,
params
->
format
);
format_val
,
params
->
s_freq
,
params
->
ch
,
params
->
format
);
snd_hdac_ext_
link_
stream_reset
(
stream
);
snd_hdac_ext_stream_reset
(
stream
);
snd_hdac_ext_
link_
stream_setup
(
stream
,
format_val
);
snd_hdac_ext_stream_setup
(
stream
,
format_val
);
stream_tag
=
hstream
->
stream_tag
;
stream_tag
=
hstream
->
stream_tag
;
if
(
stream
->
hstream
.
direction
==
SNDRV_PCM_STREAM_PLAYBACK
)
{
if
(
stream
->
hstream
.
direction
==
SNDRV_PCM_STREAM_PLAYBACK
)
{
list_for_each_entry
(
link
,
&
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_
bus_
link_set_stream_id
(
link
,
stream_tag
);
stream_tag
);
}
}
}
}
...
@@ -467,6 +467,7 @@ static int skl_pcm_trigger(struct snd_pcm_substream *substream, int cmd,
...
@@ -467,6 +467,7 @@ static int skl_pcm_trigger(struct snd_pcm_substream *substream, int cmd,
struct
skl_module_cfg
*
mconfig
;
struct
skl_module_cfg
*
mconfig
;
struct
hdac_bus
*
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
hdac_stream
*
hstream
=
hdac_stream
(
stream
);
struct
snd_soc_dapm_widget
*
w
;
struct
snd_soc_dapm_widget
*
w
;
int
ret
;
int
ret
;
...
@@ -484,11 +485,9 @@ static int skl_pcm_trigger(struct snd_pcm_substream *substream, int cmd,
...
@@ -484,11 +485,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
(
bus
,
true
,
snd_hdac_stream_drsm_enable
(
bus
,
true
,
hstream
->
index
);
hdac_stream
(
stream
)
->
index
);
snd_hdac_stream_set_dpibr
(
bus
,
hstream
,
hstream
->
lpib
);
snd_hdac_ext_stream_set_dpibr
(
bus
,
stream
,
snd_hdac_stream_set_lpib
(
hstream
,
hstream
->
lpib
);
stream
->
lpib
);
snd_hdac_ext_stream_set_lpib
(
stream
,
stream
->
lpib
);
}
}
fallthrough
;
fallthrough
;
...
@@ -520,13 +519,13 @@ static int skl_pcm_trigger(struct snd_pcm_substream *substream, int cmd,
...
@@ -520,13 +519,13 @@ 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
(
bus
->
remap_addr
+
h
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
));
hstream
->
index
));
hstream
->
lpib
=
snd_hdac_stream_get_pos_lpib
(
hstream
);
stream
->
lpib
=
snd_hdac_stream_get_pos_lpib
(
hdac_stream
(
stream
));
snd_hdac_ext_stream_decouple
(
bus
,
stream
,
false
);
snd_hdac_ext_stream_decouple
(
bus
,
stream
,
false
);
}
}
break
;
break
;
...
@@ -558,7 +557,7 @@ static int skl_link_hw_params(struct snd_pcm_substream *substream,
...
@@ -558,7 +557,7 @@ static int skl_link_hw_params(struct snd_pcm_substream *substream,
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
(
bus
,
codec_dai
->
component
->
name
);
link
=
snd_hdac_ext_bus_get_
hlink_by_name
(
bus
,
codec_dai
->
component
->
name
);
if
(
!
link
)
if
(
!
link
)
return
-
EINVAL
;
return
-
EINVAL
;
...
@@ -612,13 +611,13 @@ static int skl_link_pcm_trigger(struct snd_pcm_substream *substream,
...
@@ -612,13 +611,13 @@ static int skl_link_pcm_trigger(struct snd_pcm_substream *substream,
case
SNDRV_PCM_TRIGGER_RESUME
:
case
SNDRV_PCM_TRIGGER_RESUME
:
case
SNDRV_PCM_TRIGGER_START
:
case
SNDRV_PCM_TRIGGER_START
:
case
SNDRV_PCM_TRIGGER_PAUSE_RELEASE
:
case
SNDRV_PCM_TRIGGER_PAUSE_RELEASE
:
snd_hdac_ext_
link_
stream_start
(
link_dev
);
snd_hdac_ext_stream_start
(
link_dev
);
break
;
break
;
case
SNDRV_PCM_TRIGGER_PAUSE_PUSH
:
case
SNDRV_PCM_TRIGGER_PAUSE_PUSH
:
case
SNDRV_PCM_TRIGGER_SUSPEND
:
case
SNDRV_PCM_TRIGGER_SUSPEND
:
case
SNDRV_PCM_TRIGGER_STOP
:
case
SNDRV_PCM_TRIGGER_STOP
:
snd_hdac_ext_
link_
stream_clear
(
link_dev
);
snd_hdac_ext_stream_clear
(
link_dev
);
if
(
cmd
==
SNDRV_PCM_TRIGGER_SUSPEND
)
if
(
cmd
==
SNDRV_PCM_TRIGGER_SUSPEND
)
snd_hdac_ext_stream_decouple
(
bus
,
stream
,
false
);
snd_hdac_ext_stream_decouple
(
bus
,
stream
,
false
);
break
;
break
;
...
@@ -643,13 +642,13 @@ static int skl_link_hw_free(struct snd_pcm_substream *substream,
...
@@ -643,13 +642,13 @@ 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
(
bus
,
asoc_rtd_to_codec
(
rtd
,
0
)
->
component
->
name
);
link
=
snd_hdac_ext_bus_get_
hlink_by_name
(
bus
,
asoc_rtd_to_codec
(
rtd
,
0
)
->
component
->
name
);
if
(
!
link
)
if
(
!
link
)
return
-
EINVAL
;
return
-
EINVAL
;
if
(
substream
->
stream
==
SNDRV_PCM_STREAM_PLAYBACK
)
{
if
(
substream
->
stream
==
SNDRV_PCM_STREAM_PLAYBACK
)
{
stream_tag
=
hdac_stream
(
link_dev
)
->
stream_tag
;
stream_tag
=
hdac_stream
(
link_dev
)
->
stream_tag
;
snd_hdac_ext_link_clear_stream_id
(
link
,
stream_tag
);
snd_hdac_ext_
bus_
link_clear_stream_id
(
link
,
stream_tag
);
}
}
snd_hdac_ext_stream_release
(
link_dev
,
HDAC_EXT_STREAM_TYPE_LINK
);
snd_hdac_ext_stream_release
(
link_dev
,
HDAC_EXT_STREAM_TYPE_LINK
);
...
...
sound/soc/intel/skylake/skl.c
View file @
a293e8ec
...
@@ -445,7 +445,7 @@ static int skl_free(struct hdac_bus *bus)
...
@@ -445,7 +445,7 @@ static int skl_free(struct hdac_bus *bus)
free_irq
(
bus
->
irq
,
(
void
*
)
bus
);
free_irq
(
bus
->
irq
,
(
void
*
)
bus
);
snd_hdac_bus_free_stream_pages
(
bus
);
snd_hdac_bus_free_stream_pages
(
bus
);
snd_hdac_ext_stream_free_all
(
bus
);
snd_hdac_ext_stream_free_all
(
bus
);
snd_hdac_link_free_all
(
bus
);
snd_hdac_
ext_
link_free_all
(
bus
);
if
(
bus
->
remap_addr
)
if
(
bus
->
remap_addr
)
iounmap
(
bus
->
remap_addr
);
iounmap
(
bus
->
remap_addr
);
...
...
sound/soc/sof/intel/hda-dai.c
View file @
a293e8ec
...
@@ -146,19 +146,19 @@ static int hda_link_dma_cleanup(struct snd_pcm_substream *substream,
...
@@ -146,19 +146,19 @@ static int hda_link_dma_cleanup(struct snd_pcm_substream *substream,
struct
hdac_ext_stream
*
hext_stream
=
snd_soc_dai_get_dma_data
(
cpu_dai
,
substream
);
struct
hdac_ext_stream
*
hext_stream
=
snd_soc_dai_get_dma_data
(
cpu_dai
,
substream
);
struct
hdac_bus
*
bus
=
hstream
->
bus
;
struct
hdac_bus
*
bus
=
hstream
->
bus
;
struct
sof_intel_hda_stream
*
hda_stream
;
struct
sof_intel_hda_stream
*
hda_stream
;
struct
hdac_ext_link
*
link
;
struct
hdac_ext_link
*
h
link
;
int
stream_tag
;
int
stream_tag
;
link
=
snd_hdac_ext_bus_get_link
(
bus
,
codec_dai
->
component
->
name
);
hlink
=
snd_hdac_ext_bus_get_hlink_by_name
(
bus
,
codec_dai
->
component
->
name
);
if
(
!
link
)
if
(
!
h
link
)
return
-
EINVAL
;
return
-
EINVAL
;
if
(
trigger_suspend_stop
)
if
(
trigger_suspend_stop
)
snd_hdac_ext_
link_
stream_clear
(
hext_stream
);
snd_hdac_ext_stream_clear
(
hext_stream
);
if
(
substream
->
stream
==
SNDRV_PCM_STREAM_PLAYBACK
)
{
if
(
substream
->
stream
==
SNDRV_PCM_STREAM_PLAYBACK
)
{
stream_tag
=
hdac_stream
(
hext_stream
)
->
stream_tag
;
stream_tag
=
hdac_stream
(
hext_stream
)
->
stream_tag
;
snd_hdac_ext_
link_clear_stream_id
(
link
,
stream_tag
);
snd_hdac_ext_
bus_link_clear_stream_id
(
h
link
,
stream_tag
);
}
}
snd_soc_dai_set_dma_data
(
cpu_dai
,
substream
,
NULL
);
snd_soc_dai_set_dma_data
(
cpu_dai
,
substream
,
NULL
);
snd_hdac_ext_stream_release
(
hext_stream
,
HDAC_EXT_STREAM_TYPE_LINK
);
snd_hdac_ext_stream_release
(
hext_stream
,
HDAC_EXT_STREAM_TYPE_LINK
);
...
@@ -177,10 +177,10 @@ static int hda_link_dma_params(struct hdac_ext_stream *hext_stream,
...
@@ -177,10 +177,10 @@ static int hda_link_dma_params(struct hdac_ext_stream *hext_stream,
struct
hdac_stream
*
hstream
=
&
hext_stream
->
hstream
;
struct
hdac_stream
*
hstream
=
&
hext_stream
->
hstream
;
unsigned
char
stream_tag
=
hstream
->
stream_tag
;
unsigned
char
stream_tag
=
hstream
->
stream_tag
;
struct
hdac_bus
*
bus
=
hstream
->
bus
;
struct
hdac_bus
*
bus
=
hstream
->
bus
;
struct
hdac_ext_link
*
link
;
struct
hdac_ext_link
*
h
link
;
unsigned
int
format_val
;
unsigned
int
format_val
;
snd_hdac_ext_
link_
stream_reset
(
hext_stream
);
snd_hdac_ext_stream_reset
(
hext_stream
);
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
->
format
,
...
@@ -189,13 +189,13 @@ static int hda_link_dma_params(struct hdac_ext_stream *hext_stream,
...
@@ -189,13 +189,13 @@ static int hda_link_dma_params(struct hdac_ext_stream *hext_stream,
dev_dbg
(
bus
->
dev
,
"format_val=%d, rate=%d, ch=%d, format=%d
\n
"
,
dev_dbg
(
bus
->
dev
,
"format_val=%d, rate=%d, ch=%d, format=%d
\n
"
,
format_val
,
params
->
s_freq
,
params
->
ch
,
params
->
format
);
format_val
,
params
->
s_freq
,
params
->
ch
,
params
->
format
);
snd_hdac_ext_
link_
stream_setup
(
hext_stream
,
format_val
);
snd_hdac_ext_stream_setup
(
hext_stream
,
format_val
);
if
(
hext_stream
->
hstream
.
direction
==
SNDRV_PCM_STREAM_PLAYBACK
)
{
if
(
hext_stream
->
hstream
.
direction
==
SNDRV_PCM_STREAM_PLAYBACK
)
{
list_for_each_entry
(
link
,
&
bus
->
hlink_list
,
list
)
{
list_for_each_entry
(
h
link
,
&
bus
->
hlink_list
,
list
)
{
if
(
link
->
index
==
params
->
link_index
)
if
(
h
link
->
index
==
params
->
link_index
)
snd_hdac_ext_
link_set_stream_id
(
link
,
snd_hdac_ext_
bus_link_set_stream_id
(
h
link
,
stream_tag
);
stream_tag
);
}
}
}
}
...
@@ -214,7 +214,7 @@ static int hda_link_dma_hw_params(struct snd_pcm_substream *substream,
...
@@ -214,7 +214,7 @@ static int hda_link_dma_hw_params(struct snd_pcm_substream *substream,
struct
snd_soc_dai
*
codec_dai
=
asoc_rtd_to_codec
(
rtd
,
0
);
struct
snd_soc_dai
*
codec_dai
=
asoc_rtd_to_codec
(
rtd
,
0
);
struct
hda_pipe_params
p_params
=
{
0
};
struct
hda_pipe_params
p_params
=
{
0
};
struct
hdac_bus
*
bus
=
hstream
->
bus
;
struct
hdac_bus
*
bus
=
hstream
->
bus
;
struct
hdac_ext_link
*
link
;
struct
hdac_ext_link
*
h
link
;
hext_stream
=
snd_soc_dai_get_dma_data
(
cpu_dai
,
substream
);
hext_stream
=
snd_soc_dai_get_dma_data
(
cpu_dai
,
substream
);
if
(
!
hext_stream
)
{
if
(
!
hext_stream
)
{
...
@@ -225,8 +225,8 @@ static int hda_link_dma_hw_params(struct snd_pcm_substream *substream,
...
@@ -225,8 +225,8 @@ static int hda_link_dma_hw_params(struct snd_pcm_substream *substream,
snd_soc_dai_set_dma_data
(
cpu_dai
,
substream
,
(
void
*
)
hext_stream
);
snd_soc_dai_set_dma_data
(
cpu_dai
,
substream
,
(
void
*
)
hext_stream
);
}
}
link
=
snd_hdac_ext_bus_get_link
(
bus
,
codec_dai
->
component
->
name
);
hlink
=
snd_hdac_ext_bus_get_hlink_by_name
(
bus
,
codec_dai
->
component
->
name
);
if
(
!
link
)
if
(
!
h
link
)
return
-
EINVAL
;
return
-
EINVAL
;
/* set the hdac_stream in the codec dai */
/* set the hdac_stream in the codec dai */
...
@@ -236,7 +236,7 @@ static int hda_link_dma_hw_params(struct snd_pcm_substream *substream,
...
@@ -236,7 +236,7 @@ static int hda_link_dma_hw_params(struct snd_pcm_substream *substream,
p_params
.
ch
=
params_channels
(
params
);
p_params
.
ch
=
params_channels
(
params
);
p_params
.
s_freq
=
params_rate
(
params
);
p_params
.
s_freq
=
params_rate
(
params
);
p_params
.
stream
=
substream
->
stream
;
p_params
.
stream
=
substream
->
stream
;
p_params
.
link_index
=
link
->
index
;
p_params
.
link_index
=
h
link
->
index
;
p_params
.
format
=
params_format
(
params
);
p_params
.
format
=
params_format
(
params
);
if
(
substream
->
stream
==
SNDRV_PCM_STREAM_PLAYBACK
)
if
(
substream
->
stream
==
SNDRV_PCM_STREAM_PLAYBACK
)
...
@@ -270,7 +270,7 @@ static int hda_link_dma_trigger(struct snd_pcm_substream *substream, int cmd)
...
@@ -270,7 +270,7 @@ static int hda_link_dma_trigger(struct snd_pcm_substream *substream, int cmd)
switch
(
cmd
)
{
switch
(
cmd
)
{
case
SNDRV_PCM_TRIGGER_START
:
case
SNDRV_PCM_TRIGGER_START
:
case
SNDRV_PCM_TRIGGER_PAUSE_RELEASE
:
case
SNDRV_PCM_TRIGGER_PAUSE_RELEASE
:
snd_hdac_ext_
link_
stream_start
(
hext_stream
);
snd_hdac_ext_stream_start
(
hext_stream
);
break
;
break
;
case
SNDRV_PCM_TRIGGER_SUSPEND
:
case
SNDRV_PCM_TRIGGER_SUSPEND
:
case
SNDRV_PCM_TRIGGER_STOP
:
case
SNDRV_PCM_TRIGGER_STOP
:
...
@@ -280,7 +280,7 @@ static int hda_link_dma_trigger(struct snd_pcm_substream *substream, int cmd)
...
@@ -280,7 +280,7 @@ static int hda_link_dma_trigger(struct snd_pcm_substream *substream, int cmd)
break
;
break
;
case
SNDRV_PCM_TRIGGER_PAUSE_PUSH
:
case
SNDRV_PCM_TRIGGER_PAUSE_PUSH
:
snd_hdac_ext_
link_
stream_clear
(
hext_stream
);
snd_hdac_ext_stream_clear
(
hext_stream
);
break
;
break
;
default:
default:
...
@@ -476,7 +476,7 @@ static int ipc4_hda_dai_trigger(struct snd_pcm_substream *substream,
...
@@ -476,7 +476,7 @@ static int ipc4_hda_dai_trigger(struct snd_pcm_substream *substream,
switch
(
cmd
)
{
switch
(
cmd
)
{
case
SNDRV_PCM_TRIGGER_START
:
case
SNDRV_PCM_TRIGGER_START
:
case
SNDRV_PCM_TRIGGER_PAUSE_RELEASE
:
case
SNDRV_PCM_TRIGGER_PAUSE_RELEASE
:
snd_hdac_ext_
link_
stream_start
(
hext_stream
);
snd_hdac_ext_stream_start
(
hext_stream
);
break
;
break
;
case
SNDRV_PCM_TRIGGER_SUSPEND
:
case
SNDRV_PCM_TRIGGER_SUSPEND
:
case
SNDRV_PCM_TRIGGER_STOP
:
case
SNDRV_PCM_TRIGGER_STOP
:
...
@@ -491,7 +491,7 @@ static int ipc4_hda_dai_trigger(struct snd_pcm_substream *substream,
...
@@ -491,7 +491,7 @@ static int ipc4_hda_dai_trigger(struct snd_pcm_substream *substream,
pipeline
->
state
=
SOF_IPC4_PIPE_PAUSED
;
pipeline
->
state
=
SOF_IPC4_PIPE_PAUSED
;
snd_hdac_ext_
link_
stream_clear
(
hext_stream
);
snd_hdac_ext_stream_clear
(
hext_stream
);
ret
=
sof_ipc4_set_pipeline_state
(
sdev
,
swidget
->
pipeline_id
,
ret
=
sof_ipc4_set_pipeline_state
(
sdev
,
swidget
->
pipeline_id
,
SOF_IPC4_PIPE_RESET
);
SOF_IPC4_PIPE_RESET
);
...
@@ -519,7 +519,7 @@ static int ipc4_hda_dai_trigger(struct snd_pcm_substream *substream,
...
@@ -519,7 +519,7 @@ static int ipc4_hda_dai_trigger(struct snd_pcm_substream *substream,
pipeline
->
state
=
SOF_IPC4_PIPE_PAUSED
;
pipeline
->
state
=
SOF_IPC4_PIPE_PAUSED
;
snd_hdac_ext_
link_
stream_clear
(
hext_stream
);
snd_hdac_ext_stream_clear
(
hext_stream
);
break
;
break
;
}
}
default:
default:
...
...
sound/soc/sof/intel/hda-pcm.c
View file @
a293e8ec
...
@@ -142,7 +142,6 @@ int hda_dsp_pcm_hw_params(struct snd_sof_dev *sdev,
...
@@ -142,7 +142,6 @@ int hda_dsp_pcm_hw_params(struct snd_sof_dev *sdev,
int
hda_dsp_pcm_ack
(
struct
snd_sof_dev
*
sdev
,
struct
snd_pcm_substream
*
substream
)
int
hda_dsp_pcm_ack
(
struct
snd_sof_dev
*
sdev
,
struct
snd_pcm_substream
*
substream
)
{
{
struct
hdac_stream
*
hstream
=
substream
->
runtime
->
private_data
;
struct
hdac_stream
*
hstream
=
substream
->
runtime
->
private_data
;
struct
hdac_ext_stream
*
hext_stream
=
stream_to_hdac_ext_stream
(
hstream
);
struct
snd_pcm_runtime
*
runtime
=
substream
->
runtime
;
struct
snd_pcm_runtime
*
runtime
=
substream
->
runtime
;
ssize_t
appl_pos
,
buf_size
;
ssize_t
appl_pos
,
buf_size
;
u32
spib
;
u32
spib
;
...
@@ -156,7 +155,7 @@ int hda_dsp_pcm_ack(struct snd_sof_dev *sdev, struct snd_pcm_substream *substrea
...
@@ -156,7 +155,7 @@ int hda_dsp_pcm_ack(struct snd_sof_dev *sdev, struct snd_pcm_substream *substrea
if
(
!
spib
)
if
(
!
spib
)
spib
=
buf_size
;
spib
=
buf_size
;
sof_io_write
(
sdev
,
h
ext_
stream
->
spib_addr
,
spib
);
sof_io_write
(
sdev
,
hstream
->
spib_addr
,
spib
);
return
0
;
return
0
;
}
}
...
...
sound/soc/sof/intel/hda-stream.c
View file @
a293e8ec
...
@@ -173,7 +173,7 @@ int hda_dsp_stream_spib_config(struct snd_sof_dev *sdev,
...
@@ -173,7 +173,7 @@ int hda_dsp_stream_spib_config(struct snd_sof_dev *sdev,
enable
<<
hstream
->
index
);
enable
<<
hstream
->
index
);
/* set the SPIB value */
/* set the SPIB value */
sof_io_write
(
sdev
,
h
ext_
stream
->
spib_addr
,
size
);
sof_io_write
(
sdev
,
hstream
->
spib_addr
,
size
);
return
0
;
return
0
;
}
}
...
@@ -883,18 +883,19 @@ int hda_dsp_stream_init(struct snd_sof_dev *sdev)
...
@@ -883,18 +883,19 @@ int hda_dsp_stream_init(struct snd_sof_dev *sdev)
SOF_HDA_PPLC_BASE
+
SOF_HDA_PPLC_MULTI
*
num_total
+
SOF_HDA_PPLC_BASE
+
SOF_HDA_PPLC_MULTI
*
num_total
+
SOF_HDA_PPLC_INTERVAL
*
i
;
SOF_HDA_PPLC_INTERVAL
*
i
;
hstream
=
&
hext_stream
->
hstream
;
/* do we support SPIB */
/* do we support SPIB */
if
(
sdev
->
bar
[
HDA_DSP_SPIB_BAR
])
{
if
(
sdev
->
bar
[
HDA_DSP_SPIB_BAR
])
{
h
ext_
stream
->
spib_addr
=
sdev
->
bar
[
HDA_DSP_SPIB_BAR
]
+
hstream
->
spib_addr
=
sdev
->
bar
[
HDA_DSP_SPIB_BAR
]
+
SOF_HDA_SPIB_BASE
+
SOF_HDA_SPIB_INTERVAL
*
i
+
SOF_HDA_SPIB_BASE
+
SOF_HDA_SPIB_INTERVAL
*
i
+
SOF_HDA_SPIB_SPIB
;
SOF_HDA_SPIB_SPIB
;
h
ext_
stream
->
fifo_addr
=
sdev
->
bar
[
HDA_DSP_SPIB_BAR
]
+
hstream
->
fifo_addr
=
sdev
->
bar
[
HDA_DSP_SPIB_BAR
]
+
SOF_HDA_SPIB_BASE
+
SOF_HDA_SPIB_INTERVAL
*
i
+
SOF_HDA_SPIB_BASE
+
SOF_HDA_SPIB_INTERVAL
*
i
+
SOF_HDA_SPIB_MAXFIFO
;
SOF_HDA_SPIB_MAXFIFO
;
}
}
hstream
=
&
hext_stream
->
hstream
;
hstream
->
bus
=
bus
;
hstream
->
bus
=
bus
;
hstream
->
sd_int_sta_mask
=
1
<<
i
;
hstream
->
sd_int_sta_mask
=
1
<<
i
;
hstream
->
index
=
i
;
hstream
->
index
=
i
;
...
@@ -939,18 +940,19 @@ int hda_dsp_stream_init(struct snd_sof_dev *sdev)
...
@@ -939,18 +940,19 @@ int hda_dsp_stream_init(struct snd_sof_dev *sdev)
SOF_HDA_PPLC_BASE
+
SOF_HDA_PPLC_MULTI
*
num_total
+
SOF_HDA_PPLC_BASE
+
SOF_HDA_PPLC_MULTI
*
num_total
+
SOF_HDA_PPLC_INTERVAL
*
i
;
SOF_HDA_PPLC_INTERVAL
*
i
;
hstream
=
&
hext_stream
->
hstream
;
/* do we support SPIB */
/* do we support SPIB */
if
(
sdev
->
bar
[
HDA_DSP_SPIB_BAR
])
{
if
(
sdev
->
bar
[
HDA_DSP_SPIB_BAR
])
{
h
ext_
stream
->
spib_addr
=
sdev
->
bar
[
HDA_DSP_SPIB_BAR
]
+
hstream
->
spib_addr
=
sdev
->
bar
[
HDA_DSP_SPIB_BAR
]
+
SOF_HDA_SPIB_BASE
+
SOF_HDA_SPIB_INTERVAL
*
i
+
SOF_HDA_SPIB_BASE
+
SOF_HDA_SPIB_INTERVAL
*
i
+
SOF_HDA_SPIB_SPIB
;
SOF_HDA_SPIB_SPIB
;
h
ext_
stream
->
fifo_addr
=
sdev
->
bar
[
HDA_DSP_SPIB_BAR
]
+
hstream
->
fifo_addr
=
sdev
->
bar
[
HDA_DSP_SPIB_BAR
]
+
SOF_HDA_SPIB_BASE
+
SOF_HDA_SPIB_INTERVAL
*
i
+
SOF_HDA_SPIB_BASE
+
SOF_HDA_SPIB_INTERVAL
*
i
+
SOF_HDA_SPIB_MAXFIFO
;
SOF_HDA_SPIB_MAXFIFO
;
}
}
hstream
=
&
hext_stream
->
hstream
;
hstream
->
bus
=
bus
;
hstream
->
bus
=
bus
;
hstream
->
sd_int_sta_mask
=
1
<<
i
;
hstream
->
sd_int_sta_mask
=
1
<<
i
;
hstream
->
index
=
i
;
hstream
->
index
=
i
;
...
...
sound/soc/sof/intel/hda.c
View file @
a293e8ec
...
@@ -1224,7 +1224,7 @@ int hda_dsp_remove(struct snd_sof_dev *sdev)
...
@@ -1224,7 +1224,7 @@ int hda_dsp_remove(struct snd_sof_dev *sdev)
hda_dsp_stream_free
(
sdev
);
hda_dsp_stream_free
(
sdev
);
#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA)
#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA)
snd_hdac_link_free_all
(
bus
);
snd_hdac_
ext_
link_free_all
(
bus
);
#endif
#endif
iounmap
(
sdev
->
bar
[
HDA_DSP_BAR
]);
iounmap
(
sdev
->
bar
[
HDA_DSP_BAR
]);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment