1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * cs43130.c -- CS43130 ALSA Soc Audio driver 4 * 5 * Copyright 2017 Cirrus Logic, Inc. 6 * 7 * Authors: Li Xu <li.xu@cirrus.com> 8 */ 9 #include <linux/module.h> 10 #include <linux/moduleparam.h> 11 #include <linux/kernel.h> 12 #include <linux/init.h> 13 #include <linux/delay.h> 14 #include <linux/gpio.h> 15 #include <linux/gpio/consumer.h> 16 #include <linux/platform_device.h> 17 #include <linux/pm.h> 18 #include <linux/i2c.h> 19 #include <linux/of_device.h> 20 #include <linux/regmap.h> 21 #include <linux/slab.h> 22 #include <sound/core.h> 23 #include <sound/pcm.h> 24 #include <sound/pcm_params.h> 25 #include <sound/soc.h> 26 #include <sound/soc-dapm.h> 27 #include <sound/initval.h> 28 #include <sound/tlv.h> 29 #include <linux/of_gpio.h> 30 #include <linux/regulator/consumer.h> 31 #include <linux/pm_runtime.h> 32 #include <linux/of_irq.h> 33 #include <linux/completion.h> 34 #include <linux/mutex.h> 35 #include <linux/workqueue.h> 36 #include <sound/jack.h> 37 38 #include "cs43130.h" 39 40 static const struct reg_default cs43130_reg_defaults[] = { 41 {CS43130_SYS_CLK_CTL_1, 0x06}, 42 {CS43130_SP_SRATE, 0x01}, 43 {CS43130_SP_BITSIZE, 0x05}, 44 {CS43130_PAD_INT_CFG, 0x03}, 45 {CS43130_PWDN_CTL, 0xFE}, 46 {CS43130_CRYSTAL_SET, 0x04}, 47 {CS43130_PLL_SET_1, 0x00}, 48 {CS43130_PLL_SET_2, 0x00}, 49 {CS43130_PLL_SET_3, 0x00}, 50 {CS43130_PLL_SET_4, 0x00}, 51 {CS43130_PLL_SET_5, 0x40}, 52 {CS43130_PLL_SET_6, 0x10}, 53 {CS43130_PLL_SET_7, 0x80}, 54 {CS43130_PLL_SET_8, 0x03}, 55 {CS43130_PLL_SET_9, 0x02}, 56 {CS43130_PLL_SET_10, 0x02}, 57 {CS43130_CLKOUT_CTL, 0x00}, 58 {CS43130_ASP_NUM_1, 0x01}, 59 {CS43130_ASP_NUM_2, 0x00}, 60 {CS43130_ASP_DEN_1, 0x08}, 61 {CS43130_ASP_DEN_2, 0x00}, 62 {CS43130_ASP_LRCK_HI_TIME_1, 0x1F}, 63 {CS43130_ASP_LRCK_HI_TIME_2, 0x00}, 64 {CS43130_ASP_LRCK_PERIOD_1, 0x3F}, 65 {CS43130_ASP_LRCK_PERIOD_2, 0x00}, 66 {CS43130_ASP_CLOCK_CONF, 0x0C}, 67 {CS43130_ASP_FRAME_CONF, 0x0A}, 68 {CS43130_XSP_NUM_1, 0x01}, 69 {CS43130_XSP_NUM_2, 0x00}, 70 {CS43130_XSP_DEN_1, 0x02}, 71 {CS43130_XSP_DEN_2, 0x00}, 72 {CS43130_XSP_LRCK_HI_TIME_1, 0x1F}, 73 {CS43130_XSP_LRCK_HI_TIME_2, 0x00}, 74 {CS43130_XSP_LRCK_PERIOD_1, 0x3F}, 75 {CS43130_XSP_LRCK_PERIOD_2, 0x00}, 76 {CS43130_XSP_CLOCK_CONF, 0x0C}, 77 {CS43130_XSP_FRAME_CONF, 0x0A}, 78 {CS43130_ASP_CH_1_LOC, 0x00}, 79 {CS43130_ASP_CH_2_LOC, 0x00}, 80 {CS43130_ASP_CH_1_SZ_EN, 0x06}, 81 {CS43130_ASP_CH_2_SZ_EN, 0x0E}, 82 {CS43130_XSP_CH_1_LOC, 0x00}, 83 {CS43130_XSP_CH_2_LOC, 0x00}, 84 {CS43130_XSP_CH_1_SZ_EN, 0x06}, 85 {CS43130_XSP_CH_2_SZ_EN, 0x0E}, 86 {CS43130_DSD_VOL_B, 0x78}, 87 {CS43130_DSD_VOL_A, 0x78}, 88 {CS43130_DSD_PATH_CTL_1, 0xA8}, 89 {CS43130_DSD_INT_CFG, 0x00}, 90 {CS43130_DSD_PATH_CTL_2, 0x02}, 91 {CS43130_DSD_PCM_MIX_CTL, 0x00}, 92 {CS43130_DSD_PATH_CTL_3, 0x40}, 93 {CS43130_HP_OUT_CTL_1, 0x30}, 94 {CS43130_PCM_FILT_OPT, 0x02}, 95 {CS43130_PCM_VOL_B, 0x78}, 96 {CS43130_PCM_VOL_A, 0x78}, 97 {CS43130_PCM_PATH_CTL_1, 0xA8}, 98 {CS43130_PCM_PATH_CTL_2, 0x00}, 99 {CS43130_CLASS_H_CTL, 0x1E}, 100 {CS43130_HP_DETECT, 0x04}, 101 {CS43130_HP_LOAD_1, 0x00}, 102 {CS43130_HP_MEAS_LOAD_1, 0x00}, 103 {CS43130_HP_MEAS_LOAD_2, 0x00}, 104 {CS43130_INT_MASK_1, 0xFF}, 105 {CS43130_INT_MASK_2, 0xFF}, 106 {CS43130_INT_MASK_3, 0xFF}, 107 {CS43130_INT_MASK_4, 0xFF}, 108 {CS43130_INT_MASK_5, 0xFF}, 109 }; 110 111 static bool cs43130_volatile_register(struct device *dev, unsigned int reg) 112 { 113 switch (reg) { 114 case CS43130_INT_STATUS_1 ... CS43130_INT_STATUS_5: 115 case CS43130_HP_DC_STAT_1 ... CS43130_HP_DC_STAT_2: 116 case CS43130_HP_AC_STAT_1 ... CS43130_HP_AC_STAT_2: 117 return true; 118 default: 119 return false; 120 } 121 } 122 123 static bool cs43130_readable_register(struct device *dev, unsigned int reg) 124 { 125 switch (reg) { 126 case CS43130_DEVID_AB ... CS43130_SYS_CLK_CTL_1: 127 case CS43130_SP_SRATE ... CS43130_PAD_INT_CFG: 128 case CS43130_PWDN_CTL: 129 case CS43130_CRYSTAL_SET: 130 case CS43130_PLL_SET_1 ... CS43130_PLL_SET_5: 131 case CS43130_PLL_SET_6: 132 case CS43130_PLL_SET_7: 133 case CS43130_PLL_SET_8: 134 case CS43130_PLL_SET_9: 135 case CS43130_PLL_SET_10: 136 case CS43130_CLKOUT_CTL: 137 case CS43130_ASP_NUM_1 ... CS43130_ASP_FRAME_CONF: 138 case CS43130_XSP_NUM_1 ... CS43130_XSP_FRAME_CONF: 139 case CS43130_ASP_CH_1_LOC: 140 case CS43130_ASP_CH_2_LOC: 141 case CS43130_ASP_CH_1_SZ_EN: 142 case CS43130_ASP_CH_2_SZ_EN: 143 case CS43130_XSP_CH_1_LOC: 144 case CS43130_XSP_CH_2_LOC: 145 case CS43130_XSP_CH_1_SZ_EN: 146 case CS43130_XSP_CH_2_SZ_EN: 147 case CS43130_DSD_VOL_B ... CS43130_DSD_PATH_CTL_3: 148 case CS43130_HP_OUT_CTL_1: 149 case CS43130_PCM_FILT_OPT ... CS43130_PCM_PATH_CTL_2: 150 case CS43130_CLASS_H_CTL: 151 case CS43130_HP_DETECT: 152 case CS43130_HP_STATUS: 153 case CS43130_HP_LOAD_1: 154 case CS43130_HP_MEAS_LOAD_1: 155 case CS43130_HP_MEAS_LOAD_2: 156 case CS43130_HP_DC_STAT_1: 157 case CS43130_HP_DC_STAT_2: 158 case CS43130_HP_AC_STAT_1: 159 case CS43130_HP_AC_STAT_2: 160 case CS43130_HP_LOAD_STAT: 161 case CS43130_INT_STATUS_1 ... CS43130_INT_STATUS_5: 162 case CS43130_INT_MASK_1 ... CS43130_INT_MASK_5: 163 return true; 164 default: 165 return false; 166 } 167 } 168 169 static bool cs43130_precious_register(struct device *dev, unsigned int reg) 170 { 171 switch (reg) { 172 case CS43130_INT_STATUS_1 ... CS43130_INT_STATUS_5: 173 return true; 174 default: 175 return false; 176 } 177 } 178 179 struct cs43130_pll_params { 180 unsigned int pll_in; 181 u8 sclk_prediv; 182 u8 pll_div_int; 183 u32 pll_div_frac; 184 u8 pll_mode; 185 u8 pll_divout; 186 unsigned int pll_out; 187 u8 pll_cal_ratio; 188 }; 189 190 static const struct cs43130_pll_params pll_ratio_table[] = { 191 {9600000, 0x02, 0x49, 0x800000, 0x00, 0x08, 22579200, 151}, 192 {9600000, 0x02, 0x50, 0x000000, 0x00, 0x08, 24576000, 164}, 193 194 {11289600, 0x02, 0X40, 0, 0x01, 0x08, 22579200, 128}, 195 {11289600, 0x02, 0x44, 0x06F700, 0x0, 0x08, 24576000, 139}, 196 197 {12000000, 0x02, 0x49, 0x800000, 0x00, 0x0A, 22579200, 120}, 198 {12000000, 0x02, 0x40, 0x000000, 0x00, 0x08, 24576000, 131}, 199 200 {12288000, 0x02, 0x49, 0x800000, 0x01, 0x0A, 22579200, 118}, 201 {12288000, 0x02, 0x40, 0x000000, 0x01, 0x08, 24576000, 128}, 202 203 {13000000, 0x02, 0x45, 0x797680, 0x01, 0x0A, 22579200, 111}, 204 {13000000, 0x02, 0x3C, 0x7EA940, 0x01, 0x08, 24576000, 121}, 205 206 {19200000, 0x03, 0x49, 0x800000, 0x00, 0x08, 22579200, 151}, 207 {19200000, 0x03, 0x50, 0x000000, 0x00, 0x08, 24576000, 164}, 208 209 {22579200, 0, 0, 0, 0, 0, 22579200, 0}, 210 {22579200, 0x03, 0x44, 0x06F700, 0x00, 0x08, 24576000, 139}, 211 212 {24000000, 0x03, 0x49, 0x800000, 0x00, 0x0A, 22579200, 120}, 213 {24000000, 0x03, 0x40, 0x000000, 0x00, 0x08, 24576000, 131}, 214 215 {24576000, 0x03, 0x49, 0x800000, 0x01, 0x0A, 22579200, 118}, 216 {24576000, 0, 0, 0, 0, 0, 24576000, 0}, 217 218 {26000000, 0x03, 0x45, 0x797680, 0x01, 0x0A, 22579200, 111}, 219 {26000000, 0x03, 0x3C, 0x7EA940, 0x01, 0x08, 24576000, 121}, 220 }; 221 222 static const struct cs43130_pll_params *cs43130_get_pll_table( 223 unsigned int freq_in, unsigned int freq_out) 224 { 225 int i; 226 227 for (i = 0; i < ARRAY_SIZE(pll_ratio_table); i++) { 228 if (pll_ratio_table[i].pll_in == freq_in && 229 pll_ratio_table[i].pll_out == freq_out) 230 return &pll_ratio_table[i]; 231 } 232 233 return NULL; 234 } 235 236 static int cs43130_pll_config(struct snd_soc_component *component) 237 { 238 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component); 239 const struct cs43130_pll_params *pll_entry; 240 241 dev_dbg(component->dev, "cs43130->mclk = %u, cs43130->mclk_int = %u\n", 242 cs43130->mclk, cs43130->mclk_int); 243 244 pll_entry = cs43130_get_pll_table(cs43130->mclk, cs43130->mclk_int); 245 if (!pll_entry) 246 return -EINVAL; 247 248 if (pll_entry->pll_cal_ratio == 0) { 249 regmap_update_bits(cs43130->regmap, CS43130_PLL_SET_1, 250 CS43130_PLL_START_MASK, 0); 251 252 cs43130->pll_bypass = true; 253 return 0; 254 } 255 256 cs43130->pll_bypass = false; 257 258 regmap_update_bits(cs43130->regmap, CS43130_PLL_SET_2, 259 CS43130_PLL_DIV_DATA_MASK, 260 pll_entry->pll_div_frac >> 261 CS43130_PLL_DIV_FRAC_0_DATA_SHIFT); 262 regmap_update_bits(cs43130->regmap, CS43130_PLL_SET_3, 263 CS43130_PLL_DIV_DATA_MASK, 264 pll_entry->pll_div_frac >> 265 CS43130_PLL_DIV_FRAC_1_DATA_SHIFT); 266 regmap_update_bits(cs43130->regmap, CS43130_PLL_SET_4, 267 CS43130_PLL_DIV_DATA_MASK, 268 pll_entry->pll_div_frac >> 269 CS43130_PLL_DIV_FRAC_2_DATA_SHIFT); 270 regmap_write(cs43130->regmap, CS43130_PLL_SET_5, 271 pll_entry->pll_div_int); 272 regmap_write(cs43130->regmap, CS43130_PLL_SET_6, pll_entry->pll_divout); 273 regmap_write(cs43130->regmap, CS43130_PLL_SET_7, 274 pll_entry->pll_cal_ratio); 275 regmap_update_bits(cs43130->regmap, CS43130_PLL_SET_8, 276 CS43130_PLL_MODE_MASK, 277 pll_entry->pll_mode << CS43130_PLL_MODE_SHIFT); 278 regmap_write(cs43130->regmap, CS43130_PLL_SET_9, 279 pll_entry->sclk_prediv); 280 regmap_update_bits(cs43130->regmap, CS43130_PLL_SET_1, 281 CS43130_PLL_START_MASK, 1); 282 283 return 0; 284 } 285 286 static int cs43130_set_pll(struct snd_soc_component *component, int pll_id, int source, 287 unsigned int freq_in, unsigned int freq_out) 288 { 289 int ret = 0; 290 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component); 291 292 switch (freq_in) { 293 case 9600000: 294 case 11289600: 295 case 12000000: 296 case 12288000: 297 case 13000000: 298 case 19200000: 299 case 22579200: 300 case 24000000: 301 case 24576000: 302 case 26000000: 303 cs43130->mclk = freq_in; 304 break; 305 default: 306 dev_err(component->dev, 307 "unsupported pll input reference clock:%d\n", freq_in); 308 return -EINVAL; 309 } 310 311 switch (freq_out) { 312 case 22579200: 313 cs43130->mclk_int = freq_out; 314 break; 315 case 24576000: 316 cs43130->mclk_int = freq_out; 317 break; 318 default: 319 dev_err(component->dev, 320 "unsupported pll output ref clock: %u\n", freq_out); 321 return -EINVAL; 322 } 323 324 ret = cs43130_pll_config(component); 325 dev_dbg(component->dev, "cs43130->pll_bypass = %d", cs43130->pll_bypass); 326 return ret; 327 } 328 329 static int cs43130_change_clksrc(struct snd_soc_component *component, 330 enum cs43130_mclk_src_sel src) 331 { 332 int ret; 333 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component); 334 int mclk_int_decoded; 335 336 if (src == cs43130->mclk_int_src) { 337 /* clk source has not changed */ 338 return 0; 339 } 340 341 switch (cs43130->mclk_int) { 342 case CS43130_MCLK_22M: 343 mclk_int_decoded = CS43130_MCLK_22P5; 344 break; 345 case CS43130_MCLK_24M: 346 mclk_int_decoded = CS43130_MCLK_24P5; 347 break; 348 default: 349 dev_err(component->dev, "Invalid MCLK INT freq: %u\n", cs43130->mclk_int); 350 return -EINVAL; 351 } 352 353 switch (src) { 354 case CS43130_MCLK_SRC_EXT: 355 cs43130->pll_bypass = true; 356 cs43130->mclk_int_src = CS43130_MCLK_SRC_EXT; 357 if (cs43130->xtal_ibias == CS43130_XTAL_UNUSED) { 358 regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL, 359 CS43130_PDN_XTAL_MASK, 360 1 << CS43130_PDN_XTAL_SHIFT); 361 } else { 362 reinit_completion(&cs43130->xtal_rdy); 363 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1, 364 CS43130_XTAL_RDY_INT_MASK, 0); 365 regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL, 366 CS43130_PDN_XTAL_MASK, 0); 367 ret = wait_for_completion_timeout(&cs43130->xtal_rdy, 368 msecs_to_jiffies(100)); 369 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1, 370 CS43130_XTAL_RDY_INT_MASK, 371 1 << CS43130_XTAL_RDY_INT_SHIFT); 372 if (ret == 0) { 373 dev_err(component->dev, "Timeout waiting for XTAL_READY interrupt\n"); 374 return -ETIMEDOUT; 375 } 376 } 377 378 regmap_update_bits(cs43130->regmap, CS43130_SYS_CLK_CTL_1, 379 CS43130_MCLK_SRC_SEL_MASK, 380 src << CS43130_MCLK_SRC_SEL_SHIFT); 381 regmap_update_bits(cs43130->regmap, CS43130_SYS_CLK_CTL_1, 382 CS43130_MCLK_INT_MASK, 383 mclk_int_decoded << CS43130_MCLK_INT_SHIFT); 384 usleep_range(150, 200); 385 386 regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL, 387 CS43130_PDN_PLL_MASK, 388 1 << CS43130_PDN_PLL_SHIFT); 389 break; 390 case CS43130_MCLK_SRC_PLL: 391 cs43130->pll_bypass = false; 392 cs43130->mclk_int_src = CS43130_MCLK_SRC_PLL; 393 if (cs43130->xtal_ibias == CS43130_XTAL_UNUSED) { 394 regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL, 395 CS43130_PDN_XTAL_MASK, 396 1 << CS43130_PDN_XTAL_SHIFT); 397 } else { 398 reinit_completion(&cs43130->xtal_rdy); 399 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1, 400 CS43130_XTAL_RDY_INT_MASK, 0); 401 regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL, 402 CS43130_PDN_XTAL_MASK, 0); 403 ret = wait_for_completion_timeout(&cs43130->xtal_rdy, 404 msecs_to_jiffies(100)); 405 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1, 406 CS43130_XTAL_RDY_INT_MASK, 407 1 << CS43130_XTAL_RDY_INT_SHIFT); 408 if (ret == 0) { 409 dev_err(component->dev, "Timeout waiting for XTAL_READY interrupt\n"); 410 return -ETIMEDOUT; 411 } 412 } 413 414 reinit_completion(&cs43130->pll_rdy); 415 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1, 416 CS43130_PLL_RDY_INT_MASK, 0); 417 regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL, 418 CS43130_PDN_PLL_MASK, 0); 419 ret = wait_for_completion_timeout(&cs43130->pll_rdy, 420 msecs_to_jiffies(100)); 421 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1, 422 CS43130_PLL_RDY_INT_MASK, 423 1 << CS43130_PLL_RDY_INT_SHIFT); 424 if (ret == 0) { 425 dev_err(component->dev, "Timeout waiting for PLL_READY interrupt\n"); 426 return -ETIMEDOUT; 427 } 428 429 regmap_update_bits(cs43130->regmap, CS43130_SYS_CLK_CTL_1, 430 CS43130_MCLK_SRC_SEL_MASK, 431 src << CS43130_MCLK_SRC_SEL_SHIFT); 432 regmap_update_bits(cs43130->regmap, CS43130_SYS_CLK_CTL_1, 433 CS43130_MCLK_INT_MASK, 434 mclk_int_decoded << CS43130_MCLK_INT_SHIFT); 435 usleep_range(150, 200); 436 break; 437 case CS43130_MCLK_SRC_RCO: 438 cs43130->mclk_int_src = CS43130_MCLK_SRC_RCO; 439 440 regmap_update_bits(cs43130->regmap, CS43130_SYS_CLK_CTL_1, 441 CS43130_MCLK_SRC_SEL_MASK, 442 src << CS43130_MCLK_SRC_SEL_SHIFT); 443 regmap_update_bits(cs43130->regmap, CS43130_SYS_CLK_CTL_1, 444 CS43130_MCLK_INT_MASK, 445 CS43130_MCLK_22P5 << CS43130_MCLK_INT_SHIFT); 446 usleep_range(150, 200); 447 448 regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL, 449 CS43130_PDN_XTAL_MASK, 450 1 << CS43130_PDN_XTAL_SHIFT); 451 regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL, 452 CS43130_PDN_PLL_MASK, 453 1 << CS43130_PDN_PLL_SHIFT); 454 break; 455 default: 456 dev_err(component->dev, "Invalid MCLK source value\n"); 457 return -EINVAL; 458 } 459 460 return 0; 461 } 462 463 static const struct cs43130_bitwidth_map cs43130_bitwidth_table[] = { 464 {8, CS43130_SP_BIT_SIZE_8, CS43130_CH_BIT_SIZE_8}, 465 {16, CS43130_SP_BIT_SIZE_16, CS43130_CH_BIT_SIZE_16}, 466 {24, CS43130_SP_BIT_SIZE_24, CS43130_CH_BIT_SIZE_24}, 467 {32, CS43130_SP_BIT_SIZE_32, CS43130_CH_BIT_SIZE_32}, 468 }; 469 470 static const struct cs43130_bitwidth_map *cs43130_get_bitwidth_table( 471 unsigned int bitwidth) 472 { 473 int i; 474 475 for (i = 0; i < ARRAY_SIZE(cs43130_bitwidth_table); i++) { 476 if (cs43130_bitwidth_table[i].bitwidth == bitwidth) 477 return &cs43130_bitwidth_table[i]; 478 } 479 480 return NULL; 481 } 482 483 static int cs43130_set_bitwidth(int dai_id, unsigned int bitwidth_dai, 484 struct regmap *regmap) 485 { 486 const struct cs43130_bitwidth_map *bw_map; 487 488 bw_map = cs43130_get_bitwidth_table(bitwidth_dai); 489 if (!bw_map) 490 return -EINVAL; 491 492 switch (dai_id) { 493 case CS43130_ASP_PCM_DAI: 494 case CS43130_ASP_DOP_DAI: 495 regmap_update_bits(regmap, CS43130_ASP_CH_1_SZ_EN, 496 CS43130_CH_BITSIZE_MASK, bw_map->ch_bit); 497 regmap_update_bits(regmap, CS43130_ASP_CH_2_SZ_EN, 498 CS43130_CH_BITSIZE_MASK, bw_map->ch_bit); 499 regmap_update_bits(regmap, CS43130_SP_BITSIZE, 500 CS43130_ASP_BITSIZE_MASK, bw_map->sp_bit); 501 break; 502 case CS43130_XSP_DOP_DAI: 503 regmap_update_bits(regmap, CS43130_XSP_CH_1_SZ_EN, 504 CS43130_CH_BITSIZE_MASK, bw_map->ch_bit); 505 regmap_update_bits(regmap, CS43130_XSP_CH_2_SZ_EN, 506 CS43130_CH_BITSIZE_MASK, bw_map->ch_bit); 507 regmap_update_bits(regmap, CS43130_SP_BITSIZE, 508 CS43130_XSP_BITSIZE_MASK, bw_map->sp_bit << 509 CS43130_XSP_BITSIZE_SHIFT); 510 break; 511 default: 512 return -EINVAL; 513 } 514 515 return 0; 516 } 517 518 static const struct cs43130_rate_map cs43130_rate_table[] = { 519 {32000, CS43130_ASP_SPRATE_32K}, 520 {44100, CS43130_ASP_SPRATE_44_1K}, 521 {48000, CS43130_ASP_SPRATE_48K}, 522 {88200, CS43130_ASP_SPRATE_88_2K}, 523 {96000, CS43130_ASP_SPRATE_96K}, 524 {176400, CS43130_ASP_SPRATE_176_4K}, 525 {192000, CS43130_ASP_SPRATE_192K}, 526 {352800, CS43130_ASP_SPRATE_352_8K}, 527 {384000, CS43130_ASP_SPRATE_384K}, 528 }; 529 530 static const struct cs43130_rate_map *cs43130_get_rate_table(int fs) 531 { 532 int i; 533 534 for (i = 0; i < ARRAY_SIZE(cs43130_rate_table); i++) { 535 if (cs43130_rate_table[i].fs == fs) 536 return &cs43130_rate_table[i]; 537 } 538 539 return NULL; 540 } 541 542 static const struct cs43130_clk_gen *cs43130_get_clk_gen(int mclk_int, int fs, 543 const struct cs43130_clk_gen *clk_gen_table, int len_clk_gen_table) 544 { 545 int i; 546 547 for (i = 0; i < len_clk_gen_table; i++) { 548 if (clk_gen_table[i].mclk_int == mclk_int && 549 clk_gen_table[i].fs == fs) 550 return &clk_gen_table[i]; 551 } 552 553 return NULL; 554 } 555 556 static int cs43130_set_sp_fmt(int dai_id, unsigned int bitwidth_sclk, 557 struct snd_pcm_hw_params *params, 558 struct cs43130_private *cs43130) 559 { 560 u16 frm_size; 561 u16 hi_size; 562 u8 frm_delay; 563 u8 frm_phase; 564 u8 frm_data; 565 u8 sclk_edge; 566 u8 lrck_edge; 567 u8 clk_data; 568 u8 loc_ch1; 569 u8 loc_ch2; 570 u8 dai_mode_val; 571 const struct cs43130_clk_gen *clk_gen; 572 573 switch (cs43130->dais[dai_id].dai_format) { 574 case SND_SOC_DAIFMT_I2S: 575 hi_size = bitwidth_sclk; 576 frm_delay = 2; 577 frm_phase = 0; 578 break; 579 case SND_SOC_DAIFMT_LEFT_J: 580 hi_size = bitwidth_sclk; 581 frm_delay = 2; 582 frm_phase = 1; 583 break; 584 case SND_SOC_DAIFMT_DSP_A: 585 hi_size = 1; 586 frm_delay = 2; 587 frm_phase = 1; 588 break; 589 case SND_SOC_DAIFMT_DSP_B: 590 hi_size = 1; 591 frm_delay = 0; 592 frm_phase = 1; 593 break; 594 default: 595 return -EINVAL; 596 } 597 598 switch (cs43130->dais[dai_id].dai_mode) { 599 case SND_SOC_DAIFMT_CBS_CFS: 600 dai_mode_val = 0; 601 break; 602 case SND_SOC_DAIFMT_CBM_CFM: 603 dai_mode_val = 1; 604 break; 605 default: 606 return -EINVAL; 607 } 608 609 frm_size = bitwidth_sclk * params_channels(params); 610 sclk_edge = 1; 611 lrck_edge = 0; 612 loc_ch1 = 0; 613 loc_ch2 = bitwidth_sclk * (params_channels(params) - 1); 614 615 frm_data = frm_delay & CS43130_SP_FSD_MASK; 616 frm_data |= (frm_phase << CS43130_SP_STP_SHIFT) & CS43130_SP_STP_MASK; 617 618 clk_data = lrck_edge & CS43130_SP_LCPOL_IN_MASK; 619 clk_data |= (lrck_edge << CS43130_SP_LCPOL_OUT_SHIFT) & 620 CS43130_SP_LCPOL_OUT_MASK; 621 clk_data |= (sclk_edge << CS43130_SP_SCPOL_IN_SHIFT) & 622 CS43130_SP_SCPOL_IN_MASK; 623 clk_data |= (sclk_edge << CS43130_SP_SCPOL_OUT_SHIFT) & 624 CS43130_SP_SCPOL_OUT_MASK; 625 clk_data |= (dai_mode_val << CS43130_SP_MODE_SHIFT) & 626 CS43130_SP_MODE_MASK; 627 628 switch (dai_id) { 629 case CS43130_ASP_PCM_DAI: 630 case CS43130_ASP_DOP_DAI: 631 regmap_update_bits(cs43130->regmap, CS43130_ASP_LRCK_PERIOD_1, 632 CS43130_SP_LCPR_DATA_MASK, (frm_size - 1) >> 633 CS43130_SP_LCPR_LSB_DATA_SHIFT); 634 regmap_update_bits(cs43130->regmap, CS43130_ASP_LRCK_PERIOD_2, 635 CS43130_SP_LCPR_DATA_MASK, (frm_size - 1) >> 636 CS43130_SP_LCPR_MSB_DATA_SHIFT); 637 regmap_update_bits(cs43130->regmap, CS43130_ASP_LRCK_HI_TIME_1, 638 CS43130_SP_LCHI_DATA_MASK, (hi_size - 1) >> 639 CS43130_SP_LCHI_LSB_DATA_SHIFT); 640 regmap_update_bits(cs43130->regmap, CS43130_ASP_LRCK_HI_TIME_2, 641 CS43130_SP_LCHI_DATA_MASK, (hi_size - 1) >> 642 CS43130_SP_LCHI_MSB_DATA_SHIFT); 643 regmap_write(cs43130->regmap, CS43130_ASP_FRAME_CONF, frm_data); 644 regmap_write(cs43130->regmap, CS43130_ASP_CH_1_LOC, loc_ch1); 645 regmap_write(cs43130->regmap, CS43130_ASP_CH_2_LOC, loc_ch2); 646 regmap_update_bits(cs43130->regmap, CS43130_ASP_CH_1_SZ_EN, 647 CS43130_CH_EN_MASK, 1 << CS43130_CH_EN_SHIFT); 648 regmap_update_bits(cs43130->regmap, CS43130_ASP_CH_2_SZ_EN, 649 CS43130_CH_EN_MASK, 1 << CS43130_CH_EN_SHIFT); 650 regmap_write(cs43130->regmap, CS43130_ASP_CLOCK_CONF, clk_data); 651 break; 652 case CS43130_XSP_DOP_DAI: 653 regmap_update_bits(cs43130->regmap, CS43130_XSP_LRCK_PERIOD_1, 654 CS43130_SP_LCPR_DATA_MASK, (frm_size - 1) >> 655 CS43130_SP_LCPR_LSB_DATA_SHIFT); 656 regmap_update_bits(cs43130->regmap, CS43130_XSP_LRCK_PERIOD_2, 657 CS43130_SP_LCPR_DATA_MASK, (frm_size - 1) >> 658 CS43130_SP_LCPR_MSB_DATA_SHIFT); 659 regmap_update_bits(cs43130->regmap, CS43130_XSP_LRCK_HI_TIME_1, 660 CS43130_SP_LCHI_DATA_MASK, (hi_size - 1) >> 661 CS43130_SP_LCHI_LSB_DATA_SHIFT); 662 regmap_update_bits(cs43130->regmap, CS43130_XSP_LRCK_HI_TIME_2, 663 CS43130_SP_LCHI_DATA_MASK, (hi_size - 1) >> 664 CS43130_SP_LCHI_MSB_DATA_SHIFT); 665 regmap_write(cs43130->regmap, CS43130_XSP_FRAME_CONF, frm_data); 666 regmap_write(cs43130->regmap, CS43130_XSP_CH_1_LOC, loc_ch1); 667 regmap_write(cs43130->regmap, CS43130_XSP_CH_2_LOC, loc_ch2); 668 regmap_update_bits(cs43130->regmap, CS43130_XSP_CH_1_SZ_EN, 669 CS43130_CH_EN_MASK, 1 << CS43130_CH_EN_SHIFT); 670 regmap_update_bits(cs43130->regmap, CS43130_XSP_CH_2_SZ_EN, 671 CS43130_CH_EN_MASK, 1 << CS43130_CH_EN_SHIFT); 672 regmap_write(cs43130->regmap, CS43130_XSP_CLOCK_CONF, clk_data); 673 break; 674 default: 675 return -EINVAL; 676 } 677 678 switch (frm_size) { 679 case 16: 680 clk_gen = cs43130_get_clk_gen(cs43130->mclk_int, 681 params_rate(params), 682 cs43130_16_clk_gen, 683 ARRAY_SIZE(cs43130_16_clk_gen)); 684 break; 685 case 32: 686 clk_gen = cs43130_get_clk_gen(cs43130->mclk_int, 687 params_rate(params), 688 cs43130_32_clk_gen, 689 ARRAY_SIZE(cs43130_32_clk_gen)); 690 break; 691 case 48: 692 clk_gen = cs43130_get_clk_gen(cs43130->mclk_int, 693 params_rate(params), 694 cs43130_48_clk_gen, 695 ARRAY_SIZE(cs43130_48_clk_gen)); 696 break; 697 case 64: 698 clk_gen = cs43130_get_clk_gen(cs43130->mclk_int, 699 params_rate(params), 700 cs43130_64_clk_gen, 701 ARRAY_SIZE(cs43130_64_clk_gen)); 702 break; 703 default: 704 return -EINVAL; 705 } 706 707 if (!clk_gen) 708 return -EINVAL; 709 710 switch (dai_id) { 711 case CS43130_ASP_PCM_DAI: 712 case CS43130_ASP_DOP_DAI: 713 regmap_write(cs43130->regmap, CS43130_ASP_DEN_1, 714 (clk_gen->den & CS43130_SP_M_LSB_DATA_MASK) >> 715 CS43130_SP_M_LSB_DATA_SHIFT); 716 regmap_write(cs43130->regmap, CS43130_ASP_DEN_2, 717 (clk_gen->den & CS43130_SP_M_MSB_DATA_MASK) >> 718 CS43130_SP_M_MSB_DATA_SHIFT); 719 regmap_write(cs43130->regmap, CS43130_ASP_NUM_1, 720 (clk_gen->num & CS43130_SP_N_LSB_DATA_MASK) >> 721 CS43130_SP_N_LSB_DATA_SHIFT); 722 regmap_write(cs43130->regmap, CS43130_ASP_NUM_2, 723 (clk_gen->num & CS43130_SP_N_MSB_DATA_MASK) >> 724 CS43130_SP_N_MSB_DATA_SHIFT); 725 break; 726 case CS43130_XSP_DOP_DAI: 727 regmap_write(cs43130->regmap, CS43130_XSP_DEN_1, 728 (clk_gen->den & CS43130_SP_M_LSB_DATA_MASK) >> 729 CS43130_SP_M_LSB_DATA_SHIFT); 730 regmap_write(cs43130->regmap, CS43130_XSP_DEN_2, 731 (clk_gen->den & CS43130_SP_M_MSB_DATA_MASK) >> 732 CS43130_SP_M_MSB_DATA_SHIFT); 733 regmap_write(cs43130->regmap, CS43130_XSP_NUM_1, 734 (clk_gen->num & CS43130_SP_N_LSB_DATA_MASK) >> 735 CS43130_SP_N_LSB_DATA_SHIFT); 736 regmap_write(cs43130->regmap, CS43130_XSP_NUM_2, 737 (clk_gen->num & CS43130_SP_N_MSB_DATA_MASK) >> 738 CS43130_SP_N_MSB_DATA_SHIFT); 739 break; 740 default: 741 return -EINVAL; 742 } 743 744 return 0; 745 } 746 747 static int cs43130_pcm_dsd_mix(bool en, struct regmap *regmap) 748 { 749 if (en) { 750 regmap_update_bits(regmap, CS43130_DSD_PCM_MIX_CTL, 751 CS43130_MIX_PCM_PREP_MASK, 752 1 << CS43130_MIX_PCM_PREP_SHIFT); 753 usleep_range(6000, 6050); 754 regmap_update_bits(regmap, CS43130_DSD_PCM_MIX_CTL, 755 CS43130_MIX_PCM_DSD_MASK, 756 1 << CS43130_MIX_PCM_DSD_SHIFT); 757 } else { 758 regmap_update_bits(regmap, CS43130_DSD_PCM_MIX_CTL, 759 CS43130_MIX_PCM_DSD_MASK, 760 0 << CS43130_MIX_PCM_DSD_SHIFT); 761 usleep_range(1600, 1650); 762 regmap_update_bits(regmap, CS43130_DSD_PCM_MIX_CTL, 763 CS43130_MIX_PCM_PREP_MASK, 764 0 << CS43130_MIX_PCM_PREP_SHIFT); 765 } 766 767 return 0; 768 } 769 770 static int cs43130_dsd_hw_params(struct snd_pcm_substream *substream, 771 struct snd_pcm_hw_params *params, 772 struct snd_soc_dai *dai) 773 { 774 struct snd_soc_component *component = dai->component; 775 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component); 776 unsigned int required_clk; 777 u8 dsd_speed; 778 779 mutex_lock(&cs43130->clk_mutex); 780 if (!cs43130->clk_req) { 781 /* no DAI is currently using clk */ 782 if (!(CS43130_MCLK_22M % params_rate(params))) 783 required_clk = CS43130_MCLK_22M; 784 else 785 required_clk = CS43130_MCLK_24M; 786 787 cs43130_set_pll(component, 0, 0, cs43130->mclk, required_clk); 788 if (cs43130->pll_bypass) 789 cs43130_change_clksrc(component, CS43130_MCLK_SRC_EXT); 790 else 791 cs43130_change_clksrc(component, CS43130_MCLK_SRC_PLL); 792 } 793 794 cs43130->clk_req++; 795 if (cs43130->clk_req == 2) 796 cs43130_pcm_dsd_mix(true, cs43130->regmap); 797 mutex_unlock(&cs43130->clk_mutex); 798 799 switch (params_rate(params)) { 800 case 176400: 801 dsd_speed = 0; 802 break; 803 case 352800: 804 dsd_speed = 1; 805 break; 806 default: 807 dev_err(component->dev, "Rate(%u) not supported\n", 808 params_rate(params)); 809 return -EINVAL; 810 } 811 812 if (cs43130->dais[dai->id].dai_mode == SND_SOC_DAIFMT_CBM_CFM) 813 regmap_update_bits(cs43130->regmap, CS43130_DSD_INT_CFG, 814 CS43130_DSD_MASTER, CS43130_DSD_MASTER); 815 else 816 regmap_update_bits(cs43130->regmap, CS43130_DSD_INT_CFG, 817 CS43130_DSD_MASTER, 0); 818 819 regmap_update_bits(cs43130->regmap, CS43130_DSD_PATH_CTL_2, 820 CS43130_DSD_SPEED_MASK, 821 dsd_speed << CS43130_DSD_SPEED_SHIFT); 822 regmap_update_bits(cs43130->regmap, CS43130_DSD_PATH_CTL_2, 823 CS43130_DSD_SRC_MASK, CS43130_DSD_SRC_DSD << 824 CS43130_DSD_SRC_SHIFT); 825 826 return 0; 827 } 828 829 static int cs43130_hw_params(struct snd_pcm_substream *substream, 830 struct snd_pcm_hw_params *params, 831 struct snd_soc_dai *dai) 832 { 833 struct snd_soc_component *component = dai->component; 834 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component); 835 const struct cs43130_rate_map *rate_map; 836 unsigned int sclk = cs43130->dais[dai->id].sclk; 837 unsigned int bitwidth_sclk; 838 unsigned int bitwidth_dai = (unsigned int)(params_width(params)); 839 unsigned int required_clk; 840 u8 dsd_speed; 841 842 mutex_lock(&cs43130->clk_mutex); 843 if (!cs43130->clk_req) { 844 /* no DAI is currently using clk */ 845 if (!(CS43130_MCLK_22M % params_rate(params))) 846 required_clk = CS43130_MCLK_22M; 847 else 848 required_clk = CS43130_MCLK_24M; 849 850 cs43130_set_pll(component, 0, 0, cs43130->mclk, required_clk); 851 if (cs43130->pll_bypass) 852 cs43130_change_clksrc(component, CS43130_MCLK_SRC_EXT); 853 else 854 cs43130_change_clksrc(component, CS43130_MCLK_SRC_PLL); 855 } 856 857 cs43130->clk_req++; 858 if (cs43130->clk_req == 2) 859 cs43130_pcm_dsd_mix(true, cs43130->regmap); 860 mutex_unlock(&cs43130->clk_mutex); 861 862 switch (dai->id) { 863 case CS43130_ASP_DOP_DAI: 864 case CS43130_XSP_DOP_DAI: 865 /* DoP bitwidth is always 24-bit */ 866 bitwidth_dai = 24; 867 sclk = params_rate(params) * bitwidth_dai * 868 params_channels(params); 869 870 switch (params_rate(params)) { 871 case 176400: 872 dsd_speed = 0; 873 break; 874 case 352800: 875 dsd_speed = 1; 876 break; 877 default: 878 dev_err(component->dev, "Rate(%u) not supported\n", 879 params_rate(params)); 880 return -EINVAL; 881 } 882 883 regmap_update_bits(cs43130->regmap, CS43130_DSD_PATH_CTL_2, 884 CS43130_DSD_SPEED_MASK, 885 dsd_speed << CS43130_DSD_SPEED_SHIFT); 886 break; 887 case CS43130_ASP_PCM_DAI: 888 rate_map = cs43130_get_rate_table(params_rate(params)); 889 if (!rate_map) 890 return -EINVAL; 891 892 regmap_write(cs43130->regmap, CS43130_SP_SRATE, rate_map->val); 893 break; 894 default: 895 dev_err(component->dev, "Invalid DAI (%d)\n", dai->id); 896 return -EINVAL; 897 } 898 899 switch (dai->id) { 900 case CS43130_ASP_DOP_DAI: 901 regmap_update_bits(cs43130->regmap, CS43130_DSD_PATH_CTL_2, 902 CS43130_DSD_SRC_MASK, CS43130_DSD_SRC_ASP << 903 CS43130_DSD_SRC_SHIFT); 904 break; 905 case CS43130_XSP_DOP_DAI: 906 regmap_update_bits(cs43130->regmap, CS43130_DSD_PATH_CTL_2, 907 CS43130_DSD_SRC_MASK, CS43130_DSD_SRC_XSP << 908 CS43130_DSD_SRC_SHIFT); 909 break; 910 } 911 912 if (!sclk && cs43130->dais[dai->id].dai_mode == SND_SOC_DAIFMT_CBM_CFM) 913 /* Calculate SCLK in master mode if unassigned */ 914 sclk = params_rate(params) * bitwidth_dai * 915 params_channels(params); 916 917 if (!sclk) { 918 /* at this point, SCLK must be set */ 919 dev_err(component->dev, "SCLK freq is not set\n"); 920 return -EINVAL; 921 } 922 923 bitwidth_sclk = (sclk / params_rate(params)) / params_channels(params); 924 if (bitwidth_sclk < bitwidth_dai) { 925 dev_err(component->dev, "Format not supported: SCLK freq is too low\n"); 926 return -EINVAL; 927 } 928 929 dev_dbg(component->dev, 930 "sclk = %u, fs = %d, bitwidth_dai = %u\n", 931 sclk, params_rate(params), bitwidth_dai); 932 933 dev_dbg(component->dev, 934 "bitwidth_sclk = %u, num_ch = %u\n", 935 bitwidth_sclk, params_channels(params)); 936 937 cs43130_set_bitwidth(dai->id, bitwidth_dai, cs43130->regmap); 938 cs43130_set_sp_fmt(dai->id, bitwidth_sclk, params, cs43130); 939 940 return 0; 941 } 942 943 static int cs43130_hw_free(struct snd_pcm_substream *substream, 944 struct snd_soc_dai *dai) 945 { 946 struct snd_soc_component *component = dai->component; 947 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component); 948 949 mutex_lock(&cs43130->clk_mutex); 950 cs43130->clk_req--; 951 if (!cs43130->clk_req) { 952 /* no DAI is currently using clk */ 953 cs43130_change_clksrc(component, CS43130_MCLK_SRC_RCO); 954 cs43130_pcm_dsd_mix(false, cs43130->regmap); 955 } 956 mutex_unlock(&cs43130->clk_mutex); 957 958 return 0; 959 } 960 961 static const DECLARE_TLV_DB_SCALE(pcm_vol_tlv, -12750, 50, 1); 962 963 static const char * const pcm_ch_text[] = { 964 "Left-Right Ch", 965 "Left-Left Ch", 966 "Right-Left Ch", 967 "Right-Right Ch", 968 }; 969 970 static const struct reg_sequence pcm_ch_en_seq[] = { 971 {CS43130_DXD1, 0x99}, 972 {0x180005, 0x8C}, 973 {0x180007, 0xAB}, 974 {0x180015, 0x31}, 975 {0x180017, 0xB2}, 976 {0x180025, 0x30}, 977 {0x180027, 0x84}, 978 {0x180035, 0x9C}, 979 {0x180037, 0xAE}, 980 {0x18000D, 0x24}, 981 {0x18000F, 0xA3}, 982 {0x18001D, 0x05}, 983 {0x18001F, 0xD4}, 984 {0x18002D, 0x0B}, 985 {0x18002F, 0xC7}, 986 {0x18003D, 0x71}, 987 {0x18003F, 0xE7}, 988 {CS43130_DXD1, 0}, 989 }; 990 991 static const struct reg_sequence pcm_ch_dis_seq[] = { 992 {CS43130_DXD1, 0x99}, 993 {0x180005, 0x24}, 994 {0x180007, 0xA3}, 995 {0x180015, 0x05}, 996 {0x180017, 0xD4}, 997 {0x180025, 0x0B}, 998 {0x180027, 0xC7}, 999 {0x180035, 0x71}, 1000 {0x180037, 0xE7}, 1001 {0x18000D, 0x8C}, 1002 {0x18000F, 0xAB}, 1003 {0x18001D, 0x31}, 1004 {0x18001F, 0xB2}, 1005 {0x18002D, 0x30}, 1006 {0x18002F, 0x84}, 1007 {0x18003D, 0x9C}, 1008 {0x18003F, 0xAE}, 1009 {CS43130_DXD1, 0}, 1010 }; 1011 1012 static int cs43130_pcm_ch_get(struct snd_kcontrol *kcontrol, 1013 struct snd_ctl_elem_value *ucontrol) 1014 { 1015 return snd_soc_get_enum_double(kcontrol, ucontrol); 1016 } 1017 1018 static int cs43130_pcm_ch_put(struct snd_kcontrol *kcontrol, 1019 struct snd_ctl_elem_value *ucontrol) 1020 { 1021 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 1022 unsigned int *item = ucontrol->value.enumerated.item; 1023 struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); 1024 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component); 1025 unsigned int val; 1026 1027 if (item[0] >= e->items) 1028 return -EINVAL; 1029 val = snd_soc_enum_item_to_val(e, item[0]) << e->shift_l; 1030 1031 switch (cs43130->dev_id) { 1032 case CS43131_CHIP_ID: 1033 case CS43198_CHIP_ID: 1034 if (val >= 2) 1035 regmap_multi_reg_write(cs43130->regmap, pcm_ch_en_seq, 1036 ARRAY_SIZE(pcm_ch_en_seq)); 1037 else 1038 regmap_multi_reg_write(cs43130->regmap, pcm_ch_dis_seq, 1039 ARRAY_SIZE(pcm_ch_dis_seq)); 1040 break; 1041 } 1042 1043 return snd_soc_put_enum_double(kcontrol, ucontrol); 1044 } 1045 1046 static SOC_ENUM_SINGLE_DECL(pcm_ch_enum, CS43130_PCM_PATH_CTL_2, 0, 1047 pcm_ch_text); 1048 1049 static const char * const pcm_spd_texts[] = { 1050 "Fast", 1051 "Slow", 1052 }; 1053 1054 static SOC_ENUM_SINGLE_DECL(pcm_spd_enum, CS43130_PCM_FILT_OPT, 7, 1055 pcm_spd_texts); 1056 1057 static const char * const dsd_texts[] = { 1058 "Off", 1059 "BCKA Mode", 1060 "BCKD Mode", 1061 }; 1062 1063 static const unsigned int dsd_values[] = { 1064 CS43130_DSD_SRC_DSD, 1065 CS43130_DSD_SRC_ASP, 1066 CS43130_DSD_SRC_XSP, 1067 }; 1068 1069 static SOC_VALUE_ENUM_SINGLE_DECL(dsd_enum, CS43130_DSD_INT_CFG, 0, 0x03, 1070 dsd_texts, dsd_values); 1071 1072 static const struct snd_kcontrol_new cs43130_snd_controls[] = { 1073 SOC_DOUBLE_R_TLV("Master Playback Volume", 1074 CS43130_PCM_VOL_A, CS43130_PCM_VOL_B, 0, 0xFF, 1, 1075 pcm_vol_tlv), 1076 SOC_DOUBLE_R_TLV("Master DSD Playback Volume", 1077 CS43130_DSD_VOL_A, CS43130_DSD_VOL_B, 0, 0xFF, 1, 1078 pcm_vol_tlv), 1079 SOC_ENUM_EXT("PCM Ch Select", pcm_ch_enum, cs43130_pcm_ch_get, 1080 cs43130_pcm_ch_put), 1081 SOC_ENUM("PCM Filter Speed", pcm_spd_enum), 1082 SOC_SINGLE("PCM Phase Compensation", CS43130_PCM_FILT_OPT, 6, 1, 0), 1083 SOC_SINGLE("PCM Nonoversample Emulate", CS43130_PCM_FILT_OPT, 5, 1, 0), 1084 SOC_SINGLE("PCM High-pass Filter", CS43130_PCM_FILT_OPT, 1, 1, 0), 1085 SOC_SINGLE("PCM De-emphasis Filter", CS43130_PCM_FILT_OPT, 0, 1, 0), 1086 SOC_ENUM("DSD Phase Modulation", dsd_enum), 1087 }; 1088 1089 static const struct reg_sequence pcm_seq[] = { 1090 {CS43130_DXD1, 0x99}, 1091 {CS43130_DXD7, 0x01}, 1092 {CS43130_DXD8, 0}, 1093 {CS43130_DXD9, 0x01}, 1094 {CS43130_DXD3, 0x12}, 1095 {CS43130_DXD4, 0}, 1096 {CS43130_DXD10, 0x28}, 1097 {CS43130_DXD11, 0x28}, 1098 {CS43130_DXD1, 0}, 1099 }; 1100 1101 static const struct reg_sequence dsd_seq[] = { 1102 {CS43130_DXD1, 0x99}, 1103 {CS43130_DXD7, 0x01}, 1104 {CS43130_DXD8, 0}, 1105 {CS43130_DXD9, 0x01}, 1106 {CS43130_DXD3, 0x12}, 1107 {CS43130_DXD4, 0}, 1108 {CS43130_DXD10, 0x1E}, 1109 {CS43130_DXD11, 0x20}, 1110 {CS43130_DXD1, 0}, 1111 }; 1112 1113 static const struct reg_sequence pop_free_seq[] = { 1114 {CS43130_DXD1, 0x99}, 1115 {CS43130_DXD12, 0x0A}, 1116 {CS43130_DXD1, 0}, 1117 }; 1118 1119 static const struct reg_sequence pop_free_seq2[] = { 1120 {CS43130_DXD1, 0x99}, 1121 {CS43130_DXD13, 0x20}, 1122 {CS43130_DXD1, 0}, 1123 }; 1124 1125 static const struct reg_sequence mute_seq[] = { 1126 {CS43130_DXD1, 0x99}, 1127 {CS43130_DXD3, 0x12}, 1128 {CS43130_DXD5, 0x02}, 1129 {CS43130_DXD4, 0x12}, 1130 {CS43130_DXD1, 0}, 1131 }; 1132 1133 static const struct reg_sequence unmute_seq[] = { 1134 {CS43130_DXD1, 0x99}, 1135 {CS43130_DXD3, 0x10}, 1136 {CS43130_DXD5, 0}, 1137 {CS43130_DXD4, 0x16}, 1138 {CS43130_DXD1, 0}, 1139 }; 1140 1141 static int cs43130_dsd_event(struct snd_soc_dapm_widget *w, 1142 struct snd_kcontrol *kcontrol, int event) 1143 { 1144 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 1145 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component); 1146 1147 switch (event) { 1148 case SND_SOC_DAPM_PRE_PMU: 1149 switch (cs43130->dev_id) { 1150 case CS43130_CHIP_ID: 1151 case CS4399_CHIP_ID: 1152 regmap_multi_reg_write(cs43130->regmap, dsd_seq, 1153 ARRAY_SIZE(dsd_seq)); 1154 break; 1155 } 1156 break; 1157 case SND_SOC_DAPM_POST_PMU: 1158 regmap_update_bits(cs43130->regmap, CS43130_DSD_PATH_CTL_1, 1159 CS43130_MUTE_MASK, 0); 1160 switch (cs43130->dev_id) { 1161 case CS43130_CHIP_ID: 1162 case CS4399_CHIP_ID: 1163 regmap_multi_reg_write(cs43130->regmap, unmute_seq, 1164 ARRAY_SIZE(unmute_seq)); 1165 break; 1166 } 1167 break; 1168 case SND_SOC_DAPM_PRE_PMD: 1169 switch (cs43130->dev_id) { 1170 case CS43130_CHIP_ID: 1171 case CS4399_CHIP_ID: 1172 regmap_multi_reg_write(cs43130->regmap, mute_seq, 1173 ARRAY_SIZE(mute_seq)); 1174 regmap_update_bits(cs43130->regmap, 1175 CS43130_DSD_PATH_CTL_1, 1176 CS43130_MUTE_MASK, CS43130_MUTE_EN); 1177 /* 1178 * DSD Power Down Sequence 1179 * According to Design, 130ms is preferred. 1180 */ 1181 msleep(130); 1182 break; 1183 case CS43131_CHIP_ID: 1184 case CS43198_CHIP_ID: 1185 regmap_update_bits(cs43130->regmap, 1186 CS43130_DSD_PATH_CTL_1, 1187 CS43130_MUTE_MASK, CS43130_MUTE_EN); 1188 break; 1189 } 1190 break; 1191 default: 1192 dev_err(component->dev, "Invalid event = 0x%x\n", event); 1193 return -EINVAL; 1194 } 1195 return 0; 1196 } 1197 1198 static int cs43130_pcm_event(struct snd_soc_dapm_widget *w, 1199 struct snd_kcontrol *kcontrol, int event) 1200 { 1201 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 1202 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component); 1203 1204 switch (event) { 1205 case SND_SOC_DAPM_PRE_PMU: 1206 switch (cs43130->dev_id) { 1207 case CS43130_CHIP_ID: 1208 case CS4399_CHIP_ID: 1209 regmap_multi_reg_write(cs43130->regmap, pcm_seq, 1210 ARRAY_SIZE(pcm_seq)); 1211 break; 1212 } 1213 break; 1214 case SND_SOC_DAPM_POST_PMU: 1215 regmap_update_bits(cs43130->regmap, CS43130_PCM_PATH_CTL_1, 1216 CS43130_MUTE_MASK, 0); 1217 switch (cs43130->dev_id) { 1218 case CS43130_CHIP_ID: 1219 case CS4399_CHIP_ID: 1220 regmap_multi_reg_write(cs43130->regmap, unmute_seq, 1221 ARRAY_SIZE(unmute_seq)); 1222 break; 1223 } 1224 break; 1225 case SND_SOC_DAPM_PRE_PMD: 1226 switch (cs43130->dev_id) { 1227 case CS43130_CHIP_ID: 1228 case CS4399_CHIP_ID: 1229 regmap_multi_reg_write(cs43130->regmap, mute_seq, 1230 ARRAY_SIZE(mute_seq)); 1231 regmap_update_bits(cs43130->regmap, 1232 CS43130_PCM_PATH_CTL_1, 1233 CS43130_MUTE_MASK, CS43130_MUTE_EN); 1234 /* 1235 * PCM Power Down Sequence 1236 * According to Design, 130ms is preferred. 1237 */ 1238 msleep(130); 1239 break; 1240 case CS43131_CHIP_ID: 1241 case CS43198_CHIP_ID: 1242 regmap_update_bits(cs43130->regmap, 1243 CS43130_PCM_PATH_CTL_1, 1244 CS43130_MUTE_MASK, CS43130_MUTE_EN); 1245 break; 1246 } 1247 break; 1248 default: 1249 dev_err(component->dev, "Invalid event = 0x%x\n", event); 1250 return -EINVAL; 1251 } 1252 return 0; 1253 } 1254 1255 static const struct reg_sequence dac_postpmu_seq[] = { 1256 {CS43130_DXD9, 0x0C}, 1257 {CS43130_DXD3, 0x10}, 1258 {CS43130_DXD4, 0x20}, 1259 }; 1260 1261 static const struct reg_sequence dac_postpmd_seq[] = { 1262 {CS43130_DXD1, 0x99}, 1263 {CS43130_DXD6, 0x01}, 1264 {CS43130_DXD1, 0}, 1265 }; 1266 1267 static int cs43130_dac_event(struct snd_soc_dapm_widget *w, 1268 struct snd_kcontrol *kcontrol, int event) 1269 { 1270 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 1271 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component); 1272 1273 switch (event) { 1274 case SND_SOC_DAPM_PRE_PMU: 1275 switch (cs43130->dev_id) { 1276 case CS43130_CHIP_ID: 1277 case CS4399_CHIP_ID: 1278 regmap_multi_reg_write(cs43130->regmap, pop_free_seq, 1279 ARRAY_SIZE(pop_free_seq)); 1280 break; 1281 case CS43131_CHIP_ID: 1282 case CS43198_CHIP_ID: 1283 regmap_multi_reg_write(cs43130->regmap, pop_free_seq2, 1284 ARRAY_SIZE(pop_free_seq2)); 1285 break; 1286 } 1287 break; 1288 case SND_SOC_DAPM_POST_PMU: 1289 usleep_range(10000, 10050); 1290 1291 regmap_write(cs43130->regmap, CS43130_DXD1, 0x99); 1292 1293 switch (cs43130->dev_id) { 1294 case CS43130_CHIP_ID: 1295 case CS4399_CHIP_ID: 1296 regmap_multi_reg_write(cs43130->regmap, dac_postpmu_seq, 1297 ARRAY_SIZE(dac_postpmu_seq)); 1298 /* 1299 * Per datasheet, Sec. PCM Power-Up Sequence. 1300 * According to Design, CS43130_DXD12 must be 0 to meet 1301 * THDN and Dynamic Range spec. 1302 */ 1303 msleep(1000); 1304 regmap_write(cs43130->regmap, CS43130_DXD12, 0); 1305 break; 1306 case CS43131_CHIP_ID: 1307 case CS43198_CHIP_ID: 1308 usleep_range(12000, 12010); 1309 regmap_write(cs43130->regmap, CS43130_DXD13, 0); 1310 break; 1311 } 1312 1313 regmap_write(cs43130->regmap, CS43130_DXD1, 0); 1314 break; 1315 case SND_SOC_DAPM_POST_PMD: 1316 switch (cs43130->dev_id) { 1317 case CS43130_CHIP_ID: 1318 case CS4399_CHIP_ID: 1319 regmap_multi_reg_write(cs43130->regmap, dac_postpmd_seq, 1320 ARRAY_SIZE(dac_postpmd_seq)); 1321 break; 1322 } 1323 break; 1324 default: 1325 dev_err(component->dev, "Invalid DAC event = 0x%x\n", event); 1326 return -EINVAL; 1327 } 1328 return 0; 1329 } 1330 1331 static const struct reg_sequence hpin_prepmd_seq[] = { 1332 {CS43130_DXD1, 0x99}, 1333 {CS43130_DXD15, 0x64}, 1334 {CS43130_DXD14, 0}, 1335 {CS43130_DXD2, 0}, 1336 {CS43130_DXD1, 0}, 1337 }; 1338 1339 static const struct reg_sequence hpin_postpmu_seq[] = { 1340 {CS43130_DXD1, 0x99}, 1341 {CS43130_DXD2, 1}, 1342 {CS43130_DXD14, 0xDC}, 1343 {CS43130_DXD15, 0xE4}, 1344 {CS43130_DXD1, 0}, 1345 }; 1346 1347 static int cs43130_hpin_event(struct snd_soc_dapm_widget *w, 1348 struct snd_kcontrol *kcontrol, int event) 1349 { 1350 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 1351 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component); 1352 1353 switch (event) { 1354 case SND_SOC_DAPM_POST_PMD: 1355 regmap_multi_reg_write(cs43130->regmap, hpin_prepmd_seq, 1356 ARRAY_SIZE(hpin_prepmd_seq)); 1357 break; 1358 case SND_SOC_DAPM_PRE_PMU: 1359 regmap_multi_reg_write(cs43130->regmap, hpin_postpmu_seq, 1360 ARRAY_SIZE(hpin_postpmu_seq)); 1361 break; 1362 default: 1363 dev_err(component->dev, "Invalid HPIN event = 0x%x\n", event); 1364 return -EINVAL; 1365 } 1366 return 0; 1367 } 1368 1369 static const struct snd_soc_dapm_widget digital_hp_widgets[] = { 1370 SND_SOC_DAPM_OUTPUT("HPOUTA"), 1371 SND_SOC_DAPM_OUTPUT("HPOUTB"), 1372 1373 SND_SOC_DAPM_AIF_IN_E("ASPIN PCM", NULL, 0, CS43130_PWDN_CTL, 1374 CS43130_PDN_ASP_SHIFT, 1, cs43130_pcm_event, 1375 (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 1376 SND_SOC_DAPM_PRE_PMD)), 1377 1378 SND_SOC_DAPM_AIF_IN_E("ASPIN DoP", NULL, 0, CS43130_PWDN_CTL, 1379 CS43130_PDN_ASP_SHIFT, 1, cs43130_dsd_event, 1380 (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 1381 SND_SOC_DAPM_PRE_PMD)), 1382 1383 SND_SOC_DAPM_AIF_IN_E("XSPIN DoP", NULL, 0, CS43130_PWDN_CTL, 1384 CS43130_PDN_XSP_SHIFT, 1, cs43130_dsd_event, 1385 (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 1386 SND_SOC_DAPM_PRE_PMD)), 1387 1388 SND_SOC_DAPM_AIF_IN_E("XSPIN DSD", NULL, 0, CS43130_PWDN_CTL, 1389 CS43130_PDN_DSDIF_SHIFT, 1, cs43130_dsd_event, 1390 (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 1391 SND_SOC_DAPM_PRE_PMD)), 1392 1393 SND_SOC_DAPM_DAC("DSD", NULL, CS43130_DSD_PATH_CTL_2, 1394 CS43130_DSD_EN_SHIFT, 0), 1395 1396 SND_SOC_DAPM_DAC_E("HiFi DAC", NULL, CS43130_PWDN_CTL, 1397 CS43130_PDN_HP_SHIFT, 1, cs43130_dac_event, 1398 (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | 1399 SND_SOC_DAPM_POST_PMD)), 1400 }; 1401 1402 static const struct snd_soc_dapm_widget analog_hp_widgets[] = { 1403 SND_SOC_DAPM_DAC_E("Analog Playback", NULL, CS43130_HP_OUT_CTL_1, 1404 CS43130_HP_IN_EN_SHIFT, 0, cs43130_hpin_event, 1405 (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD)), 1406 }; 1407 1408 static struct snd_soc_dapm_widget all_hp_widgets[ 1409 ARRAY_SIZE(digital_hp_widgets) + 1410 ARRAY_SIZE(analog_hp_widgets)]; 1411 1412 static const struct snd_soc_dapm_route digital_hp_routes[] = { 1413 {"ASPIN PCM", NULL, "ASP PCM Playback"}, 1414 {"ASPIN DoP", NULL, "ASP DoP Playback"}, 1415 {"XSPIN DoP", NULL, "XSP DoP Playback"}, 1416 {"XSPIN DSD", NULL, "XSP DSD Playback"}, 1417 {"DSD", NULL, "ASPIN DoP"}, 1418 {"DSD", NULL, "XSPIN DoP"}, 1419 {"DSD", NULL, "XSPIN DSD"}, 1420 {"HiFi DAC", NULL, "ASPIN PCM"}, 1421 {"HiFi DAC", NULL, "DSD"}, 1422 {"HPOUTA", NULL, "HiFi DAC"}, 1423 {"HPOUTB", NULL, "HiFi DAC"}, 1424 }; 1425 1426 static const struct snd_soc_dapm_route analog_hp_routes[] = { 1427 {"HPOUTA", NULL, "Analog Playback"}, 1428 {"HPOUTB", NULL, "Analog Playback"}, 1429 }; 1430 1431 static struct snd_soc_dapm_route all_hp_routes[ 1432 ARRAY_SIZE(digital_hp_routes) + 1433 ARRAY_SIZE(analog_hp_routes)]; 1434 1435 static const unsigned int cs43130_asp_src_rates[] = { 1436 32000, 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000 1437 }; 1438 1439 static const struct snd_pcm_hw_constraint_list cs43130_asp_constraints = { 1440 .count = ARRAY_SIZE(cs43130_asp_src_rates), 1441 .list = cs43130_asp_src_rates, 1442 }; 1443 1444 static int cs43130_pcm_startup(struct snd_pcm_substream *substream, 1445 struct snd_soc_dai *dai) 1446 { 1447 return snd_pcm_hw_constraint_list(substream->runtime, 0, 1448 SNDRV_PCM_HW_PARAM_RATE, 1449 &cs43130_asp_constraints); 1450 } 1451 1452 static const unsigned int cs43130_dop_src_rates[] = { 1453 176400, 352800, 1454 }; 1455 1456 static const struct snd_pcm_hw_constraint_list cs43130_dop_constraints = { 1457 .count = ARRAY_SIZE(cs43130_dop_src_rates), 1458 .list = cs43130_dop_src_rates, 1459 }; 1460 1461 static int cs43130_dop_startup(struct snd_pcm_substream *substream, 1462 struct snd_soc_dai *dai) 1463 { 1464 return snd_pcm_hw_constraint_list(substream->runtime, 0, 1465 SNDRV_PCM_HW_PARAM_RATE, 1466 &cs43130_dop_constraints); 1467 } 1468 1469 static int cs43130_pcm_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) 1470 { 1471 struct snd_soc_component *component = codec_dai->component; 1472 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component); 1473 1474 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { 1475 case SND_SOC_DAIFMT_CBS_CFS: 1476 cs43130->dais[codec_dai->id].dai_mode = SND_SOC_DAIFMT_CBS_CFS; 1477 break; 1478 case SND_SOC_DAIFMT_CBM_CFM: 1479 cs43130->dais[codec_dai->id].dai_mode = SND_SOC_DAIFMT_CBM_CFM; 1480 break; 1481 default: 1482 dev_err(component->dev, "unsupported mode\n"); 1483 return -EINVAL; 1484 } 1485 1486 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { 1487 case SND_SOC_DAIFMT_I2S: 1488 cs43130->dais[codec_dai->id].dai_format = SND_SOC_DAIFMT_I2S; 1489 break; 1490 case SND_SOC_DAIFMT_LEFT_J: 1491 cs43130->dais[codec_dai->id].dai_format = SND_SOC_DAIFMT_LEFT_J; 1492 break; 1493 case SND_SOC_DAIFMT_DSP_A: 1494 cs43130->dais[codec_dai->id].dai_format = SND_SOC_DAIFMT_DSP_A; 1495 break; 1496 case SND_SOC_DAIFMT_DSP_B: 1497 cs43130->dais[codec_dai->id].dai_format = SND_SOC_DAIFMT_DSP_B; 1498 break; 1499 default: 1500 dev_err(component->dev, 1501 "unsupported audio format\n"); 1502 return -EINVAL; 1503 } 1504 1505 dev_dbg(component->dev, "dai_id = %d, dai_mode = %u, dai_format = %u\n", 1506 codec_dai->id, 1507 cs43130->dais[codec_dai->id].dai_mode, 1508 cs43130->dais[codec_dai->id].dai_format); 1509 1510 return 0; 1511 } 1512 1513 static int cs43130_dsd_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) 1514 { 1515 struct snd_soc_component *component = codec_dai->component; 1516 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component); 1517 1518 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { 1519 case SND_SOC_DAIFMT_CBS_CFS: 1520 cs43130->dais[codec_dai->id].dai_mode = SND_SOC_DAIFMT_CBS_CFS; 1521 break; 1522 case SND_SOC_DAIFMT_CBM_CFM: 1523 cs43130->dais[codec_dai->id].dai_mode = SND_SOC_DAIFMT_CBM_CFM; 1524 break; 1525 default: 1526 dev_err(component->dev, "Unsupported DAI format.\n"); 1527 return -EINVAL; 1528 } 1529 1530 dev_dbg(component->dev, "dai_mode = 0x%x\n", 1531 cs43130->dais[codec_dai->id].dai_mode); 1532 1533 return 0; 1534 } 1535 1536 static int cs43130_set_sysclk(struct snd_soc_dai *codec_dai, 1537 int clk_id, unsigned int freq, int dir) 1538 { 1539 struct snd_soc_component *component = codec_dai->component; 1540 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component); 1541 1542 cs43130->dais[codec_dai->id].sclk = freq; 1543 dev_dbg(component->dev, "dai_id = %d, sclk = %u\n", codec_dai->id, 1544 cs43130->dais[codec_dai->id].sclk); 1545 1546 return 0; 1547 } 1548 1549 static const struct snd_soc_dai_ops cs43130_pcm_ops = { 1550 .startup = cs43130_pcm_startup, 1551 .hw_params = cs43130_hw_params, 1552 .hw_free = cs43130_hw_free, 1553 .set_sysclk = cs43130_set_sysclk, 1554 .set_fmt = cs43130_pcm_set_fmt, 1555 }; 1556 1557 static const struct snd_soc_dai_ops cs43130_dop_ops = { 1558 .startup = cs43130_dop_startup, 1559 .hw_params = cs43130_hw_params, 1560 .hw_free = cs43130_hw_free, 1561 .set_sysclk = cs43130_set_sysclk, 1562 .set_fmt = cs43130_pcm_set_fmt, 1563 }; 1564 1565 static const struct snd_soc_dai_ops cs43130_dsd_ops = { 1566 .startup = cs43130_dop_startup, 1567 .hw_params = cs43130_dsd_hw_params, 1568 .hw_free = cs43130_hw_free, 1569 .set_fmt = cs43130_dsd_set_fmt, 1570 }; 1571 1572 static struct snd_soc_dai_driver cs43130_dai[] = { 1573 { 1574 .name = "cs43130-asp-pcm", 1575 .id = CS43130_ASP_PCM_DAI, 1576 .playback = { 1577 .stream_name = "ASP PCM Playback", 1578 .channels_min = 1, 1579 .channels_max = 2, 1580 .rates = SNDRV_PCM_RATE_KNOT, 1581 .formats = CS43130_PCM_FORMATS, 1582 }, 1583 .ops = &cs43130_pcm_ops, 1584 .symmetric_rates = 1, 1585 }, 1586 { 1587 .name = "cs43130-asp-dop", 1588 .id = CS43130_ASP_DOP_DAI, 1589 .playback = { 1590 .stream_name = "ASP DoP Playback", 1591 .channels_min = 1, 1592 .channels_max = 2, 1593 .rates = SNDRV_PCM_RATE_KNOT, 1594 .formats = CS43130_DOP_FORMATS, 1595 }, 1596 .ops = &cs43130_dop_ops, 1597 .symmetric_rates = 1, 1598 }, 1599 { 1600 .name = "cs43130-xsp-dop", 1601 .id = CS43130_XSP_DOP_DAI, 1602 .playback = { 1603 .stream_name = "XSP DoP Playback", 1604 .channels_min = 1, 1605 .channels_max = 2, 1606 .rates = SNDRV_PCM_RATE_KNOT, 1607 .formats = CS43130_DOP_FORMATS, 1608 }, 1609 .ops = &cs43130_dop_ops, 1610 .symmetric_rates = 1, 1611 }, 1612 { 1613 .name = "cs43130-xsp-dsd", 1614 .id = CS43130_XSP_DSD_DAI, 1615 .playback = { 1616 .stream_name = "XSP DSD Playback", 1617 .channels_min = 1, 1618 .channels_max = 2, 1619 .rates = SNDRV_PCM_RATE_KNOT, 1620 .formats = CS43130_DOP_FORMATS, 1621 }, 1622 .ops = &cs43130_dsd_ops, 1623 }, 1624 1625 }; 1626 1627 static int cs43130_component_set_sysclk(struct snd_soc_component *component, 1628 int clk_id, int source, unsigned int freq, 1629 int dir) 1630 { 1631 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component); 1632 1633 dev_dbg(component->dev, "clk_id = %d, source = %d, freq = %d, dir = %d\n", 1634 clk_id, source, freq, dir); 1635 1636 switch (freq) { 1637 case CS43130_MCLK_22M: 1638 case CS43130_MCLK_24M: 1639 cs43130->mclk = freq; 1640 break; 1641 default: 1642 dev_err(component->dev, "Invalid MCLK INT freq: %u\n", freq); 1643 return -EINVAL; 1644 } 1645 1646 if (source == CS43130_MCLK_SRC_EXT) { 1647 cs43130->pll_bypass = true; 1648 } else { 1649 dev_err(component->dev, "Invalid MCLK source\n"); 1650 return -EINVAL; 1651 } 1652 1653 return 0; 1654 } 1655 1656 static inline u16 cs43130_get_ac_reg_val(u16 ac_freq) 1657 { 1658 /* AC freq is counted in 5.94Hz step. */ 1659 return ac_freq / 6; 1660 } 1661 1662 static int cs43130_show_dc(struct device *dev, char *buf, u8 ch) 1663 { 1664 struct i2c_client *client = to_i2c_client(dev); 1665 struct cs43130_private *cs43130 = i2c_get_clientdata(client); 1666 1667 if (!cs43130->hpload_done) 1668 return scnprintf(buf, PAGE_SIZE, "NO_HPLOAD\n"); 1669 else 1670 return scnprintf(buf, PAGE_SIZE, "%u\n", 1671 cs43130->hpload_dc[ch]); 1672 } 1673 1674 static ssize_t cs43130_show_dc_l(struct device *dev, 1675 struct device_attribute *attr, char *buf) 1676 { 1677 return cs43130_show_dc(dev, buf, HP_LEFT); 1678 } 1679 1680 static ssize_t cs43130_show_dc_r(struct device *dev, 1681 struct device_attribute *attr, char *buf) 1682 { 1683 return cs43130_show_dc(dev, buf, HP_RIGHT); 1684 } 1685 1686 static u16 const cs43130_ac_freq[CS43130_AC_FREQ] = { 1687 24, 1688 43, 1689 93, 1690 200, 1691 431, 1692 928, 1693 2000, 1694 4309, 1695 9283, 1696 20000, 1697 }; 1698 1699 static int cs43130_show_ac(struct device *dev, char *buf, u8 ch) 1700 { 1701 int i, j = 0, tmp; 1702 struct i2c_client *client = to_i2c_client(dev); 1703 struct cs43130_private *cs43130 = i2c_get_clientdata(client); 1704 1705 if (cs43130->hpload_done && cs43130->ac_meas) { 1706 for (i = 0; i < ARRAY_SIZE(cs43130_ac_freq); i++) { 1707 tmp = scnprintf(buf + j, PAGE_SIZE - j, "%u\n", 1708 cs43130->hpload_ac[i][ch]); 1709 if (!tmp) 1710 break; 1711 1712 j += tmp; 1713 } 1714 1715 return j; 1716 } else { 1717 return scnprintf(buf, PAGE_SIZE, "NO_HPLOAD\n"); 1718 } 1719 } 1720 1721 static ssize_t cs43130_show_ac_l(struct device *dev, 1722 struct device_attribute *attr, char *buf) 1723 { 1724 return cs43130_show_ac(dev, buf, HP_LEFT); 1725 } 1726 1727 static ssize_t cs43130_show_ac_r(struct device *dev, 1728 struct device_attribute *attr, char *buf) 1729 { 1730 return cs43130_show_ac(dev, buf, HP_RIGHT); 1731 } 1732 1733 static DEVICE_ATTR(hpload_dc_l, 0444, cs43130_show_dc_l, NULL); 1734 static DEVICE_ATTR(hpload_dc_r, 0444, cs43130_show_dc_r, NULL); 1735 static DEVICE_ATTR(hpload_ac_l, 0444, cs43130_show_ac_l, NULL); 1736 static DEVICE_ATTR(hpload_ac_r, 0444, cs43130_show_ac_r, NULL); 1737 1738 static struct reg_sequence hp_en_cal_seq[] = { 1739 {CS43130_INT_MASK_4, CS43130_INT_MASK_ALL}, 1740 {CS43130_HP_MEAS_LOAD_1, 0}, 1741 {CS43130_HP_MEAS_LOAD_2, 0}, 1742 {CS43130_INT_MASK_4, 0}, 1743 {CS43130_DXD1, 0x99}, 1744 {CS43130_DXD16, 0xBB}, 1745 {CS43130_DXD12, 0x01}, 1746 {CS43130_DXD19, 0xCB}, 1747 {CS43130_DXD17, 0x95}, 1748 {CS43130_DXD18, 0x0B}, 1749 {CS43130_DXD1, 0}, 1750 {CS43130_HP_LOAD_1, 0x80}, 1751 }; 1752 1753 static struct reg_sequence hp_en_cal_seq2[] = { 1754 {CS43130_INT_MASK_4, CS43130_INT_MASK_ALL}, 1755 {CS43130_HP_MEAS_LOAD_1, 0}, 1756 {CS43130_HP_MEAS_LOAD_2, 0}, 1757 {CS43130_INT_MASK_4, 0}, 1758 {CS43130_HP_LOAD_1, 0x80}, 1759 }; 1760 1761 static struct reg_sequence hp_dis_cal_seq[] = { 1762 {CS43130_HP_LOAD_1, 0x80}, 1763 {CS43130_DXD1, 0x99}, 1764 {CS43130_DXD12, 0}, 1765 {CS43130_DXD1, 0}, 1766 {CS43130_HP_LOAD_1, 0}, 1767 }; 1768 1769 static struct reg_sequence hp_dis_cal_seq2[] = { 1770 {CS43130_HP_LOAD_1, 0x80}, 1771 {CS43130_HP_LOAD_1, 0}, 1772 }; 1773 1774 static struct reg_sequence hp_dc_ch_l_seq[] = { 1775 {CS43130_DXD1, 0x99}, 1776 {CS43130_DXD19, 0x0A}, 1777 {CS43130_DXD17, 0x93}, 1778 {CS43130_DXD18, 0x0A}, 1779 {CS43130_DXD1, 0}, 1780 {CS43130_HP_LOAD_1, 0x80}, 1781 {CS43130_HP_LOAD_1, 0x81}, 1782 }; 1783 1784 static struct reg_sequence hp_dc_ch_l_seq2[] = { 1785 {CS43130_HP_LOAD_1, 0x80}, 1786 {CS43130_HP_LOAD_1, 0x81}, 1787 }; 1788 1789 static struct reg_sequence hp_dc_ch_r_seq[] = { 1790 {CS43130_DXD1, 0x99}, 1791 {CS43130_DXD19, 0x8A}, 1792 {CS43130_DXD17, 0x15}, 1793 {CS43130_DXD18, 0x06}, 1794 {CS43130_DXD1, 0}, 1795 {CS43130_HP_LOAD_1, 0x90}, 1796 {CS43130_HP_LOAD_1, 0x91}, 1797 }; 1798 1799 static struct reg_sequence hp_dc_ch_r_seq2[] = { 1800 {CS43130_HP_LOAD_1, 0x90}, 1801 {CS43130_HP_LOAD_1, 0x91}, 1802 }; 1803 1804 static struct reg_sequence hp_ac_ch_l_seq[] = { 1805 {CS43130_DXD1, 0x99}, 1806 {CS43130_DXD19, 0x0A}, 1807 {CS43130_DXD17, 0x93}, 1808 {CS43130_DXD18, 0x0A}, 1809 {CS43130_DXD1, 0}, 1810 {CS43130_HP_LOAD_1, 0x80}, 1811 {CS43130_HP_LOAD_1, 0x82}, 1812 }; 1813 1814 static struct reg_sequence hp_ac_ch_l_seq2[] = { 1815 {CS43130_HP_LOAD_1, 0x80}, 1816 {CS43130_HP_LOAD_1, 0x82}, 1817 }; 1818 1819 static struct reg_sequence hp_ac_ch_r_seq[] = { 1820 {CS43130_DXD1, 0x99}, 1821 {CS43130_DXD19, 0x8A}, 1822 {CS43130_DXD17, 0x15}, 1823 {CS43130_DXD18, 0x06}, 1824 {CS43130_DXD1, 0}, 1825 {CS43130_HP_LOAD_1, 0x90}, 1826 {CS43130_HP_LOAD_1, 0x92}, 1827 }; 1828 1829 static struct reg_sequence hp_ac_ch_r_seq2[] = { 1830 {CS43130_HP_LOAD_1, 0x90}, 1831 {CS43130_HP_LOAD_1, 0x92}, 1832 }; 1833 1834 static struct reg_sequence hp_cln_seq[] = { 1835 {CS43130_INT_MASK_4, CS43130_INT_MASK_ALL}, 1836 {CS43130_HP_MEAS_LOAD_1, 0}, 1837 {CS43130_HP_MEAS_LOAD_2, 0}, 1838 }; 1839 1840 struct reg_sequences { 1841 struct reg_sequence *seq; 1842 int size; 1843 unsigned int msk; 1844 }; 1845 1846 static struct reg_sequences hpload_seq1[] = { 1847 { 1848 .seq = hp_en_cal_seq, 1849 .size = ARRAY_SIZE(hp_en_cal_seq), 1850 .msk = CS43130_HPLOAD_ON_INT, 1851 }, 1852 { 1853 .seq = hp_dc_ch_l_seq, 1854 .size = ARRAY_SIZE(hp_dc_ch_l_seq), 1855 .msk = CS43130_HPLOAD_DC_INT, 1856 }, 1857 { 1858 .seq = hp_ac_ch_l_seq, 1859 .size = ARRAY_SIZE(hp_ac_ch_l_seq), 1860 .msk = CS43130_HPLOAD_AC_INT, 1861 }, 1862 { 1863 .seq = hp_dis_cal_seq, 1864 .size = ARRAY_SIZE(hp_dis_cal_seq), 1865 .msk = CS43130_HPLOAD_OFF_INT, 1866 }, 1867 { 1868 .seq = hp_en_cal_seq, 1869 .size = ARRAY_SIZE(hp_en_cal_seq), 1870 .msk = CS43130_HPLOAD_ON_INT, 1871 }, 1872 { 1873 .seq = hp_dc_ch_r_seq, 1874 .size = ARRAY_SIZE(hp_dc_ch_r_seq), 1875 .msk = CS43130_HPLOAD_DC_INT, 1876 }, 1877 { 1878 .seq = hp_ac_ch_r_seq, 1879 .size = ARRAY_SIZE(hp_ac_ch_r_seq), 1880 .msk = CS43130_HPLOAD_AC_INT, 1881 }, 1882 }; 1883 1884 static struct reg_sequences hpload_seq2[] = { 1885 { 1886 .seq = hp_en_cal_seq2, 1887 .size = ARRAY_SIZE(hp_en_cal_seq2), 1888 .msk = CS43130_HPLOAD_ON_INT, 1889 }, 1890 { 1891 .seq = hp_dc_ch_l_seq2, 1892 .size = ARRAY_SIZE(hp_dc_ch_l_seq2), 1893 .msk = CS43130_HPLOAD_DC_INT, 1894 }, 1895 { 1896 .seq = hp_ac_ch_l_seq2, 1897 .size = ARRAY_SIZE(hp_ac_ch_l_seq2), 1898 .msk = CS43130_HPLOAD_AC_INT, 1899 }, 1900 { 1901 .seq = hp_dis_cal_seq2, 1902 .size = ARRAY_SIZE(hp_dis_cal_seq2), 1903 .msk = CS43130_HPLOAD_OFF_INT, 1904 }, 1905 { 1906 .seq = hp_en_cal_seq2, 1907 .size = ARRAY_SIZE(hp_en_cal_seq2), 1908 .msk = CS43130_HPLOAD_ON_INT, 1909 }, 1910 { 1911 .seq = hp_dc_ch_r_seq2, 1912 .size = ARRAY_SIZE(hp_dc_ch_r_seq2), 1913 .msk = CS43130_HPLOAD_DC_INT, 1914 }, 1915 { 1916 .seq = hp_ac_ch_r_seq2, 1917 .size = ARRAY_SIZE(hp_ac_ch_r_seq2), 1918 .msk = CS43130_HPLOAD_AC_INT, 1919 }, 1920 }; 1921 1922 static int cs43130_update_hpload(unsigned int msk, int ac_idx, 1923 struct cs43130_private *cs43130) 1924 { 1925 bool left_ch = true; 1926 unsigned int reg; 1927 u32 addr; 1928 u16 impedance; 1929 struct snd_soc_component *component = cs43130->component; 1930 1931 switch (msk) { 1932 case CS43130_HPLOAD_DC_INT: 1933 case CS43130_HPLOAD_AC_INT: 1934 break; 1935 default: 1936 return 0; 1937 } 1938 1939 regmap_read(cs43130->regmap, CS43130_HP_LOAD_1, ®); 1940 if (reg & CS43130_HPLOAD_CHN_SEL) 1941 left_ch = false; 1942 1943 if (msk == CS43130_HPLOAD_DC_INT) 1944 addr = CS43130_HP_DC_STAT_1; 1945 else 1946 addr = CS43130_HP_AC_STAT_1; 1947 1948 regmap_read(cs43130->regmap, addr, ®); 1949 impedance = reg >> 3; 1950 regmap_read(cs43130->regmap, addr + 1, ®); 1951 impedance |= reg << 5; 1952 1953 if (msk == CS43130_HPLOAD_DC_INT) { 1954 if (left_ch) 1955 cs43130->hpload_dc[HP_LEFT] = impedance; 1956 else 1957 cs43130->hpload_dc[HP_RIGHT] = impedance; 1958 1959 dev_dbg(component->dev, "HP DC impedance (Ch %u): %u\n", !left_ch, 1960 impedance); 1961 } else { 1962 if (left_ch) 1963 cs43130->hpload_ac[ac_idx][HP_LEFT] = impedance; 1964 else 1965 cs43130->hpload_ac[ac_idx][HP_RIGHT] = impedance; 1966 1967 dev_dbg(component->dev, "HP AC (%u Hz) impedance (Ch %u): %u\n", 1968 cs43130->ac_freq[ac_idx], !left_ch, impedance); 1969 } 1970 1971 return 0; 1972 } 1973 1974 static int cs43130_hpload_proc(struct cs43130_private *cs43130, 1975 struct reg_sequence *seq, int seq_size, 1976 unsigned int rslt_msk, int ac_idx) 1977 { 1978 int ret; 1979 unsigned int msk; 1980 u16 ac_reg_val; 1981 struct snd_soc_component *component = cs43130->component; 1982 1983 reinit_completion(&cs43130->hpload_evt); 1984 1985 if (rslt_msk == CS43130_HPLOAD_AC_INT) { 1986 ac_reg_val = cs43130_get_ac_reg_val(cs43130->ac_freq[ac_idx]); 1987 regmap_update_bits(cs43130->regmap, CS43130_HP_LOAD_1, 1988 CS43130_HPLOAD_AC_START, 0); 1989 regmap_update_bits(cs43130->regmap, CS43130_HP_MEAS_LOAD_1, 1990 CS43130_HP_MEAS_LOAD_MASK, 1991 ac_reg_val >> CS43130_HP_MEAS_LOAD_1_SHIFT); 1992 regmap_update_bits(cs43130->regmap, CS43130_HP_MEAS_LOAD_2, 1993 CS43130_HP_MEAS_LOAD_MASK, 1994 ac_reg_val >> CS43130_HP_MEAS_LOAD_2_SHIFT); 1995 } 1996 1997 regmap_multi_reg_write(cs43130->regmap, seq, 1998 seq_size); 1999 2000 ret = wait_for_completion_timeout(&cs43130->hpload_evt, 2001 msecs_to_jiffies(1000)); 2002 regmap_read(cs43130->regmap, CS43130_INT_MASK_4, &msk); 2003 if (!ret) { 2004 dev_err(component->dev, "Timeout waiting for HPLOAD interrupt\n"); 2005 return -1; 2006 } 2007 2008 dev_dbg(component->dev, "HP load stat: %x, INT_MASK_4: %x\n", 2009 cs43130->hpload_stat, msk); 2010 if ((cs43130->hpload_stat & (CS43130_HPLOAD_NO_DC_INT | 2011 CS43130_HPLOAD_UNPLUG_INT | 2012 CS43130_HPLOAD_OOR_INT)) || 2013 !(cs43130->hpload_stat & rslt_msk)) { 2014 dev_dbg(component->dev, "HP load measure failed\n"); 2015 return -1; 2016 } 2017 2018 return 0; 2019 } 2020 2021 static const struct reg_sequence hv_seq[][2] = { 2022 { 2023 {CS43130_CLASS_H_CTL, 0x1C}, 2024 {CS43130_HP_OUT_CTL_1, 0x10}, 2025 }, 2026 { 2027 {CS43130_CLASS_H_CTL, 0x1E}, 2028 {CS43130_HP_OUT_CTL_1, 0x20}, 2029 }, 2030 { 2031 {CS43130_CLASS_H_CTL, 0x1E}, 2032 {CS43130_HP_OUT_CTL_1, 0x30}, 2033 }, 2034 }; 2035 2036 static int cs43130_set_hv(struct regmap *regmap, u16 hpload_dc, 2037 const u16 *dc_threshold) 2038 { 2039 int i; 2040 2041 for (i = 0; i < CS43130_DC_THRESHOLD; i++) { 2042 if (hpload_dc <= dc_threshold[i]) 2043 break; 2044 } 2045 2046 regmap_multi_reg_write(regmap, hv_seq[i], ARRAY_SIZE(hv_seq[i])); 2047 2048 return 0; 2049 } 2050 2051 static void cs43130_imp_meas(struct work_struct *wk) 2052 { 2053 unsigned int reg, seq_size; 2054 int i, ret, ac_idx; 2055 struct cs43130_private *cs43130; 2056 struct snd_soc_component *component; 2057 struct reg_sequences *hpload_seq; 2058 2059 cs43130 = container_of(wk, struct cs43130_private, work); 2060 component = cs43130->component; 2061 2062 if (!cs43130->mclk) 2063 return; 2064 2065 cs43130->hpload_done = false; 2066 2067 mutex_lock(&cs43130->clk_mutex); 2068 if (!cs43130->clk_req) { 2069 /* clk not in use */ 2070 cs43130_set_pll(component, 0, 0, cs43130->mclk, CS43130_MCLK_22M); 2071 if (cs43130->pll_bypass) 2072 cs43130_change_clksrc(component, CS43130_MCLK_SRC_EXT); 2073 else 2074 cs43130_change_clksrc(component, CS43130_MCLK_SRC_PLL); 2075 } 2076 2077 cs43130->clk_req++; 2078 mutex_unlock(&cs43130->clk_mutex); 2079 2080 regmap_read(cs43130->regmap, CS43130_INT_STATUS_4, ®); 2081 2082 switch (cs43130->dev_id) { 2083 case CS43130_CHIP_ID: 2084 hpload_seq = hpload_seq1; 2085 seq_size = ARRAY_SIZE(hpload_seq1); 2086 break; 2087 case CS43131_CHIP_ID: 2088 hpload_seq = hpload_seq2; 2089 seq_size = ARRAY_SIZE(hpload_seq2); 2090 break; 2091 default: 2092 WARN(1, "Invalid dev_id for meas: %d", cs43130->dev_id); 2093 return; 2094 } 2095 2096 i = 0; 2097 ac_idx = 0; 2098 while (i < seq_size) { 2099 ret = cs43130_hpload_proc(cs43130, hpload_seq[i].seq, 2100 hpload_seq[i].size, 2101 hpload_seq[i].msk, ac_idx); 2102 if (ret < 0) 2103 goto exit; 2104 2105 cs43130_update_hpload(hpload_seq[i].msk, ac_idx, cs43130); 2106 2107 if (cs43130->ac_meas && 2108 hpload_seq[i].msk == CS43130_HPLOAD_AC_INT && 2109 ac_idx < CS43130_AC_FREQ - 1) { 2110 ac_idx++; 2111 } else { 2112 ac_idx = 0; 2113 i++; 2114 } 2115 } 2116 cs43130->hpload_done = true; 2117 2118 if (cs43130->hpload_dc[HP_LEFT] >= CS43130_LINEOUT_LOAD) 2119 snd_soc_jack_report(&cs43130->jack, CS43130_JACK_LINEOUT, 2120 CS43130_JACK_MASK); 2121 else 2122 snd_soc_jack_report(&cs43130->jack, CS43130_JACK_HEADPHONE, 2123 CS43130_JACK_MASK); 2124 2125 dev_dbg(component->dev, "Set HP output control. DC threshold\n"); 2126 for (i = 0; i < CS43130_DC_THRESHOLD; i++) 2127 dev_dbg(component->dev, "DC threshold[%d]: %u.\n", i, 2128 cs43130->dc_threshold[i]); 2129 2130 cs43130_set_hv(cs43130->regmap, cs43130->hpload_dc[HP_LEFT], 2131 cs43130->dc_threshold); 2132 2133 exit: 2134 switch (cs43130->dev_id) { 2135 case CS43130_CHIP_ID: 2136 cs43130_hpload_proc(cs43130, hp_dis_cal_seq, 2137 ARRAY_SIZE(hp_dis_cal_seq), 2138 CS43130_HPLOAD_OFF_INT, ac_idx); 2139 break; 2140 case CS43131_CHIP_ID: 2141 cs43130_hpload_proc(cs43130, hp_dis_cal_seq2, 2142 ARRAY_SIZE(hp_dis_cal_seq2), 2143 CS43130_HPLOAD_OFF_INT, ac_idx); 2144 break; 2145 } 2146 2147 regmap_multi_reg_write(cs43130->regmap, hp_cln_seq, 2148 ARRAY_SIZE(hp_cln_seq)); 2149 2150 mutex_lock(&cs43130->clk_mutex); 2151 cs43130->clk_req--; 2152 /* clk not in use */ 2153 if (!cs43130->clk_req) 2154 cs43130_change_clksrc(component, CS43130_MCLK_SRC_RCO); 2155 mutex_unlock(&cs43130->clk_mutex); 2156 } 2157 2158 static irqreturn_t cs43130_irq_thread(int irq, void *data) 2159 { 2160 struct cs43130_private *cs43130 = (struct cs43130_private *)data; 2161 struct snd_soc_component *component = cs43130->component; 2162 unsigned int stickies[CS43130_NUM_INT]; 2163 unsigned int irq_occurrence = 0; 2164 unsigned int masks[CS43130_NUM_INT]; 2165 int i, j; 2166 2167 for (i = 0; i < ARRAY_SIZE(stickies); i++) { 2168 regmap_read(cs43130->regmap, CS43130_INT_STATUS_1 + i, 2169 &stickies[i]); 2170 regmap_read(cs43130->regmap, CS43130_INT_MASK_1 + i, 2171 &masks[i]); 2172 } 2173 2174 for (i = 0; i < ARRAY_SIZE(stickies); i++) { 2175 stickies[i] = stickies[i] & (~masks[i]); 2176 for (j = 0; j < 8; j++) 2177 irq_occurrence += (stickies[i] >> j) & 1; 2178 } 2179 dev_dbg(component->dev, "number of interrupts occurred (%u)\n", 2180 irq_occurrence); 2181 2182 if (!irq_occurrence) 2183 return IRQ_NONE; 2184 2185 if (stickies[0] & CS43130_XTAL_RDY_INT) { 2186 complete(&cs43130->xtal_rdy); 2187 return IRQ_HANDLED; 2188 } 2189 2190 if (stickies[0] & CS43130_PLL_RDY_INT) { 2191 complete(&cs43130->pll_rdy); 2192 return IRQ_HANDLED; 2193 } 2194 2195 if (stickies[3] & CS43130_HPLOAD_NO_DC_INT) { 2196 cs43130->hpload_stat = stickies[3]; 2197 dev_err(component->dev, 2198 "DC load has not completed before AC load (%x)\n", 2199 cs43130->hpload_stat); 2200 complete(&cs43130->hpload_evt); 2201 return IRQ_HANDLED; 2202 } 2203 2204 if (stickies[3] & CS43130_HPLOAD_UNPLUG_INT) { 2205 cs43130->hpload_stat = stickies[3]; 2206 dev_err(component->dev, "HP unplugged during measurement (%x)\n", 2207 cs43130->hpload_stat); 2208 complete(&cs43130->hpload_evt); 2209 return IRQ_HANDLED; 2210 } 2211 2212 if (stickies[3] & CS43130_HPLOAD_OOR_INT) { 2213 cs43130->hpload_stat = stickies[3]; 2214 dev_err(component->dev, "HP load out of range (%x)\n", 2215 cs43130->hpload_stat); 2216 complete(&cs43130->hpload_evt); 2217 return IRQ_HANDLED; 2218 } 2219 2220 if (stickies[3] & CS43130_HPLOAD_AC_INT) { 2221 cs43130->hpload_stat = stickies[3]; 2222 dev_dbg(component->dev, "HP AC load measurement done (%x)\n", 2223 cs43130->hpload_stat); 2224 complete(&cs43130->hpload_evt); 2225 return IRQ_HANDLED; 2226 } 2227 2228 if (stickies[3] & CS43130_HPLOAD_DC_INT) { 2229 cs43130->hpload_stat = stickies[3]; 2230 dev_dbg(component->dev, "HP DC load measurement done (%x)\n", 2231 cs43130->hpload_stat); 2232 complete(&cs43130->hpload_evt); 2233 return IRQ_HANDLED; 2234 } 2235 2236 if (stickies[3] & CS43130_HPLOAD_ON_INT) { 2237 cs43130->hpload_stat = stickies[3]; 2238 dev_dbg(component->dev, "HP load state machine on done (%x)\n", 2239 cs43130->hpload_stat); 2240 complete(&cs43130->hpload_evt); 2241 return IRQ_HANDLED; 2242 } 2243 2244 if (stickies[3] & CS43130_HPLOAD_OFF_INT) { 2245 cs43130->hpload_stat = stickies[3]; 2246 dev_dbg(component->dev, "HP load state machine off done (%x)\n", 2247 cs43130->hpload_stat); 2248 complete(&cs43130->hpload_evt); 2249 return IRQ_HANDLED; 2250 } 2251 2252 if (stickies[0] & CS43130_XTAL_ERR_INT) { 2253 dev_err(component->dev, "Crystal err: clock is not running\n"); 2254 return IRQ_HANDLED; 2255 } 2256 2257 if (stickies[0] & CS43130_HP_UNPLUG_INT) { 2258 dev_dbg(component->dev, "HP unplugged\n"); 2259 cs43130->hpload_done = false; 2260 snd_soc_jack_report(&cs43130->jack, 0, CS43130_JACK_MASK); 2261 return IRQ_HANDLED; 2262 } 2263 2264 if (stickies[0] & CS43130_HP_PLUG_INT) { 2265 if (cs43130->dc_meas && !cs43130->hpload_done && 2266 !work_busy(&cs43130->work)) { 2267 dev_dbg(component->dev, "HP load queue work\n"); 2268 queue_work(cs43130->wq, &cs43130->work); 2269 } 2270 2271 snd_soc_jack_report(&cs43130->jack, SND_JACK_MECHANICAL, 2272 CS43130_JACK_MASK); 2273 return IRQ_HANDLED; 2274 } 2275 2276 return IRQ_NONE; 2277 } 2278 2279 static int cs43130_probe(struct snd_soc_component *component) 2280 { 2281 int ret; 2282 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component); 2283 struct snd_soc_card *card = component->card; 2284 unsigned int reg; 2285 2286 cs43130->component = component; 2287 2288 if (cs43130->xtal_ibias != CS43130_XTAL_UNUSED) { 2289 regmap_update_bits(cs43130->regmap, CS43130_CRYSTAL_SET, 2290 CS43130_XTAL_IBIAS_MASK, 2291 cs43130->xtal_ibias); 2292 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1, 2293 CS43130_XTAL_ERR_INT, 0); 2294 } 2295 2296 ret = snd_soc_card_jack_new(card, "Headphone", CS43130_JACK_MASK, 2297 &cs43130->jack, NULL, 0); 2298 if (ret < 0) { 2299 dev_err(component->dev, "Cannot create jack\n"); 2300 return ret; 2301 } 2302 2303 cs43130->hpload_done = false; 2304 if (cs43130->dc_meas) { 2305 ret = device_create_file(component->dev, &dev_attr_hpload_dc_l); 2306 if (ret < 0) 2307 return ret; 2308 2309 ret = device_create_file(component->dev, &dev_attr_hpload_dc_r); 2310 if (ret < 0) 2311 return ret; 2312 2313 ret = device_create_file(component->dev, &dev_attr_hpload_ac_l); 2314 if (ret < 0) 2315 return ret; 2316 2317 ret = device_create_file(component->dev, &dev_attr_hpload_ac_r); 2318 if (ret < 0) 2319 return ret; 2320 2321 cs43130->wq = create_singlethread_workqueue("cs43130_hp"); 2322 if (!cs43130->wq) 2323 return -ENOMEM; 2324 INIT_WORK(&cs43130->work, cs43130_imp_meas); 2325 } 2326 2327 regmap_read(cs43130->regmap, CS43130_INT_STATUS_1, ®); 2328 regmap_read(cs43130->regmap, CS43130_HP_STATUS, ®); 2329 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1, 2330 CS43130_HP_PLUG_INT | CS43130_HP_UNPLUG_INT, 0); 2331 regmap_update_bits(cs43130->regmap, CS43130_HP_DETECT, 2332 CS43130_HP_DETECT_CTRL_MASK, 0); 2333 regmap_update_bits(cs43130->regmap, CS43130_HP_DETECT, 2334 CS43130_HP_DETECT_CTRL_MASK, 2335 CS43130_HP_DETECT_CTRL_MASK); 2336 2337 return 0; 2338 } 2339 2340 static struct snd_soc_component_driver soc_component_dev_cs43130 = { 2341 .probe = cs43130_probe, 2342 .controls = cs43130_snd_controls, 2343 .num_controls = ARRAY_SIZE(cs43130_snd_controls), 2344 .set_sysclk = cs43130_component_set_sysclk, 2345 .set_pll = cs43130_set_pll, 2346 .idle_bias_on = 1, 2347 .use_pmdown_time = 1, 2348 .endianness = 1, 2349 .non_legacy_dai_naming = 1, 2350 }; 2351 2352 static const struct regmap_config cs43130_regmap = { 2353 .reg_bits = 24, 2354 .pad_bits = 8, 2355 .val_bits = 8, 2356 2357 .max_register = CS43130_LASTREG, 2358 .reg_defaults = cs43130_reg_defaults, 2359 .num_reg_defaults = ARRAY_SIZE(cs43130_reg_defaults), 2360 .readable_reg = cs43130_readable_register, 2361 .precious_reg = cs43130_precious_register, 2362 .volatile_reg = cs43130_volatile_register, 2363 .cache_type = REGCACHE_RBTREE, 2364 /* needed for regcache_sync */ 2365 .use_single_read = true, 2366 .use_single_write = true, 2367 }; 2368 2369 static u16 const cs43130_dc_threshold[CS43130_DC_THRESHOLD] = { 2370 50, 2371 120, 2372 }; 2373 2374 static int cs43130_handle_device_data(struct i2c_client *i2c_client, 2375 struct cs43130_private *cs43130) 2376 { 2377 struct device_node *np = i2c_client->dev.of_node; 2378 unsigned int val; 2379 int i; 2380 2381 if (of_property_read_u32(np, "cirrus,xtal-ibias", &val) < 0) { 2382 /* Crystal is unused. System clock is used for external MCLK */ 2383 cs43130->xtal_ibias = CS43130_XTAL_UNUSED; 2384 return 0; 2385 } 2386 2387 switch (val) { 2388 case 1: 2389 cs43130->xtal_ibias = CS43130_XTAL_IBIAS_7_5UA; 2390 break; 2391 case 2: 2392 cs43130->xtal_ibias = CS43130_XTAL_IBIAS_12_5UA; 2393 break; 2394 case 3: 2395 cs43130->xtal_ibias = CS43130_XTAL_IBIAS_15UA; 2396 break; 2397 default: 2398 dev_err(&i2c_client->dev, 2399 "Invalid cirrus,xtal-ibias value: %d\n", val); 2400 return -EINVAL; 2401 } 2402 2403 cs43130->dc_meas = of_property_read_bool(np, "cirrus,dc-measure"); 2404 cs43130->ac_meas = of_property_read_bool(np, "cirrus,ac-measure"); 2405 2406 if (of_property_read_u16_array(np, "cirrus,ac-freq", cs43130->ac_freq, 2407 CS43130_AC_FREQ) < 0) { 2408 for (i = 0; i < CS43130_AC_FREQ; i++) 2409 cs43130->ac_freq[i] = cs43130_ac_freq[i]; 2410 } 2411 2412 if (of_property_read_u16_array(np, "cirrus,dc-threshold", 2413 cs43130->dc_threshold, 2414 CS43130_DC_THRESHOLD) < 0) { 2415 for (i = 0; i < CS43130_DC_THRESHOLD; i++) 2416 cs43130->dc_threshold[i] = cs43130_dc_threshold[i]; 2417 } 2418 2419 return 0; 2420 } 2421 2422 static int cs43130_i2c_probe(struct i2c_client *client, 2423 const struct i2c_device_id *id) 2424 { 2425 struct cs43130_private *cs43130; 2426 int ret; 2427 unsigned int devid = 0; 2428 unsigned int reg; 2429 int i; 2430 2431 cs43130 = devm_kzalloc(&client->dev, sizeof(*cs43130), GFP_KERNEL); 2432 if (!cs43130) 2433 return -ENOMEM; 2434 2435 i2c_set_clientdata(client, cs43130); 2436 2437 cs43130->regmap = devm_regmap_init_i2c(client, &cs43130_regmap); 2438 if (IS_ERR(cs43130->regmap)) { 2439 ret = PTR_ERR(cs43130->regmap); 2440 return ret; 2441 } 2442 2443 if (client->dev.of_node) { 2444 ret = cs43130_handle_device_data(client, cs43130); 2445 if (ret != 0) 2446 return ret; 2447 } 2448 for (i = 0; i < ARRAY_SIZE(cs43130->supplies); i++) 2449 cs43130->supplies[i].supply = cs43130_supply_names[i]; 2450 2451 ret = devm_regulator_bulk_get(&client->dev, 2452 ARRAY_SIZE(cs43130->supplies), 2453 cs43130->supplies); 2454 if (ret != 0) { 2455 dev_err(&client->dev, "Failed to request supplies: %d\n", ret); 2456 return ret; 2457 } 2458 ret = regulator_bulk_enable(ARRAY_SIZE(cs43130->supplies), 2459 cs43130->supplies); 2460 if (ret != 0) { 2461 dev_err(&client->dev, "Failed to enable supplies: %d\n", ret); 2462 return ret; 2463 } 2464 2465 cs43130->reset_gpio = devm_gpiod_get_optional(&client->dev, 2466 "reset", GPIOD_OUT_LOW); 2467 if (IS_ERR(cs43130->reset_gpio)) 2468 return PTR_ERR(cs43130->reset_gpio); 2469 2470 gpiod_set_value_cansleep(cs43130->reset_gpio, 1); 2471 2472 usleep_range(2000, 2050); 2473 2474 ret = regmap_read(cs43130->regmap, CS43130_DEVID_AB, ®); 2475 2476 devid = (reg & 0xFF) << 12; 2477 ret = regmap_read(cs43130->regmap, CS43130_DEVID_CD, ®); 2478 devid |= (reg & 0xFF) << 4; 2479 ret = regmap_read(cs43130->regmap, CS43130_DEVID_E, ®); 2480 devid |= (reg & 0xF0) >> 4; 2481 2482 switch (devid) { 2483 case CS43130_CHIP_ID: 2484 case CS4399_CHIP_ID: 2485 case CS43131_CHIP_ID: 2486 case CS43198_CHIP_ID: 2487 break; 2488 default: 2489 dev_err(&client->dev, 2490 "CS43130 Device ID %X. Expected ID %X, %X, %X or %X\n", 2491 devid, CS43130_CHIP_ID, CS4399_CHIP_ID, 2492 CS43131_CHIP_ID, CS43198_CHIP_ID); 2493 ret = -ENODEV; 2494 goto err; 2495 } 2496 2497 cs43130->dev_id = devid; 2498 ret = regmap_read(cs43130->regmap, CS43130_REV_ID, ®); 2499 if (ret < 0) { 2500 dev_err(&client->dev, "Get Revision ID failed\n"); 2501 goto err; 2502 } 2503 2504 dev_info(&client->dev, 2505 "Cirrus Logic CS43130 (%x), Revision: %02X\n", devid, 2506 reg & 0xFF); 2507 2508 mutex_init(&cs43130->clk_mutex); 2509 2510 init_completion(&cs43130->xtal_rdy); 2511 init_completion(&cs43130->pll_rdy); 2512 init_completion(&cs43130->hpload_evt); 2513 2514 ret = devm_request_threaded_irq(&client->dev, client->irq, 2515 NULL, cs43130_irq_thread, 2516 IRQF_ONESHOT | IRQF_TRIGGER_LOW, 2517 "cs43130", cs43130); 2518 if (ret != 0) { 2519 dev_err(&client->dev, "Failed to request IRQ: %d\n", ret); 2520 return ret; 2521 } 2522 2523 cs43130->mclk_int_src = CS43130_MCLK_SRC_RCO; 2524 2525 pm_runtime_set_autosuspend_delay(&client->dev, 100); 2526 pm_runtime_use_autosuspend(&client->dev); 2527 pm_runtime_set_active(&client->dev); 2528 pm_runtime_enable(&client->dev); 2529 2530 switch (cs43130->dev_id) { 2531 case CS43130_CHIP_ID: 2532 case CS43131_CHIP_ID: 2533 memcpy(all_hp_widgets, digital_hp_widgets, 2534 sizeof(digital_hp_widgets)); 2535 memcpy(all_hp_widgets + ARRAY_SIZE(digital_hp_widgets), 2536 analog_hp_widgets, sizeof(analog_hp_widgets)); 2537 memcpy(all_hp_routes, digital_hp_routes, 2538 sizeof(digital_hp_routes)); 2539 memcpy(all_hp_routes + ARRAY_SIZE(digital_hp_routes), 2540 analog_hp_routes, sizeof(analog_hp_routes)); 2541 2542 soc_component_dev_cs43130.dapm_widgets = 2543 all_hp_widgets; 2544 soc_component_dev_cs43130.num_dapm_widgets = 2545 ARRAY_SIZE(all_hp_widgets); 2546 soc_component_dev_cs43130.dapm_routes = 2547 all_hp_routes; 2548 soc_component_dev_cs43130.num_dapm_routes = 2549 ARRAY_SIZE(all_hp_routes); 2550 break; 2551 case CS43198_CHIP_ID: 2552 case CS4399_CHIP_ID: 2553 soc_component_dev_cs43130.dapm_widgets = 2554 digital_hp_widgets; 2555 soc_component_dev_cs43130.num_dapm_widgets = 2556 ARRAY_SIZE(digital_hp_widgets); 2557 soc_component_dev_cs43130.dapm_routes = 2558 digital_hp_routes; 2559 soc_component_dev_cs43130.num_dapm_routes = 2560 ARRAY_SIZE(digital_hp_routes); 2561 break; 2562 } 2563 2564 ret = devm_snd_soc_register_component(&client->dev, 2565 &soc_component_dev_cs43130, 2566 cs43130_dai, ARRAY_SIZE(cs43130_dai)); 2567 if (ret < 0) { 2568 dev_err(&client->dev, 2569 "snd_soc_register_component failed with ret = %d\n", ret); 2570 goto err; 2571 } 2572 2573 regmap_update_bits(cs43130->regmap, CS43130_PAD_INT_CFG, 2574 CS43130_ASP_3ST_MASK, 0); 2575 regmap_update_bits(cs43130->regmap, CS43130_PAD_INT_CFG, 2576 CS43130_XSP_3ST_MASK, 0); 2577 2578 return 0; 2579 err: 2580 return ret; 2581 } 2582 2583 static int cs43130_i2c_remove(struct i2c_client *client) 2584 { 2585 struct cs43130_private *cs43130 = i2c_get_clientdata(client); 2586 2587 if (cs43130->xtal_ibias != CS43130_XTAL_UNUSED) 2588 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1, 2589 CS43130_XTAL_ERR_INT, 2590 1 << CS43130_XTAL_ERR_INT_SHIFT); 2591 2592 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1, 2593 CS43130_HP_PLUG_INT | CS43130_HP_UNPLUG_INT, 2594 CS43130_HP_PLUG_INT | CS43130_HP_UNPLUG_INT); 2595 2596 if (cs43130->dc_meas) { 2597 cancel_work_sync(&cs43130->work); 2598 flush_workqueue(cs43130->wq); 2599 2600 device_remove_file(&client->dev, &dev_attr_hpload_dc_l); 2601 device_remove_file(&client->dev, &dev_attr_hpload_dc_r); 2602 device_remove_file(&client->dev, &dev_attr_hpload_ac_l); 2603 device_remove_file(&client->dev, &dev_attr_hpload_ac_r); 2604 } 2605 2606 gpiod_set_value_cansleep(cs43130->reset_gpio, 0); 2607 2608 pm_runtime_disable(&client->dev); 2609 regulator_bulk_disable(CS43130_NUM_SUPPLIES, cs43130->supplies); 2610 2611 return 0; 2612 } 2613 2614 static int __maybe_unused cs43130_runtime_suspend(struct device *dev) 2615 { 2616 struct cs43130_private *cs43130 = dev_get_drvdata(dev); 2617 2618 if (cs43130->xtal_ibias != CS43130_XTAL_UNUSED) 2619 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1, 2620 CS43130_XTAL_ERR_INT, 2621 1 << CS43130_XTAL_ERR_INT_SHIFT); 2622 2623 regcache_cache_only(cs43130->regmap, true); 2624 regcache_mark_dirty(cs43130->regmap); 2625 2626 gpiod_set_value_cansleep(cs43130->reset_gpio, 0); 2627 2628 regulator_bulk_disable(CS43130_NUM_SUPPLIES, cs43130->supplies); 2629 2630 return 0; 2631 } 2632 2633 static int __maybe_unused cs43130_runtime_resume(struct device *dev) 2634 { 2635 struct cs43130_private *cs43130 = dev_get_drvdata(dev); 2636 int ret; 2637 2638 ret = regulator_bulk_enable(CS43130_NUM_SUPPLIES, cs43130->supplies); 2639 if (ret != 0) { 2640 dev_err(dev, "Failed to enable supplies: %d\n", ret); 2641 return ret; 2642 } 2643 2644 regcache_cache_only(cs43130->regmap, false); 2645 2646 gpiod_set_value_cansleep(cs43130->reset_gpio, 1); 2647 2648 usleep_range(2000, 2050); 2649 2650 ret = regcache_sync(cs43130->regmap); 2651 if (ret != 0) { 2652 dev_err(dev, "Failed to restore register cache\n"); 2653 goto err; 2654 } 2655 2656 if (cs43130->xtal_ibias != CS43130_XTAL_UNUSED) 2657 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1, 2658 CS43130_XTAL_ERR_INT, 0); 2659 2660 return 0; 2661 err: 2662 regcache_cache_only(cs43130->regmap, true); 2663 regulator_bulk_disable(CS43130_NUM_SUPPLIES, cs43130->supplies); 2664 2665 return ret; 2666 } 2667 2668 static const struct dev_pm_ops cs43130_runtime_pm = { 2669 SET_RUNTIME_PM_OPS(cs43130_runtime_suspend, cs43130_runtime_resume, 2670 NULL) 2671 }; 2672 2673 static const struct of_device_id cs43130_of_match[] = { 2674 {.compatible = "cirrus,cs43130",}, 2675 {.compatible = "cirrus,cs4399",}, 2676 {.compatible = "cirrus,cs43131",}, 2677 {.compatible = "cirrus,cs43198",}, 2678 {}, 2679 }; 2680 2681 MODULE_DEVICE_TABLE(of, cs43130_of_match); 2682 2683 static const struct i2c_device_id cs43130_i2c_id[] = { 2684 {"cs43130", 0}, 2685 {"cs4399", 0}, 2686 {"cs43131", 0}, 2687 {"cs43198", 0}, 2688 {} 2689 }; 2690 2691 MODULE_DEVICE_TABLE(i2c, cs43130_i2c_id); 2692 2693 static struct i2c_driver cs43130_i2c_driver = { 2694 .driver = { 2695 .name = "cs43130", 2696 .of_match_table = cs43130_of_match, 2697 .pm = &cs43130_runtime_pm, 2698 }, 2699 .id_table = cs43130_i2c_id, 2700 .probe = cs43130_i2c_probe, 2701 .remove = cs43130_i2c_remove, 2702 }; 2703 2704 module_i2c_driver(cs43130_i2c_driver); 2705 2706 MODULE_AUTHOR("Li Xu <li.xu@cirrus.com>"); 2707 MODULE_DESCRIPTION("Cirrus Logic CS43130 ALSA SoC Codec Driver"); 2708 MODULE_LICENSE("GPL"); 2709