298 lines · c
1/* SPDX-License-Identifier: GPL-2.0-only */2/*3 * cs35l35.h -- CS35L35 ALSA SoC audio driver4 *5 * Copyright 2016 Cirrus Logic, Inc.6 *7 * Author: Brian Austin <brian.austin@cirrus.com>8 */9 10#ifndef __CS35L35_H__11#define __CS35L35_H__12 13#define CS35L35_FIRSTREG 0x0114#define CS35L35_LASTREG 0x7E15#define CS35L35_CHIP_ID 0x00035A3516#define CS35L35_DEVID_AB 0x01 /* Device ID A & B [RO] */17#define CS35L35_DEVID_CD 0x02 /* Device ID C & D [RO] */18#define CS35L35_DEVID_E 0x03 /* Device ID E [RO] */19#define CS35L35_FAB_ID 0x04 /* Fab ID [RO] */20#define CS35L35_REV_ID 0x05 /* Revision ID [RO] */21#define CS35L35_PWRCTL1 0x06 /* Power Ctl 1 */22#define CS35L35_PWRCTL2 0x07 /* Power Ctl 2 */23#define CS35L35_PWRCTL3 0x08 /* Power Ctl 3 */24#define CS35L35_CLK_CTL1 0x0A /* Clocking Ctl 1 */25#define CS35L35_CLK_CTL2 0x0B /* Clocking Ctl 2 */26#define CS35L35_CLK_CTL3 0x0C /* Clocking Ctl 3 */27#define CS35L35_SP_FMT_CTL1 0x0D /* Serial Port Format CTL1 */28#define CS35L35_SP_FMT_CTL2 0x0E /* Serial Port Format CTL2 */29#define CS35L35_SP_FMT_CTL3 0x0F /* Serial Port Format CTL3 */30#define CS35L35_MAG_COMP_CTL 0x13 /* Magnitude Comp CTL */31#define CS35L35_AMP_INP_DRV_CTL 0x14 /* Amp Input Drive Ctl */32#define CS35L35_AMP_DIG_VOL_CTL 0x15 /* Amplifier Dig Volume Ctl */33#define CS35L35_AMP_DIG_VOL 0x16 /* Amplifier Dig Volume */34#define CS35L35_ADV_DIG_VOL 0x17 /* Advisory Digital Volume */35#define CS35L35_PROTECT_CTL 0x18 /* Amp Gain - Prot Ctl Param */36#define CS35L35_AMP_GAIN_AUD_CTL 0x19 /* Amp Serial Port Gain Ctl */37#define CS35L35_AMP_GAIN_PDM_CTL 0x1A /* Amplifier Gain PDM Ctl */38#define CS35L35_AMP_GAIN_ADV_CTL 0x1B /* Amplifier Gain Ctl */39#define CS35L35_GPI_CTL 0x1C /* GPI Ctl */40#define CS35L35_BST_CVTR_V_CTL 0x1D /* Boost Conv Voltage Ctl */41#define CS35L35_BST_PEAK_I 0x1E /* Boost Conv Peak Current */42#define CS35L35_BST_RAMP_CTL 0x20 /* Boost Conv Soft Ramp Ctl */43#define CS35L35_BST_CONV_COEF_1 0x21 /* Boost Conv Coefficients 1 */44#define CS35L35_BST_CONV_COEF_2 0x22 /* Boost Conv Coefficients 2 */45#define CS35L35_BST_CONV_SLOPE_COMP 0x23 /* Boost Conv Slope Comp */46#define CS35L35_BST_CONV_SW_FREQ 0x24 /* Boost Conv L BST SW Freq */47#define CS35L35_CLASS_H_CTL 0x30 /* CLS H Control */48#define CS35L35_CLASS_H_HEADRM_CTL 0x31 /* CLS H Headroom Ctl */49#define CS35L35_CLASS_H_RELEASE_RATE 0x32 /* CLS H Release Rate */50#define CS35L35_CLASS_H_FET_DRIVE_CTL 0x33 /* CLS H Weak FET Drive Ctl */51#define CS35L35_CLASS_H_VP_CTL 0x34 /* CLS H VP Ctl */52#define CS35L35_CLASS_H_STATUS 0x38 /* CLS H Status */53#define CS35L35_VPBR_CTL 0x3A /* VPBR Ctl */54#define CS35L35_VPBR_VOL_CTL 0x3B /* VPBR Volume Ctl */55#define CS35L35_VPBR_TIMING_CTL 0x3C /* VPBR Timing Ctl */56#define CS35L35_VPBR_MODE_VOL_CTL 0x3D /* VPBR Mode/Attack Vol Ctl */57#define CS35L35_VPBR_ATTEN_STATUS 0x4B /* VPBR Attenuation Status */58#define CS35L35_SPKR_MON_CTL 0x4E /* Speaker Monitoring Ctl */59#define CS35L35_IMON_SCALE_CTL 0x51 /* IMON Scale Ctl */60#define CS35L35_AUDIN_RXLOC_CTL 0x52 /* Audio Input RX Loc Ctl */61#define CS35L35_ADVIN_RXLOC_CTL 0x53 /* Advisory Input RX Loc Ctl */62#define CS35L35_VMON_TXLOC_CTL 0x54 /* VMON TX Loc Ctl */63#define CS35L35_IMON_TXLOC_CTL 0x55 /* IMON TX Loc Ctl */64#define CS35L35_VPMON_TXLOC_CTL 0x56 /* VPMON TX Loc Ctl */65#define CS35L35_VBSTMON_TXLOC_CTL 0x57 /* VBSTMON TX Loc Ctl */66#define CS35L35_VPBR_STATUS_TXLOC_CTL 0x58 /* VPBR Status TX Loc Ctl */67#define CS35L35_ZERO_FILL_LOC_CTL 0x59 /* Zero Fill Loc Ctl */68#define CS35L35_AUDIN_DEPTH_CTL 0x5A /* Audio Input Depth Ctl */69#define CS35L35_SPKMON_DEPTH_CTL 0x5B /* SPK Mon Output Depth Ctl */70#define CS35L35_SUPMON_DEPTH_CTL 0x5C /* Supply Mon Out Depth Ctl */71#define CS35L35_ZEROFILL_DEPTH_CTL 0x5D /* Zero Fill Mon Output Ctl */72#define CS35L35_MULT_DEV_SYNCH1 0x62 /* Multidevice Synch */73#define CS35L35_MULT_DEV_SYNCH2 0x63 /* Multidevice Synch 2 */74#define CS35L35_PROT_RELEASE_CTL 0x64 /* Protection Release Ctl */75#define CS35L35_DIAG_MODE_REG_LOCK 0x68 /* Diagnostic Mode Reg Lock */76#define CS35L35_DIAG_MODE_CTL_1 0x69 /* Diagnostic Mode Ctl 1 */77#define CS35L35_DIAG_MODE_CTL_2 0x6A /* Diagnostic Mode Ctl 2 */78#define CS35L35_INT_MASK_1 0x70 /* Interrupt Mask 1 */79#define CS35L35_INT_MASK_2 0x71 /* Interrupt Mask 2 */80#define CS35L35_INT_MASK_3 0x72 /* Interrupt Mask 3 */81#define CS35L35_INT_MASK_4 0x73 /* Interrupt Mask 4 */82#define CS35L35_INT_STATUS_1 0x74 /* Interrupt Status 1 */83#define CS35L35_INT_STATUS_2 0x75 /* Interrupt Status 2 */84#define CS35L35_INT_STATUS_3 0x76 /* Interrupt Status 3 */85#define CS35L35_INT_STATUS_4 0x77 /* Interrupt Status 4 */86#define CS35L35_PLL_STATUS 0x78 /* PLL Status */87#define CS35L35_OTP_TRIM_STATUS 0x7E /* OTP Trim Status */88 89#define CS35L35_MAX_REGISTER 0x7F90 91/* CS35L35_PWRCTL1 */92#define CS35L35_SFT_RST 0x8093#define CS35L35_DISCHG_FLT 0x0294#define CS35L35_PDN_ALL 0x0195 96/* CS35L35_PWRCTL2 */97#define CS35L35_PDN_VMON 0x8098#define CS35L35_PDN_IMON 0x4099#define CS35L35_PDN_CLASSH 0x20100#define CS35L35_PDN_VPBR 0x10101#define CS35L35_PDN_BST 0x04102#define CS35L35_PDN_AMP 0x01103 104/* CS35L35_PWRCTL3 */105#define CS35L35_PDN_VBSTMON_OUT 0x10106#define CS35L35_PDN_VMON_OUT 0x08107 108#define CS35L35_AUDIN_DEPTH_MASK 0x03109#define CS35L35_AUDIN_DEPTH_SHIFT 0110#define CS35L35_ADVIN_DEPTH_MASK 0x0C111#define CS35L35_ADVIN_DEPTH_SHIFT 2112#define CS35L35_SDIN_DEPTH_8 0x01113#define CS35L35_SDIN_DEPTH_16 0x02114#define CS35L35_SDIN_DEPTH_24 0x03115 116#define CS35L35_SDOUT_DEPTH_8 0x01117#define CS35L35_SDOUT_DEPTH_12 0x02118#define CS35L35_SDOUT_DEPTH_16 0x03119 120#define CS35L35_AUD_IN_LR_MASK 0x80121#define CS35L35_AUD_IN_LR_SHIFT 7122#define CS35L35_ADV_IN_LR_MASK 0x80123#define CS35L35_ADV_IN_LR_SHIFT 7124#define CS35L35_AUD_IN_LOC_MASK 0x0F125#define CS35L35_AUD_IN_LOC_SHIFT 0126#define CS35L35_ADV_IN_LOC_MASK 0x0F127#define CS35L35_ADV_IN_LOC_SHIFT 0128 129#define CS35L35_IMON_DEPTH_MASK 0x03130#define CS35L35_IMON_DEPTH_SHIFT 0131#define CS35L35_VMON_DEPTH_MASK 0x0C132#define CS35L35_VMON_DEPTH_SHIFT 2133#define CS35L35_VBSTMON_DEPTH_MASK 0x03134#define CS35L35_VBSTMON_DEPTH_SHIFT 0135#define CS35L35_VPMON_DEPTH_MASK 0x0C136#define CS35L35_VPMON_DEPTH_SHIFT 2137#define CS35L35_VPBRSTAT_DEPTH_MASK 0x30138#define CS35L35_VPBRSTAT_DEPTH_SHIFT 4139#define CS35L35_ZEROFILL_DEPTH_MASK 0x03140#define CS35L35_ZEROFILL_DEPTH_SHIFT 0x00141 142#define CS35L35_MON_TXLOC_MASK 0x3F143#define CS35L35_MON_TXLOC_SHIFT 0144#define CS35L35_MON_FRM_MASK 0x80145#define CS35L35_MON_FRM_SHIFT 7146 147#define CS35L35_IMON_SCALE_MASK 0xF8148#define CS35L35_IMON_SCALE_SHIFT 3149 150#define CS35L35_MS_MASK 0x80151#define CS35L35_MS_SHIFT 7152#define CS35L35_SPMODE_MASK 0x40153#define CS35L35_SP_DRV_MASK 0x10154#define CS35L35_SP_DRV_SHIFT 4155#define CS35L35_CLK_CTL2_MASK 0xFF156#define CS35L35_PDM_MODE_MASK 0x40157#define CS35L35_PDM_MODE_SHIFT 6158#define CS35L35_CLK_SOURCE_MASK 0x03159#define CS35L35_CLK_SOURCE_SHIFT 0160#define CS35L35_CLK_SOURCE_MCLK 0161#define CS35L35_CLK_SOURCE_SCLK 1162#define CS35L35_CLK_SOURCE_PDM 2163 164#define CS35L35_SP_SCLKS_MASK 0x0F165#define CS35L35_SP_SCLKS_SHIFT 0x00166#define CS35L35_SP_SCLKS_16FS 0x03167#define CS35L35_SP_SCLKS_32FS 0x07168#define CS35L35_SP_SCLKS_48FS 0x0B169#define CS35L35_SP_SCLKS_64FS 0x0F170#define CS35L35_SP_RATE_MASK 0xC0171#define CS35L35_SP_RATE_SHIFT 6172 173#define CS35L35_PDN_BST_MASK 0x06174#define CS35L35_PDN_BST_FETON_SHIFT 1175#define CS35L35_PDN_BST_FETOFF_SHIFT 2176#define CS35L35_PWR2_PDN_MASK 0xE0177#define CS35L35_PWR3_PDN_MASK 0x1E178#define CS35L35_PDN_ALL_MASK 0x01179#define CS35L35_DISCHG_FILT_MASK 0x02180#define CS35L35_DISCHG_FILT_SHIFT 1181#define CS35L35_MCLK_DIS_MASK 0x04182#define CS35L35_MCLK_DIS_SHIFT 2183 184#define CS35L35_BST_CTL_MASK 0x7F185#define CS35L35_BST_CTL_SHIFT 0186#define CS35L35_BST_IPK_MASK 0x1F187#define CS35L35_BST_IPK_SHIFT 0188#define CS35L35_AMP_MUTE_MASK 0x20189#define CS35L35_AMP_MUTE_SHIFT 5190#define CS35L35_AMP_GAIN_ZC_MASK 0x10191#define CS35L35_AMP_GAIN_ZC_SHIFT 4192 193#define CS35L35_AMP_DIGSFT_MASK 0x02194#define CS35L35_AMP_DIGSFT_SHIFT 1195 196/* CS35L35_SP_FMT_CTL3 */197#define CS35L35_SP_I2S_DRV_MASK 0x03198#define CS35L35_SP_I2S_DRV_SHIFT 0199 200/* Boost Converter Config */201#define CS35L35_BST_CONV_COEFF_MASK 0xFF202#define CS35L35_BST_CONV_SLOPE_MASK 0xFF203#define CS35L35_BST_CONV_LBST_MASK 0x03204#define CS35L35_BST_CONV_SWFREQ_MASK 0xF0205 206/* Class H Algorithm Control */207#define CS35L35_CH_STEREO_MASK 0x40208#define CS35L35_CH_STEREO_SHIFT 6209#define CS35L35_CH_BST_OVR_MASK 0x04210#define CS35L35_CH_BST_OVR_SHIFT 2211#define CS35L35_CH_BST_LIM_MASK 0x08212#define CS35L35_CH_BST_LIM_SHIFT 3213#define CS35L35_CH_MEM_DEPTH_MASK 0x01214#define CS35L35_CH_MEM_DEPTH_SHIFT 0215#define CS35L35_CH_HDRM_CTL_MASK 0x3F216#define CS35L35_CH_HDRM_CTL_SHIFT 0217#define CS35L35_CH_REL_RATE_MASK 0xFF218#define CS35L35_CH_REL_RATE_SHIFT 0219#define CS35L35_CH_WKFET_DIS_MASK 0x80220#define CS35L35_CH_WKFET_DIS_SHIFT 7221#define CS35L35_CH_WKFET_DEL_MASK 0x70222#define CS35L35_CH_WKFET_DEL_SHIFT 4223#define CS35L35_CH_WKFET_THLD_MASK 0x0F224#define CS35L35_CH_WKFET_THLD_SHIFT 0225#define CS35L35_CH_VP_AUTO_MASK 0x80226#define CS35L35_CH_VP_AUTO_SHIFT 7227#define CS35L35_CH_VP_RATE_MASK 0x60228#define CS35L35_CH_VP_RATE_SHIFT 5229#define CS35L35_CH_VP_MAN_MASK 0x1F230#define CS35L35_CH_VP_MAN_SHIFT 0231 232/* CS35L35_PROT_RELEASE_CTL */233#define CS35L35_CAL_ERR_RLS 0x80234#define CS35L35_SHORT_RLS 0x04235#define CS35L35_OTW_RLS 0x02236#define CS35L35_OTE_RLS 0x01237 238/* INT Mask Registers */239#define CS35L35_INT1_CRIT_MASK 0x38240#define CS35L35_INT2_CRIT_MASK 0xEF241#define CS35L35_INT3_CRIT_MASK 0xEE242#define CS35L35_INT4_CRIT_MASK 0xFF243 244/* PDN DONE Masks */245#define CS35L35_M_PDN_DONE_SHIFT 4246#define CS35L35_M_PDN_DONE_MASK 0x10247 248/* CS35L35_INT_1 */249#define CS35L35_CAL_ERR 0x80250#define CS35L35_OTP_ERR 0x40251#define CS35L35_LRCLK_ERR 0x20252#define CS35L35_SPCLK_ERR 0x10253#define CS35L35_MCLK_ERR 0x08254#define CS35L35_AMP_SHORT 0x04255#define CS35L35_OTW 0x02256#define CS35L35_OTE 0x01257 258/* CS35L35_INT_2 */259#define CS35L35_PDN_DONE 0x10260#define CS35L35_VPBR_ERR 0x02261#define CS35L35_VPBR_CLR 0x01262 263/* CS35L35_INT_3 */264#define CS35L35_BST_HIGH 0x10265#define CS35L35_BST_HIGH_FLAG 0x08266#define CS35L35_BST_IPK_FLAG 0x04267#define CS35L35_LBST_SHORT 0x01268 269/* CS35L35_INT_4 */270#define CS35L35_VMON_OVFL 0x08271#define CS35L35_IMON_OVFL 0x04272 273#define CS35L35_FORMATS (SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S16_LE | \274 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)275 276struct cs35l35_private {277 struct device *dev;278 struct cs35l35_platform_data pdata;279 struct regmap *regmap;280 struct regulator_bulk_data supplies[2];281 int num_supplies;282 int sysclk;283 int sclk;284 bool pdm_mode;285 bool i2s_mode;286 bool clock_consumer;287 /* GPIO for /RST */288 struct gpio_desc *reset_gpio;289 struct completion pdn_done;290};291 292static const char * const cs35l35_supplies[] = {293 "VA",294 "VP",295};296 297#endif298