mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 04:02:20 +00:00
ASoC: Fixes for v5.11
A collection of driver specific fixes, mostly for x86 systems (or CODECs used mostly on x86) and all for relatively minor issues, the biggest one being fixing S24_LE format on Keem Bay systems. -----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEEreZoqmdXGLWf4p/qJNaLcl1Uh9AFAl+2peUACgkQJNaLcl1U h9COxAf/aq+7DrGjU1umHPD/zfS3ppjmN1hNCHBxqiCm1U9SBbBLGlnDMMcPqFQR wS8SKdDfhKONA7q7fhGDvvFZd07r9HzIFra+9HVjuc5ouKlPkoETF8uDfXqAdOkM sXkffe45Wh9DqWIPZOng8ZpKVGW6v3oUCAMrlx53t9LUT9Sd8oQrhsx3nwgr/CUb SmZiBFF5kWpK8CgG82PuDlCHEnsI4SEatYqHtEMYRBfE0K8fzROye7e7WCKBsb/8 QaDf1RrQ599GXLMVJzbFsXpybBwaaP7LWkKCDHfQbAeKZ6EAWH0agbvUq2X1H2nm /a3Th5SgL6Vm6KXYvIFGHyTq8rbPLg== =OkNz -----END PGP SIGNATURE----- Merge tag 'asoc-fix-v5.10-rc4' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-linus ASoC: Fixes for v5.11 A collection of driver specific fixes, mostly for x86 systems (or CODECs used mostly on x86) and all for relatively minor issues, the biggest one being fixing S24_LE format on Keem Bay systems.
This commit is contained in:
commit
aecd1fbe77
@ -8,10 +8,16 @@ Required properties:
|
||||
|
||||
- reg : The I2C address of the device.
|
||||
|
||||
Optional properties:
|
||||
|
||||
- realtek,power-up-delay-ms
|
||||
Set a delay time for flush work to be completed,
|
||||
this value is adjustable depending on platform.
|
||||
|
||||
Example:
|
||||
|
||||
rt1015: codec@28 {
|
||||
compatible = "realtek,rt1015";
|
||||
reg = <0x28>;
|
||||
realtek,power-up-delay-ms = <50>;
|
||||
};
|
||||
|
15
include/sound/rt1015.h
Normal file
15
include/sound/rt1015.h
Normal file
@ -0,0 +1,15 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* linux/sound/rt1015.h -- Platform data for RT1015
|
||||
*
|
||||
* Copyright 2020 Realtek Microelectronics
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_SND_RT1015_H
|
||||
#define __LINUX_SND_RT1015_H
|
||||
|
||||
struct rt1015_platform_data {
|
||||
unsigned int power_up_delay_ms;
|
||||
};
|
||||
|
||||
#endif
|
@ -27,10 +27,15 @@
|
||||
#include <sound/soc-dapm.h>
|
||||
#include <sound/soc.h>
|
||||
#include <sound/tlv.h>
|
||||
#include <sound/rt1015.h>
|
||||
|
||||
#include "rl6231.h"
|
||||
#include "rt1015.h"
|
||||
|
||||
static const struct rt1015_platform_data i2s_default_platform_data = {
|
||||
.power_up_delay_ms = 50,
|
||||
};
|
||||
|
||||
static const struct reg_default rt1015_reg[] = {
|
||||
{ 0x0000, 0x0000 },
|
||||
{ 0x0004, 0xa000 },
|
||||
@ -539,7 +544,7 @@ static void rt1015_flush_work(struct work_struct *work)
|
||||
struct rt1015_priv *rt1015 = container_of(work, struct rt1015_priv,
|
||||
flush_work.work);
|
||||
struct snd_soc_component *component = rt1015->component;
|
||||
unsigned int val, i = 0, count = 20;
|
||||
unsigned int val, i = 0, count = 200;
|
||||
|
||||
while (i < count) {
|
||||
usleep_range(1000, 1500);
|
||||
@ -650,6 +655,7 @@ static int rt1015_amp_drv_event(struct snd_soc_dapm_widget *w,
|
||||
case SND_SOC_DAPM_POST_PMU:
|
||||
if (rt1015->hw_config == RT1015_HW_28)
|
||||
schedule_delayed_work(&rt1015->flush_work, msecs_to_jiffies(10));
|
||||
msleep(rt1015->pdata.power_up_delay_ms);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -1067,9 +1073,16 @@ static struct acpi_device_id rt1015_acpi_match[] = {
|
||||
MODULE_DEVICE_TABLE(acpi, rt1015_acpi_match);
|
||||
#endif
|
||||
|
||||
static void rt1015_parse_dt(struct rt1015_priv *rt1015, struct device *dev)
|
||||
{
|
||||
device_property_read_u32(dev, "realtek,power-up-delay-ms",
|
||||
&rt1015->pdata.power_up_delay_ms);
|
||||
}
|
||||
|
||||
static int rt1015_i2c_probe(struct i2c_client *i2c,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct rt1015_platform_data *pdata = dev_get_platdata(&i2c->dev);
|
||||
struct rt1015_priv *rt1015;
|
||||
int ret;
|
||||
unsigned int val;
|
||||
@ -1081,6 +1094,13 @@ static int rt1015_i2c_probe(struct i2c_client *i2c,
|
||||
|
||||
i2c_set_clientdata(i2c, rt1015);
|
||||
|
||||
rt1015->pdata = i2s_default_platform_data;
|
||||
|
||||
if (pdata)
|
||||
rt1015->pdata = *pdata;
|
||||
else
|
||||
rt1015_parse_dt(rt1015, &i2c->dev);
|
||||
|
||||
rt1015->regmap = devm_regmap_init_i2c(i2c, &rt1015_regmap);
|
||||
if (IS_ERR(rt1015->regmap)) {
|
||||
ret = PTR_ERR(rt1015->regmap);
|
||||
|
@ -12,6 +12,7 @@
|
||||
|
||||
#ifndef __RT1015_H__
|
||||
#define __RT1015_H__
|
||||
#include <sound/rt1015.h>
|
||||
|
||||
#define RT1015_DEVICE_ID_VAL 0x1011
|
||||
#define RT1015_DEVICE_ID_VAL2 0x1015
|
||||
@ -380,6 +381,7 @@ enum {
|
||||
|
||||
struct rt1015_priv {
|
||||
struct snd_soc_component *component;
|
||||
struct rt1015_platform_data pdata;
|
||||
struct regmap *regmap;
|
||||
int sysclk;
|
||||
int sysclk_src;
|
||||
|
@ -700,6 +700,8 @@ static int kabylake_set_bias_level(struct snd_soc_card *card,
|
||||
switch (level) {
|
||||
case SND_SOC_BIAS_PREPARE:
|
||||
if (dapm->bias_level == SND_SOC_BIAS_ON) {
|
||||
if (!__clk_is_enabled(priv->mclk))
|
||||
return 0;
|
||||
dev_dbg(card->dev, "Disable mclk");
|
||||
clk_disable_unprepare(priv->mclk);
|
||||
} else {
|
||||
|
@ -458,10 +458,6 @@ static int catpt_dai_prepare(struct snd_pcm_substream *substream,
|
||||
if (ret)
|
||||
return CATPT_IPC_ERROR(ret);
|
||||
|
||||
ret = catpt_dsp_update_lpclock(cdev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = catpt_dai_apply_usettings(dai, stream);
|
||||
if (ret)
|
||||
return ret;
|
||||
@ -500,6 +496,7 @@ static int catpt_dai_trigger(struct snd_pcm_substream *substream, int cmd,
|
||||
case SNDRV_PCM_TRIGGER_RESUME:
|
||||
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
|
||||
resume_stream:
|
||||
catpt_dsp_update_lpclock(cdev);
|
||||
ret = catpt_ipc_resume_stream(cdev, stream->info.stream_hw_id);
|
||||
if (ret)
|
||||
return CATPT_IPC_ERROR(ret);
|
||||
@ -507,11 +504,11 @@ static int catpt_dai_trigger(struct snd_pcm_substream *substream, int cmd,
|
||||
|
||||
case SNDRV_PCM_TRIGGER_STOP:
|
||||
stream->prepared = false;
|
||||
catpt_dsp_update_lpclock(cdev);
|
||||
fallthrough;
|
||||
case SNDRV_PCM_TRIGGER_SUSPEND:
|
||||
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
|
||||
ret = catpt_ipc_pause_stream(cdev, stream->info.stream_hw_id);
|
||||
catpt_dsp_update_lpclock(cdev);
|
||||
if (ret)
|
||||
return CATPT_IPC_ERROR(ret);
|
||||
break;
|
||||
@ -534,6 +531,8 @@ void catpt_stream_update_position(struct catpt_dev *cdev,
|
||||
|
||||
dsppos = bytes_to_frames(r, pos->stream_position);
|
||||
|
||||
if (!stream->prepared)
|
||||
goto exit;
|
||||
/* only offload is set_write_pos driven */
|
||||
if (stream->template->type != CATPT_STRM_TYPE_RENDER)
|
||||
goto exit;
|
||||
|
@ -487,9 +487,9 @@ static int kmb_dai_hw_params(struct snd_pcm_substream *substream,
|
||||
kmb_i2s->xfer_resolution = 0x02;
|
||||
break;
|
||||
case SNDRV_PCM_FORMAT_S24_LE:
|
||||
config->data_width = 24;
|
||||
kmb_i2s->ccr = 0x08;
|
||||
kmb_i2s->xfer_resolution = 0x04;
|
||||
config->data_width = 32;
|
||||
kmb_i2s->ccr = 0x14;
|
||||
kmb_i2s->xfer_resolution = 0x05;
|
||||
break;
|
||||
case SNDRV_PCM_FORMAT_S32_LE:
|
||||
config->data_width = 32;
|
||||
|
@ -122,8 +122,10 @@ static int lpass_platform_pcmops_open(struct snd_soc_component *component,
|
||||
else
|
||||
dma_ch = 0;
|
||||
|
||||
if (dma_ch < 0)
|
||||
if (dma_ch < 0) {
|
||||
kfree(data);
|
||||
return dma_ch;
|
||||
}
|
||||
|
||||
if (cpu_dai->driver->id == LPASS_DP_RX) {
|
||||
map = drvdata->hdmiif_map;
|
||||
@ -147,6 +149,7 @@ static int lpass_platform_pcmops_open(struct snd_soc_component *component,
|
||||
ret = snd_pcm_hw_constraint_integer(runtime,
|
||||
SNDRV_PCM_HW_PARAM_PERIODS);
|
||||
if (ret < 0) {
|
||||
kfree(data);
|
||||
dev_err(soc_runtime->dev, "setting constraints failed: %d\n",
|
||||
ret);
|
||||
return -EINVAL;
|
||||
|
Loading…
Reference in New Issue
Block a user