Commit 64dc98d3 authored by Mark Brown's avatar Mark Brown

Merge remote-tracking branches 'asoc/topic/da7219', 'asoc/topic/dai-link' and...

Merge remote-tracking branches 'asoc/topic/da7219', 'asoc/topic/dai-link' and 'asoc/topic/doc' into asoc-next
...@@ -28,13 +28,15 @@ Optional properties: ...@@ -28,13 +28,15 @@ Optional properties:
- clocks : phandle and clock specifier for codec MCLK. - clocks : phandle and clock specifier for codec MCLK.
- clock-names : Clock name string for 'clocks' attribute, should be "mclk". - clock-names : Clock name string for 'clocks' attribute, should be "mclk".
- dlg,ldo-lvl : Required internal LDO voltage (mV) level for digital engine
[<1050>, <1100>, <1200>, <1400>]
- dlg,micbias-lvl : Voltage (mV) for Mic Bias - dlg,micbias-lvl : Voltage (mV) for Mic Bias
[<1800>, <2000>, <2200>, <2400>, <2600>] [<1600>, <1800>, <2000>, <2200>, <2400>, <2600>]
- dlg,mic-amp-in-sel : Mic input source type - dlg,mic-amp-in-sel : Mic input source type
["diff", "se_p", "se_n"] ["diff", "se_p", "se_n"]
Deprecated properties:
- dlg,ldo-lvl : Required internal LDO voltage (mV) level for digital engine
(LDO unavailable in production HW so property no longer required).
====== ======
Child node - 'da7219_aad': Child node - 'da7219_aad':
......
...@@ -14,17 +14,10 @@ ...@@ -14,17 +14,10 @@
#ifndef __DA7219_PDATA_H #ifndef __DA7219_PDATA_H
#define __DA7219_PDATA_H #define __DA7219_PDATA_H
/* LDO */
enum da7219_ldo_lvl_sel {
DA7219_LDO_LVL_SEL_1_05V = 0,
DA7219_LDO_LVL_SEL_1_10V,
DA7219_LDO_LVL_SEL_1_20V,
DA7219_LDO_LVL_SEL_1_40V,
};
/* Mic Bias */ /* Mic Bias */
enum da7219_micbias_voltage { enum da7219_micbias_voltage {
DA7219_MICBIAS_1_8V = 1, DA7219_MICBIAS_1_6V = 0,
DA7219_MICBIAS_1_8V,
DA7219_MICBIAS_2_0V, DA7219_MICBIAS_2_0V,
DA7219_MICBIAS_2_2V, DA7219_MICBIAS_2_2V,
DA7219_MICBIAS_2_4V, DA7219_MICBIAS_2_4V,
...@@ -41,9 +34,6 @@ enum da7219_mic_amp_in_sel { ...@@ -41,9 +34,6 @@ enum da7219_mic_amp_in_sel {
struct da7219_aad_pdata; struct da7219_aad_pdata;
struct da7219_pdata { struct da7219_pdata {
/* Internal LDO */
enum da7219_ldo_lvl_sel ldo_lvl_sel;
/* Mic */ /* Mic */
enum da7219_micbias_voltage micbias_lvl; enum da7219_micbias_voltage micbias_lvl;
enum da7219_mic_amp_in_sel mic_amp_in_sel; enum da7219_mic_amp_in_sel mic_amp_in_sel;
......
...@@ -968,10 +968,11 @@ static const struct snd_soc_dapm_route da7219_audio_map[] = { ...@@ -968,10 +968,11 @@ static const struct snd_soc_dapm_route da7219_audio_map[] = {
{"Mixin PGA", NULL, "Mic PGA"}, {"Mixin PGA", NULL, "Mic PGA"},
{"ADC", NULL, "Mixin PGA"}, {"ADC", NULL, "Mixin PGA"},
{"Sidetone Filter", NULL, "ADC"},
{"Mixer In", NULL, "Mixer In Supply"}, {"Mixer In", NULL, "Mixer In Supply"},
{"Mixer In", "Mic Switch", "ADC"}, {"Mixer In", "Mic Switch", "ADC"},
{"Sidetone Filter", NULL, "Mixer In"},
{"Tone Generator", NULL, "TONE"}, {"Tone Generator", NULL, "TONE"},
DA7219_OUT_DAI_MUX_ROUTES("Out DAIL Mux"), DA7219_OUT_DAI_MUX_ROUTES("Out DAIL Mux"),
...@@ -1073,11 +1074,8 @@ static int da7219_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, ...@@ -1073,11 +1074,8 @@ static int da7219_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id,
u32 freq_ref; u32 freq_ref;
u64 frac_div; u64 frac_div;
/* Verify 32KHz, 2MHz - 54MHz MCLK provided, and set input divider */ /* Verify 2MHz - 54MHz MCLK provided, and set input divider */
if (da7219->mclk_rate == 32768) { if (da7219->mclk_rate < 2000000) {
indiv_bits = DA7219_PLL_INDIV_2_5_MHZ;
indiv = DA7219_PLL_INDIV_2_5_MHZ_VAL;
} else if (da7219->mclk_rate < 2000000) {
dev_err(codec->dev, "PLL input clock %d below valid range\n", dev_err(codec->dev, "PLL input clock %d below valid range\n",
da7219->mclk_rate); da7219->mclk_rate);
return -EINVAL; return -EINVAL;
...@@ -1118,9 +1116,6 @@ static int da7219_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id, ...@@ -1118,9 +1116,6 @@ static int da7219_set_dai_pll(struct snd_soc_dai *codec_dai, int pll_id,
case DA7219_SYSCLK_PLL_SRM: case DA7219_SYSCLK_PLL_SRM:
pll_ctrl |= DA7219_PLL_MODE_SRM; pll_ctrl |= DA7219_PLL_MODE_SRM;
break; break;
case DA7219_SYSCLK_PLL_32KHZ:
pll_ctrl |= DA7219_PLL_MODE_32KHZ;
break;
default: default:
dev_err(codec->dev, "Invalid PLL config\n"); dev_err(codec->dev, "Invalid PLL config\n");
return -EINVAL; return -EINVAL;
...@@ -1306,7 +1301,7 @@ static int da7219_hw_params(struct snd_pcm_substream *substream, ...@@ -1306,7 +1301,7 @@ static int da7219_hw_params(struct snd_pcm_substream *substream,
} }
channels = params_channels(params); channels = params_channels(params);
if ((channels < 1) | (channels > DA7219_DAI_CH_NUM_MAX)) { if ((channels < 1) || (channels > DA7219_DAI_CH_NUM_MAX)) {
dev_err(codec->dev, dev_err(codec->dev,
"Invalid number of channels, only 1 to %d supported\n", "Invalid number of channels, only 1 to %d supported\n",
DA7219_DAI_CH_NUM_MAX); DA7219_DAI_CH_NUM_MAX);
...@@ -1405,28 +1400,12 @@ static const struct of_device_id da7219_of_match[] = { ...@@ -1405,28 +1400,12 @@ static const struct of_device_id da7219_of_match[] = {
}; };
MODULE_DEVICE_TABLE(of, da7219_of_match); MODULE_DEVICE_TABLE(of, da7219_of_match);
static enum da7219_ldo_lvl_sel da7219_of_ldo_lvl(struct snd_soc_codec *codec,
u32 val)
{
switch (val) {
case 1050:
return DA7219_LDO_LVL_SEL_1_05V;
case 1100:
return DA7219_LDO_LVL_SEL_1_10V;
case 1200:
return DA7219_LDO_LVL_SEL_1_20V;
case 1400:
return DA7219_LDO_LVL_SEL_1_40V;
default:
dev_warn(codec->dev, "Invalid LDO level");
return DA7219_LDO_LVL_SEL_1_05V;
}
}
static enum da7219_micbias_voltage static enum da7219_micbias_voltage
da7219_of_micbias_lvl(struct snd_soc_codec *codec, u32 val) da7219_of_micbias_lvl(struct snd_soc_codec *codec, u32 val)
{ {
switch (val) { switch (val) {
case 1600:
return DA7219_MICBIAS_1_6V;
case 1800: case 1800:
return DA7219_MICBIAS_1_8V; return DA7219_MICBIAS_1_8V;
case 2000: case 2000:
...@@ -1469,9 +1448,6 @@ static struct da7219_pdata *da7219_of_to_pdata(struct snd_soc_codec *codec) ...@@ -1469,9 +1448,6 @@ static struct da7219_pdata *da7219_of_to_pdata(struct snd_soc_codec *codec)
if (!pdata) if (!pdata)
return NULL; return NULL;
if (of_property_read_u32(np, "dlg,ldo-lvl", &of_val32) >= 0)
pdata->ldo_lvl_sel = da7219_of_ldo_lvl(codec, of_val32);
if (of_property_read_u32(np, "dlg,micbias-lvl", &of_val32) >= 0) if (of_property_read_u32(np, "dlg,micbias-lvl", &of_val32) >= 0)
pdata->micbias_lvl = da7219_of_micbias_lvl(codec, of_val32); pdata->micbias_lvl = da7219_of_micbias_lvl(codec, of_val32);
else else
...@@ -1516,24 +1492,13 @@ static int da7219_set_bias_level(struct snd_soc_codec *codec, ...@@ -1516,24 +1492,13 @@ static int da7219_set_bias_level(struct snd_soc_codec *codec,
snd_soc_update_bits(codec, DA7219_REFERENCES, snd_soc_update_bits(codec, DA7219_REFERENCES,
DA7219_BIAS_EN_MASK, DA7219_BIAS_EN_MASK,
DA7219_BIAS_EN_MASK); DA7219_BIAS_EN_MASK);
/* Enable Internal Digital LDO */
snd_soc_update_bits(codec, DA7219_LDO_CTRL,
DA7219_LDO_EN_MASK,
DA7219_LDO_EN_MASK);
} }
break; break;
case SND_SOC_BIAS_OFF: case SND_SOC_BIAS_OFF:
/* Only disable if jack detection not active */ /* Only disable master bias if jack detection not active */
if (!da7219->aad->jack) { if (!da7219->aad->jack)
/* Bypass Internal Digital LDO */
snd_soc_update_bits(codec, DA7219_LDO_CTRL,
DA7219_LDO_EN_MASK, 0);
/* Master bias */
snd_soc_update_bits(codec, DA7219_REFERENCES, snd_soc_update_bits(codec, DA7219_REFERENCES,
DA7219_BIAS_EN_MASK, 0); DA7219_BIAS_EN_MASK, 0);
}
/* MCLK */ /* MCLK */
if (da7219->mclk) if (da7219->mclk)
...@@ -1600,21 +1565,9 @@ static void da7219_handle_pdata(struct snd_soc_codec *codec) ...@@ -1600,21 +1565,9 @@ static void da7219_handle_pdata(struct snd_soc_codec *codec)
if (pdata) { if (pdata) {
u8 micbias_lvl = 0; u8 micbias_lvl = 0;
/* Internal LDO */
switch (pdata->ldo_lvl_sel) {
case DA7219_LDO_LVL_SEL_1_05V:
case DA7219_LDO_LVL_SEL_1_10V:
case DA7219_LDO_LVL_SEL_1_20V:
case DA7219_LDO_LVL_SEL_1_40V:
snd_soc_update_bits(codec, DA7219_LDO_CTRL,
DA7219_LDO_LEVEL_SELECT_MASK,
(pdata->ldo_lvl_sel <<
DA7219_LDO_LEVEL_SELECT_SHIFT));
break;
}
/* Mic Bias voltages */ /* Mic Bias voltages */
switch (pdata->micbias_lvl) { switch (pdata->micbias_lvl) {
case DA7219_MICBIAS_1_6V:
case DA7219_MICBIAS_1_8V: case DA7219_MICBIAS_1_8V:
case DA7219_MICBIAS_2_0V: case DA7219_MICBIAS_2_0V:
case DA7219_MICBIAS_2_2V: case DA7219_MICBIAS_2_2V:
...@@ -1662,10 +1615,12 @@ static int da7219_probe(struct snd_soc_codec *codec) ...@@ -1662,10 +1615,12 @@ static int da7219_probe(struct snd_soc_codec *codec)
/* Check if MCLK provided */ /* Check if MCLK provided */
da7219->mclk = devm_clk_get(codec->dev, "mclk"); da7219->mclk = devm_clk_get(codec->dev, "mclk");
if (IS_ERR(da7219->mclk)) { if (IS_ERR(da7219->mclk)) {
if (PTR_ERR(da7219->mclk) != -ENOENT) if (PTR_ERR(da7219->mclk) != -ENOENT) {
return PTR_ERR(da7219->mclk); ret = PTR_ERR(da7219->mclk);
else goto err_disable_reg;
} else {
da7219->mclk = NULL; da7219->mclk = NULL;
}
} }
/* Default PC counter to free-running */ /* Default PC counter to free-running */
...@@ -1693,7 +1648,16 @@ static int da7219_probe(struct snd_soc_codec *codec) ...@@ -1693,7 +1648,16 @@ static int da7219_probe(struct snd_soc_codec *codec)
snd_soc_write(codec, DA7219_TONE_GEN_CYCLES, DA7219_BEEP_CYCLES_MASK); snd_soc_write(codec, DA7219_TONE_GEN_CYCLES, DA7219_BEEP_CYCLES_MASK);
/* Initialise AAD block */ /* Initialise AAD block */
return da7219_aad_init(codec); ret = da7219_aad_init(codec);
if (ret)
goto err_disable_reg;
return 0;
err_disable_reg:
regulator_bulk_disable(DA7219_NUM_SUPPLIES, da7219->supplies);
return ret;
} }
static int da7219_remove(struct snd_soc_codec *codec) static int da7219_remove(struct snd_soc_codec *codec)
...@@ -1776,7 +1740,7 @@ static struct reg_default da7219_reg_defaults[] = { ...@@ -1776,7 +1740,7 @@ static struct reg_default da7219_reg_defaults[] = {
{ DA7219_DIG_ROUTING_DAC, 0x32 }, { DA7219_DIG_ROUTING_DAC, 0x32 },
{ DA7219_DAI_OFFSET_LOWER, 0x00 }, { DA7219_DAI_OFFSET_LOWER, 0x00 },
{ DA7219_DAI_OFFSET_UPPER, 0x00 }, { DA7219_DAI_OFFSET_UPPER, 0x00 },
{ DA7219_REFERENCES, 0x00 }, { DA7219_REFERENCES, 0x08 },
{ DA7219_MIXIN_L_SELECT, 0x00 }, { DA7219_MIXIN_L_SELECT, 0x00 },
{ DA7219_MIXIN_L_GAIN, 0x03 }, { DA7219_MIXIN_L_GAIN, 0x03 },
{ DA7219_ADC_L_GAIN, 0x6F }, { DA7219_ADC_L_GAIN, 0x6F },
...@@ -1811,7 +1775,6 @@ static struct reg_default da7219_reg_defaults[] = { ...@@ -1811,7 +1775,6 @@ static struct reg_default da7219_reg_defaults[] = {
{ DA7219_CHIP_ID1, 0x23 }, { DA7219_CHIP_ID1, 0x23 },
{ DA7219_CHIP_ID2, 0x93 }, { DA7219_CHIP_ID2, 0x93 },
{ DA7219_CHIP_REVISION, 0x00 }, { DA7219_CHIP_REVISION, 0x00 },
{ DA7219_LDO_CTRL, 0x00 },
{ DA7219_IO_CTRL, 0x00 }, { DA7219_IO_CTRL, 0x00 },
{ DA7219_GAIN_RAMP_CTRL, 0x00 }, { DA7219_GAIN_RAMP_CTRL, 0x00 },
{ DA7219_PC_COUNT, 0x02 }, { DA7219_PC_COUNT, 0x02 },
......
...@@ -85,7 +85,6 @@ ...@@ -85,7 +85,6 @@
#define DA7219_CHIP_ID1 0x81 #define DA7219_CHIP_ID1 0x81
#define DA7219_CHIP_ID2 0x82 #define DA7219_CHIP_ID2 0x82
#define DA7219_CHIP_REVISION 0x83 #define DA7219_CHIP_REVISION 0x83
#define DA7219_LDO_CTRL 0x90
#define DA7219_IO_CTRL 0x91 #define DA7219_IO_CTRL 0x91
#define DA7219_GAIN_RAMP_CTRL 0x92 #define DA7219_GAIN_RAMP_CTRL 0x92
#define DA7219_PC_COUNT 0x94 #define DA7219_PC_COUNT 0x94
...@@ -207,7 +206,6 @@ ...@@ -207,7 +206,6 @@
#define DA7219_PLL_MODE_BYPASS (0x0 << 6) #define DA7219_PLL_MODE_BYPASS (0x0 << 6)
#define DA7219_PLL_MODE_NORMAL (0x1 << 6) #define DA7219_PLL_MODE_NORMAL (0x1 << 6)
#define DA7219_PLL_MODE_SRM (0x2 << 6) #define DA7219_PLL_MODE_SRM (0x2 << 6)
#define DA7219_PLL_MODE_32KHZ (0x3 << 6)
/* DA7219_PLL_FRAC_TOP = 0x22 */ /* DA7219_PLL_FRAC_TOP = 0x22 */
#define DA7219_PLL_FBDIV_FRAC_TOP_SHIFT 0 #define DA7219_PLL_FBDIV_FRAC_TOP_SHIFT 0
...@@ -569,12 +567,6 @@ ...@@ -569,12 +567,6 @@
#define DA7219_CHIP_MAJOR_SHIFT 4 #define DA7219_CHIP_MAJOR_SHIFT 4
#define DA7219_CHIP_MAJOR_MASK (0xF << 4) #define DA7219_CHIP_MAJOR_MASK (0xF << 4)
/* DA7219_LDO_CTRL = 0x90 */
#define DA7219_LDO_LEVEL_SELECT_SHIFT 4
#define DA7219_LDO_LEVEL_SELECT_MASK (0x3 << 4)
#define DA7219_LDO_EN_SHIFT 7
#define DA7219_LDO_EN_MASK (0x1 << 7)
/* DA7219_IO_CTRL = 0x91 */ /* DA7219_IO_CTRL = 0x91 */
#define DA7219_IO_VOLTAGE_LEVEL_SHIFT 0 #define DA7219_IO_VOLTAGE_LEVEL_SHIFT 0
#define DA7219_IO_VOLTAGE_LEVEL_MASK (0x1 << 0) #define DA7219_IO_VOLTAGE_LEVEL_MASK (0x1 << 0)
...@@ -787,7 +779,6 @@ enum da7219_sys_clk { ...@@ -787,7 +779,6 @@ enum da7219_sys_clk {
DA7219_SYSCLK_MCLK = 0, DA7219_SYSCLK_MCLK = 0,
DA7219_SYSCLK_PLL, DA7219_SYSCLK_PLL,
DA7219_SYSCLK_PLL_SRM, DA7219_SYSCLK_PLL_SRM,
DA7219_SYSCLK_PLL_32KHZ
}; };
/* Regulators */ /* Regulators */
......
...@@ -1536,35 +1536,35 @@ static int soc_link_dai_widgets(struct snd_soc_card *card, ...@@ -1536,35 +1536,35 @@ static int soc_link_dai_widgets(struct snd_soc_card *card,
{ {
struct snd_soc_dai *cpu_dai = rtd->cpu_dai; struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
struct snd_soc_dai *codec_dai = rtd->codec_dai; struct snd_soc_dai *codec_dai = rtd->codec_dai;
struct snd_soc_dapm_widget *play_w, *capture_w; struct snd_soc_dapm_widget *sink, *source;
int ret; int ret;
if (rtd->num_codecs > 1) if (rtd->num_codecs > 1)
dev_warn(card->dev, "ASoC: Multiple codecs not supported yet\n"); dev_warn(card->dev, "ASoC: Multiple codecs not supported yet\n");
/* link the DAI widgets */ /* link the DAI widgets */
play_w = codec_dai->playback_widget; sink = codec_dai->playback_widget;
capture_w = cpu_dai->capture_widget; source = cpu_dai->capture_widget;
if (play_w && capture_w) { if (sink && source) {
ret = snd_soc_dapm_new_pcm(card, dai_link->params, ret = snd_soc_dapm_new_pcm(card, dai_link->params,
dai_link->num_params, capture_w, dai_link->num_params,
play_w); source, sink);
if (ret != 0) { if (ret != 0) {
dev_err(card->dev, "ASoC: Can't link %s to %s: %d\n", dev_err(card->dev, "ASoC: Can't link %s to %s: %d\n",
play_w->name, capture_w->name, ret); sink->name, source->name, ret);
return ret; return ret;
} }
} }
play_w = cpu_dai->playback_widget; sink = cpu_dai->playback_widget;
capture_w = codec_dai->capture_widget; source = codec_dai->capture_widget;
if (play_w && capture_w) { if (sink && source) {
ret = snd_soc_dapm_new_pcm(card, dai_link->params, ret = snd_soc_dapm_new_pcm(card, dai_link->params,
dai_link->num_params, capture_w, dai_link->num_params,
play_w); source, sink);
if (ret != 0) { if (ret != 0) {
dev_err(card->dev, "ASoC: Can't link %s to %s: %d\n", dev_err(card->dev, "ASoC: Can't link %s to %s: %d\n",
play_w->name, capture_w->name, ret); sink->name, source->name, ret);
return ret; return ret;
} }
} }
......
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