root/sound/soc/codecs/cs43130.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. cs43130_volatile_register
  2. cs43130_readable_register
  3. cs43130_precious_register
  4. cs43130_get_pll_table
  5. cs43130_pll_config
  6. cs43130_set_pll
  7. cs43130_change_clksrc
  8. cs43130_get_bitwidth_table
  9. cs43130_set_bitwidth
  10. cs43130_get_rate_table
  11. cs43130_get_clk_gen
  12. cs43130_set_sp_fmt
  13. cs43130_pcm_dsd_mix
  14. cs43130_dsd_hw_params
  15. cs43130_hw_params
  16. cs43130_hw_free
  17. cs43130_pcm_ch_get
  18. cs43130_pcm_ch_put
  19. cs43130_dsd_event
  20. cs43130_pcm_event
  21. cs43130_dac_event
  22. cs43130_hpin_event
  23. cs43130_pcm_startup
  24. cs43130_dop_startup
  25. cs43130_pcm_set_fmt
  26. cs43130_dsd_set_fmt
  27. cs43130_set_sysclk
  28. cs43130_component_set_sysclk
  29. cs43130_get_ac_reg_val
  30. cs43130_show_dc
  31. cs43130_show_dc_l
  32. cs43130_show_dc_r
  33. cs43130_show_ac
  34. cs43130_show_ac_l
  35. cs43130_show_ac_r
  36. cs43130_update_hpload
  37. cs43130_hpload_proc
  38. cs43130_set_hv
  39. cs43130_imp_meas
  40. cs43130_irq_thread
  41. cs43130_probe
  42. cs43130_handle_device_data
  43. cs43130_i2c_probe
  44. cs43130_i2c_remove
  45. cs43130_runtime_suspend
  46. cs43130_runtime_resume

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

/* [<][>][^][v][top][bottom][index][help] */