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, regmap_update_bits(regmap,
BOLERO_CDC_RX_CLK_RST_CTRL_MCLK_CONTROL, BOLERO_CDC_RX_CLK_RST_CTRL_MCLK_CONTROL,
0x01, 0x01); 0x01, 0x01);
regmap_update_bits(regmap,
BOLERO_CDC_RX_CLK_RST_CTRL_MCLK_CONTROL,
0x02, 0x02);
regmap_update_bits(regmap, regmap_update_bits(regmap,
BOLERO_CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL, BOLERO_CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL,
0x01, 0x01); 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: case SND_SOC_DAPM_POST_PMU:
snd_soc_write(codec, gain_reg, snd_soc_write(codec, gain_reg,
snd_soc_read(codec, gain_reg)); snd_soc_read(codec, gain_reg));
snd_soc_update_bits(codec, mix_reg, 0x10, 0x00);
break; break;
case SND_SOC_DAPM_POST_PMD: case SND_SOC_DAPM_POST_PMD:
/* Clk Disable */ /* 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: case SND_SOC_DAPM_POST_PMU:
snd_soc_write(codec, gain_reg, snd_soc_write(codec, gain_reg,
snd_soc_read(codec, gain_reg)); snd_soc_read(codec, gain_reg));
snd_soc_update_bits(codec, reg, 0x10, 0x00);
break; break;
case SND_SOC_DAPM_POST_PMD: case SND_SOC_DAPM_POST_PMD:
rx_macro_enable_interp_clk(codec, event, w->shift); rx_macro_enable_interp_clk(codec, event, w->shift);
@@ -2393,12 +2398,15 @@ static int rx_swrm_clock(void *handle, bool enable)
__func__); __func__);
goto exit; goto exit;
} }
regmap_update_bits(regmap,
BOLERO_CDC_RX_CLK_RST_CTRL_SWR_CONTROL,
0x02, 0x02);
regmap_update_bits(regmap, regmap_update_bits(regmap,
BOLERO_CDC_RX_CLK_RST_CTRL_SWR_CONTROL, BOLERO_CDC_RX_CLK_RST_CTRL_SWR_CONTROL,
0x01, 0x01); 0x01, 0x01);
regmap_update_bits(regmap, regmap_update_bits(regmap,
BOLERO_CDC_RX_CLK_RST_CTRL_SWR_CONTROL, BOLERO_CDC_RX_CLK_RST_CTRL_SWR_CONTROL,
0x1C, 0x0C); 0x02, 0x00);
msm_cdc_pinctrl_select_active_state( msm_cdc_pinctrl_select_active_state(
rx_priv->rx_swr_gpio_p); 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__); dev_err(rx_dev, "%s: failed to add snd_ctls\n", __func__);
return ret; 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; 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 + hpf_gate_reg = BOLERO_CDC_TX0_TX_PATH_SEC2 +
TX_MACRO_TX_PATH_OFFSET * decimator; TX_MACRO_TX_PATH_OFFSET * decimator;
snd_soc_update_bits(codec, hpf_gate_reg, 0x01, 0x01); 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", dev_dbg(tx_priv->dev, "%s: decimator %u unmute\n",
__func__, decimator); __func__, decimator);
} }
@@ -521,6 +521,9 @@ static int tx_macro_enable_dmic(struct snd_soc_dapm_widget *w,
case SND_SOC_DAPM_PRE_PMU: case SND_SOC_DAPM_PRE_PMU:
(*dmic_clk_cnt)++; (*dmic_clk_cnt)++;
if (*dmic_clk_cnt == 1) { 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, snd_soc_update_bits(codec, dmic_clk_reg,
0x0E, tx_priv->dmic_clk_div << 0x1); 0x0E, tx_priv->dmic_clk_div << 0x1);
snd_soc_update_bits(codec, dmic_clk_reg, 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); snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x10);
break; break;
case SND_SOC_DAPM_POST_PMU: 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); snd_soc_update_bits(codec, hpf_gate_reg, 0x01, 0x00);
/* schedule work queue to Remove Mute */ /* 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); &tx_priv->tx_mute_dwork[decimator].dwork);
break; break;
case SND_SOC_DAPM_POST_PMD: 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); snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x00);
break; break;
} }

View File

@@ -61,7 +61,7 @@ struct wcd937x_priv {
u32 hph_mode; u32 hph_mode;
struct irq_domain *virq; struct irq_domain *virq;
struct wcd_irq_info *irq_info; struct wcd_irq_info irq_info;
u32 rx_clk_cnt; u32 rx_clk_cnt;
int num_irq_regs; 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); 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, 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); struct wcd937x_priv *wcd937x = dev_get_drvdata(codec->dev);
if (enable) if (enable)
wcd_enable_irq(wcd937x->irq_info, irq); wcd_enable_irq(&wcd937x->irq_info, irq);
else 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, 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); 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; 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) 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; return wcd937x_reg_access[WCD937X_REG(reg)] & RD_REG;
} }
static bool wcd937x_writeable_register(struct device *dev, unsigned int 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; return wcd937x_reg_access[WCD937X_REG(reg)] & WR_REG;
} }
static bool wcd937x_volatile_register(struct device *dev, unsigned int 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) return (wcd937x_reg_access[WCD937X_REG(reg)] & RD_REG)
& ~(wcd937x_reg_access[WCD937X_REG(reg)] & WR_REG); & ~(wcd937x_reg_access[WCD937X_REG(reg)] & WR_REG);
} }
struct regmap_config wcd937x_regmap_config = { struct regmap_config wcd937x_regmap_config = {
.name = "wcd937x_csr",
.reg_bits = 16, .reg_bits = 16,
.val_bits = 8, .val_bits = 8,
.cache_type = REGCACHE_RBTREE, .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_ANA_RX_SUPPLIES, 0x01, 0x01);
snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_RX0_CTL, snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_RX0_CTL,
0x40, 0x00); 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, snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_ANA_CLK_CTL,
0x02, 0x02); 0x02, 0x02);
} }
@@ -1026,9 +1030,10 @@ static int wcd937x_enable_req(struct snd_soc_dapm_widget *w,
0x00); 0x00);
snd_soc_update_bits(codec, WCD937X_ANA_TX_CH2, 0x40, 0x40); snd_soc_update_bits(codec, WCD937X_ANA_TX_CH2, 0x40, 0x40);
snd_soc_update_bits(codec, WCD937X_DIGITAL_CDC_DIG_CLK_CTL, 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_CH1, 0x80, 0x80);
snd_soc_update_bits(codec, WCD937X_ANA_TX_CH2, 0x40, 0x00); snd_soc_update_bits(codec, WCD937X_ANA_TX_CH2, 0x40, 0x00);
snd_soc_update_bits(codec, WCD937X_ANA_TX_CH2, 0x80, 0x80);
break; break;
case SND_SOC_DAPM_POST_PMD: case SND_SOC_DAPM_POST_PMD:
snd_soc_update_bits(codec, WCD937X_ANA_TX_CH1, 0x80, 0x00); 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: case MICB_ENABLE:
wcd937x->micb_ref[micb_index]++; wcd937x->micb_ref[micb_index]++;
if (wcd937x->micb_ref[micb_index] == 1) { 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); snd_soc_update_bits(codec, micb_reg, 0xC0, 0x40);
if (post_on_event) if (post_on_event)
blocking_notifier_call_chain(&wcd937x->notifier, 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, SND_SOC_DAPM_ADC_E("ADC1", NULL, SND_SOC_NOPM, 0, 0,
wcd937x_codec_enable_adc, wcd937x_codec_enable_adc,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 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, wcd937x_codec_enable_adc,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 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"), SND_SOC_DAPM_INPUT("AMIC4"),
/*tx widgets*/ /*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, wcd937x_codec_enable_adc,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 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, SND_SOC_DAPM_ADC_E("DMIC1", NULL, SND_SOC_NOPM, 0, 0,
wcd937x_codec_enable_dmic, wcd937x_codec_enable_dmic,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 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, wcd937x_codec_enable_dmic,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 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, wcd937x_codec_enable_dmic,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 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, wcd937x_codec_enable_dmic,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 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, wcd937x_codec_enable_dmic,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 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, wcd937x_codec_enable_dmic,
SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), 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[] = { 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_OUTPUT", NULL, "ADC1_MIXER"},
{"ADC1_MIXER", "Switch", "ADC1 REQ"}, {"ADC1_MIXER", "Switch", "ADC1 REQ"},
{"ADC1 REQ", NULL, "ADC1"}, {"ADC1 REQ", NULL, "ADC1"},
{"ADC1", NULL, "AMIC1"}, {"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"}, {"RX1", NULL, "IN1_HPHL"},
{"RDAC1", NULL, "RX1"}, {"RDAC1", NULL, "RX1"},
{"HPHL_RDAC", "Switch", "RDAC1"}, {"HPHL_RDAC", "Switch", "RDAC1"},
@@ -1847,11 +1856,11 @@ static int wcd937x_bind(struct device *dev)
regmap_write(wcd937x->regmap, regmap_write(wcd937x->regmap,
(WCD937X_DIGITAL_INTR_LEVEL_0 + i), 0); (WCD937X_DIGITAL_INTR_LEVEL_0 + i), 0);
wcd937x->irq_info->wcd_regmap_irq_chip = &wcd937x_regmap_irq_chip; wcd937x->irq_info.wcd_regmap_irq_chip = &wcd937x_regmap_irq_chip;
wcd937x->irq_info->codec_name = "WCD937X"; wcd937x->irq_info.codec_name = "WCD937X";
wcd937x->irq_info->regmap = wcd937x->regmap; wcd937x->irq_info.regmap = wcd937x->regmap;
wcd937x->irq_info->dev = dev; wcd937x->irq_info.dev = dev;
ret = wcd_irq_init(wcd937x->irq_info, &wcd937x->virq); ret = wcd_irq_init(&wcd937x->irq_info, &wcd937x->virq);
if (ret) { if (ret) {
dev_err(wcd937x->dev, "%s: IRQ init failed: %d\n", dev_err(wcd937x->dev, "%s: IRQ init failed: %d\n",
@@ -1870,7 +1879,7 @@ static int wcd937x_bind(struct device *dev)
return ret; return ret;
err_irq: err_irq:
wcd_irq_exit(wcd937x->irq_info, wcd937x->virq); wcd_irq_exit(&wcd937x->irq_info, wcd937x->virq);
err: err:
component_unbind_all(dev, wcd937x); component_unbind_all(dev, wcd937x);
return ret; return ret;
@@ -1880,7 +1889,7 @@ static void wcd937x_unbind(struct device *dev)
{ {
struct wcd937x_priv *wcd937x = dev_get_drvdata(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); snd_soc_unregister_codec(dev);
component_unbind_all(dev, wcd937x); component_unbind_all(dev, wcd937x);
} }