Commit d41a7d87 authored by Mark Brown's avatar Mark Brown

ASoC: Merge HDA/ext cleanup

Merge branch 'topic/hda-ext-cleanup' of
https://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound into
asoc-6.2 for further AVS work.
parents 625d2753 62582341
...@@ -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
*/ */
......
...@@ -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 *hlink);
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 *hlink);
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 *hlink,
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 *hlink,
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 *hlink);
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 *hlink);
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) \
......
...@@ -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 hlink at specified address
* @bus: link's parent bus device * @bus: hlink'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 hlink 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 hlink 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 *hlink, 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(hlink->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 * @hlink: 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 *hlink)
{ {
snd_hdac_updatel(link->ml_addr, AZX_REG_ML_LCTL, snd_hdac_updatel(hlink->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(hlink, 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 * @hlink: 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 *hlink)
{ {
snd_hdac_updatel(link->ml_addr, AZX_REG_ML_LCTL, AZX_ML_LCTL_SPA, 0); snd_hdac_updatel(hlink->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(hlink, 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 *hlink)
{ {
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 (++hlink->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(hlink);
/* /*
* 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(hlink->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 *hlink)
{ {
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 (--hlink->ref_count == 0) {
ret = snd_hdac_ext_bus_link_power_down(link); ret = snd_hdac_ext_bus_link_power_down(hlink);
/* /*
* 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);
......
...@@ -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);
...@@ -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
......
...@@ -179,7 +179,7 @@ static int hda_codec_probe(struct snd_soc_component *component) ...@@ -179,7 +179,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;
...@@ -287,7 +287,7 @@ static void hda_codec_remove(struct snd_soc_component *component) ...@@ -287,7 +287,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);
/* /*
......
...@@ -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;
......
...@@ -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;
......
...@@ -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));
......
...@@ -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, estream, fw->size); ret = snd_hdac_stream_set_spib(bus, hstream, 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, estream, 0); snd_hdac_stream_set_spib(bus, hstream, 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, estream, 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, estream, 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:
......
...@@ -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);
......
...@@ -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, estream, size); snd_hdac_stream_set_spib(bus, stream, size);
return 0; return 0;
} }
......
...@@ -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 + hstream->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);
......
...@@ -436,7 +436,7 @@ static int skl_free(struct hdac_bus *bus) ...@@ -436,7 +436,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);
......
...@@ -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 *hlink;
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 (!hlink)
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(hlink, 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 *hlink;
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(hlink, &bus->hlink_list, list) {
if (link->index == params->link_index) if (hlink->index == params->link_index)
snd_hdac_ext_link_set_stream_id(link, snd_hdac_ext_bus_link_set_stream_id(hlink,
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 *hlink;
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 (!hlink)
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 = hlink->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:
......
...@@ -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, hext_stream->spib_addr, spib); sof_io_write(sdev, hstream->spib_addr, spib);
return 0; return 0;
} }
......
...@@ -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, hext_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]) {
hext_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;
hext_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]) {
hext_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;
hext_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;
......
...@@ -1235,7 +1235,7 @@ int hda_dsp_remove(struct snd_sof_dev *sdev) ...@@ -1235,7 +1235,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]);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment