mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-29 23:53:32 +00:00
Merge remote-tracking branches 'asoc/fix/samsung', 'asoc/fix/sgtl5000', 'asoc/fix/simple' and 'asoc/fix/tlv320aic3x' into asoc-linus
This commit is contained in:
commit
d0ab92d63c
4 changed files with 34 additions and 21 deletions
|
@ -1277,7 +1277,7 @@ static int sgtl5000_enable_regulators(struct snd_soc_codec *codec)
|
|||
return ret;
|
||||
}
|
||||
|
||||
ret = devm_regulator_bulk_get(codec->dev, ARRAY_SIZE(sgtl5000->supplies),
|
||||
ret = regulator_bulk_get(codec->dev, ARRAY_SIZE(sgtl5000->supplies),
|
||||
sgtl5000->supplies);
|
||||
if (ret)
|
||||
goto err_ldo_remove;
|
||||
|
@ -1285,13 +1285,16 @@ static int sgtl5000_enable_regulators(struct snd_soc_codec *codec)
|
|||
ret = regulator_bulk_enable(ARRAY_SIZE(sgtl5000->supplies),
|
||||
sgtl5000->supplies);
|
||||
if (ret)
|
||||
goto err_ldo_remove;
|
||||
goto err_regulator_free;
|
||||
|
||||
/* wait for all power rails bring up */
|
||||
udelay(10);
|
||||
|
||||
return 0;
|
||||
|
||||
err_regulator_free:
|
||||
regulator_bulk_free(ARRAY_SIZE(sgtl5000->supplies),
|
||||
sgtl5000->supplies);
|
||||
err_ldo_remove:
|
||||
if (!external_vddd)
|
||||
ldo_regulator_remove(codec);
|
||||
|
@ -1361,6 +1364,8 @@ static int sgtl5000_probe(struct snd_soc_codec *codec)
|
|||
err:
|
||||
regulator_bulk_disable(ARRAY_SIZE(sgtl5000->supplies),
|
||||
sgtl5000->supplies);
|
||||
regulator_bulk_free(ARRAY_SIZE(sgtl5000->supplies),
|
||||
sgtl5000->supplies);
|
||||
ldo_regulator_remove(codec);
|
||||
|
||||
return ret;
|
||||
|
@ -1374,6 +1379,8 @@ static int sgtl5000_remove(struct snd_soc_codec *codec)
|
|||
|
||||
regulator_bulk_disable(ARRAY_SIZE(sgtl5000->supplies),
|
||||
sgtl5000->supplies);
|
||||
regulator_bulk_free(ARRAY_SIZE(sgtl5000->supplies),
|
||||
sgtl5000->supplies);
|
||||
ldo_regulator_remove(codec);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -879,7 +879,7 @@ static int aic3x_hw_params(struct snd_pcm_substream *substream,
|
|||
case SNDRV_PCM_FORMAT_S20_3LE:
|
||||
data |= (0x01 << 4);
|
||||
break;
|
||||
case SNDRV_PCM_FORMAT_S24_LE:
|
||||
case SNDRV_PCM_FORMAT_S24_3LE:
|
||||
data |= (0x02 << 4);
|
||||
break;
|
||||
case SNDRV_PCM_FORMAT_S32_LE:
|
||||
|
|
|
@ -116,6 +116,7 @@ asoc_simple_card_sub_parse_of(struct device_node *np,
|
|||
{
|
||||
struct device_node *node;
|
||||
struct clk *clk;
|
||||
u32 val;
|
||||
int ret;
|
||||
|
||||
/*
|
||||
|
@ -151,10 +152,8 @@ asoc_simple_card_sub_parse_of(struct device_node *np,
|
|||
}
|
||||
|
||||
dai->sysclk = clk_get_rate(clk);
|
||||
} else if (of_property_read_bool(np, "system-clock-frequency")) {
|
||||
of_property_read_u32(np,
|
||||
"system-clock-frequency",
|
||||
&dai->sysclk);
|
||||
} else if (!of_property_read_u32(np, "system-clock-frequency", &val)) {
|
||||
dai->sysclk = val;
|
||||
} else {
|
||||
clk = of_clk_get(node, 0);
|
||||
if (!IS_ERR(clk))
|
||||
|
@ -303,6 +302,7 @@ static int asoc_simple_card_parse_of(struct device_node *node,
|
|||
{
|
||||
struct snd_soc_dai_link *dai_link = priv->snd_card.dai_link;
|
||||
struct simple_dai_props *dai_props = priv->dai_props;
|
||||
u32 val;
|
||||
int ret;
|
||||
|
||||
/* parsing the card name from DT */
|
||||
|
@ -325,8 +325,9 @@ static int asoc_simple_card_parse_of(struct device_node *node,
|
|||
}
|
||||
|
||||
/* Factor to mclk, used in hw_params() */
|
||||
of_property_read_u32(node, "simple-audio-card,mclk-fs",
|
||||
&priv->mclk_fs);
|
||||
ret = of_property_read_u32(node, "simple-audio-card,mclk-fs", &val);
|
||||
if (ret == 0)
|
||||
priv->mclk_fs = val;
|
||||
|
||||
dev_dbg(dev, "New simple-card: %s\n", priv->snd_card.name ?
|
||||
priv->snd_card.name : "");
|
||||
|
|
|
@ -68,6 +68,8 @@ struct i2s_dai {
|
|||
#define DAI_OPENED (1 << 0) /* Dai is opened */
|
||||
#define DAI_MANAGER (1 << 1) /* Dai is the manager */
|
||||
unsigned mode;
|
||||
/* CDCLK pin direction: 0 - input, 1 - output */
|
||||
unsigned int cdclk_out:1;
|
||||
/* Driver for this DAI */
|
||||
struct snd_soc_dai_driver i2s_dai_drv;
|
||||
/* DMA parameters */
|
||||
|
@ -737,6 +739,9 @@ static int i2s_startup(struct snd_pcm_substream *substream,
|
|||
|
||||
spin_unlock_irqrestore(&lock, flags);
|
||||
|
||||
if (!is_opened(other) && i2s->cdclk_out)
|
||||
i2s_set_sysclk(dai, SAMSUNG_I2S_CDCLK,
|
||||
0, SND_SOC_CLOCK_OUT);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -752,9 +757,13 @@ static void i2s_shutdown(struct snd_pcm_substream *substream,
|
|||
i2s->mode &= ~DAI_OPENED;
|
||||
i2s->mode &= ~DAI_MANAGER;
|
||||
|
||||
if (is_opened(other))
|
||||
if (is_opened(other)) {
|
||||
other->mode |= DAI_MANAGER;
|
||||
|
||||
} else {
|
||||
u32 mod = readl(i2s->addr + I2SMOD);
|
||||
i2s->cdclk_out = !(mod & MOD_CDCLKCON);
|
||||
other->cdclk_out = i2s->cdclk_out;
|
||||
}
|
||||
/* Reset any constraint on RFS and BFS */
|
||||
i2s->rfs = 0;
|
||||
i2s->bfs = 0;
|
||||
|
@ -920,11 +929,9 @@ static int i2s_suspend(struct snd_soc_dai *dai)
|
|||
{
|
||||
struct i2s_dai *i2s = to_info(dai);
|
||||
|
||||
if (dai->active) {
|
||||
i2s->suspend_i2smod = readl(i2s->addr + I2SMOD);
|
||||
i2s->suspend_i2scon = readl(i2s->addr + I2SCON);
|
||||
i2s->suspend_i2spsr = readl(i2s->addr + I2SPSR);
|
||||
}
|
||||
i2s->suspend_i2smod = readl(i2s->addr + I2SMOD);
|
||||
i2s->suspend_i2scon = readl(i2s->addr + I2SCON);
|
||||
i2s->suspend_i2spsr = readl(i2s->addr + I2SPSR);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -933,11 +940,9 @@ static int i2s_resume(struct snd_soc_dai *dai)
|
|||
{
|
||||
struct i2s_dai *i2s = to_info(dai);
|
||||
|
||||
if (dai->active) {
|
||||
writel(i2s->suspend_i2scon, i2s->addr + I2SCON);
|
||||
writel(i2s->suspend_i2smod, i2s->addr + I2SMOD);
|
||||
writel(i2s->suspend_i2spsr, i2s->addr + I2SPSR);
|
||||
}
|
||||
writel(i2s->suspend_i2scon, i2s->addr + I2SCON);
|
||||
writel(i2s->suspend_i2smod, i2s->addr + I2SMOD);
|
||||
writel(i2s->suspend_i2spsr, i2s->addr + I2SPSR);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue