Commit 5948342a authored by Takashi Iwai's avatar Takashi Iwai

Merge tag 'asoc-fix-v5.17-rc4' of...

Merge tag 'asoc-fix-v5.17-rc4' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-linus

ASoC: Fixes for v5.18

More fixes that have arrived in the past few -rcs, plus a MAINTAINERS
update.  The biggest update here is the fix for control change
notifications in ASoC generic controls found by mixer-test.
parents 2a845837 a887f9c7
...@@ -8,6 +8,7 @@ title: Audio codec controlled by ChromeOS EC ...@@ -8,6 +8,7 @@ title: Audio codec controlled by ChromeOS EC
maintainers: maintainers:
- Cheng-Yi Chiang <cychiang@chromium.org> - Cheng-Yi Chiang <cychiang@chromium.org>
- Tzung-Bi Shih <tzungbi@google.com>
description: | description: |
Google's ChromeOS EC codec is a digital mic codec provided by the Google's ChromeOS EC codec is a digital mic codec provided by the
......
...@@ -4543,6 +4543,7 @@ F: drivers/platform/chrome/ ...@@ -4543,6 +4543,7 @@ F: drivers/platform/chrome/
CHROMEOS EC CODEC DRIVER CHROMEOS EC CODEC DRIVER
M: Cheng-Yi Chiang <cychiang@chromium.org> M: Cheng-Yi Chiang <cychiang@chromium.org>
M: Tzung-Bi Shih <tzungbi@google.com>
R: Guenter Roeck <groeck@chromium.org> R: Guenter Roeck <groeck@chromium.org>
S: Maintained S: Maintained
F: Documentation/devicetree/bindings/sound/google,cros-ec-codec.yaml F: Documentation/devicetree/bindings/sound/google,cros-ec-codec.yaml
......
...@@ -411,17 +411,12 @@ static int scpsys_power_off(struct generic_pm_domain *genpd) ...@@ -411,17 +411,12 @@ static int scpsys_power_off(struct generic_pm_domain *genpd)
return ret; return ret;
} }
static int init_clks(struct platform_device *pdev, struct clk **clk) static void init_clks(struct platform_device *pdev, struct clk **clk)
{ {
int i; int i;
for (i = CLK_NONE + 1; i < CLK_MAX; i++) { for (i = CLK_NONE + 1; i < CLK_MAX; i++)
clk[i] = devm_clk_get(&pdev->dev, clk_names[i]); clk[i] = devm_clk_get(&pdev->dev, clk_names[i]);
if (IS_ERR(clk[i]))
return PTR_ERR(clk[i]);
}
return 0;
} }
static struct scp *init_scp(struct platform_device *pdev, static struct scp *init_scp(struct platform_device *pdev,
...@@ -431,7 +426,7 @@ static struct scp *init_scp(struct platform_device *pdev, ...@@ -431,7 +426,7 @@ static struct scp *init_scp(struct platform_device *pdev,
{ {
struct genpd_onecell_data *pd_data; struct genpd_onecell_data *pd_data;
struct resource *res; struct resource *res;
int i, j, ret; int i, j;
struct scp *scp; struct scp *scp;
struct clk *clk[CLK_MAX]; struct clk *clk[CLK_MAX];
...@@ -486,9 +481,7 @@ static struct scp *init_scp(struct platform_device *pdev, ...@@ -486,9 +481,7 @@ static struct scp *init_scp(struct platform_device *pdev,
pd_data->num_domains = num; pd_data->num_domains = num;
ret = init_clks(pdev, clk); init_clks(pdev, clk);
if (ret)
return ERR_PTR(ret);
for (i = 0; i < num; i++) { for (i = 0; i < num; i++) {
struct scp_domain *scpd = &scp->domains[i]; struct scp_domain *scpd = &scp->domains[i];
......
...@@ -21,7 +21,6 @@ ...@@ -21,7 +21,6 @@
#include <linux/gpio/consumer.h> #include <linux/gpio/consumer.h>
#define EN_SPKR_GPIO_GB 0x11F #define EN_SPKR_GPIO_GB 0x11F
#define EN_SPKR_GPIO_NK 0x146
#define EN_SPKR_GPIO_NONE -EINVAL #define EN_SPKR_GPIO_NONE -EINVAL
enum be_id { enum be_id {
......
...@@ -37,7 +37,7 @@ static struct acp_card_drvdata sof_rt5682_max_data = { ...@@ -37,7 +37,7 @@ static struct acp_card_drvdata sof_rt5682_max_data = {
.hs_codec_id = RT5682, .hs_codec_id = RT5682,
.amp_codec_id = MAX98360A, .amp_codec_id = MAX98360A,
.dmic_codec_id = DMIC, .dmic_codec_id = DMIC,
.gpio_spkr_en = EN_SPKR_GPIO_NK, .gpio_spkr_en = EN_SPKR_GPIO_NONE,
}; };
static struct acp_card_drvdata sof_rt5682s_max_data = { static struct acp_card_drvdata sof_rt5682s_max_data = {
...@@ -47,7 +47,7 @@ static struct acp_card_drvdata sof_rt5682s_max_data = { ...@@ -47,7 +47,7 @@ static struct acp_card_drvdata sof_rt5682s_max_data = {
.hs_codec_id = RT5682S, .hs_codec_id = RT5682S,
.amp_codec_id = MAX98360A, .amp_codec_id = MAX98360A,
.dmic_codec_id = DMIC, .dmic_codec_id = DMIC,
.gpio_spkr_en = EN_SPKR_GPIO_NK, .gpio_spkr_en = EN_SPKR_GPIO_NONE,
}; };
static const struct snd_kcontrol_new acp_controls[] = { static const struct snd_kcontrol_new acp_controls[] = {
......
...@@ -1022,11 +1022,13 @@ static void rt5668_jack_detect_handler(struct work_struct *work) ...@@ -1022,11 +1022,13 @@ static void rt5668_jack_detect_handler(struct work_struct *work)
container_of(work, struct rt5668_priv, jack_detect_work.work); container_of(work, struct rt5668_priv, jack_detect_work.work);
int val, btn_type; int val, btn_type;
while (!rt5668->component) if (!rt5668->component || !rt5668->component->card ||
usleep_range(10000, 15000); !rt5668->component->card->instantiated) {
/* card not yet ready, try later */
while (!rt5668->component->card->instantiated) mod_delayed_work(system_power_efficient_wq,
usleep_range(10000, 15000); &rt5668->jack_detect_work, msecs_to_jiffies(15));
return;
}
mutex_lock(&rt5668->calibrate_mutex); mutex_lock(&rt5668->calibrate_mutex);
......
...@@ -1092,11 +1092,13 @@ void rt5682_jack_detect_handler(struct work_struct *work) ...@@ -1092,11 +1092,13 @@ void rt5682_jack_detect_handler(struct work_struct *work)
struct snd_soc_dapm_context *dapm; struct snd_soc_dapm_context *dapm;
int val, btn_type; int val, btn_type;
while (!rt5682->component) if (!rt5682->component || !rt5682->component->card ||
usleep_range(10000, 15000); !rt5682->component->card->instantiated) {
/* card not yet ready, try later */
while (!rt5682->component->card->instantiated) mod_delayed_work(system_power_efficient_wq,
usleep_range(10000, 15000); &rt5682->jack_detect_work, msecs_to_jiffies(15));
return;
}
dapm = snd_soc_component_get_dapm(rt5682->component); dapm = snd_soc_component_get_dapm(rt5682->component);
......
...@@ -824,11 +824,13 @@ static void rt5682s_jack_detect_handler(struct work_struct *work) ...@@ -824,11 +824,13 @@ static void rt5682s_jack_detect_handler(struct work_struct *work)
container_of(work, struct rt5682s_priv, jack_detect_work.work); container_of(work, struct rt5682s_priv, jack_detect_work.work);
int val, btn_type; int val, btn_type;
while (!rt5682s->component) if (!rt5682s->component || !rt5682s->component->card ||
usleep_range(10000, 15000); !rt5682s->component->card->instantiated) {
/* card not yet ready, try later */
while (!rt5682s->component->card->instantiated) mod_delayed_work(system_power_efficient_wq,
usleep_range(10000, 15000); &rt5682s->jack_detect_work, msecs_to_jiffies(15));
return;
}
mutex_lock(&rt5682s->jdet_mutex); mutex_lock(&rt5682s->jdet_mutex);
mutex_lock(&rt5682s->calibrate_mutex); mutex_lock(&rt5682s->calibrate_mutex);
......
...@@ -38,10 +38,12 @@ static void tas2770_reset(struct tas2770_priv *tas2770) ...@@ -38,10 +38,12 @@ static void tas2770_reset(struct tas2770_priv *tas2770)
gpiod_set_value_cansleep(tas2770->reset_gpio, 0); gpiod_set_value_cansleep(tas2770->reset_gpio, 0);
msleep(20); msleep(20);
gpiod_set_value_cansleep(tas2770->reset_gpio, 1); gpiod_set_value_cansleep(tas2770->reset_gpio, 1);
usleep_range(1000, 2000);
} }
snd_soc_component_write(tas2770->component, TAS2770_SW_RST, snd_soc_component_write(tas2770->component, TAS2770_SW_RST,
TAS2770_RST); TAS2770_RST);
usleep_range(1000, 2000);
} }
static int tas2770_set_bias_level(struct snd_soc_component *component, static int tas2770_set_bias_level(struct snd_soc_component *component,
...@@ -110,6 +112,7 @@ static int tas2770_codec_resume(struct snd_soc_component *component) ...@@ -110,6 +112,7 @@ static int tas2770_codec_resume(struct snd_soc_component *component)
if (tas2770->sdz_gpio) { if (tas2770->sdz_gpio) {
gpiod_set_value_cansleep(tas2770->sdz_gpio, 1); gpiod_set_value_cansleep(tas2770->sdz_gpio, 1);
usleep_range(1000, 2000);
} else { } else {
ret = snd_soc_component_update_bits(component, TAS2770_PWR_CTRL, ret = snd_soc_component_update_bits(component, TAS2770_PWR_CTRL,
TAS2770_PWR_CTRL_MASK, TAS2770_PWR_CTRL_MASK,
...@@ -510,8 +513,10 @@ static int tas2770_codec_probe(struct snd_soc_component *component) ...@@ -510,8 +513,10 @@ static int tas2770_codec_probe(struct snd_soc_component *component)
tas2770->component = component; tas2770->component = component;
if (tas2770->sdz_gpio) if (tas2770->sdz_gpio) {
gpiod_set_value_cansleep(tas2770->sdz_gpio, 1); gpiod_set_value_cansleep(tas2770->sdz_gpio, 1);
usleep_range(1000, 2000);
}
tas2770_reset(tas2770); tas2770_reset(tas2770);
......
...@@ -1441,7 +1441,8 @@ static int wm_adsp_buffer_parse_coeff(struct cs_dsp_coeff_ctl *cs_ctl) ...@@ -1441,7 +1441,8 @@ static int wm_adsp_buffer_parse_coeff(struct cs_dsp_coeff_ctl *cs_ctl)
int ret, i; int ret, i;
for (i = 0; i < 5; ++i) { for (i = 0; i < 5; ++i) {
ret = cs_dsp_coeff_read_ctrl(cs_ctl, 0, &coeff_v1, sizeof(coeff_v1)); ret = cs_dsp_coeff_read_ctrl(cs_ctl, 0, &coeff_v1,
min(cs_ctl->len, sizeof(coeff_v1)));
if (ret < 0) if (ret < 0)
return ret; return ret;
......
...@@ -524,7 +524,7 @@ static int lpass_platform_pcmops_trigger(struct snd_soc_component *component, ...@@ -524,7 +524,7 @@ static int lpass_platform_pcmops_trigger(struct snd_soc_component *component,
return -EINVAL; return -EINVAL;
} }
ret = regmap_update_bits(map, reg_irqclr, val_irqclr, val_irqclr); ret = regmap_write_bits(map, reg_irqclr, val_irqclr, val_irqclr);
if (ret) { if (ret) {
dev_err(soc_runtime->dev, "error writing to irqclear reg: %d\n", ret); dev_err(soc_runtime->dev, "error writing to irqclear reg: %d\n", ret);
return ret; return ret;
...@@ -665,7 +665,7 @@ static irqreturn_t lpass_dma_interrupt_handler( ...@@ -665,7 +665,7 @@ static irqreturn_t lpass_dma_interrupt_handler(
return -EINVAL; return -EINVAL;
} }
if (interrupts & LPAIF_IRQ_PER(chan)) { if (interrupts & LPAIF_IRQ_PER(chan)) {
rv = regmap_update_bits(map, reg, mask, (LPAIF_IRQ_PER(chan) | val)); rv = regmap_write_bits(map, reg, mask, (LPAIF_IRQ_PER(chan) | val));
if (rv) { if (rv) {
dev_err(soc_runtime->dev, dev_err(soc_runtime->dev,
"error writing to irqclear reg: %d\n", rv); "error writing to irqclear reg: %d\n", rv);
...@@ -676,7 +676,7 @@ static irqreturn_t lpass_dma_interrupt_handler( ...@@ -676,7 +676,7 @@ static irqreturn_t lpass_dma_interrupt_handler(
} }
if (interrupts & LPAIF_IRQ_XRUN(chan)) { if (interrupts & LPAIF_IRQ_XRUN(chan)) {
rv = regmap_update_bits(map, reg, mask, (LPAIF_IRQ_XRUN(chan) | val)); rv = regmap_write_bits(map, reg, mask, (LPAIF_IRQ_XRUN(chan) | val));
if (rv) { if (rv) {
dev_err(soc_runtime->dev, dev_err(soc_runtime->dev,
"error writing to irqclear reg: %d\n", rv); "error writing to irqclear reg: %d\n", rv);
...@@ -688,7 +688,7 @@ static irqreturn_t lpass_dma_interrupt_handler( ...@@ -688,7 +688,7 @@ static irqreturn_t lpass_dma_interrupt_handler(
} }
if (interrupts & LPAIF_IRQ_ERR(chan)) { if (interrupts & LPAIF_IRQ_ERR(chan)) {
rv = regmap_update_bits(map, reg, mask, (LPAIF_IRQ_ERR(chan) | val)); rv = regmap_write_bits(map, reg, mask, (LPAIF_IRQ_ERR(chan) | val));
if (rv) { if (rv) {
dev_err(soc_runtime->dev, dev_err(soc_runtime->dev,
"error writing to irqclear reg: %d\n", rv); "error writing to irqclear reg: %d\n", rv);
......
...@@ -308,7 +308,7 @@ int snd_soc_put_volsw(struct snd_kcontrol *kcontrol, ...@@ -308,7 +308,7 @@ int snd_soc_put_volsw(struct snd_kcontrol *kcontrol,
unsigned int sign_bit = mc->sign_bit; unsigned int sign_bit = mc->sign_bit;
unsigned int mask = (1 << fls(max)) - 1; unsigned int mask = (1 << fls(max)) - 1;
unsigned int invert = mc->invert; unsigned int invert = mc->invert;
int err; int err, ret;
bool type_2r = false; bool type_2r = false;
unsigned int val2 = 0; unsigned int val2 = 0;
unsigned int val, val_mask; unsigned int val, val_mask;
...@@ -350,12 +350,18 @@ int snd_soc_put_volsw(struct snd_kcontrol *kcontrol, ...@@ -350,12 +350,18 @@ int snd_soc_put_volsw(struct snd_kcontrol *kcontrol,
err = snd_soc_component_update_bits(component, reg, val_mask, val); err = snd_soc_component_update_bits(component, reg, val_mask, val);
if (err < 0) if (err < 0)
return err; return err;
ret = err;
if (type_2r) if (type_2r) {
err = snd_soc_component_update_bits(component, reg2, val_mask, err = snd_soc_component_update_bits(component, reg2, val_mask,
val2); val2);
/* Don't discard any error code or drop change flag */
if (ret == 0 || err < 0) {
ret = err;
}
}
return err; return ret;
} }
EXPORT_SYMBOL_GPL(snd_soc_put_volsw); EXPORT_SYMBOL_GPL(snd_soc_put_volsw);
...@@ -421,6 +427,7 @@ int snd_soc_put_volsw_sx(struct snd_kcontrol *kcontrol, ...@@ -421,6 +427,7 @@ int snd_soc_put_volsw_sx(struct snd_kcontrol *kcontrol,
int min = mc->min; int min = mc->min;
unsigned int mask = (1U << (fls(min + max) - 1)) - 1; unsigned int mask = (1U << (fls(min + max) - 1)) - 1;
int err = 0; int err = 0;
int ret;
unsigned int val, val_mask; unsigned int val, val_mask;
if (ucontrol->value.integer.value[0] < 0) if (ucontrol->value.integer.value[0] < 0)
...@@ -437,6 +444,7 @@ int snd_soc_put_volsw_sx(struct snd_kcontrol *kcontrol, ...@@ -437,6 +444,7 @@ int snd_soc_put_volsw_sx(struct snd_kcontrol *kcontrol,
err = snd_soc_component_update_bits(component, reg, val_mask, val); err = snd_soc_component_update_bits(component, reg, val_mask, val);
if (err < 0) if (err < 0)
return err; return err;
ret = err;
if (snd_soc_volsw_is_stereo(mc)) { if (snd_soc_volsw_is_stereo(mc)) {
unsigned int val2; unsigned int val2;
...@@ -447,6 +455,11 @@ int snd_soc_put_volsw_sx(struct snd_kcontrol *kcontrol, ...@@ -447,6 +455,11 @@ int snd_soc_put_volsw_sx(struct snd_kcontrol *kcontrol,
err = snd_soc_component_update_bits(component, reg2, val_mask, err = snd_soc_component_update_bits(component, reg2, val_mask,
val2); val2);
/* Don't discard any error code or drop change flag */
if (ret == 0 || err < 0) {
ret = err;
}
} }
return err; return err;
} }
...@@ -506,7 +519,7 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol, ...@@ -506,7 +519,7 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol,
unsigned int mask = (1 << fls(max)) - 1; unsigned int mask = (1 << fls(max)) - 1;
unsigned int invert = mc->invert; unsigned int invert = mc->invert;
unsigned int val, val_mask; unsigned int val, val_mask;
int ret; int err, ret;
if (invert) if (invert)
val = (max - ucontrol->value.integer.value[0]) & mask; val = (max - ucontrol->value.integer.value[0]) & mask;
...@@ -515,9 +528,10 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol, ...@@ -515,9 +528,10 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol,
val_mask = mask << shift; val_mask = mask << shift;
val = val << shift; val = val << shift;
ret = snd_soc_component_update_bits(component, reg, val_mask, val); err = snd_soc_component_update_bits(component, reg, val_mask, val);
if (ret < 0) if (err < 0)
return ret; return err;
ret = err;
if (snd_soc_volsw_is_stereo(mc)) { if (snd_soc_volsw_is_stereo(mc)) {
if (invert) if (invert)
...@@ -527,8 +541,12 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol, ...@@ -527,8 +541,12 @@ int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol,
val_mask = mask << shift; val_mask = mask << shift;
val = val << shift; val = val << shift;
ret = snd_soc_component_update_bits(component, rreg, val_mask, err = snd_soc_component_update_bits(component, rreg, val_mask,
val); val);
/* Don't discard any error code or drop change flag */
if (ret == 0 || err < 0) {
ret = err;
}
} }
return ret; return ret;
...@@ -877,6 +895,7 @@ int snd_soc_put_xr_sx(struct snd_kcontrol *kcontrol, ...@@ -877,6 +895,7 @@ int snd_soc_put_xr_sx(struct snd_kcontrol *kcontrol,
unsigned long mask = (1UL<<mc->nbits)-1; unsigned long mask = (1UL<<mc->nbits)-1;
long max = mc->max; long max = mc->max;
long val = ucontrol->value.integer.value[0]; long val = ucontrol->value.integer.value[0];
int ret = 0;
unsigned int i; unsigned int i;
if (val < mc->min || val > mc->max) if (val < mc->min || val > mc->max)
...@@ -891,9 +910,11 @@ int snd_soc_put_xr_sx(struct snd_kcontrol *kcontrol, ...@@ -891,9 +910,11 @@ int snd_soc_put_xr_sx(struct snd_kcontrol *kcontrol,
regmask, regval); regmask, regval);
if (err < 0) if (err < 0)
return err; return err;
if (err > 0)
ret = err;
} }
return 0; return ret;
} }
EXPORT_SYMBOL_GPL(snd_soc_put_xr_sx); EXPORT_SYMBOL_GPL(snd_soc_put_xr_sx);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment