1*f95b4152SPeter Ujfalusi // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) 2*f95b4152SPeter Ujfalusi // 3*f95b4152SPeter Ujfalusi // This file is provided under a dual BSD/GPLv2 license. When using or 4*f95b4152SPeter Ujfalusi // redistributing this file, you may do so under either license. 5*f95b4152SPeter Ujfalusi // 6*f95b4152SPeter Ujfalusi // Copyright(c) 2019-2020 Intel Corporation. All rights reserved. 7*f95b4152SPeter Ujfalusi // 8*f95b4152SPeter Ujfalusi // Author: Cezary Rojewski <cezary.rojewski@intel.com> 9*f95b4152SPeter Ujfalusi // 10*f95b4152SPeter Ujfalusi 11*f95b4152SPeter Ujfalusi #include <sound/hdaudio_ext.h> 12*f95b4152SPeter Ujfalusi #include <sound/soc.h> 13*f95b4152SPeter Ujfalusi #include "../sof-priv.h" 14*f95b4152SPeter Ujfalusi #include "hda.h" 15*f95b4152SPeter Ujfalusi 16*f95b4152SPeter Ujfalusi static inline struct hdac_ext_stream * 17*f95b4152SPeter Ujfalusi hda_compr_get_stream(struct snd_compr_stream *cstream) 18*f95b4152SPeter Ujfalusi { 19*f95b4152SPeter Ujfalusi return cstream->runtime->private_data; 20*f95b4152SPeter Ujfalusi } 21*f95b4152SPeter Ujfalusi 22*f95b4152SPeter Ujfalusi int hda_probe_compr_assign(struct snd_sof_dev *sdev, 23*f95b4152SPeter Ujfalusi struct snd_compr_stream *cstream, 24*f95b4152SPeter Ujfalusi struct snd_soc_dai *dai) 25*f95b4152SPeter Ujfalusi { 26*f95b4152SPeter Ujfalusi struct hdac_ext_stream *stream; 27*f95b4152SPeter Ujfalusi 28*f95b4152SPeter Ujfalusi stream = hda_dsp_stream_get(sdev, cstream->direction, 0); 29*f95b4152SPeter Ujfalusi if (!stream) 30*f95b4152SPeter Ujfalusi return -EBUSY; 31*f95b4152SPeter Ujfalusi 32*f95b4152SPeter Ujfalusi hdac_stream(stream)->curr_pos = 0; 33*f95b4152SPeter Ujfalusi hdac_stream(stream)->cstream = cstream; 34*f95b4152SPeter Ujfalusi cstream->runtime->private_data = stream; 35*f95b4152SPeter Ujfalusi 36*f95b4152SPeter Ujfalusi return hdac_stream(stream)->stream_tag; 37*f95b4152SPeter Ujfalusi } 38*f95b4152SPeter Ujfalusi 39*f95b4152SPeter Ujfalusi int hda_probe_compr_free(struct snd_sof_dev *sdev, 40*f95b4152SPeter Ujfalusi struct snd_compr_stream *cstream, 41*f95b4152SPeter Ujfalusi struct snd_soc_dai *dai) 42*f95b4152SPeter Ujfalusi { 43*f95b4152SPeter Ujfalusi struct hdac_ext_stream *stream = hda_compr_get_stream(cstream); 44*f95b4152SPeter Ujfalusi int ret; 45*f95b4152SPeter Ujfalusi 46*f95b4152SPeter Ujfalusi ret = hda_dsp_stream_put(sdev, cstream->direction, 47*f95b4152SPeter Ujfalusi hdac_stream(stream)->stream_tag); 48*f95b4152SPeter Ujfalusi if (ret < 0) { 49*f95b4152SPeter Ujfalusi dev_dbg(sdev->dev, "stream put failed: %d\n", ret); 50*f95b4152SPeter Ujfalusi return ret; 51*f95b4152SPeter Ujfalusi } 52*f95b4152SPeter Ujfalusi 53*f95b4152SPeter Ujfalusi hdac_stream(stream)->cstream = NULL; 54*f95b4152SPeter Ujfalusi cstream->runtime->private_data = NULL; 55*f95b4152SPeter Ujfalusi 56*f95b4152SPeter Ujfalusi return 0; 57*f95b4152SPeter Ujfalusi } 58*f95b4152SPeter Ujfalusi 59*f95b4152SPeter Ujfalusi int hda_probe_compr_set_params(struct snd_sof_dev *sdev, 60*f95b4152SPeter Ujfalusi struct snd_compr_stream *cstream, 61*f95b4152SPeter Ujfalusi struct snd_compr_params *params, 62*f95b4152SPeter Ujfalusi struct snd_soc_dai *dai) 63*f95b4152SPeter Ujfalusi { 64*f95b4152SPeter Ujfalusi struct hdac_ext_stream *stream = hda_compr_get_stream(cstream); 65*f95b4152SPeter Ujfalusi struct hdac_stream *hstream = hdac_stream(stream); 66*f95b4152SPeter Ujfalusi struct snd_dma_buffer *dmab; 67*f95b4152SPeter Ujfalusi u32 bits, rate; 68*f95b4152SPeter Ujfalusi int bps, ret; 69*f95b4152SPeter Ujfalusi 70*f95b4152SPeter Ujfalusi dmab = cstream->runtime->dma_buffer_p; 71*f95b4152SPeter Ujfalusi /* compr params do not store bit depth, default to S32_LE */ 72*f95b4152SPeter Ujfalusi bps = snd_pcm_format_physical_width(SNDRV_PCM_FORMAT_S32_LE); 73*f95b4152SPeter Ujfalusi if (bps < 0) 74*f95b4152SPeter Ujfalusi return bps; 75*f95b4152SPeter Ujfalusi bits = hda_dsp_get_bits(sdev, bps); 76*f95b4152SPeter Ujfalusi rate = hda_dsp_get_mult_div(sdev, params->codec.sample_rate); 77*f95b4152SPeter Ujfalusi 78*f95b4152SPeter Ujfalusi hstream->format_val = rate | bits | (params->codec.ch_out - 1); 79*f95b4152SPeter Ujfalusi hstream->bufsize = cstream->runtime->buffer_size; 80*f95b4152SPeter Ujfalusi hstream->period_bytes = cstream->runtime->fragment_size; 81*f95b4152SPeter Ujfalusi hstream->no_period_wakeup = 0; 82*f95b4152SPeter Ujfalusi 83*f95b4152SPeter Ujfalusi ret = hda_dsp_stream_hw_params(sdev, stream, dmab, NULL); 84*f95b4152SPeter Ujfalusi if (ret < 0) { 85*f95b4152SPeter Ujfalusi dev_err(sdev->dev, "error: hdac prepare failed: %d\n", ret); 86*f95b4152SPeter Ujfalusi return ret; 87*f95b4152SPeter Ujfalusi } 88*f95b4152SPeter Ujfalusi 89*f95b4152SPeter Ujfalusi return 0; 90*f95b4152SPeter Ujfalusi } 91*f95b4152SPeter Ujfalusi 92*f95b4152SPeter Ujfalusi int hda_probe_compr_trigger(struct snd_sof_dev *sdev, 93*f95b4152SPeter Ujfalusi struct snd_compr_stream *cstream, int cmd, 94*f95b4152SPeter Ujfalusi struct snd_soc_dai *dai) 95*f95b4152SPeter Ujfalusi { 96*f95b4152SPeter Ujfalusi struct hdac_ext_stream *stream = hda_compr_get_stream(cstream); 97*f95b4152SPeter Ujfalusi 98*f95b4152SPeter Ujfalusi return hda_dsp_stream_trigger(sdev, stream, cmd); 99*f95b4152SPeter Ujfalusi } 100*f95b4152SPeter Ujfalusi 101*f95b4152SPeter Ujfalusi int hda_probe_compr_pointer(struct snd_sof_dev *sdev, 102*f95b4152SPeter Ujfalusi struct snd_compr_stream *cstream, 103*f95b4152SPeter Ujfalusi struct snd_compr_tstamp *tstamp, 104*f95b4152SPeter Ujfalusi struct snd_soc_dai *dai) 105*f95b4152SPeter Ujfalusi { 106*f95b4152SPeter Ujfalusi struct hdac_ext_stream *stream = hda_compr_get_stream(cstream); 107*f95b4152SPeter Ujfalusi struct snd_soc_pcm_stream *pstream; 108*f95b4152SPeter Ujfalusi 109*f95b4152SPeter Ujfalusi pstream = &dai->driver->capture; 110*f95b4152SPeter Ujfalusi tstamp->copied_total = hdac_stream(stream)->curr_pos; 111*f95b4152SPeter Ujfalusi tstamp->sampling_rate = snd_pcm_rate_bit_to_rate(pstream->rates); 112*f95b4152SPeter Ujfalusi 113*f95b4152SPeter Ujfalusi return 0; 114*f95b4152SPeter Ujfalusi } 115