asoc: Talos-tanggu bringup fixes

Bringup fixes to enumerate tanggu codec on talos.

Change-Id: Ic9c43ec0b870f6fec3c6d21fd4d77606c7ed94b1
Signed-off-by: Ramprasad Katkam <katkam@codeaurora.org>
This commit is contained in:
Ramprasad Katkam
2018-08-23 13:13:48 +05:30
parent 4e3fcbf103
commit 9c2394a6e4
6 changed files with 68 additions and 30 deletions

View File

@@ -769,6 +769,9 @@ static int rx_macro_mclk_enable(struct rx_macro_priv *rx_priv,
regmap_update_bits(regmap,
BOLERO_CDC_RX_CLK_RST_CTRL_MCLK_CONTROL,
0x01, 0x01);
regmap_update_bits(regmap,
BOLERO_CDC_RX_CLK_RST_CTRL_MCLK_CONTROL,
0x02, 0x02);
regmap_update_bits(regmap,
BOLERO_CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL,
0x01, 0x01);
@@ -1022,6 +1025,7 @@ static int rx_macro_enable_mix_path(struct snd_soc_dapm_widget *w,
case SND_SOC_DAPM_POST_PMU:
snd_soc_write(codec, gain_reg,
snd_soc_read(codec, gain_reg));
snd_soc_update_bits(codec, mix_reg, 0x10, 0x00);
break;
case SND_SOC_DAPM_POST_PMD:
/* Clk Disable */
@@ -1071,6 +1075,7 @@ static int rx_macro_enable_main_path(struct snd_soc_dapm_widget *w,
case SND_SOC_DAPM_POST_PMU:
snd_soc_write(codec, gain_reg,
snd_soc_read(codec, gain_reg));
snd_soc_update_bits(codec, reg, 0x10, 0x00);
break;
case SND_SOC_DAPM_POST_PMD:
rx_macro_enable_interp_clk(codec, event, w->shift);
@@ -2393,12 +2398,15 @@ static int rx_swrm_clock(void *handle, bool enable)
__func__);
goto exit;
}
regmap_update_bits(regmap,
BOLERO_CDC_RX_CLK_RST_CTRL_SWR_CONTROL,
0x02, 0x02);
regmap_update_bits(regmap,
BOLERO_CDC_RX_CLK_RST_CTRL_SWR_CONTROL,
0x01, 0x01);
regmap_update_bits(regmap,
BOLERO_CDC_RX_CLK_RST_CTRL_SWR_CONTROL,
0x1C, 0x0C);
0x02, 0x00);
msm_cdc_pinctrl_select_active_state(
rx_priv->rx_swr_gpio_p);
}
@@ -2471,6 +2479,15 @@ static int rx_macro_init(struct snd_soc_codec *codec)
dev_err(rx_dev, "%s: failed to add snd_ctls\n", __func__);
return ret;
}
snd_soc_update_bits(codec, BOLERO_CDC_RX_RX0_RX_PATH_DSM_CTL, 0x01, 0x01);
snd_soc_update_bits(codec, BOLERO_CDC_RX_RX1_RX_PATH_DSM_CTL, 0x01, 0x01);
snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_DSM_CTL, 0x01, 0x01);
snd_soc_update_bits(codec, BOLERO_CDC_RX_RX0_RX_PATH_SEC7, 0x07, 0x02);
snd_soc_update_bits(codec, BOLERO_CDC_RX_RX1_RX_PATH_SEC7, 0x07, 0x02);
snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_SEC7, 0x07, 0x02);
snd_soc_update_bits(codec, BOLERO_CDC_RX_RX0_RX_PATH_CFG3, 0x03, 0x02);
snd_soc_update_bits(codec, BOLERO_CDC_RX_RX1_RX_PATH_CFG3, 0x03, 0x02);
snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_CFG3, 0x03, 0x02);
rx_priv->codec = codec;

View File

@@ -336,7 +336,7 @@ static void tx_macro_mute_update_callback(struct work_struct *work)
hpf_gate_reg = BOLERO_CDC_TX0_TX_PATH_SEC2 +
TX_MACRO_TX_PATH_OFFSET * decimator;
snd_soc_update_bits(codec, hpf_gate_reg, 0x01, 0x01);
snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x01, 0x00);
snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x00);
dev_dbg(tx_priv->dev, "%s: decimator %u unmute\n",
__func__, decimator);
}
@@ -521,6 +521,9 @@ static int tx_macro_enable_dmic(struct snd_soc_dapm_widget *w,
case SND_SOC_DAPM_PRE_PMU:
(*dmic_clk_cnt)++;
if (*dmic_clk_cnt == 1) {
snd_soc_update_bits(codec, BOLERO_CDC_VA_TOP_CSR_DMIC_CFG,
0x80, 0x00);
snd_soc_update_bits(codec, dmic_clk_reg,
0x0E, tx_priv->dmic_clk_div << 0x1);
snd_soc_update_bits(codec, dmic_clk_reg,
@@ -583,6 +586,7 @@ static int tx_macro_enable_dec(struct snd_soc_dapm_widget *w,
snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x10);
break;
case SND_SOC_DAPM_POST_PMU:
snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x20, 0x20);
snd_soc_update_bits(codec, hpf_gate_reg, 0x01, 0x00);
/* schedule work queue to Remove Mute */
@@ -613,6 +617,7 @@ static int tx_macro_enable_dec(struct snd_soc_dapm_widget *w,
&tx_priv->tx_mute_dwork[decimator].dwork);
break;
case SND_SOC_DAPM_POST_PMD:
snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x20, 0x00);
snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x00);
break;
}

View File

@@ -61,7 +61,7 @@ struct wcd937x_priv {
u32 hph_mode;
struct irq_domain *virq;
struct wcd_irq_info *irq_info;
struct wcd_irq_info irq_info;
u32 rx_clk_cnt;
int num_irq_regs;

View File

@@ -169,7 +169,7 @@ static int wcd937x_mbhc_request_irq(struct snd_soc_codec *codec,
{
struct wcd937x_priv *wcd937x = dev_get_drvdata(codec->dev);
return wcd_request_irq(wcd937x->irq_info, irq, name, handler, data);
return wcd_request_irq(&wcd937x->irq_info, irq, name, handler, data);
}
static void wcd937x_mbhc_irq_control(struct snd_soc_codec *codec,
@@ -178,9 +178,9 @@ static void wcd937x_mbhc_irq_control(struct snd_soc_codec *codec,
struct wcd937x_priv *wcd937x = dev_get_drvdata(codec->dev);
if (enable)
wcd_enable_irq(wcd937x->irq_info, irq);
wcd_enable_irq(&wcd937x->irq_info, irq);
else
wcd_disable_irq(wcd937x->irq_info, irq);
wcd_disable_irq(&wcd937x->irq_info, irq);
}
static int wcd937x_mbhc_free_irq(struct snd_soc_codec *codec,
@@ -188,7 +188,7 @@ static int wcd937x_mbhc_free_irq(struct snd_soc_codec *codec,
{
struct wcd937x_priv *wcd937x = dev_get_drvdata(codec->dev);
wcd_free_irq(wcd937x->irq_info, irq, data);
wcd_free_irq(&wcd937x->irq_info, irq, data);
return 0;
}

View File

@@ -434,21 +434,28 @@ static const struct reg_default wcd937x_defaults[] = {
static bool wcd937x_readable_register(struct device *dev, unsigned int reg)
{
if(reg <= WCD937X_BASE_ADDRESS)
return 0;
return wcd937x_reg_access[WCD937X_REG(reg)] & RD_REG;
}
static bool wcd937x_writeable_register(struct device *dev, unsigned int reg)
{
if(reg <= WCD937X_BASE_ADDRESS)
return 0;
return wcd937x_reg_access[WCD937X_REG(reg)] & WR_REG;
}
static bool wcd937x_volatile_register(struct device *dev, unsigned int reg)
{
if(reg <= WCD937X_BASE_ADDRESS)
return 0;
return (wcd937x_reg_access[WCD937X_REG(reg)] & RD_REG)
& ~(wcd937x_reg_access[WCD937X_REG(reg)] & WR_REG);
}
struct regmap_config wcd937x_regmap_config = {
.name = "wcd937x_csr",
.reg_bits = 16,
.val_bits = 8,
.cache_type = REGCACHE_RBTREE,

View File

@@ -337,6 +337,10 @@ static int wcd937x_rx_clk_enable(struct snd_soc_codec *codec)
snd_soc_update_bits(codec, WCD937X_ANA_RX_SUPPLIES, 0x01, 0x01);
snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_RX0_CTL,
0x40, 0x00);
snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_RX1_CTL,
0x40, 0x00);
snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_RX2_CTL,
0x40, 0x00);
snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_ANA_CLK_CTL,
0x02, 0x02);
}
@@ -1026,9 +1030,10 @@ static int wcd937x_enable_req(struct snd_soc_dapm_widget *w,
0x00);
snd_soc_update_bits(codec, WCD937X_ANA_TX_CH2, 0x40, 0x40);
snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_DIG_CLK_CTL,
0x10, 0x10);
0x30, 0x30);
snd_soc_update_bits(codec, WCD937X_ANA_TX_CH1, 0x80, 0x80);
snd_soc_update_bits(codec, WCD937X_ANA_TX_CH2, 0x40, 0x00);
snd_soc_update_bits(codec, WCD937X_ANA_TX_CH2, 0x80, 0x80);
break;
case SND_SOC_DAPM_POST_PMD:
snd_soc_update_bits(codec, WCD937X_ANA_TX_CH1, 0x80, 0x00);
@@ -1098,6 +1103,11 @@ int wcd937x_micbias_control(struct snd_soc_codec *codec,
case MICB_ENABLE:
wcd937x->micb_ref[micb_index]++;
if (wcd937x->micb_ref[micb_index] == 1) {
snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_DIG_CLK_CTL, 0xE0, 0xE0);
snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_ANA_CLK_CTL, 0x10, 0x10);
snd_soc_update_bits(codec, WCD937X_MICB1_TEST_CTL_2, 0x01, 0x01);
snd_soc_update_bits(codec, WCD937X_MICB2_TEST_CTL_2, 0x01, 0x01);
snd_soc_update_bits(codec, WCD937X_MICB3_TEST_CTL_2, 0x01, 0x01);
snd_soc_update_bits(codec, micb_reg, 0xC0, 0x40);
if (post_on_event)
blocking_notifier_call_chain(&wcd937x->notifier,
@@ -1324,7 +1334,7 @@ static const struct snd_soc_dapm_widget wcd937x_dapm_widgets[] = {
SND_SOC_DAPM_ADC_E("ADC1", NULL, SND_SOC_NOPM, 0, 0,
wcd937x_codec_enable_adc,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_ADC_E("ADC2", NULL, SND_SOC_NOPM, 0, 1,
SND_SOC_DAPM_ADC_E("ADC2", NULL, SND_SOC_NOPM, 1, 0,
wcd937x_codec_enable_adc,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
@@ -1439,7 +1449,7 @@ static const struct snd_soc_dapm_widget wcd9375_dapm_widgets[] = {
SND_SOC_DAPM_INPUT("AMIC4"),
/*tx widgets*/
SND_SOC_DAPM_ADC_E("ADC3", NULL, SND_SOC_NOPM, 0, 2,
SND_SOC_DAPM_ADC_E("ADC3", NULL, SND_SOC_NOPM, 2, 0,
wcd937x_codec_enable_adc,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
@@ -1450,19 +1460,19 @@ static const struct snd_soc_dapm_widget wcd9375_dapm_widgets[] = {
SND_SOC_DAPM_ADC_E("DMIC1", NULL, SND_SOC_NOPM, 0, 0,
wcd937x_codec_enable_dmic,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_ADC_E("DMIC2", NULL, SND_SOC_NOPM, 0, 1,
SND_SOC_DAPM_ADC_E("DMIC2", NULL, SND_SOC_NOPM, 1, 0,
wcd937x_codec_enable_dmic,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_ADC_E("DMIC3", NULL, SND_SOC_NOPM, 0, 2,
SND_SOC_DAPM_ADC_E("DMIC3", NULL, SND_SOC_NOPM, 2, 0,
wcd937x_codec_enable_dmic,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_ADC_E("DMIC4", NULL, SND_SOC_NOPM, 0, 3,
SND_SOC_DAPM_ADC_E("DMIC4", NULL, SND_SOC_NOPM, 3, 0,
wcd937x_codec_enable_dmic,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_ADC_E("DMIC5", NULL, SND_SOC_NOPM, 0, 4,
SND_SOC_DAPM_ADC_E("DMIC5", NULL, SND_SOC_NOPM, 4, 0,
wcd937x_codec_enable_dmic,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
SND_SOC_DAPM_ADC_E("DMIC6", NULL, SND_SOC_NOPM, 0, 5,
SND_SOC_DAPM_ADC_E("DMIC6", NULL, SND_SOC_NOPM, 5, 0,
wcd937x_codec_enable_dmic,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
@@ -1508,19 +1518,18 @@ static const struct snd_soc_dapm_widget wcd9375_dapm_widgets[] = {
static const struct snd_soc_dapm_route wcd937x_audio_map[] = {
{"ADC2_OUTPUT", NULL, "ADC2_MIXER"},
{"ADC2_MIXER", "Switch", "ADC2 REQ"},
{"ADC2 REQ", "NULL", "ADC2"},
{"ADC2", "NULL", "ADC2 MUX"},
{"ADC2 MUX", "INP3", "AMIC3"},
{"ADC2 MUX", "INP2", "AMIC2"},
{"ADC1_OUTPUT", NULL, "ADC1_MIXER"},
{"ADC1_MIXER", "Switch", "ADC1 REQ"},
{"ADC1 REQ", NULL, "ADC1"},
{"ADC1", NULL, "AMIC1"},
{"ADC2_OUTPUT", NULL, "ADC2_MIXER"},
{"ADC2_MIXER", "Switch", "ADC2 REQ"},
{"ADC2 REQ", NULL, "ADC2"},
{"ADC2", NULL, "ADC2 MUX"},
{"ADC2 MUX", "INP3", "AMIC3"},
{"ADC2 MUX", "INP2", "AMIC2"},
{"RX1", NULL, "IN1_HPHL"},
{"RDAC1", NULL, "RX1"},
{"HPHL_RDAC", "Switch", "RDAC1"},
@@ -1847,11 +1856,11 @@ static int wcd937x_bind(struct device *dev)
regmap_write(wcd937x->regmap,
(WCD937X_DIGITAL_INTR_LEVEL_0 + i), 0);
wcd937x->irq_info->wcd_regmap_irq_chip = &wcd937x_regmap_irq_chip;
wcd937x->irq_info->codec_name = "WCD937X";
wcd937x->irq_info->regmap = wcd937x->regmap;
wcd937x->irq_info->dev = dev;
ret = wcd_irq_init(wcd937x->irq_info, &wcd937x->virq);
wcd937x->irq_info.wcd_regmap_irq_chip = &wcd937x_regmap_irq_chip;
wcd937x->irq_info.codec_name = "WCD937X";
wcd937x->irq_info.regmap = wcd937x->regmap;
wcd937x->irq_info.dev = dev;
ret = wcd_irq_init(&wcd937x->irq_info, &wcd937x->virq);
if (ret) {
dev_err(wcd937x->dev, "%s: IRQ init failed: %d\n",
@@ -1870,7 +1879,7 @@ static int wcd937x_bind(struct device *dev)
return ret;
err_irq:
wcd_irq_exit(wcd937x->irq_info, wcd937x->virq);
wcd_irq_exit(&wcd937x->irq_info, wcd937x->virq);
err:
component_unbind_all(dev, wcd937x);
return ret;
@@ -1880,7 +1889,7 @@ static void wcd937x_unbind(struct device *dev)
{
struct wcd937x_priv *wcd937x = dev_get_drvdata(dev);
wcd_irq_exit(wcd937x->irq_info, wcd937x->virq);
wcd_irq_exit(&wcd937x->irq_info, wcd937x->virq);
snd_soc_unregister_codec(dev);
component_unbind_all(dev, wcd937x);
}