|
@@ -113,8 +113,8 @@ static const struct wsa_reg_mask_val reg_init[] = {
|
|
|
{WSA883X_CURRENT_LIMIT, 0x78, 0x40},
|
|
|
{WSA883X_DRE_CTL_0, 0x07, 0x02},
|
|
|
{WSA883X_VAGC_TIME, 0x0F, 0x0F},
|
|
|
- {WSA883X_VAGC_ATTN_LVL_1_2, 0x70, 0x10},
|
|
|
- {WSA883X_VAGC_ATTN_LVL_3, 0x07, 0x02},
|
|
|
+ {WSA883X_VAGC_ATTN_LVL_1_2, 0x77, 0x00},
|
|
|
+ {WSA883X_VAGC_ATTN_LVL_3, 0x07, 0x01},
|
|
|
{WSA883X_VAGC_CTL, 0x01, 0x01},
|
|
|
{WSA883X_TAGC_CTL, 0x0E, 0x0A},
|
|
|
{WSA883X_TAGC_TIME, 0x0C, 0x0C},
|
|
@@ -521,8 +521,33 @@ static irqreturn_t wsa883x_uvlo_handle_irq(int irq, void *data)
|
|
|
|
|
|
static irqreturn_t wsa883x_pa_on_err_handle_irq(int irq, void *data)
|
|
|
{
|
|
|
+ u8 pa_fsm_sta = 0, pa_fsm_err = 0;
|
|
|
+ struct wsa883x_priv *wsa883x = data;
|
|
|
+ struct snd_soc_component *component = NULL;
|
|
|
+
|
|
|
+ if (!wsa883x)
|
|
|
+ return IRQ_NONE;
|
|
|
+
|
|
|
+ component = wsa883x->component;
|
|
|
+ if (!component)
|
|
|
+ return IRQ_NONE;
|
|
|
+
|
|
|
+ pa_fsm_sta = (snd_soc_component_read(component, WSA883X_PA_FSM_STA)
|
|
|
+ & 0x70);
|
|
|
+ if (pa_fsm_sta)
|
|
|
+ pa_fsm_err = snd_soc_component_read(component,
|
|
|
+ WSA883X_PA_FSM_ERR_COND);
|
|
|
+
|
|
|
pr_err_ratelimited("%s: interrupt for irq =%d triggered\n",
|
|
|
__func__, irq);
|
|
|
+
|
|
|
+ snd_soc_component_update_bits(component, WSA883X_PA_FSM_CTL,
|
|
|
+ 0x10, 0x00);
|
|
|
+ snd_soc_component_update_bits(component, WSA883X_PA_FSM_CTL,
|
|
|
+ 0x10, 0x10);
|
|
|
+ snd_soc_component_update_bits(component, WSA883X_PA_FSM_CTL,
|
|
|
+ 0x10, 0x00);
|
|
|
+
|
|
|
return IRQ_HANDLED;
|
|
|
}
|
|
|
|
|
@@ -570,9 +595,9 @@ static int wsa_dev_mode_put(struct snd_kcontrol *kcontrol,
|
|
|
}
|
|
|
|
|
|
static const char * const wsa_pa_gain_text[] = {
|
|
|
- "G_18_DB", "G_16P5_DB", "G_15_DB", "G_13P5_DB", "G_12_DB", "G_10P5_DB",
|
|
|
- "G_9_DB", "G_7P5_DB", "G_6_DB", "G_4P5_DB", "G_3_DB", "G_1P5_DB",
|
|
|
- "G_0_DB"
|
|
|
+ "G_21_DB", "G_19P5_DB", "G_18_DB", "G_16P5_DB", "G_15_DB", "G_13P5_DB",
|
|
|
+ "G_12_DB", "G_10P5_DB", "G_9_DB", "G_7P5_DB", "G_6_DB", "G_4P5_DB", "G_3_DB", "G_1P5_DB",
|
|
|
+ "G_0_DB", "N_1P5_DB", "N_3_DB"
|
|
|
};
|
|
|
|
|
|
static const struct soc_enum wsa_pa_gain_enum =
|
|
@@ -605,6 +630,10 @@ static int wsa_pa_gain_put(struct snd_kcontrol *kcontrol,
|
|
|
|
|
|
wsa883x->pa_gain = ucontrol->value.integer.value[0];
|
|
|
|
|
|
+ if (!wsa883x->comp_enable)
|
|
|
+ snd_soc_component_update_bits(component,
|
|
|
+ WSA883X_DRE_CTL_1,
|
|
|
+ 0x3E, wsa883x->pa_gain << 1);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -1155,7 +1184,13 @@ static int wsa883x_spkr_event(struct snd_soc_dapm_widget *w,
|
|
|
WSA883X_DRE_CTL_0,
|
|
|
0x07,
|
|
|
wsa883x->comp_offset);
|
|
|
+ wcd_enable_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_PA_ON_ERR);
|
|
|
wcd_enable_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_UVLO);
|
|
|
+ wcd_enable_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_SAF2WAR);
|
|
|
+ wcd_enable_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_WAR2SAF);
|
|
|
+ wcd_enable_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_DISABLE);
|
|
|
+ wcd_enable_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_OCP);
|
|
|
+ wcd_enable_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_CLK_WD);
|
|
|
snd_soc_component_update_bits(component,
|
|
|
WSA883X_VBAT_ADC_FLT_CTL,
|
|
|
0x0E, 0x06);
|
|
@@ -1178,9 +1213,21 @@ static int wsa883x_spkr_event(struct snd_soc_dapm_widget *w,
|
|
|
0x0E, 0x00);
|
|
|
snd_soc_component_update_bits(component, WSA883X_PA_FSM_CTL,
|
|
|
0x01, 0x00);
|
|
|
+ snd_soc_component_update_bits(component, WSA883X_PA_FSM_CTL,
|
|
|
+ 0x10, 0x00);
|
|
|
+ snd_soc_component_update_bits(component, WSA883X_PA_FSM_CTL,
|
|
|
+ 0x10, 0x10);
|
|
|
+ snd_soc_component_update_bits(component, WSA883X_PA_FSM_CTL,
|
|
|
+ 0x10, 0x00);
|
|
|
snd_soc_component_update_bits(component, WSA883X_PDM_WD_CTL,
|
|
|
0x01, 0x00);
|
|
|
+ wcd_disable_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_CLK_WD);
|
|
|
+ wcd_disable_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_OCP);
|
|
|
+ wcd_disable_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_DISABLE);
|
|
|
+ wcd_disable_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_WAR2SAF);
|
|
|
+ wcd_disable_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_SAF2WAR);
|
|
|
wcd_disable_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_UVLO);
|
|
|
+ wcd_disable_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_PA_ON_ERR);
|
|
|
clear_bit(SPKR_STATUS, &wsa883x->status_mask);
|
|
|
clear_bit(SPKR_ADIE_LB, &wsa883x->status_mask);
|
|
|
break;
|
|
@@ -1400,25 +1447,20 @@ static int wsa883x_codec_probe(struct snd_soc_component *component)
|
|
|
wsa883x->global_pa_cnt = 0;
|
|
|
|
|
|
memset(w_name, 0, sizeof(w_name));
|
|
|
- strlcpy(w_name, component->name_prefix, sizeof(w_name));
|
|
|
- strlcat(w_name, " ", sizeof(w_name));
|
|
|
- strlcat(w_name, wsa883x->dai_driver->playback.stream_name,
|
|
|
+ strlcpy(w_name, wsa883x->dai_driver->playback.stream_name,
|
|
|
sizeof(w_name));
|
|
|
snd_soc_dapm_ignore_suspend(dapm, w_name);
|
|
|
|
|
|
memset(w_name, 0, sizeof(w_name));
|
|
|
- strlcpy(w_name, component->name_prefix, sizeof(w_name));
|
|
|
- strlcat(w_name, " IN", sizeof(w_name));
|
|
|
+ strlcpy(w_name, "IN", sizeof(w_name));
|
|
|
snd_soc_dapm_ignore_suspend(dapm, w_name);
|
|
|
|
|
|
memset(w_name, 0, sizeof(w_name));
|
|
|
- strlcpy(w_name, component->name_prefix, sizeof(w_name));
|
|
|
- strlcat(w_name, " SWR DAC_Port", sizeof(w_name));
|
|
|
+ strlcpy(w_name, "SWR DAC_Port", sizeof(w_name));
|
|
|
snd_soc_dapm_ignore_suspend(dapm, w_name);
|
|
|
|
|
|
memset(w_name, 0, sizeof(w_name));
|
|
|
- strlcpy(w_name, component->name_prefix, sizeof(w_name));
|
|
|
- strlcat(w_name, " SPKR", sizeof(w_name));
|
|
|
+ strlcpy(w_name, "SPKR", sizeof(w_name));
|
|
|
snd_soc_dapm_ignore_suspend(dapm, w_name);
|
|
|
|
|
|
snd_soc_dapm_sync(dapm);
|
|
@@ -1569,11 +1611,13 @@ static int wsa883x_event_notify(struct notifier_block *nb,
|
|
|
WSA883X_IRQ_INT_PDM_WD);
|
|
|
/* Added delay as per HW sequence */
|
|
|
usleep_range(3000, 3100);
|
|
|
- snd_soc_component_update_bits(wsa883x->component,
|
|
|
+ if (wsa883x->comp_enable) {
|
|
|
+ snd_soc_component_update_bits(wsa883x->component,
|
|
|
WSA883X_DRE_CTL_1,
|
|
|
0x01, 0x00);
|
|
|
- /* Added delay as per HW sequence */
|
|
|
- usleep_range(5000, 5050);
|
|
|
+ /* Added delay as per HW sequence */
|
|
|
+ usleep_range(5000, 5050);
|
|
|
+ }
|
|
|
}
|
|
|
break;
|
|
|
case BOLERO_SLV_EVT_PA_ON_POST_FSCLK_ADIE_LB:
|
|
@@ -1645,12 +1689,20 @@ static int wsa883x_swr_probe(struct swr_device *pdev)
|
|
|
struct snd_soc_component *component;
|
|
|
char buffer[MAX_NAME_LEN];
|
|
|
int dev_index = 0;
|
|
|
+ struct regmap_irq_chip *wsa883x_sub_regmap_irq_chip = NULL;
|
|
|
|
|
|
wsa883x = devm_kzalloc(&pdev->dev, sizeof(struct wsa883x_priv),
|
|
|
GFP_KERNEL);
|
|
|
if (!wsa883x)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
+ wsa883x_sub_regmap_irq_chip = devm_kzalloc(&pdev->dev, sizeof(struct regmap_irq_chip),
|
|
|
+ GFP_KERNEL);
|
|
|
+ if (!wsa883x_sub_regmap_irq_chip)
|
|
|
+ return -ENOMEM;
|
|
|
+ memcpy(wsa883x_sub_regmap_irq_chip, &wsa883x_regmap_irq_chip,
|
|
|
+ sizeof(struct regmap_irq_chip));
|
|
|
+
|
|
|
ret = wsa883x_enable_supplies(&pdev->dev, wsa883x);
|
|
|
if (ret) {
|
|
|
ret = -EPROBE_DEFER;
|
|
@@ -1665,6 +1717,7 @@ static int wsa883x_swr_probe(struct swr_device *pdev)
|
|
|
}
|
|
|
swr_set_dev_data(pdev, wsa883x);
|
|
|
wsa883x->swr_slave = pdev;
|
|
|
+ wsa883x->dev = &pdev->dev;
|
|
|
pin_state_current = msm_cdc_pinctrl_get_state(wsa883x->wsa_rst_np);
|
|
|
wsa883x_gpio_ctrl(wsa883x, true);
|
|
|
/*
|
|
@@ -1695,11 +1748,11 @@ static int wsa883x_swr_probe(struct swr_device *pdev)
|
|
|
devm_regmap_qti_debugfs_register(&pdev->dev, wsa883x->regmap);
|
|
|
|
|
|
/* Set all interrupts as edge triggered */
|
|
|
- for (i = 0; i < wsa883x_regmap_irq_chip.num_regs; i++)
|
|
|
+ for (i = 0; i < wsa883x_sub_regmap_irq_chip->num_regs; i++)
|
|
|
regmap_write(wsa883x->regmap, (WSA883X_INTR_LEVEL0 + i), 0);
|
|
|
|
|
|
- wsa883x_regmap_irq_chip.irq_drv_data = wsa883x;
|
|
|
- wsa883x->irq_info.wcd_regmap_irq_chip = &wsa883x_regmap_irq_chip;
|
|
|
+ wsa883x_sub_regmap_irq_chip->irq_drv_data = wsa883x;
|
|
|
+ wsa883x->irq_info.wcd_regmap_irq_chip = wsa883x_sub_regmap_irq_chip;
|
|
|
wsa883x->irq_info.codec_name = "WSA883X";
|
|
|
wsa883x->irq_info.regmap = wsa883x->regmap;
|
|
|
wsa883x->irq_info.dev = &pdev->dev;
|
|
@@ -1710,55 +1763,56 @@ static int wsa883x_swr_probe(struct swr_device *pdev)
|
|
|
__func__, ret);
|
|
|
goto dev_err;
|
|
|
}
|
|
|
+ wsa883x->swr_slave->slave_irq = wsa883x->virq;
|
|
|
|
|
|
wcd_request_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_SAF2WAR,
|
|
|
- "WSA SAF2WAR", wsa883x_saf2war_handle_irq, NULL);
|
|
|
+ "WSA SAF2WAR", wsa883x_saf2war_handle_irq, wsa883x);
|
|
|
|
|
|
wcd_disable_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_SAF2WAR);
|
|
|
|
|
|
wcd_request_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_WAR2SAF,
|
|
|
- "WSA WAR2SAF", wsa883x_war2saf_handle_irq, NULL);
|
|
|
+ "WSA WAR2SAF", wsa883x_war2saf_handle_irq, wsa883x);
|
|
|
|
|
|
wcd_disable_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_WAR2SAF);
|
|
|
|
|
|
wcd_request_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_DISABLE,
|
|
|
- "WSA OTP", wsa883x_otp_handle_irq, NULL);
|
|
|
+ "WSA OTP", wsa883x_otp_handle_irq, wsa883x);
|
|
|
|
|
|
wcd_disable_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_DISABLE);
|
|
|
|
|
|
wcd_request_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_OCP,
|
|
|
- "WSA OCP", wsa883x_ocp_handle_irq, NULL);
|
|
|
+ "WSA OCP", wsa883x_ocp_handle_irq, wsa883x);
|
|
|
|
|
|
wcd_disable_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_OCP);
|
|
|
|
|
|
wcd_request_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_CLIP,
|
|
|
- "WSA CLIP", wsa883x_clip_handle_irq, NULL);
|
|
|
+ "WSA CLIP", wsa883x_clip_handle_irq, wsa883x);
|
|
|
|
|
|
wcd_disable_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_CLIP);
|
|
|
|
|
|
wcd_request_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_PDM_WD,
|
|
|
- "WSA PDM WD", wsa883x_pdm_wd_handle_irq, NULL);
|
|
|
+ "WSA PDM WD", wsa883x_pdm_wd_handle_irq, wsa883x);
|
|
|
|
|
|
wcd_disable_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_PDM_WD);
|
|
|
|
|
|
wcd_request_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_CLK_WD,
|
|
|
- "WSA CLK WD", wsa883x_clk_wd_handle_irq, NULL);
|
|
|
+ "WSA CLK WD", wsa883x_clk_wd_handle_irq, wsa883x);
|
|
|
|
|
|
wcd_disable_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_CLK_WD);
|
|
|
|
|
|
wcd_request_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_INTR_PIN,
|
|
|
- "WSA EXT INT", wsa883x_ext_int_handle_irq, NULL);
|
|
|
+ "WSA EXT INT", wsa883x_ext_int_handle_irq, wsa883x);
|
|
|
|
|
|
wcd_disable_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_INTR_PIN);
|
|
|
|
|
|
/* Under Voltage Lock out (UVLO) interrupt handle */
|
|
|
wcd_request_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_UVLO,
|
|
|
- "WSA UVLO", wsa883x_uvlo_handle_irq, NULL);
|
|
|
+ "WSA UVLO", wsa883x_uvlo_handle_irq, wsa883x);
|
|
|
|
|
|
wcd_disable_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_UVLO);
|
|
|
|
|
|
wcd_request_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_PA_ON_ERR,
|
|
|
- "WSA PA ERR", wsa883x_pa_on_err_handle_irq, NULL);
|
|
|
+ "WSA PA ERR", wsa883x_pa_on_err_handle_irq, wsa883x);
|
|
|
|
|
|
wcd_disable_irq(&wsa883x->irq_info, WSA883X_IRQ_INT_PA_ON_ERR);
|
|
|
|