1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * ALSA SoC TLV320AIC3X codec driver 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Author: Vladimir Barinov, <vbarinov@embeddedalley.com> 6*4882a593Smuzhiyun * Copyright: (C) 2007 MontaVista Software, Inc., <source@mvista.com> 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifndef _AIC3X_H 10*4882a593Smuzhiyun #define _AIC3X_H 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun /* AIC3X register space */ 13*4882a593Smuzhiyun #define AIC3X_CACHEREGNUM 110 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun /* Page select register */ 16*4882a593Smuzhiyun #define AIC3X_PAGE_SELECT 0 17*4882a593Smuzhiyun /* Software reset register */ 18*4882a593Smuzhiyun #define AIC3X_RESET 1 19*4882a593Smuzhiyun /* Codec Sample rate select register */ 20*4882a593Smuzhiyun #define AIC3X_SAMPLE_RATE_SEL_REG 2 21*4882a593Smuzhiyun /* PLL progrramming register A */ 22*4882a593Smuzhiyun #define AIC3X_PLL_PROGA_REG 3 23*4882a593Smuzhiyun /* PLL progrramming register B */ 24*4882a593Smuzhiyun #define AIC3X_PLL_PROGB_REG 4 25*4882a593Smuzhiyun /* PLL progrramming register C */ 26*4882a593Smuzhiyun #define AIC3X_PLL_PROGC_REG 5 27*4882a593Smuzhiyun /* PLL progrramming register D */ 28*4882a593Smuzhiyun #define AIC3X_PLL_PROGD_REG 6 29*4882a593Smuzhiyun /* Codec datapath setup register */ 30*4882a593Smuzhiyun #define AIC3X_CODEC_DATAPATH_REG 7 31*4882a593Smuzhiyun /* Audio serial data interface control register A */ 32*4882a593Smuzhiyun #define AIC3X_ASD_INTF_CTRLA 8 33*4882a593Smuzhiyun /* Audio serial data interface control register B */ 34*4882a593Smuzhiyun #define AIC3X_ASD_INTF_CTRLB 9 35*4882a593Smuzhiyun /* Audio serial data interface control register C */ 36*4882a593Smuzhiyun #define AIC3X_ASD_INTF_CTRLC 10 37*4882a593Smuzhiyun /* Audio overflow status and PLL R value programming register */ 38*4882a593Smuzhiyun #define AIC3X_OVRF_STATUS_AND_PLLR_REG 11 39*4882a593Smuzhiyun /* Audio codec digital filter control register */ 40*4882a593Smuzhiyun #define AIC3X_CODEC_DFILT_CTRL 12 41*4882a593Smuzhiyun /* Headset/button press detection register */ 42*4882a593Smuzhiyun #define AIC3X_HEADSET_DETECT_CTRL_A 13 43*4882a593Smuzhiyun #define AIC3X_HEADSET_DETECT_CTRL_B 14 44*4882a593Smuzhiyun /* ADC PGA Gain control registers */ 45*4882a593Smuzhiyun #define LADC_VOL 15 46*4882a593Smuzhiyun #define RADC_VOL 16 47*4882a593Smuzhiyun /* MIC3 control registers */ 48*4882a593Smuzhiyun #define MIC3LR_2_LADC_CTRL 17 49*4882a593Smuzhiyun #define MIC3LR_2_RADC_CTRL 18 50*4882a593Smuzhiyun /* Line1 Input control registers */ 51*4882a593Smuzhiyun #define LINE1L_2_LADC_CTRL 19 52*4882a593Smuzhiyun #define LINE1R_2_LADC_CTRL 21 53*4882a593Smuzhiyun #define LINE1R_2_RADC_CTRL 22 54*4882a593Smuzhiyun #define LINE1L_2_RADC_CTRL 24 55*4882a593Smuzhiyun /* Line2 Input control registers */ 56*4882a593Smuzhiyun #define LINE2L_2_LADC_CTRL 20 57*4882a593Smuzhiyun #define LINE2R_2_RADC_CTRL 23 58*4882a593Smuzhiyun /* MICBIAS Control Register */ 59*4882a593Smuzhiyun #define MICBIAS_CTRL 25 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun /* AGC Control Registers A, B, C */ 62*4882a593Smuzhiyun #define LAGC_CTRL_A 26 63*4882a593Smuzhiyun #define LAGC_CTRL_B 27 64*4882a593Smuzhiyun #define LAGC_CTRL_C 28 65*4882a593Smuzhiyun #define RAGC_CTRL_A 29 66*4882a593Smuzhiyun #define RAGC_CTRL_B 30 67*4882a593Smuzhiyun #define RAGC_CTRL_C 31 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun /* DAC Power and Left High Power Output control registers */ 70*4882a593Smuzhiyun #define DAC_PWR 37 71*4882a593Smuzhiyun #define HPLCOM_CFG 37 72*4882a593Smuzhiyun /* Right High Power Output control registers */ 73*4882a593Smuzhiyun #define HPRCOM_CFG 38 74*4882a593Smuzhiyun /* High Power Output Stage Control Register */ 75*4882a593Smuzhiyun #define HPOUT_SC 40 76*4882a593Smuzhiyun /* DAC Output Switching control registers */ 77*4882a593Smuzhiyun #define DAC_LINE_MUX 41 78*4882a593Smuzhiyun /* High Power Output Driver Pop Reduction registers */ 79*4882a593Smuzhiyun #define HPOUT_POP_REDUCTION 42 80*4882a593Smuzhiyun /* DAC Digital control registers */ 81*4882a593Smuzhiyun #define LDAC_VOL 43 82*4882a593Smuzhiyun #define RDAC_VOL 44 83*4882a593Smuzhiyun /* Left High Power Output control registers */ 84*4882a593Smuzhiyun #define LINE2L_2_HPLOUT_VOL 45 85*4882a593Smuzhiyun #define PGAL_2_HPLOUT_VOL 46 86*4882a593Smuzhiyun #define DACL1_2_HPLOUT_VOL 47 87*4882a593Smuzhiyun #define LINE2R_2_HPLOUT_VOL 48 88*4882a593Smuzhiyun #define PGAR_2_HPLOUT_VOL 49 89*4882a593Smuzhiyun #define DACR1_2_HPLOUT_VOL 50 90*4882a593Smuzhiyun #define HPLOUT_CTRL 51 91*4882a593Smuzhiyun /* Left High Power COM control registers */ 92*4882a593Smuzhiyun #define LINE2L_2_HPLCOM_VOL 52 93*4882a593Smuzhiyun #define PGAL_2_HPLCOM_VOL 53 94*4882a593Smuzhiyun #define DACL1_2_HPLCOM_VOL 54 95*4882a593Smuzhiyun #define LINE2R_2_HPLCOM_VOL 55 96*4882a593Smuzhiyun #define PGAR_2_HPLCOM_VOL 56 97*4882a593Smuzhiyun #define DACR1_2_HPLCOM_VOL 57 98*4882a593Smuzhiyun #define HPLCOM_CTRL 58 99*4882a593Smuzhiyun /* Right High Power Output control registers */ 100*4882a593Smuzhiyun #define LINE2L_2_HPROUT_VOL 59 101*4882a593Smuzhiyun #define PGAL_2_HPROUT_VOL 60 102*4882a593Smuzhiyun #define DACL1_2_HPROUT_VOL 61 103*4882a593Smuzhiyun #define LINE2R_2_HPROUT_VOL 62 104*4882a593Smuzhiyun #define PGAR_2_HPROUT_VOL 63 105*4882a593Smuzhiyun #define DACR1_2_HPROUT_VOL 64 106*4882a593Smuzhiyun #define HPROUT_CTRL 65 107*4882a593Smuzhiyun /* Right High Power COM control registers */ 108*4882a593Smuzhiyun #define LINE2L_2_HPRCOM_VOL 66 109*4882a593Smuzhiyun #define PGAL_2_HPRCOM_VOL 67 110*4882a593Smuzhiyun #define DACL1_2_HPRCOM_VOL 68 111*4882a593Smuzhiyun #define LINE2R_2_HPRCOM_VOL 69 112*4882a593Smuzhiyun #define PGAR_2_HPRCOM_VOL 70 113*4882a593Smuzhiyun #define DACR1_2_HPRCOM_VOL 71 114*4882a593Smuzhiyun #define HPRCOM_CTRL 72 115*4882a593Smuzhiyun /* Mono Line Output Plus/Minus control registers */ 116*4882a593Smuzhiyun #define LINE2L_2_MONOLOPM_VOL 73 117*4882a593Smuzhiyun #define PGAL_2_MONOLOPM_VOL 74 118*4882a593Smuzhiyun #define DACL1_2_MONOLOPM_VOL 75 119*4882a593Smuzhiyun #define LINE2R_2_MONOLOPM_VOL 76 120*4882a593Smuzhiyun #define PGAR_2_MONOLOPM_VOL 77 121*4882a593Smuzhiyun #define DACR1_2_MONOLOPM_VOL 78 122*4882a593Smuzhiyun #define MONOLOPM_CTRL 79 123*4882a593Smuzhiyun /* Class-D speaker driver on tlv320aic3007 */ 124*4882a593Smuzhiyun #define CLASSD_CTRL 73 125*4882a593Smuzhiyun /* Left Line Output Plus/Minus control registers */ 126*4882a593Smuzhiyun #define LINE2L_2_LLOPM_VOL 80 127*4882a593Smuzhiyun #define PGAL_2_LLOPM_VOL 81 128*4882a593Smuzhiyun #define DACL1_2_LLOPM_VOL 82 129*4882a593Smuzhiyun #define LINE2R_2_LLOPM_VOL 83 130*4882a593Smuzhiyun #define PGAR_2_LLOPM_VOL 84 131*4882a593Smuzhiyun #define DACR1_2_LLOPM_VOL 85 132*4882a593Smuzhiyun #define LLOPM_CTRL 86 133*4882a593Smuzhiyun /* Right Line Output Plus/Minus control registers */ 134*4882a593Smuzhiyun #define LINE2L_2_RLOPM_VOL 87 135*4882a593Smuzhiyun #define PGAL_2_RLOPM_VOL 88 136*4882a593Smuzhiyun #define DACL1_2_RLOPM_VOL 89 137*4882a593Smuzhiyun #define LINE2R_2_RLOPM_VOL 90 138*4882a593Smuzhiyun #define PGAR_2_RLOPM_VOL 91 139*4882a593Smuzhiyun #define DACR1_2_RLOPM_VOL 92 140*4882a593Smuzhiyun #define RLOPM_CTRL 93 141*4882a593Smuzhiyun /* GPIO/IRQ registers */ 142*4882a593Smuzhiyun #define AIC3X_STICKY_IRQ_FLAGS_REG 96 143*4882a593Smuzhiyun #define AIC3X_RT_IRQ_FLAGS_REG 97 144*4882a593Smuzhiyun #define AIC3X_GPIO1_REG 98 145*4882a593Smuzhiyun #define AIC3X_GPIO2_REG 99 146*4882a593Smuzhiyun #define AIC3X_GPIOA_REG 100 147*4882a593Smuzhiyun #define AIC3X_GPIOB_REG 101 148*4882a593Smuzhiyun /* Clock generation control register */ 149*4882a593Smuzhiyun #define AIC3X_CLKGEN_CTRL_REG 102 150*4882a593Smuzhiyun /* New AGC registers */ 151*4882a593Smuzhiyun #define LAGCN_ATTACK 103 152*4882a593Smuzhiyun #define LAGCN_DECAY 104 153*4882a593Smuzhiyun #define RAGCN_ATTACK 105 154*4882a593Smuzhiyun #define RAGCN_DECAY 106 155*4882a593Smuzhiyun /* New Programmable ADC Digital Path and I2C Bus Condition Register */ 156*4882a593Smuzhiyun #define NEW_ADC_DIGITALPATH 107 157*4882a593Smuzhiyun /* Passive Analog Signal Bypass Selection During Powerdown Register */ 158*4882a593Smuzhiyun #define PASSIVE_BYPASS 108 159*4882a593Smuzhiyun /* DAC Quiescent Current Adjustment Register */ 160*4882a593Smuzhiyun #define DAC_ICC_ADJ 109 161*4882a593Smuzhiyun 162*4882a593Smuzhiyun /* Page select register bits */ 163*4882a593Smuzhiyun #define PAGE0_SELECT 0 164*4882a593Smuzhiyun #define PAGE1_SELECT 1 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun /* Audio serial data interface control register A bits */ 167*4882a593Smuzhiyun #define BIT_CLK_MASTER 0x80 168*4882a593Smuzhiyun #define WORD_CLK_MASTER 0x40 169*4882a593Smuzhiyun #define DOUT_TRISTATE 0x20 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun /* Codec Datapath setup register 7 */ 172*4882a593Smuzhiyun #define FSREF_44100 (1 << 7) 173*4882a593Smuzhiyun #define FSREF_48000 (0 << 7) 174*4882a593Smuzhiyun #define DUAL_RATE_MODE ((1 << 5) | (1 << 6)) 175*4882a593Smuzhiyun #define LDAC2LCH (0x1 << 3) 176*4882a593Smuzhiyun #define RDAC2RCH (0x1 << 1) 177*4882a593Smuzhiyun #define LDAC2RCH (0x2 << 3) 178*4882a593Smuzhiyun #define RDAC2LCH (0x2 << 1) 179*4882a593Smuzhiyun #define LDAC2MONOMIX (0x3 << 3) 180*4882a593Smuzhiyun #define RDAC2MONOMIX (0x3 << 1) 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun /* PLL registers bitfields */ 183*4882a593Smuzhiyun #define PLLP_SHIFT 0 184*4882a593Smuzhiyun #define PLLP_MASK 7 185*4882a593Smuzhiyun #define PLLQ_SHIFT 3 186*4882a593Smuzhiyun #define PLLR_SHIFT 0 187*4882a593Smuzhiyun #define PLLJ_SHIFT 2 188*4882a593Smuzhiyun #define PLLD_MSB_SHIFT 0 189*4882a593Smuzhiyun #define PLLD_LSB_SHIFT 2 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun /* Clock generation register bits */ 192*4882a593Smuzhiyun #define CODEC_CLKIN_PLLDIV 0 193*4882a593Smuzhiyun #define CODEC_CLKIN_CLKDIV 1 194*4882a593Smuzhiyun #define PLL_CLKIN_SHIFT 4 195*4882a593Smuzhiyun #define MCLK_SOURCE 0x0 196*4882a593Smuzhiyun #define PLL_CLKDIV_SHIFT 0 197*4882a593Smuzhiyun #define PLLCLK_IN_MASK 0x30 198*4882a593Smuzhiyun #define PLLCLK_IN_SHIFT 4 199*4882a593Smuzhiyun #define CLKDIV_IN_MASK 0xc0 200*4882a593Smuzhiyun #define CLKDIV_IN_SHIFT 6 201*4882a593Smuzhiyun /* clock in source */ 202*4882a593Smuzhiyun #define CLKIN_MCLK 0 203*4882a593Smuzhiyun #define CLKIN_GPIO2 1 204*4882a593Smuzhiyun #define CLKIN_BCLK 2 205*4882a593Smuzhiyun 206*4882a593Smuzhiyun /* Software reset register bits */ 207*4882a593Smuzhiyun #define SOFT_RESET 0x80 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun /* PLL progrramming register A bits */ 210*4882a593Smuzhiyun #define PLL_ENABLE 0x80 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun /* Route bits */ 213*4882a593Smuzhiyun #define ROUTE_ON 0x80 214*4882a593Smuzhiyun 215*4882a593Smuzhiyun /* Mute bits */ 216*4882a593Smuzhiyun #define UNMUTE 0x08 217*4882a593Smuzhiyun #define MUTE_ON 0x80 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun /* Power bits */ 220*4882a593Smuzhiyun #define LADC_PWR_ON 0x04 221*4882a593Smuzhiyun #define RADC_PWR_ON 0x04 222*4882a593Smuzhiyun #define LDAC_PWR_ON 0x80 223*4882a593Smuzhiyun #define RDAC_PWR_ON 0x40 224*4882a593Smuzhiyun #define HPLOUT_PWR_ON 0x01 225*4882a593Smuzhiyun #define HPROUT_PWR_ON 0x01 226*4882a593Smuzhiyun #define HPLCOM_PWR_ON 0x01 227*4882a593Smuzhiyun #define HPRCOM_PWR_ON 0x01 228*4882a593Smuzhiyun #define MONOLOPM_PWR_ON 0x01 229*4882a593Smuzhiyun #define LLOPM_PWR_ON 0x01 230*4882a593Smuzhiyun #define RLOPM_PWR_ON 0x01 231*4882a593Smuzhiyun 232*4882a593Smuzhiyun #define INVERT_VOL(val) (0x7f - val) 233*4882a593Smuzhiyun 234*4882a593Smuzhiyun /* Default output volume (inverted) */ 235*4882a593Smuzhiyun #define DEFAULT_VOL INVERT_VOL(0x50) 236*4882a593Smuzhiyun /* Default input volume */ 237*4882a593Smuzhiyun #define DEFAULT_GAIN 0x20 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun /* MICBIAS Control Register */ 240*4882a593Smuzhiyun #define MICBIAS_LEVEL_SHIFT (6) 241*4882a593Smuzhiyun #define MICBIAS_LEVEL_MASK (3 << 6) 242*4882a593Smuzhiyun 243*4882a593Smuzhiyun /* HPOUT_SC */ 244*4882a593Smuzhiyun #define HPOUT_SC_OCMV_MASK (3 << 6) 245*4882a593Smuzhiyun #define HPOUT_SC_OCMV_SHIFT (6) 246*4882a593Smuzhiyun #define HPOUT_SC_OCMV_1_35V 0 247*4882a593Smuzhiyun #define HPOUT_SC_OCMV_1_5V 1 248*4882a593Smuzhiyun #define HPOUT_SC_OCMV_1_65V 2 249*4882a593Smuzhiyun #define HPOUT_SC_OCMV_1_8V 3 250*4882a593Smuzhiyun 251*4882a593Smuzhiyun /* headset detection / button API */ 252*4882a593Smuzhiyun 253*4882a593Smuzhiyun /* The AIC3x supports detection of stereo headsets (GND + left + right signal) 254*4882a593Smuzhiyun * and cellular headsets (GND + speaker output + microphone input). 255*4882a593Smuzhiyun * It is recommended to enable MIC bias for this function to work properly. 256*4882a593Smuzhiyun * For more information, please refer to the datasheet. */ 257*4882a593Smuzhiyun enum { 258*4882a593Smuzhiyun AIC3X_HEADSET_DETECT_OFF = 0, 259*4882a593Smuzhiyun AIC3X_HEADSET_DETECT_STEREO = 1, 260*4882a593Smuzhiyun AIC3X_HEADSET_DETECT_CELLULAR = 2, 261*4882a593Smuzhiyun AIC3X_HEADSET_DETECT_BOTH = 3 262*4882a593Smuzhiyun }; 263*4882a593Smuzhiyun 264*4882a593Smuzhiyun enum { 265*4882a593Smuzhiyun AIC3X_HEADSET_DEBOUNCE_16MS = 0, 266*4882a593Smuzhiyun AIC3X_HEADSET_DEBOUNCE_32MS = 1, 267*4882a593Smuzhiyun AIC3X_HEADSET_DEBOUNCE_64MS = 2, 268*4882a593Smuzhiyun AIC3X_HEADSET_DEBOUNCE_128MS = 3, 269*4882a593Smuzhiyun AIC3X_HEADSET_DEBOUNCE_256MS = 4, 270*4882a593Smuzhiyun AIC3X_HEADSET_DEBOUNCE_512MS = 5 271*4882a593Smuzhiyun }; 272*4882a593Smuzhiyun 273*4882a593Smuzhiyun enum { 274*4882a593Smuzhiyun AIC3X_BUTTON_DEBOUNCE_0MS = 0, 275*4882a593Smuzhiyun AIC3X_BUTTON_DEBOUNCE_8MS = 1, 276*4882a593Smuzhiyun AIC3X_BUTTON_DEBOUNCE_16MS = 2, 277*4882a593Smuzhiyun AIC3X_BUTTON_DEBOUNCE_32MS = 3 278*4882a593Smuzhiyun }; 279*4882a593Smuzhiyun 280*4882a593Smuzhiyun #define AIC3X_HEADSET_DETECT_ENABLED 0x80 281*4882a593Smuzhiyun #define AIC3X_HEADSET_DETECT_SHIFT 5 282*4882a593Smuzhiyun #define AIC3X_HEADSET_DETECT_MASK 3 283*4882a593Smuzhiyun #define AIC3X_HEADSET_DEBOUNCE_SHIFT 2 284*4882a593Smuzhiyun #define AIC3X_HEADSET_DEBOUNCE_MASK 7 285*4882a593Smuzhiyun #define AIC3X_BUTTON_DEBOUNCE_SHIFT 0 286*4882a593Smuzhiyun #define AIC3X_BUTTON_DEBOUNCE_MASK 3 287*4882a593Smuzhiyun 288*4882a593Smuzhiyun #endif /* _AIC3X_H */ 289