Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later */
0002 /*
0003  * da7219-aad.h - DA7322 ASoC AAD Driver
0004  *
0005  * Copyright (c) 2015 Dialog Semiconductor Ltd.
0006  *
0007  * Author: Adam Thomson <Adam.Thomson.Opensource@diasemi.com>
0008  */
0009 
0010 #ifndef __DA7219_AAD_H
0011 #define __DA7219_AAD_H
0012 
0013 #include <linux/timer.h>
0014 #include <sound/soc.h>
0015 #include <sound/jack.h>
0016 #include <sound/da7219-aad.h>
0017 
0018 /*
0019  * Registers
0020  */
0021 
0022 #define DA7219_ACCDET_STATUS_A      0xC0
0023 #define DA7219_ACCDET_STATUS_B      0xC1
0024 #define DA7219_ACCDET_IRQ_EVENT_A   0xC2
0025 #define DA7219_ACCDET_IRQ_EVENT_B   0xC3
0026 #define DA7219_ACCDET_IRQ_MASK_A    0xC4
0027 #define DA7219_ACCDET_IRQ_MASK_B    0xC5
0028 #define DA7219_ACCDET_CONFIG_1      0xC6
0029 #define DA7219_ACCDET_CONFIG_2      0xC7
0030 #define DA7219_ACCDET_CONFIG_3      0xC8
0031 #define DA7219_ACCDET_CONFIG_4      0xC9
0032 #define DA7219_ACCDET_CONFIG_5      0xCA
0033 #define DA7219_ACCDET_CONFIG_6      0xCB
0034 #define DA7219_ACCDET_CONFIG_7      0xCC
0035 #define DA7219_ACCDET_CONFIG_8      0xCD
0036 
0037 
0038 /*
0039  * Bit Fields
0040  */
0041 
0042 /* DA7219_ACCDET_STATUS_A = 0xC0 */
0043 #define DA7219_JACK_INSERTION_STS_SHIFT 0
0044 #define DA7219_JACK_INSERTION_STS_MASK  (0x1 << 0)
0045 #define DA7219_JACK_TYPE_STS_SHIFT  1
0046 #define DA7219_JACK_TYPE_STS_MASK   (0x1 << 1)
0047 #define DA7219_JACK_PIN_ORDER_STS_SHIFT 2
0048 #define DA7219_JACK_PIN_ORDER_STS_MASK  (0x1 << 2)
0049 #define DA7219_MICBIAS_UP_STS_SHIFT 3
0050 #define DA7219_MICBIAS_UP_STS_MASK  (0x1 << 3)
0051 
0052 /* DA7219_ACCDET_STATUS_B = 0xC1 */
0053 #define DA7219_BUTTON_TYPE_STS_SHIFT    0
0054 #define DA7219_BUTTON_TYPE_STS_MASK (0xFF << 0)
0055 
0056 /* DA7219_ACCDET_IRQ_EVENT_A = 0xC2 */
0057 #define DA7219_E_JACK_INSERTED_SHIFT        0
0058 #define DA7219_E_JACK_INSERTED_MASK     (0x1 << 0)
0059 #define DA7219_E_JACK_REMOVED_SHIFT     1
0060 #define DA7219_E_JACK_REMOVED_MASK      (0x1 << 1)
0061 #define DA7219_E_JACK_DETECT_COMPLETE_SHIFT 2
0062 #define DA7219_E_JACK_DETECT_COMPLETE_MASK  (0x1 << 2)
0063 
0064 /* DA7219_ACCDET_IRQ_EVENT_B = 0xC3 */
0065 #define DA7219_E_BUTTON_A_PRESSED_SHIFT     0
0066 #define DA7219_E_BUTTON_A_PRESSED_MASK      (0x1 << 0)
0067 #define DA7219_E_BUTTON_B_PRESSED_SHIFT     1
0068 #define DA7219_E_BUTTON_B_PRESSED_MASK      (0x1 << 1)
0069 #define DA7219_E_BUTTON_C_PRESSED_SHIFT     2
0070 #define DA7219_E_BUTTON_C_PRESSED_MASK      (0x1 << 2)
0071 #define DA7219_E_BUTTON_D_PRESSED_SHIFT     3
0072 #define DA7219_E_BUTTON_D_PRESSED_MASK      (0x1 << 3)
0073 #define DA7219_E_BUTTON_D_RELEASED_SHIFT    4
0074 #define DA7219_E_BUTTON_D_RELEASED_MASK     (0x1 << 4)
0075 #define DA7219_E_BUTTON_C_RELEASED_SHIFT    5
0076 #define DA7219_E_BUTTON_C_RELEASED_MASK     (0x1 << 5)
0077 #define DA7219_E_BUTTON_B_RELEASED_SHIFT    6
0078 #define DA7219_E_BUTTON_B_RELEASED_MASK     (0x1 << 6)
0079 #define DA7219_E_BUTTON_A_RELEASED_SHIFT    7
0080 #define DA7219_E_BUTTON_A_RELEASED_MASK     (0x1 << 7)
0081 
0082 /* DA7219_ACCDET_IRQ_MASK_A = 0xC4 */
0083 #define DA7219_M_JACK_INSERTED_SHIFT        0
0084 #define DA7219_M_JACK_INSERTED_MASK     (0x1 << 0)
0085 #define DA7219_M_JACK_REMOVED_SHIFT     1
0086 #define DA7219_M_JACK_REMOVED_MASK      (0x1 << 1)
0087 #define DA7219_M_JACK_DETECT_COMPLETE_SHIFT 2
0088 #define DA7219_M_JACK_DETECT_COMPLETE_MASK  (0x1 << 2)
0089 
0090 /* DA7219_ACCDET_IRQ_MASK_B = 0xC5 */
0091 #define DA7219_M_BUTTON_A_PRESSED_SHIFT     0
0092 #define DA7219_M_BUTTON_A_PRESSED_MASK      (0x1 << 0)
0093 #define DA7219_M_BUTTON_B_PRESSED_SHIFT     1
0094 #define DA7219_M_BUTTON_B_PRESSED_MASK      (0x1 << 1)
0095 #define DA7219_M_BUTTON_C_PRESSED_SHIFT     2
0096 #define DA7219_M_BUTTON_C_PRESSED_MASK      (0x1 << 2)
0097 #define DA7219_M_BUTTON_D_PRESSED_SHIFT     3
0098 #define DA7219_M_BUTTON_D_PRESSED_MASK      (0x1 << 3)
0099 #define DA7219_M_BUTTON_D_RELEASED_SHIFT    4
0100 #define DA7219_M_BUTTON_D_RELEASED_MASK     (0x1 << 4)
0101 #define DA7219_M_BUTTON_C_RELEASED_SHIFT    5
0102 #define DA7219_M_BUTTON_C_RELEASED_MASK     (0x1 << 5)
0103 #define DA7219_M_BUTTON_B_RELEASED_SHIFT    6
0104 #define DA7219_M_BUTTON_B_RELEASED_MASK     (0x1 << 6)
0105 #define DA7219_M_BUTTON_A_RELEASED_SHIFT    7
0106 #define DA7219_M_BUTTON_A_RELEASED_MASK     (0x1 << 7)
0107 
0108 /* DA7219_ACCDET_CONFIG_1 = 0xC6 */
0109 #define DA7219_ACCDET_EN_SHIFT      0
0110 #define DA7219_ACCDET_EN_MASK       (0x1 << 0)
0111 #define DA7219_BUTTON_CONFIG_SHIFT  1
0112 #define DA7219_BUTTON_CONFIG_MASK   (0x7 << 1)
0113 #define DA7219_MIC_DET_THRESH_SHIFT 4
0114 #define DA7219_MIC_DET_THRESH_MASK  (0x3 << 4)
0115 #define DA7219_JACK_TYPE_DET_EN_SHIFT   6
0116 #define DA7219_JACK_TYPE_DET_EN_MASK    (0x1 << 6)
0117 #define DA7219_PIN_ORDER_DET_EN_SHIFT   7
0118 #define DA7219_PIN_ORDER_DET_EN_MASK    (0x1 << 7)
0119 
0120 /* DA7219_ACCDET_CONFIG_2 = 0xC7 */
0121 #define DA7219_ACCDET_PAUSE_SHIFT   0
0122 #define DA7219_ACCDET_PAUSE_MASK    (0x1 << 0)
0123 #define DA7219_JACKDET_DEBOUNCE_SHIFT   1
0124 #define DA7219_JACKDET_DEBOUNCE_MASK    (0x7 << 1)
0125 #define DA7219_JACK_DETECT_RATE_SHIFT   4
0126 #define DA7219_JACK_DETECT_RATE_MASK    (0x3 << 4)
0127 #define DA7219_JACKDET_REM_DEB_SHIFT    6
0128 #define DA7219_JACKDET_REM_DEB_MASK (0x3 << 6)
0129 
0130 /* DA7219_ACCDET_CONFIG_3 = 0xC8 */
0131 #define DA7219_A_D_BUTTON_THRESH_SHIFT  0
0132 #define DA7219_A_D_BUTTON_THRESH_MASK   (0xFF << 0)
0133 
0134 /* DA7219_ACCDET_CONFIG_4 = 0xC9 */
0135 #define DA7219_D_B_BUTTON_THRESH_SHIFT  0
0136 #define DA7219_D_B_BUTTON_THRESH_MASK   (0xFF << 0)
0137 
0138 /* DA7219_ACCDET_CONFIG_5 = 0xCA */
0139 #define DA7219_B_C_BUTTON_THRESH_SHIFT  0
0140 #define DA7219_B_C_BUTTON_THRESH_MASK   (0xFF << 0)
0141 
0142 /* DA7219_ACCDET_CONFIG_6 = 0xCB */
0143 #define DA7219_C_MIC_BUTTON_THRESH_SHIFT    0
0144 #define DA7219_C_MIC_BUTTON_THRESH_MASK     (0xFF << 0)
0145 
0146 /* DA7219_ACCDET_CONFIG_7 = 0xCC */
0147 #define DA7219_BUTTON_AVERAGE_SHIFT 0
0148 #define DA7219_BUTTON_AVERAGE_MASK  (0x3 << 0)
0149 #define DA7219_ADC_1_BIT_REPEAT_SHIFT   2
0150 #define DA7219_ADC_1_BIT_REPEAT_MASK    (0x3 << 2)
0151 #define DA7219_PIN_ORDER_FORCE_SHIFT    4
0152 #define DA7219_PIN_ORDER_FORCE_MASK (0x1 << 4)
0153 #define DA7219_JACK_TYPE_FORCE_SHIFT    5
0154 #define DA7219_JACK_TYPE_FORCE_MASK (0x1 << 5)
0155 
0156 /* DA7219_ACCDET_CONFIG_8 = 0xCD */
0157 #define DA7219_HPTEST_EN_SHIFT      0
0158 #define DA7219_HPTEST_EN_MASK       (0x1 << 0)
0159 #define DA7219_HPTEST_RES_SEL_SHIFT 1
0160 #define DA7219_HPTEST_RES_SEL_MASK  (0x3 << 1)
0161 #define DA7219_HPTEST_RES_SEL_1KOHMS    (0x0 << 1)
0162 #define DA7219_HPTEST_COMP_SHIFT    4
0163 #define DA7219_HPTEST_COMP_MASK     (0x1 << 4)
0164 
0165 
0166 #define DA7219_AAD_MAX_BUTTONS      4
0167 #define DA7219_AAD_REPORT_ALL_MASK  (SND_JACK_MECHANICAL |          \
0168                      SND_JACK_HEADSET | SND_JACK_LINEOUT |  \
0169                      SND_JACK_BTN_0 | SND_JACK_BTN_1 |  \
0170                      SND_JACK_BTN_2 | SND_JACK_BTN_3)
0171 
0172 #define DA7219_AAD_MICBIAS_CHK_DELAY    10
0173 #define DA7219_AAD_MICBIAS_CHK_RETRIES  5
0174 
0175 #define DA7219_AAD_HPTEST_RAMP_FREQ     0x28
0176 #define DA7219_AAD_HPTEST_RAMP_FREQ_INT_OSC 0x4D
0177 #define DA7219_AAD_HPTEST_PERIOD        65
0178 #define DA7219_AAD_HPTEST_INT_OSC_PATH_DELAY    20
0179 
0180 enum da7219_aad_event_regs {
0181     DA7219_AAD_IRQ_REG_A = 0,
0182     DA7219_AAD_IRQ_REG_B,
0183     DA7219_AAD_IRQ_REG_MAX,
0184 };
0185 
0186 /* Private data */
0187 struct da7219_aad_priv {
0188     struct snd_soc_component *component;
0189     int irq;
0190 
0191     u8 micbias_pulse_lvl;
0192     u32 micbias_pulse_time;
0193 
0194     u8 btn_cfg;
0195 
0196     struct work_struct btn_det_work;
0197     struct work_struct hptest_work;
0198 
0199     struct snd_soc_jack *jack;
0200     bool micbias_resume_enable;
0201     bool jack_inserted;
0202 };
0203 
0204 /* AAD control */
0205 void da7219_aad_jack_det(struct snd_soc_component *component, struct snd_soc_jack *jack);
0206 
0207 /* Suspend/Resume */
0208 void da7219_aad_suspend(struct snd_soc_component *component);
0209 void da7219_aad_resume(struct snd_soc_component *component);
0210 
0211 /* Init/Exit */
0212 int da7219_aad_init(struct snd_soc_component *component);
0213 void da7219_aad_exit(struct snd_soc_component *component);
0214 
0215 /* I2C Probe */
0216 int da7219_aad_probe(struct i2c_client *i2c);
0217 
0218 #endif /* __DA7219_AAD_H */