Merge remote-tracking branch 'asoc/fix/intel' into asoc-linus
This commit is contained in:
commit
e408057767
|
@ -104,12 +104,11 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_stream_init_all);
|
||||||
*/
|
*/
|
||||||
void snd_hdac_stream_free_all(struct hdac_ext_bus *ebus)
|
void snd_hdac_stream_free_all(struct hdac_ext_bus *ebus)
|
||||||
{
|
{
|
||||||
struct hdac_stream *s;
|
struct hdac_stream *s, *_s;
|
||||||
struct hdac_ext_stream *stream;
|
struct hdac_ext_stream *stream;
|
||||||
struct hdac_bus *bus = ebus_to_hbus(ebus);
|
struct hdac_bus *bus = ebus_to_hbus(ebus);
|
||||||
|
|
||||||
while (!list_empty(&bus->stream_list)) {
|
list_for_each_entry_safe(s, _s, &bus->stream_list, list) {
|
||||||
s = list_first_entry(&bus->stream_list, struct hdac_stream, list);
|
|
||||||
stream = stream_to_hdac_ext_stream(s);
|
stream = stream_to_hdac_ext_stream(s);
|
||||||
snd_hdac_ext_stream_decouple(ebus, stream, false);
|
snd_hdac_ext_stream_decouple(ebus, stream, false);
|
||||||
list_del(&s->list);
|
list_del(&s->list);
|
||||||
|
|
|
@ -163,7 +163,6 @@ config SND_SOC_INTEL_SKYLAKE
|
||||||
tristate
|
tristate
|
||||||
select SND_HDA_EXT_CORE
|
select SND_HDA_EXT_CORE
|
||||||
select SND_SOC_TOPOLOGY
|
select SND_SOC_TOPOLOGY
|
||||||
select SND_HDA_I915
|
|
||||||
select SND_SOC_INTEL_SST
|
select SND_SOC_INTEL_SST
|
||||||
|
|
||||||
config SND_SOC_INTEL_SKL_RT286_MACH
|
config SND_SOC_INTEL_SKL_RT286_MACH
|
||||||
|
|
|
@ -1345,7 +1345,7 @@ int sst_hsw_stream_reset(struct sst_hsw *hsw, struct sst_hsw_stream *stream)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* wait for pause to complete before we reset the stream */
|
/* wait for pause to complete before we reset the stream */
|
||||||
while (stream->running && tries--)
|
while (stream->running && --tries)
|
||||||
msleep(1);
|
msleep(1);
|
||||||
if (!tries) {
|
if (!tries) {
|
||||||
dev_err(hsw->dev, "error: reset stream %d still running\n",
|
dev_err(hsw->dev, "error: reset stream %d still running\n",
|
||||||
|
|
|
@ -336,6 +336,11 @@ void skl_dsp_free(struct sst_dsp *dsp)
|
||||||
skl_ipc_int_disable(dsp);
|
skl_ipc_int_disable(dsp);
|
||||||
|
|
||||||
free_irq(dsp->irq, dsp);
|
free_irq(dsp->irq, dsp);
|
||||||
|
dsp->cl_dev.ops.cl_cleanup_controller(dsp);
|
||||||
|
skl_cldma_int_disable(dsp);
|
||||||
|
skl_ipc_op_int_disable(dsp);
|
||||||
|
skl_ipc_int_disable(dsp);
|
||||||
|
|
||||||
skl_dsp_disable_core(dsp);
|
skl_dsp_disable_core(dsp);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(skl_dsp_free);
|
EXPORT_SYMBOL_GPL(skl_dsp_free);
|
||||||
|
|
|
@ -239,6 +239,7 @@ static void skl_tplg_update_buffer_size(struct skl_sst *ctx,
|
||||||
{
|
{
|
||||||
int multiplier = 1;
|
int multiplier = 1;
|
||||||
struct skl_module_fmt *in_fmt, *out_fmt;
|
struct skl_module_fmt *in_fmt, *out_fmt;
|
||||||
|
int in_rate, out_rate;
|
||||||
|
|
||||||
|
|
||||||
/* Since fixups is applied to pin 0 only, ibs, obs needs
|
/* Since fixups is applied to pin 0 only, ibs, obs needs
|
||||||
|
@ -249,15 +250,24 @@ static void skl_tplg_update_buffer_size(struct skl_sst *ctx,
|
||||||
|
|
||||||
if (mcfg->m_type == SKL_MODULE_TYPE_SRCINT)
|
if (mcfg->m_type == SKL_MODULE_TYPE_SRCINT)
|
||||||
multiplier = 5;
|
multiplier = 5;
|
||||||
mcfg->ibs = (in_fmt->s_freq / 1000) *
|
|
||||||
(mcfg->in_fmt->channels) *
|
|
||||||
(mcfg->in_fmt->bit_depth >> 3) *
|
|
||||||
multiplier;
|
|
||||||
|
|
||||||
mcfg->obs = (mcfg->out_fmt->s_freq / 1000) *
|
if (in_fmt->s_freq % 1000)
|
||||||
(mcfg->out_fmt->channels) *
|
in_rate = (in_fmt->s_freq / 1000) + 1;
|
||||||
(mcfg->out_fmt->bit_depth >> 3) *
|
else
|
||||||
multiplier;
|
in_rate = (in_fmt->s_freq / 1000);
|
||||||
|
|
||||||
|
mcfg->ibs = in_rate * (mcfg->in_fmt->channels) *
|
||||||
|
(mcfg->in_fmt->bit_depth >> 3) *
|
||||||
|
multiplier;
|
||||||
|
|
||||||
|
if (mcfg->out_fmt->s_freq % 1000)
|
||||||
|
out_rate = (mcfg->out_fmt->s_freq / 1000) + 1;
|
||||||
|
else
|
||||||
|
out_rate = (mcfg->out_fmt->s_freq / 1000);
|
||||||
|
|
||||||
|
mcfg->obs = out_rate * (mcfg->out_fmt->channels) *
|
||||||
|
(mcfg->out_fmt->bit_depth >> 3) *
|
||||||
|
multiplier;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int skl_tplg_update_be_blob(struct snd_soc_dapm_widget *w,
|
static int skl_tplg_update_be_blob(struct snd_soc_dapm_widget *w,
|
||||||
|
@ -485,11 +495,15 @@ skl_tplg_init_pipe_modules(struct skl *skl, struct skl_pipe *pipe)
|
||||||
if (!skl_is_pipe_mcps_avail(skl, mconfig))
|
if (!skl_is_pipe_mcps_avail(skl, mconfig))
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
skl_tplg_alloc_pipe_mcps(skl, mconfig);
|
||||||
|
|
||||||
if (mconfig->is_loadable && ctx->dsp->fw_ops.load_mod) {
|
if (mconfig->is_loadable && ctx->dsp->fw_ops.load_mod) {
|
||||||
ret = ctx->dsp->fw_ops.load_mod(ctx->dsp,
|
ret = ctx->dsp->fw_ops.load_mod(ctx->dsp,
|
||||||
mconfig->id.module_id, mconfig->guid);
|
mconfig->id.module_id, mconfig->guid);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
mconfig->m_state = SKL_MODULE_LOADED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* update blob if blob is null for be with default value */
|
/* update blob if blob is null for be with default value */
|
||||||
|
@ -509,7 +523,6 @@ skl_tplg_init_pipe_modules(struct skl *skl, struct skl_pipe *pipe)
|
||||||
ret = skl_tplg_set_module_params(w, ctx);
|
ret = skl_tplg_set_module_params(w, ctx);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
skl_tplg_alloc_pipe_mcps(skl, mconfig);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -524,7 +537,8 @@ static int skl_tplg_unload_pipe_modules(struct skl_sst *ctx,
|
||||||
list_for_each_entry(w_module, &pipe->w_list, node) {
|
list_for_each_entry(w_module, &pipe->w_list, node) {
|
||||||
mconfig = w_module->w->priv;
|
mconfig = w_module->w->priv;
|
||||||
|
|
||||||
if (mconfig->is_loadable && ctx->dsp->fw_ops.unload_mod)
|
if (mconfig->is_loadable && ctx->dsp->fw_ops.unload_mod &&
|
||||||
|
mconfig->m_state > SKL_MODULE_UNINIT)
|
||||||
return ctx->dsp->fw_ops.unload_mod(ctx->dsp,
|
return ctx->dsp->fw_ops.unload_mod(ctx->dsp,
|
||||||
mconfig->id.module_id);
|
mconfig->id.module_id);
|
||||||
}
|
}
|
||||||
|
@ -558,6 +572,9 @@ static int skl_tplg_mixer_dapm_pre_pmu_event(struct snd_soc_dapm_widget *w,
|
||||||
if (!skl_is_pipe_mem_avail(skl, mconfig))
|
if (!skl_is_pipe_mem_avail(skl, mconfig))
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
skl_tplg_alloc_pipe_mem(skl, mconfig);
|
||||||
|
skl_tplg_alloc_pipe_mcps(skl, mconfig);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create a list of modules for pipe.
|
* Create a list of modules for pipe.
|
||||||
* This list contains modules from source to sink
|
* This list contains modules from source to sink
|
||||||
|
@ -601,9 +618,6 @@ static int skl_tplg_mixer_dapm_pre_pmu_event(struct snd_soc_dapm_widget *w,
|
||||||
src_module = dst_module;
|
src_module = dst_module;
|
||||||
}
|
}
|
||||||
|
|
||||||
skl_tplg_alloc_pipe_mem(skl, mconfig);
|
|
||||||
skl_tplg_alloc_pipe_mcps(skl, mconfig);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -274,10 +274,10 @@ struct skl_pipe {
|
||||||
|
|
||||||
enum skl_module_state {
|
enum skl_module_state {
|
||||||
SKL_MODULE_UNINIT = 0,
|
SKL_MODULE_UNINIT = 0,
|
||||||
SKL_MODULE_INIT_DONE = 1,
|
SKL_MODULE_LOADED = 1,
|
||||||
SKL_MODULE_LOADED = 2,
|
SKL_MODULE_INIT_DONE = 2,
|
||||||
SKL_MODULE_UNLOADED = 3,
|
SKL_MODULE_BIND_DONE = 3,
|
||||||
SKL_MODULE_BIND_DONE = 4
|
SKL_MODULE_UNLOADED = 4,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct skl_module_cfg {
|
struct skl_module_cfg {
|
||||||
|
|
|
@ -222,6 +222,7 @@ static int skl_suspend(struct device *dev)
|
||||||
struct hdac_ext_bus *ebus = pci_get_drvdata(pci);
|
struct hdac_ext_bus *ebus = pci_get_drvdata(pci);
|
||||||
struct skl *skl = ebus_to_skl(ebus);
|
struct skl *skl = ebus_to_skl(ebus);
|
||||||
struct hdac_bus *bus = ebus_to_hbus(ebus);
|
struct hdac_bus *bus = ebus_to_hbus(ebus);
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Do not suspend if streams which are marked ignore suspend are
|
* Do not suspend if streams which are marked ignore suspend are
|
||||||
|
@ -232,10 +233,20 @@ static int skl_suspend(struct device *dev)
|
||||||
enable_irq_wake(bus->irq);
|
enable_irq_wake(bus->irq);
|
||||||
pci_save_state(pci);
|
pci_save_state(pci);
|
||||||
pci_disable_device(pci);
|
pci_disable_device(pci);
|
||||||
return 0;
|
|
||||||
} else {
|
} else {
|
||||||
return _skl_suspend(ebus);
|
ret = _skl_suspend(ebus);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (IS_ENABLED(CONFIG_SND_SOC_HDAC_HDMI)) {
|
||||||
|
ret = snd_hdac_display_power(bus, false);
|
||||||
|
if (ret < 0)
|
||||||
|
dev_err(bus->dev,
|
||||||
|
"Cannot turn OFF display power on i915\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int skl_resume(struct device *dev)
|
static int skl_resume(struct device *dev)
|
||||||
|
@ -316,17 +327,20 @@ static int skl_free(struct hdac_ext_bus *ebus)
|
||||||
|
|
||||||
if (bus->irq >= 0)
|
if (bus->irq >= 0)
|
||||||
free_irq(bus->irq, (void *)bus);
|
free_irq(bus->irq, (void *)bus);
|
||||||
if (bus->remap_addr)
|
|
||||||
iounmap(bus->remap_addr);
|
|
||||||
|
|
||||||
snd_hdac_bus_free_stream_pages(bus);
|
snd_hdac_bus_free_stream_pages(bus);
|
||||||
snd_hdac_stream_free_all(ebus);
|
snd_hdac_stream_free_all(ebus);
|
||||||
snd_hdac_link_free_all(ebus);
|
snd_hdac_link_free_all(ebus);
|
||||||
|
|
||||||
|
if (bus->remap_addr)
|
||||||
|
iounmap(bus->remap_addr);
|
||||||
|
|
||||||
pci_release_regions(skl->pci);
|
pci_release_regions(skl->pci);
|
||||||
pci_disable_device(skl->pci);
|
pci_disable_device(skl->pci);
|
||||||
|
|
||||||
snd_hdac_ext_bus_exit(ebus);
|
snd_hdac_ext_bus_exit(ebus);
|
||||||
|
|
||||||
|
if (IS_ENABLED(CONFIG_SND_SOC_HDAC_HDMI))
|
||||||
|
snd_hdac_i915_exit(&ebus->bus);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -719,12 +733,12 @@ static void skl_remove(struct pci_dev *pci)
|
||||||
if (skl->tplg)
|
if (skl->tplg)
|
||||||
release_firmware(skl->tplg);
|
release_firmware(skl->tplg);
|
||||||
|
|
||||||
if (IS_ENABLED(CONFIG_SND_SOC_HDAC_HDMI))
|
|
||||||
snd_hdac_i915_exit(&ebus->bus);
|
|
||||||
|
|
||||||
if (pci_dev_run_wake(pci))
|
if (pci_dev_run_wake(pci))
|
||||||
pm_runtime_get_noresume(&pci->dev);
|
pm_runtime_get_noresume(&pci->dev);
|
||||||
pci_dev_put(pci);
|
|
||||||
|
/* codec removal, invoke bus_device_remove */
|
||||||
|
snd_hdac_ext_bus_device_remove(ebus);
|
||||||
|
|
||||||
skl_platform_unregister(&pci->dev);
|
skl_platform_unregister(&pci->dev);
|
||||||
skl_free_dsp(skl);
|
skl_free_dsp(skl);
|
||||||
skl_machine_device_unregister(skl);
|
skl_machine_device_unregister(skl);
|
||||||
|
|
Loading…
Reference in New Issue