static void skl_pcm_close(struct snd_pcm_substream *substream, struct snd_soc_dai *dai) { struct hdac_ext_stream *stream = get_hdac_ext_stream(substream); struct hdac_ext_bus *ebus = dev_get_drvdata(dai->dev); struct skl_dma_params *dma_params = NULL; struct skl *skl = ebus_to_skl(ebus); dev_dbg(dai->dev, "%s: %s\n", __func__, dai->name); snd_hdac_ext_stream_release(stream, skl_get_host_stream_type(ebus)); dma_params = snd_soc_dai_get_dma_data(dai, substream); /* * now we should set this to NULL as we are freeing by the * dma_params */ snd_soc_dai_set_dma_data(dai, substream, NULL); skl_set_suspend_active(substream, dai, false); /* * check if close is for "Reference Pin" and set back the * CGCTL.MISCBDCGE if disabled by driver */ if (!strncmp(dai->name, "Reference Pin", 13) && skl->skl_sst->miscbdcg_disabled) { skl->skl_sst->enable_miscbdcge(dai->dev, true); skl->skl_sst->miscbdcg_disabled = false; } kfree(dma_params); }
static int skl_pcm_new(struct snd_soc_pcm_runtime *rtd) { struct snd_soc_dai *dai = rtd->cpu_dai; struct hdac_ext_bus *ebus = dev_get_drvdata(dai->dev); struct snd_pcm *pcm = rtd->pcm; unsigned int size; int retval = 0; struct skl *skl = ebus_to_skl(ebus); if (dai->driver->playback.channels_min || dai->driver->capture.channels_min) { /* buffer pre-allocation */ size = CONFIG_SND_HDA_PREALLOC_SIZE * 1024; if (size > MAX_PREALLOC_SIZE) size = MAX_PREALLOC_SIZE; retval = snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV_SG, snd_dma_pci_data(skl->pci), size, MAX_PREALLOC_SIZE); if (retval) { dev_err(dai->dev, "dma buffer allocationf fail\n"); return retval; } } return retval; }
static ssize_t skl_nhlt_platform_id_show(struct device *dev, struct device_attribute *attr, char *buf) { struct pci_dev *pci = to_pci_dev(dev); struct hdac_ext_bus *ebus = pci_get_drvdata(pci); struct skl *skl = ebus_to_skl(ebus); struct nhlt_acpi_table *nhlt = (struct nhlt_acpi_table *)skl->nhlt; char platform_id[32]; sprintf(platform_id, "%x-%.6s-%.8s-%d", skl->pci_id, nhlt->header.oem_id, nhlt->header.oem_table_id, nhlt->header.oem_revision); skl_nhlt_trim_space(platform_id); return sprintf(buf, "%s\n", platform_id); }
/* * check if the stream opened is marked as ignore_suspend by machine, if so * then enable suspend_active refcount * * The count supend_active does not need lock as it is used in open/close * and suspend context */ static void skl_set_suspend_active(struct snd_pcm_substream *substream, struct snd_soc_dai *dai, bool enable) { struct hdac_ext_bus *ebus = dev_get_drvdata(dai->dev); struct snd_soc_dapm_widget *w; struct skl *skl = ebus_to_skl(ebus); if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) w = dai->playback_widget; else w = dai->capture_widget; if (w->ignore_suspend && enable) skl->supend_active++; else if (w->ignore_suspend && !enable) skl->supend_active--; }
static int skl_platform_soc_probe(struct snd_soc_platform *platform) { struct hdac_ext_bus *ebus = dev_get_drvdata(platform->dev); struct skl *skl = ebus_to_skl(ebus); int ret; if (ebus->ppcap) { ret = skl_tplg_init(platform, ebus); if (ret < 0) { dev_err(platform->dev, "Failed to init topology!\n"); return ret; } skl->platform = platform; } return 0; }
int skl_platform_register(struct device *dev) { int ret; struct hdac_ext_bus *ebus = dev_get_drvdata(dev); struct skl *skl = ebus_to_skl(ebus); INIT_LIST_HEAD(&skl->ppl_list); ret = snd_soc_register_platform(dev, &skl_platform_drv); if (ret) { dev_err(dev, "soc platform registration failed %d\n", ret); return ret; } ret = snd_soc_register_component(dev, &skl_component, skl_platform_dai, ARRAY_SIZE(skl_platform_dai)); if (ret) { dev_err(dev, "soc component registration failed %d\n", ret); snd_soc_unregister_platform(dev); } return ret; }