0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/module.h>
0010 #include <linux/moduleparam.h>
0011 #include <linux/kernel.h>
0012 #include <linux/init.h>
0013 #include <linux/delay.h>
0014 #include <linux/gpio.h>
0015 #include <linux/gpio/consumer.h>
0016 #include <linux/platform_device.h>
0017 #include <linux/pm.h>
0018 #include <linux/i2c.h>
0019 #include <linux/of_device.h>
0020 #include <linux/regmap.h>
0021 #include <linux/slab.h>
0022 #include <sound/core.h>
0023 #include <sound/pcm.h>
0024 #include <sound/pcm_params.h>
0025 #include <sound/soc.h>
0026 #include <sound/soc-dapm.h>
0027 #include <sound/initval.h>
0028 #include <sound/tlv.h>
0029 #include <linux/of_gpio.h>
0030 #include <linux/regulator/consumer.h>
0031 #include <linux/pm_runtime.h>
0032 #include <linux/of_irq.h>
0033 #include <linux/completion.h>
0034 #include <linux/mutex.h>
0035 #include <linux/workqueue.h>
0036 #include <sound/jack.h>
0037
0038 #include "cs43130.h"
0039 #include "cirrus_legacy.h"
0040
0041 static const struct reg_default cs43130_reg_defaults[] = {
0042 {CS43130_SYS_CLK_CTL_1, 0x06},
0043 {CS43130_SP_SRATE, 0x01},
0044 {CS43130_SP_BITSIZE, 0x05},
0045 {CS43130_PAD_INT_CFG, 0x03},
0046 {CS43130_PWDN_CTL, 0xFE},
0047 {CS43130_CRYSTAL_SET, 0x04},
0048 {CS43130_PLL_SET_1, 0x00},
0049 {CS43130_PLL_SET_2, 0x00},
0050 {CS43130_PLL_SET_3, 0x00},
0051 {CS43130_PLL_SET_4, 0x00},
0052 {CS43130_PLL_SET_5, 0x40},
0053 {CS43130_PLL_SET_6, 0x10},
0054 {CS43130_PLL_SET_7, 0x80},
0055 {CS43130_PLL_SET_8, 0x03},
0056 {CS43130_PLL_SET_9, 0x02},
0057 {CS43130_PLL_SET_10, 0x02},
0058 {CS43130_CLKOUT_CTL, 0x00},
0059 {CS43130_ASP_NUM_1, 0x01},
0060 {CS43130_ASP_NUM_2, 0x00},
0061 {CS43130_ASP_DEN_1, 0x08},
0062 {CS43130_ASP_DEN_2, 0x00},
0063 {CS43130_ASP_LRCK_HI_TIME_1, 0x1F},
0064 {CS43130_ASP_LRCK_HI_TIME_2, 0x00},
0065 {CS43130_ASP_LRCK_PERIOD_1, 0x3F},
0066 {CS43130_ASP_LRCK_PERIOD_2, 0x00},
0067 {CS43130_ASP_CLOCK_CONF, 0x0C},
0068 {CS43130_ASP_FRAME_CONF, 0x0A},
0069 {CS43130_XSP_NUM_1, 0x01},
0070 {CS43130_XSP_NUM_2, 0x00},
0071 {CS43130_XSP_DEN_1, 0x02},
0072 {CS43130_XSP_DEN_2, 0x00},
0073 {CS43130_XSP_LRCK_HI_TIME_1, 0x1F},
0074 {CS43130_XSP_LRCK_HI_TIME_2, 0x00},
0075 {CS43130_XSP_LRCK_PERIOD_1, 0x3F},
0076 {CS43130_XSP_LRCK_PERIOD_2, 0x00},
0077 {CS43130_XSP_CLOCK_CONF, 0x0C},
0078 {CS43130_XSP_FRAME_CONF, 0x0A},
0079 {CS43130_ASP_CH_1_LOC, 0x00},
0080 {CS43130_ASP_CH_2_LOC, 0x00},
0081 {CS43130_ASP_CH_1_SZ_EN, 0x06},
0082 {CS43130_ASP_CH_2_SZ_EN, 0x0E},
0083 {CS43130_XSP_CH_1_LOC, 0x00},
0084 {CS43130_XSP_CH_2_LOC, 0x00},
0085 {CS43130_XSP_CH_1_SZ_EN, 0x06},
0086 {CS43130_XSP_CH_2_SZ_EN, 0x0E},
0087 {CS43130_DSD_VOL_B, 0x78},
0088 {CS43130_DSD_VOL_A, 0x78},
0089 {CS43130_DSD_PATH_CTL_1, 0xA8},
0090 {CS43130_DSD_INT_CFG, 0x00},
0091 {CS43130_DSD_PATH_CTL_2, 0x02},
0092 {CS43130_DSD_PCM_MIX_CTL, 0x00},
0093 {CS43130_DSD_PATH_CTL_3, 0x40},
0094 {CS43130_HP_OUT_CTL_1, 0x30},
0095 {CS43130_PCM_FILT_OPT, 0x02},
0096 {CS43130_PCM_VOL_B, 0x78},
0097 {CS43130_PCM_VOL_A, 0x78},
0098 {CS43130_PCM_PATH_CTL_1, 0xA8},
0099 {CS43130_PCM_PATH_CTL_2, 0x00},
0100 {CS43130_CLASS_H_CTL, 0x1E},
0101 {CS43130_HP_DETECT, 0x04},
0102 {CS43130_HP_LOAD_1, 0x00},
0103 {CS43130_HP_MEAS_LOAD_1, 0x00},
0104 {CS43130_HP_MEAS_LOAD_2, 0x00},
0105 {CS43130_INT_MASK_1, 0xFF},
0106 {CS43130_INT_MASK_2, 0xFF},
0107 {CS43130_INT_MASK_3, 0xFF},
0108 {CS43130_INT_MASK_4, 0xFF},
0109 {CS43130_INT_MASK_5, 0xFF},
0110 };
0111
0112 static bool cs43130_volatile_register(struct device *dev, unsigned int reg)
0113 {
0114 switch (reg) {
0115 case CS43130_INT_STATUS_1 ... CS43130_INT_STATUS_5:
0116 case CS43130_HP_DC_STAT_1 ... CS43130_HP_DC_STAT_2:
0117 case CS43130_HP_AC_STAT_1 ... CS43130_HP_AC_STAT_2:
0118 return true;
0119 default:
0120 return false;
0121 }
0122 }
0123
0124 static bool cs43130_readable_register(struct device *dev, unsigned int reg)
0125 {
0126 switch (reg) {
0127 case CS43130_DEVID_AB ... CS43130_SYS_CLK_CTL_1:
0128 case CS43130_SP_SRATE ... CS43130_PAD_INT_CFG:
0129 case CS43130_PWDN_CTL:
0130 case CS43130_CRYSTAL_SET:
0131 case CS43130_PLL_SET_1 ... CS43130_PLL_SET_5:
0132 case CS43130_PLL_SET_6:
0133 case CS43130_PLL_SET_7:
0134 case CS43130_PLL_SET_8:
0135 case CS43130_PLL_SET_9:
0136 case CS43130_PLL_SET_10:
0137 case CS43130_CLKOUT_CTL:
0138 case CS43130_ASP_NUM_1 ... CS43130_ASP_FRAME_CONF:
0139 case CS43130_XSP_NUM_1 ... CS43130_XSP_FRAME_CONF:
0140 case CS43130_ASP_CH_1_LOC:
0141 case CS43130_ASP_CH_2_LOC:
0142 case CS43130_ASP_CH_1_SZ_EN:
0143 case CS43130_ASP_CH_2_SZ_EN:
0144 case CS43130_XSP_CH_1_LOC:
0145 case CS43130_XSP_CH_2_LOC:
0146 case CS43130_XSP_CH_1_SZ_EN:
0147 case CS43130_XSP_CH_2_SZ_EN:
0148 case CS43130_DSD_VOL_B ... CS43130_DSD_PATH_CTL_3:
0149 case CS43130_HP_OUT_CTL_1:
0150 case CS43130_PCM_FILT_OPT ... CS43130_PCM_PATH_CTL_2:
0151 case CS43130_CLASS_H_CTL:
0152 case CS43130_HP_DETECT:
0153 case CS43130_HP_STATUS:
0154 case CS43130_HP_LOAD_1:
0155 case CS43130_HP_MEAS_LOAD_1:
0156 case CS43130_HP_MEAS_LOAD_2:
0157 case CS43130_HP_DC_STAT_1:
0158 case CS43130_HP_DC_STAT_2:
0159 case CS43130_HP_AC_STAT_1:
0160 case CS43130_HP_AC_STAT_2:
0161 case CS43130_HP_LOAD_STAT:
0162 case CS43130_INT_STATUS_1 ... CS43130_INT_STATUS_5:
0163 case CS43130_INT_MASK_1 ... CS43130_INT_MASK_5:
0164 return true;
0165 default:
0166 return false;
0167 }
0168 }
0169
0170 static bool cs43130_precious_register(struct device *dev, unsigned int reg)
0171 {
0172 switch (reg) {
0173 case CS43130_INT_STATUS_1 ... CS43130_INT_STATUS_5:
0174 return true;
0175 default:
0176 return false;
0177 }
0178 }
0179
0180 struct cs43130_pll_params {
0181 unsigned int pll_in;
0182 u8 sclk_prediv;
0183 u8 pll_div_int;
0184 u32 pll_div_frac;
0185 u8 pll_mode;
0186 u8 pll_divout;
0187 unsigned int pll_out;
0188 u8 pll_cal_ratio;
0189 };
0190
0191 static const struct cs43130_pll_params pll_ratio_table[] = {
0192 {9600000, 0x02, 0x49, 0x800000, 0x00, 0x08, 22579200, 151},
0193 {9600000, 0x02, 0x50, 0x000000, 0x00, 0x08, 24576000, 164},
0194
0195 {11289600, 0x02, 0X40, 0, 0x01, 0x08, 22579200, 128},
0196 {11289600, 0x02, 0x44, 0x06F700, 0x0, 0x08, 24576000, 139},
0197
0198 {12000000, 0x02, 0x49, 0x800000, 0x00, 0x0A, 22579200, 120},
0199 {12000000, 0x02, 0x40, 0x000000, 0x00, 0x08, 24576000, 131},
0200
0201 {12288000, 0x02, 0x49, 0x800000, 0x01, 0x0A, 22579200, 118},
0202 {12288000, 0x02, 0x40, 0x000000, 0x01, 0x08, 24576000, 128},
0203
0204 {13000000, 0x02, 0x45, 0x797680, 0x01, 0x0A, 22579200, 111},
0205 {13000000, 0x02, 0x3C, 0x7EA940, 0x01, 0x08, 24576000, 121},
0206
0207 {19200000, 0x03, 0x49, 0x800000, 0x00, 0x08, 22579200, 151},
0208 {19200000, 0x03, 0x50, 0x000000, 0x00, 0x08, 24576000, 164},
0209
0210 {22579200, 0, 0, 0, 0, 0, 22579200, 0},
0211 {22579200, 0x03, 0x44, 0x06F700, 0x00, 0x08, 24576000, 139},
0212
0213 {24000000, 0x03, 0x49, 0x800000, 0x00, 0x0A, 22579200, 120},
0214 {24000000, 0x03, 0x40, 0x000000, 0x00, 0x08, 24576000, 131},
0215
0216 {24576000, 0x03, 0x49, 0x800000, 0x01, 0x0A, 22579200, 118},
0217 {24576000, 0, 0, 0, 0, 0, 24576000, 0},
0218
0219 {26000000, 0x03, 0x45, 0x797680, 0x01, 0x0A, 22579200, 111},
0220 {26000000, 0x03, 0x3C, 0x7EA940, 0x01, 0x08, 24576000, 121},
0221 };
0222
0223 static const struct cs43130_pll_params *cs43130_get_pll_table(
0224 unsigned int freq_in, unsigned int freq_out)
0225 {
0226 int i;
0227
0228 for (i = 0; i < ARRAY_SIZE(pll_ratio_table); i++) {
0229 if (pll_ratio_table[i].pll_in == freq_in &&
0230 pll_ratio_table[i].pll_out == freq_out)
0231 return &pll_ratio_table[i];
0232 }
0233
0234 return NULL;
0235 }
0236
0237 static int cs43130_pll_config(struct snd_soc_component *component)
0238 {
0239 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
0240 const struct cs43130_pll_params *pll_entry;
0241
0242 dev_dbg(component->dev, "cs43130->mclk = %u, cs43130->mclk_int = %u\n",
0243 cs43130->mclk, cs43130->mclk_int);
0244
0245 pll_entry = cs43130_get_pll_table(cs43130->mclk, cs43130->mclk_int);
0246 if (!pll_entry)
0247 return -EINVAL;
0248
0249 if (pll_entry->pll_cal_ratio == 0) {
0250 regmap_update_bits(cs43130->regmap, CS43130_PLL_SET_1,
0251 CS43130_PLL_START_MASK, 0);
0252
0253 cs43130->pll_bypass = true;
0254 return 0;
0255 }
0256
0257 cs43130->pll_bypass = false;
0258
0259 regmap_update_bits(cs43130->regmap, CS43130_PLL_SET_2,
0260 CS43130_PLL_DIV_DATA_MASK,
0261 pll_entry->pll_div_frac >>
0262 CS43130_PLL_DIV_FRAC_0_DATA_SHIFT);
0263 regmap_update_bits(cs43130->regmap, CS43130_PLL_SET_3,
0264 CS43130_PLL_DIV_DATA_MASK,
0265 pll_entry->pll_div_frac >>
0266 CS43130_PLL_DIV_FRAC_1_DATA_SHIFT);
0267 regmap_update_bits(cs43130->regmap, CS43130_PLL_SET_4,
0268 CS43130_PLL_DIV_DATA_MASK,
0269 pll_entry->pll_div_frac >>
0270 CS43130_PLL_DIV_FRAC_2_DATA_SHIFT);
0271 regmap_write(cs43130->regmap, CS43130_PLL_SET_5,
0272 pll_entry->pll_div_int);
0273 regmap_write(cs43130->regmap, CS43130_PLL_SET_6, pll_entry->pll_divout);
0274 regmap_write(cs43130->regmap, CS43130_PLL_SET_7,
0275 pll_entry->pll_cal_ratio);
0276 regmap_update_bits(cs43130->regmap, CS43130_PLL_SET_8,
0277 CS43130_PLL_MODE_MASK,
0278 pll_entry->pll_mode << CS43130_PLL_MODE_SHIFT);
0279 regmap_write(cs43130->regmap, CS43130_PLL_SET_9,
0280 pll_entry->sclk_prediv);
0281 regmap_update_bits(cs43130->regmap, CS43130_PLL_SET_1,
0282 CS43130_PLL_START_MASK, 1);
0283
0284 return 0;
0285 }
0286
0287 static int cs43130_set_pll(struct snd_soc_component *component, int pll_id, int source,
0288 unsigned int freq_in, unsigned int freq_out)
0289 {
0290 int ret = 0;
0291 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
0292
0293 switch (freq_in) {
0294 case 9600000:
0295 case 11289600:
0296 case 12000000:
0297 case 12288000:
0298 case 13000000:
0299 case 19200000:
0300 case 22579200:
0301 case 24000000:
0302 case 24576000:
0303 case 26000000:
0304 cs43130->mclk = freq_in;
0305 break;
0306 default:
0307 dev_err(component->dev,
0308 "unsupported pll input reference clock:%d\n", freq_in);
0309 return -EINVAL;
0310 }
0311
0312 switch (freq_out) {
0313 case 22579200:
0314 cs43130->mclk_int = freq_out;
0315 break;
0316 case 24576000:
0317 cs43130->mclk_int = freq_out;
0318 break;
0319 default:
0320 dev_err(component->dev,
0321 "unsupported pll output ref clock: %u\n", freq_out);
0322 return -EINVAL;
0323 }
0324
0325 ret = cs43130_pll_config(component);
0326 dev_dbg(component->dev, "cs43130->pll_bypass = %d", cs43130->pll_bypass);
0327 return ret;
0328 }
0329
0330 static int cs43130_change_clksrc(struct snd_soc_component *component,
0331 enum cs43130_mclk_src_sel src)
0332 {
0333 int ret;
0334 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
0335 int mclk_int_decoded;
0336
0337 if (src == cs43130->mclk_int_src) {
0338
0339 return 0;
0340 }
0341
0342 switch (cs43130->mclk_int) {
0343 case CS43130_MCLK_22M:
0344 mclk_int_decoded = CS43130_MCLK_22P5;
0345 break;
0346 case CS43130_MCLK_24M:
0347 mclk_int_decoded = CS43130_MCLK_24P5;
0348 break;
0349 default:
0350 dev_err(component->dev, "Invalid MCLK INT freq: %u\n", cs43130->mclk_int);
0351 return -EINVAL;
0352 }
0353
0354 switch (src) {
0355 case CS43130_MCLK_SRC_EXT:
0356 cs43130->pll_bypass = true;
0357 cs43130->mclk_int_src = CS43130_MCLK_SRC_EXT;
0358 if (cs43130->xtal_ibias == CS43130_XTAL_UNUSED) {
0359 regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
0360 CS43130_PDN_XTAL_MASK,
0361 1 << CS43130_PDN_XTAL_SHIFT);
0362 } else {
0363 reinit_completion(&cs43130->xtal_rdy);
0364 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
0365 CS43130_XTAL_RDY_INT_MASK, 0);
0366 regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
0367 CS43130_PDN_XTAL_MASK, 0);
0368 ret = wait_for_completion_timeout(&cs43130->xtal_rdy,
0369 msecs_to_jiffies(100));
0370 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
0371 CS43130_XTAL_RDY_INT_MASK,
0372 1 << CS43130_XTAL_RDY_INT_SHIFT);
0373 if (ret == 0) {
0374 dev_err(component->dev, "Timeout waiting for XTAL_READY interrupt\n");
0375 return -ETIMEDOUT;
0376 }
0377 }
0378
0379 regmap_update_bits(cs43130->regmap, CS43130_SYS_CLK_CTL_1,
0380 CS43130_MCLK_SRC_SEL_MASK,
0381 src << CS43130_MCLK_SRC_SEL_SHIFT);
0382 regmap_update_bits(cs43130->regmap, CS43130_SYS_CLK_CTL_1,
0383 CS43130_MCLK_INT_MASK,
0384 mclk_int_decoded << CS43130_MCLK_INT_SHIFT);
0385 usleep_range(150, 200);
0386
0387 regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
0388 CS43130_PDN_PLL_MASK,
0389 1 << CS43130_PDN_PLL_SHIFT);
0390 break;
0391 case CS43130_MCLK_SRC_PLL:
0392 cs43130->pll_bypass = false;
0393 cs43130->mclk_int_src = CS43130_MCLK_SRC_PLL;
0394 if (cs43130->xtal_ibias == CS43130_XTAL_UNUSED) {
0395 regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
0396 CS43130_PDN_XTAL_MASK,
0397 1 << CS43130_PDN_XTAL_SHIFT);
0398 } else {
0399 reinit_completion(&cs43130->xtal_rdy);
0400 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
0401 CS43130_XTAL_RDY_INT_MASK, 0);
0402 regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
0403 CS43130_PDN_XTAL_MASK, 0);
0404 ret = wait_for_completion_timeout(&cs43130->xtal_rdy,
0405 msecs_to_jiffies(100));
0406 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
0407 CS43130_XTAL_RDY_INT_MASK,
0408 1 << CS43130_XTAL_RDY_INT_SHIFT);
0409 if (ret == 0) {
0410 dev_err(component->dev, "Timeout waiting for XTAL_READY interrupt\n");
0411 return -ETIMEDOUT;
0412 }
0413 }
0414
0415 reinit_completion(&cs43130->pll_rdy);
0416 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
0417 CS43130_PLL_RDY_INT_MASK, 0);
0418 regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
0419 CS43130_PDN_PLL_MASK, 0);
0420 ret = wait_for_completion_timeout(&cs43130->pll_rdy,
0421 msecs_to_jiffies(100));
0422 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
0423 CS43130_PLL_RDY_INT_MASK,
0424 1 << CS43130_PLL_RDY_INT_SHIFT);
0425 if (ret == 0) {
0426 dev_err(component->dev, "Timeout waiting for PLL_READY interrupt\n");
0427 return -ETIMEDOUT;
0428 }
0429
0430 regmap_update_bits(cs43130->regmap, CS43130_SYS_CLK_CTL_1,
0431 CS43130_MCLK_SRC_SEL_MASK,
0432 src << CS43130_MCLK_SRC_SEL_SHIFT);
0433 regmap_update_bits(cs43130->regmap, CS43130_SYS_CLK_CTL_1,
0434 CS43130_MCLK_INT_MASK,
0435 mclk_int_decoded << CS43130_MCLK_INT_SHIFT);
0436 usleep_range(150, 200);
0437 break;
0438 case CS43130_MCLK_SRC_RCO:
0439 cs43130->mclk_int_src = CS43130_MCLK_SRC_RCO;
0440
0441 regmap_update_bits(cs43130->regmap, CS43130_SYS_CLK_CTL_1,
0442 CS43130_MCLK_SRC_SEL_MASK,
0443 src << CS43130_MCLK_SRC_SEL_SHIFT);
0444 regmap_update_bits(cs43130->regmap, CS43130_SYS_CLK_CTL_1,
0445 CS43130_MCLK_INT_MASK,
0446 CS43130_MCLK_22P5 << CS43130_MCLK_INT_SHIFT);
0447 usleep_range(150, 200);
0448
0449 regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
0450 CS43130_PDN_XTAL_MASK,
0451 1 << CS43130_PDN_XTAL_SHIFT);
0452 regmap_update_bits(cs43130->regmap, CS43130_PWDN_CTL,
0453 CS43130_PDN_PLL_MASK,
0454 1 << CS43130_PDN_PLL_SHIFT);
0455 break;
0456 default:
0457 dev_err(component->dev, "Invalid MCLK source value\n");
0458 return -EINVAL;
0459 }
0460
0461 return 0;
0462 }
0463
0464 static const struct cs43130_bitwidth_map cs43130_bitwidth_table[] = {
0465 {8, CS43130_SP_BIT_SIZE_8, CS43130_CH_BIT_SIZE_8},
0466 {16, CS43130_SP_BIT_SIZE_16, CS43130_CH_BIT_SIZE_16},
0467 {24, CS43130_SP_BIT_SIZE_24, CS43130_CH_BIT_SIZE_24},
0468 {32, CS43130_SP_BIT_SIZE_32, CS43130_CH_BIT_SIZE_32},
0469 };
0470
0471 static const struct cs43130_bitwidth_map *cs43130_get_bitwidth_table(
0472 unsigned int bitwidth)
0473 {
0474 int i;
0475
0476 for (i = 0; i < ARRAY_SIZE(cs43130_bitwidth_table); i++) {
0477 if (cs43130_bitwidth_table[i].bitwidth == bitwidth)
0478 return &cs43130_bitwidth_table[i];
0479 }
0480
0481 return NULL;
0482 }
0483
0484 static int cs43130_set_bitwidth(int dai_id, unsigned int bitwidth_dai,
0485 struct regmap *regmap)
0486 {
0487 const struct cs43130_bitwidth_map *bw_map;
0488
0489 bw_map = cs43130_get_bitwidth_table(bitwidth_dai);
0490 if (!bw_map)
0491 return -EINVAL;
0492
0493 switch (dai_id) {
0494 case CS43130_ASP_PCM_DAI:
0495 case CS43130_ASP_DOP_DAI:
0496 regmap_update_bits(regmap, CS43130_ASP_CH_1_SZ_EN,
0497 CS43130_CH_BITSIZE_MASK, bw_map->ch_bit);
0498 regmap_update_bits(regmap, CS43130_ASP_CH_2_SZ_EN,
0499 CS43130_CH_BITSIZE_MASK, bw_map->ch_bit);
0500 regmap_update_bits(regmap, CS43130_SP_BITSIZE,
0501 CS43130_ASP_BITSIZE_MASK, bw_map->sp_bit);
0502 break;
0503 case CS43130_XSP_DOP_DAI:
0504 regmap_update_bits(regmap, CS43130_XSP_CH_1_SZ_EN,
0505 CS43130_CH_BITSIZE_MASK, bw_map->ch_bit);
0506 regmap_update_bits(regmap, CS43130_XSP_CH_2_SZ_EN,
0507 CS43130_CH_BITSIZE_MASK, bw_map->ch_bit);
0508 regmap_update_bits(regmap, CS43130_SP_BITSIZE,
0509 CS43130_XSP_BITSIZE_MASK, bw_map->sp_bit <<
0510 CS43130_XSP_BITSIZE_SHIFT);
0511 break;
0512 default:
0513 return -EINVAL;
0514 }
0515
0516 return 0;
0517 }
0518
0519 static const struct cs43130_rate_map cs43130_rate_table[] = {
0520 {32000, CS43130_ASP_SPRATE_32K},
0521 {44100, CS43130_ASP_SPRATE_44_1K},
0522 {48000, CS43130_ASP_SPRATE_48K},
0523 {88200, CS43130_ASP_SPRATE_88_2K},
0524 {96000, CS43130_ASP_SPRATE_96K},
0525 {176400, CS43130_ASP_SPRATE_176_4K},
0526 {192000, CS43130_ASP_SPRATE_192K},
0527 {352800, CS43130_ASP_SPRATE_352_8K},
0528 {384000, CS43130_ASP_SPRATE_384K},
0529 };
0530
0531 static const struct cs43130_rate_map *cs43130_get_rate_table(int fs)
0532 {
0533 int i;
0534
0535 for (i = 0; i < ARRAY_SIZE(cs43130_rate_table); i++) {
0536 if (cs43130_rate_table[i].fs == fs)
0537 return &cs43130_rate_table[i];
0538 }
0539
0540 return NULL;
0541 }
0542
0543 static const struct cs43130_clk_gen *cs43130_get_clk_gen(int mclk_int, int fs,
0544 const struct cs43130_clk_gen *clk_gen_table, int len_clk_gen_table)
0545 {
0546 int i;
0547
0548 for (i = 0; i < len_clk_gen_table; i++) {
0549 if (clk_gen_table[i].mclk_int == mclk_int &&
0550 clk_gen_table[i].fs == fs)
0551 return &clk_gen_table[i];
0552 }
0553
0554 return NULL;
0555 }
0556
0557 static int cs43130_set_sp_fmt(int dai_id, unsigned int bitwidth_sclk,
0558 struct snd_pcm_hw_params *params,
0559 struct cs43130_private *cs43130)
0560 {
0561 u16 frm_size;
0562 u16 hi_size;
0563 u8 frm_delay;
0564 u8 frm_phase;
0565 u8 frm_data;
0566 u8 sclk_edge;
0567 u8 lrck_edge;
0568 u8 clk_data;
0569 u8 loc_ch1;
0570 u8 loc_ch2;
0571 u8 dai_mode_val;
0572 const struct cs43130_clk_gen *clk_gen;
0573
0574 switch (cs43130->dais[dai_id].dai_format) {
0575 case SND_SOC_DAIFMT_I2S:
0576 hi_size = bitwidth_sclk;
0577 frm_delay = 2;
0578 frm_phase = 0;
0579 break;
0580 case SND_SOC_DAIFMT_LEFT_J:
0581 hi_size = bitwidth_sclk;
0582 frm_delay = 2;
0583 frm_phase = 1;
0584 break;
0585 case SND_SOC_DAIFMT_DSP_A:
0586 hi_size = 1;
0587 frm_delay = 2;
0588 frm_phase = 1;
0589 break;
0590 case SND_SOC_DAIFMT_DSP_B:
0591 hi_size = 1;
0592 frm_delay = 0;
0593 frm_phase = 1;
0594 break;
0595 default:
0596 return -EINVAL;
0597 }
0598
0599 switch (cs43130->dais[dai_id].dai_mode) {
0600 case SND_SOC_DAIFMT_CBS_CFS:
0601 dai_mode_val = 0;
0602 break;
0603 case SND_SOC_DAIFMT_CBM_CFM:
0604 dai_mode_val = 1;
0605 break;
0606 default:
0607 return -EINVAL;
0608 }
0609
0610 frm_size = bitwidth_sclk * params_channels(params);
0611 sclk_edge = 1;
0612 lrck_edge = 0;
0613 loc_ch1 = 0;
0614 loc_ch2 = bitwidth_sclk * (params_channels(params) - 1);
0615
0616 frm_data = frm_delay & CS43130_SP_FSD_MASK;
0617 frm_data |= (frm_phase << CS43130_SP_STP_SHIFT) & CS43130_SP_STP_MASK;
0618
0619 clk_data = lrck_edge & CS43130_SP_LCPOL_IN_MASK;
0620 clk_data |= (lrck_edge << CS43130_SP_LCPOL_OUT_SHIFT) &
0621 CS43130_SP_LCPOL_OUT_MASK;
0622 clk_data |= (sclk_edge << CS43130_SP_SCPOL_IN_SHIFT) &
0623 CS43130_SP_SCPOL_IN_MASK;
0624 clk_data |= (sclk_edge << CS43130_SP_SCPOL_OUT_SHIFT) &
0625 CS43130_SP_SCPOL_OUT_MASK;
0626 clk_data |= (dai_mode_val << CS43130_SP_MODE_SHIFT) &
0627 CS43130_SP_MODE_MASK;
0628
0629 switch (dai_id) {
0630 case CS43130_ASP_PCM_DAI:
0631 case CS43130_ASP_DOP_DAI:
0632 regmap_update_bits(cs43130->regmap, CS43130_ASP_LRCK_PERIOD_1,
0633 CS43130_SP_LCPR_DATA_MASK, (frm_size - 1) >>
0634 CS43130_SP_LCPR_LSB_DATA_SHIFT);
0635 regmap_update_bits(cs43130->regmap, CS43130_ASP_LRCK_PERIOD_2,
0636 CS43130_SP_LCPR_DATA_MASK, (frm_size - 1) >>
0637 CS43130_SP_LCPR_MSB_DATA_SHIFT);
0638 regmap_update_bits(cs43130->regmap, CS43130_ASP_LRCK_HI_TIME_1,
0639 CS43130_SP_LCHI_DATA_MASK, (hi_size - 1) >>
0640 CS43130_SP_LCHI_LSB_DATA_SHIFT);
0641 regmap_update_bits(cs43130->regmap, CS43130_ASP_LRCK_HI_TIME_2,
0642 CS43130_SP_LCHI_DATA_MASK, (hi_size - 1) >>
0643 CS43130_SP_LCHI_MSB_DATA_SHIFT);
0644 regmap_write(cs43130->regmap, CS43130_ASP_FRAME_CONF, frm_data);
0645 regmap_write(cs43130->regmap, CS43130_ASP_CH_1_LOC, loc_ch1);
0646 regmap_write(cs43130->regmap, CS43130_ASP_CH_2_LOC, loc_ch2);
0647 regmap_update_bits(cs43130->regmap, CS43130_ASP_CH_1_SZ_EN,
0648 CS43130_CH_EN_MASK, 1 << CS43130_CH_EN_SHIFT);
0649 regmap_update_bits(cs43130->regmap, CS43130_ASP_CH_2_SZ_EN,
0650 CS43130_CH_EN_MASK, 1 << CS43130_CH_EN_SHIFT);
0651 regmap_write(cs43130->regmap, CS43130_ASP_CLOCK_CONF, clk_data);
0652 break;
0653 case CS43130_XSP_DOP_DAI:
0654 regmap_update_bits(cs43130->regmap, CS43130_XSP_LRCK_PERIOD_1,
0655 CS43130_SP_LCPR_DATA_MASK, (frm_size - 1) >>
0656 CS43130_SP_LCPR_LSB_DATA_SHIFT);
0657 regmap_update_bits(cs43130->regmap, CS43130_XSP_LRCK_PERIOD_2,
0658 CS43130_SP_LCPR_DATA_MASK, (frm_size - 1) >>
0659 CS43130_SP_LCPR_MSB_DATA_SHIFT);
0660 regmap_update_bits(cs43130->regmap, CS43130_XSP_LRCK_HI_TIME_1,
0661 CS43130_SP_LCHI_DATA_MASK, (hi_size - 1) >>
0662 CS43130_SP_LCHI_LSB_DATA_SHIFT);
0663 regmap_update_bits(cs43130->regmap, CS43130_XSP_LRCK_HI_TIME_2,
0664 CS43130_SP_LCHI_DATA_MASK, (hi_size - 1) >>
0665 CS43130_SP_LCHI_MSB_DATA_SHIFT);
0666 regmap_write(cs43130->regmap, CS43130_XSP_FRAME_CONF, frm_data);
0667 regmap_write(cs43130->regmap, CS43130_XSP_CH_1_LOC, loc_ch1);
0668 regmap_write(cs43130->regmap, CS43130_XSP_CH_2_LOC, loc_ch2);
0669 regmap_update_bits(cs43130->regmap, CS43130_XSP_CH_1_SZ_EN,
0670 CS43130_CH_EN_MASK, 1 << CS43130_CH_EN_SHIFT);
0671 regmap_update_bits(cs43130->regmap, CS43130_XSP_CH_2_SZ_EN,
0672 CS43130_CH_EN_MASK, 1 << CS43130_CH_EN_SHIFT);
0673 regmap_write(cs43130->regmap, CS43130_XSP_CLOCK_CONF, clk_data);
0674 break;
0675 default:
0676 return -EINVAL;
0677 }
0678
0679 switch (frm_size) {
0680 case 16:
0681 clk_gen = cs43130_get_clk_gen(cs43130->mclk_int,
0682 params_rate(params),
0683 cs43130_16_clk_gen,
0684 ARRAY_SIZE(cs43130_16_clk_gen));
0685 break;
0686 case 32:
0687 clk_gen = cs43130_get_clk_gen(cs43130->mclk_int,
0688 params_rate(params),
0689 cs43130_32_clk_gen,
0690 ARRAY_SIZE(cs43130_32_clk_gen));
0691 break;
0692 case 48:
0693 clk_gen = cs43130_get_clk_gen(cs43130->mclk_int,
0694 params_rate(params),
0695 cs43130_48_clk_gen,
0696 ARRAY_SIZE(cs43130_48_clk_gen));
0697 break;
0698 case 64:
0699 clk_gen = cs43130_get_clk_gen(cs43130->mclk_int,
0700 params_rate(params),
0701 cs43130_64_clk_gen,
0702 ARRAY_SIZE(cs43130_64_clk_gen));
0703 break;
0704 default:
0705 return -EINVAL;
0706 }
0707
0708 if (!clk_gen)
0709 return -EINVAL;
0710
0711 switch (dai_id) {
0712 case CS43130_ASP_PCM_DAI:
0713 case CS43130_ASP_DOP_DAI:
0714 regmap_write(cs43130->regmap, CS43130_ASP_DEN_1,
0715 (clk_gen->v.denominator & CS43130_SP_M_LSB_DATA_MASK) >>
0716 CS43130_SP_M_LSB_DATA_SHIFT);
0717 regmap_write(cs43130->regmap, CS43130_ASP_DEN_2,
0718 (clk_gen->v.denominator & CS43130_SP_M_MSB_DATA_MASK) >>
0719 CS43130_SP_M_MSB_DATA_SHIFT);
0720 regmap_write(cs43130->regmap, CS43130_ASP_NUM_1,
0721 (clk_gen->v.numerator & CS43130_SP_N_LSB_DATA_MASK) >>
0722 CS43130_SP_N_LSB_DATA_SHIFT);
0723 regmap_write(cs43130->regmap, CS43130_ASP_NUM_2,
0724 (clk_gen->v.numerator & CS43130_SP_N_MSB_DATA_MASK) >>
0725 CS43130_SP_N_MSB_DATA_SHIFT);
0726 break;
0727 case CS43130_XSP_DOP_DAI:
0728 regmap_write(cs43130->regmap, CS43130_XSP_DEN_1,
0729 (clk_gen->v.denominator & CS43130_SP_M_LSB_DATA_MASK) >>
0730 CS43130_SP_M_LSB_DATA_SHIFT);
0731 regmap_write(cs43130->regmap, CS43130_XSP_DEN_2,
0732 (clk_gen->v.denominator & CS43130_SP_M_MSB_DATA_MASK) >>
0733 CS43130_SP_M_MSB_DATA_SHIFT);
0734 regmap_write(cs43130->regmap, CS43130_XSP_NUM_1,
0735 (clk_gen->v.numerator & CS43130_SP_N_LSB_DATA_MASK) >>
0736 CS43130_SP_N_LSB_DATA_SHIFT);
0737 regmap_write(cs43130->regmap, CS43130_XSP_NUM_2,
0738 (clk_gen->v.numerator & CS43130_SP_N_MSB_DATA_MASK) >>
0739 CS43130_SP_N_MSB_DATA_SHIFT);
0740 break;
0741 default:
0742 return -EINVAL;
0743 }
0744
0745 return 0;
0746 }
0747
0748 static int cs43130_pcm_dsd_mix(bool en, struct regmap *regmap)
0749 {
0750 if (en) {
0751 regmap_update_bits(regmap, CS43130_DSD_PCM_MIX_CTL,
0752 CS43130_MIX_PCM_PREP_MASK,
0753 1 << CS43130_MIX_PCM_PREP_SHIFT);
0754 usleep_range(6000, 6050);
0755 regmap_update_bits(regmap, CS43130_DSD_PCM_MIX_CTL,
0756 CS43130_MIX_PCM_DSD_MASK,
0757 1 << CS43130_MIX_PCM_DSD_SHIFT);
0758 } else {
0759 regmap_update_bits(regmap, CS43130_DSD_PCM_MIX_CTL,
0760 CS43130_MIX_PCM_DSD_MASK,
0761 0 << CS43130_MIX_PCM_DSD_SHIFT);
0762 usleep_range(1600, 1650);
0763 regmap_update_bits(regmap, CS43130_DSD_PCM_MIX_CTL,
0764 CS43130_MIX_PCM_PREP_MASK,
0765 0 << CS43130_MIX_PCM_PREP_SHIFT);
0766 }
0767
0768 return 0;
0769 }
0770
0771 static int cs43130_dsd_hw_params(struct snd_pcm_substream *substream,
0772 struct snd_pcm_hw_params *params,
0773 struct snd_soc_dai *dai)
0774 {
0775 struct snd_soc_component *component = dai->component;
0776 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
0777 unsigned int required_clk;
0778 u8 dsd_speed;
0779
0780 mutex_lock(&cs43130->clk_mutex);
0781 if (!cs43130->clk_req) {
0782
0783 if (!(CS43130_MCLK_22M % params_rate(params)))
0784 required_clk = CS43130_MCLK_22M;
0785 else
0786 required_clk = CS43130_MCLK_24M;
0787
0788 cs43130_set_pll(component, 0, 0, cs43130->mclk, required_clk);
0789 if (cs43130->pll_bypass)
0790 cs43130_change_clksrc(component, CS43130_MCLK_SRC_EXT);
0791 else
0792 cs43130_change_clksrc(component, CS43130_MCLK_SRC_PLL);
0793 }
0794
0795 cs43130->clk_req++;
0796 if (cs43130->clk_req == 2)
0797 cs43130_pcm_dsd_mix(true, cs43130->regmap);
0798 mutex_unlock(&cs43130->clk_mutex);
0799
0800 switch (params_rate(params)) {
0801 case 176400:
0802 dsd_speed = 0;
0803 break;
0804 case 352800:
0805 dsd_speed = 1;
0806 break;
0807 default:
0808 dev_err(component->dev, "Rate(%u) not supported\n",
0809 params_rate(params));
0810 return -EINVAL;
0811 }
0812
0813 if (cs43130->dais[dai->id].dai_mode == SND_SOC_DAIFMT_CBM_CFM)
0814 regmap_update_bits(cs43130->regmap, CS43130_DSD_INT_CFG,
0815 CS43130_DSD_MASTER, CS43130_DSD_MASTER);
0816 else
0817 regmap_update_bits(cs43130->regmap, CS43130_DSD_INT_CFG,
0818 CS43130_DSD_MASTER, 0);
0819
0820 regmap_update_bits(cs43130->regmap, CS43130_DSD_PATH_CTL_2,
0821 CS43130_DSD_SPEED_MASK,
0822 dsd_speed << CS43130_DSD_SPEED_SHIFT);
0823 regmap_update_bits(cs43130->regmap, CS43130_DSD_PATH_CTL_2,
0824 CS43130_DSD_SRC_MASK, CS43130_DSD_SRC_DSD <<
0825 CS43130_DSD_SRC_SHIFT);
0826
0827 return 0;
0828 }
0829
0830 static int cs43130_hw_params(struct snd_pcm_substream *substream,
0831 struct snd_pcm_hw_params *params,
0832 struct snd_soc_dai *dai)
0833 {
0834 struct snd_soc_component *component = dai->component;
0835 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
0836 const struct cs43130_rate_map *rate_map;
0837 unsigned int sclk = cs43130->dais[dai->id].sclk;
0838 unsigned int bitwidth_sclk;
0839 unsigned int bitwidth_dai = (unsigned int)(params_width(params));
0840 unsigned int required_clk;
0841 u8 dsd_speed;
0842
0843 mutex_lock(&cs43130->clk_mutex);
0844 if (!cs43130->clk_req) {
0845
0846 if (!(CS43130_MCLK_22M % params_rate(params)))
0847 required_clk = CS43130_MCLK_22M;
0848 else
0849 required_clk = CS43130_MCLK_24M;
0850
0851 cs43130_set_pll(component, 0, 0, cs43130->mclk, required_clk);
0852 if (cs43130->pll_bypass)
0853 cs43130_change_clksrc(component, CS43130_MCLK_SRC_EXT);
0854 else
0855 cs43130_change_clksrc(component, CS43130_MCLK_SRC_PLL);
0856 }
0857
0858 cs43130->clk_req++;
0859 if (cs43130->clk_req == 2)
0860 cs43130_pcm_dsd_mix(true, cs43130->regmap);
0861 mutex_unlock(&cs43130->clk_mutex);
0862
0863 switch (dai->id) {
0864 case CS43130_ASP_DOP_DAI:
0865 case CS43130_XSP_DOP_DAI:
0866
0867 bitwidth_dai = 24;
0868 sclk = params_rate(params) * bitwidth_dai *
0869 params_channels(params);
0870
0871 switch (params_rate(params)) {
0872 case 176400:
0873 dsd_speed = 0;
0874 break;
0875 case 352800:
0876 dsd_speed = 1;
0877 break;
0878 default:
0879 dev_err(component->dev, "Rate(%u) not supported\n",
0880 params_rate(params));
0881 return -EINVAL;
0882 }
0883
0884 regmap_update_bits(cs43130->regmap, CS43130_DSD_PATH_CTL_2,
0885 CS43130_DSD_SPEED_MASK,
0886 dsd_speed << CS43130_DSD_SPEED_SHIFT);
0887 break;
0888 case CS43130_ASP_PCM_DAI:
0889 rate_map = cs43130_get_rate_table(params_rate(params));
0890 if (!rate_map)
0891 return -EINVAL;
0892
0893 regmap_write(cs43130->regmap, CS43130_SP_SRATE, rate_map->val);
0894 break;
0895 default:
0896 dev_err(component->dev, "Invalid DAI (%d)\n", dai->id);
0897 return -EINVAL;
0898 }
0899
0900 switch (dai->id) {
0901 case CS43130_ASP_DOP_DAI:
0902 regmap_update_bits(cs43130->regmap, CS43130_DSD_PATH_CTL_2,
0903 CS43130_DSD_SRC_MASK, CS43130_DSD_SRC_ASP <<
0904 CS43130_DSD_SRC_SHIFT);
0905 break;
0906 case CS43130_XSP_DOP_DAI:
0907 regmap_update_bits(cs43130->regmap, CS43130_DSD_PATH_CTL_2,
0908 CS43130_DSD_SRC_MASK, CS43130_DSD_SRC_XSP <<
0909 CS43130_DSD_SRC_SHIFT);
0910 break;
0911 }
0912
0913 if (!sclk && cs43130->dais[dai->id].dai_mode == SND_SOC_DAIFMT_CBM_CFM)
0914
0915 sclk = params_rate(params) * bitwidth_dai *
0916 params_channels(params);
0917
0918 if (!sclk) {
0919
0920 dev_err(component->dev, "SCLK freq is not set\n");
0921 return -EINVAL;
0922 }
0923
0924 bitwidth_sclk = (sclk / params_rate(params)) / params_channels(params);
0925 if (bitwidth_sclk < bitwidth_dai) {
0926 dev_err(component->dev, "Format not supported: SCLK freq is too low\n");
0927 return -EINVAL;
0928 }
0929
0930 dev_dbg(component->dev,
0931 "sclk = %u, fs = %d, bitwidth_dai = %u\n",
0932 sclk, params_rate(params), bitwidth_dai);
0933
0934 dev_dbg(component->dev,
0935 "bitwidth_sclk = %u, num_ch = %u\n",
0936 bitwidth_sclk, params_channels(params));
0937
0938 cs43130_set_bitwidth(dai->id, bitwidth_dai, cs43130->regmap);
0939 cs43130_set_sp_fmt(dai->id, bitwidth_sclk, params, cs43130);
0940
0941 return 0;
0942 }
0943
0944 static int cs43130_hw_free(struct snd_pcm_substream *substream,
0945 struct snd_soc_dai *dai)
0946 {
0947 struct snd_soc_component *component = dai->component;
0948 struct cs43130_private *cs43130 = snd_soc_component_get_drvdata(component);
0949
0950 mutex_lock(&cs43130->clk_mutex);
0951 cs43130->clk_req--;
0952 if (!cs43130->clk_req) {
0953
0954 cs43130_change_clksrc(component, CS43130_MCLK_SRC_RCO);
0955 cs43130_pcm_dsd_mix(false, cs43130->regmap);
0956 }
0957 mutex_unlock(&cs43130->clk_mutex);
0958
0959 return 0;
0960 }
0961
0962 static const DECLARE_TLV_DB_SCALE(pcm_vol_tlv, -12750, 50, 1);
0963
0964 static const char * const pcm_ch_text[] = {
0965 "Left-Right Ch",
0966 "Left-Left Ch",
0967 "Right-Left Ch",
0968 "Right-Right Ch",
0969 };
0970
0971 static const struct reg_sequence pcm_ch_en_seq[] = {
0972 {CS43130_DXD1, 0x99},
0973 {0x180005, 0x8C},
0974 {0x180007, 0xAB},
0975 {0x180015, 0x31},
0976 {0x180017, 0xB2},
0977 {0x180025, 0x30},
0978 {0x180027, 0x84},
0979 {0x180035, 0x9C},
0980 {0x180037, 0xAE},
0981 {0x18000D, 0x24},
0982 {0x18000F, 0xA3},
0983 {0x18001D, 0x05},
0984 {0x18001F, 0xD4},
0985 {0x18002D, 0x0B},
0986 {0x18002F, 0xC7},
0987 {0x18003D, 0x71},
0988 {0x18003F, 0xE7},
0989 {CS43130_DXD1, 0},
0990 };
0991
0992 static const struct reg_sequence pcm_ch_dis_seq[] = {
0993 {CS43130_DXD1, 0x99},
0994 {0x180005, 0x24},
0995 {0x180007, 0xA3},
0996 {0x180015, 0x05},
0997 {0x180017, 0xD4},
0998 {0x180025, 0x0B},
0999 {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
1013 static 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
1019 static 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
1047 static SOC_ENUM_SINGLE_DECL(pcm_ch_enum, CS43130_PCM_PATH_CTL_2, 0,
1048 pcm_ch_text);
1049
1050 static const char * const pcm_spd_texts[] = {
1051 "Fast",
1052 "Slow",
1053 };
1054
1055 static SOC_ENUM_SINGLE_DECL(pcm_spd_enum, CS43130_PCM_FILT_OPT, 7,
1056 pcm_spd_texts);
1057
1058 static const char * const dsd_texts[] = {
1059 "Off",
1060 "BCKA Mode",
1061 "BCKD Mode",
1062 };
1063
1064 static const unsigned int dsd_values[] = {
1065 CS43130_DSD_SRC_DSD,
1066 CS43130_DSD_SRC_ASP,
1067 CS43130_DSD_SRC_XSP,
1068 };
1069
1070 static SOC_VALUE_ENUM_SINGLE_DECL(dsd_enum, CS43130_DSD_INT_CFG, 0, 0x03,
1071 dsd_texts, dsd_values);
1072
1073 static 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
1090 static 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
1102 static 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
1114 static const struct reg_sequence pop_free_seq[] = {
1115 {CS43130_DXD1, 0x99},
1116 {CS43130_DXD12, 0x0A},
1117 {CS43130_DXD1, 0},
1118 };
1119
1120 static const struct reg_sequence pop_free_seq2[] = {
1121 {CS43130_DXD1, 0x99},
1122 {CS43130_DXD13, 0x20},
1123 {CS43130_DXD1, 0},
1124 };
1125
1126 static 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
1134 static 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
1142 static 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
1180
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
1199 static 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
1237
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
1256 static const struct reg_sequence dac_postpmu_seq[] = {
1257 {CS43130_DXD9, 0x0C},
1258 {CS43130_DXD3, 0x10},
1259 {CS43130_DXD4, 0x20},
1260 };
1261
1262 static const struct reg_sequence dac_postpmd_seq[] = {
1263 {CS43130_DXD1, 0x99},
1264 {CS43130_DXD6, 0x01},
1265 {CS43130_DXD1, 0},
1266 };
1267
1268 static 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
1301
1302
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
1332 static 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
1340 static 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
1348 static 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
1370 static 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
1403 static 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
1409 static struct snd_soc_dapm_widget all_hp_widgets[
1410 ARRAY_SIZE(digital_hp_widgets) +
1411 ARRAY_SIZE(analog_hp_widgets)];
1412
1413 static 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
1427 static const struct snd_soc_dapm_route analog_hp_routes[] = {
1428 {"HPOUTA", NULL, "Analog Playback"},
1429 {"HPOUTB", NULL, "Analog Playback"},
1430 };
1431
1432 static struct snd_soc_dapm_route all_hp_routes[
1433 ARRAY_SIZE(digital_hp_routes) +
1434 ARRAY_SIZE(analog_hp_routes)];
1435
1436 static const unsigned int cs43130_asp_src_rates[] = {
1437 32000, 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000
1438 };
1439
1440 static 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
1445 static 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
1453 static const unsigned int cs43130_dop_src_rates[] = {
1454 176400, 352800,
1455 };
1456
1457 static 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
1462 static 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
1470 static 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
1514 static 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
1537 static 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
1550 static 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
1558 static 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
1566 static 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
1573 static 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
1628 static 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
1657 static inline u16 cs43130_get_ac_reg_val(u16 ac_freq)
1658 {
1659
1660 return ac_freq / 6;
1661 }
1662
1663 static 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
1675 static 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
1681 static 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
1687 static 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
1700 static 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
1722 static 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
1728 static 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
1734 static DEVICE_ATTR_RO(hpload_dc_l);
1735 static DEVICE_ATTR_RO(hpload_dc_r);
1736 static DEVICE_ATTR_RO(hpload_ac_l);
1737 static DEVICE_ATTR_RO(hpload_ac_r);
1738
1739 static 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 };
1745 ATTRIBUTE_GROUPS(hpload);
1746
1747 static 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
1762 static 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
1770 static 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
1778 static struct reg_sequence hp_dis_cal_seq2[] = {
1779 {CS43130_HP_LOAD_1, 0x80},
1780 {CS43130_HP_LOAD_1, 0},
1781 };
1782
1783 static 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
1793 static struct reg_sequence hp_dc_ch_l_seq2[] = {
1794 {CS43130_HP_LOAD_1, 0x80},
1795 {CS43130_HP_LOAD_1, 0x81},
1796 };
1797
1798 static 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
1808 static struct reg_sequence hp_dc_ch_r_seq2[] = {
1809 {CS43130_HP_LOAD_1, 0x90},
1810 {CS43130_HP_LOAD_1, 0x91},
1811 };
1812
1813 static 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
1823 static struct reg_sequence hp_ac_ch_l_seq2[] = {
1824 {CS43130_HP_LOAD_1, 0x80},
1825 {CS43130_HP_LOAD_1, 0x82},
1826 };
1827
1828 static 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
1838 static struct reg_sequence hp_ac_ch_r_seq2[] = {
1839 {CS43130_HP_LOAD_1, 0x90},
1840 {CS43130_HP_LOAD_1, 0x92},
1841 };
1842
1843 static 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
1849 struct reg_sequences {
1850 struct reg_sequence *seq;
1851 int size;
1852 unsigned int msk;
1853 };
1854
1855 static 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
1893 static 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
1931 static 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
1983 static 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
2030 static 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
2045 static 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
2060 static 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
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
2142 exit:
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
2162 if (!cs43130->clk_req)
2163 cs43130_change_clksrc(component, CS43130_MCLK_SRC_RCO);
2164 mutex_unlock(&cs43130->clk_mutex);
2165 }
2166
2167 static 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
2288 static 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
2339 static 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 };
2349
2350 static const struct regmap_config cs43130_regmap = {
2351 .reg_bits = 24,
2352 .pad_bits = 8,
2353 .val_bits = 8,
2354
2355 .max_register = CS43130_LASTREG,
2356 .reg_defaults = cs43130_reg_defaults,
2357 .num_reg_defaults = ARRAY_SIZE(cs43130_reg_defaults),
2358 .readable_reg = cs43130_readable_register,
2359 .precious_reg = cs43130_precious_register,
2360 .volatile_reg = cs43130_volatile_register,
2361 .cache_type = REGCACHE_RBTREE,
2362
2363 .use_single_read = true,
2364 .use_single_write = true,
2365 };
2366
2367 static u16 const cs43130_dc_threshold[CS43130_DC_THRESHOLD] = {
2368 50,
2369 120,
2370 };
2371
2372 static int cs43130_handle_device_data(struct i2c_client *i2c_client,
2373 struct cs43130_private *cs43130)
2374 {
2375 struct device_node *np = i2c_client->dev.of_node;
2376 unsigned int val;
2377 int i;
2378
2379 if (of_property_read_u32(np, "cirrus,xtal-ibias", &val) < 0) {
2380
2381 cs43130->xtal_ibias = CS43130_XTAL_UNUSED;
2382 return 0;
2383 }
2384
2385 switch (val) {
2386 case 1:
2387 cs43130->xtal_ibias = CS43130_XTAL_IBIAS_7_5UA;
2388 break;
2389 case 2:
2390 cs43130->xtal_ibias = CS43130_XTAL_IBIAS_12_5UA;
2391 break;
2392 case 3:
2393 cs43130->xtal_ibias = CS43130_XTAL_IBIAS_15UA;
2394 break;
2395 default:
2396 dev_err(&i2c_client->dev,
2397 "Invalid cirrus,xtal-ibias value: %d\n", val);
2398 return -EINVAL;
2399 }
2400
2401 cs43130->dc_meas = of_property_read_bool(np, "cirrus,dc-measure");
2402 cs43130->ac_meas = of_property_read_bool(np, "cirrus,ac-measure");
2403
2404 if (of_property_read_u16_array(np, "cirrus,ac-freq", cs43130->ac_freq,
2405 CS43130_AC_FREQ) < 0) {
2406 for (i = 0; i < CS43130_AC_FREQ; i++)
2407 cs43130->ac_freq[i] = cs43130_ac_freq[i];
2408 }
2409
2410 if (of_property_read_u16_array(np, "cirrus,dc-threshold",
2411 cs43130->dc_threshold,
2412 CS43130_DC_THRESHOLD) < 0) {
2413 for (i = 0; i < CS43130_DC_THRESHOLD; i++)
2414 cs43130->dc_threshold[i] = cs43130_dc_threshold[i];
2415 }
2416
2417 return 0;
2418 }
2419
2420 static int cs43130_i2c_probe(struct i2c_client *client)
2421 {
2422 struct cs43130_private *cs43130;
2423 int ret;
2424 unsigned int reg;
2425 int i, devid;
2426
2427 cs43130 = devm_kzalloc(&client->dev, sizeof(*cs43130), GFP_KERNEL);
2428 if (!cs43130)
2429 return -ENOMEM;
2430
2431 i2c_set_clientdata(client, cs43130);
2432
2433 cs43130->regmap = devm_regmap_init_i2c(client, &cs43130_regmap);
2434 if (IS_ERR(cs43130->regmap)) {
2435 ret = PTR_ERR(cs43130->regmap);
2436 return ret;
2437 }
2438
2439 if (client->dev.of_node) {
2440 ret = cs43130_handle_device_data(client, cs43130);
2441 if (ret != 0)
2442 return ret;
2443 }
2444 for (i = 0; i < ARRAY_SIZE(cs43130->supplies); i++)
2445 cs43130->supplies[i].supply = cs43130_supply_names[i];
2446
2447 ret = devm_regulator_bulk_get(&client->dev,
2448 ARRAY_SIZE(cs43130->supplies),
2449 cs43130->supplies);
2450 if (ret != 0) {
2451 dev_err(&client->dev, "Failed to request supplies: %d\n", ret);
2452 return ret;
2453 }
2454 ret = regulator_bulk_enable(ARRAY_SIZE(cs43130->supplies),
2455 cs43130->supplies);
2456 if (ret != 0) {
2457 dev_err(&client->dev, "Failed to enable supplies: %d\n", ret);
2458 return ret;
2459 }
2460
2461 cs43130->reset_gpio = devm_gpiod_get_optional(&client->dev,
2462 "reset", GPIOD_OUT_LOW);
2463 if (IS_ERR(cs43130->reset_gpio)) {
2464 ret = PTR_ERR(cs43130->reset_gpio);
2465 goto err_supplies;
2466 }
2467
2468 gpiod_set_value_cansleep(cs43130->reset_gpio, 1);
2469
2470 usleep_range(2000, 2050);
2471
2472 devid = cirrus_read_device_id(cs43130->regmap, CS43130_DEVID_AB);
2473 if (devid < 0) {
2474 ret = devid;
2475 dev_err(&client->dev, "Failed to read device ID: %d\n", ret);
2476 goto err;
2477 }
2478
2479 switch (devid) {
2480 case CS43130_CHIP_ID:
2481 case CS4399_CHIP_ID:
2482 case CS43131_CHIP_ID:
2483 case CS43198_CHIP_ID:
2484 break;
2485 default:
2486 dev_err(&client->dev,
2487 "CS43130 Device ID %X. Expected ID %X, %X, %X or %X\n",
2488 devid, CS43130_CHIP_ID, CS4399_CHIP_ID,
2489 CS43131_CHIP_ID, CS43198_CHIP_ID);
2490 ret = -ENODEV;
2491 goto err;
2492 }
2493
2494 cs43130->dev_id = devid;
2495 ret = regmap_read(cs43130->regmap, CS43130_REV_ID, ®);
2496 if (ret < 0) {
2497 dev_err(&client->dev, "Get Revision ID failed\n");
2498 goto err;
2499 }
2500
2501 dev_info(&client->dev,
2502 "Cirrus Logic CS43130 (%x), Revision: %02X\n", devid,
2503 reg & 0xFF);
2504
2505 mutex_init(&cs43130->clk_mutex);
2506
2507 init_completion(&cs43130->xtal_rdy);
2508 init_completion(&cs43130->pll_rdy);
2509 init_completion(&cs43130->hpload_evt);
2510
2511 ret = devm_request_threaded_irq(&client->dev, client->irq,
2512 NULL, cs43130_irq_thread,
2513 IRQF_ONESHOT | IRQF_TRIGGER_LOW,
2514 "cs43130", cs43130);
2515 if (ret != 0) {
2516 dev_err(&client->dev, "Failed to request IRQ: %d\n", ret);
2517 goto err;
2518 }
2519
2520 cs43130->mclk_int_src = CS43130_MCLK_SRC_RCO;
2521
2522 pm_runtime_set_autosuspend_delay(&client->dev, 100);
2523 pm_runtime_use_autosuspend(&client->dev);
2524 pm_runtime_set_active(&client->dev);
2525 pm_runtime_enable(&client->dev);
2526
2527 switch (cs43130->dev_id) {
2528 case CS43130_CHIP_ID:
2529 case CS43131_CHIP_ID:
2530 memcpy(all_hp_widgets, digital_hp_widgets,
2531 sizeof(digital_hp_widgets));
2532 memcpy(all_hp_widgets + ARRAY_SIZE(digital_hp_widgets),
2533 analog_hp_widgets, sizeof(analog_hp_widgets));
2534 memcpy(all_hp_routes, digital_hp_routes,
2535 sizeof(digital_hp_routes));
2536 memcpy(all_hp_routes + ARRAY_SIZE(digital_hp_routes),
2537 analog_hp_routes, sizeof(analog_hp_routes));
2538
2539 soc_component_dev_cs43130.dapm_widgets =
2540 all_hp_widgets;
2541 soc_component_dev_cs43130.num_dapm_widgets =
2542 ARRAY_SIZE(all_hp_widgets);
2543 soc_component_dev_cs43130.dapm_routes =
2544 all_hp_routes;
2545 soc_component_dev_cs43130.num_dapm_routes =
2546 ARRAY_SIZE(all_hp_routes);
2547 break;
2548 case CS43198_CHIP_ID:
2549 case CS4399_CHIP_ID:
2550 soc_component_dev_cs43130.dapm_widgets =
2551 digital_hp_widgets;
2552 soc_component_dev_cs43130.num_dapm_widgets =
2553 ARRAY_SIZE(digital_hp_widgets);
2554 soc_component_dev_cs43130.dapm_routes =
2555 digital_hp_routes;
2556 soc_component_dev_cs43130.num_dapm_routes =
2557 ARRAY_SIZE(digital_hp_routes);
2558 break;
2559 }
2560
2561 ret = devm_snd_soc_register_component(&client->dev,
2562 &soc_component_dev_cs43130,
2563 cs43130_dai, ARRAY_SIZE(cs43130_dai));
2564 if (ret < 0) {
2565 dev_err(&client->dev,
2566 "snd_soc_register_component failed with ret = %d\n", ret);
2567 goto err;
2568 }
2569
2570 regmap_update_bits(cs43130->regmap, CS43130_PAD_INT_CFG,
2571 CS43130_ASP_3ST_MASK, 0);
2572 regmap_update_bits(cs43130->regmap, CS43130_PAD_INT_CFG,
2573 CS43130_XSP_3ST_MASK, 0);
2574
2575 return 0;
2576
2577 err:
2578 gpiod_set_value_cansleep(cs43130->reset_gpio, 0);
2579 err_supplies:
2580 regulator_bulk_disable(ARRAY_SIZE(cs43130->supplies),
2581 cs43130->supplies);
2582
2583 return ret;
2584 }
2585
2586 static int cs43130_i2c_remove(struct i2c_client *client)
2587 {
2588 struct cs43130_private *cs43130 = i2c_get_clientdata(client);
2589
2590 if (cs43130->xtal_ibias != CS43130_XTAL_UNUSED)
2591 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
2592 CS43130_XTAL_ERR_INT,
2593 1 << CS43130_XTAL_ERR_INT_SHIFT);
2594
2595 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
2596 CS43130_HP_PLUG_INT | CS43130_HP_UNPLUG_INT,
2597 CS43130_HP_PLUG_INT | CS43130_HP_UNPLUG_INT);
2598
2599 if (cs43130->dc_meas) {
2600 cancel_work_sync(&cs43130->work);
2601 flush_workqueue(cs43130->wq);
2602
2603 device_remove_file(&client->dev, &dev_attr_hpload_dc_l);
2604 device_remove_file(&client->dev, &dev_attr_hpload_dc_r);
2605 device_remove_file(&client->dev, &dev_attr_hpload_ac_l);
2606 device_remove_file(&client->dev, &dev_attr_hpload_ac_r);
2607 }
2608
2609 gpiod_set_value_cansleep(cs43130->reset_gpio, 0);
2610
2611 pm_runtime_disable(&client->dev);
2612 regulator_bulk_disable(CS43130_NUM_SUPPLIES, cs43130->supplies);
2613
2614 return 0;
2615 }
2616
2617 static int __maybe_unused cs43130_runtime_suspend(struct device *dev)
2618 {
2619 struct cs43130_private *cs43130 = dev_get_drvdata(dev);
2620
2621 if (cs43130->xtal_ibias != CS43130_XTAL_UNUSED)
2622 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
2623 CS43130_XTAL_ERR_INT,
2624 1 << CS43130_XTAL_ERR_INT_SHIFT);
2625
2626 regcache_cache_only(cs43130->regmap, true);
2627 regcache_mark_dirty(cs43130->regmap);
2628
2629 gpiod_set_value_cansleep(cs43130->reset_gpio, 0);
2630
2631 regulator_bulk_disable(CS43130_NUM_SUPPLIES, cs43130->supplies);
2632
2633 return 0;
2634 }
2635
2636 static int __maybe_unused cs43130_runtime_resume(struct device *dev)
2637 {
2638 struct cs43130_private *cs43130 = dev_get_drvdata(dev);
2639 int ret;
2640
2641 ret = regulator_bulk_enable(CS43130_NUM_SUPPLIES, cs43130->supplies);
2642 if (ret != 0) {
2643 dev_err(dev, "Failed to enable supplies: %d\n", ret);
2644 return ret;
2645 }
2646
2647 regcache_cache_only(cs43130->regmap, false);
2648
2649 gpiod_set_value_cansleep(cs43130->reset_gpio, 1);
2650
2651 usleep_range(2000, 2050);
2652
2653 ret = regcache_sync(cs43130->regmap);
2654 if (ret != 0) {
2655 dev_err(dev, "Failed to restore register cache\n");
2656 goto err;
2657 }
2658
2659 if (cs43130->xtal_ibias != CS43130_XTAL_UNUSED)
2660 regmap_update_bits(cs43130->regmap, CS43130_INT_MASK_1,
2661 CS43130_XTAL_ERR_INT, 0);
2662
2663 return 0;
2664 err:
2665 regcache_cache_only(cs43130->regmap, true);
2666 regulator_bulk_disable(CS43130_NUM_SUPPLIES, cs43130->supplies);
2667
2668 return ret;
2669 }
2670
2671 static const struct dev_pm_ops cs43130_runtime_pm = {
2672 SET_RUNTIME_PM_OPS(cs43130_runtime_suspend, cs43130_runtime_resume,
2673 NULL)
2674 };
2675
2676 static const struct of_device_id cs43130_of_match[] = {
2677 {.compatible = "cirrus,cs43130",},
2678 {.compatible = "cirrus,cs4399",},
2679 {.compatible = "cirrus,cs43131",},
2680 {.compatible = "cirrus,cs43198",},
2681 {},
2682 };
2683
2684 MODULE_DEVICE_TABLE(of, cs43130_of_match);
2685
2686 static const struct i2c_device_id cs43130_i2c_id[] = {
2687 {"cs43130", 0},
2688 {"cs4399", 0},
2689 {"cs43131", 0},
2690 {"cs43198", 0},
2691 {}
2692 };
2693
2694 MODULE_DEVICE_TABLE(i2c, cs43130_i2c_id);
2695
2696 static struct i2c_driver cs43130_i2c_driver = {
2697 .driver = {
2698 .name = "cs43130",
2699 .of_match_table = cs43130_of_match,
2700 .pm = &cs43130_runtime_pm,
2701 },
2702 .id_table = cs43130_i2c_id,
2703 .probe_new = cs43130_i2c_probe,
2704 .remove = cs43130_i2c_remove,
2705 };
2706
2707 module_i2c_driver(cs43130_i2c_driver);
2708
2709 MODULE_AUTHOR("Li Xu <li.xu@cirrus.com>");
2710 MODULE_DESCRIPTION("Cirrus Logic CS43130 ALSA SoC Codec Driver");
2711 MODULE_LICENSE("GPL");