Loading asoc/codecs/wcd937x/internal.h +3 −1 Original line number Diff line number Diff line /* SPDX-License-Identifier: GPL-2.0-only */ /* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. /* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. */ #ifndef _WCD937X_INTERNAL_H Loading @@ -16,6 +16,7 @@ #define WCD_VOUT_CTL_TO_MICB(v) (1000 + v * 50) #define MAX_PORT 8 #define MAX_CH_PER_PORT 8 #define MAX_TX_PWR_CH 2 extern struct regmap_config wcd937x_regmap_config; Loading Loading @@ -88,6 +89,7 @@ struct wcd937x_priv { int ana_clk_count; struct mutex ana_tx_clk_lock; bool usbc_hs_status; u32 tx_ch_pwr[MAX_TX_PWR_CH]; }; struct wcd937x_micbias_setting { Loading asoc/codecs/wcd937x/wcd937x.c +56 −1 Original line number Diff line number Diff line Loading @@ -1768,6 +1768,48 @@ static int wcd937x_rx_hph_mode_put(struct snd_kcontrol *kcontrol, return 0; } static int wcd937x_tx_ch_pwr_level_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); struct wcd937x_priv *wcd937x = snd_soc_component_get_drvdata(component); if (strnstr(kcontrol->id.name, "CH1", sizeof(kcontrol->id.name))) ucontrol->value.integer.value[0] = wcd937x->tx_ch_pwr[0]; else if (strnstr(kcontrol->id.name, "CH3", sizeof(kcontrol->id.name))) ucontrol->value.integer.value[0] = wcd937x->tx_ch_pwr[1]; return 0; } static int wcd937x_tx_ch_pwr_level_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); struct wcd937x_priv *wcd937x = snd_soc_component_get_drvdata(component); u32 pwr_level = ucontrol->value.enumerated.item[0]; dev_dbg(component->dev, "%s: tx ch pwr_level: %d\n", __func__, pwr_level); if (strnstr(kcontrol->id.name, "CH1", sizeof(kcontrol->id.name))) { snd_soc_component_update_bits(component, WCD937X_ANA_TX_CH1, 0x60, pwr_level << 0x5); wcd937x->tx_ch_pwr[0] = pwr_level; } else if (strnstr(kcontrol->id.name, "CH3", sizeof(kcontrol->id.name))) { snd_soc_component_update_bits(component, WCD937X_ANA_TX_CH3, 0x60, pwr_level << 0x5); wcd937x->tx_ch_pwr[1] = pwr_level; } return 0; } static int wcd937x_ear_pa_gain_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { Loading Loading @@ -1906,6 +1948,10 @@ static const char * const rx_hph_mode_mux_text[] = { "CLS_H_ULP", "CLS_AB_HIFI", }; static const char * const wcd937x_tx_ch_pwr_level_text[] = { "L0", "L1", "L2", "L3", }; static const char * const wcd937x_ear_pa_gain_text[] = { "G_6_DB", "G_4P5_DB", "G_3_DB", "G_1P5_DB", "G_0_DB", "G_M1P5_DB", "G_M3_DB", "G_M4P5_DB", Loading @@ -1921,6 +1967,9 @@ static const struct soc_enum rx_hph_mode_mux_enum = static SOC_ENUM_SINGLE_EXT_DECL(wcd937x_ear_pa_gain_enum, wcd937x_ear_pa_gain_text); static SOC_ENUM_SINGLE_EXT_DECL(wcd937x_tx_ch_pwr_level_enum, wcd937x_tx_ch_pwr_level_text); static const struct snd_kcontrol_new wcd937x_snd_controls[] = { SOC_ENUM_EXT("EAR PA GAIN", wcd937x_ear_pa_gain_enum, wcd937x_ear_pa_gain_get, wcd937x_ear_pa_gain_put), Loading @@ -1939,6 +1988,10 @@ static const struct snd_kcontrol_new wcd937x_snd_controls[] = { analog_gain), SOC_SINGLE_TLV("ADC3 Volume", WCD937X_ANA_TX_CH3, 0, 20, 0, analog_gain), SOC_ENUM_EXT("TX CH1 PWR", wcd937x_tx_ch_pwr_level_enum, wcd937x_tx_ch_pwr_level_get, wcd937x_tx_ch_pwr_level_put), SOC_ENUM_EXT("TX CH3 PWR", wcd937x_tx_ch_pwr_level_enum, wcd937x_tx_ch_pwr_level_get, wcd937x_tx_ch_pwr_level_put), }; static const struct snd_kcontrol_new adc1_switch[] = { Loading Loading @@ -2990,7 +3043,9 @@ static int wcd937x_bind(struct device *dev) dev_err(dev, "%s: bad micbias pdata\n", __func__); goto err_irq; } /* default L1 power setting */ wcd937x->tx_ch_pwr[0] = 1; wcd937x->tx_ch_pwr[1] = 1; mutex_init(&wcd937x->micb_lock); mutex_init(&wcd937x->ana_tx_clk_lock); /* Request for watchdog interrupt */ Loading Loading
asoc/codecs/wcd937x/internal.h +3 −1 Original line number Diff line number Diff line /* SPDX-License-Identifier: GPL-2.0-only */ /* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. /* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. */ #ifndef _WCD937X_INTERNAL_H Loading @@ -16,6 +16,7 @@ #define WCD_VOUT_CTL_TO_MICB(v) (1000 + v * 50) #define MAX_PORT 8 #define MAX_CH_PER_PORT 8 #define MAX_TX_PWR_CH 2 extern struct regmap_config wcd937x_regmap_config; Loading Loading @@ -88,6 +89,7 @@ struct wcd937x_priv { int ana_clk_count; struct mutex ana_tx_clk_lock; bool usbc_hs_status; u32 tx_ch_pwr[MAX_TX_PWR_CH]; }; struct wcd937x_micbias_setting { Loading
asoc/codecs/wcd937x/wcd937x.c +56 −1 Original line number Diff line number Diff line Loading @@ -1768,6 +1768,48 @@ static int wcd937x_rx_hph_mode_put(struct snd_kcontrol *kcontrol, return 0; } static int wcd937x_tx_ch_pwr_level_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); struct wcd937x_priv *wcd937x = snd_soc_component_get_drvdata(component); if (strnstr(kcontrol->id.name, "CH1", sizeof(kcontrol->id.name))) ucontrol->value.integer.value[0] = wcd937x->tx_ch_pwr[0]; else if (strnstr(kcontrol->id.name, "CH3", sizeof(kcontrol->id.name))) ucontrol->value.integer.value[0] = wcd937x->tx_ch_pwr[1]; return 0; } static int wcd937x_tx_ch_pwr_level_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); struct wcd937x_priv *wcd937x = snd_soc_component_get_drvdata(component); u32 pwr_level = ucontrol->value.enumerated.item[0]; dev_dbg(component->dev, "%s: tx ch pwr_level: %d\n", __func__, pwr_level); if (strnstr(kcontrol->id.name, "CH1", sizeof(kcontrol->id.name))) { snd_soc_component_update_bits(component, WCD937X_ANA_TX_CH1, 0x60, pwr_level << 0x5); wcd937x->tx_ch_pwr[0] = pwr_level; } else if (strnstr(kcontrol->id.name, "CH3", sizeof(kcontrol->id.name))) { snd_soc_component_update_bits(component, WCD937X_ANA_TX_CH3, 0x60, pwr_level << 0x5); wcd937x->tx_ch_pwr[1] = pwr_level; } return 0; } static int wcd937x_ear_pa_gain_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { Loading Loading @@ -1906,6 +1948,10 @@ static const char * const rx_hph_mode_mux_text[] = { "CLS_H_ULP", "CLS_AB_HIFI", }; static const char * const wcd937x_tx_ch_pwr_level_text[] = { "L0", "L1", "L2", "L3", }; static const char * const wcd937x_ear_pa_gain_text[] = { "G_6_DB", "G_4P5_DB", "G_3_DB", "G_1P5_DB", "G_0_DB", "G_M1P5_DB", "G_M3_DB", "G_M4P5_DB", Loading @@ -1921,6 +1967,9 @@ static const struct soc_enum rx_hph_mode_mux_enum = static SOC_ENUM_SINGLE_EXT_DECL(wcd937x_ear_pa_gain_enum, wcd937x_ear_pa_gain_text); static SOC_ENUM_SINGLE_EXT_DECL(wcd937x_tx_ch_pwr_level_enum, wcd937x_tx_ch_pwr_level_text); static const struct snd_kcontrol_new wcd937x_snd_controls[] = { SOC_ENUM_EXT("EAR PA GAIN", wcd937x_ear_pa_gain_enum, wcd937x_ear_pa_gain_get, wcd937x_ear_pa_gain_put), Loading @@ -1939,6 +1988,10 @@ static const struct snd_kcontrol_new wcd937x_snd_controls[] = { analog_gain), SOC_SINGLE_TLV("ADC3 Volume", WCD937X_ANA_TX_CH3, 0, 20, 0, analog_gain), SOC_ENUM_EXT("TX CH1 PWR", wcd937x_tx_ch_pwr_level_enum, wcd937x_tx_ch_pwr_level_get, wcd937x_tx_ch_pwr_level_put), SOC_ENUM_EXT("TX CH3 PWR", wcd937x_tx_ch_pwr_level_enum, wcd937x_tx_ch_pwr_level_get, wcd937x_tx_ch_pwr_level_put), }; static const struct snd_kcontrol_new adc1_switch[] = { Loading Loading @@ -2990,7 +3043,9 @@ static int wcd937x_bind(struct device *dev) dev_err(dev, "%s: bad micbias pdata\n", __func__); goto err_irq; } /* default L1 power setting */ wcd937x->tx_ch_pwr[0] = 1; wcd937x->tx_ch_pwr[1] = 1; mutex_init(&wcd937x->micb_lock); mutex_init(&wcd937x->ana_tx_clk_lock); /* Request for watchdog interrupt */ Loading