Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * cs35l35.h -- CS35L35 ALSA SoC audio driver
0004  *
0005  * Copyright 2016 Cirrus Logic, Inc.
0006  *
0007  * Author: Brian Austin <brian.austin@cirrus.com>
0008  */
0009 
0010 #ifndef __CS35L35_H__
0011 #define __CS35L35_H__
0012 
0013 #define CS35L35_FIRSTREG        0x01
0014 #define CS35L35_LASTREG         0x7E
0015 #define CS35L35_CHIP_ID         0x00035A35
0016 #define CS35L35_DEVID_AB        0x01    /* Device ID A & B [RO] */
0017 #define CS35L35_DEVID_CD        0x02    /* Device ID C & D [RO] */
0018 #define CS35L35_DEVID_E         0x03    /* Device ID E [RO] */
0019 #define CS35L35_FAB_ID          0x04    /* Fab ID [RO] */
0020 #define CS35L35_REV_ID          0x05    /* Revision ID [RO] */
0021 #define CS35L35_PWRCTL1         0x06    /* Power Ctl 1 */
0022 #define CS35L35_PWRCTL2         0x07    /* Power Ctl 2 */
0023 #define CS35L35_PWRCTL3         0x08    /* Power Ctl 3 */
0024 #define CS35L35_CLK_CTL1        0x0A    /* Clocking Ctl 1 */
0025 #define CS35L35_CLK_CTL2        0x0B    /* Clocking Ctl 2 */
0026 #define CS35L35_CLK_CTL3        0x0C    /* Clocking Ctl 3 */
0027 #define CS35L35_SP_FMT_CTL1     0x0D    /* Serial Port Format CTL1 */
0028 #define CS35L35_SP_FMT_CTL2     0x0E    /* Serial Port Format CTL2 */
0029 #define CS35L35_SP_FMT_CTL3     0x0F    /* Serial Port Format CTL3 */
0030 #define CS35L35_MAG_COMP_CTL        0x13    /* Magnitude Comp CTL */
0031 #define CS35L35_AMP_INP_DRV_CTL     0x14    /* Amp Input Drive Ctl */
0032 #define CS35L35_AMP_DIG_VOL_CTL     0x15    /* Amplifier Dig Volume Ctl */
0033 #define CS35L35_AMP_DIG_VOL     0x16    /* Amplifier Dig Volume */
0034 #define CS35L35_ADV_DIG_VOL     0x17    /* Advisory Digital Volume */
0035 #define CS35L35_PROTECT_CTL     0x18    /* Amp Gain - Prot Ctl Param */
0036 #define CS35L35_AMP_GAIN_AUD_CTL    0x19    /* Amp Serial Port Gain Ctl */
0037 #define CS35L35_AMP_GAIN_PDM_CTL    0x1A    /* Amplifier Gain PDM Ctl */
0038 #define CS35L35_AMP_GAIN_ADV_CTL    0x1B    /* Amplifier Gain Ctl */
0039 #define CS35L35_GPI_CTL         0x1C    /* GPI Ctl */
0040 #define CS35L35_BST_CVTR_V_CTL      0x1D    /* Boost Conv Voltage Ctl */
0041 #define CS35L35_BST_PEAK_I      0x1E    /* Boost Conv Peak Current */
0042 #define CS35L35_BST_RAMP_CTL        0x20    /* Boost Conv Soft Ramp Ctl */
0043 #define CS35L35_BST_CONV_COEF_1     0x21    /* Boost Conv Coefficients 1 */
0044 #define CS35L35_BST_CONV_COEF_2     0x22    /* Boost Conv Coefficients 2 */
0045 #define CS35L35_BST_CONV_SLOPE_COMP 0x23    /* Boost Conv Slope Comp */
0046 #define CS35L35_BST_CONV_SW_FREQ    0x24    /* Boost Conv L BST SW Freq */
0047 #define CS35L35_CLASS_H_CTL     0x30    /* CLS H Control */
0048 #define CS35L35_CLASS_H_HEADRM_CTL  0x31    /* CLS H Headroom Ctl */
0049 #define CS35L35_CLASS_H_RELEASE_RATE    0x32    /* CLS H Release Rate */
0050 #define CS35L35_CLASS_H_FET_DRIVE_CTL   0x33    /* CLS H Weak FET Drive Ctl */
0051 #define CS35L35_CLASS_H_VP_CTL      0x34    /* CLS H VP Ctl */
0052 #define CS35L35_CLASS_H_STATUS      0x38    /* CLS H Status */
0053 #define CS35L35_VPBR_CTL        0x3A    /* VPBR Ctl */
0054 #define CS35L35_VPBR_VOL_CTL        0x3B    /* VPBR Volume Ctl */
0055 #define CS35L35_VPBR_TIMING_CTL     0x3C    /* VPBR Timing Ctl */
0056 #define CS35L35_VPBR_MODE_VOL_CTL   0x3D    /* VPBR Mode/Attack Vol Ctl */
0057 #define CS35L35_VPBR_ATTEN_STATUS   0x4B    /* VPBR Attenuation Status */
0058 #define CS35L35_SPKR_MON_CTL        0x4E    /* Speaker Monitoring Ctl */
0059 #define CS35L35_IMON_SCALE_CTL      0x51    /* IMON Scale Ctl */
0060 #define CS35L35_AUDIN_RXLOC_CTL     0x52    /* Audio Input RX Loc Ctl */
0061 #define CS35L35_ADVIN_RXLOC_CTL     0x53    /* Advisory Input RX Loc Ctl */
0062 #define CS35L35_VMON_TXLOC_CTL      0x54    /* VMON TX Loc Ctl */
0063 #define CS35L35_IMON_TXLOC_CTL      0x55    /* IMON TX Loc Ctl */
0064 #define CS35L35_VPMON_TXLOC_CTL     0x56    /* VPMON TX Loc Ctl */
0065 #define CS35L35_VBSTMON_TXLOC_CTL   0x57    /* VBSTMON TX Loc Ctl */
0066 #define CS35L35_VPBR_STATUS_TXLOC_CTL   0x58    /* VPBR Status TX Loc Ctl */
0067 #define CS35L35_ZERO_FILL_LOC_CTL   0x59    /* Zero Fill Loc Ctl */
0068 #define CS35L35_AUDIN_DEPTH_CTL     0x5A    /* Audio Input Depth Ctl */
0069 #define CS35L35_SPKMON_DEPTH_CTL    0x5B    /* SPK Mon Output Depth Ctl */
0070 #define CS35L35_SUPMON_DEPTH_CTL    0x5C    /* Supply Mon Out Depth Ctl */
0071 #define CS35L35_ZEROFILL_DEPTH_CTL  0x5D    /* Zero Fill Mon Output Ctl */
0072 #define CS35L35_MULT_DEV_SYNCH1     0x62    /* Multidevice Synch */
0073 #define CS35L35_MULT_DEV_SYNCH2     0x63    /* Multidevice Synch 2 */
0074 #define CS35L35_PROT_RELEASE_CTL    0x64    /* Protection Release Ctl */
0075 #define CS35L35_DIAG_MODE_REG_LOCK  0x68    /* Diagnostic Mode Reg Lock */
0076 #define CS35L35_DIAG_MODE_CTL_1     0x69    /* Diagnostic Mode Ctl 1 */
0077 #define CS35L35_DIAG_MODE_CTL_2     0x6A    /* Diagnostic Mode Ctl 2 */
0078 #define CS35L35_INT_MASK_1      0x70    /* Interrupt Mask 1 */
0079 #define CS35L35_INT_MASK_2      0x71    /* Interrupt Mask 2 */
0080 #define CS35L35_INT_MASK_3      0x72    /* Interrupt Mask 3 */
0081 #define CS35L35_INT_MASK_4      0x73    /* Interrupt Mask 4 */
0082 #define CS35L35_INT_STATUS_1        0x74    /* Interrupt Status 1 */
0083 #define CS35L35_INT_STATUS_2        0x75    /* Interrupt Status 2 */
0084 #define CS35L35_INT_STATUS_3        0x76    /* Interrupt Status 3 */
0085 #define CS35L35_INT_STATUS_4        0x77    /* Interrupt Status 4 */
0086 #define CS35L35_PLL_STATUS      0x78    /* PLL Status */
0087 #define CS35L35_OTP_TRIM_STATUS     0x7E    /* OTP Trim Status */
0088 
0089 #define CS35L35_MAX_REGISTER        0x7F
0090 
0091 /* CS35L35_PWRCTL1 */
0092 #define CS35L35_SFT_RST         0x80
0093 #define CS35L35_DISCHG_FLT      0x02
0094 #define CS35L35_PDN_ALL         0x01
0095 
0096 /* CS35L35_PWRCTL2 */
0097 #define CS35L35_PDN_VMON        0x80
0098 #define CS35L35_PDN_IMON        0x40
0099 #define CS35L35_PDN_CLASSH      0x20
0100 #define CS35L35_PDN_VPBR        0x10
0101 #define CS35L35_PDN_BST         0x04
0102 #define CS35L35_PDN_AMP         0x01
0103 
0104 /* CS35L35_PWRCTL3 */
0105 #define CS35L35_PDN_VBSTMON_OUT     0x10
0106 #define CS35L35_PDN_VMON_OUT        0x08
0107 
0108 #define CS35L35_AUDIN_DEPTH_MASK    0x03
0109 #define CS35L35_AUDIN_DEPTH_SHIFT   0
0110 #define CS35L35_ADVIN_DEPTH_MASK    0x0C
0111 #define CS35L35_ADVIN_DEPTH_SHIFT   2
0112 #define CS35L35_SDIN_DEPTH_8        0x01
0113 #define CS35L35_SDIN_DEPTH_16       0x02
0114 #define CS35L35_SDIN_DEPTH_24       0x03
0115 
0116 #define CS35L35_SDOUT_DEPTH_8       0x01
0117 #define CS35L35_SDOUT_DEPTH_12      0x02
0118 #define CS35L35_SDOUT_DEPTH_16      0x03
0119 
0120 #define CS35L35_AUD_IN_LR_MASK      0x80
0121 #define CS35L35_AUD_IN_LR_SHIFT     7
0122 #define CS35L35_ADV_IN_LR_MASK      0x80
0123 #define CS35L35_ADV_IN_LR_SHIFT     7
0124 #define CS35L35_AUD_IN_LOC_MASK     0x0F
0125 #define CS35L35_AUD_IN_LOC_SHIFT    0
0126 #define CS35L35_ADV_IN_LOC_MASK     0x0F
0127 #define CS35L35_ADV_IN_LOC_SHIFT    0
0128 
0129 #define CS35L35_IMON_DEPTH_MASK     0x03
0130 #define CS35L35_IMON_DEPTH_SHIFT    0
0131 #define CS35L35_VMON_DEPTH_MASK     0x0C
0132 #define CS35L35_VMON_DEPTH_SHIFT    2
0133 #define CS35L35_VBSTMON_DEPTH_MASK  0x03
0134 #define CS35L35_VBSTMON_DEPTH_SHIFT 0
0135 #define CS35L35_VPMON_DEPTH_MASK    0x0C
0136 #define CS35L35_VPMON_DEPTH_SHIFT   2
0137 #define CS35L35_VPBRSTAT_DEPTH_MASK 0x30
0138 #define CS35L35_VPBRSTAT_DEPTH_SHIFT    4
0139 #define CS35L35_ZEROFILL_DEPTH_MASK 0x03
0140 #define CS35L35_ZEROFILL_DEPTH_SHIFT    0x00
0141 
0142 #define CS35L35_MON_TXLOC_MASK      0x3F
0143 #define CS35L35_MON_TXLOC_SHIFT     0
0144 #define CS35L35_MON_FRM_MASK        0x80
0145 #define CS35L35_MON_FRM_SHIFT       7
0146 
0147 #define CS35L35_IMON_SCALE_MASK     0xF8
0148 #define CS35L35_IMON_SCALE_SHIFT    3
0149 
0150 #define CS35L35_MS_MASK         0x80
0151 #define CS35L35_MS_SHIFT        7
0152 #define CS35L35_SPMODE_MASK     0x40
0153 #define CS35L35_SP_DRV_MASK     0x10
0154 #define CS35L35_SP_DRV_SHIFT        4
0155 #define CS35L35_CLK_CTL2_MASK       0xFF
0156 #define CS35L35_PDM_MODE_MASK       0x40
0157 #define CS35L35_PDM_MODE_SHIFT      6
0158 #define CS35L35_CLK_SOURCE_MASK     0x03
0159 #define CS35L35_CLK_SOURCE_SHIFT    0
0160 #define CS35L35_CLK_SOURCE_MCLK     0
0161 #define CS35L35_CLK_SOURCE_SCLK     1
0162 #define CS35L35_CLK_SOURCE_PDM      2
0163 
0164 #define CS35L35_SP_SCLKS_MASK       0x0F
0165 #define CS35L35_SP_SCLKS_SHIFT      0x00
0166 #define CS35L35_SP_SCLKS_16FS       0x03
0167 #define CS35L35_SP_SCLKS_32FS       0x07
0168 #define CS35L35_SP_SCLKS_48FS       0x0B
0169 #define CS35L35_SP_SCLKS_64FS       0x0F
0170 #define CS35L35_SP_RATE_MASK        0xC0
0171 #define CS35L35_SP_RATE_SHIFT       6
0172 
0173 #define CS35L35_PDN_BST_MASK        0x06
0174 #define CS35L35_PDN_BST_FETON_SHIFT 1
0175 #define CS35L35_PDN_BST_FETOFF_SHIFT    2
0176 #define CS35L35_PWR2_PDN_MASK       0xE0
0177 #define CS35L35_PWR3_PDN_MASK       0x1E
0178 #define CS35L35_PDN_ALL_MASK        0x01
0179 #define CS35L35_DISCHG_FILT_MASK    0x02
0180 #define CS35L35_DISCHG_FILT_SHIFT   1
0181 #define CS35L35_MCLK_DIS_MASK       0x04
0182 #define CS35L35_MCLK_DIS_SHIFT      2
0183 
0184 #define CS35L35_BST_CTL_MASK        0x7F
0185 #define CS35L35_BST_CTL_SHIFT       0
0186 #define CS35L35_BST_IPK_MASK        0x1F
0187 #define CS35L35_BST_IPK_SHIFT       0
0188 #define CS35L35_AMP_MUTE_MASK       0x20
0189 #define CS35L35_AMP_MUTE_SHIFT      5
0190 #define CS35L35_AMP_GAIN_ZC_MASK    0x10
0191 #define CS35L35_AMP_GAIN_ZC_SHIFT   4
0192 
0193 #define CS35L35_AMP_DIGSFT_MASK     0x02
0194 #define CS35L35_AMP_DIGSFT_SHIFT    1
0195 
0196 /* CS35L35_SP_FMT_CTL3 */
0197 #define CS35L35_SP_I2S_DRV_MASK     0x03
0198 #define CS35L35_SP_I2S_DRV_SHIFT    0
0199 
0200 /* Boost Converter Config */
0201 #define CS35L35_BST_CONV_COEFF_MASK 0xFF
0202 #define CS35L35_BST_CONV_SLOPE_MASK 0xFF
0203 #define CS35L35_BST_CONV_LBST_MASK  0x03
0204 #define CS35L35_BST_CONV_SWFREQ_MASK    0xF0
0205 
0206 /* Class H Algorithm Control */
0207 #define CS35L35_CH_STEREO_MASK      0x40
0208 #define CS35L35_CH_STEREO_SHIFT     6
0209 #define CS35L35_CH_BST_OVR_MASK     0x04
0210 #define CS35L35_CH_BST_OVR_SHIFT    2
0211 #define CS35L35_CH_BST_LIM_MASK     0x08
0212 #define CS35L35_CH_BST_LIM_SHIFT    3
0213 #define CS35L35_CH_MEM_DEPTH_MASK   0x01
0214 #define CS35L35_CH_MEM_DEPTH_SHIFT  0
0215 #define CS35L35_CH_HDRM_CTL_MASK    0x3F
0216 #define CS35L35_CH_HDRM_CTL_SHIFT   0
0217 #define CS35L35_CH_REL_RATE_MASK    0xFF
0218 #define CS35L35_CH_REL_RATE_SHIFT   0
0219 #define CS35L35_CH_WKFET_DIS_MASK   0x80
0220 #define CS35L35_CH_WKFET_DIS_SHIFT  7
0221 #define CS35L35_CH_WKFET_DEL_MASK   0x70
0222 #define CS35L35_CH_WKFET_DEL_SHIFT  4
0223 #define CS35L35_CH_WKFET_THLD_MASK  0x0F
0224 #define CS35L35_CH_WKFET_THLD_SHIFT 0
0225 #define CS35L35_CH_VP_AUTO_MASK     0x80
0226 #define CS35L35_CH_VP_AUTO_SHIFT    7
0227 #define CS35L35_CH_VP_RATE_MASK     0x60
0228 #define CS35L35_CH_VP_RATE_SHIFT    5
0229 #define CS35L35_CH_VP_MAN_MASK      0x1F
0230 #define CS35L35_CH_VP_MAN_SHIFT     0
0231 
0232 /* CS35L35_PROT_RELEASE_CTL */
0233 #define CS35L35_CAL_ERR_RLS     0x80
0234 #define CS35L35_SHORT_RLS       0x04
0235 #define CS35L35_OTW_RLS         0x02
0236 #define CS35L35_OTE_RLS         0x01
0237 
0238 /* INT Mask Registers */
0239 #define CS35L35_INT1_CRIT_MASK      0x38
0240 #define CS35L35_INT2_CRIT_MASK      0xEF
0241 #define CS35L35_INT3_CRIT_MASK      0xEE
0242 #define CS35L35_INT4_CRIT_MASK      0xFF
0243 
0244 /* PDN DONE Masks */
0245 #define CS35L35_M_PDN_DONE_SHIFT    4
0246 #define CS35L35_M_PDN_DONE_MASK     0x10
0247 
0248 /* CS35L35_INT_1 */
0249 #define CS35L35_CAL_ERR         0x80
0250 #define CS35L35_OTP_ERR         0x40
0251 #define CS35L35_LRCLK_ERR       0x20
0252 #define CS35L35_SPCLK_ERR       0x10
0253 #define CS35L35_MCLK_ERR        0x08
0254 #define CS35L35_AMP_SHORT       0x04
0255 #define CS35L35_OTW         0x02
0256 #define CS35L35_OTE         0x01
0257 
0258 /* CS35L35_INT_2 */
0259 #define CS35L35_PDN_DONE        0x10
0260 #define CS35L35_VPBR_ERR        0x02
0261 #define CS35L35_VPBR_CLR        0x01
0262 
0263 /* CS35L35_INT_3 */
0264 #define CS35L35_BST_HIGH        0x10
0265 #define CS35L35_BST_HIGH_FLAG       0x08
0266 #define CS35L35_BST_IPK_FLAG        0x04
0267 #define CS35L35_LBST_SHORT      0x01
0268 
0269 /* CS35L35_INT_4 */
0270 #define CS35L35_VMON_OVFL       0x08
0271 #define CS35L35_IMON_OVFL       0x04
0272 
0273 #define CS35L35_FORMATS (SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE | \
0274             SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
0275 
0276 struct  cs35l35_private {
0277     struct device *dev;
0278     struct cs35l35_platform_data pdata;
0279     struct regmap *regmap;
0280     struct regulator_bulk_data supplies[2];
0281     int num_supplies;
0282     int sysclk;
0283     int sclk;
0284     bool pdm_mode;
0285     bool i2s_mode;
0286     bool clock_consumer;
0287     /* GPIO for /RST */
0288     struct gpio_desc *reset_gpio;
0289     struct completion pdn_done;
0290 };
0291 
0292 static const char * const cs35l35_supplies[] = {
0293     "VA",
0294     "VP",
0295 };
0296 
0297 #endif