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