1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * NAU85L40 ALSA SoC audio driver 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright 2016 Nuvoton Technology Corp. 6*4882a593Smuzhiyun * Author: John Hsu <KCHSU0@nuvoton.com> 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifndef __NAU8540_H__ 10*4882a593Smuzhiyun #define __NAU8540_H__ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #define NAU8540_REG_SW_RESET 0x00 13*4882a593Smuzhiyun #define NAU8540_REG_POWER_MANAGEMENT 0x01 14*4882a593Smuzhiyun #define NAU8540_REG_CLOCK_CTRL 0x02 15*4882a593Smuzhiyun #define NAU8540_REG_CLOCK_SRC 0x03 16*4882a593Smuzhiyun #define NAU8540_REG_FLL1 0x04 17*4882a593Smuzhiyun #define NAU8540_REG_FLL2 0x05 18*4882a593Smuzhiyun #define NAU8540_REG_FLL3 0x06 19*4882a593Smuzhiyun #define NAU8540_REG_FLL4 0x07 20*4882a593Smuzhiyun #define NAU8540_REG_FLL5 0x08 21*4882a593Smuzhiyun #define NAU8540_REG_FLL6 0x09 22*4882a593Smuzhiyun #define NAU8540_REG_FLL_VCO_RSV 0x0A 23*4882a593Smuzhiyun #define NAU8540_REG_PCM_CTRL0 0x10 24*4882a593Smuzhiyun #define NAU8540_REG_PCM_CTRL1 0x11 25*4882a593Smuzhiyun #define NAU8540_REG_PCM_CTRL2 0x12 26*4882a593Smuzhiyun #define NAU8540_REG_PCM_CTRL3 0x13 27*4882a593Smuzhiyun #define NAU8540_REG_PCM_CTRL4 0x14 28*4882a593Smuzhiyun #define NAU8540_REG_ALC_CONTROL_1 0x20 29*4882a593Smuzhiyun #define NAU8540_REG_ALC_CONTROL_2 0x21 30*4882a593Smuzhiyun #define NAU8540_REG_ALC_CONTROL_3 0x22 31*4882a593Smuzhiyun #define NAU8540_REG_ALC_CONTROL_4 0x23 32*4882a593Smuzhiyun #define NAU8540_REG_ALC_CONTROL_5 0x24 33*4882a593Smuzhiyun #define NAU8540_REG_ALC_GAIN_CH12 0x2D 34*4882a593Smuzhiyun #define NAU8540_REG_ALC_GAIN_CH34 0x2E 35*4882a593Smuzhiyun #define NAU8540_REG_ALC_STATUS 0x2F 36*4882a593Smuzhiyun #define NAU8540_REG_NOTCH_FIL1_CH1 0x30 37*4882a593Smuzhiyun #define NAU8540_REG_NOTCH_FIL2_CH1 0x31 38*4882a593Smuzhiyun #define NAU8540_REG_NOTCH_FIL1_CH2 0x32 39*4882a593Smuzhiyun #define NAU8540_REG_NOTCH_FIL2_CH2 0x33 40*4882a593Smuzhiyun #define NAU8540_REG_NOTCH_FIL1_CH3 0x34 41*4882a593Smuzhiyun #define NAU8540_REG_NOTCH_FIL2_CH3 0x35 42*4882a593Smuzhiyun #define NAU8540_REG_NOTCH_FIL1_CH4 0x36 43*4882a593Smuzhiyun #define NAU8540_REG_NOTCH_FIL2_CH4 0x37 44*4882a593Smuzhiyun #define NAU8540_REG_HPF_FILTER_CH12 0x38 45*4882a593Smuzhiyun #define NAU8540_REG_HPF_FILTER_CH34 0x39 46*4882a593Smuzhiyun #define NAU8540_REG_ADC_SAMPLE_RATE 0x3A 47*4882a593Smuzhiyun #define NAU8540_REG_DIGITAL_GAIN_CH1 0x40 48*4882a593Smuzhiyun #define NAU8540_REG_DIGITAL_GAIN_CH2 0x41 49*4882a593Smuzhiyun #define NAU8540_REG_DIGITAL_GAIN_CH3 0x42 50*4882a593Smuzhiyun #define NAU8540_REG_DIGITAL_GAIN_CH4 0x43 51*4882a593Smuzhiyun #define NAU8540_REG_DIGITAL_MUX 0x44 52*4882a593Smuzhiyun #define NAU8540_REG_P2P_CH1 0x48 53*4882a593Smuzhiyun #define NAU8540_REG_P2P_CH2 0x49 54*4882a593Smuzhiyun #define NAU8540_REG_P2P_CH3 0x4A 55*4882a593Smuzhiyun #define NAU8540_REG_P2P_CH4 0x4B 56*4882a593Smuzhiyun #define NAU8540_REG_PEAK_CH1 0x4C 57*4882a593Smuzhiyun #define NAU8540_REG_PEAK_CH2 0x4D 58*4882a593Smuzhiyun #define NAU8540_REG_PEAK_CH3 0x4E 59*4882a593Smuzhiyun #define NAU8540_REG_PEAK_CH4 0x4F 60*4882a593Smuzhiyun #define NAU8540_REG_GPIO_CTRL 0x50 61*4882a593Smuzhiyun #define NAU8540_REG_MISC_CTRL 0x51 62*4882a593Smuzhiyun #define NAU8540_REG_I2C_CTRL 0x52 63*4882a593Smuzhiyun #define NAU8540_REG_I2C_DEVICE_ID 0x58 64*4882a593Smuzhiyun #define NAU8540_REG_RST 0x5A 65*4882a593Smuzhiyun #define NAU8540_REG_VMID_CTRL 0x60 66*4882a593Smuzhiyun #define NAU8540_REG_MUTE 0x61 67*4882a593Smuzhiyun #define NAU8540_REG_ANALOG_ADC1 0x64 68*4882a593Smuzhiyun #define NAU8540_REG_ANALOG_ADC2 0x65 69*4882a593Smuzhiyun #define NAU8540_REG_ANALOG_PWR 0x66 70*4882a593Smuzhiyun #define NAU8540_REG_MIC_BIAS 0x67 71*4882a593Smuzhiyun #define NAU8540_REG_REFERENCE 0x68 72*4882a593Smuzhiyun #define NAU8540_REG_FEPGA1 0x69 73*4882a593Smuzhiyun #define NAU8540_REG_FEPGA2 0x6A 74*4882a593Smuzhiyun #define NAU8540_REG_FEPGA3 0x6B 75*4882a593Smuzhiyun #define NAU8540_REG_FEPGA4 0x6C 76*4882a593Smuzhiyun #define NAU8540_REG_PWR 0x6D 77*4882a593Smuzhiyun #define NAU8540_REG_MAX NAU8540_REG_PWR 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun /* POWER_MANAGEMENT (0x01) */ 81*4882a593Smuzhiyun #define NAU8540_ADC4_EN (0x1 << 3) 82*4882a593Smuzhiyun #define NAU8540_ADC3_EN (0x1 << 2) 83*4882a593Smuzhiyun #define NAU8540_ADC2_EN (0x1 << 1) 84*4882a593Smuzhiyun #define NAU8540_ADC1_EN 0x1 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun /* CLOCK_CTRL (0x02) */ 87*4882a593Smuzhiyun #define NAU8540_CLK_ADC_EN (0x1 << 15) 88*4882a593Smuzhiyun #define NAU8540_CLK_I2S_EN (0x1 << 1) 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun /* CLOCK_SRC (0x03) */ 91*4882a593Smuzhiyun #define NAU8540_CLK_SRC_SFT 15 92*4882a593Smuzhiyun #define NAU8540_CLK_SRC_MASK (1 << NAU8540_CLK_SRC_SFT) 93*4882a593Smuzhiyun #define NAU8540_CLK_SRC_VCO (1 << NAU8540_CLK_SRC_SFT) 94*4882a593Smuzhiyun #define NAU8540_CLK_SRC_MCLK (0 << NAU8540_CLK_SRC_SFT) 95*4882a593Smuzhiyun #define NAU8540_CLK_ADC_SRC_SFT 6 96*4882a593Smuzhiyun #define NAU8540_CLK_ADC_SRC_MASK (0x3 << NAU8540_CLK_ADC_SRC_SFT) 97*4882a593Smuzhiyun #define NAU8540_CLK_MCLK_SRC_MASK 0xf 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun /* FLL1 (0x04) */ 100*4882a593Smuzhiyun #define NAU8540_ICTRL_LATCH_SFT 10 101*4882a593Smuzhiyun #define NAU8540_ICTRL_LATCH_MASK (0x7 << NAU8540_ICTRL_LATCH_SFT) 102*4882a593Smuzhiyun #define NAU8540_FLL_RATIO_MASK 0x7f 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun /* FLL3 (0x06) */ 105*4882a593Smuzhiyun #define NAU8540_GAIN_ERR_SFT 12 106*4882a593Smuzhiyun #define NAU8540_GAIN_ERR_MASK (0xf << NAU8540_GAIN_ERR_SFT) 107*4882a593Smuzhiyun #define NAU8540_FLL_CLK_SRC_SFT 10 108*4882a593Smuzhiyun #define NAU8540_FLL_CLK_SRC_MASK (0x3 << NAU8540_FLL_CLK_SRC_SFT) 109*4882a593Smuzhiyun #define NAU8540_FLL_CLK_SRC_MCLK (0 << NAU8540_FLL_CLK_SRC_SFT) 110*4882a593Smuzhiyun #define NAU8540_FLL_CLK_SRC_BLK (0x2 << NAU8540_FLL_CLK_SRC_SFT) 111*4882a593Smuzhiyun #define NAU8540_FLL_CLK_SRC_FS (0x3 << NAU8540_FLL_CLK_SRC_SFT) 112*4882a593Smuzhiyun #define NAU8540_FLL_INTEGER_MASK 0x3ff 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun /* FLL4 (0x07) */ 115*4882a593Smuzhiyun #define NAU8540_FLL_REF_DIV_SFT 10 116*4882a593Smuzhiyun #define NAU8540_FLL_REF_DIV_MASK (0x3 << NAU8540_FLL_REF_DIV_SFT) 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun /* FLL5 (0x08) */ 119*4882a593Smuzhiyun #define NAU8540_FLL_PDB_DAC_EN (0x1 << 15) 120*4882a593Smuzhiyun #define NAU8540_FLL_LOOP_FTR_EN (0x1 << 14) 121*4882a593Smuzhiyun #define NAU8540_FLL_CLK_SW_MASK (0x1 << 13) 122*4882a593Smuzhiyun #define NAU8540_FLL_CLK_SW_N2 (0x1 << 13) 123*4882a593Smuzhiyun #define NAU8540_FLL_CLK_SW_REF (0x0 << 13) 124*4882a593Smuzhiyun #define NAU8540_FLL_FTR_SW_MASK (0x1 << 12) 125*4882a593Smuzhiyun #define NAU8540_FLL_FTR_SW_ACCU (0x1 << 12) 126*4882a593Smuzhiyun #define NAU8540_FLL_FTR_SW_FILTER (0x0 << 12) 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun /* FLL6 (0x9) */ 129*4882a593Smuzhiyun #define NAU8540_DCO_EN (0x1 << 15) 130*4882a593Smuzhiyun #define NAU8540_SDM_EN (0x1 << 14) 131*4882a593Smuzhiyun #define NAU8540_CUTOFF500 (0x1 << 13) 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun /* PCM_CTRL0 (0x10) */ 134*4882a593Smuzhiyun #define NAU8540_I2S_BP_SFT 7 135*4882a593Smuzhiyun #define NAU8540_I2S_BP_INV (0x1 << NAU8540_I2S_BP_SFT) 136*4882a593Smuzhiyun #define NAU8540_I2S_PCMB_SFT 6 137*4882a593Smuzhiyun #define NAU8540_I2S_PCMB_EN (0x1 << NAU8540_I2S_PCMB_SFT) 138*4882a593Smuzhiyun #define NAU8540_I2S_DL_SFT 2 139*4882a593Smuzhiyun #define NAU8540_I2S_DL_MASK (0x3 << NAU8540_I2S_DL_SFT) 140*4882a593Smuzhiyun #define NAU8540_I2S_DL_16 (0 << NAU8540_I2S_DL_SFT) 141*4882a593Smuzhiyun #define NAU8540_I2S_DL_20 (0x1 << NAU8540_I2S_DL_SFT) 142*4882a593Smuzhiyun #define NAU8540_I2S_DL_24 (0x2 << NAU8540_I2S_DL_SFT) 143*4882a593Smuzhiyun #define NAU8540_I2S_DL_32 (0x3 << NAU8540_I2S_DL_SFT) 144*4882a593Smuzhiyun #define NAU8540_I2S_DF_MASK 0x3 145*4882a593Smuzhiyun #define NAU8540_I2S_DF_RIGTH 0 146*4882a593Smuzhiyun #define NAU8540_I2S_DF_LEFT 0x1 147*4882a593Smuzhiyun #define NAU8540_I2S_DF_I2S 0x2 148*4882a593Smuzhiyun #define NAU8540_I2S_DF_PCM_AB 0x3 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun /* PCM_CTRL1 (0x11) */ 151*4882a593Smuzhiyun #define NAU8540_I2S_DO12_TRI (0x1 << 15) 152*4882a593Smuzhiyun #define NAU8540_I2S_LRC_DIV_SFT 12 153*4882a593Smuzhiyun #define NAU8540_I2S_LRC_DIV_MASK (0x3 << NAU8540_I2S_LRC_DIV_SFT) 154*4882a593Smuzhiyun #define NAU8540_I2S_DO12_OE (0x1 << 4) 155*4882a593Smuzhiyun #define NAU8540_I2S_MS_SFT 3 156*4882a593Smuzhiyun #define NAU8540_I2S_MS_MASK (0x1 << NAU8540_I2S_MS_SFT) 157*4882a593Smuzhiyun #define NAU8540_I2S_MS_MASTER (0x1 << NAU8540_I2S_MS_SFT) 158*4882a593Smuzhiyun #define NAU8540_I2S_MS_SLAVE (0x0 << NAU8540_I2S_MS_SFT) 159*4882a593Smuzhiyun #define NAU8540_I2S_BLK_DIV_MASK 0x7 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun /* PCM_CTRL1 (0x12) */ 162*4882a593Smuzhiyun #define NAU8540_I2S_DO34_TRI (0x1 << 15) 163*4882a593Smuzhiyun #define NAU8540_I2S_DO34_OE (0x1 << 11) 164*4882a593Smuzhiyun #define NAU8540_I2S_TSLOT_L_MASK 0x3ff 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun /* PCM_CTRL4 (0x14) */ 167*4882a593Smuzhiyun #define NAU8540_TDM_MODE (0x1 << 15) 168*4882a593Smuzhiyun #define NAU8540_TDM_OFFSET_EN (0x1 << 14) 169*4882a593Smuzhiyun #define NAU8540_TDM_TX_MASK 0xf 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun /* ADC_SAMPLE_RATE (0x3A) */ 172*4882a593Smuzhiyun #define NAU8540_CH_SYNC (0x1 << 14) 173*4882a593Smuzhiyun #define NAU8540_ADC_OSR_MASK 0x3 174*4882a593Smuzhiyun #define NAU8540_ADC_OSR_256 0x3 175*4882a593Smuzhiyun #define NAU8540_ADC_OSR_128 0x2 176*4882a593Smuzhiyun #define NAU8540_ADC_OSR_64 0x1 177*4882a593Smuzhiyun #define NAU8540_ADC_OSR_32 0x0 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun /* VMID_CTRL (0x60) */ 180*4882a593Smuzhiyun #define NAU8540_VMID_EN (1 << 6) 181*4882a593Smuzhiyun #define NAU8540_VMID_SEL_SFT 4 182*4882a593Smuzhiyun #define NAU8540_VMID_SEL_MASK (0x3 << NAU8540_VMID_SEL_SFT) 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun /* MIC_BIAS (0x67) */ 185*4882a593Smuzhiyun #define NAU8540_PU_PRE (0x1 << 8) 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun /* REFERENCE (0x68) */ 188*4882a593Smuzhiyun #define NAU8540_PRECHARGE_DIS (0x1 << 13) 189*4882a593Smuzhiyun #define NAU8540_GLOBAL_BIAS_EN (0x1 << 12) 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun /* FEPGA1 (0x69) */ 192*4882a593Smuzhiyun #define NAU8540_FEPGA1_MODCH2_SHT_SFT 7 193*4882a593Smuzhiyun #define NAU8540_FEPGA1_MODCH2_SHT (0x1 << NAU8540_FEPGA1_MODCH2_SHT_SFT) 194*4882a593Smuzhiyun #define NAU8540_FEPGA1_MODCH1_SHT_SFT 3 195*4882a593Smuzhiyun #define NAU8540_FEPGA1_MODCH1_SHT (0x1 << NAU8540_FEPGA1_MODCH1_SHT_SFT) 196*4882a593Smuzhiyun 197*4882a593Smuzhiyun /* FEPGA2 (0x6A) */ 198*4882a593Smuzhiyun #define NAU8540_FEPGA2_MODCH4_SHT_SFT 7 199*4882a593Smuzhiyun #define NAU8540_FEPGA2_MODCH4_SHT (0x1 << NAU8540_FEPGA2_MODCH4_SHT_SFT) 200*4882a593Smuzhiyun #define NAU8540_FEPGA2_MODCH3_SHT_SFT 3 201*4882a593Smuzhiyun #define NAU8540_FEPGA2_MODCH3_SHT (0x1 << NAU8540_FEPGA2_MODCH3_SHT_SFT) 202*4882a593Smuzhiyun 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun /* System Clock Source */ 205*4882a593Smuzhiyun enum { 206*4882a593Smuzhiyun NAU8540_CLK_DIS, 207*4882a593Smuzhiyun NAU8540_CLK_MCLK, 208*4882a593Smuzhiyun NAU8540_CLK_INTERNAL, 209*4882a593Smuzhiyun NAU8540_CLK_FLL_MCLK, 210*4882a593Smuzhiyun NAU8540_CLK_FLL_BLK, 211*4882a593Smuzhiyun NAU8540_CLK_FLL_FS, 212*4882a593Smuzhiyun }; 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun struct nau8540 { 215*4882a593Smuzhiyun struct device *dev; 216*4882a593Smuzhiyun struct regmap *regmap; 217*4882a593Smuzhiyun }; 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun struct nau8540_fll { 220*4882a593Smuzhiyun int mclk_src; 221*4882a593Smuzhiyun int ratio; 222*4882a593Smuzhiyun int fll_frac; 223*4882a593Smuzhiyun int fll_int; 224*4882a593Smuzhiyun int clk_ref_div; 225*4882a593Smuzhiyun }; 226*4882a593Smuzhiyun 227*4882a593Smuzhiyun struct nau8540_fll_attr { 228*4882a593Smuzhiyun unsigned int param; 229*4882a593Smuzhiyun unsigned int val; 230*4882a593Smuzhiyun }; 231*4882a593Smuzhiyun 232*4882a593Smuzhiyun /* over sampling rate */ 233*4882a593Smuzhiyun struct nau8540_osr_attr { 234*4882a593Smuzhiyun unsigned int osr; 235*4882a593Smuzhiyun unsigned int clk_src; 236*4882a593Smuzhiyun }; 237*4882a593Smuzhiyun 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun #endif /* __NAU8540_H__ */ 240