1/* SPDX-License-Identifier: GPL-2.0 */ 2/* 3 * cs35l45.h - CS35L45 ALSA SoC audio driver 4 * 5 * Copyright 2019-2022 Cirrus Logic, Inc. 6 * 7 * Author: James Schulman <james.schulman@cirrus.com> 8 * 9 */ 10 11#ifndef CS35L45_H 12#define CS35L45_H 13 14#include <linux/pm_runtime.h> 15#include <linux/regmap.h> 16#include <linux/regulator/consumer.h> 17#include <dt-bindings/sound/cs35l45.h> 18#include "wm_adsp.h" 19 20#define CS35L45_DEVID 0x00000000 21#define CS35L45_REVID 0x00000004 22#define CS35L45_RELID 0x0000000C 23#define CS35L45_OTPID 0x00000010 24#define CS35L45_SFT_RESET 0x00000020 25#define CS35L45_GLOBAL_ENABLES 0x00002014 26#define CS35L45_BLOCK_ENABLES 0x00002018 27#define CS35L45_BLOCK_ENABLES2 0x0000201C 28#define CS35L45_ERROR_RELEASE 0x00002034 29#define CS35L45_SYNC_GPIO1 0x00002430 30#define CS35L45_INTB_GPIO2_MCLK_REF 0x00002434 31#define CS35L45_GPIO3 0x00002438 32#define CS35L45_PWRMGT_CTL 0x00002900 33#define CS35L45_WAKESRC_CTL 0x00002904 34#define CS35L45_WKI2C_CTL 0x00002908 35#define CS35L45_PWRMGT_STS 0x0000290C 36#define CS35L45_REFCLK_INPUT 0x00002C04 37#define CS35L45_GLOBAL_SAMPLE_RATE 0x00002C0C 38#define CS35L45_BOOST_CCM_CFG 0x00003808 39#define CS35L45_BOOST_DCM_CFG 0x0000380C 40#define CS35L45_BOOST_OV_CFG 0x0000382C 41#define CS35L45_ASP_ENABLES1 0x00004800 42#define CS35L45_ASP_CONTROL1 0x00004804 43#define CS35L45_ASP_CONTROL2 0x00004808 44#define CS35L45_ASP_CONTROL3 0x0000480C 45#define CS35L45_ASP_FRAME_CONTROL1 0x00004810 46#define CS35L45_ASP_FRAME_CONTROL2 0x00004814 47#define CS35L45_ASP_FRAME_CONTROL5 0x00004820 48#define CS35L45_ASP_DATA_CONTROL1 0x00004830 49#define CS35L45_ASP_DATA_CONTROL5 0x00004840 50#define CS35L45_DACPCM1_INPUT 0x00004C00 51#define CS35L45_ASPTX1_INPUT 0x00004C20 52#define CS35L45_ASPTX2_INPUT 0x00004C24 53#define CS35L45_ASPTX3_INPUT 0x00004C28 54#define CS35L45_ASPTX4_INPUT 0x00004C2C 55#define CS35L45_ASPTX5_INPUT 0x00004C30 56#define CS35L45_DSP1RX1_INPUT 0x00004C40 57#define CS35L45_DSP1RX2_INPUT 0x00004C44 58#define CS35L45_DSP1RX3_INPUT 0x00004C48 59#define CS35L45_DSP1RX4_INPUT 0x00004C4C 60#define CS35L45_DSP1RX5_INPUT 0x00004C50 61#define CS35L45_DSP1RX6_INPUT 0x00004C54 62#define CS35L45_DSP1RX7_INPUT 0x00004C58 63#define CS35L45_DSP1RX8_INPUT 0x00004C5C 64#define CS35L45_LDPM_CONFIG 0x00006404 65#define CS35L45_AMP_PCM_CONTROL 0x00007000 66#define CS35L45_AMP_PCM_HPF_TST 0x00007004 67#define CS35L45_IRQ1_CFG 0x0000E000 68#define CS35L45_IRQ1_STATUS 0x0000E004 69#define CS35L45_IRQ1_EINT_1 0x0000E010 70#define CS35L45_IRQ1_EINT_2 0x0000E014 71#define CS35L45_IRQ1_EINT_3 0x0000E018 72#define CS35L45_IRQ1_EINT_4 0x0000E01C 73#define CS35L45_IRQ1_EINT_5 0x0000E020 74#define CS35L45_IRQ1_EINT_7 0x0000E028 75#define CS35L45_IRQ1_EINT_8 0x0000E02C 76#define CS35L45_IRQ1_EINT_18 0x0000E054 77#define CS35L45_IRQ1_STS_1 0x0000E090 78#define CS35L45_IRQ1_STS_2 0x0000E094 79#define CS35L45_IRQ1_STS_3 0x0000E098 80#define CS35L45_IRQ1_STS_4 0x0000E09C 81#define CS35L45_IRQ1_STS_5 0x0000E0A0 82#define CS35L45_IRQ1_STS_7 0x0000E0A8 83#define CS35L45_IRQ1_STS_8 0x0000E0AC 84#define CS35L45_IRQ1_STS_18 0x0000E0D4 85#define CS35L45_IRQ1_MASK_1 0x0000E110 86#define CS35L45_IRQ1_MASK_2 0x0000E114 87#define CS35L45_IRQ1_MASK_3 0x0000E118 88#define CS35L45_IRQ1_MASK_4 0x0000E11C 89#define CS35L45_IRQ1_MASK_5 0x0000E120 90#define CS35L45_IRQ1_MASK_6 0x0000E124 91#define CS35L45_IRQ1_MASK_7 0x0000E128 92#define CS35L45_IRQ1_MASK_8 0x0000E12C 93#define CS35L45_IRQ1_MASK_9 0x0000E130 94#define CS35L45_IRQ1_MASK_10 0x0000E134 95#define CS35L45_IRQ1_MASK_11 0x0000E138 96#define CS35L45_IRQ1_MASK_12 0x0000E13C 97#define CS35L45_IRQ1_MASK_13 0x0000E140 98#define CS35L45_IRQ1_MASK_14 0x0000E144 99#define CS35L45_IRQ1_MASK_15 0x0000E148 100#define CS35L45_IRQ1_MASK_16 0x0000E14C 101#define CS35L45_IRQ1_MASK_17 0x0000E150 102#define CS35L45_IRQ1_MASK_18 0x0000E154 103#define CS35L45_GPIO_STATUS1 0x0000F000 104#define CS35L45_GPIO1_CTRL1 0x0000F008 105#define CS35L45_GPIO2_CTRL1 0x0000F00C 106#define CS35L45_GPIO3_CTRL1 0x0000F010 107#define CS35L45_DSP_MBOX_1 0x00011000 108#define CS35L45_DSP_MBOX_2 0x00011004 109#define CS35L45_DSP_VIRT1_MBOX_1 0x00011020 110#define CS35L45_DSP_VIRT1_MBOX_2 0x00011024 111#define CS35L45_DSP_VIRT1_MBOX_3 0x00011028 112#define CS35L45_DSP_VIRT1_MBOX_4 0x0001102C 113#define CS35L45_DSP_VIRT2_MBOX_1 0x00011040 114#define CS35L45_DSP_VIRT2_MBOX_2 0x00011044 115#define CS35L45_DSP_VIRT2_MBOX_3 0x00011048 116#define CS35L45_DSP_VIRT2_MBOX_4 0x0001104C 117#define CS35L45_DSP1_XMEM_PACK_0 0x02000000 118#define CS35L45_DSP1_XMEM_PACK_4607 0x020047FC 119#define CS35L45_DSP1_XMEM_UNPACK32_0 0x02400000 120#define CS35L45_DSP1_XMEM_UNPACK32_3071 0x02402FFC 121#define CS35L45_DSP1_SYS_ID 0x025E0000 122#define CS35L45_DSP1_XMEM_UNPACK24_0 0x02800000 123#define CS35L45_DSP1_XMEM_UNPACK24_6143 0x02805FFC 124#define CS35L45_DSP1_CLOCK_FREQ 0x02B80000 125#define CS35L45_DSP1_RX1_RATE 0x02B80080 126#define CS35L45_DSP1_RX2_RATE 0x02B80088 127#define CS35L45_DSP1_RX3_RATE 0x02B80090 128#define CS35L45_DSP1_RX4_RATE 0x02B80098 129#define CS35L45_DSP1_RX5_RATE 0x02B800A0 130#define CS35L45_DSP1_RX6_RATE 0x02B800A8 131#define CS35L45_DSP1_RX7_RATE 0x02B800B0 132#define CS35L45_DSP1_RX8_RATE 0x02B800B8 133#define CS35L45_DSP1_TX1_RATE 0x02B80280 134#define CS35L45_DSP1_TX2_RATE 0x02B80288 135#define CS35L45_DSP1_TX3_RATE 0x02B80290 136#define CS35L45_DSP1_TX4_RATE 0x02B80298 137#define CS35L45_DSP1_TX5_RATE 0x02B802A0 138#define CS35L45_DSP1_TX6_RATE 0x02B802A8 139#define CS35L45_DSP1_TX7_RATE 0x02B802B0 140#define CS35L45_DSP1_TX8_RATE 0x02B802B8 141#define CS35L45_DSP1_SCRATCH1 0x02B805C0 142#define CS35L45_DSP1_SCRATCH2 0x02B805C8 143#define CS35L45_DSP1_SCRATCH3 0x02B805D0 144#define CS35L45_DSP1_SCRATCH4 0x02B805D8 145#define CS35L45_DSP1_CCM_CORE_CONTROL 0x02BC1000 146#define CS35L45_DSP1_YMEM_PACK_0 0x02C00000 147#define CS35L45_DSP1_YMEM_PACK_1532 0x02C017F0 148#define CS35L45_DSP1_YMEM_UNPACK32_0 0x03000000 149#define CS35L45_DSP1_YMEM_UNPACK32_1022 0x03000FF8 150#define CS35L45_DSP1_YMEM_UNPACK24_0 0x03400000 151#define CS35L45_DSP1_YMEM_UNPACK24_2043 0x03401FEC 152#define CS35L45_DSP1_PMEM_0 0x03800000 153#define CS35L45_DSP1_PMEM_3834 0x03803BE8 154#define CS35L45_LASTREG 0x03C6EFE8 155 156/* SFT_RESET */ 157#define CS35L45_SOFT_RESET_TRIGGER 0x5A000000 158 159/* GLOBAL_ENABLES */ 160#define CS35L45_GLOBAL_EN_SHIFT 0 161#define CS35L45_GLOBAL_EN_MASK BIT(0) 162 163/* BLOCK_ENABLES */ 164#define CS35L45_IMON_EN_SHIFT 13 165#define CS35L45_VMON_EN_SHIFT 12 166#define CS35L45_VDD_BSTMON_EN_SHIFT 9 167#define CS35L45_VDD_BATTMON_EN_SHIFT 8 168#define CS35L45_BST_EN_SHIFT 4 169#define CS35L45_BST_EN_MASK GENMASK(5, 4) 170 171#define CS35L45_BST_DISABLE_FET_ON 0x01 172 173/* BLOCK_ENABLES2 */ 174#define CS35L45_ASP_EN_SHIFT 27 175 176#define CS35L45_MEM_RDY_SHIFT 1 177#define CS35L45_MEM_RDY_MASK BIT(1) 178 179/* ERROR_RELEASE */ 180#define CS35L45_GLOBAL_ERR_RLS_MASK BIT(11) 181 182/* CCM_CORE */ 183#define CS35L45_CCM_CORE_RESET_SHIFT 9 184#define CS35L45_CCM_CORE_RESET_MASK BIT(9) 185#define CS35L45_CCM_PM_REMAP_SHIFT 7 186#define CS35L45_CCM_PM_REMAP_MASK BIT(7) 187#define CS35L45_CCM_CORE_EN_SHIFT 0 188#define CS35L45_CCM_CORE_EN_MASK BIT(0) 189 190/* REFCLK_INPUT */ 191#define CS35L45_PLL_FORCE_EN_SHIFT 16 192#define CS35L45_PLL_FORCE_EN_MASK BIT(16) 193#define CS35L45_PLL_OPEN_LOOP_SHIFT 11 194#define CS35L45_PLL_OPEN_LOOP_MASK BIT(11) 195#define CS35L45_PLL_REFCLK_FREQ_SHIFT 5 196#define CS35L45_PLL_REFCLK_FREQ_MASK GENMASK(10, 5) 197#define CS35L45_PLL_REFCLK_EN_SHIFT 4 198#define CS35L45_PLL_REFCLK_EN_MASK BIT(4) 199#define CS35L45_PLL_REFCLK_SEL_SHIFT 0 200#define CS35L45_PLL_REFCLK_SEL_MASK GENMASK(2, 0) 201 202#define CS35L45_PLL_REFCLK_SEL_BCLK 0x0 203 204/* GLOBAL_SAMPLE_RATE */ 205#define CS35L45_GLOBAL_FS_SHIFT 0 206#define CS35L45_GLOBAL_FS_MASK GENMASK(4, 0) 207 208#define CS35L45_48P0_KHZ 0x03 209#define CS35L45_96P0_KHZ 0x04 210#define CS35L45_44P100_KHZ 0x0B 211#define CS35L45_88P200_KHZ 0x0C 212 213/* ASP_ENABLES_1 */ 214#define CS35L45_ASP_RX2_EN_SHIFT 17 215#define CS35L45_ASP_RX1_EN_SHIFT 16 216#define CS35L45_ASP_TX5_EN_SHIFT 4 217#define CS35L45_ASP_TX4_EN_SHIFT 3 218#define CS35L45_ASP_TX3_EN_SHIFT 2 219#define CS35L45_ASP_TX2_EN_SHIFT 1 220#define CS35L45_ASP_TX1_EN_SHIFT 0 221 222/* ASP_CONTROL2 */ 223#define CS35L45_ASP_WIDTH_RX_SHIFT 24 224#define CS35L45_ASP_WIDTH_RX_MASK GENMASK(31, 24) 225#define CS35L45_ASP_WIDTH_TX_SHIFT 16 226#define CS35L45_ASP_WIDTH_TX_MASK GENMASK(23, 16) 227#define CS35L45_ASP_FMT_SHIFT 8 228#define CS35L45_ASP_FMT_MASK GENMASK(10, 8) 229#define CS35L45_ASP_BCLK_INV_SHIFT 6 230#define CS35L45_ASP_BCLK_INV_MASK BIT(6) 231#define CS35L45_ASP_FSYNC_INV_SHIFT 2 232#define CS35L45_ASP_FSYNC_INV_MASK BIT(2) 233 234#define CS35l45_ASP_FMT_DSP_A 0 235#define CS35L45_ASP_FMT_I2S 2 236 237/* ASP_CONTROL3 */ 238#define CS35L45_ASP_DOUT_HIZ_CTRL_SHIFT 0 239#define CS35L45_ASP_DOUT_HIZ_CTRL_MASK GENMASK(1, 0) 240 241/* ASP_FRAME_CONTROL1 */ 242#define CS35L45_ASP_TX4_SLOT_SHIFT 24 243#define CS35L45_ASP_TX4_SLOT_MASK GENMASK(29, 24) 244#define CS35L45_ASP_TX3_SLOT_SHIFT 16 245#define CS35L45_ASP_TX3_SLOT_MASK GENMASK(21, 16) 246#define CS35L45_ASP_TX2_SLOT_SHIFT 8 247#define CS35L45_ASP_TX2_SLOT_MASK GENMASK(13, 8) 248#define CS35L45_ASP_TX1_SLOT_SHIFT 0 249#define CS35L45_ASP_TX1_SLOT_MASK GENMASK(5, 0) 250 251#define CS35L45_ASP_TX_ALL_SLOTS (CS35L45_ASP_TX4_SLOT_MASK | \ 252 CS35L45_ASP_TX3_SLOT_MASK | \ 253 CS35L45_ASP_TX2_SLOT_MASK | \ 254 CS35L45_ASP_TX1_SLOT_MASK) 255/* ASP_FRAME_CONTROL5 */ 256#define CS35L45_ASP_RX2_SLOT_SHIFT 8 257#define CS35L45_ASP_RX2_SLOT_MASK GENMASK(13, 8) 258#define CS35L45_ASP_RX1_SLOT_SHIFT 0 259#define CS35L45_ASP_RX1_SLOT_MASK GENMASK(5, 0) 260 261#define CS35L45_ASP_RX_ALL_SLOTS (CS35L45_ASP_RX2_SLOT_MASK | \ 262 CS35L45_ASP_RX1_SLOT_MASK) 263 264/* ASP_DATA_CONTROL1 */ 265/* ASP_DATA_CONTROL5 */ 266#define CS35L45_ASP_WL_SHIFT 0 267#define CS35L45_ASP_WL_MASK GENMASK(5, 0) 268 269/* AMP_PCM_CONTROL */ 270#define CS35L45_AMP_VOL_PCM_SHIFT 0 271#define CS35L45_AMP_VOL_PCM_WIDTH 11 272 273/* AMP_PCM_HPF_TST */ 274#define CS35l45_HPF_DEFAULT 0x00000000 275#define CS35L45_HPF_44P1 0x000108BD 276#define CS35L45_HPF_88P2 0x0001045F 277 278/* IRQ1_EINT_4 */ 279#define CS35L45_OTP_BOOT_DONE_STS_MASK BIT(1) 280#define CS35L45_OTP_BUSY_MASK BIT(0) 281 282/* GPIOX_CTRL1 */ 283#define CS35L45_GPIO_DIR_SHIFT 31 284#define CS35L45_GPIO_DIR_MASK BIT(31) 285#define CS35L45_GPIO_LVL_SHIFT 15 286#define CS35L45_GPIO_LVL_MASK BIT(15) 287#define CS35L45_GPIO_OP_CFG_SHIFT 14 288#define CS35L45_GPIO_OP_CFG_MASK BIT(14) 289#define CS35L45_GPIO_POL_SHIFT 12 290#define CS35L45_GPIO_POL_MASK BIT(12) 291 292/* SYNC_GPIO1, INTB_GPIO2_MCLK_REF, GPIO3 */ 293#define CS35L45_GPIO_CTRL_SHIFT 20 294#define CS35L45_GPIO_CTRL_MASK GENMASK(22, 20) 295#define CS35L45_GPIO_INVERT_SHIFT 19 296#define CS35L45_GPIO_INVERT_MASK BIT(19) 297 298/* CS35L45_IRQ1_EINT_1 */ 299#define CS35L45_BST_UVP_ERR_SHIFT 7 300#define CS35L45_BST_UVP_ERR_MASK BIT(7) 301#define CS35L45_BST_SHORT_ERR_SHIFT 8 302#define CS35L45_BST_SHORT_ERR_MASK BIT(8) 303#define CS35L45_TEMP_ERR_SHIFT 17 304#define CS35L45_TEMP_ERR_MASK BIT(17) 305#define CS35L45_MSM_GLOBAL_EN_ASSERT_SHIFT 22 306#define CS35L45_MSM_GLOBAL_EN_ASSERT_MASK BIT(22) 307#define CS35L45_UVLO_VDDBATT_ERR_SHIFT 29 308#define CS35L45_UVLO_VDDBATT_ERR_MASK BIT(29) 309#define CS35L45_AMP_SHORT_ERR_SHIFT 31 310#define CS35L45_AMP_SHORT_ERR_MASK BIT(31) 311 312/* CS35L45_IRQ1_EINT_2 */ 313#define CS35L45_DSP_WDT_EXPIRE_SHIFT 4 314#define CS35L45_DSP_WDT_EXPIRE_MASK BIT(4) 315#define CS35L45_DSP_VIRT2_MBOX_SHIFT 21 316#define CS35L45_DSP_VIRT2_MBOX_MASK BIT(21) 317 318/* CS35L45_IRQ1_EINT_3 */ 319#define CS35L45_PLL_LOCK_FLAG_SHIFT 1 320#define CS35L45_PLL_LOCK_FLAG_MASK BIT(1) 321#define CS35L45_PLL_UNLOCK_FLAG_RISE_SHIFT 4 322#define CS35L45_PLL_UNLOCK_FLAG_RISE_MASK BIT(4) 323#define CS35L45_AMP_CAL_ERR_SHIFT 25 324#define CS35L45_AMP_CAL_ERR_MASK BIT(25) 325 326/* CS35L45_IRQ1_EINT_18 */ 327#define CS35L45_GLOBAL_ERROR_SHIFT 15 328#define CS35L45_GLOBAL_ERROR_MASK BIT(15) 329#define CS35L45_UVLO_VDDLV_ERR_SHIFT 16 330#define CS35L45_UVLO_VDDLV_ERR_MASK BIT(16) 331 332/* Mixer sources */ 333#define CS35L45_PCM_SRC_MASK 0x7F 334#define CS35L45_PCM_SRC_ZERO 0x00 335#define CS35L45_PCM_SRC_ASP_RX1 0x08 336#define CS35L45_PCM_SRC_ASP_RX2 0x09 337#define CS35L45_PCM_SRC_VMON 0x18 338#define CS35L45_PCM_SRC_IMON 0x19 339#define CS35L45_PCM_SRC_ERR_VOL 0x20 340#define CS35L45_PCM_SRC_CLASSH_TGT 0x21 341#define CS35L45_PCM_SRC_VDD_BATTMON 0x28 342#define CS35L45_PCM_SRC_VDD_BSTMON 0x29 343#define CS35L45_PCM_SRC_DSP_TX1 0x32 344#define CS35L45_PCM_SRC_DSP_TX2 0x33 345#define CS35L45_PCM_SRC_TEMPMON 0x3A 346#define CS35L45_PCM_SRC_INTERPOLATOR 0x40 347#define CS35L45_PCM_SRC_IL_TARGET 0x48 348 349#define CS35L45_RESET_HOLD_US 2000 350#define CS35L45_RESET_US 2000 351#define CS35L45_POST_GLOBAL_EN_US 5000 352#define CS35L45_PRE_GLOBAL_DIS_US 3000 353 354/* WAKESRC_CTL */ 355#define CS35L45_WKSRC_SYNC_GPIO1 BIT(0) 356#define CS35L45_WKSRC_INT_GPIO2 BIT(1) 357#define CS35L45_WKSRC_GPIO3 BIT(2) 358#define CS35L45_WKSRC_SPI BIT(3) 359#define CS35L45_WKSRC_I2C BIT(4) 360#define CS35L45_UPDT_WKCTL_SHIFT 15 361#define CS35L45_UPDT_WKCTL_MASK BIT(15) 362#define CS35L45_WKSRC_EN_SHIFT 8 363#define CS35L45_WKSRC_EN_MASK GENMASK(12, 8) 364#define CS35L45_WKSRC_POL_SHIFT 0 365#define CS35L45_WKSRC_POL_MASK GENMASK(3, 0) 366 367/* WAKEI2C_CTL */ 368#define CS35L45_UPDT_WKI2C_SHIFT 15 369#define CS35L45_UPDT_WKI2C_MASK BIT(15) 370#define CS35L45_WKI2C_ADDR_SHIFT 0 371#define CS35L45_WKI2C_ADDR_MASK GENMASK(6, 0) 372 373#define CS35L45_SPI_MAX_FREQ 4000000 374 375enum cs35l45_cspl_mboxstate { 376 CSPL_MBOX_STS_RUNNING = 0, 377 CSPL_MBOX_STS_PAUSED = 1, 378 CSPL_MBOX_STS_RDY_FOR_REINIT = 2, 379 CSPL_MBOX_STS_HIBERNATE = 3, 380}; 381 382enum cs35l45_cspl_mboxcmd { 383 CSPL_MBOX_CMD_NONE = 0, 384 CSPL_MBOX_CMD_PAUSE = 1, 385 CSPL_MBOX_CMD_RESUME = 2, 386 CSPL_MBOX_CMD_REINIT = 3, 387 CSPL_MBOX_CMD_STOP_PRE_REINIT = 4, 388 CSPL_MBOX_CMD_HIBERNATE = 5, 389 CSPL_MBOX_CMD_OUT_OF_HIBERNATE = 6, 390 CSPL_MBOX_CMD_UNKNOWN_CMD = -1, 391 CSPL_MBOX_CMD_INVALID_SEQUENCE = -2, 392}; 393 394enum control_bus_type { 395 CONTROL_BUS_I2C = 0, 396 CONTROL_BUS_SPI = 1, 397}; 398 399#define CS35L45_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \ 400 SNDRV_PCM_FMTBIT_S24_3LE| \ 401 SNDRV_PCM_FMTBIT_S24_LE) 402 403#define CS35L45_RATES (SNDRV_PCM_RATE_44100 | \ 404 SNDRV_PCM_RATE_48000 | \ 405 SNDRV_PCM_RATE_88200 | \ 406 SNDRV_PCM_RATE_96000) 407 408/* 409 * IRQs 410 */ 411#define CS35L45_IRQ(_irq, _name, _hand) \ 412 { \ 413 .irq = CS35L45_ ## _irq ## _IRQ,\ 414 .name = _name, \ 415 .handler = _hand, \ 416 } 417 418struct cs35l45_irq { 419 int irq; 420 const char *name; 421 irqreturn_t (*handler)(int irq, void *data); 422}; 423 424#define CS35L45_REG_IRQ(_reg, _irq) \ 425 [CS35L45_ ## _irq ## _IRQ] = { \ 426 .reg_offset = (CS35L45_ ## _reg) - CS35L45_IRQ1_EINT_1, \ 427 .mask = CS35L45_ ## _irq ## _MASK \ 428 } 429 430enum cs35l45_irq_list { 431 CS35L45_AMP_SHORT_ERR_IRQ, 432 CS35L45_UVLO_VDDBATT_ERR_IRQ, 433 CS35L45_BST_SHORT_ERR_IRQ, 434 CS35L45_BST_UVP_ERR_IRQ, 435 CS35L45_TEMP_ERR_IRQ, 436 CS35L45_AMP_CAL_ERR_IRQ, 437 CS35L45_UVLO_VDDLV_ERR_IRQ, 438 CS35L45_GLOBAL_ERROR_IRQ, 439 CS35L45_DSP_WDT_EXPIRE_IRQ, 440 CS35L45_PLL_UNLOCK_FLAG_RISE_IRQ, 441 CS35L45_PLL_LOCK_FLAG_IRQ, 442 CS35L45_DSP_VIRT2_MBOX_IRQ, 443 CS35L45_NUM_IRQ 444}; 445 446#define CS35L45_MBOX3_CMD_MASK 0xFF 447#define CS35L45_MBOX3_CMD_SHIFT 0 448#define CS35L45_MBOX3_DATA_MASK 0xFFFFFF00 449#define CS35L45_MBOX3_DATA_SHIFT 8 450 451enum mbox3_events { 452 EVENT_SPEAKER_STATUS = 0x66, 453 EVENT_BOOT_DONE = 0x67, 454}; 455 456struct cs35l45_private { 457 struct wm_adsp dsp; /* needs to be first member */ 458 struct device *dev; 459 struct regmap *regmap; 460 struct gpio_desc *reset_gpio; 461 struct regulator *vdd_batt; 462 struct regulator *vdd_a; 463 bool initialized; 464 bool sysclk_set; 465 u8 slot_width; 466 u8 slot_count; 467 int irq_invert; 468 int irq; 469 unsigned int i2c_addr; 470 enum control_bus_type bus_type; 471 struct regmap_irq_chip_data *irq_data; 472}; 473 474extern const struct dev_pm_ops cs35l45_pm_ops; 475extern const struct regmap_config cs35l45_i2c_regmap; 476extern const struct regmap_config cs35l45_spi_regmap; 477int cs35l45_apply_patch(struct cs35l45_private *cs35l45); 478unsigned int cs35l45_get_clk_freq_id(unsigned int freq); 479int cs35l45_probe(struct cs35l45_private *cs35l45); 480void cs35l45_remove(struct cs35l45_private *cs35l45); 481 482#endif /* CS35L45_H */ 483