From 9c2394a6e4e5470c5a43edf6e06e2c20e648411a Mon Sep 17 00:00:00 2001 From: Ramprasad Katkam Date: Thu, 23 Aug 2018 13:13:48 +0530 Subject: [PATCH] asoc: Talos-tanggu bringup fixes Bringup fixes to enumerate tanggu codec on talos. Change-Id: Ic9c43ec0b870f6fec3c6d21fd4d77606c7ed94b1 Signed-off-by: Ramprasad Katkam --- asoc/codecs/bolero/rx-macro.c | 19 +++++++++- asoc/codecs/bolero/tx-macro.c | 7 +++- asoc/codecs/wcd937x/internal.h | 2 +- asoc/codecs/wcd937x/wcd937x-mbhc.c | 8 ++-- asoc/codecs/wcd937x/wcd937x-regmap.c | 7 ++++ asoc/codecs/wcd937x/wcd937x.c | 55 ++++++++++++++++------------ 6 files changed, 68 insertions(+), 30 deletions(-) diff --git a/asoc/codecs/bolero/rx-macro.c b/asoc/codecs/bolero/rx-macro.c index 905a0edc70..fbacdc0283 100644 --- a/asoc/codecs/bolero/rx-macro.c +++ b/asoc/codecs/bolero/rx-macro.c @@ -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; diff --git a/asoc/codecs/bolero/tx-macro.c b/asoc/codecs/bolero/tx-macro.c index e2eac593b6..f8c762b8c9 100644 --- a/asoc/codecs/bolero/tx-macro.c +++ b/asoc/codecs/bolero/tx-macro.c @@ -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; } diff --git a/asoc/codecs/wcd937x/internal.h b/asoc/codecs/wcd937x/internal.h index b693f6a9bc..06e64d038b 100644 --- a/asoc/codecs/wcd937x/internal.h +++ b/asoc/codecs/wcd937x/internal.h @@ -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; diff --git a/asoc/codecs/wcd937x/wcd937x-mbhc.c b/asoc/codecs/wcd937x/wcd937x-mbhc.c index f83271b083..4a2fa615f7 100644 --- a/asoc/codecs/wcd937x/wcd937x-mbhc.c +++ b/asoc/codecs/wcd937x/wcd937x-mbhc.c @@ -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; } diff --git a/asoc/codecs/wcd937x/wcd937x-regmap.c b/asoc/codecs/wcd937x/wcd937x-regmap.c index cccf8dbdbf..f445abceed 100644 --- a/asoc/codecs/wcd937x/wcd937x-regmap.c +++ b/asoc/codecs/wcd937x/wcd937x-regmap.c @@ -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, diff --git a/asoc/codecs/wcd937x/wcd937x.c b/asoc/codecs/wcd937x/wcd937x.c index f445540eb3..d26b81923e 100644 --- a/asoc/codecs/wcd937x/wcd937x.c +++ b/asoc/codecs/wcd937x/wcd937x.c @@ -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); }