Commit d0ab92d6 authored by Mark Brown's avatar Mark Brown

Merge remote-tracking branches 'asoc/fix/samsung', 'asoc/fix/sgtl5000',...

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