1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * CS42L43 core driver 4 * 5 * Copyright (C) 2022-2023 Cirrus Logic, Inc. and 6 * Cirrus Logic International Semiconductor Ltd. 7 */ 8 9 #include <linux/bitops.h> 10 #include <linux/build_bug.h> 11 #include <linux/delay.h> 12 #include <linux/err.h> 13 #include <linux/errno.h> 14 #include <linux/firmware.h> 15 #include <linux/jiffies.h> 16 #include <linux/mfd/core.h> 17 #include <linux/mfd/cs42l43-regs.h> 18 #include <linux/module.h> 19 #include <linux/pm_runtime.h> 20 #include <linux/soundwire/sdw.h> 21 22 #include "cs42l43.h" 23 24 #define CS42L43_RESET_DELAY 20 25 26 #define CS42L43_SDW_ATTACH_TIMEOUT 500 27 #define CS42L43_SDW_DETACH_TIMEOUT 100 28 29 #define CS42L43_MCU_BOOT_STAGE1 1 30 #define CS42L43_MCU_BOOT_STAGE2 2 31 #define CS42L43_MCU_BOOT_STAGE3 3 32 #define CS42L43_MCU_BOOT_STAGE4 4 33 #define CS42L43_MCU_POLL 5000 34 #define CS42L43_MCU_CMD_TIMEOUT 20000 35 #define CS42L43_MCU_UPDATE_FORMAT 3 36 #define CS42L43_MCU_UPDATE_OFFSET 0x100000 37 #define CS42L43_MCU_UPDATE_TIMEOUT 500000 38 #define CS42L43_MCU_UPDATE_RETRIES 5 39 40 #define CS42L43_MCU_SUPPORTED_REV 0x2105 41 #define CS42L43_MCU_SHADOW_REGS_REQUIRED_REV 0x2200 42 #define CS42L43_MCU_SUPPORTED_BIOS_REV 0x0001 43 44 #define CS42L43_VDDP_DELAY 50 45 #define CS42L43_VDDD_DELAY 1000 46 47 #define CS42L43_AUTOSUSPEND_TIME 250 48 49 struct cs42l43_patch_header { 50 __le16 version; 51 __le16 size; 52 u8 reserved; 53 u8 secure; 54 __le16 bss_size; 55 __le32 apply_addr; 56 __le32 checksum; 57 __le32 sha; 58 __le16 swrev; 59 __le16 patchid; 60 __le16 ipxid; 61 __le16 romver; 62 __le32 load_addr; 63 } __packed; 64 65 static const struct reg_sequence cs42l43_reva_patch[] = { 66 { 0x4000, 0x00000055 }, 67 { 0x4000, 0x000000AA }, 68 { 0x10084, 0x00000000 }, 69 { 0x1741C, 0x00CD2000 }, 70 { 0x1718C, 0x00000003 }, 71 { 0x4000, 0x00000000 }, 72 { CS42L43_CCM_BLK_CLK_CONTROL, 0x00000002 }, 73 { CS42L43_HPPATHVOL, 0x011B011B }, 74 { CS42L43_OSC_DIV_SEL, 0x00000001 }, 75 { CS42L43_DACCNFG2, 0x00000005 }, 76 { CS42L43_MIC_DETECT_CONTROL_ANDROID, 0x80790079 }, 77 { CS42L43_RELID, 0x0000000F }, 78 }; 79 80 const struct reg_default cs42l43_reg_default[CS42L43_N_DEFAULTS] = { 81 { CS42L43_DRV_CTRL1, 0x000186C0 }, 82 { CS42L43_DRV_CTRL3, 0x286DB018 }, 83 { CS42L43_DRV_CTRL4, 0x000006D8 }, 84 { CS42L43_DRV_CTRL_5, 0x136C00C0 }, 85 { CS42L43_GPIO_CTRL1, 0x00000707 }, 86 { CS42L43_GPIO_CTRL2, 0x00000000 }, 87 { CS42L43_GPIO_FN_SEL, 0x00000000 }, 88 { CS42L43_MCLK_SRC_SEL, 0x00000000 }, 89 { CS42L43_SAMPLE_RATE1, 0x00000003 }, 90 { CS42L43_SAMPLE_RATE2, 0x00000003 }, 91 { CS42L43_SAMPLE_RATE3, 0x00000003 }, 92 { CS42L43_SAMPLE_RATE4, 0x00000003 }, 93 { CS42L43_PLL_CONTROL, 0x00000000 }, 94 { CS42L43_FS_SELECT1, 0x00000000 }, 95 { CS42L43_FS_SELECT2, 0x00000000 }, 96 { CS42L43_FS_SELECT3, 0x00000000 }, 97 { CS42L43_FS_SELECT4, 0x00000000 }, 98 { CS42L43_PDM_CONTROL, 0x00000000 }, 99 { CS42L43_ASP_CLK_CONFIG1, 0x00010001 }, 100 { CS42L43_ASP_CLK_CONFIG2, 0x00000000 }, 101 { CS42L43_OSC_DIV_SEL, 0x00000001 }, 102 { CS42L43_ADC_B_CTRL1, 0x00000000 }, 103 { CS42L43_ADC_B_CTRL2, 0x00000000 }, 104 { CS42L43_DECIM_HPF_WNF_CTRL1, 0x00000001 }, 105 { CS42L43_DECIM_HPF_WNF_CTRL2, 0x00000001 }, 106 { CS42L43_DECIM_HPF_WNF_CTRL3, 0x00000001 }, 107 { CS42L43_DECIM_HPF_WNF_CTRL4, 0x00000001 }, 108 { CS42L43_DMIC_PDM_CTRL, 0x00000000 }, 109 { CS42L43_DECIM_VOL_CTRL_CH1_CH2, 0x20122012 }, 110 { CS42L43_DECIM_VOL_CTRL_CH3_CH4, 0x20122012 }, 111 { CS42L43_INTP_VOLUME_CTRL1, 0x00000180 }, 112 { CS42L43_INTP_VOLUME_CTRL2, 0x00000180 }, 113 { CS42L43_AMP1_2_VOL_RAMP, 0x00000022 }, 114 { CS42L43_ASP_CTRL, 0x00000004 }, 115 { CS42L43_ASP_FSYNC_CTRL1, 0x000000FA }, 116 { CS42L43_ASP_FSYNC_CTRL2, 0x00000001 }, 117 { CS42L43_ASP_FSYNC_CTRL3, 0x00000000 }, 118 { CS42L43_ASP_FSYNC_CTRL4, 0x000001F4 }, 119 { CS42L43_ASP_DATA_CTRL, 0x0000003A }, 120 { CS42L43_ASP_RX_EN, 0x00000000 }, 121 { CS42L43_ASP_TX_EN, 0x00000000 }, 122 { CS42L43_ASP_RX_CH1_CTRL, 0x00170001 }, 123 { CS42L43_ASP_RX_CH2_CTRL, 0x00170031 }, 124 { CS42L43_ASP_RX_CH3_CTRL, 0x00170061 }, 125 { CS42L43_ASP_RX_CH4_CTRL, 0x00170091 }, 126 { CS42L43_ASP_RX_CH5_CTRL, 0x001700C1 }, 127 { CS42L43_ASP_RX_CH6_CTRL, 0x001700F1 }, 128 { CS42L43_ASP_TX_CH1_CTRL, 0x00170001 }, 129 { CS42L43_ASP_TX_CH2_CTRL, 0x00170031 }, 130 { CS42L43_ASP_TX_CH3_CTRL, 0x00170061 }, 131 { CS42L43_ASP_TX_CH4_CTRL, 0x00170091 }, 132 { CS42L43_ASP_TX_CH5_CTRL, 0x001700C1 }, 133 { CS42L43_ASP_TX_CH6_CTRL, 0x001700F1 }, 134 { CS42L43_ASPTX1_INPUT, 0x00800000 }, 135 { CS42L43_ASPTX2_INPUT, 0x00800000 }, 136 { CS42L43_ASPTX3_INPUT, 0x00800000 }, 137 { CS42L43_ASPTX4_INPUT, 0x00800000 }, 138 { CS42L43_ASPTX5_INPUT, 0x00800000 }, 139 { CS42L43_ASPTX6_INPUT, 0x00800000 }, 140 { CS42L43_SWIRE_DP1_CH1_INPUT, 0x00800000 }, 141 { CS42L43_SWIRE_DP1_CH2_INPUT, 0x00800000 }, 142 { CS42L43_SWIRE_DP1_CH3_INPUT, 0x00800000 }, 143 { CS42L43_SWIRE_DP1_CH4_INPUT, 0x00800000 }, 144 { CS42L43_SWIRE_DP2_CH1_INPUT, 0x00800000 }, 145 { CS42L43_SWIRE_DP2_CH2_INPUT, 0x00800000 }, 146 { CS42L43_SWIRE_DP3_CH1_INPUT, 0x00800000 }, 147 { CS42L43_SWIRE_DP3_CH2_INPUT, 0x00800000 }, 148 { CS42L43_SWIRE_DP4_CH1_INPUT, 0x00800000 }, 149 { CS42L43_SWIRE_DP4_CH2_INPUT, 0x00800000 }, 150 { CS42L43_ASRC_INT1_INPUT1, 0x00800000 }, 151 { CS42L43_ASRC_INT2_INPUT1, 0x00800000 }, 152 { CS42L43_ASRC_INT3_INPUT1, 0x00800000 }, 153 { CS42L43_ASRC_INT4_INPUT1, 0x00800000 }, 154 { CS42L43_ASRC_DEC1_INPUT1, 0x00800000 }, 155 { CS42L43_ASRC_DEC2_INPUT1, 0x00800000 }, 156 { CS42L43_ASRC_DEC3_INPUT1, 0x00800000 }, 157 { CS42L43_ASRC_DEC4_INPUT1, 0x00800000 }, 158 { CS42L43_ISRC1INT1_INPUT1, 0x00800000 }, 159 { CS42L43_ISRC1INT2_INPUT1, 0x00800000 }, 160 { CS42L43_ISRC1DEC1_INPUT1, 0x00800000 }, 161 { CS42L43_ISRC1DEC2_INPUT1, 0x00800000 }, 162 { CS42L43_ISRC2INT1_INPUT1, 0x00800000 }, 163 { CS42L43_ISRC2INT2_INPUT1, 0x00800000 }, 164 { CS42L43_ISRC2DEC1_INPUT1, 0x00800000 }, 165 { CS42L43_ISRC2DEC2_INPUT1, 0x00800000 }, 166 { CS42L43_EQ1MIX_INPUT1, 0x00800000 }, 167 { CS42L43_EQ1MIX_INPUT2, 0x00800000 }, 168 { CS42L43_EQ1MIX_INPUT3, 0x00800000 }, 169 { CS42L43_EQ1MIX_INPUT4, 0x00800000 }, 170 { CS42L43_EQ2MIX_INPUT1, 0x00800000 }, 171 { CS42L43_EQ2MIX_INPUT2, 0x00800000 }, 172 { CS42L43_EQ2MIX_INPUT3, 0x00800000 }, 173 { CS42L43_EQ2MIX_INPUT4, 0x00800000 }, 174 { CS42L43_SPDIF1_INPUT1, 0x00800000 }, 175 { CS42L43_SPDIF2_INPUT1, 0x00800000 }, 176 { CS42L43_AMP1MIX_INPUT1, 0x00800000 }, 177 { CS42L43_AMP1MIX_INPUT2, 0x00800000 }, 178 { CS42L43_AMP1MIX_INPUT3, 0x00800000 }, 179 { CS42L43_AMP1MIX_INPUT4, 0x00800000 }, 180 { CS42L43_AMP2MIX_INPUT1, 0x00800000 }, 181 { CS42L43_AMP2MIX_INPUT2, 0x00800000 }, 182 { CS42L43_AMP2MIX_INPUT3, 0x00800000 }, 183 { CS42L43_AMP2MIX_INPUT4, 0x00800000 }, 184 { CS42L43_AMP3MIX_INPUT1, 0x00800000 }, 185 { CS42L43_AMP3MIX_INPUT2, 0x00800000 }, 186 { CS42L43_AMP3MIX_INPUT3, 0x00800000 }, 187 { CS42L43_AMP3MIX_INPUT4, 0x00800000 }, 188 { CS42L43_AMP4MIX_INPUT1, 0x00800000 }, 189 { CS42L43_AMP4MIX_INPUT2, 0x00800000 }, 190 { CS42L43_AMP4MIX_INPUT3, 0x00800000 }, 191 { CS42L43_AMP4MIX_INPUT4, 0x00800000 }, 192 { CS42L43_ASRC_INT_ENABLES, 0x00000100 }, 193 { CS42L43_ASRC_DEC_ENABLES, 0x00000100 }, 194 { CS42L43_PDNCNTL, 0x00000000 }, 195 { CS42L43_RINGSENSE_DEB_CTRL, 0x0000001B }, 196 { CS42L43_TIPSENSE_DEB_CTRL, 0x0000001B }, 197 { CS42L43_HS2, 0x050106F3 }, 198 { CS42L43_STEREO_MIC_CTRL, 0x00000000 }, 199 { CS42L43_STEREO_MIC_CLAMP_CTRL, 0x00000001 }, 200 { CS42L43_BLOCK_EN2, 0x00000000 }, 201 { CS42L43_BLOCK_EN3, 0x00000000 }, 202 { CS42L43_BLOCK_EN4, 0x00000000 }, 203 { CS42L43_BLOCK_EN5, 0x00000000 }, 204 { CS42L43_BLOCK_EN6, 0x00000000 }, 205 { CS42L43_BLOCK_EN7, 0x00000000 }, 206 { CS42L43_BLOCK_EN8, 0x00000000 }, 207 { CS42L43_BLOCK_EN9, 0x00000000 }, 208 { CS42L43_BLOCK_EN10, 0x00000000 }, 209 { CS42L43_BLOCK_EN11, 0x00000000 }, 210 { CS42L43_TONE_CH1_CTRL, 0x00000000 }, 211 { CS42L43_TONE_CH2_CTRL, 0x00000000 }, 212 { CS42L43_MIC_DETECT_CONTROL_1, 0x00000003 }, 213 { CS42L43_HS_BIAS_SENSE_AND_CLAMP_AUTOCONTROL, 0x02000003 }, 214 { CS42L43_MIC_DETECT_CONTROL_ANDROID, 0x80790079 }, 215 { CS42L43_ISRC1_CTRL, 0x00000000 }, 216 { CS42L43_ISRC2_CTRL, 0x00000000 }, 217 { CS42L43_CTRL_REG, 0x00000006 }, 218 { CS42L43_FDIV_FRAC, 0x40000000 }, 219 { CS42L43_CAL_RATIO, 0x00000080 }, 220 { CS42L43_SPI_CLK_CONFIG1, 0x00000000 }, 221 { CS42L43_SPI_CONFIG1, 0x00000000 }, 222 { CS42L43_SPI_CONFIG2, 0x00000000 }, 223 { CS42L43_SPI_CONFIG3, 0x00000001 }, 224 { CS42L43_SPI_CONFIG4, 0x00000000 }, 225 { CS42L43_TRAN_CONFIG3, 0x00000000 }, 226 { CS42L43_TRAN_CONFIG4, 0x00000000 }, 227 { CS42L43_TRAN_CONFIG5, 0x00000000 }, 228 { CS42L43_TRAN_CONFIG6, 0x00000000 }, 229 { CS42L43_TRAN_CONFIG7, 0x00000000 }, 230 { CS42L43_TRAN_CONFIG8, 0x00000000 }, 231 { CS42L43_DACCNFG1, 0x00000008 }, 232 { CS42L43_DACCNFG2, 0x00000005 }, 233 { CS42L43_HPPATHVOL, 0x011B011B }, 234 { CS42L43_PGAVOL, 0x00003470 }, 235 { CS42L43_LOADDETENA, 0x00000000 }, 236 { CS42L43_CTRL, 0x00000037 }, 237 { CS42L43_COEFF_DATA_IN0, 0x00000000 }, 238 { CS42L43_COEFF_RD_WR0, 0x00000000 }, 239 { CS42L43_START_EQZ0, 0x00000000 }, 240 { CS42L43_MUTE_EQ_IN0, 0x00000000 }, 241 { CS42L43_DECIM_MASK, 0x0000000F }, 242 { CS42L43_EQ_MIX_MASK, 0x0000000F }, 243 { CS42L43_ASP_MASK, 0x000000FF }, 244 { CS42L43_PLL_MASK, 0x00000003 }, 245 { CS42L43_SOFT_MASK, 0x0000FFFF }, 246 { CS42L43_SWIRE_MASK, 0x00007FFF }, 247 { CS42L43_MSM_MASK, 0x00000FFF }, 248 { CS42L43_ACC_DET_MASK, 0x00000FFF }, 249 { CS42L43_I2C_TGT_MASK, 0x00000003 }, 250 { CS42L43_SPI_MSTR_MASK, 0x00000007 }, 251 { CS42L43_SW_TO_SPI_BRIDGE_MASK, 0x00000001 }, 252 { CS42L43_OTP_MASK, 0x00000007 }, 253 { CS42L43_CLASS_D_AMP_MASK, 0x00003FFF }, 254 { CS42L43_GPIO_INT_MASK, 0x0000003F }, 255 { CS42L43_ASRC_MASK, 0x0000000F }, 256 { CS42L43_HPOUT_MASK, 0x00000003 }, 257 }; 258 EXPORT_SYMBOL_NS_GPL(cs42l43_reg_default, MFD_CS42L43); 259 260 bool cs42l43_readable_register(struct device *dev, unsigned int reg) 261 { 262 switch (reg) { 263 case CS42L43_DEVID: 264 case CS42L43_REVID: 265 case CS42L43_RELID: 266 case CS42L43_SFT_RESET: 267 case CS42L43_DRV_CTRL1: 268 case CS42L43_DRV_CTRL3: 269 case CS42L43_DRV_CTRL4: 270 case CS42L43_DRV_CTRL_5: 271 case CS42L43_GPIO_CTRL1: 272 case CS42L43_GPIO_CTRL2: 273 case CS42L43_GPIO_STS: 274 case CS42L43_GPIO_FN_SEL: 275 case CS42L43_MCLK_SRC_SEL: 276 case CS42L43_SAMPLE_RATE1 ... CS42L43_SAMPLE_RATE4: 277 case CS42L43_PLL_CONTROL: 278 case CS42L43_FS_SELECT1 ... CS42L43_FS_SELECT4: 279 case CS42L43_PDM_CONTROL: 280 case CS42L43_ASP_CLK_CONFIG1 ... CS42L43_ASP_CLK_CONFIG2: 281 case CS42L43_OSC_DIV_SEL: 282 case CS42L43_ADC_B_CTRL1 ... CS42L43_ADC_B_CTRL2: 283 case CS42L43_DECIM_HPF_WNF_CTRL1 ... CS42L43_DECIM_HPF_WNF_CTRL4: 284 case CS42L43_DMIC_PDM_CTRL: 285 case CS42L43_DECIM_VOL_CTRL_CH1_CH2 ... CS42L43_DECIM_VOL_CTRL_CH3_CH4: 286 case CS42L43_INTP_VOLUME_CTRL1 ... CS42L43_INTP_VOLUME_CTRL2: 287 case CS42L43_AMP1_2_VOL_RAMP: 288 case CS42L43_ASP_CTRL: 289 case CS42L43_ASP_FSYNC_CTRL1 ... CS42L43_ASP_FSYNC_CTRL4: 290 case CS42L43_ASP_DATA_CTRL: 291 case CS42L43_ASP_RX_EN ... CS42L43_ASP_TX_EN: 292 case CS42L43_ASP_RX_CH1_CTRL ... CS42L43_ASP_RX_CH6_CTRL: 293 case CS42L43_ASP_TX_CH1_CTRL ... CS42L43_ASP_TX_CH6_CTRL: 294 case CS42L43_OTP_REVISION_ID: 295 case CS42L43_ASPTX1_INPUT: 296 case CS42L43_ASPTX2_INPUT: 297 case CS42L43_ASPTX3_INPUT: 298 case CS42L43_ASPTX4_INPUT: 299 case CS42L43_ASPTX5_INPUT: 300 case CS42L43_ASPTX6_INPUT: 301 case CS42L43_SWIRE_DP1_CH1_INPUT: 302 case CS42L43_SWIRE_DP1_CH2_INPUT: 303 case CS42L43_SWIRE_DP1_CH3_INPUT: 304 case CS42L43_SWIRE_DP1_CH4_INPUT: 305 case CS42L43_SWIRE_DP2_CH1_INPUT: 306 case CS42L43_SWIRE_DP2_CH2_INPUT: 307 case CS42L43_SWIRE_DP3_CH1_INPUT: 308 case CS42L43_SWIRE_DP3_CH2_INPUT: 309 case CS42L43_SWIRE_DP4_CH1_INPUT: 310 case CS42L43_SWIRE_DP4_CH2_INPUT: 311 case CS42L43_ASRC_INT1_INPUT1: 312 case CS42L43_ASRC_INT2_INPUT1: 313 case CS42L43_ASRC_INT3_INPUT1: 314 case CS42L43_ASRC_INT4_INPUT1: 315 case CS42L43_ASRC_DEC1_INPUT1: 316 case CS42L43_ASRC_DEC2_INPUT1: 317 case CS42L43_ASRC_DEC3_INPUT1: 318 case CS42L43_ASRC_DEC4_INPUT1: 319 case CS42L43_ISRC1INT1_INPUT1: 320 case CS42L43_ISRC1INT2_INPUT1: 321 case CS42L43_ISRC1DEC1_INPUT1: 322 case CS42L43_ISRC1DEC2_INPUT1: 323 case CS42L43_ISRC2INT1_INPUT1: 324 case CS42L43_ISRC2INT2_INPUT1: 325 case CS42L43_ISRC2DEC1_INPUT1: 326 case CS42L43_ISRC2DEC2_INPUT1: 327 case CS42L43_EQ1MIX_INPUT1 ... CS42L43_EQ1MIX_INPUT4: 328 case CS42L43_EQ2MIX_INPUT1 ... CS42L43_EQ2MIX_INPUT4: 329 case CS42L43_SPDIF1_INPUT1: 330 case CS42L43_SPDIF2_INPUT1: 331 case CS42L43_AMP1MIX_INPUT1 ... CS42L43_AMP1MIX_INPUT4: 332 case CS42L43_AMP2MIX_INPUT1 ... CS42L43_AMP2MIX_INPUT4: 333 case CS42L43_AMP3MIX_INPUT1 ... CS42L43_AMP3MIX_INPUT4: 334 case CS42L43_AMP4MIX_INPUT1 ... CS42L43_AMP4MIX_INPUT4: 335 case CS42L43_ASRC_INT_ENABLES ... CS42L43_ASRC_DEC_ENABLES: 336 case CS42L43_PDNCNTL: 337 case CS42L43_RINGSENSE_DEB_CTRL: 338 case CS42L43_TIPSENSE_DEB_CTRL: 339 case CS42L43_TIP_RING_SENSE_INTERRUPT_STATUS: 340 case CS42L43_HS2: 341 case CS42L43_HS_STAT: 342 case CS42L43_MCU_SW_INTERRUPT: 343 case CS42L43_STEREO_MIC_CTRL: 344 case CS42L43_STEREO_MIC_CLAMP_CTRL: 345 case CS42L43_BLOCK_EN2 ... CS42L43_BLOCK_EN11: 346 case CS42L43_TONE_CH1_CTRL ... CS42L43_TONE_CH2_CTRL: 347 case CS42L43_MIC_DETECT_CONTROL_1: 348 case CS42L43_DETECT_STATUS_1: 349 case CS42L43_HS_BIAS_SENSE_AND_CLAMP_AUTOCONTROL: 350 case CS42L43_MIC_DETECT_CONTROL_ANDROID: 351 case CS42L43_ISRC1_CTRL: 352 case CS42L43_ISRC2_CTRL: 353 case CS42L43_CTRL_REG: 354 case CS42L43_FDIV_FRAC: 355 case CS42L43_CAL_RATIO: 356 case CS42L43_SPI_CLK_CONFIG1: 357 case CS42L43_SPI_CONFIG1 ... CS42L43_SPI_CONFIG4: 358 case CS42L43_SPI_STATUS1 ... CS42L43_SPI_STATUS2: 359 case CS42L43_TRAN_CONFIG1 ... CS42L43_TRAN_CONFIG8: 360 case CS42L43_TRAN_STATUS1 ... CS42L43_TRAN_STATUS3: 361 case CS42L43_TX_DATA: 362 case CS42L43_RX_DATA: 363 case CS42L43_DACCNFG1 ... CS42L43_DACCNFG2: 364 case CS42L43_HPPATHVOL: 365 case CS42L43_PGAVOL: 366 case CS42L43_LOADDETRESULTS: 367 case CS42L43_LOADDETENA: 368 case CS42L43_CTRL: 369 case CS42L43_COEFF_DATA_IN0: 370 case CS42L43_COEFF_RD_WR0: 371 case CS42L43_INIT_DONE0: 372 case CS42L43_START_EQZ0: 373 case CS42L43_MUTE_EQ_IN0: 374 case CS42L43_DECIM_INT ... CS42L43_HPOUT_INT: 375 case CS42L43_DECIM_MASK ... CS42L43_HPOUT_MASK: 376 case CS42L43_DECIM_INT_SHADOW ... CS42L43_HP_OUT_SHADOW: 377 case CS42L43_BOOT_CONTROL: 378 case CS42L43_BLOCK_EN: 379 case CS42L43_SHUTTER_CONTROL: 380 case CS42L43_MCU_SW_REV ... CS42L43_MCU_RAM_MAX: 381 return true; 382 default: 383 return false; 384 } 385 } 386 EXPORT_SYMBOL_NS_GPL(cs42l43_readable_register, MFD_CS42L43); 387 388 bool cs42l43_precious_register(struct device *dev, unsigned int reg) 389 { 390 switch (reg) { 391 case CS42L43_SFT_RESET: 392 case CS42L43_TX_DATA: 393 case CS42L43_RX_DATA: 394 case CS42L43_DECIM_INT ... CS42L43_HPOUT_INT: 395 case CS42L43_MCU_SW_REV ... CS42L43_MCU_RAM_MAX: 396 return true; 397 default: 398 return false; 399 } 400 } 401 EXPORT_SYMBOL_NS_GPL(cs42l43_precious_register, MFD_CS42L43); 402 403 bool cs42l43_volatile_register(struct device *dev, unsigned int reg) 404 { 405 switch (reg) { 406 case CS42L43_DEVID: 407 case CS42L43_REVID: 408 case CS42L43_RELID: 409 case CS42L43_GPIO_STS: 410 case CS42L43_OTP_REVISION_ID: 411 case CS42L43_TIP_RING_SENSE_INTERRUPT_STATUS: 412 case CS42L43_HS_STAT: 413 case CS42L43_MCU_SW_INTERRUPT: 414 case CS42L43_DETECT_STATUS_1: 415 case CS42L43_SPI_STATUS1 ... CS42L43_SPI_STATUS2: 416 case CS42L43_TRAN_CONFIG1 ... CS42L43_TRAN_CONFIG2: 417 case CS42L43_TRAN_CONFIG8: 418 case CS42L43_TRAN_STATUS1 ... CS42L43_TRAN_STATUS3: 419 case CS42L43_LOADDETRESULTS: 420 case CS42L43_INIT_DONE0: 421 case CS42L43_DECIM_INT_SHADOW ... CS42L43_HP_OUT_SHADOW: 422 case CS42L43_BOOT_CONTROL: 423 case CS42L43_BLOCK_EN: 424 return true; 425 default: 426 return cs42l43_precious_register(dev, reg); 427 } 428 } 429 EXPORT_SYMBOL_NS_GPL(cs42l43_volatile_register, MFD_CS42L43); 430 431 #define CS42L43_IRQ_OFFSET(reg) ((CS42L43_##reg##_INT) - CS42L43_DECIM_INT) 432 433 #define CS42L43_IRQ_REG(name, reg) REGMAP_IRQ_REG(CS42L43_##name, \ 434 CS42L43_IRQ_OFFSET(reg), \ 435 CS42L43_##name##_INT_MASK) 436 437 static const struct regmap_irq cs42l43_regmap_irqs[] = { 438 CS42L43_IRQ_REG(PLL_LOST_LOCK, PLL), 439 CS42L43_IRQ_REG(PLL_READY, PLL), 440 441 CS42L43_IRQ_REG(HP_STARTUP_DONE, MSM), 442 CS42L43_IRQ_REG(HP_SHUTDOWN_DONE, MSM), 443 CS42L43_IRQ_REG(HSDET_DONE, MSM), 444 CS42L43_IRQ_REG(TIPSENSE_UNPLUG_DB, MSM), 445 CS42L43_IRQ_REG(TIPSENSE_PLUG_DB, MSM), 446 CS42L43_IRQ_REG(RINGSENSE_UNPLUG_DB, MSM), 447 CS42L43_IRQ_REG(RINGSENSE_PLUG_DB, MSM), 448 CS42L43_IRQ_REG(TIPSENSE_UNPLUG_PDET, MSM), 449 CS42L43_IRQ_REG(TIPSENSE_PLUG_PDET, MSM), 450 CS42L43_IRQ_REG(RINGSENSE_UNPLUG_PDET, MSM), 451 CS42L43_IRQ_REG(RINGSENSE_PLUG_PDET, MSM), 452 453 CS42L43_IRQ_REG(HS2_BIAS_SENSE, ACC_DET), 454 CS42L43_IRQ_REG(HS1_BIAS_SENSE, ACC_DET), 455 CS42L43_IRQ_REG(DC_DETECT1_FALSE, ACC_DET), 456 CS42L43_IRQ_REG(DC_DETECT1_TRUE, ACC_DET), 457 CS42L43_IRQ_REG(HSBIAS_CLAMPED, ACC_DET), 458 CS42L43_IRQ_REG(HS3_4_BIAS_SENSE, ACC_DET), 459 460 CS42L43_IRQ_REG(AMP2_CLK_STOP_FAULT, CLASS_D_AMP), 461 CS42L43_IRQ_REG(AMP1_CLK_STOP_FAULT, CLASS_D_AMP), 462 CS42L43_IRQ_REG(AMP2_VDDSPK_FAULT, CLASS_D_AMP), 463 CS42L43_IRQ_REG(AMP1_VDDSPK_FAULT, CLASS_D_AMP), 464 CS42L43_IRQ_REG(AMP2_SHUTDOWN_DONE, CLASS_D_AMP), 465 CS42L43_IRQ_REG(AMP1_SHUTDOWN_DONE, CLASS_D_AMP), 466 CS42L43_IRQ_REG(AMP2_STARTUP_DONE, CLASS_D_AMP), 467 CS42L43_IRQ_REG(AMP1_STARTUP_DONE, CLASS_D_AMP), 468 CS42L43_IRQ_REG(AMP2_THERM_SHDN, CLASS_D_AMP), 469 CS42L43_IRQ_REG(AMP1_THERM_SHDN, CLASS_D_AMP), 470 CS42L43_IRQ_REG(AMP2_THERM_WARN, CLASS_D_AMP), 471 CS42L43_IRQ_REG(AMP1_THERM_WARN, CLASS_D_AMP), 472 CS42L43_IRQ_REG(AMP2_SCDET, CLASS_D_AMP), 473 CS42L43_IRQ_REG(AMP1_SCDET, CLASS_D_AMP), 474 475 CS42L43_IRQ_REG(GPIO3_FALL, GPIO), 476 CS42L43_IRQ_REG(GPIO3_RISE, GPIO), 477 CS42L43_IRQ_REG(GPIO2_FALL, GPIO), 478 CS42L43_IRQ_REG(GPIO2_RISE, GPIO), 479 CS42L43_IRQ_REG(GPIO1_FALL, GPIO), 480 CS42L43_IRQ_REG(GPIO1_RISE, GPIO), 481 482 CS42L43_IRQ_REG(HP_ILIMIT, HPOUT), 483 CS42L43_IRQ_REG(HP_LOADDET_DONE, HPOUT), 484 }; 485 486 static const struct regmap_irq_chip cs42l43_irq_chip = { 487 .name = "cs42l43", 488 489 .status_base = CS42L43_DECIM_INT, 490 .mask_base = CS42L43_DECIM_MASK, 491 .num_regs = 16, 492 493 .irqs = cs42l43_regmap_irqs, 494 .num_irqs = ARRAY_SIZE(cs42l43_regmap_irqs), 495 496 .runtime_pm = true, 497 }; 498 499 static const char * const cs42l43_core_supplies[] = { 500 "vdd-a", "vdd-io", "vdd-cp", 501 }; 502 503 static const char * const cs42l43_parent_supplies[] = { "vdd-amp" }; 504 505 static const struct mfd_cell cs42l43_devs[] = { 506 { .name = "cs42l43-pinctrl", }, 507 { .name = "cs42l43-spi", }, 508 { 509 .name = "cs42l43-codec", 510 .parent_supplies = cs42l43_parent_supplies, 511 .num_parent_supplies = ARRAY_SIZE(cs42l43_parent_supplies), 512 }, 513 }; 514 515 /* 516 * If the device is connected over Soundwire, as well as soft resetting the 517 * device, this function will also way for the device to detach from the bus 518 * before returning. 519 */ 520 static int cs42l43_soft_reset(struct cs42l43 *cs42l43) 521 { 522 static const struct reg_sequence reset[] = { 523 { CS42L43_SFT_RESET, CS42L43_SFT_RESET_VAL }, 524 }; 525 526 reinit_completion(&cs42l43->device_detach); 527 528 /* 529 * Apply cache only because the soft reset will cause the device to 530 * detach from the soundwire bus. 531 */ 532 regcache_cache_only(cs42l43->regmap, true); 533 regmap_multi_reg_write_bypassed(cs42l43->regmap, reset, ARRAY_SIZE(reset)); 534 535 msleep(CS42L43_RESET_DELAY); 536 537 if (cs42l43->sdw) { 538 unsigned long timeout = msecs_to_jiffies(CS42L43_SDW_DETACH_TIMEOUT); 539 unsigned long time; 540 541 time = wait_for_completion_timeout(&cs42l43->device_detach, timeout); 542 if (!time) { 543 dev_err(cs42l43->dev, "Timed out waiting for device detach\n"); 544 return -ETIMEDOUT; 545 } 546 } 547 548 return -EAGAIN; 549 } 550 551 /* 552 * This function is essentially a no-op on I2C, but will wait for the device to 553 * attach when the device is used on a SoundWire bus. 554 */ 555 static int cs42l43_wait_for_attach(struct cs42l43 *cs42l43) 556 { 557 if (!cs42l43->attached) { 558 unsigned long timeout = msecs_to_jiffies(CS42L43_SDW_ATTACH_TIMEOUT); 559 unsigned long time; 560 561 time = wait_for_completion_timeout(&cs42l43->device_attach, timeout); 562 if (!time) { 563 dev_err(cs42l43->dev, "Timed out waiting for device re-attach\n"); 564 return -ETIMEDOUT; 565 } 566 } 567 568 regcache_cache_only(cs42l43->regmap, false); 569 570 /* The hardware requires enabling OSC_DIV before doing any SoundWire reads. */ 571 if (cs42l43->sdw) 572 regmap_write(cs42l43->regmap, CS42L43_OSC_DIV_SEL, 573 CS42L43_OSC_DIV2_EN_MASK); 574 575 return 0; 576 } 577 578 /* 579 * This function will advance the firmware into boot stage 3 from boot stage 2. 580 * Boot stage 3 is required to send commands to the firmware. This is achieved 581 * by setting the firmware NEED configuration register to zero, this indicates 582 * no configuration is required forcing the firmware to advance to boot stage 3. 583 * 584 * Later revisions of the firmware require the use of an alternative register 585 * for this purpose, which is indicated through the shadow flag. 586 */ 587 static int cs42l43_mcu_stage_2_3(struct cs42l43 *cs42l43, bool shadow) 588 { 589 unsigned int need_reg = CS42L43_NEED_CONFIGS; 590 unsigned int val; 591 int ret; 592 593 if (shadow) 594 need_reg = CS42L43_FW_SH_BOOT_CFG_NEED_CONFIGS; 595 596 regmap_write(cs42l43->regmap, need_reg, 0); 597 598 ret = regmap_read_poll_timeout(cs42l43->regmap, CS42L43_BOOT_STATUS, 599 val, (val == CS42L43_MCU_BOOT_STAGE3), 600 CS42L43_MCU_POLL, CS42L43_MCU_CMD_TIMEOUT); 601 if (ret) { 602 dev_err(cs42l43->dev, "Failed to move to stage 3: %d, 0x%x\n", ret, val); 603 return ret; 604 } 605 606 return -EAGAIN; 607 } 608 609 /* 610 * This function will return the firmware to boot stage 2 from boot stage 3. 611 * Boot stage 2 is required to apply updates to the firmware. This is achieved 612 * by setting the firmware NEED configuration register to FW_PATCH_NEED_CFG, 613 * setting the HAVE configuration register to 0, and soft resetting. The 614 * firmware will see it is missing a patch configuration and will pause in boot 615 * stage 2. 616 * 617 * Note: Unlike cs42l43_mcu_stage_2_3 there is no need to consider the shadow 618 * register here as the driver will only return to boot stage 2 if the firmware 619 * requires update which means the revision does not include shadow register 620 * support. 621 */ 622 static int cs42l43_mcu_stage_3_2(struct cs42l43 *cs42l43) 623 { 624 regmap_write(cs42l43->regmap, CS42L43_FW_MISSION_CTRL_NEED_CONFIGS, 625 CS42L43_FW_PATCH_NEED_CFG_MASK); 626 regmap_write(cs42l43->regmap, CS42L43_FW_MISSION_CTRL_HAVE_CONFIGS, 0); 627 628 return cs42l43_soft_reset(cs42l43); 629 } 630 631 /* 632 * Disable the firmware running on the device such that the driver can access 633 * the registers without fear of the MCU changing them under it. 634 */ 635 static int cs42l43_mcu_disable(struct cs42l43 *cs42l43) 636 { 637 unsigned int val; 638 int ret; 639 640 regmap_write(cs42l43->regmap, CS42L43_FW_MISSION_CTRL_MM_MCU_CFG_REG, 641 CS42L43_FW_MISSION_CTRL_MM_MCU_CFG_DISABLE_VAL); 642 regmap_write(cs42l43->regmap, CS42L43_FW_MISSION_CTRL_MM_CTRL_SELECTION, 643 CS42L43_FW_MM_CTRL_MCU_SEL_MASK); 644 regmap_write(cs42l43->regmap, CS42L43_MCU_SW_INTERRUPT, CS42L43_CONTROL_IND_MASK); 645 regmap_write(cs42l43->regmap, CS42L43_MCU_SW_INTERRUPT, 0); 646 647 ret = regmap_read_poll_timeout(cs42l43->regmap, CS42L43_SOFT_INT_SHADOW, val, 648 (val & CS42L43_CONTROL_APPLIED_INT_MASK), 649 CS42L43_MCU_POLL, CS42L43_MCU_CMD_TIMEOUT); 650 if (ret) { 651 dev_err(cs42l43->dev, "Failed to disable firmware: %d, 0x%x\n", ret, val); 652 return ret; 653 } 654 655 /* Soft reset to clear any register state the firmware left behind. */ 656 return cs42l43_soft_reset(cs42l43); 657 } 658 659 /* 660 * Callback to load firmware updates. 661 */ 662 static void cs42l43_mcu_load_firmware(const struct firmware *firmware, void *context) 663 { 664 struct cs42l43 *cs42l43 = context; 665 const struct cs42l43_patch_header *hdr; 666 unsigned int loadaddr, val; 667 int ret; 668 669 if (!firmware) { 670 dev_err(cs42l43->dev, "Failed to load firmware\n"); 671 cs42l43->firmware_error = -ENODEV; 672 goto err; 673 } 674 675 hdr = (const struct cs42l43_patch_header *)&firmware->data[0]; 676 loadaddr = le32_to_cpu(hdr->load_addr); 677 678 if (le16_to_cpu(hdr->version) != CS42L43_MCU_UPDATE_FORMAT) { 679 dev_err(cs42l43->dev, "Bad firmware file format: %d\n", hdr->version); 680 cs42l43->firmware_error = -EINVAL; 681 goto err_release; 682 } 683 684 regmap_write(cs42l43->regmap, CS42L43_PATCH_START_ADDR, loadaddr); 685 regmap_bulk_write(cs42l43->regmap, loadaddr + CS42L43_MCU_UPDATE_OFFSET, 686 &firmware->data[0], firmware->size / sizeof(u32)); 687 688 regmap_write(cs42l43->regmap, CS42L43_MCU_SW_INTERRUPT, CS42L43_PATCH_IND_MASK); 689 regmap_write(cs42l43->regmap, CS42L43_MCU_SW_INTERRUPT, 0); 690 691 ret = regmap_read_poll_timeout(cs42l43->regmap, CS42L43_SOFT_INT_SHADOW, val, 692 (val & CS42L43_PATCH_APPLIED_INT_MASK), 693 CS42L43_MCU_POLL, CS42L43_MCU_UPDATE_TIMEOUT); 694 if (ret) { 695 dev_err(cs42l43->dev, "Failed to update firmware: %d, 0x%x\n", ret, val); 696 cs42l43->firmware_error = ret; 697 goto err_release; 698 } 699 700 err_release: 701 release_firmware(firmware); 702 err: 703 complete(&cs42l43->firmware_download); 704 } 705 706 /* 707 * The process of updating the firmware is split into a series of steps, at the 708 * end of each step a soft reset of the device might be required which will 709 * require the driver to wait for the device to re-attach on the SoundWire bus, 710 * if that control bus is being used. 711 */ 712 static int cs42l43_mcu_update_step(struct cs42l43 *cs42l43) 713 { 714 unsigned int mcu_rev, bios_rev, boot_status, secure_cfg; 715 bool patched, shadow; 716 int ret; 717 718 /* Clear any stale software interrupt bits. */ 719 regmap_read(cs42l43->regmap, CS42L43_SOFT_INT, &mcu_rev); 720 721 ret = regmap_read(cs42l43->regmap, CS42L43_BOOT_STATUS, &boot_status); 722 if (ret) { 723 dev_err(cs42l43->dev, "Failed to read boot status: %d\n", ret); 724 return ret; 725 } 726 727 ret = regmap_read(cs42l43->regmap, CS42L43_MCU_SW_REV, &mcu_rev); 728 if (ret) { 729 dev_err(cs42l43->dev, "Failed to read firmware revision: %d\n", ret); 730 return ret; 731 } 732 733 bios_rev = (((mcu_rev & CS42L43_BIOS_MAJOR_REV_MASK) << 12) | 734 ((mcu_rev & CS42L43_BIOS_MINOR_REV_MASK) << 4) | 735 ((mcu_rev & CS42L43_BIOS_SUBMINOR_REV_MASK) >> 8)) >> 736 CS42L43_BIOS_MAJOR_REV_SHIFT; 737 mcu_rev = ((mcu_rev & CS42L43_FW_MAJOR_REV_MASK) << 12) | 738 ((mcu_rev & CS42L43_FW_MINOR_REV_MASK) << 4) | 739 ((mcu_rev & CS42L43_FW_SUBMINOR_REV_MASK) >> 8); 740 741 /* 742 * The firmware has two revision numbers bringing either of them up to a 743 * supported version will provide the features the driver requires. 744 */ 745 patched = mcu_rev >= CS42L43_MCU_SUPPORTED_REV || 746 bios_rev >= CS42L43_MCU_SUPPORTED_BIOS_REV; 747 /* 748 * Later versions of the firmwware require the driver to access some 749 * features through a set of shadow registers. 750 */ 751 shadow = mcu_rev >= CS42L43_MCU_SHADOW_REGS_REQUIRED_REV; 752 753 ret = regmap_read(cs42l43->regmap, CS42L43_BOOT_CONTROL, &secure_cfg); 754 if (ret) { 755 dev_err(cs42l43->dev, "Failed to read security settings: %d\n", ret); 756 return ret; 757 } 758 759 cs42l43->hw_lock = secure_cfg & CS42L43_LOCK_HW_STS_MASK; 760 761 if (!patched && cs42l43->hw_lock) { 762 dev_err(cs42l43->dev, "Unpatched secure device\n"); 763 return -EPERM; 764 } 765 766 dev_dbg(cs42l43->dev, "Firmware(0x%x, 0x%x) in boot stage %d\n", 767 mcu_rev, bios_rev, boot_status); 768 769 switch (boot_status) { 770 case CS42L43_MCU_BOOT_STAGE2: 771 if (!patched) { 772 ret = request_firmware_nowait(THIS_MODULE, FW_ACTION_UEVENT, 773 "cs42l43.bin", cs42l43->dev, 774 GFP_KERNEL, cs42l43, 775 cs42l43_mcu_load_firmware); 776 if (ret) { 777 dev_err(cs42l43->dev, "Failed to request firmware: %d\n", ret); 778 return ret; 779 } 780 781 wait_for_completion(&cs42l43->firmware_download); 782 783 if (cs42l43->firmware_error) 784 return cs42l43->firmware_error; 785 786 return -EAGAIN; 787 } else { 788 return cs42l43_mcu_stage_2_3(cs42l43, shadow); 789 } 790 case CS42L43_MCU_BOOT_STAGE3: 791 if (patched) 792 return cs42l43_mcu_disable(cs42l43); 793 else 794 return cs42l43_mcu_stage_3_2(cs42l43); 795 case CS42L43_MCU_BOOT_STAGE4: 796 return 0; 797 default: 798 dev_err(cs42l43->dev, "Invalid boot status: %d\n", boot_status); 799 return -EINVAL; 800 } 801 } 802 803 /* 804 * Update the firmware running on the device. 805 */ 806 static int cs42l43_mcu_update(struct cs42l43 *cs42l43) 807 { 808 int i, ret; 809 810 for (i = 0; i < CS42L43_MCU_UPDATE_RETRIES; i++) { 811 ret = cs42l43_mcu_update_step(cs42l43); 812 if (ret != -EAGAIN) 813 return ret; 814 815 ret = cs42l43_wait_for_attach(cs42l43); 816 if (ret) 817 return ret; 818 } 819 820 dev_err(cs42l43->dev, "Failed retrying update\n"); 821 return -ETIMEDOUT; 822 } 823 824 static int cs42l43_irq_config(struct cs42l43 *cs42l43) 825 { 826 struct irq_data *irq_data; 827 unsigned long irq_flags; 828 int ret; 829 830 if (cs42l43->sdw) 831 cs42l43->irq = cs42l43->sdw->irq; 832 833 cs42l43->irq_chip = cs42l43_irq_chip; 834 cs42l43->irq_chip.irq_drv_data = cs42l43; 835 836 irq_data = irq_get_irq_data(cs42l43->irq); 837 if (!irq_data) { 838 dev_err(cs42l43->dev, "Invalid IRQ: %d\n", cs42l43->irq); 839 return -EINVAL; 840 } 841 842 irq_flags = irqd_get_trigger_type(irq_data); 843 switch (irq_flags) { 844 case IRQF_TRIGGER_LOW: 845 case IRQF_TRIGGER_HIGH: 846 case IRQF_TRIGGER_RISING: 847 case IRQF_TRIGGER_FALLING: 848 break; 849 case IRQ_TYPE_NONE: 850 default: 851 irq_flags = IRQF_TRIGGER_LOW; 852 break; 853 } 854 855 irq_flags |= IRQF_ONESHOT; 856 857 ret = devm_regmap_add_irq_chip(cs42l43->dev, cs42l43->regmap, 858 cs42l43->irq, irq_flags, 0, 859 &cs42l43->irq_chip, &cs42l43->irq_data); 860 if (ret) { 861 dev_err(cs42l43->dev, "Failed to add IRQ chip: %d\n", ret); 862 return ret; 863 } 864 865 dev_dbg(cs42l43->dev, "Configured IRQ %d with flags 0x%lx\n", 866 cs42l43->irq, irq_flags); 867 868 return 0; 869 } 870 871 static void cs42l43_boot_work(struct work_struct *work) 872 { 873 struct cs42l43 *cs42l43 = container_of(work, struct cs42l43, boot_work); 874 unsigned int devid, revid, otp; 875 int ret; 876 877 ret = cs42l43_wait_for_attach(cs42l43); 878 if (ret) 879 goto err; 880 881 ret = regmap_read(cs42l43->regmap, CS42L43_DEVID, &devid); 882 if (ret) { 883 dev_err(cs42l43->dev, "Failed to read devid: %d\n", ret); 884 goto err; 885 } 886 887 switch (devid) { 888 case CS42L43_DEVID_VAL: 889 break; 890 default: 891 dev_err(cs42l43->dev, "Unrecognised devid: 0x%06x\n", devid); 892 goto err; 893 } 894 895 ret = regmap_read(cs42l43->regmap, CS42L43_REVID, &revid); 896 if (ret) { 897 dev_err(cs42l43->dev, "Failed to read rev: %d\n", ret); 898 goto err; 899 } 900 901 ret = regmap_read(cs42l43->regmap, CS42L43_OTP_REVISION_ID, &otp); 902 if (ret) { 903 dev_err(cs42l43->dev, "Failed to read otp rev: %d\n", ret); 904 goto err; 905 } 906 907 dev_info(cs42l43->dev, 908 "devid: 0x%06x, rev: 0x%02x, otp: 0x%02x\n", devid, revid, otp); 909 910 ret = cs42l43_mcu_update(cs42l43); 911 if (ret) 912 goto err; 913 914 ret = regmap_register_patch(cs42l43->regmap, cs42l43_reva_patch, 915 ARRAY_SIZE(cs42l43_reva_patch)); 916 if (ret) { 917 dev_err(cs42l43->dev, "Failed to apply register patch: %d\n", ret); 918 goto err; 919 } 920 921 ret = cs42l43_irq_config(cs42l43); 922 if (ret) 923 goto err; 924 925 ret = devm_mfd_add_devices(cs42l43->dev, PLATFORM_DEVID_NONE, 926 cs42l43_devs, ARRAY_SIZE(cs42l43_devs), 927 NULL, 0, NULL); 928 if (ret) { 929 dev_err(cs42l43->dev, "Failed to add subdevices: %d\n", ret); 930 goto err; 931 } 932 933 pm_runtime_mark_last_busy(cs42l43->dev); 934 pm_runtime_put_autosuspend(cs42l43->dev); 935 936 return; 937 938 err: 939 pm_runtime_put_sync(cs42l43->dev); 940 cs42l43_dev_remove(cs42l43); 941 } 942 943 static int cs42l43_power_up(struct cs42l43 *cs42l43) 944 { 945 int ret; 946 947 ret = regulator_enable(cs42l43->vdd_p); 948 if (ret) { 949 dev_err(cs42l43->dev, "Failed to enable vdd-p: %d\n", ret); 950 return ret; 951 } 952 953 /* vdd-p must be on for 50uS before any other supply */ 954 usleep_range(CS42L43_VDDP_DELAY, 2 * CS42L43_VDDP_DELAY); 955 956 gpiod_set_value_cansleep(cs42l43->reset, 1); 957 958 ret = regulator_bulk_enable(CS42L43_N_SUPPLIES, cs42l43->core_supplies); 959 if (ret) { 960 dev_err(cs42l43->dev, "Failed to enable core supplies: %d\n", ret); 961 goto err_reset; 962 } 963 964 ret = regulator_enable(cs42l43->vdd_d); 965 if (ret) { 966 dev_err(cs42l43->dev, "Failed to enable vdd-d: %d\n", ret); 967 goto err_core_supplies; 968 } 969 970 usleep_range(CS42L43_VDDD_DELAY, 2 * CS42L43_VDDD_DELAY); 971 972 return 0; 973 974 err_core_supplies: 975 regulator_bulk_disable(CS42L43_N_SUPPLIES, cs42l43->core_supplies); 976 err_reset: 977 gpiod_set_value_cansleep(cs42l43->reset, 0); 978 regulator_disable(cs42l43->vdd_p); 979 980 return ret; 981 } 982 983 static int cs42l43_power_down(struct cs42l43 *cs42l43) 984 { 985 int ret; 986 987 ret = regulator_disable(cs42l43->vdd_d); 988 if (ret) { 989 dev_err(cs42l43->dev, "Failed to disable vdd-d: %d\n", ret); 990 return ret; 991 } 992 993 ret = regulator_bulk_disable(CS42L43_N_SUPPLIES, cs42l43->core_supplies); 994 if (ret) { 995 dev_err(cs42l43->dev, "Failed to disable core supplies: %d\n", ret); 996 return ret; 997 } 998 999 gpiod_set_value_cansleep(cs42l43->reset, 0); 1000 1001 ret = regulator_disable(cs42l43->vdd_p); 1002 if (ret) { 1003 dev_err(cs42l43->dev, "Failed to disable vdd-p: %d\n", ret); 1004 return ret; 1005 } 1006 1007 return 0; 1008 } 1009 1010 int cs42l43_dev_probe(struct cs42l43 *cs42l43) 1011 { 1012 int i, ret; 1013 1014 dev_set_drvdata(cs42l43->dev, cs42l43); 1015 1016 mutex_init(&cs42l43->pll_lock); 1017 init_completion(&cs42l43->device_attach); 1018 init_completion(&cs42l43->device_detach); 1019 init_completion(&cs42l43->firmware_download); 1020 INIT_WORK(&cs42l43->boot_work, cs42l43_boot_work); 1021 1022 regcache_cache_only(cs42l43->regmap, true); 1023 1024 cs42l43->reset = devm_gpiod_get_optional(cs42l43->dev, "reset", GPIOD_OUT_LOW); 1025 if (IS_ERR(cs42l43->reset)) 1026 return dev_err_probe(cs42l43->dev, PTR_ERR(cs42l43->reset), 1027 "Failed to get reset\n"); 1028 1029 cs42l43->vdd_p = devm_regulator_get(cs42l43->dev, "vdd-p"); 1030 if (IS_ERR(cs42l43->vdd_p)) 1031 return dev_err_probe(cs42l43->dev, PTR_ERR(cs42l43->vdd_p), 1032 "Failed to get vdd-p\n"); 1033 1034 cs42l43->vdd_d = devm_regulator_get(cs42l43->dev, "vdd-d"); 1035 if (IS_ERR(cs42l43->vdd_d)) 1036 return dev_err_probe(cs42l43->dev, PTR_ERR(cs42l43->vdd_d), 1037 "Failed to get vdd-d\n"); 1038 1039 BUILD_BUG_ON(ARRAY_SIZE(cs42l43_core_supplies) != CS42L43_N_SUPPLIES); 1040 1041 for (i = 0; i < CS42L43_N_SUPPLIES; i++) 1042 cs42l43->core_supplies[i].supply = cs42l43_core_supplies[i]; 1043 1044 ret = devm_regulator_bulk_get(cs42l43->dev, CS42L43_N_SUPPLIES, 1045 cs42l43->core_supplies); 1046 if (ret) 1047 return dev_err_probe(cs42l43->dev, ret, 1048 "Failed to get core supplies\n"); 1049 1050 ret = cs42l43_power_up(cs42l43); 1051 if (ret) 1052 return ret; 1053 1054 pm_runtime_set_autosuspend_delay(cs42l43->dev, CS42L43_AUTOSUSPEND_TIME); 1055 pm_runtime_use_autosuspend(cs42l43->dev); 1056 pm_runtime_set_active(cs42l43->dev); 1057 /* 1058 * The device is already powered up, but keep it from suspending until 1059 * the boot work runs. 1060 */ 1061 pm_runtime_get_noresume(cs42l43->dev); 1062 devm_pm_runtime_enable(cs42l43->dev); 1063 1064 queue_work(system_long_wq, &cs42l43->boot_work); 1065 1066 return 0; 1067 } 1068 EXPORT_SYMBOL_NS_GPL(cs42l43_dev_probe, MFD_CS42L43); 1069 1070 void cs42l43_dev_remove(struct cs42l43 *cs42l43) 1071 { 1072 cs42l43_power_down(cs42l43); 1073 } 1074 EXPORT_SYMBOL_NS_GPL(cs42l43_dev_remove, MFD_CS42L43); 1075 1076 static int cs42l43_suspend(struct device *dev) 1077 { 1078 struct cs42l43 *cs42l43 = dev_get_drvdata(dev); 1079 int ret; 1080 1081 /* 1082 * Don't care about being resumed here, but the driver does want 1083 * force_resume to always trigger an actual resume, so that register 1084 * state for the MCU/GPIOs is returned as soon as possible after system 1085 * resume. force_resume will resume if the reference count is resumed on 1086 * suspend hence the get_noresume. 1087 */ 1088 pm_runtime_get_noresume(dev); 1089 1090 ret = pm_runtime_force_suspend(dev); 1091 if (ret) { 1092 dev_err(cs42l43->dev, "Failed to force suspend: %d\n", ret); 1093 pm_runtime_put_noidle(dev); 1094 return ret; 1095 } 1096 1097 pm_runtime_put_noidle(dev); 1098 1099 ret = cs42l43_power_down(cs42l43); 1100 if (ret) 1101 return ret; 1102 1103 return 0; 1104 } 1105 1106 static int cs42l43_resume(struct device *dev) 1107 { 1108 struct cs42l43 *cs42l43 = dev_get_drvdata(dev); 1109 int ret; 1110 1111 ret = cs42l43_power_up(cs42l43); 1112 if (ret) 1113 return ret; 1114 1115 ret = pm_runtime_force_resume(dev); 1116 if (ret) { 1117 dev_err(cs42l43->dev, "Failed to force resume: %d\n", ret); 1118 return ret; 1119 } 1120 1121 return 0; 1122 } 1123 1124 static int cs42l43_runtime_suspend(struct device *dev) 1125 { 1126 struct cs42l43 *cs42l43 = dev_get_drvdata(dev); 1127 1128 /* 1129 * Whilst the driver doesn't power the chip down here, going into runtime 1130 * suspend lets the SoundWire bus power down, which means the driver 1131 * can't communicate with the device any more. 1132 */ 1133 regcache_cache_only(cs42l43->regmap, true); 1134 1135 return 0; 1136 } 1137 1138 static int cs42l43_runtime_resume(struct device *dev) 1139 { 1140 struct cs42l43 *cs42l43 = dev_get_drvdata(dev); 1141 unsigned int reset_canary; 1142 int ret; 1143 1144 ret = cs42l43_wait_for_attach(cs42l43); 1145 if (ret) 1146 return ret; 1147 1148 ret = regmap_read(cs42l43->regmap, CS42L43_RELID, &reset_canary); 1149 if (ret) { 1150 dev_err(cs42l43->dev, "Failed to check reset canary: %d\n", ret); 1151 goto err; 1152 } 1153 1154 if (!reset_canary) { 1155 /* 1156 * If the canary has cleared the chip has reset, re-handle the 1157 * MCU and mark the cache as dirty to indicate the chip reset. 1158 */ 1159 ret = cs42l43_mcu_update(cs42l43); 1160 if (ret) 1161 goto err; 1162 1163 regcache_mark_dirty(cs42l43->regmap); 1164 } 1165 1166 ret = regcache_sync(cs42l43->regmap); 1167 if (ret) { 1168 dev_err(cs42l43->dev, "Failed to restore register cache: %d\n", ret); 1169 goto err; 1170 } 1171 1172 return 0; 1173 1174 err: 1175 regcache_cache_only(cs42l43->regmap, true); 1176 1177 return ret; 1178 } 1179 1180 EXPORT_NS_GPL_DEV_PM_OPS(cs42l43_pm_ops, MFD_CS42L43) = { 1181 SET_SYSTEM_SLEEP_PM_OPS(cs42l43_suspend, cs42l43_resume) 1182 SET_RUNTIME_PM_OPS(cs42l43_runtime_suspend, cs42l43_runtime_resume, NULL) 1183 }; 1184 1185 MODULE_DESCRIPTION("CS42L43 Core Driver"); 1186 MODULE_AUTHOR("Charles Keepax <ckeepax@opensource.cirrus.com>"); 1187 MODULE_LICENSE("GPL"); 1188 MODULE_FIRMWARE("cs42l43.bin"); 1189