ASoC: Merge up fixes
Some of these, particularly the wm_adsp one in the immediate case, are needed as a basis for new work.
This commit is contained in:
commit
327719aa62
@ -56,6 +56,9 @@ struct hdac_ext_stream {
|
||||
u32 pphcldpl;
|
||||
u32 pphcldpu;
|
||||
|
||||
u32 pplcllpl;
|
||||
u32 pplcllpu;
|
||||
|
||||
bool decoupled:1;
|
||||
bool link_locked:1;
|
||||
bool link_prepared;
|
||||
|
@ -115,7 +115,10 @@ static int acp_pci_probe(struct pci_dev *pci, const struct pci_device_id *pci_id
|
||||
goto unregister_dmic_dev;
|
||||
}
|
||||
|
||||
acp_init(chip);
|
||||
ret = acp_init(chip);
|
||||
if (ret)
|
||||
goto unregister_dmic_dev;
|
||||
|
||||
res = devm_kcalloc(&pci->dev, num_res, sizeof(struct resource), GFP_KERNEL);
|
||||
if (!res) {
|
||||
ret = -ENOMEM;
|
||||
@ -133,11 +136,9 @@ static int acp_pci_probe(struct pci_dev *pci, const struct pci_device_id *pci_id
|
||||
}
|
||||
}
|
||||
|
||||
if (flag == FLAG_AMD_LEGACY_ONLY_DMIC) {
|
||||
ret = check_acp_pdm(pci, chip);
|
||||
if (ret < 0)
|
||||
goto skip_pdev_creation;
|
||||
}
|
||||
ret = check_acp_pdm(pci, chip);
|
||||
if (ret < 0)
|
||||
goto skip_pdev_creation;
|
||||
|
||||
chip->flag = flag;
|
||||
memset(&pdevinfo, 0, sizeof(pdevinfo));
|
||||
|
@ -56,6 +56,11 @@ static int _cs_amp_write_cal_coeffs(struct cs_dsp *dsp,
|
||||
dev_dbg(dsp->dev, "Calibration: Ambient=%#x, Status=%#x, CalR=%d\n",
|
||||
data->calAmbient, data->calStatus, data->calR);
|
||||
|
||||
if (list_empty(&dsp->ctl_list)) {
|
||||
dev_info(dsp->dev, "Calibration disabled due to missing firmware controls\n");
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
ret = cs_amp_write_cal_coeff(dsp, controls, controls->ambient, data->calAmbient);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
@ -2364,7 +2364,8 @@ static int cs42l43_codec_runtime_resume(struct device *dev)
|
||||
|
||||
static int cs42l43_codec_suspend(struct device *dev)
|
||||
{
|
||||
struct cs42l43 *cs42l43 = dev_get_drvdata(dev);
|
||||
struct cs42l43_codec *priv = dev_get_drvdata(dev);
|
||||
struct cs42l43 *cs42l43 = priv->core;
|
||||
|
||||
disable_irq(cs42l43->irq);
|
||||
|
||||
@ -2373,7 +2374,8 @@ static int cs42l43_codec_suspend(struct device *dev)
|
||||
|
||||
static int cs42l43_codec_suspend_noirq(struct device *dev)
|
||||
{
|
||||
struct cs42l43 *cs42l43 = dev_get_drvdata(dev);
|
||||
struct cs42l43_codec *priv = dev_get_drvdata(dev);
|
||||
struct cs42l43 *cs42l43 = priv->core;
|
||||
|
||||
enable_irq(cs42l43->irq);
|
||||
|
||||
@ -2382,7 +2384,8 @@ static int cs42l43_codec_suspend_noirq(struct device *dev)
|
||||
|
||||
static int cs42l43_codec_resume(struct device *dev)
|
||||
{
|
||||
struct cs42l43 *cs42l43 = dev_get_drvdata(dev);
|
||||
struct cs42l43_codec *priv = dev_get_drvdata(dev);
|
||||
struct cs42l43 *cs42l43 = priv->core;
|
||||
|
||||
enable_irq(cs42l43->irq);
|
||||
|
||||
@ -2391,7 +2394,8 @@ static int cs42l43_codec_resume(struct device *dev)
|
||||
|
||||
static int cs42l43_codec_resume_noirq(struct device *dev)
|
||||
{
|
||||
struct cs42l43 *cs42l43 = dev_get_drvdata(dev);
|
||||
struct cs42l43_codec *priv = dev_get_drvdata(dev);
|
||||
struct cs42l43 *cs42l43 = priv->core;
|
||||
|
||||
disable_irq(cs42l43->irq);
|
||||
|
||||
|
@ -404,9 +404,9 @@ static const struct _coeff_div coeff_div_v3[] = {
|
||||
{125, 48000, 6000000, 0x04, 0x04, 0x1F, 0x2D, 0x8A, 0x0A, 0x27, 0x27},
|
||||
|
||||
{128, 8000, 1024000, 0x60, 0x00, 0x05, 0x75, 0x8A, 0x1B, 0x1F, 0x7F},
|
||||
{128, 16000, 2048000, 0x20, 0x00, 0x31, 0x35, 0x8A, 0x1B, 0x1F, 0x3F},
|
||||
{128, 44100, 5644800, 0xE0, 0x00, 0x01, 0x2D, 0xCA, 0x0A, 0x1F, 0x1F},
|
||||
{128, 48000, 6144000, 0xE0, 0x00, 0x01, 0x2D, 0xCA, 0x0A, 0x1F, 0x1F},
|
||||
{128, 16000, 2048000, 0x20, 0x00, 0x31, 0x35, 0x08, 0x19, 0x1F, 0x3F},
|
||||
{128, 44100, 5644800, 0xE0, 0x00, 0x01, 0x2D, 0x48, 0x08, 0x1F, 0x1F},
|
||||
{128, 48000, 6144000, 0xE0, 0x00, 0x01, 0x2D, 0x48, 0x08, 0x1F, 0x1F},
|
||||
{144, 8000, 1152000, 0x20, 0x00, 0x03, 0x35, 0x8A, 0x1B, 0x23, 0x47},
|
||||
{144, 16000, 2304000, 0x20, 0x00, 0x11, 0x35, 0x8A, 0x1B, 0x23, 0x47},
|
||||
{192, 8000, 1536000, 0x60, 0x02, 0x0D, 0x75, 0x8A, 0x1B, 0x1F, 0x7F},
|
||||
@ -415,10 +415,10 @@ static const struct _coeff_div coeff_div_v3[] = {
|
||||
|
||||
{200, 48000, 9600000, 0x04, 0x04, 0x0F, 0x2D, 0xCA, 0x0A, 0x1F, 0x1F},
|
||||
{250, 48000, 12000000, 0x04, 0x04, 0x0F, 0x2D, 0xCA, 0x0A, 0x27, 0x27},
|
||||
{256, 8000, 2048000, 0x60, 0x00, 0x31, 0x35, 0x8A, 0x1B, 0x1F, 0x7F},
|
||||
{256, 16000, 4096000, 0x20, 0x00, 0x01, 0x35, 0x8A, 0x1B, 0x1F, 0x3F},
|
||||
{256, 44100, 11289600, 0xE0, 0x00, 0x30, 0x2D, 0xCA, 0x0A, 0x1F, 0x1F},
|
||||
{256, 48000, 12288000, 0xE0, 0x00, 0x30, 0x2D, 0xCA, 0x0A, 0x1F, 0x1F},
|
||||
{256, 8000, 2048000, 0x60, 0x00, 0x31, 0x35, 0x08, 0x19, 0x1F, 0x7F},
|
||||
{256, 16000, 4096000, 0x20, 0x00, 0x01, 0x35, 0x08, 0x19, 0x1F, 0x3F},
|
||||
{256, 44100, 11289600, 0xE0, 0x01, 0x01, 0x2D, 0x48, 0x08, 0x1F, 0x1F},
|
||||
{256, 48000, 12288000, 0xE0, 0x01, 0x01, 0x2D, 0x48, 0x08, 0x1F, 0x1F},
|
||||
{288, 8000, 2304000, 0x20, 0x00, 0x01, 0x35, 0x8A, 0x1B, 0x23, 0x47},
|
||||
{384, 8000, 3072000, 0x60, 0x02, 0x05, 0x75, 0x8A, 0x1B, 0x1F, 0x7F},
|
||||
{384, 16000, 6144000, 0x20, 0x02, 0x03, 0x35, 0x8A, 0x1B, 0x1F, 0x3F},
|
||||
@ -427,10 +427,10 @@ static const struct _coeff_div coeff_div_v3[] = {
|
||||
|
||||
{400, 48000, 19200000, 0xE4, 0x04, 0x35, 0x6d, 0xCA, 0x0A, 0x1F, 0x1F},
|
||||
{500, 48000, 24000000, 0xF8, 0x04, 0x3F, 0x6D, 0xCA, 0x0A, 0x1F, 0x1F},
|
||||
{512, 8000, 4096000, 0x60, 0x00, 0x01, 0x35, 0x8A, 0x1B, 0x1F, 0x7F},
|
||||
{512, 16000, 8192000, 0x20, 0x00, 0x30, 0x35, 0x8A, 0x1B, 0x1F, 0x3F},
|
||||
{512, 44100, 22579200, 0xE0, 0x00, 0x00, 0x2D, 0xCA, 0x0A, 0x1F, 0x1F},
|
||||
{512, 48000, 24576000, 0xE0, 0x00, 0x00, 0x2D, 0xCA, 0x0A, 0x1F, 0x1F},
|
||||
{512, 8000, 4096000, 0x60, 0x00, 0x01, 0x08, 0x19, 0x1B, 0x1F, 0x7F},
|
||||
{512, 16000, 8192000, 0x20, 0x00, 0x30, 0x35, 0x08, 0x19, 0x1F, 0x3F},
|
||||
{512, 44100, 22579200, 0xE0, 0x00, 0x00, 0x2D, 0x48, 0x08, 0x1F, 0x1F},
|
||||
{512, 48000, 24576000, 0xE0, 0x00, 0x00, 0x2D, 0x48, 0x08, 0x1F, 0x1F},
|
||||
{768, 8000, 6144000, 0x60, 0x02, 0x11, 0x35, 0x8A, 0x1B, 0x1F, 0x7F},
|
||||
{768, 16000, 12288000, 0x20, 0x02, 0x01, 0x35, 0x8A, 0x1B, 0x1F, 0x3F},
|
||||
{768, 32000, 24576000, 0xE0, 0x02, 0x30, 0x2D, 0xCA, 0x0A, 0x1F, 0x1F},
|
||||
@ -827,7 +827,6 @@ static void es8326_jack_detect_handler(struct work_struct *work)
|
||||
dev_dbg(comp->dev, "Report hp remove event\n");
|
||||
snd_soc_jack_report(es8326->jack, 0, SND_JACK_HEADSET);
|
||||
/* mute adc when mic path switch */
|
||||
regmap_write(es8326->regmap, ES8326_ADC_SCALE, 0x33);
|
||||
regmap_write(es8326->regmap, ES8326_ADC1_SRC, 0x44);
|
||||
regmap_write(es8326->regmap, ES8326_ADC2_SRC, 0x66);
|
||||
es8326->hp = 0;
|
||||
@ -835,6 +834,7 @@ static void es8326_jack_detect_handler(struct work_struct *work)
|
||||
regmap_update_bits(es8326->regmap, ES8326_HPDET_TYPE, 0x03, 0x01);
|
||||
regmap_write(es8326->regmap, ES8326_SYS_BIAS, 0x0a);
|
||||
regmap_update_bits(es8326->regmap, ES8326_HP_DRIVER_REF, 0x0f, 0x03);
|
||||
regmap_write(es8326->regmap, ES8326_INT_SOURCE, ES8326_INT_SRC_PIN9);
|
||||
/*
|
||||
* Inverted HPJACK_POL bit to trigger one IRQ to double check HP Removal event
|
||||
*/
|
||||
@ -857,6 +857,8 @@ static void es8326_jack_detect_handler(struct work_struct *work)
|
||||
* set auto-check mode, then restart jack_detect_work after 400ms.
|
||||
* Don't report jack status.
|
||||
*/
|
||||
regmap_write(es8326->regmap, ES8326_INT_SOURCE,
|
||||
(ES8326_INT_SRC_PIN9 | ES8326_INT_SRC_BUTTON));
|
||||
regmap_update_bits(es8326->regmap, ES8326_HPDET_TYPE, 0x03, 0x01);
|
||||
es8326_enable_micbias(es8326->component);
|
||||
usleep_range(50000, 70000);
|
||||
@ -883,7 +885,6 @@ static void es8326_jack_detect_handler(struct work_struct *work)
|
||||
snd_soc_jack_report(es8326->jack,
|
||||
SND_JACK_HEADSET, SND_JACK_HEADSET);
|
||||
|
||||
regmap_write(es8326->regmap, ES8326_ADC_SCALE, 0x33);
|
||||
regmap_update_bits(es8326->regmap, ES8326_PGA_PDN,
|
||||
0x08, 0x08);
|
||||
regmap_update_bits(es8326->regmap, ES8326_PGAGAIN,
|
||||
@ -979,7 +980,7 @@ static int es8326_resume(struct snd_soc_component *component)
|
||||
regmap_write(es8326->regmap, ES8326_VMIDSEL, 0x0E);
|
||||
regmap_write(es8326->regmap, ES8326_ANA_LP, 0xf0);
|
||||
usleep_range(10000, 15000);
|
||||
regmap_write(es8326->regmap, ES8326_HPJACK_TIMER, 0xe9);
|
||||
regmap_write(es8326->regmap, ES8326_HPJACK_TIMER, 0xd9);
|
||||
regmap_write(es8326->regmap, ES8326_ANA_MICBIAS, 0xcb);
|
||||
/* set headphone default type and detect pin */
|
||||
regmap_write(es8326->regmap, ES8326_HPDET_TYPE, 0x83);
|
||||
@ -1030,8 +1031,7 @@ static int es8326_resume(struct snd_soc_component *component)
|
||||
es8326_enable_micbias(es8326->component);
|
||||
usleep_range(50000, 70000);
|
||||
regmap_update_bits(es8326->regmap, ES8326_HPDET_TYPE, 0x03, 0x00);
|
||||
regmap_write(es8326->regmap, ES8326_INT_SOURCE,
|
||||
(ES8326_INT_SRC_PIN9 | ES8326_INT_SRC_BUTTON));
|
||||
regmap_write(es8326->regmap, ES8326_INT_SOURCE, ES8326_INT_SRC_PIN9);
|
||||
regmap_write(es8326->regmap, ES8326_INTOUT_IO,
|
||||
es8326->interrupt_clk);
|
||||
regmap_write(es8326->regmap, ES8326_SDINOUT1_IO,
|
||||
@ -1052,6 +1052,8 @@ static int es8326_resume(struct snd_soc_component *component)
|
||||
es8326->hp = 0;
|
||||
es8326->hpl_vol = 0x03;
|
||||
es8326->hpr_vol = 0x03;
|
||||
|
||||
es8326_irq(es8326->irq, es8326);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1062,6 +1064,9 @@ static int es8326_suspend(struct snd_soc_component *component)
|
||||
cancel_delayed_work_sync(&es8326->jack_detect_work);
|
||||
es8326_disable_micbias(component);
|
||||
es8326->calibrated = false;
|
||||
regmap_write(es8326->regmap, ES8326_CLK_MUX, 0x2d);
|
||||
regmap_write(es8326->regmap, ES8326_DAC2HPMIX, 0x00);
|
||||
regmap_write(es8326->regmap, ES8326_ANA_PDN, 0x3b);
|
||||
regmap_write(es8326->regmap, ES8326_CLK_CTL, ES8326_CLK_OFF);
|
||||
regcache_cache_only(es8326->regmap, true);
|
||||
|
||||
|
@ -104,7 +104,7 @@
|
||||
#define ES8326_MUTE (3 << 0)
|
||||
|
||||
/* ES8326_CLK_CTL */
|
||||
#define ES8326_CLK_ON (0x7e << 0)
|
||||
#define ES8326_CLK_ON (0x7f << 0)
|
||||
#define ES8326_CLK_OFF (0 << 0)
|
||||
|
||||
/* ES8326_CLK_INV */
|
||||
|
@ -537,7 +537,7 @@ static int rt1316_sdw_hw_params(struct snd_pcm_substream *substream,
|
||||
retval = sdw_stream_add_slave(rt1316->sdw_slave, &stream_config,
|
||||
&port_config, 1, sdw_stream);
|
||||
if (retval) {
|
||||
dev_err(dai->dev, "Unable to configure port\n");
|
||||
dev_err(dai->dev, "%s: Unable to configure port\n", __func__);
|
||||
return retval;
|
||||
}
|
||||
|
||||
@ -577,12 +577,12 @@ static int rt1316_sdw_parse_dt(struct rt1316_sdw_priv *rt1316, struct device *de
|
||||
if (rt1316->bq_params_cnt) {
|
||||
rt1316->bq_params = devm_kzalloc(dev, rt1316->bq_params_cnt, GFP_KERNEL);
|
||||
if (!rt1316->bq_params) {
|
||||
dev_err(dev, "Could not allocate bq_params memory\n");
|
||||
dev_err(dev, "%s: Could not allocate bq_params memory\n", __func__);
|
||||
ret = -ENOMEM;
|
||||
} else {
|
||||
ret = device_property_read_u8_array(dev, "realtek,bq-params", rt1316->bq_params, rt1316->bq_params_cnt);
|
||||
if (ret < 0)
|
||||
dev_err(dev, "Could not read list of realtek,bq-params\n");
|
||||
dev_err(dev, "%s: Could not read list of realtek,bq-params\n", __func__);
|
||||
}
|
||||
}
|
||||
|
||||
@ -759,7 +759,7 @@ static int __maybe_unused rt1316_dev_resume(struct device *dev)
|
||||
time = wait_for_completion_timeout(&slave->initialization_complete,
|
||||
msecs_to_jiffies(RT1316_PROBE_TIMEOUT));
|
||||
if (!time) {
|
||||
dev_err(&slave->dev, "Initialization not complete, timed out\n");
|
||||
dev_err(&slave->dev, "%s: Initialization not complete, timed out\n", __func__);
|
||||
sdw_show_ping_status(slave->bus, true);
|
||||
|
||||
return -ETIMEDOUT;
|
||||
|
@ -606,7 +606,7 @@ static int rt1318_sdw_hw_params(struct snd_pcm_substream *substream,
|
||||
retval = sdw_stream_add_slave(rt1318->sdw_slave, &stream_config,
|
||||
&port_config, 1, sdw_stream);
|
||||
if (retval) {
|
||||
dev_err(dai->dev, "Unable to configure port\n");
|
||||
dev_err(dai->dev, "%s: Unable to configure port\n", __func__);
|
||||
return retval;
|
||||
}
|
||||
|
||||
@ -631,8 +631,8 @@ static int rt1318_sdw_hw_params(struct snd_pcm_substream *substream,
|
||||
sampling_rate = RT1318_SDCA_RATE_192000HZ;
|
||||
break;
|
||||
default:
|
||||
dev_err(component->dev, "Rate %d is not supported\n",
|
||||
params_rate(params));
|
||||
dev_err(component->dev, "%s: Rate %d is not supported\n",
|
||||
__func__, params_rate(params));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@ -835,7 +835,7 @@ static int __maybe_unused rt1318_dev_resume(struct device *dev)
|
||||
time = wait_for_completion_timeout(&slave->initialization_complete,
|
||||
msecs_to_jiffies(RT1318_PROBE_TIMEOUT));
|
||||
if (!time) {
|
||||
dev_err(&slave->dev, "Initialization not complete, timed out\n");
|
||||
dev_err(&slave->dev, "%s: Initialization not complete, timed out\n", __func__);
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
|
@ -132,7 +132,7 @@ static int rt5682_sdw_hw_params(struct snd_pcm_substream *substream,
|
||||
retval = sdw_stream_add_slave(rt5682->slave, &stream_config,
|
||||
&port_config, 1, sdw_stream);
|
||||
if (retval) {
|
||||
dev_err(dai->dev, "Unable to configure port\n");
|
||||
dev_err(dai->dev, "%s: Unable to configure port\n", __func__);
|
||||
return retval;
|
||||
}
|
||||
|
||||
@ -315,8 +315,8 @@ static int rt5682_sdw_init(struct device *dev, struct regmap *regmap,
|
||||
&rt5682_sdw_indirect_regmap);
|
||||
if (IS_ERR(rt5682->regmap)) {
|
||||
ret = PTR_ERR(rt5682->regmap);
|
||||
dev_err(dev, "Failed to allocate register map: %d\n",
|
||||
ret);
|
||||
dev_err(dev, "%s: Failed to allocate register map: %d\n",
|
||||
__func__, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -400,7 +400,7 @@ static int rt5682_io_init(struct device *dev, struct sdw_slave *slave)
|
||||
}
|
||||
|
||||
if (val != DEVICE_ID) {
|
||||
dev_err(dev, "Device with ID register %x is not rt5682\n", val);
|
||||
dev_err(dev, "%s: Device with ID register %x is not rt5682\n", __func__, val);
|
||||
ret = -ENODEV;
|
||||
goto err_nodev;
|
||||
}
|
||||
@ -648,7 +648,7 @@ static int rt5682_bus_config(struct sdw_slave *slave,
|
||||
|
||||
ret = rt5682_clock_config(&slave->dev);
|
||||
if (ret < 0)
|
||||
dev_err(&slave->dev, "Invalid clk config");
|
||||
dev_err(&slave->dev, "%s: Invalid clk config", __func__);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -763,19 +763,19 @@ static int __maybe_unused rt5682_dev_resume(struct device *dev)
|
||||
return 0;
|
||||
|
||||
if (!slave->unattach_request) {
|
||||
mutex_lock(&rt5682->disable_irq_lock);
|
||||
if (rt5682->disable_irq == true) {
|
||||
mutex_lock(&rt5682->disable_irq_lock);
|
||||
sdw_write_no_pm(slave, SDW_SCP_INTMASK1, SDW_SCP_INT1_IMPL_DEF);
|
||||
rt5682->disable_irq = false;
|
||||
mutex_unlock(&rt5682->disable_irq_lock);
|
||||
}
|
||||
mutex_unlock(&rt5682->disable_irq_lock);
|
||||
goto regmap_sync;
|
||||
}
|
||||
|
||||
time = wait_for_completion_timeout(&slave->initialization_complete,
|
||||
msecs_to_jiffies(RT5682_PROBE_TIMEOUT));
|
||||
if (!time) {
|
||||
dev_err(&slave->dev, "Initialization not complete, timed out\n");
|
||||
dev_err(&slave->dev, "%s: Initialization not complete, timed out\n", __func__);
|
||||
sdw_show_ping_status(slave->bus, true);
|
||||
|
||||
return -ETIMEDOUT;
|
||||
|
@ -37,8 +37,8 @@ static int rt700_index_write(struct regmap *regmap,
|
||||
|
||||
ret = regmap_write(regmap, addr, value);
|
||||
if (ret < 0)
|
||||
pr_err("Failed to set private value: %06x <= %04x ret=%d\n",
|
||||
addr, value, ret);
|
||||
pr_err("%s: Failed to set private value: %06x <= %04x ret=%d\n",
|
||||
__func__, addr, value, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -52,8 +52,8 @@ static int rt700_index_read(struct regmap *regmap,
|
||||
*value = 0;
|
||||
ret = regmap_read(regmap, addr, value);
|
||||
if (ret < 0)
|
||||
pr_err("Failed to get private value: %06x => %04x ret=%d\n",
|
||||
addr, *value, ret);
|
||||
pr_err("%s: Failed to get private value: %06x => %04x ret=%d\n",
|
||||
__func__, addr, *value, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -930,14 +930,14 @@ static int rt700_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
port_config.num += 2;
|
||||
break;
|
||||
default:
|
||||
dev_err(component->dev, "Invalid DAI id %d\n", dai->id);
|
||||
dev_err(component->dev, "%s: Invalid DAI id %d\n", __func__, dai->id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
retval = sdw_stream_add_slave(rt700->slave, &stream_config,
|
||||
&port_config, 1, sdw_stream);
|
||||
if (retval) {
|
||||
dev_err(dai->dev, "Unable to configure port\n");
|
||||
dev_err(dai->dev, "%s: Unable to configure port\n", __func__);
|
||||
return retval;
|
||||
}
|
||||
|
||||
@ -945,8 +945,8 @@ static int rt700_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
/* bit 3:0 Number of Channel */
|
||||
val |= (params_channels(params) - 1);
|
||||
} else {
|
||||
dev_err(component->dev, "Unsupported channels %d\n",
|
||||
params_channels(params));
|
||||
dev_err(component->dev, "%s: Unsupported channels %d\n",
|
||||
__func__, params_channels(params));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -438,20 +438,20 @@ static int __maybe_unused rt711_sdca_dev_resume(struct device *dev)
|
||||
return 0;
|
||||
|
||||
if (!slave->unattach_request) {
|
||||
mutex_lock(&rt711->disable_irq_lock);
|
||||
if (rt711->disable_irq == true) {
|
||||
mutex_lock(&rt711->disable_irq_lock);
|
||||
sdw_write_no_pm(slave, SDW_SCP_SDCA_INTMASK1, SDW_SCP_SDCA_INTMASK_SDCA_0);
|
||||
sdw_write_no_pm(slave, SDW_SCP_SDCA_INTMASK2, SDW_SCP_SDCA_INTMASK_SDCA_8);
|
||||
rt711->disable_irq = false;
|
||||
mutex_unlock(&rt711->disable_irq_lock);
|
||||
}
|
||||
mutex_unlock(&rt711->disable_irq_lock);
|
||||
goto regmap_sync;
|
||||
}
|
||||
|
||||
time = wait_for_completion_timeout(&slave->initialization_complete,
|
||||
msecs_to_jiffies(RT711_PROBE_TIMEOUT));
|
||||
if (!time) {
|
||||
dev_err(&slave->dev, "Initialization not complete, timed out\n");
|
||||
dev_err(&slave->dev, "%s: Initialization not complete, timed out\n", __func__);
|
||||
sdw_show_ping_status(slave->bus, true);
|
||||
|
||||
return -ETIMEDOUT;
|
||||
|
@ -36,8 +36,8 @@ static int rt711_sdca_index_write(struct rt711_sdca_priv *rt711,
|
||||
ret = regmap_write(regmap, addr, value);
|
||||
if (ret < 0)
|
||||
dev_err(&rt711->slave->dev,
|
||||
"Failed to set private value: %06x <= %04x ret=%d\n",
|
||||
addr, value, ret);
|
||||
"%s: Failed to set private value: %06x <= %04x ret=%d\n",
|
||||
__func__, addr, value, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -52,8 +52,8 @@ static int rt711_sdca_index_read(struct rt711_sdca_priv *rt711,
|
||||
ret = regmap_read(regmap, addr, value);
|
||||
if (ret < 0)
|
||||
dev_err(&rt711->slave->dev,
|
||||
"Failed to get private value: %06x => %04x ret=%d\n",
|
||||
addr, *value, ret);
|
||||
"%s: Failed to get private value: %06x => %04x ret=%d\n",
|
||||
__func__, addr, *value, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -1293,13 +1293,13 @@ static int rt711_sdca_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
retval = sdw_stream_add_slave(rt711->slave, &stream_config,
|
||||
&port_config, 1, sdw_stream);
|
||||
if (retval) {
|
||||
dev_err(dai->dev, "Unable to configure port\n");
|
||||
dev_err(dai->dev, "%s: Unable to configure port\n", __func__);
|
||||
return retval;
|
||||
}
|
||||
|
||||
if (params_channels(params) > 16) {
|
||||
dev_err(component->dev, "Unsupported channels %d\n",
|
||||
params_channels(params));
|
||||
dev_err(component->dev, "%s: Unsupported channels %d\n",
|
||||
__func__, params_channels(params));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@ -1318,8 +1318,8 @@ static int rt711_sdca_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
sampling_rate = RT711_SDCA_RATE_192000HZ;
|
||||
break;
|
||||
default:
|
||||
dev_err(component->dev, "Rate %d is not supported\n",
|
||||
params_rate(params));
|
||||
dev_err(component->dev, "%s: Rate %d is not supported\n",
|
||||
__func__, params_rate(params));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -408,7 +408,7 @@ static int rt711_bus_config(struct sdw_slave *slave,
|
||||
|
||||
ret = rt711_clock_config(&slave->dev);
|
||||
if (ret < 0)
|
||||
dev_err(&slave->dev, "Invalid clk config");
|
||||
dev_err(&slave->dev, "%s: Invalid clk config", __func__);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -536,19 +536,19 @@ static int __maybe_unused rt711_dev_resume(struct device *dev)
|
||||
return 0;
|
||||
|
||||
if (!slave->unattach_request) {
|
||||
mutex_lock(&rt711->disable_irq_lock);
|
||||
if (rt711->disable_irq == true) {
|
||||
mutex_lock(&rt711->disable_irq_lock);
|
||||
sdw_write_no_pm(slave, SDW_SCP_INTMASK1, SDW_SCP_INT1_IMPL_DEF);
|
||||
rt711->disable_irq = false;
|
||||
mutex_unlock(&rt711->disable_irq_lock);
|
||||
}
|
||||
mutex_unlock(&rt711->disable_irq_lock);
|
||||
goto regmap_sync;
|
||||
}
|
||||
|
||||
time = wait_for_completion_timeout(&slave->initialization_complete,
|
||||
msecs_to_jiffies(RT711_PROBE_TIMEOUT));
|
||||
if (!time) {
|
||||
dev_err(&slave->dev, "Initialization not complete, timed out\n");
|
||||
dev_err(&slave->dev, "%s: Initialization not complete, timed out\n", __func__);
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
|
@ -37,8 +37,8 @@ static int rt711_index_write(struct regmap *regmap,
|
||||
|
||||
ret = regmap_write(regmap, addr, value);
|
||||
if (ret < 0)
|
||||
pr_err("Failed to set private value: %06x <= %04x ret=%d\n",
|
||||
addr, value, ret);
|
||||
pr_err("%s: Failed to set private value: %06x <= %04x ret=%d\n",
|
||||
__func__, addr, value, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -52,8 +52,8 @@ static int rt711_index_read(struct regmap *regmap,
|
||||
*value = 0;
|
||||
ret = regmap_read(regmap, addr, value);
|
||||
if (ret < 0)
|
||||
pr_err("Failed to get private value: %06x => %04x ret=%d\n",
|
||||
addr, *value, ret);
|
||||
pr_err("%s: Failed to get private value: %06x => %04x ret=%d\n",
|
||||
__func__, addr, *value, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -428,7 +428,7 @@ static void rt711_jack_init(struct rt711_priv *rt711)
|
||||
RT711_HP_JD_FINAL_RESULT_CTL_JD12);
|
||||
break;
|
||||
default:
|
||||
dev_warn(rt711->component->dev, "Wrong JD source\n");
|
||||
dev_warn(rt711->component->dev, "%s: Wrong JD source\n", __func__);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -1020,7 +1020,7 @@ static int rt711_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
retval = sdw_stream_add_slave(rt711->slave, &stream_config,
|
||||
&port_config, 1, sdw_stream);
|
||||
if (retval) {
|
||||
dev_err(dai->dev, "Unable to configure port\n");
|
||||
dev_err(dai->dev, "%s: Unable to configure port\n", __func__);
|
||||
return retval;
|
||||
}
|
||||
|
||||
@ -1028,8 +1028,8 @@ static int rt711_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
/* bit 3:0 Number of Channel */
|
||||
val |= (params_channels(params) - 1);
|
||||
} else {
|
||||
dev_err(component->dev, "Unsupported channels %d\n",
|
||||
params_channels(params));
|
||||
dev_err(component->dev, "%s: Unsupported channels %d\n",
|
||||
__func__, params_channels(params));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -139,8 +139,8 @@ static int rt712_sdca_dmic_index_write(struct rt712_sdca_dmic_priv *rt712,
|
||||
ret = regmap_write(regmap, addr, value);
|
||||
if (ret < 0)
|
||||
dev_err(&rt712->slave->dev,
|
||||
"Failed to set private value: %06x <= %04x ret=%d\n",
|
||||
addr, value, ret);
|
||||
"%s: Failed to set private value: %06x <= %04x ret=%d\n",
|
||||
__func__, addr, value, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -155,8 +155,8 @@ static int rt712_sdca_dmic_index_read(struct rt712_sdca_dmic_priv *rt712,
|
||||
ret = regmap_read(regmap, addr, value);
|
||||
if (ret < 0)
|
||||
dev_err(&rt712->slave->dev,
|
||||
"Failed to get private value: %06x => %04x ret=%d\n",
|
||||
addr, *value, ret);
|
||||
"%s: Failed to get private value: %06x => %04x ret=%d\n",
|
||||
__func__, addr, *value, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -317,7 +317,8 @@ static int rt712_sdca_dmic_set_gain_put(struct snd_kcontrol *kcontrol,
|
||||
for (i = 0; i < p->count; i++) {
|
||||
err = regmap_write(rt712->mbq_regmap, p->reg_base + i, gain_val[i]);
|
||||
if (err < 0)
|
||||
dev_err(&rt712->slave->dev, "0x%08x can't be set\n", p->reg_base + i);
|
||||
dev_err(&rt712->slave->dev, "%s: 0x%08x can't be set\n",
|
||||
__func__, p->reg_base + i);
|
||||
}
|
||||
|
||||
return changed;
|
||||
@ -667,13 +668,13 @@ static int rt712_sdca_dmic_hw_params(struct snd_pcm_substream *substream,
|
||||
retval = sdw_stream_add_slave(rt712->slave, &stream_config,
|
||||
&port_config, 1, sdw_stream);
|
||||
if (retval) {
|
||||
dev_err(dai->dev, "Unable to configure port\n");
|
||||
dev_err(dai->dev, "%s: Unable to configure port\n", __func__);
|
||||
return retval;
|
||||
}
|
||||
|
||||
if (params_channels(params) > 4) {
|
||||
dev_err(component->dev, "Unsupported channels %d\n",
|
||||
params_channels(params));
|
||||
dev_err(component->dev, "%s: Unsupported channels %d\n",
|
||||
__func__, params_channels(params));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@ -698,8 +699,8 @@ static int rt712_sdca_dmic_hw_params(struct snd_pcm_substream *substream,
|
||||
sampling_rate = RT712_SDCA_RATE_192000HZ;
|
||||
break;
|
||||
default:
|
||||
dev_err(component->dev, "Rate %d is not supported\n",
|
||||
params_rate(params));
|
||||
dev_err(component->dev, "%s: Rate %d is not supported\n",
|
||||
__func__, params_rate(params));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@ -923,7 +924,8 @@ static int __maybe_unused rt712_sdca_dmic_dev_resume(struct device *dev)
|
||||
time = wait_for_completion_timeout(&slave->initialization_complete,
|
||||
msecs_to_jiffies(RT712_PROBE_TIMEOUT));
|
||||
if (!time) {
|
||||
dev_err(&slave->dev, "Initialization not complete, timed out\n");
|
||||
dev_err(&slave->dev, "%s: Initialization not complete, timed out\n",
|
||||
__func__);
|
||||
sdw_show_ping_status(slave->bus, true);
|
||||
|
||||
return -ETIMEDOUT;
|
||||
|
@ -438,20 +438,21 @@ static int __maybe_unused rt712_sdca_dev_resume(struct device *dev)
|
||||
return 0;
|
||||
|
||||
if (!slave->unattach_request) {
|
||||
mutex_lock(&rt712->disable_irq_lock);
|
||||
if (rt712->disable_irq == true) {
|
||||
mutex_lock(&rt712->disable_irq_lock);
|
||||
|
||||
sdw_write_no_pm(slave, SDW_SCP_SDCA_INTMASK1, SDW_SCP_SDCA_INTMASK_SDCA_0);
|
||||
sdw_write_no_pm(slave, SDW_SCP_SDCA_INTMASK2, SDW_SCP_SDCA_INTMASK_SDCA_8);
|
||||
rt712->disable_irq = false;
|
||||
mutex_unlock(&rt712->disable_irq_lock);
|
||||
}
|
||||
mutex_unlock(&rt712->disable_irq_lock);
|
||||
goto regmap_sync;
|
||||
}
|
||||
|
||||
time = wait_for_completion_timeout(&slave->initialization_complete,
|
||||
msecs_to_jiffies(RT712_PROBE_TIMEOUT));
|
||||
if (!time) {
|
||||
dev_err(&slave->dev, "Initialization not complete, timed out\n");
|
||||
dev_err(&slave->dev, "%s: Initialization not complete, timed out\n", __func__);
|
||||
sdw_show_ping_status(slave->bus, true);
|
||||
|
||||
return -ETIMEDOUT;
|
||||
|
@ -34,8 +34,8 @@ static int rt712_sdca_index_write(struct rt712_sdca_priv *rt712,
|
||||
ret = regmap_write(regmap, addr, value);
|
||||
if (ret < 0)
|
||||
dev_err(&rt712->slave->dev,
|
||||
"Failed to set private value: %06x <= %04x ret=%d\n",
|
||||
addr, value, ret);
|
||||
"%s: Failed to set private value: %06x <= %04x ret=%d\n",
|
||||
__func__, addr, value, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -50,8 +50,8 @@ static int rt712_sdca_index_read(struct rt712_sdca_priv *rt712,
|
||||
ret = regmap_read(regmap, addr, value);
|
||||
if (ret < 0)
|
||||
dev_err(&rt712->slave->dev,
|
||||
"Failed to get private value: %06x => %04x ret=%d\n",
|
||||
addr, *value, ret);
|
||||
"%s: Failed to get private value: %06x => %04x ret=%d\n",
|
||||
__func__, addr, *value, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -1060,13 +1060,13 @@ static int rt712_sdca_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
retval = sdw_stream_add_slave(rt712->slave, &stream_config,
|
||||
&port_config, 1, sdw_stream);
|
||||
if (retval) {
|
||||
dev_err(dai->dev, "Unable to configure port\n");
|
||||
dev_err(dai->dev, "%s: Unable to configure port\n", __func__);
|
||||
return retval;
|
||||
}
|
||||
|
||||
if (params_channels(params) > 16) {
|
||||
dev_err(component->dev, "Unsupported channels %d\n",
|
||||
params_channels(params));
|
||||
dev_err(component->dev, "%s: Unsupported channels %d\n",
|
||||
__func__, params_channels(params));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@ -1085,8 +1085,8 @@ static int rt712_sdca_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
sampling_rate = RT712_SDCA_RATE_192000HZ;
|
||||
break;
|
||||
default:
|
||||
dev_err(component->dev, "Rate %d is not supported\n",
|
||||
params_rate(params));
|
||||
dev_err(component->dev, "%s: Rate %d is not supported\n",
|
||||
__func__, params_rate(params));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@ -1106,7 +1106,7 @@ static int rt712_sdca_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
sampling_rate);
|
||||
break;
|
||||
default:
|
||||
dev_err(component->dev, "Wrong DAI id\n");
|
||||
dev_err(component->dev, "%s: Wrong DAI id\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -237,7 +237,7 @@ static int __maybe_unused rt715_dev_resume(struct device *dev)
|
||||
time = wait_for_completion_timeout(&slave->enumeration_complete,
|
||||
msecs_to_jiffies(RT715_PROBE_TIMEOUT));
|
||||
if (!time) {
|
||||
dev_err(&slave->dev, "Enumeration not complete, timed out\n");
|
||||
dev_err(&slave->dev, "%s: Enumeration not complete, timed out\n", __func__);
|
||||
sdw_show_ping_status(slave->bus, true);
|
||||
|
||||
return -ETIMEDOUT;
|
||||
|
@ -41,8 +41,8 @@ static int rt715_sdca_index_write(struct rt715_sdca_priv *rt715,
|
||||
ret = regmap_write(regmap, addr, value);
|
||||
if (ret < 0)
|
||||
dev_err(&rt715->slave->dev,
|
||||
"Failed to set private value: %08x <= %04x %d\n",
|
||||
addr, value, ret);
|
||||
"%s: Failed to set private value: %08x <= %04x %d\n",
|
||||
__func__, addr, value, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -59,8 +59,8 @@ static int rt715_sdca_index_read(struct rt715_sdca_priv *rt715,
|
||||
ret = regmap_read(regmap, addr, value);
|
||||
if (ret < 0)
|
||||
dev_err(&rt715->slave->dev,
|
||||
"Failed to get private value: %06x => %04x ret=%d\n",
|
||||
addr, *value, ret);
|
||||
"%s: Failed to get private value: %06x => %04x ret=%d\n",
|
||||
__func__, addr, *value, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -152,8 +152,8 @@ static int rt715_sdca_set_amp_gain_put(struct snd_kcontrol *kcontrol,
|
||||
mc->shift);
|
||||
ret = regmap_write(rt715->mbq_regmap, mc->reg + i, gain_val);
|
||||
if (ret != 0) {
|
||||
dev_err(component->dev, "Failed to write 0x%x=0x%x\n",
|
||||
mc->reg + i, gain_val);
|
||||
dev_err(component->dev, "%s: Failed to write 0x%x=0x%x\n",
|
||||
__func__, mc->reg + i, gain_val);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
@ -188,8 +188,8 @@ static int rt715_sdca_set_amp_gain_4ch_put(struct snd_kcontrol *kcontrol,
|
||||
ret = regmap_write(rt715->mbq_regmap, reg_base + i,
|
||||
gain_val);
|
||||
if (ret != 0) {
|
||||
dev_err(component->dev, "Failed to write 0x%x=0x%x\n",
|
||||
reg_base + i, gain_val);
|
||||
dev_err(component->dev, "%s: Failed to write 0x%x=0x%x\n",
|
||||
__func__, reg_base + i, gain_val);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
@ -224,8 +224,8 @@ static int rt715_sdca_set_amp_gain_8ch_put(struct snd_kcontrol *kcontrol,
|
||||
reg = i < 7 ? reg_base + i : (reg_base - 1) | BIT(15);
|
||||
ret = regmap_write(rt715->mbq_regmap, reg, gain_val);
|
||||
if (ret != 0) {
|
||||
dev_err(component->dev, "Failed to write 0x%x=0x%x\n",
|
||||
reg, gain_val);
|
||||
dev_err(component->dev, "%s: Failed to write 0x%x=0x%x\n",
|
||||
__func__, reg, gain_val);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
@ -246,8 +246,8 @@ static int rt715_sdca_set_amp_gain_get(struct snd_kcontrol *kcontrol,
|
||||
for (i = 0; i < 2; i++) {
|
||||
ret = regmap_read(rt715->mbq_regmap, mc->reg + i, &val);
|
||||
if (ret < 0) {
|
||||
dev_err(component->dev, "Failed to read 0x%x, ret=%d\n",
|
||||
mc->reg + i, ret);
|
||||
dev_err(component->dev, "%s: Failed to read 0x%x, ret=%d\n",
|
||||
__func__, mc->reg + i, ret);
|
||||
return ret;
|
||||
}
|
||||
ucontrol->value.integer.value[i] = rt715_sdca_get_gain(val, mc->shift);
|
||||
@ -271,8 +271,8 @@ static int rt715_sdca_set_amp_gain_4ch_get(struct snd_kcontrol *kcontrol,
|
||||
for (i = 0; i < 4; i++) {
|
||||
ret = regmap_read(rt715->mbq_regmap, reg_base + i, &val);
|
||||
if (ret < 0) {
|
||||
dev_err(component->dev, "Failed to read 0x%x, ret=%d\n",
|
||||
reg_base + i, ret);
|
||||
dev_err(component->dev, "%s: Failed to read 0x%x, ret=%d\n",
|
||||
__func__, reg_base + i, ret);
|
||||
return ret;
|
||||
}
|
||||
ucontrol->value.integer.value[i] = rt715_sdca_get_gain(val, gain_sft);
|
||||
@ -297,8 +297,8 @@ static int rt715_sdca_set_amp_gain_8ch_get(struct snd_kcontrol *kcontrol,
|
||||
for (i = 0; i < 8; i += 2) {
|
||||
ret = regmap_read(rt715->mbq_regmap, reg_base + i, &val_l);
|
||||
if (ret < 0) {
|
||||
dev_err(component->dev, "Failed to read 0x%x, ret=%d\n",
|
||||
reg_base + i, ret);
|
||||
dev_err(component->dev, "%s: Failed to read 0x%x, ret=%d\n",
|
||||
__func__, reg_base + i, ret);
|
||||
return ret;
|
||||
}
|
||||
ucontrol->value.integer.value[i] = (val_l >> gain_sft) / 10;
|
||||
@ -306,8 +306,8 @@ static int rt715_sdca_set_amp_gain_8ch_get(struct snd_kcontrol *kcontrol,
|
||||
reg = (i == 6) ? (reg_base - 1) | BIT(15) : reg_base + 1 + i;
|
||||
ret = regmap_read(rt715->mbq_regmap, reg, &val_r);
|
||||
if (ret < 0) {
|
||||
dev_err(component->dev, "Failed to read 0x%x, ret=%d\n",
|
||||
reg, ret);
|
||||
dev_err(component->dev, "%s: Failed to read 0x%x, ret=%d\n",
|
||||
__func__, reg, ret);
|
||||
return ret;
|
||||
}
|
||||
ucontrol->value.integer.value[i + 1] = (val_r >> gain_sft) / 10;
|
||||
@ -834,15 +834,15 @@ static int rt715_sdca_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
0xaf00);
|
||||
break;
|
||||
default:
|
||||
dev_err(component->dev, "Invalid DAI id %d\n", dai->id);
|
||||
dev_err(component->dev, "%s: Invalid DAI id %d\n", __func__, dai->id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
retval = sdw_stream_add_slave(rt715->slave, &stream_config,
|
||||
&port_config, 1, sdw_stream);
|
||||
if (retval) {
|
||||
dev_err(component->dev, "Unable to configure port, retval:%d\n",
|
||||
retval);
|
||||
dev_err(component->dev, "%s: Unable to configure port, retval:%d\n",
|
||||
__func__, retval);
|
||||
return retval;
|
||||
}
|
||||
|
||||
@ -893,8 +893,8 @@ static int rt715_sdca_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
val = 0xf;
|
||||
break;
|
||||
default:
|
||||
dev_err(component->dev, "Unsupported sample rate %d\n",
|
||||
params_rate(params));
|
||||
dev_err(component->dev, "%s: Unsupported sample rate %d\n",
|
||||
__func__, params_rate(params));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -482,7 +482,7 @@ static int rt715_bus_config(struct sdw_slave *slave,
|
||||
|
||||
ret = rt715_clock_config(&slave->dev);
|
||||
if (ret < 0)
|
||||
dev_err(&slave->dev, "Invalid clk config");
|
||||
dev_err(&slave->dev, "%s: Invalid clk config", __func__);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -554,7 +554,7 @@ static int __maybe_unused rt715_dev_resume(struct device *dev)
|
||||
time = wait_for_completion_timeout(&slave->initialization_complete,
|
||||
msecs_to_jiffies(RT715_PROBE_TIMEOUT));
|
||||
if (!time) {
|
||||
dev_err(&slave->dev, "Initialization not complete, timed out\n");
|
||||
dev_err(&slave->dev, "%s: Initialization not complete, timed out\n", __func__);
|
||||
sdw_show_ping_status(slave->bus, true);
|
||||
|
||||
return -ETIMEDOUT;
|
||||
|
@ -40,8 +40,8 @@ static int rt715_index_write(struct regmap *regmap, unsigned int reg,
|
||||
|
||||
ret = regmap_write(regmap, addr, value);
|
||||
if (ret < 0) {
|
||||
pr_err("Failed to set private value: %08x <= %04x %d\n",
|
||||
addr, value, ret);
|
||||
pr_err("%s: Failed to set private value: %08x <= %04x %d\n",
|
||||
__func__, addr, value, ret);
|
||||
}
|
||||
|
||||
return ret;
|
||||
@ -55,8 +55,8 @@ static int rt715_index_write_nid(struct regmap *regmap,
|
||||
|
||||
ret = regmap_write(regmap, addr, value);
|
||||
if (ret < 0)
|
||||
pr_err("Failed to set private value: %06x <= %04x ret=%d\n",
|
||||
addr, value, ret);
|
||||
pr_err("%s: Failed to set private value: %06x <= %04x ret=%d\n",
|
||||
__func__, addr, value, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -70,8 +70,8 @@ static int rt715_index_read_nid(struct regmap *regmap,
|
||||
*value = 0;
|
||||
ret = regmap_read(regmap, addr, value);
|
||||
if (ret < 0)
|
||||
pr_err("Failed to get private value: %06x => %04x ret=%d\n",
|
||||
addr, *value, ret);
|
||||
pr_err("%s: Failed to get private value: %06x => %04x ret=%d\n",
|
||||
__func__, addr, *value, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -862,14 +862,14 @@ static int rt715_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
rt715_index_write(rt715->regmap, RT715_SDW_INPUT_SEL, 0xa000);
|
||||
break;
|
||||
default:
|
||||
dev_err(component->dev, "Invalid DAI id %d\n", dai->id);
|
||||
dev_err(component->dev, "%s: Invalid DAI id %d\n", __func__, dai->id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
retval = sdw_stream_add_slave(rt715->slave, &stream_config,
|
||||
&port_config, 1, sdw_stream);
|
||||
if (retval) {
|
||||
dev_err(dai->dev, "Unable to configure port\n");
|
||||
dev_err(dai->dev, "%s: Unable to configure port\n", __func__);
|
||||
return retval;
|
||||
}
|
||||
|
||||
@ -883,8 +883,8 @@ static int rt715_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
val |= 0x0 << 8;
|
||||
break;
|
||||
default:
|
||||
dev_err(component->dev, "Unsupported sample rate %d\n",
|
||||
params_rate(params));
|
||||
dev_err(component->dev, "%s: Unsupported sample rate %d\n",
|
||||
__func__, params_rate(params));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@ -892,8 +892,8 @@ static int rt715_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
/* bit 3:0 Number of Channel */
|
||||
val |= (params_channels(params) - 1);
|
||||
} else {
|
||||
dev_err(component->dev, "Unsupported channels %d\n",
|
||||
params_channels(params));
|
||||
dev_err(component->dev, "%s: Unsupported channels %d\n",
|
||||
__func__, params_channels(params));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -467,13 +467,13 @@ static int __maybe_unused rt722_sdca_dev_resume(struct device *dev)
|
||||
return 0;
|
||||
|
||||
if (!slave->unattach_request) {
|
||||
mutex_lock(&rt722->disable_irq_lock);
|
||||
if (rt722->disable_irq == true) {
|
||||
mutex_lock(&rt722->disable_irq_lock);
|
||||
sdw_write_no_pm(slave, SDW_SCP_SDCA_INTMASK1, SDW_SCP_SDCA_INTMASK_SDCA_6);
|
||||
sdw_write_no_pm(slave, SDW_SCP_SDCA_INTMASK2, SDW_SCP_SDCA_INTMASK_SDCA_8);
|
||||
rt722->disable_irq = false;
|
||||
mutex_unlock(&rt722->disable_irq_lock);
|
||||
}
|
||||
mutex_unlock(&rt722->disable_irq_lock);
|
||||
goto regmap_sync;
|
||||
}
|
||||
|
||||
|
@ -35,8 +35,8 @@ int rt722_sdca_index_write(struct rt722_sdca_priv *rt722,
|
||||
ret = regmap_write(regmap, addr, value);
|
||||
if (ret < 0)
|
||||
dev_err(&rt722->slave->dev,
|
||||
"Failed to set private value: %06x <= %04x ret=%d\n",
|
||||
addr, value, ret);
|
||||
"%s: Failed to set private value: %06x <= %04x ret=%d\n",
|
||||
__func__, addr, value, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -51,8 +51,8 @@ int rt722_sdca_index_read(struct rt722_sdca_priv *rt722,
|
||||
ret = regmap_read(regmap, addr, value);
|
||||
if (ret < 0)
|
||||
dev_err(&rt722->slave->dev,
|
||||
"Failed to get private value: %06x => %04x ret=%d\n",
|
||||
addr, *value, ret);
|
||||
"%s: Failed to get private value: %06x => %04x ret=%d\n",
|
||||
__func__, addr, *value, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -663,7 +663,8 @@ static int rt722_sdca_dmic_set_gain_put(struct snd_kcontrol *kcontrol,
|
||||
for (i = 0; i < p->count; i++) {
|
||||
err = regmap_write(rt722->mbq_regmap, p->reg_base + i, gain_val[i]);
|
||||
if (err < 0)
|
||||
dev_err(&rt722->slave->dev, "%#08x can't be set\n", p->reg_base + i);
|
||||
dev_err(&rt722->slave->dev, "%s: %#08x can't be set\n",
|
||||
__func__, p->reg_base + i);
|
||||
}
|
||||
|
||||
return changed;
|
||||
@ -1211,13 +1212,13 @@ static int rt722_sdca_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
retval = sdw_stream_add_slave(rt722->slave, &stream_config,
|
||||
&port_config, 1, sdw_stream);
|
||||
if (retval) {
|
||||
dev_err(dai->dev, "Unable to configure port\n");
|
||||
dev_err(dai->dev, "%s: Unable to configure port\n", __func__);
|
||||
return retval;
|
||||
}
|
||||
|
||||
if (params_channels(params) > 16) {
|
||||
dev_err(component->dev, "Unsupported channels %d\n",
|
||||
params_channels(params));
|
||||
dev_err(component->dev, "%s: Unsupported channels %d\n",
|
||||
__func__, params_channels(params));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@ -1236,8 +1237,8 @@ static int rt722_sdca_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
sampling_rate = RT722_SDCA_RATE_192000HZ;
|
||||
break;
|
||||
default:
|
||||
dev_err(component->dev, "Rate %d is not supported\n",
|
||||
params_rate(params));
|
||||
dev_err(component->dev, "%s: Rate %d is not supported\n",
|
||||
__func__, params_rate(params));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -683,11 +683,12 @@ static void wm_adsp_control_remove(struct cs_dsp_coeff_ctl *cs_ctl)
|
||||
int wm_adsp_write_ctl(struct wm_adsp *dsp, const char *name, int type,
|
||||
unsigned int alg, void *buf, size_t len)
|
||||
{
|
||||
struct cs_dsp_coeff_ctl *cs_ctl = cs_dsp_get_ctl(&dsp->cs_dsp, name, type, alg);
|
||||
struct cs_dsp_coeff_ctl *cs_ctl;
|
||||
struct wm_coeff_ctl *ctl;
|
||||
int ret;
|
||||
|
||||
mutex_lock(&dsp->cs_dsp.pwr_lock);
|
||||
cs_ctl = cs_dsp_get_ctl(&dsp->cs_dsp, name, type, alg);
|
||||
ret = cs_dsp_coeff_write_ctrl(cs_ctl, 0, buf, len);
|
||||
mutex_unlock(&dsp->cs_dsp.pwr_lock);
|
||||
|
||||
|
@ -296,5 +296,6 @@ static struct platform_driver avs_da7219_driver = {
|
||||
|
||||
module_platform_driver(avs_da7219_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Intel da7219 machine driver");
|
||||
MODULE_AUTHOR("Cezary Rojewski <cezary.rojewski@intel.com>");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -96,4 +96,5 @@ static struct platform_driver avs_dmic_driver = {
|
||||
|
||||
module_platform_driver(avs_dmic_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Intel DMIC machine driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -326,4 +326,5 @@ static struct platform_driver avs_es8336_driver = {
|
||||
|
||||
module_platform_driver(avs_es8336_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Intel es8336 machine driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -125,4 +125,5 @@ static struct platform_driver avs_i2s_test_driver = {
|
||||
|
||||
module_platform_driver(avs_i2s_test_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Intel i2s test machine driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -154,4 +154,5 @@ static struct platform_driver avs_max98357a_driver = {
|
||||
|
||||
module_platform_driver(avs_max98357a_driver)
|
||||
|
||||
MODULE_DESCRIPTION("Intel max98357a machine driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -211,4 +211,5 @@ static struct platform_driver avs_max98373_driver = {
|
||||
|
||||
module_platform_driver(avs_max98373_driver)
|
||||
|
||||
MODULE_DESCRIPTION("Intel max98373 machine driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -208,4 +208,5 @@ static struct platform_driver avs_max98927_driver = {
|
||||
|
||||
module_platform_driver(avs_max98927_driver)
|
||||
|
||||
MODULE_DESCRIPTION("Intel max98927 machine driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -313,4 +313,5 @@ static struct platform_driver avs_nau8825_driver = {
|
||||
|
||||
module_platform_driver(avs_nau8825_driver)
|
||||
|
||||
MODULE_DESCRIPTION("Intel nau8825 machine driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -69,4 +69,5 @@ static struct platform_driver avs_probe_mb_driver = {
|
||||
|
||||
module_platform_driver(avs_probe_mb_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Intel probe machine driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -276,4 +276,5 @@ static struct platform_driver avs_rt274_driver = {
|
||||
|
||||
module_platform_driver(avs_rt274_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Intel rt274 machine driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -247,4 +247,5 @@ static struct platform_driver avs_rt286_driver = {
|
||||
|
||||
module_platform_driver(avs_rt286_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Intel rt286 machine driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -266,4 +266,5 @@ static struct platform_driver avs_rt298_driver = {
|
||||
|
||||
module_platform_driver(avs_rt298_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Intel rt298 machine driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -192,4 +192,5 @@ static struct platform_driver avs_rt5514_driver = {
|
||||
|
||||
module_platform_driver(avs_rt5514_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Intel rt5514 machine driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -265,4 +265,5 @@ static struct platform_driver avs_rt5663_driver = {
|
||||
|
||||
module_platform_driver(avs_rt5663_driver);
|
||||
|
||||
MODULE_DESCRIPTION("Intel rt5663 machine driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -341,5 +341,6 @@ static struct platform_driver avs_rt5682_driver = {
|
||||
|
||||
module_platform_driver(avs_rt5682_driver)
|
||||
|
||||
MODULE_DESCRIPTION("Intel rt5682 machine driver");
|
||||
MODULE_AUTHOR("Cezary Rojewski <cezary.rojewski@intel.com>");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -197,4 +197,5 @@ static struct platform_driver avs_ssm4567_driver = {
|
||||
|
||||
module_platform_driver(avs_ssm4567_driver)
|
||||
|
||||
MODULE_DESCRIPTION("Intel ssm4567 machine driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -263,7 +263,7 @@ int snd_soc_get_volsw(struct snd_kcontrol *kcontrol,
|
||||
int max = mc->max;
|
||||
int min = mc->min;
|
||||
int sign_bit = mc->sign_bit;
|
||||
unsigned int mask = (1 << fls(max)) - 1;
|
||||
unsigned int mask = (1ULL << fls(max)) - 1;
|
||||
unsigned int invert = mc->invert;
|
||||
int val;
|
||||
int ret;
|
||||
|
@ -57,6 +57,9 @@ struct snd_sof_dsp_ops sof_hda_common_ops = {
|
||||
.pcm_pointer = hda_dsp_pcm_pointer,
|
||||
.pcm_ack = hda_dsp_pcm_ack,
|
||||
|
||||
.get_dai_frame_counter = hda_dsp_get_stream_llp,
|
||||
.get_host_byte_counter = hda_dsp_get_stream_ldp,
|
||||
|
||||
/* firmware loading */
|
||||
.load_firmware = snd_sof_load_firmware_raw,
|
||||
|
||||
|
@ -7,6 +7,7 @@
|
||||
|
||||
#include <sound/pcm_params.h>
|
||||
#include <sound/hdaudio_ext.h>
|
||||
#include <sound/hda_register.h>
|
||||
#include <sound/hda-mlink.h>
|
||||
#include <sound/sof/ipc4/header.h>
|
||||
#include <uapi/sound/sof/header.h>
|
||||
@ -349,6 +350,16 @@ static int hda_trigger(struct snd_sof_dev *sdev, struct snd_soc_dai *cpu_dai,
|
||||
case SNDRV_PCM_TRIGGER_STOP:
|
||||
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
|
||||
snd_hdac_ext_stream_clear(hext_stream);
|
||||
|
||||
/*
|
||||
* Save the LLP registers in case the stream is
|
||||
* restarting due PAUSE_RELEASE, or START without a pcm
|
||||
* close/open since in this case the LLP register is not reset
|
||||
* to 0 and the delay calculation will return with invalid
|
||||
* results.
|
||||
*/
|
||||
hext_stream->pplcllpl = readl(hext_stream->pplc_addr + AZX_REG_PPLCLLPL);
|
||||
hext_stream->pplcllpu = readl(hext_stream->pplc_addr + AZX_REG_PPLCLLPU);
|
||||
break;
|
||||
default:
|
||||
dev_err(sdev->dev, "unknown trigger command %d\n", cmd);
|
||||
|
@ -681,17 +681,27 @@ static int hda_suspend(struct snd_sof_dev *sdev, bool runtime_suspend)
|
||||
struct sof_intel_hda_dev *hda = sdev->pdata->hw_pdata;
|
||||
const struct sof_intel_dsp_desc *chip = hda->desc;
|
||||
struct hdac_bus *bus = sof_to_bus(sdev);
|
||||
bool imr_lost = false;
|
||||
int ret, j;
|
||||
|
||||
/*
|
||||
* The memory used for IMR boot loses its content in deeper than S3 state
|
||||
* We must not try IMR boot on next power up (as it will fail).
|
||||
*
|
||||
* The memory used for IMR boot loses its content in deeper than S3
|
||||
* state on CAVS platforms.
|
||||
* On ACE platforms due to the system architecture the IMR content is
|
||||
* lost at S3 state already, they are tailored for s2idle use.
|
||||
* We must not try IMR boot on next power up in these cases as it will
|
||||
* fail.
|
||||
*/
|
||||
if (sdev->system_suspend_target > SOF_SUSPEND_S3 ||
|
||||
(chip->hw_ip_version >= SOF_INTEL_ACE_1_0 &&
|
||||
sdev->system_suspend_target == SOF_SUSPEND_S3))
|
||||
imr_lost = true;
|
||||
|
||||
/*
|
||||
* In case of firmware crash or boot failure set the skip_imr_boot to true
|
||||
* as well in order to try to re-load the firmware to do a 'cold' boot.
|
||||
*/
|
||||
if (sdev->system_suspend_target > SOF_SUSPEND_S3 ||
|
||||
sdev->fw_state == SOF_FW_CRASHED ||
|
||||
if (imr_lost || sdev->fw_state == SOF_FW_CRASHED ||
|
||||
sdev->fw_state == SOF_FW_BOOT_FAILED)
|
||||
hda->skip_imr_boot = true;
|
||||
|
||||
|
@ -259,8 +259,37 @@ int hda_dsp_pcm_open(struct snd_sof_dev *sdev,
|
||||
snd_pcm_hw_constraint_mask64(substream->runtime, SNDRV_PCM_HW_PARAM_FORMAT,
|
||||
SNDRV_PCM_FMTBIT_S16 | SNDRV_PCM_FMTBIT_S32);
|
||||
|
||||
/*
|
||||
* The dsp_max_burst_size_in_ms is the length of the maximum burst size
|
||||
* of the host DMA in the ALSA buffer.
|
||||
*
|
||||
* On playback start the DMA will transfer dsp_max_burst_size_in_ms
|
||||
* amount of data in one initial burst to fill up the host DMA buffer.
|
||||
* Consequent DMA burst sizes are shorter and their length can vary.
|
||||
* To make sure that userspace allocate large enough ALSA buffer we need
|
||||
* to place a constraint on the buffer time.
|
||||
*
|
||||
* On capture the DMA will transfer 1ms chunks.
|
||||
*
|
||||
* Exact dsp_max_burst_size_in_ms constraint is racy, so set the
|
||||
* constraint to a minimum of 2x dsp_max_burst_size_in_ms.
|
||||
*/
|
||||
if (spcm->stream[direction].dsp_max_burst_size_in_ms)
|
||||
snd_pcm_hw_constraint_minmax(substream->runtime,
|
||||
SNDRV_PCM_HW_PARAM_BUFFER_TIME,
|
||||
spcm->stream[direction].dsp_max_burst_size_in_ms * USEC_PER_MSEC * 2,
|
||||
UINT_MAX);
|
||||
|
||||
/* binding pcm substream to hda stream */
|
||||
substream->runtime->private_data = &dsp_stream->hstream;
|
||||
|
||||
/*
|
||||
* Reset the llp cache values (they are used for LLP compensation in
|
||||
* case the counter is not reset)
|
||||
*/
|
||||
dsp_stream->pplcllpl = 0;
|
||||
dsp_stream->pplcllpu = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1063,3 +1063,73 @@ snd_pcm_uframes_t hda_dsp_stream_get_position(struct hdac_stream *hstream,
|
||||
|
||||
return pos;
|
||||
}
|
||||
|
||||
#define merge_u64(u32_u, u32_l) (((u64)(u32_u) << 32) | (u32_l))
|
||||
|
||||
/**
|
||||
* hda_dsp_get_stream_llp - Retrieve the LLP (Linear Link Position) of the stream
|
||||
* @sdev: SOF device
|
||||
* @component: ASoC component
|
||||
* @substream: PCM substream
|
||||
*
|
||||
* Returns the raw Linear Link Position value
|
||||
*/
|
||||
u64 hda_dsp_get_stream_llp(struct snd_sof_dev *sdev,
|
||||
struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct hdac_stream *hstream = substream->runtime->private_data;
|
||||
struct hdac_ext_stream *hext_stream = stream_to_hdac_ext_stream(hstream);
|
||||
u32 llp_l, llp_u;
|
||||
|
||||
/*
|
||||
* The pplc_addr have been calculated during probe in
|
||||
* hda_dsp_stream_init():
|
||||
* pplc_addr = sdev->bar[HDA_DSP_PP_BAR] +
|
||||
* SOF_HDA_PPLC_BASE +
|
||||
* SOF_HDA_PPLC_MULTI * total_stream +
|
||||
* SOF_HDA_PPLC_INTERVAL * stream_index
|
||||
*
|
||||
* Use this pre-calculated address to avoid repeated re-calculation.
|
||||
*/
|
||||
llp_l = readl(hext_stream->pplc_addr + AZX_REG_PPLCLLPL);
|
||||
llp_u = readl(hext_stream->pplc_addr + AZX_REG_PPLCLLPU);
|
||||
|
||||
/* Compensate the LLP counter with the saved offset */
|
||||
if (hext_stream->pplcllpl || hext_stream->pplcllpu)
|
||||
return merge_u64(llp_u, llp_l) -
|
||||
merge_u64(hext_stream->pplcllpu, hext_stream->pplcllpl);
|
||||
|
||||
return merge_u64(llp_u, llp_l);
|
||||
}
|
||||
|
||||
/**
|
||||
* hda_dsp_get_stream_ldp - Retrieve the LDP (Linear DMA Position) of the stream
|
||||
* @sdev: SOF device
|
||||
* @component: ASoC component
|
||||
* @substream: PCM substream
|
||||
*
|
||||
* Returns the raw Linear Link Position value
|
||||
*/
|
||||
u64 hda_dsp_get_stream_ldp(struct snd_sof_dev *sdev,
|
||||
struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct hdac_stream *hstream = substream->runtime->private_data;
|
||||
struct hdac_ext_stream *hext_stream = stream_to_hdac_ext_stream(hstream);
|
||||
u32 ldp_l, ldp_u;
|
||||
|
||||
/*
|
||||
* The pphc_addr have been calculated during probe in
|
||||
* hda_dsp_stream_init():
|
||||
* pphc_addr = sdev->bar[HDA_DSP_PP_BAR] +
|
||||
* SOF_HDA_PPHC_BASE +
|
||||
* SOF_HDA_PPHC_INTERVAL * stream_index
|
||||
*
|
||||
* Use this pre-calculated address to avoid repeated re-calculation.
|
||||
*/
|
||||
ldp_l = readl(hext_stream->pphc_addr + AZX_REG_PPHCLDPL);
|
||||
ldp_u = readl(hext_stream->pphc_addr + AZX_REG_PPHCLDPU);
|
||||
|
||||
return ((u64)ldp_u << 32) | ldp_l;
|
||||
}
|
||||
|
@ -662,6 +662,12 @@ bool hda_dsp_check_stream_irq(struct snd_sof_dev *sdev);
|
||||
|
||||
snd_pcm_uframes_t hda_dsp_stream_get_position(struct hdac_stream *hstream,
|
||||
int direction, bool can_sleep);
|
||||
u64 hda_dsp_get_stream_llp(struct snd_sof_dev *sdev,
|
||||
struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream);
|
||||
u64 hda_dsp_get_stream_ldp(struct snd_sof_dev *sdev,
|
||||
struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream);
|
||||
|
||||
struct hdac_ext_stream *
|
||||
hda_dsp_stream_get(struct snd_sof_dev *sdev, int direction, u32 flags);
|
||||
|
@ -134,8 +134,6 @@ int sof_lnl_ops_init(struct snd_sof_dev *sdev)
|
||||
sof_lnl_ops.runtime_resume = lnl_hda_dsp_runtime_resume;
|
||||
}
|
||||
|
||||
sof_lnl_ops.get_stream_position = mtl_dsp_get_stream_hda_link_position;
|
||||
|
||||
/* dsp core get/put */
|
||||
sof_lnl_ops.core_get = mtl_dsp_core_get;
|
||||
sof_lnl_ops.core_put = mtl_dsp_core_put;
|
||||
|
@ -626,18 +626,6 @@ static int mtl_dsp_disable_interrupts(struct snd_sof_dev *sdev)
|
||||
return mtl_enable_interrupts(sdev, false);
|
||||
}
|
||||
|
||||
u64 mtl_dsp_get_stream_hda_link_position(struct snd_sof_dev *sdev,
|
||||
struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct hdac_stream *hstream = substream->runtime->private_data;
|
||||
u32 llp_l, llp_u;
|
||||
|
||||
llp_l = snd_sof_dsp_read(sdev, HDA_DSP_HDA_BAR, MTL_PPLCLLPL(hstream->index));
|
||||
llp_u = snd_sof_dsp_read(sdev, HDA_DSP_HDA_BAR, MTL_PPLCLLPU(hstream->index));
|
||||
return ((u64)llp_u << 32) | llp_l;
|
||||
}
|
||||
|
||||
int mtl_dsp_core_get(struct snd_sof_dev *sdev, int core)
|
||||
{
|
||||
const struct sof_ipc_pm_ops *pm_ops = sdev->ipc->ops->pm;
|
||||
@ -707,8 +695,6 @@ int sof_mtl_ops_init(struct snd_sof_dev *sdev)
|
||||
sof_mtl_ops.core_get = mtl_dsp_core_get;
|
||||
sof_mtl_ops.core_put = mtl_dsp_core_put;
|
||||
|
||||
sof_mtl_ops.get_stream_position = mtl_dsp_get_stream_hda_link_position;
|
||||
|
||||
sdev->private = kzalloc(sizeof(struct sof_ipc4_fw_data), GFP_KERNEL);
|
||||
if (!sdev->private)
|
||||
return -ENOMEM;
|
||||
|
@ -6,12 +6,6 @@
|
||||
* Copyright(c) 2020-2022 Intel Corporation. All rights reserved.
|
||||
*/
|
||||
|
||||
/* HDA Registers */
|
||||
#define MTL_PPLCLLPL_BASE 0x948
|
||||
#define MTL_PPLCLLPU_STRIDE 0x10
|
||||
#define MTL_PPLCLLPL(x) (MTL_PPLCLLPL_BASE + (x) * MTL_PPLCLLPU_STRIDE)
|
||||
#define MTL_PPLCLLPU(x) (MTL_PPLCLLPL_BASE + 0x4 + (x) * MTL_PPLCLLPU_STRIDE)
|
||||
|
||||
/* DSP Registers */
|
||||
#define MTL_HFDSSCS 0x1000
|
||||
#define MTL_HFDSSCS_SPA_MASK BIT(16)
|
||||
@ -103,9 +97,5 @@ int mtl_dsp_ipc_get_window_offset(struct snd_sof_dev *sdev, u32 id);
|
||||
|
||||
void mtl_ipc_dump(struct snd_sof_dev *sdev);
|
||||
|
||||
u64 mtl_dsp_get_stream_hda_link_position(struct snd_sof_dev *sdev,
|
||||
struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream);
|
||||
|
||||
int mtl_dsp_core_get(struct snd_sof_dev *sdev, int core);
|
||||
int mtl_dsp_core_put(struct snd_sof_dev *sdev, int core);
|
||||
|
@ -4,6 +4,7 @@
|
||||
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/sched/signal.h>
|
||||
#include <linux/sched/clock.h>
|
||||
#include <sound/sof/ipc4/header.h>
|
||||
#include "sof-priv.h"
|
||||
#include "ipc4-priv.h"
|
||||
@ -412,7 +413,6 @@ static int ipc4_mtrace_enable(struct snd_sof_dev *sdev)
|
||||
const struct sof_ipc_ops *iops = sdev->ipc->ops;
|
||||
struct sof_ipc4_msg msg;
|
||||
u64 system_time;
|
||||
ktime_t kt;
|
||||
int ret;
|
||||
|
||||
if (priv->mtrace_state != SOF_MTRACE_DISABLED)
|
||||
@ -424,9 +424,12 @@ static int ipc4_mtrace_enable(struct snd_sof_dev *sdev)
|
||||
msg.primary |= SOF_IPC4_MOD_INSTANCE(SOF_IPC4_MOD_INIT_BASEFW_INSTANCE_ID);
|
||||
msg.extension = SOF_IPC4_MOD_EXT_MSG_PARAM_ID(SOF_IPC4_FW_PARAM_SYSTEM_TIME);
|
||||
|
||||
/* The system time is in usec, UTC, epoch is 1601-01-01 00:00:00 */
|
||||
kt = ktime_add_us(ktime_get_real(), FW_EPOCH_DELTA * USEC_PER_SEC);
|
||||
system_time = ktime_to_us(kt);
|
||||
/*
|
||||
* local_clock() is used to align with dmesg, so both kernel and firmware logs have
|
||||
* the same base and a minor delta due to the IPC. system time is in us format but
|
||||
* local_clock() returns the time in ns, so convert to ns.
|
||||
*/
|
||||
system_time = div64_u64(local_clock(), NSEC_PER_USEC);
|
||||
msg.data_size = sizeof(system_time);
|
||||
msg.data_ptr = &system_time;
|
||||
ret = iops->set_get_data(sdev, &msg, msg.data_size, true);
|
||||
|
@ -15,6 +15,28 @@
|
||||
#include "ipc4-topology.h"
|
||||
#include "ipc4-fw-reg.h"
|
||||
|
||||
/**
|
||||
* struct sof_ipc4_timestamp_info - IPC4 timestamp info
|
||||
* @host_copier: the host copier of the pcm stream
|
||||
* @dai_copier: the dai copier of the pcm stream
|
||||
* @stream_start_offset: reported by fw in memory window (converted to frames)
|
||||
* @stream_end_offset: reported by fw in memory window (converted to frames)
|
||||
* @llp_offset: llp offset in memory window
|
||||
* @boundary: wrap boundary should be used for the LLP frame counter
|
||||
* @delay: Calculated and stored in pointer callback. The stored value is
|
||||
* returned in the delay callback.
|
||||
*/
|
||||
struct sof_ipc4_timestamp_info {
|
||||
struct sof_ipc4_copier *host_copier;
|
||||
struct sof_ipc4_copier *dai_copier;
|
||||
u64 stream_start_offset;
|
||||
u64 stream_end_offset;
|
||||
u32 llp_offset;
|
||||
|
||||
u64 boundary;
|
||||
snd_pcm_sframes_t delay;
|
||||
};
|
||||
|
||||
static int sof_ipc4_set_multi_pipeline_state(struct snd_sof_dev *sdev, u32 state,
|
||||
struct ipc4_pipeline_set_state_data *trigger_list)
|
||||
{
|
||||
@ -423,8 +445,19 @@ static int sof_ipc4_trigger_pipelines(struct snd_soc_component *component,
|
||||
}
|
||||
|
||||
/* return if this is the final state */
|
||||
if (state == SOF_IPC4_PIPE_PAUSED)
|
||||
if (state == SOF_IPC4_PIPE_PAUSED) {
|
||||
struct sof_ipc4_timestamp_info *time_info;
|
||||
|
||||
/*
|
||||
* Invalidate the stream_start_offset to make sure that it is
|
||||
* going to be updated if the stream resumes
|
||||
*/
|
||||
time_info = spcm->stream[substream->stream].private;
|
||||
if (time_info)
|
||||
time_info->stream_start_offset = SOF_IPC4_INVALID_STREAM_POSITION;
|
||||
|
||||
goto free;
|
||||
}
|
||||
skip_pause_transition:
|
||||
/* else set the RUNNING/RESET state in the DSP */
|
||||
ret = sof_ipc4_set_multi_pipeline_state(sdev, state, trigger_list);
|
||||
@ -464,14 +497,12 @@ static int sof_ipc4_pcm_trigger(struct snd_soc_component *component,
|
||||
|
||||
/* determine the pipeline state */
|
||||
switch (cmd) {
|
||||
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
|
||||
state = SOF_IPC4_PIPE_PAUSED;
|
||||
break;
|
||||
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
|
||||
case SNDRV_PCM_TRIGGER_RESUME:
|
||||
case SNDRV_PCM_TRIGGER_START:
|
||||
state = SOF_IPC4_PIPE_RUNNING;
|
||||
break;
|
||||
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
|
||||
case SNDRV_PCM_TRIGGER_SUSPEND:
|
||||
case SNDRV_PCM_TRIGGER_STOP:
|
||||
state = SOF_IPC4_PIPE_PAUSED;
|
||||
@ -703,6 +734,10 @@ static int sof_ipc4_pcm_setup(struct snd_sof_dev *sdev, struct snd_sof_pcm *spcm
|
||||
if (abi_version < SOF_IPC4_FW_REGS_ABI_VER)
|
||||
support_info = false;
|
||||
|
||||
/* For delay reporting the get_host_byte_counter callback is needed */
|
||||
if (!sof_ops(sdev) || !sof_ops(sdev)->get_host_byte_counter)
|
||||
support_info = false;
|
||||
|
||||
for_each_pcm_streams(stream) {
|
||||
pipeline_list = &spcm->stream[stream].pipeline_list;
|
||||
|
||||
@ -835,7 +870,6 @@ static int sof_ipc4_get_stream_start_offset(struct snd_sof_dev *sdev,
|
||||
struct sof_ipc4_copier *host_copier = time_info->host_copier;
|
||||
struct sof_ipc4_copier *dai_copier = time_info->dai_copier;
|
||||
struct sof_ipc4_pipeline_registers ppl_reg;
|
||||
u64 stream_start_position;
|
||||
u32 dai_sample_size;
|
||||
u32 ch, node_index;
|
||||
u32 offset;
|
||||
@ -852,38 +886,51 @@ static int sof_ipc4_get_stream_start_offset(struct snd_sof_dev *sdev,
|
||||
if (ppl_reg.stream_start_offset == SOF_IPC4_INVALID_STREAM_POSITION)
|
||||
return -EINVAL;
|
||||
|
||||
stream_start_position = ppl_reg.stream_start_offset;
|
||||
ch = dai_copier->data.out_format.fmt_cfg;
|
||||
ch = SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT(ch);
|
||||
dai_sample_size = (dai_copier->data.out_format.bit_depth >> 3) * ch;
|
||||
/* convert offset to sample count */
|
||||
do_div(stream_start_position, dai_sample_size);
|
||||
time_info->stream_start_offset = stream_start_position;
|
||||
|
||||
/* convert offsets to frame count */
|
||||
time_info->stream_start_offset = ppl_reg.stream_start_offset;
|
||||
do_div(time_info->stream_start_offset, dai_sample_size);
|
||||
time_info->stream_end_offset = ppl_reg.stream_end_offset;
|
||||
do_div(time_info->stream_end_offset, dai_sample_size);
|
||||
|
||||
/*
|
||||
* Calculate the wrap boundary need to be used for delay calculation
|
||||
* The host counter is in bytes, it will wrap earlier than the frames
|
||||
* based link counter.
|
||||
*/
|
||||
time_info->boundary = div64_u64(~((u64)0),
|
||||
frames_to_bytes(substream->runtime, 1));
|
||||
/* Initialize the delay value to 0 (no delay) */
|
||||
time_info->delay = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static snd_pcm_sframes_t sof_ipc4_pcm_delay(struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream)
|
||||
static int sof_ipc4_pcm_pointer(struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream,
|
||||
snd_pcm_uframes_t *pointer)
|
||||
{
|
||||
struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(component);
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct sof_ipc4_timestamp_info *time_info;
|
||||
struct sof_ipc4_llp_reading_slot llp;
|
||||
snd_pcm_uframes_t head_ptr, tail_ptr;
|
||||
snd_pcm_uframes_t head_cnt, tail_cnt;
|
||||
struct snd_sof_pcm_stream *stream;
|
||||
u64 dai_cnt, host_cnt, host_ptr;
|
||||
struct snd_sof_pcm *spcm;
|
||||
u64 tmp_ptr;
|
||||
int ret;
|
||||
|
||||
spcm = snd_sof_find_spcm_dai(component, rtd);
|
||||
if (!spcm)
|
||||
return 0;
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
stream = &spcm->stream[substream->stream];
|
||||
time_info = stream->private;
|
||||
if (!time_info)
|
||||
return 0;
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
/*
|
||||
* stream_start_offset is updated to memory window by FW based on
|
||||
@ -893,45 +940,116 @@ static snd_pcm_sframes_t sof_ipc4_pcm_delay(struct snd_soc_component *component,
|
||||
if (time_info->stream_start_offset == SOF_IPC4_INVALID_STREAM_POSITION) {
|
||||
ret = sof_ipc4_get_stream_start_offset(sdev, substream, stream, time_info);
|
||||
if (ret < 0)
|
||||
return 0;
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
/* For delay calculation we need the host counter */
|
||||
host_cnt = snd_sof_pcm_get_host_byte_counter(sdev, component, substream);
|
||||
host_ptr = host_cnt;
|
||||
|
||||
/* convert the host_cnt to frames */
|
||||
host_cnt = div64_u64(host_cnt, frames_to_bytes(substream->runtime, 1));
|
||||
|
||||
/*
|
||||
* HDaudio links don't support the LLP counter reported by firmware
|
||||
* the link position is read directly from hardware registers.
|
||||
* If the LLP counter is not reported by firmware in the SRAM window
|
||||
* then read the dai (link) counter via host accessible means if
|
||||
* available.
|
||||
*/
|
||||
if (!time_info->llp_offset) {
|
||||
tmp_ptr = snd_sof_pcm_get_stream_position(sdev, component, substream);
|
||||
if (!tmp_ptr)
|
||||
return 0;
|
||||
dai_cnt = snd_sof_pcm_get_dai_frame_counter(sdev, component, substream);
|
||||
if (!dai_cnt)
|
||||
return -EOPNOTSUPP;
|
||||
} else {
|
||||
sof_mailbox_read(sdev, time_info->llp_offset, &llp, sizeof(llp));
|
||||
tmp_ptr = ((u64)llp.reading.llp_u << 32) | llp.reading.llp_l;
|
||||
dai_cnt = ((u64)llp.reading.llp_u << 32) | llp.reading.llp_l;
|
||||
}
|
||||
dai_cnt += time_info->stream_end_offset;
|
||||
|
||||
/* In two cases dai dma position is not accurate
|
||||
/* In two cases dai dma counter is not accurate
|
||||
* (1) dai pipeline is started before host pipeline
|
||||
* (2) multiple streams mixed into one. Each stream has the same dai dma position
|
||||
* (2) multiple streams mixed into one. Each stream has the same dai dma
|
||||
* counter
|
||||
*
|
||||
* Firmware calculates correct stream_start_offset for all cases including above two.
|
||||
* Driver subtracts stream_start_offset from dai dma position to get accurate one
|
||||
* Firmware calculates correct stream_start_offset for all cases
|
||||
* including above two.
|
||||
* Driver subtracts stream_start_offset from dai dma counter to get
|
||||
* accurate one
|
||||
*/
|
||||
tmp_ptr -= time_info->stream_start_offset;
|
||||
|
||||
/* Calculate the delay taking into account that both pointer can wrap */
|
||||
div64_u64_rem(tmp_ptr, substream->runtime->boundary, &tmp_ptr);
|
||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
|
||||
head_ptr = substream->runtime->status->hw_ptr;
|
||||
tail_ptr = tmp_ptr;
|
||||
/*
|
||||
* On stream start the dai counter might not yet have reached the
|
||||
* stream_start_offset value which means that no frames have left the
|
||||
* DSP yet from the audio stream (on playback, capture streams have
|
||||
* offset of 0 as we start capturing right away).
|
||||
* In this case we need to adjust the distance between the counters by
|
||||
* increasing the host counter by (offset - dai_counter).
|
||||
* Otherwise the dai_counter needs to be adjusted to reflect the number
|
||||
* of valid frames passed on the DAI side.
|
||||
*
|
||||
* The delay is the difference between the counters on the two
|
||||
* sides of the DSP.
|
||||
*/
|
||||
if (dai_cnt < time_info->stream_start_offset) {
|
||||
host_cnt += time_info->stream_start_offset - dai_cnt;
|
||||
dai_cnt = 0;
|
||||
} else {
|
||||
head_ptr = tmp_ptr;
|
||||
tail_ptr = substream->runtime->status->hw_ptr;
|
||||
dai_cnt -= time_info->stream_start_offset;
|
||||
}
|
||||
|
||||
if (head_ptr < tail_ptr)
|
||||
return substream->runtime->boundary - tail_ptr + head_ptr;
|
||||
/* Wrap the dai counter at the boundary where the host counter wraps */
|
||||
div64_u64_rem(dai_cnt, time_info->boundary, &dai_cnt);
|
||||
|
||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
|
||||
head_cnt = host_cnt;
|
||||
tail_cnt = dai_cnt;
|
||||
} else {
|
||||
head_cnt = dai_cnt;
|
||||
tail_cnt = host_cnt;
|
||||
}
|
||||
|
||||
if (head_cnt < tail_cnt) {
|
||||
time_info->delay = time_info->boundary - tail_cnt + head_cnt;
|
||||
goto out;
|
||||
}
|
||||
|
||||
time_info->delay = head_cnt - tail_cnt;
|
||||
|
||||
out:
|
||||
/*
|
||||
* Convert the host byte counter to PCM pointer which wraps in buffer
|
||||
* and it is in frames
|
||||
*/
|
||||
div64_u64_rem(host_ptr, snd_pcm_lib_buffer_bytes(substream), &host_ptr);
|
||||
*pointer = bytes_to_frames(substream->runtime, host_ptr);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static snd_pcm_sframes_t sof_ipc4_pcm_delay(struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct sof_ipc4_timestamp_info *time_info;
|
||||
struct snd_sof_pcm_stream *stream;
|
||||
struct snd_sof_pcm *spcm;
|
||||
|
||||
spcm = snd_sof_find_spcm_dai(component, rtd);
|
||||
if (!spcm)
|
||||
return 0;
|
||||
|
||||
stream = &spcm->stream[substream->stream];
|
||||
time_info = stream->private;
|
||||
/*
|
||||
* Report the stored delay value calculated in the pointer callback.
|
||||
* In the unlikely event that the calculation was skipped/aborted, the
|
||||
* default 0 delay returned.
|
||||
*/
|
||||
if (time_info)
|
||||
return time_info->delay;
|
||||
|
||||
/* No delay information available, report 0 as delay */
|
||||
return 0;
|
||||
|
||||
return head_ptr - tail_ptr;
|
||||
}
|
||||
|
||||
const struct sof_ipc_pcm_ops ipc4_pcm_ops = {
|
||||
@ -941,6 +1059,7 @@ const struct sof_ipc_pcm_ops ipc4_pcm_ops = {
|
||||
.dai_link_fixup = sof_ipc4_pcm_dai_link_fixup,
|
||||
.pcm_setup = sof_ipc4_pcm_setup,
|
||||
.pcm_free = sof_ipc4_pcm_free,
|
||||
.pointer = sof_ipc4_pcm_pointer,
|
||||
.delay = sof_ipc4_pcm_delay,
|
||||
.ipc_first_on_start = true,
|
||||
.platform_stop_during_hw_free = true,
|
||||
|
@ -92,20 +92,6 @@ struct sof_ipc4_fw_data {
|
||||
struct mutex pipeline_state_mutex; /* protect pipeline triggers, ref counts and states */
|
||||
};
|
||||
|
||||
/**
|
||||
* struct sof_ipc4_timestamp_info - IPC4 timestamp info
|
||||
* @host_copier: the host copier of the pcm stream
|
||||
* @dai_copier: the dai copier of the pcm stream
|
||||
* @stream_start_offset: reported by fw in memory window
|
||||
* @llp_offset: llp offset in memory window
|
||||
*/
|
||||
struct sof_ipc4_timestamp_info {
|
||||
struct sof_ipc4_copier *host_copier;
|
||||
struct sof_ipc4_copier *dai_copier;
|
||||
u64 stream_start_offset;
|
||||
u32 llp_offset;
|
||||
};
|
||||
|
||||
extern const struct sof_ipc_fw_loader_ops ipc4_loader_ops;
|
||||
extern const struct sof_ipc_tplg_ops ipc4_tplg_ops;
|
||||
extern const struct sof_ipc_tplg_control_ops tplg_ipc4_control_ops;
|
||||
|
@ -412,8 +412,9 @@ static int sof_ipc4_widget_setup_pcm(struct snd_sof_widget *swidget)
|
||||
struct sof_ipc4_available_audio_format *available_fmt;
|
||||
struct snd_soc_component *scomp = swidget->scomp;
|
||||
struct sof_ipc4_copier *ipc4_copier;
|
||||
struct snd_sof_pcm *spcm;
|
||||
int node_type = 0;
|
||||
int ret;
|
||||
int ret, dir;
|
||||
|
||||
ipc4_copier = kzalloc(sizeof(*ipc4_copier), GFP_KERNEL);
|
||||
if (!ipc4_copier)
|
||||
@ -447,6 +448,25 @@ static int sof_ipc4_widget_setup_pcm(struct snd_sof_widget *swidget)
|
||||
}
|
||||
dev_dbg(scomp->dev, "host copier '%s' node_type %u\n", swidget->widget->name, node_type);
|
||||
|
||||
spcm = snd_sof_find_spcm_comp(scomp, swidget->comp_id, &dir);
|
||||
if (!spcm)
|
||||
goto skip_gtw_cfg;
|
||||
|
||||
if (dir == SNDRV_PCM_STREAM_PLAYBACK) {
|
||||
struct snd_sof_pcm_stream *sps = &spcm->stream[dir];
|
||||
|
||||
sof_update_ipc_object(scomp, &sps->dsp_max_burst_size_in_ms,
|
||||
SOF_COPIER_DEEP_BUFFER_TOKENS,
|
||||
swidget->tuples,
|
||||
swidget->num_tuples, sizeof(u32), 1);
|
||||
/* Set default DMA buffer size if it is not specified in topology */
|
||||
if (!sps->dsp_max_burst_size_in_ms)
|
||||
sps->dsp_max_burst_size_in_ms = SOF_IPC4_MIN_DMA_BUFFER_SIZE;
|
||||
} else {
|
||||
/* Capture data is copied from DSP to host in 1ms bursts */
|
||||
spcm->stream[dir].dsp_max_burst_size_in_ms = 1;
|
||||
}
|
||||
|
||||
skip_gtw_cfg:
|
||||
ipc4_copier->gtw_attr = kzalloc(sizeof(*ipc4_copier->gtw_attr), GFP_KERNEL);
|
||||
if (!ipc4_copier->gtw_attr) {
|
||||
|
@ -523,12 +523,26 @@ static inline int snd_sof_pcm_platform_ack(struct snd_sof_dev *sdev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline u64 snd_sof_pcm_get_stream_position(struct snd_sof_dev *sdev,
|
||||
struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream)
|
||||
static inline u64
|
||||
snd_sof_pcm_get_dai_frame_counter(struct snd_sof_dev *sdev,
|
||||
struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream)
|
||||
{
|
||||
if (sof_ops(sdev) && sof_ops(sdev)->get_stream_position)
|
||||
return sof_ops(sdev)->get_stream_position(sdev, component, substream);
|
||||
if (sof_ops(sdev) && sof_ops(sdev)->get_dai_frame_counter)
|
||||
return sof_ops(sdev)->get_dai_frame_counter(sdev, component,
|
||||
substream);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline u64
|
||||
snd_sof_pcm_get_host_byte_counter(struct snd_sof_dev *sdev,
|
||||
struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream)
|
||||
{
|
||||
if (sof_ops(sdev) && sof_ops(sdev)->get_host_byte_counter)
|
||||
return sof_ops(sdev)->get_host_byte_counter(sdev, component,
|
||||
substream);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -384,13 +384,21 @@ static snd_pcm_uframes_t sof_pcm_pointer(struct snd_soc_component *component,
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(component);
|
||||
const struct sof_ipc_pcm_ops *pcm_ops = sof_ipc_get_ops(sdev, pcm);
|
||||
struct snd_sof_pcm *spcm;
|
||||
snd_pcm_uframes_t host, dai;
|
||||
int ret = -EOPNOTSUPP;
|
||||
|
||||
/* nothing to do for BE */
|
||||
if (rtd->dai_link->no_pcm)
|
||||
return 0;
|
||||
|
||||
if (pcm_ops && pcm_ops->pointer)
|
||||
ret = pcm_ops->pointer(component, substream, &host);
|
||||
|
||||
if (ret != -EOPNOTSUPP)
|
||||
return ret ? ret : host;
|
||||
|
||||
/* use dsp ops pointer callback directly if set */
|
||||
if (sof_ops(sdev)->pcm_pointer)
|
||||
return sof_ops(sdev)->pcm_pointer(sdev, substream);
|
||||
|
@ -104,7 +104,10 @@ struct snd_sof_dai_config_data {
|
||||
* additional memory in the SOF PCM stream structure
|
||||
* @pcm_free: Function pointer for PCM free that can be used for freeing any
|
||||
* additional memory in the SOF PCM stream structure
|
||||
* @delay: Function pointer for pcm delay calculation
|
||||
* @pointer: Function pointer for pcm pointer
|
||||
* Note: the @pointer callback may return -EOPNOTSUPP which should be
|
||||
* handled in a same way as if the callback is not provided
|
||||
* @delay: Function pointer for pcm delay reporting
|
||||
* @reset_hw_params_during_stop: Flag indicating whether the hw_params should be reset during the
|
||||
* STOP pcm trigger
|
||||
* @ipc_first_on_start: Send IPC before invoking platform trigger during
|
||||
@ -125,6 +128,9 @@ struct sof_ipc_pcm_ops {
|
||||
int (*dai_link_fixup)(struct snd_soc_pcm_runtime *rtd, struct snd_pcm_hw_params *params);
|
||||
int (*pcm_setup)(struct snd_sof_dev *sdev, struct snd_sof_pcm *spcm);
|
||||
void (*pcm_free)(struct snd_sof_dev *sdev, struct snd_sof_pcm *spcm);
|
||||
int (*pointer)(struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream,
|
||||
snd_pcm_uframes_t *pointer);
|
||||
snd_pcm_sframes_t (*delay)(struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream);
|
||||
bool reset_hw_params_during_stop;
|
||||
@ -323,6 +329,7 @@ struct snd_sof_pcm_stream {
|
||||
struct work_struct period_elapsed_work;
|
||||
struct snd_soc_dapm_widget_list *list; /* list of connected DAPM widgets */
|
||||
bool d0i3_compatible; /* DSP can be in D0I3 when this pcm is opened */
|
||||
unsigned int dsp_max_burst_size_in_ms; /* The maximum size of the host DMA burst in ms */
|
||||
/*
|
||||
* flag to indicate that the DSP pipelines should be kept
|
||||
* active or not while suspending the stream
|
||||
|
@ -262,13 +262,25 @@ struct snd_sof_dsp_ops {
|
||||
int (*pcm_ack)(struct snd_sof_dev *sdev, struct snd_pcm_substream *substream); /* optional */
|
||||
|
||||
/*
|
||||
* optional callback to retrieve the link DMA position for the substream
|
||||
* when the position is not reported in the shared SRAM windows but
|
||||
* instead from a host-accessible hardware counter.
|
||||
* optional callback to retrieve the number of frames left/arrived from/to
|
||||
* the DSP on the DAI side (link/codec/DMIC/etc).
|
||||
*
|
||||
* The callback is used when the firmware does not provide this information
|
||||
* via the shared SRAM window and it can be retrieved by host.
|
||||
*/
|
||||
u64 (*get_stream_position)(struct snd_sof_dev *sdev,
|
||||
struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream); /* optional */
|
||||
u64 (*get_dai_frame_counter)(struct snd_sof_dev *sdev,
|
||||
struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream); /* optional */
|
||||
|
||||
/*
|
||||
* Optional callback to retrieve the number of bytes left/arrived from/to
|
||||
* the DSP on the host side (bytes between host ALSA buffer and DSP).
|
||||
*
|
||||
* The callback is needed for ALSA delay reporting.
|
||||
*/
|
||||
u64 (*get_host_byte_counter)(struct snd_sof_dev *sdev,
|
||||
struct snd_soc_component *component,
|
||||
struct snd_pcm_substream *substream); /* optional */
|
||||
|
||||
/* host read DSP stream data */
|
||||
int (*ipc_msg_data)(struct snd_sof_dev *sdev,
|
||||
|
Loading…
x
Reference in New Issue
Block a user