forked from Minki/linux
Merge series "ASoC: codecs: wcd934x: add Headset and button detection support" from Srinivas Kandagatla <srinivas.kandagatla@linaro.org>:
This patchset adds support to MBHC(Multi Button Headset Control) block found in Qualcomm WCD codecs. MBHC support headset type detection, both Mechanical and electrical insert/removal detection along with 8 buttons detection, Over current interrupts on HPHL/R, Impedance Measurements on HPHL/R. Eventhough MBHC block supports things like OverCurrent detection, Currently its reported as a kernel debug message. Should this be reported as an uevent to userspace? like the way USB reports? Any suggestions? First patch adds a common mbhc driver and the second one wcd934x specific driver changes along with sdm845 soundcard related changes. Common wcd-mbhc-v2 driver should be reusable across multiple codecs like WCD9335, WCD934x, WCD937x and WCD938x. Most of the work is derived from downstream Qualcomm kernels. Credits to various Qualcomm authors from Patrick Lai's team who have contributed to this code. Changes since v2: - switched to EXPORT_SYMBOL_GPL from EXPORT_SYMBOL - converted one of the if else to switch case. Srinivas Kandagatla (4): ASoC: dt-bindings: wcd934x: add bindings for Headset Button detection ASoC: codecs: wcd: add multi button Headset detection support ASoC: codecs: wcd934x: add mbhc support ASoC: qcom: sdm845: add jack support for WCD934x .../bindings/sound/qcom,wcd934x.yaml | 30 + include/linux/mfd/wcd934x/registers.h | 57 + sound/soc/codecs/Kconfig | 4 + sound/soc/codecs/Makefile | 2 + sound/soc/codecs/wcd-mbhc-v2.c | 1475 +++++++++++++++++ sound/soc/codecs/wcd-mbhc-v2.h | 340 ++++ sound/soc/codecs/wcd934x.c | 884 +++++++++- sound/soc/qcom/sdm845.c | 8 + 8 files changed, 2785 insertions(+), 15 deletions(-) create mode 100644 sound/soc/codecs/wcd-mbhc-v2.c create mode 100644 sound/soc/codecs/wcd-mbhc-v2.h -- 2.21.0
This commit is contained in:
commit
ffb2df66ba
@ -77,6 +77,31 @@ properties:
|
||||
minimum: 1800000
|
||||
maximum: 2850000
|
||||
|
||||
qcom,hphl-jack-type-normally-closed:
|
||||
description: Indicates that HPHL jack switch type is normally closed
|
||||
type: boolean
|
||||
|
||||
qcom,ground-jack-type-normally-closed:
|
||||
description: Indicates that Headset Ground switch type is normally closed
|
||||
type: boolean
|
||||
|
||||
qcom,mbhc-headset-vthreshold-microvolt:
|
||||
description: Voltage threshold value for headset detection
|
||||
minimum: 0
|
||||
maximum: 2850000
|
||||
|
||||
qcom,mbhc-headphone-vthreshold-microvolt:
|
||||
description: Voltage threshold value for headphone detection
|
||||
minimum: 0
|
||||
maximum: 2850000
|
||||
|
||||
qcom,mbhc-buttons-vthreshold-microvolt:
|
||||
description:
|
||||
Array of 8 Voltage threshold values corresponding to headset
|
||||
button0 - button7
|
||||
minItems: 8
|
||||
maxItems: 8
|
||||
|
||||
clock-output-names:
|
||||
const: mclk
|
||||
|
||||
@ -159,6 +184,11 @@ examples:
|
||||
qcom,micbias2-microvolt = <1800000>;
|
||||
qcom,micbias3-microvolt = <1800000>;
|
||||
qcom,micbias4-microvolt = <1800000>;
|
||||
qcom,hphl-jack-type-normally-closed;
|
||||
qcom,ground-jack-type-normally-closed;
|
||||
qcom,mbhc-buttons-vthreshold-microvolt = <75000 150000 237000 500000 500000 500000 500000 500000>;
|
||||
qcom,mbhc-headset-vthreshold-microvolt = <1700000>;
|
||||
qcom,mbhc-headphone-vthreshold-microvolt = <50000>;
|
||||
clock-names = "extclk";
|
||||
clocks = <&rpmhcc 2>;
|
||||
|
||||
|
@ -18,6 +18,8 @@
|
||||
#define WCD934X_EFUSE_SENSE_STATE_DEF 0x10
|
||||
#define WCD934X_EFUSE_SENSE_EN_MASK BIT(0)
|
||||
#define WCD934X_EFUSE_SENSE_ENABLE BIT(0)
|
||||
#define WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT1 0x002a
|
||||
#define WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT2 0x002b
|
||||
#define WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT14 0x0037
|
||||
#define WCD934X_CHIP_TIER_CTRL_EFUSE_VAL_OUT15 0x0038
|
||||
#define WCD934X_CHIP_TIER_CTRL_EFUSE_STATUS 0x0039
|
||||
@ -103,21 +105,58 @@
|
||||
#define WCD934X_ANA_AMIC3 0x0610
|
||||
#define WCD934X_ANA_AMIC4 0x0611
|
||||
#define WCD934X_ANA_MBHC_MECH 0x0614
|
||||
#define WCD934X_MBHC_L_DET_EN_MASK BIT(7)
|
||||
#define WCD934X_MBHC_L_DET_EN BIT(7)
|
||||
#define WCD934X_MBHC_GND_DET_EN_MASK BIT(6)
|
||||
#define WCD934X_MBHC_MECH_DETECT_TYPE_MASK BIT(5)
|
||||
#define WCD934X_MBHC_MECH_DETECT_TYPE_INS 1
|
||||
#define WCD934X_MBHC_HPHL_PLUG_TYPE_MASK BIT(4)
|
||||
#define WCD934X_MBHC_HPHL_PLUG_TYPE_NO 1
|
||||
#define WCD934X_MBHC_GND_PLUG_TYPE_MASK BIT(3)
|
||||
#define WCD934X_MBHC_GND_PLUG_TYPE_NO 1
|
||||
#define WCD934X_MBHC_HSL_PULLUP_COMP_EN BIT(2)
|
||||
#define WCD934X_MBHC_HSG_PULLUP_COMP_EN BIT(1)
|
||||
#define WCD934X_MBHC_HPHL_100K_TO_GND_EN BIT(0)
|
||||
#define WCD934X_ANA_MBHC_ELECT 0x0615
|
||||
#define WCD934X_ANA_MBHC_BIAS_EN_MASK BIT(0)
|
||||
#define WCD934X_ANA_MBHC_BIAS_EN BIT(0)
|
||||
#define WCD934X_ANA_MBHC_ZDET 0x0616
|
||||
#define WCD934X_ANA_MBHC_RESULT_1 0x0617
|
||||
#define WCD934X_ANA_MBHC_RESULT_2 0x0618
|
||||
#define WCD934X_ANA_MBHC_RESULT_3 0x0619
|
||||
#define WCD934X_ANA_MBHC_BTN0 0x061a
|
||||
#define WCD934X_VTH_MASK GENMASK(7, 2)
|
||||
#define WCD934X_ANA_MBHC_BTN1 0x061b
|
||||
#define WCD934X_ANA_MBHC_BTN2 0x061c
|
||||
#define WCD934X_ANA_MBHC_BTN3 0x061d
|
||||
#define WCD934X_ANA_MBHC_BTN4 0x061e
|
||||
#define WCD934X_ANA_MBHC_BTN5 0x061f
|
||||
#define WCD934X_ANA_MBHC_BTN6 0x0620
|
||||
#define WCD934X_ANA_MBHC_BTN7 0x0621
|
||||
#define WCD934X_MBHC_BTN_VTH_MASK GENMASK(7, 2)
|
||||
#define WCD934X_ANA_MICB1 0x0622
|
||||
#define WCD934X_MICB_VAL_MASK GENMASK(5, 0)
|
||||
#define WCD934X_ANA_MICB_EN_MASK GENMASK(7, 6)
|
||||
#define WCD934X_MICB_DISABLE 0
|
||||
#define WCD934X_MICB_ENABLE 1
|
||||
#define WCD934X_MICB_PULL_UP 2
|
||||
#define WCD934X_MICB_PULL_DOWN 3
|
||||
#define WCD934X_ANA_MICB_PULL_UP 0x80
|
||||
#define WCD934X_ANA_MICB_ENABLE 0x40
|
||||
#define WCD934X_ANA_MICB_DISABLE 0x0
|
||||
#define WCD934X_ANA_MICB2 0x0623
|
||||
#define WCD934X_ANA_MICB2_ENABLE BIT(6)
|
||||
#define WCD934X_ANA_MICB2_ENABLE_MASK GENMASK(7, 6)
|
||||
#define WCD934X_ANA_MICB2_VOUT_MASK GENMASK(5, 0)
|
||||
#define WCD934X_ANA_MICB2_RAMP 0x0624
|
||||
#define WCD934X_RAMP_EN_MASK BIT(7)
|
||||
#define WCD934X_RAMP_SHIFT_CTRL_MASK GENMASK(4, 2)
|
||||
#define WCD934X_ANA_MICB3 0x0625
|
||||
#define WCD934X_ANA_MICB4 0x0626
|
||||
#define WCD934X_BIAS_VBG_FINE_ADJ 0x0629
|
||||
#define WCD934X_MBHC_CTL_CLK 0x0656
|
||||
#define WCD934X_MBHC_CTL_BCS 0x065a
|
||||
#define WCD934X_MBHC_STATUS_SPARE_1 0x065b
|
||||
#define WCD934X_MICB1_TEST_CTL_1 0x066b
|
||||
#define WCD934X_MICB1_TEST_CTL_2 0x066c
|
||||
#define WCD934X_MICB2_TEST_CTL_1 0x066e
|
||||
@ -141,7 +180,11 @@
|
||||
#define WCD934X_HPH_CNP_WG_CTL 0x06cc
|
||||
#define WCD934X_HPH_GM3_BOOST_EN_MASK BIT(7)
|
||||
#define WCD934X_HPH_GM3_BOOST_ENABLE BIT(7)
|
||||
#define WCD934X_HPH_CNP_WG_TIME 0x06cd
|
||||
#define WCD934X_HPH_OCP_CTL 0x06ce
|
||||
#define WCD934X_HPH_PA_CTL2 0x06d2
|
||||
#define WCD934X_HPHPA_GND_R_MASK BIT(6)
|
||||
#define WCD934X_HPHPA_GND_L_MASK BIT(4)
|
||||
#define WCD934X_HPH_L_EN 0x06d3
|
||||
#define WCD934X_HPH_GAIN_SRC_SEL_MASK BIT(5)
|
||||
#define WCD934X_HPH_GAIN_SRC_SEL_COMPANDER 0
|
||||
@ -152,6 +195,8 @@
|
||||
#define WCD934X_HPH_OCP_DET_MASK BIT(0)
|
||||
#define WCD934X_HPH_OCP_DET_ENABLE BIT(0)
|
||||
#define WCD934X_HPH_OCP_DET_DISABLE 0
|
||||
#define WCD934X_HPH_R_ATEST 0x06d8
|
||||
#define WCD934X_HPHPA_GND_OVR_MASK BIT(1)
|
||||
#define WCD934X_DIFF_LO_LO2_COMPANDER 0x06ea
|
||||
#define WCD934X_DIFF_LO_LO1_COMPANDER 0x06eb
|
||||
#define WCD934X_CLK_SYS_MCLK_PRG 0x0711
|
||||
@ -172,7 +217,19 @@
|
||||
#define WCD934X_SIDO_NEW_VOUT_D_FREQ2 0x071e
|
||||
#define WCD934X_SIDO_RIPPLE_FREQ_EN_MASK BIT(0)
|
||||
#define WCD934X_SIDO_RIPPLE_FREQ_ENABLE BIT(0)
|
||||
#define WCD934X_MBHC_NEW_CTL_1 0x0720
|
||||
#define WCD934X_MBHC_CTL_RCO_EN_MASK BIT(7)
|
||||
#define WCD935X_MBHC_CTL_RCO_EN BIT(7)
|
||||
#define WCD934X_MBHC_NEW_CTL_2 0x0721
|
||||
#define WCD934X_M_RTH_CTL_MASK GENMASK(3, 2)
|
||||
#define WCD934X_MBHC_NEW_PLUG_DETECT_CTL 0x0722
|
||||
#define WCD934X_HSDET_PULLUP_C_MASK GENMASK(7, 6)
|
||||
#define WCD934X_MBHC_NEW_ZDET_ANA_CTL 0x0723
|
||||
#define WCD934X_ZDET_RANGE_CTL_MASK GENMASK(3, 0)
|
||||
#define WCD934X_ZDET_MAXV_CTL_MASK GENMASK(6, 4)
|
||||
#define WCD934X_MBHC_NEW_ZDET_RAMP_CTL 0x0724
|
||||
#define WCD934X_MBHC_NEW_FSM_STATUS 0x0725
|
||||
#define WCD934X_MBHC_NEW_ADC_RESULT 0x0726
|
||||
#define WCD934X_TX_NEW_AMIC_4_5_SEL 0x0727
|
||||
#define WCD934X_HPH_NEW_INT_RDAC_HD2_CTL_L 0x0733
|
||||
#define WCD934X_HPH_NEW_INT_RDAC_OVERRIDE_CTL 0x0735
|
||||
|
@ -1536,9 +1536,13 @@ config SND_SOC_WCD9335
|
||||
Qualcomm Technologies, Inc. (QTI) multimedia solutions,
|
||||
including the MSM8996, MSM8976, and MSM8956 chipsets.
|
||||
|
||||
config SND_SOC_WCD_MBHC
|
||||
tristate
|
||||
|
||||
config SND_SOC_WCD934X
|
||||
tristate "WCD9340/WCD9341 Codec"
|
||||
depends on COMMON_CLK
|
||||
select SND_SOC_WCD_MBHC
|
||||
depends on MFD_WCD934X
|
||||
help
|
||||
The WCD9340/9341 is a audio codec IC Integrated in
|
||||
|
@ -251,6 +251,7 @@ snd-soc-twl6040-objs := twl6040.o
|
||||
snd-soc-uda1334-objs := uda1334.o
|
||||
snd-soc-uda134x-objs := uda134x.o
|
||||
snd-soc-uda1380-objs := uda1380.o
|
||||
snd-soc-wcd-mbhc-objs := wcd-mbhc-v2.o
|
||||
snd-soc-wcd9335-objs := wcd-clsh-v2.o wcd9335.o
|
||||
snd-soc-wcd934x-objs := wcd-clsh-v2.o wcd934x.o
|
||||
snd-soc-wl1273-objs := wl1273.o
|
||||
@ -574,6 +575,7 @@ obj-$(CONFIG_SND_SOC_TWL6040) += snd-soc-twl6040.o
|
||||
obj-$(CONFIG_SND_SOC_UDA1334) += snd-soc-uda1334.o
|
||||
obj-$(CONFIG_SND_SOC_UDA134X) += snd-soc-uda134x.o
|
||||
obj-$(CONFIG_SND_SOC_UDA1380) += snd-soc-uda1380.o
|
||||
obj-$(CONFIG_SND_SOC_WCD_MBHC) += snd-soc-wcd-mbhc.o
|
||||
obj-$(CONFIG_SND_SOC_WCD9335) += snd-soc-wcd9335.o
|
||||
obj-$(CONFIG_SND_SOC_WCD934X) += snd-soc-wcd934x.o
|
||||
obj-$(CONFIG_SND_SOC_WL1273) += snd-soc-wl1273.o
|
||||
|
1475
sound/soc/codecs/wcd-mbhc-v2.c
Normal file
1475
sound/soc/codecs/wcd-mbhc-v2.c
Normal file
File diff suppressed because it is too large
Load Diff
340
sound/soc/codecs/wcd-mbhc-v2.h
Normal file
340
sound/soc/codecs/wcd-mbhc-v2.h
Normal file
@ -0,0 +1,340 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
|
||||
#ifndef __WCD_MBHC_V2_H__
|
||||
#define __WCD_MBHC_V2_H__
|
||||
|
||||
#include <sound/jack.h>
|
||||
|
||||
#define WCD_MBHC_FIELD(id, rreg, rmask) \
|
||||
[id] = { .reg = rreg, .mask = rmask }
|
||||
|
||||
enum wcd_mbhc_field_function {
|
||||
WCD_MBHC_L_DET_EN,
|
||||
WCD_MBHC_GND_DET_EN,
|
||||
WCD_MBHC_MECH_DETECTION_TYPE,
|
||||
WCD_MBHC_MIC_CLAMP_CTL,
|
||||
WCD_MBHC_ELECT_DETECTION_TYPE,
|
||||
WCD_MBHC_HS_L_DET_PULL_UP_CTRL,
|
||||
WCD_MBHC_HS_L_DET_PULL_UP_COMP_CTRL,
|
||||
WCD_MBHC_HPHL_PLUG_TYPE,
|
||||
WCD_MBHC_GND_PLUG_TYPE,
|
||||
WCD_MBHC_SW_HPH_LP_100K_TO_GND,
|
||||
WCD_MBHC_ELECT_SCHMT_ISRC,
|
||||
WCD_MBHC_FSM_EN,
|
||||
WCD_MBHC_INSREM_DBNC,
|
||||
WCD_MBHC_BTN_DBNC,
|
||||
WCD_MBHC_HS_VREF,
|
||||
WCD_MBHC_HS_COMP_RESULT,
|
||||
WCD_MBHC_IN2P_CLAMP_STATE,
|
||||
WCD_MBHC_MIC_SCHMT_RESULT,
|
||||
WCD_MBHC_HPHL_SCHMT_RESULT,
|
||||
WCD_MBHC_HPHR_SCHMT_RESULT,
|
||||
WCD_MBHC_OCP_FSM_EN,
|
||||
WCD_MBHC_BTN_RESULT,
|
||||
WCD_MBHC_BTN_ISRC_CTL,
|
||||
WCD_MBHC_ELECT_RESULT,
|
||||
WCD_MBHC_MICB_CTRL, /* Pull-up and micb control */
|
||||
WCD_MBHC_HPH_CNP_WG_TIME,
|
||||
WCD_MBHC_HPHR_PA_EN,
|
||||
WCD_MBHC_HPHL_PA_EN,
|
||||
WCD_MBHC_HPH_PA_EN,
|
||||
WCD_MBHC_SWCH_LEVEL_REMOVE,
|
||||
WCD_MBHC_PULLDOWN_CTRL,
|
||||
WCD_MBHC_ANC_DET_EN,
|
||||
WCD_MBHC_FSM_STATUS,
|
||||
WCD_MBHC_MUX_CTL,
|
||||
WCD_MBHC_MOISTURE_STATUS,
|
||||
WCD_MBHC_HPHR_GND,
|
||||
WCD_MBHC_HPHL_GND,
|
||||
WCD_MBHC_HPHL_OCP_DET_EN,
|
||||
WCD_MBHC_HPHR_OCP_DET_EN,
|
||||
WCD_MBHC_HPHL_OCP_STATUS,
|
||||
WCD_MBHC_HPHR_OCP_STATUS,
|
||||
WCD_MBHC_ADC_EN,
|
||||
WCD_MBHC_ADC_COMPLETE,
|
||||
WCD_MBHC_ADC_TIMEOUT,
|
||||
WCD_MBHC_ADC_RESULT,
|
||||
WCD_MBHC_MICB2_VOUT,
|
||||
WCD_MBHC_ADC_MODE,
|
||||
WCD_MBHC_DETECTION_DONE,
|
||||
WCD_MBHC_ELECT_ISRC_EN,
|
||||
WCD_MBHC_REG_FUNC_MAX,
|
||||
};
|
||||
|
||||
#define WCD_MBHC_DEF_BUTTONS 8
|
||||
#define WCD_MBHC_KEYCODE_NUM 8
|
||||
#define WCD_MBHC_USLEEP_RANGE_MARGIN_US 100
|
||||
#define WCD_MBHC_THR_HS_MICB_MV 2700
|
||||
#define WCD_MONO_HS_MIN_THR 2
|
||||
|
||||
enum wcd_mbhc_detect_logic {
|
||||
WCD_DETECTION_LEGACY,
|
||||
WCD_DETECTION_ADC,
|
||||
};
|
||||
|
||||
enum wcd_mbhc_cs_mb_en_flag {
|
||||
WCD_MBHC_EN_CS = 0,
|
||||
WCD_MBHC_EN_MB,
|
||||
WCD_MBHC_EN_PULLUP,
|
||||
WCD_MBHC_EN_NONE,
|
||||
};
|
||||
|
||||
enum {
|
||||
WCD_MBHC_ELEC_HS_INS,
|
||||
WCD_MBHC_ELEC_HS_REM,
|
||||
};
|
||||
|
||||
enum wcd_mbhc_plug_type {
|
||||
MBHC_PLUG_TYPE_INVALID = -1,
|
||||
MBHC_PLUG_TYPE_NONE,
|
||||
MBHC_PLUG_TYPE_HEADSET,
|
||||
MBHC_PLUG_TYPE_HEADPHONE,
|
||||
MBHC_PLUG_TYPE_HIGH_HPH,
|
||||
MBHC_PLUG_TYPE_GND_MIC_SWAP,
|
||||
};
|
||||
|
||||
enum pa_dac_ack_flags {
|
||||
WCD_MBHC_HPHL_PA_OFF_ACK = 0,
|
||||
WCD_MBHC_HPHR_PA_OFF_ACK,
|
||||
};
|
||||
|
||||
enum wcd_mbhc_btn_det_mem {
|
||||
WCD_MBHC_BTN_DET_V_BTN_LOW,
|
||||
WCD_MBHC_BTN_DET_V_BTN_HIGH
|
||||
};
|
||||
|
||||
enum {
|
||||
MIC_BIAS_1 = 1,
|
||||
MIC_BIAS_2,
|
||||
MIC_BIAS_3,
|
||||
MIC_BIAS_4
|
||||
};
|
||||
|
||||
enum {
|
||||
MICB_PULLUP_ENABLE,
|
||||
MICB_PULLUP_DISABLE,
|
||||
MICB_ENABLE,
|
||||
MICB_DISABLE,
|
||||
};
|
||||
|
||||
enum wcd_notify_event {
|
||||
WCD_EVENT_INVALID,
|
||||
/* events for micbias ON and OFF */
|
||||
WCD_EVENT_PRE_MICBIAS_2_OFF,
|
||||
WCD_EVENT_POST_MICBIAS_2_OFF,
|
||||
WCD_EVENT_PRE_MICBIAS_2_ON,
|
||||
WCD_EVENT_POST_MICBIAS_2_ON,
|
||||
WCD_EVENT_PRE_DAPM_MICBIAS_2_OFF,
|
||||
WCD_EVENT_POST_DAPM_MICBIAS_2_OFF,
|
||||
WCD_EVENT_PRE_DAPM_MICBIAS_2_ON,
|
||||
WCD_EVENT_POST_DAPM_MICBIAS_2_ON,
|
||||
/* events for PA ON and OFF */
|
||||
WCD_EVENT_PRE_HPHL_PA_ON,
|
||||
WCD_EVENT_POST_HPHL_PA_OFF,
|
||||
WCD_EVENT_PRE_HPHR_PA_ON,
|
||||
WCD_EVENT_POST_HPHR_PA_OFF,
|
||||
WCD_EVENT_PRE_HPHL_PA_OFF,
|
||||
WCD_EVENT_PRE_HPHR_PA_OFF,
|
||||
WCD_EVENT_OCP_OFF,
|
||||
WCD_EVENT_OCP_ON,
|
||||
WCD_EVENT_LAST,
|
||||
};
|
||||
|
||||
enum wcd_mbhc_event_state {
|
||||
WCD_MBHC_EVENT_PA_HPHL,
|
||||
WCD_MBHC_EVENT_PA_HPHR,
|
||||
};
|
||||
|
||||
enum wcd_mbhc_hph_type {
|
||||
WCD_MBHC_HPH_NONE = 0,
|
||||
WCD_MBHC_HPH_MONO,
|
||||
WCD_MBHC_HPH_STEREO,
|
||||
};
|
||||
|
||||
/*
|
||||
* These enum definitions are directly mapped to the register
|
||||
* definitions
|
||||
*/
|
||||
|
||||
enum mbhc_hs_pullup_iref {
|
||||
I_DEFAULT = -1,
|
||||
I_OFF = 0,
|
||||
I_1P0_UA,
|
||||
I_2P0_UA,
|
||||
I_3P0_UA,
|
||||
};
|
||||
|
||||
enum mbhc_hs_pullup_iref_v2 {
|
||||
HS_PULLUP_I_DEFAULT = -1,
|
||||
HS_PULLUP_I_3P0_UA = 0,
|
||||
HS_PULLUP_I_2P25_UA,
|
||||
HS_PULLUP_I_1P5_UA,
|
||||
HS_PULLUP_I_0P75_UA,
|
||||
HS_PULLUP_I_1P125_UA = 0x05,
|
||||
HS_PULLUP_I_0P375_UA = 0x07,
|
||||
HS_PULLUP_I_2P0_UA,
|
||||
HS_PULLUP_I_1P0_UA = 0x0A,
|
||||
HS_PULLUP_I_0P5_UA,
|
||||
HS_PULLUP_I_0P25_UA = 0x0F,
|
||||
HS_PULLUP_I_0P125_UA = 0x17,
|
||||
HS_PULLUP_I_OFF,
|
||||
};
|
||||
|
||||
enum mbhc_moisture_rref {
|
||||
R_OFF,
|
||||
R_24_KOHM,
|
||||
R_84_KOHM,
|
||||
R_184_KOHM,
|
||||
};
|
||||
|
||||
struct wcd_mbhc_config {
|
||||
int btn_high[WCD_MBHC_DEF_BUTTONS];
|
||||
int btn_low[WCD_MBHC_DEF_BUTTONS];
|
||||
int v_hs_max;
|
||||
int num_btn;
|
||||
bool mono_stero_detection;
|
||||
bool (*swap_gnd_mic)(struct snd_soc_component *component, bool active);
|
||||
bool hs_ext_micbias;
|
||||
bool gnd_det_en;
|
||||
uint32_t linein_th;
|
||||
bool moisture_en;
|
||||
int mbhc_micbias;
|
||||
int anc_micbias;
|
||||
bool moisture_duty_cycle_en;
|
||||
bool hphl_swh; /*track HPHL switch NC / NO */
|
||||
bool gnd_swh; /*track GND switch NC / NO */
|
||||
u32 hs_thr;
|
||||
u32 hph_thr;
|
||||
u32 micb_mv;
|
||||
u32 moist_vref;
|
||||
u32 moist_iref;
|
||||
u32 moist_rref;
|
||||
};
|
||||
|
||||
struct wcd_mbhc_intr {
|
||||
int mbhc_sw_intr;
|
||||
int mbhc_btn_press_intr;
|
||||
int mbhc_btn_release_intr;
|
||||
int mbhc_hs_ins_intr;
|
||||
int mbhc_hs_rem_intr;
|
||||
int hph_left_ocp;
|
||||
int hph_right_ocp;
|
||||
};
|
||||
|
||||
struct wcd_mbhc_field {
|
||||
u16 reg;
|
||||
u8 mask;
|
||||
};
|
||||
|
||||
struct wcd_mbhc;
|
||||
|
||||
struct wcd_mbhc_cb {
|
||||
void (*update_cross_conn_thr)(struct snd_soc_component *component);
|
||||
void (*get_micbias_val)(struct snd_soc_component *component, int *mb);
|
||||
void (*bcs_enable)(struct snd_soc_component *component, bool bcs_enable);
|
||||
void (*compute_impedance)(struct snd_soc_component *component,
|
||||
uint32_t *zl, uint32_t *zr);
|
||||
void (*set_micbias_value)(struct snd_soc_component *component);
|
||||
void (*set_auto_zeroing)(struct snd_soc_component *component,
|
||||
bool enable);
|
||||
void (*clk_setup)(struct snd_soc_component *component, bool enable);
|
||||
bool (*micbias_enable_status)(struct snd_soc_component *component, int micb_num);
|
||||
void (*mbhc_bias)(struct snd_soc_component *component, bool enable);
|
||||
void (*set_btn_thr)(struct snd_soc_component *component,
|
||||
int *btn_low, int *btn_high,
|
||||
int num_btn, bool is_micbias);
|
||||
void (*hph_pull_up_control)(struct snd_soc_component *component,
|
||||
enum mbhc_hs_pullup_iref);
|
||||
int (*mbhc_micbias_control)(struct snd_soc_component *component,
|
||||
int micb_num, int req);
|
||||
void (*mbhc_micb_ramp_control)(struct snd_soc_component *component,
|
||||
bool enable);
|
||||
bool (*extn_use_mb)(struct snd_soc_component *component);
|
||||
int (*mbhc_micb_ctrl_thr_mic)(struct snd_soc_component *component,
|
||||
int micb_num, bool req_en);
|
||||
void (*mbhc_gnd_det_ctrl)(struct snd_soc_component *component,
|
||||
bool enable);
|
||||
void (*hph_pull_down_ctrl)(struct snd_soc_component *component,
|
||||
bool enable);
|
||||
void (*mbhc_moisture_config)(struct snd_soc_component *component);
|
||||
void (*update_anc_state)(struct snd_soc_component *component,
|
||||
bool enable, int anc_num);
|
||||
void (*hph_pull_up_control_v2)(struct snd_soc_component *component,
|
||||
int pull_up_cur);
|
||||
bool (*mbhc_get_moisture_status)(struct snd_soc_component *component);
|
||||
void (*mbhc_moisture_polling_ctrl)(struct snd_soc_component *component, bool enable);
|
||||
void (*mbhc_moisture_detect_en)(struct snd_soc_component *component, bool enable);
|
||||
};
|
||||
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_WCD_MBHC)
|
||||
int wcd_dt_parse_mbhc_data(struct device *dev, struct wcd_mbhc_config *cfg);
|
||||
int wcd_mbhc_start(struct wcd_mbhc *mbhc, struct wcd_mbhc_config *mbhc_cfg,
|
||||
struct snd_soc_jack *jack);
|
||||
void wcd_mbhc_stop(struct wcd_mbhc *mbhc);
|
||||
void wcd_mbhc_set_hph_type(struct wcd_mbhc *mbhc, int hph_type);
|
||||
int wcd_mbhc_get_hph_type(struct wcd_mbhc *mbhc);
|
||||
struct wcd_mbhc *wcd_mbhc_init(struct snd_soc_component *component,
|
||||
const struct wcd_mbhc_cb *mbhc_cb,
|
||||
const struct wcd_mbhc_intr *mbhc_cdc_intr_ids,
|
||||
struct wcd_mbhc_field *fields,
|
||||
bool impedance_det_en);
|
||||
int wcd_mbhc_get_impedance(struct wcd_mbhc *mbhc, uint32_t *zl,
|
||||
uint32_t *zr);
|
||||
void wcd_mbhc_deinit(struct wcd_mbhc *mbhc);
|
||||
int wcd_mbhc_event_notify(struct wcd_mbhc *mbhc, unsigned long event);
|
||||
|
||||
#else
|
||||
static inline int wcd_dt_parse_mbhc_data(struct device *dev,
|
||||
struct wcd_mbhc_config *cfg)
|
||||
{
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
static inline void wcd_mbhc_stop(struct wcd_mbhc *mbhc)
|
||||
{
|
||||
}
|
||||
|
||||
static inline struct wcd_mbhc *wcd_mbhc_init(struct snd_soc_component *component,
|
||||
const struct wcd_mbhc_cb *mbhc_cb,
|
||||
const struct wcd_mbhc_intr *mbhc_cdc_intr_ids,
|
||||
struct wcd_mbhc_field *fields,
|
||||
bool impedance_det_en)
|
||||
{
|
||||
return ERR_PTR(-ENOTSUPP);
|
||||
}
|
||||
|
||||
static inline void wcd_mbhc_set_hph_type(struct wcd_mbhc *mbhc, int hph_type)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int wcd_mbhc_get_hph_type(struct wcd_mbhc *mbhc)
|
||||
{
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
static inline int wcd_mbhc_event_notify(struct wcd_mbhc *mbhc, unsigned long event)
|
||||
{
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
static inline int wcd_mbhc_start(struct wcd_mbhc *mbhc,
|
||||
struct wcd_mbhc_config *mbhc_cfg,
|
||||
struct snd_soc_jack *jack)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int wcd_mbhc_get_impedance(struct wcd_mbhc *mbhc,
|
||||
uint32_t *zl,
|
||||
uint32_t *zr)
|
||||
{
|
||||
*zl = 0;
|
||||
*zr = 0;
|
||||
return -EINVAL;
|
||||
}
|
||||
static inline void wcd_mbhc_deinit(struct wcd_mbhc *mbhc)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __WCD_MBHC_V2_H__ */
|
File diff suppressed because it is too large
Load Diff
@ -288,6 +288,14 @@ static int sdm845_dai_init(struct snd_soc_pcm_runtime *rtd)
|
||||
snd_soc_dai_set_sysclk(codec_dai, 0,
|
||||
WCD934X_DEFAULT_MCLK_RATE,
|
||||
SNDRV_PCM_STREAM_PLAYBACK);
|
||||
|
||||
rval = snd_soc_component_set_jack(codec_dai->component,
|
||||
&pdata->jack, NULL);
|
||||
if (rval != 0 && rval != -ENOTSUPP) {
|
||||
dev_warn(card->dev, "Failed to set jack: %d\n", rval);
|
||||
return rval;
|
||||
}
|
||||
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
Loading…
Reference in New Issue
Block a user