linux/sound/soc/codecs/cs43130.c
<<
>>
Prefs
   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
  40static 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
 111static 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
 123static 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
 169static 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
 179struct 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
 190static 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
 222static 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
 236static 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
 286static 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
 329static 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
 463static 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
 470static 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
 483static 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
 518static 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
 530static 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
 542static 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
 556static 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
 747static 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
 770static 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
 829static 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
 943static 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
 961static const DECLARE_TLV_DB_SCALE(pcm_vol_tlv, -12750, 50, 1);
 962
 963static const char * const pcm_ch_text[] = {
 964        "Left-Right Ch",
 965        "Left-Left Ch",
 966        "Right-Left Ch",
 967        "Right-Right Ch",
 968};
 969
 970static 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
 991static 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
1012static 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
1018static 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
1046static SOC_ENUM_SINGLE_DECL(pcm_ch_enum, CS43130_PCM_PATH_CTL_2, 0,
1047                            pcm_ch_text);
1048
1049static const char * const pcm_spd_texts[] = {
1050        "Fast",
1051        "Slow",
1052};
1053
1054static SOC_ENUM_SINGLE_DECL(pcm_spd_enum, CS43130_PCM_FILT_OPT, 7,
1055                            pcm_spd_texts);
1056
1057static const char * const dsd_texts[] = {
1058        "Off",
1059        "BCKA Mode",
1060        "BCKD Mode",
1061};
1062
1063static const unsigned int dsd_values[] = {
1064        CS43130_DSD_SRC_DSD,
1065        CS43130_DSD_SRC_ASP,
1066        CS43130_DSD_SRC_XSP,
1067};
1068
1069static SOC_VALUE_ENUM_SINGLE_DECL(dsd_enum, CS43130_DSD_INT_CFG, 0, 0x03,
1070                                  dsd_texts, dsd_values);
1071
1072static 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
1089static 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
1101static 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
1113static const struct reg_sequence pop_free_seq[] = {
1114        {CS43130_DXD1, 0x99},
1115        {CS43130_DXD12, 0x0A},
1116        {CS43130_DXD1, 0},
1117};
1118
1119static const struct reg_sequence pop_free_seq2[] = {
1120        {CS43130_DXD1, 0x99},
1121        {CS43130_DXD13, 0x20},
1122        {CS43130_DXD1, 0},
1123};
1124
1125static 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
1133static 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
1141static 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
1198static 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
1255static const struct reg_sequence dac_postpmu_seq[] = {
1256        {CS43130_DXD9, 0x0C},
1257        {CS43130_DXD3, 0x10},
1258        {CS43130_DXD4, 0x20},
1259};
1260
1261static const struct reg_sequence dac_postpmd_seq[] = {
1262        {CS43130_DXD1, 0x99},
1263        {CS43130_DXD6, 0x01},
1264        {CS43130_DXD1, 0},
1265};
1266
1267static 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
1331static 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
1339static 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
1347static 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
1369static 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
1402static 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
1408static struct snd_soc_dapm_widget all_hp_widgets[
1409                        ARRAY_SIZE(digital_hp_widgets) +
1410                        ARRAY_SIZE(analog_hp_widgets)];
1411
1412static 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
1426static const struct snd_soc_dapm_route analog_hp_routes[] = {
1427        {"HPOUTA", NULL, "Analog Playback"},
1428        {"HPOUTB", NULL, "Analog Playback"},
1429};
1430
1431static struct snd_soc_dapm_route all_hp_routes[
1432                        ARRAY_SIZE(digital_hp_routes) +
1433                        ARRAY_SIZE(analog_hp_routes)];
1434
1435static const unsigned int cs43130_asp_src_rates[] = {
1436        32000, 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000
1437};
1438
1439static 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
1444static 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
1452static const unsigned int cs43130_dop_src_rates[] = {
1453        176400, 352800,
1454};
1455
1456static 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
1461static 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
1469static 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
1513static 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
1536static 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
1549static 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
1557static 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
1565static 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
1572static 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
1627static 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
1656static 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
1662static 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
1674static 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
1680static 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
1686static 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
1699static 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
1721static 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
1727static 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
1733static DEVICE_ATTR(hpload_dc_l, 0444, cs43130_show_dc_l, NULL);
1734static DEVICE_ATTR(hpload_dc_r, 0444, cs43130_show_dc_r, NULL);
1735static DEVICE_ATTR(hpload_ac_l, 0444, cs43130_show_ac_l, NULL);
1736static DEVICE_ATTR(hpload_ac_r, 0444, cs43130_show_ac_r, NULL);
1737
1738static 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
1753static 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
1761static 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
1769static struct reg_sequence hp_dis_cal_seq2[] = {
1770        {CS43130_HP_LOAD_1, 0x80},
1771        {CS43130_HP_LOAD_1, 0},
1772};
1773
1774static 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
1784static struct reg_sequence hp_dc_ch_l_seq2[] = {
1785        {CS43130_HP_LOAD_1, 0x80},
1786        {CS43130_HP_LOAD_1, 0x81},
1787};
1788
1789static 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
1799static struct reg_sequence hp_dc_ch_r_seq2[] = {
1800        {CS43130_HP_LOAD_1, 0x90},
1801        {CS43130_HP_LOAD_1, 0x91},
1802};
1803
1804static 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
1814static struct reg_sequence hp_ac_ch_l_seq2[] = {
1815        {CS43130_HP_LOAD_1, 0x80},
1816        {CS43130_HP_LOAD_1, 0x82},
1817};
1818
1819static 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
1829static struct reg_sequence hp_ac_ch_r_seq2[] = {
1830        {CS43130_HP_LOAD_1, 0x90},
1831        {CS43130_HP_LOAD_1, 0x92},
1832};
1833
1834static 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
1840struct reg_sequences {
1841        struct reg_sequence     *seq;
1842        int                     size;
1843        unsigned int            msk;
1844};
1845
1846static 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
1884static 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
1922static 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
1974static 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
2021static 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
2036static 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
2051static 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
2133exit:
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
2158static 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
2279static 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
2340static 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
2352static 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
2369static u16 const cs43130_dc_threshold[CS43130_DC_THRESHOLD] = {
2370        50,
2371        120,
2372};
2373
2374static 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
2422static 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;
2579err:
2580        return ret;
2581}
2582
2583static 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
2614static 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
2633static 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;
2661err:
2662        regcache_cache_only(cs43130->regmap, true);
2663        regulator_bulk_disable(CS43130_NUM_SUPPLIES, cs43130->supplies);
2664
2665        return ret;
2666}
2667
2668static const struct dev_pm_ops cs43130_runtime_pm = {
2669        SET_RUNTIME_PM_OPS(cs43130_runtime_suspend, cs43130_runtime_resume,
2670                           NULL)
2671};
2672
2673static 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
2681MODULE_DEVICE_TABLE(of, cs43130_of_match);
2682
2683static const struct i2c_device_id cs43130_i2c_id[] = {
2684        {"cs43130", 0},
2685        {"cs4399", 0},
2686        {"cs43131", 0},
2687        {"cs43198", 0},
2688        {}
2689};
2690
2691MODULE_DEVICE_TABLE(i2c, cs43130_i2c_id);
2692
2693static 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
2704module_i2c_driver(cs43130_i2c_driver);
2705
2706MODULE_AUTHOR("Li Xu <li.xu@cirrus.com>");
2707MODULE_DESCRIPTION("Cirrus Logic CS43130 ALSA SoC Codec Driver");
2708MODULE_LICENSE("GPL");
2709