linux/sound/soc/codecs/wm5100.c
<<
>>
Prefs
   1/*
   2 * wm5100.c  --  WM5100 ALSA SoC Audio driver
   3 *
   4 * Copyright 2011-2 Wolfson Microelectronics plc
   5 *
   6 * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
   7 *
   8 * This program is free software; you can redistribute it and/or modify
   9 * it under the terms of the GNU General Public License version 2 as
  10 * published by the Free Software Foundation.
  11 */
  12
  13#include <linux/module.h>
  14#include <linux/moduleparam.h>
  15#include <linux/init.h>
  16#include <linux/delay.h>
  17#include <linux/export.h>
  18#include <linux/pm.h>
  19#include <linux/gcd.h>
  20#include <linux/gpio.h>
  21#include <linux/i2c.h>
  22#include <linux/pm_runtime.h>
  23#include <linux/regulator/consumer.h>
  24#include <linux/regulator/fixed.h>
  25#include <linux/slab.h>
  26#include <sound/core.h>
  27#include <sound/pcm.h>
  28#include <sound/pcm_params.h>
  29#include <sound/soc.h>
  30#include <sound/jack.h>
  31#include <sound/initval.h>
  32#include <sound/tlv.h>
  33#include <sound/wm5100.h>
  34
  35#include "wm5100.h"
  36
  37#define WM5100_NUM_CORE_SUPPLIES 2
  38static const char *wm5100_core_supply_names[WM5100_NUM_CORE_SUPPLIES] = {
  39        "DBVDD1",
  40        "LDOVDD", /* If DCVDD is supplied externally specify as LDOVDD */
  41};
  42
  43#define WM5100_AIFS     3
  44#define WM5100_SYNC_SRS 3
  45
  46struct wm5100_fll {
  47        int fref;
  48        int fout;
  49        int src;
  50        struct completion lock;
  51};
  52
  53/* codec private data */
  54struct wm5100_priv {
  55        struct device *dev;
  56        struct regmap *regmap;
  57        struct snd_soc_codec *codec;
  58
  59        struct regulator_bulk_data core_supplies[WM5100_NUM_CORE_SUPPLIES];
  60
  61        int rev;
  62
  63        int sysclk;
  64        int asyncclk;
  65
  66        bool aif_async[WM5100_AIFS];
  67        bool aif_symmetric[WM5100_AIFS];
  68        int sr_ref[WM5100_SYNC_SRS];
  69
  70        bool out_ena[2];
  71
  72        struct snd_soc_jack *jack;
  73        bool jack_detecting;
  74        bool jack_mic;
  75        int jack_mode;
  76        int jack_flips;
  77
  78        struct wm5100_fll fll[2];
  79
  80        struct wm5100_pdata pdata;
  81
  82#ifdef CONFIG_GPIOLIB
  83        struct gpio_chip gpio_chip;
  84#endif
  85};
  86
  87static int wm5100_sr_code[] = {
  88        0,
  89        12000,
  90        24000,
  91        48000,
  92        96000,
  93        192000,
  94        384000,
  95        768000,
  96        0,
  97        11025,
  98        22050,
  99        44100,
 100        88200,
 101        176400,
 102        352800,
 103        705600,
 104        4000,
 105        8000,
 106        16000,
 107        32000,
 108        64000,
 109        128000,
 110        256000,
 111        512000,
 112};
 113
 114static int wm5100_sr_regs[WM5100_SYNC_SRS] = {
 115        WM5100_CLOCKING_4,
 116        WM5100_CLOCKING_5,
 117        WM5100_CLOCKING_6,
 118};
 119
 120static int wm5100_alloc_sr(struct snd_soc_codec *codec, int rate)
 121{
 122        struct wm5100_priv *wm5100 = snd_soc_codec_get_drvdata(codec);
 123        int sr_code, sr_free, i;
 124
 125        for (i = 0; i < ARRAY_SIZE(wm5100_sr_code); i++)
 126                if (wm5100_sr_code[i] == rate)
 127                        break;
 128        if (i == ARRAY_SIZE(wm5100_sr_code)) {
 129                dev_err(codec->dev, "Unsupported sample rate: %dHz\n", rate);
 130                return -EINVAL;
 131        }
 132        sr_code = i;
 133
 134        if ((wm5100->sysclk % rate) == 0) {
 135                /* Is this rate already in use? */
 136                sr_free = -1;
 137                for (i = 0; i < ARRAY_SIZE(wm5100_sr_regs); i++) {
 138                        if (!wm5100->sr_ref[i] && sr_free == -1) {
 139                                sr_free = i;
 140                                continue;
 141                        }
 142                        if ((snd_soc_read(codec, wm5100_sr_regs[i]) &
 143                             WM5100_SAMPLE_RATE_1_MASK) == sr_code)
 144                                break;
 145                }
 146
 147                if (i < ARRAY_SIZE(wm5100_sr_regs)) {
 148                        wm5100->sr_ref[i]++;
 149                        dev_dbg(codec->dev, "SR %dHz, slot %d, ref %d\n",
 150                                rate, i, wm5100->sr_ref[i]);
 151                        return i;
 152                }
 153
 154                if (sr_free == -1) {
 155                        dev_err(codec->dev, "All SR slots already in use\n");
 156                        return -EBUSY;
 157                }
 158
 159                dev_dbg(codec->dev, "Allocating SR slot %d for %dHz\n",
 160                        sr_free, rate);
 161                wm5100->sr_ref[sr_free]++;
 162                snd_soc_update_bits(codec, wm5100_sr_regs[sr_free],
 163                                    WM5100_SAMPLE_RATE_1_MASK,
 164                                    sr_code);
 165
 166                return sr_free;
 167
 168        } else {
 169                dev_err(codec->dev,
 170                        "SR %dHz incompatible with %dHz SYSCLK and %dHz ASYNCCLK\n",
 171                        rate, wm5100->sysclk, wm5100->asyncclk);
 172                return -EINVAL;
 173        }
 174}
 175
 176static void wm5100_free_sr(struct snd_soc_codec *codec, int rate)
 177{
 178        struct wm5100_priv *wm5100 = snd_soc_codec_get_drvdata(codec);
 179        int i, sr_code;
 180
 181        for (i = 0; i < ARRAY_SIZE(wm5100_sr_code); i++)
 182                if (wm5100_sr_code[i] == rate)
 183                        break;
 184        if (i == ARRAY_SIZE(wm5100_sr_code)) {
 185                dev_err(codec->dev, "Unsupported sample rate: %dHz\n", rate);
 186                return;
 187        }
 188        sr_code = wm5100_sr_code[i];
 189
 190        for (i = 0; i < ARRAY_SIZE(wm5100_sr_regs); i++) {
 191                if (!wm5100->sr_ref[i])
 192                        continue;
 193
 194                if ((snd_soc_read(codec, wm5100_sr_regs[i]) &
 195                     WM5100_SAMPLE_RATE_1_MASK) == sr_code)
 196                        break;
 197        }
 198        if (i < ARRAY_SIZE(wm5100_sr_regs)) {
 199                wm5100->sr_ref[i]--;
 200                dev_dbg(codec->dev, "Dereference SR %dHz, count now %d\n",
 201                        rate, wm5100->sr_ref[i]);
 202        } else {
 203                dev_warn(codec->dev, "Freeing unreferenced sample rate %dHz\n",
 204                         rate);
 205        }
 206}
 207
 208static int wm5100_reset(struct wm5100_priv *wm5100)
 209{
 210        if (wm5100->pdata.reset) {
 211                gpio_set_value_cansleep(wm5100->pdata.reset, 0);
 212                gpio_set_value_cansleep(wm5100->pdata.reset, 1);
 213
 214                return 0;
 215        } else {
 216                return regmap_write(wm5100->regmap, WM5100_SOFTWARE_RESET, 0);
 217        }
 218}
 219
 220static DECLARE_TLV_DB_SCALE(in_tlv, -6300, 100, 0);
 221static DECLARE_TLV_DB_SCALE(eq_tlv, -1200, 100, 0);
 222static DECLARE_TLV_DB_SCALE(mixer_tlv, -3200, 100, 0);
 223static DECLARE_TLV_DB_SCALE(out_tlv, -6400, 100, 0);
 224static DECLARE_TLV_DB_SCALE(digital_tlv, -6400, 50, 0);
 225
 226static const char *wm5100_mixer_texts[] = {
 227        "None",
 228        "Tone Generator 1",
 229        "Tone Generator 2",
 230        "AEC loopback",
 231        "IN1L",
 232        "IN1R",
 233        "IN2L",
 234        "IN2R",
 235        "IN3L",
 236        "IN3R",
 237        "IN4L",
 238        "IN4R",
 239        "AIF1RX1",
 240        "AIF1RX2",
 241        "AIF1RX3",
 242        "AIF1RX4",
 243        "AIF1RX5",
 244        "AIF1RX6",
 245        "AIF1RX7",
 246        "AIF1RX8",
 247        "AIF2RX1",
 248        "AIF2RX2",
 249        "AIF3RX1",
 250        "AIF3RX2",
 251        "EQ1",
 252        "EQ2",
 253        "EQ3",
 254        "EQ4",
 255        "DRC1L",
 256        "DRC1R",
 257        "LHPF1",
 258        "LHPF2",
 259        "LHPF3",
 260        "LHPF4",
 261        "DSP1.1",
 262        "DSP1.2",
 263        "DSP1.3",
 264        "DSP1.4",
 265        "DSP1.5",
 266        "DSP1.6",
 267        "DSP2.1",
 268        "DSP2.2",
 269        "DSP2.3",
 270        "DSP2.4",
 271        "DSP2.5",
 272        "DSP2.6",
 273        "DSP3.1",
 274        "DSP3.2",
 275        "DSP3.3",
 276        "DSP3.4",
 277        "DSP3.5",
 278        "DSP3.6",
 279        "ASRC1L",
 280        "ASRC1R",
 281        "ASRC2L",
 282        "ASRC2R",
 283        "ISRC1INT1",
 284        "ISRC1INT2",
 285        "ISRC1INT3",
 286        "ISRC1INT4",
 287        "ISRC2INT1",
 288        "ISRC2INT2",
 289        "ISRC2INT3",
 290        "ISRC2INT4",
 291        "ISRC1DEC1",
 292        "ISRC1DEC2",
 293        "ISRC1DEC3",
 294        "ISRC1DEC4",
 295        "ISRC2DEC1",
 296        "ISRC2DEC2",
 297        "ISRC2DEC3",
 298        "ISRC2DEC4",
 299};
 300
 301static int wm5100_mixer_values[] = {
 302        0x00,
 303        0x04,   /* Tone */
 304        0x05,
 305        0x08,   /* AEC */
 306        0x10,   /* Input */
 307        0x11,
 308        0x12,
 309        0x13,
 310        0x14,
 311        0x15,
 312        0x16,
 313        0x17,
 314        0x20,   /* AIF */
 315        0x21,
 316        0x22,
 317        0x23,
 318        0x24,
 319        0x25,
 320        0x26,
 321        0x27,
 322        0x28,
 323        0x29,
 324        0x30,   /* AIF3 - check */
 325        0x31,
 326        0x50,   /* EQ */
 327        0x51,
 328        0x52,
 329        0x53,
 330        0x54,
 331        0x58,   /* DRC */
 332        0x59,
 333        0x60,   /* LHPF1 */
 334        0x61,   /* LHPF2 */
 335        0x62,   /* LHPF3 */
 336        0x63,   /* LHPF4 */
 337        0x68,   /* DSP1 */
 338        0x69,
 339        0x6a,
 340        0x6b,
 341        0x6c,
 342        0x6d,
 343        0x70,   /* DSP2 */
 344        0x71,
 345        0x72,
 346        0x73,
 347        0x74,
 348        0x75,
 349        0x78,   /* DSP3 */
 350        0x79,
 351        0x7a,
 352        0x7b,
 353        0x7c,
 354        0x7d,
 355        0x90,   /* ASRC1 */
 356        0x91,
 357        0x92,   /* ASRC2 */
 358        0x93,
 359        0xa0,   /* ISRC1DEC1 */
 360        0xa1,
 361        0xa2,
 362        0xa3,
 363        0xa4,   /* ISRC1INT1 */
 364        0xa5,
 365        0xa6,
 366        0xa7,
 367        0xa8,   /* ISRC2DEC1 */
 368        0xa9,
 369        0xaa,
 370        0xab,
 371        0xac,   /* ISRC2INT1 */
 372        0xad,
 373        0xae,
 374        0xaf,
 375};
 376
 377#define WM5100_MIXER_CONTROLS(name, base) \
 378        SOC_SINGLE_TLV(name " Input 1 Volume", base + 1 , \
 379                       WM5100_MIXER_VOL_SHIFT, 80, 0, mixer_tlv), \
 380        SOC_SINGLE_TLV(name " Input 2 Volume", base + 3 , \
 381                       WM5100_MIXER_VOL_SHIFT, 80, 0, mixer_tlv), \
 382        SOC_SINGLE_TLV(name " Input 3 Volume", base + 5 , \
 383                       WM5100_MIXER_VOL_SHIFT, 80, 0, mixer_tlv), \
 384        SOC_SINGLE_TLV(name " Input 4 Volume", base + 7 , \
 385                       WM5100_MIXER_VOL_SHIFT, 80, 0, mixer_tlv)
 386
 387#define WM5100_MUX_ENUM_DECL(name, reg) \
 388        SOC_VALUE_ENUM_SINGLE_DECL(name, reg, 0, 0xff,                  \
 389                                   wm5100_mixer_texts, wm5100_mixer_values)
 390
 391#define WM5100_MUX_CTL_DECL(name) \
 392        const struct snd_kcontrol_new name##_mux =      \
 393                SOC_DAPM_ENUM("Route", name##_enum)
 394
 395#define WM5100_MIXER_ENUMS(name, base_reg) \
 396        static WM5100_MUX_ENUM_DECL(name##_in1_enum, base_reg);      \
 397        static WM5100_MUX_ENUM_DECL(name##_in2_enum, base_reg + 2);  \
 398        static WM5100_MUX_ENUM_DECL(name##_in3_enum, base_reg + 4);  \
 399        static WM5100_MUX_ENUM_DECL(name##_in4_enum, base_reg + 6);  \
 400        static WM5100_MUX_CTL_DECL(name##_in1); \
 401        static WM5100_MUX_CTL_DECL(name##_in2); \
 402        static WM5100_MUX_CTL_DECL(name##_in3); \
 403        static WM5100_MUX_CTL_DECL(name##_in4) 
 404
 405WM5100_MIXER_ENUMS(HPOUT1L, WM5100_OUT1LMIX_INPUT_1_SOURCE);
 406WM5100_MIXER_ENUMS(HPOUT1R, WM5100_OUT1RMIX_INPUT_1_SOURCE);
 407WM5100_MIXER_ENUMS(HPOUT2L, WM5100_OUT2LMIX_INPUT_1_SOURCE);
 408WM5100_MIXER_ENUMS(HPOUT2R, WM5100_OUT2RMIX_INPUT_1_SOURCE);
 409WM5100_MIXER_ENUMS(HPOUT3L, WM5100_OUT3LMIX_INPUT_1_SOURCE);
 410WM5100_MIXER_ENUMS(HPOUT3R, WM5100_OUT3RMIX_INPUT_1_SOURCE);
 411
 412WM5100_MIXER_ENUMS(SPKOUTL, WM5100_OUT4LMIX_INPUT_1_SOURCE);
 413WM5100_MIXER_ENUMS(SPKOUTR, WM5100_OUT4RMIX_INPUT_1_SOURCE);
 414WM5100_MIXER_ENUMS(SPKDAT1L, WM5100_OUT5LMIX_INPUT_1_SOURCE);
 415WM5100_MIXER_ENUMS(SPKDAT1R, WM5100_OUT5RMIX_INPUT_1_SOURCE);
 416WM5100_MIXER_ENUMS(SPKDAT2L, WM5100_OUT6LMIX_INPUT_1_SOURCE);
 417WM5100_MIXER_ENUMS(SPKDAT2R, WM5100_OUT6RMIX_INPUT_1_SOURCE);
 418
 419WM5100_MIXER_ENUMS(PWM1, WM5100_PWM1MIX_INPUT_1_SOURCE);
 420WM5100_MIXER_ENUMS(PWM2, WM5100_PWM1MIX_INPUT_1_SOURCE);
 421
 422WM5100_MIXER_ENUMS(AIF1TX1, WM5100_AIF1TX1MIX_INPUT_1_SOURCE);
 423WM5100_MIXER_ENUMS(AIF1TX2, WM5100_AIF1TX2MIX_INPUT_1_SOURCE);
 424WM5100_MIXER_ENUMS(AIF1TX3, WM5100_AIF1TX3MIX_INPUT_1_SOURCE);
 425WM5100_MIXER_ENUMS(AIF1TX4, WM5100_AIF1TX4MIX_INPUT_1_SOURCE);
 426WM5100_MIXER_ENUMS(AIF1TX5, WM5100_AIF1TX5MIX_INPUT_1_SOURCE);
 427WM5100_MIXER_ENUMS(AIF1TX6, WM5100_AIF1TX6MIX_INPUT_1_SOURCE);
 428WM5100_MIXER_ENUMS(AIF1TX7, WM5100_AIF1TX7MIX_INPUT_1_SOURCE);
 429WM5100_MIXER_ENUMS(AIF1TX8, WM5100_AIF1TX8MIX_INPUT_1_SOURCE);
 430
 431WM5100_MIXER_ENUMS(AIF2TX1, WM5100_AIF2TX1MIX_INPUT_1_SOURCE);
 432WM5100_MIXER_ENUMS(AIF2TX2, WM5100_AIF2TX2MIX_INPUT_1_SOURCE);
 433
 434WM5100_MIXER_ENUMS(AIF3TX1, WM5100_AIF1TX1MIX_INPUT_1_SOURCE);
 435WM5100_MIXER_ENUMS(AIF3TX2, WM5100_AIF1TX2MIX_INPUT_1_SOURCE);
 436
 437WM5100_MIXER_ENUMS(EQ1, WM5100_EQ1MIX_INPUT_1_SOURCE);
 438WM5100_MIXER_ENUMS(EQ2, WM5100_EQ2MIX_INPUT_1_SOURCE);
 439WM5100_MIXER_ENUMS(EQ3, WM5100_EQ3MIX_INPUT_1_SOURCE);
 440WM5100_MIXER_ENUMS(EQ4, WM5100_EQ4MIX_INPUT_1_SOURCE);
 441
 442WM5100_MIXER_ENUMS(DRC1L, WM5100_DRC1LMIX_INPUT_1_SOURCE);
 443WM5100_MIXER_ENUMS(DRC1R, WM5100_DRC1RMIX_INPUT_1_SOURCE);
 444
 445WM5100_MIXER_ENUMS(LHPF1, WM5100_HPLP1MIX_INPUT_1_SOURCE);
 446WM5100_MIXER_ENUMS(LHPF2, WM5100_HPLP2MIX_INPUT_1_SOURCE);
 447WM5100_MIXER_ENUMS(LHPF3, WM5100_HPLP3MIX_INPUT_1_SOURCE);
 448WM5100_MIXER_ENUMS(LHPF4, WM5100_HPLP4MIX_INPUT_1_SOURCE);
 449
 450#define WM5100_MUX(name, ctrl) \
 451        SND_SOC_DAPM_MUX(name, SND_SOC_NOPM, 0, 0, ctrl)
 452
 453#define WM5100_MIXER_WIDGETS(name, name_str)    \
 454        WM5100_MUX(name_str " Input 1", &name##_in1_mux), \
 455        WM5100_MUX(name_str " Input 2", &name##_in2_mux), \
 456        WM5100_MUX(name_str " Input 3", &name##_in3_mux), \
 457        WM5100_MUX(name_str " Input 4", &name##_in4_mux), \
 458        SND_SOC_DAPM_MIXER(name_str " Mixer", SND_SOC_NOPM, 0, 0, NULL, 0)
 459
 460#define WM5100_MIXER_INPUT_ROUTES(name) \
 461        { name, "Tone Generator 1", "Tone Generator 1" }, \
 462        { name, "Tone Generator 2", "Tone Generator 2" }, \
 463        { name, "IN1L", "IN1L PGA" }, \
 464        { name, "IN1R", "IN1R PGA" }, \
 465        { name, "IN2L", "IN2L PGA" }, \
 466        { name, "IN2R", "IN2R PGA" }, \
 467        { name, "IN3L", "IN3L PGA" }, \
 468        { name, "IN3R", "IN3R PGA" }, \
 469        { name, "IN4L", "IN4L PGA" }, \
 470        { name, "IN4R", "IN4R PGA" }, \
 471        { name, "AIF1RX1", "AIF1RX1" }, \
 472        { name, "AIF1RX2", "AIF1RX2" }, \
 473        { name, "AIF1RX3", "AIF1RX3" }, \
 474        { name, "AIF1RX4", "AIF1RX4" }, \
 475        { name, "AIF1RX5", "AIF1RX5" }, \
 476        { name, "AIF1RX6", "AIF1RX6" }, \
 477        { name, "AIF1RX7", "AIF1RX7" }, \
 478        { name, "AIF1RX8", "AIF1RX8" }, \
 479        { name, "AIF2RX1", "AIF2RX1" }, \
 480        { name, "AIF2RX2", "AIF2RX2" }, \
 481        { name, "AIF3RX1", "AIF3RX1" }, \
 482        { name, "AIF3RX2", "AIF3RX2" }, \
 483        { name, "EQ1", "EQ1" }, \
 484        { name, "EQ2", "EQ2" }, \
 485        { name, "EQ3", "EQ3" }, \
 486        { name, "EQ4", "EQ4" }, \
 487        { name, "DRC1L", "DRC1L" }, \
 488        { name, "DRC1R", "DRC1R" }, \
 489        { name, "LHPF1", "LHPF1" }, \
 490        { name, "LHPF2", "LHPF2" }, \
 491        { name, "LHPF3", "LHPF3" }, \
 492        { name, "LHPF4", "LHPF4" }
 493
 494#define WM5100_MIXER_ROUTES(widget, name) \
 495        { widget, NULL, name " Mixer" },         \
 496        { name " Mixer", NULL, name " Input 1" }, \
 497        { name " Mixer", NULL, name " Input 2" }, \
 498        { name " Mixer", NULL, name " Input 3" }, \
 499        { name " Mixer", NULL, name " Input 4" }, \
 500        WM5100_MIXER_INPUT_ROUTES(name " Input 1"), \
 501        WM5100_MIXER_INPUT_ROUTES(name " Input 2"), \
 502        WM5100_MIXER_INPUT_ROUTES(name " Input 3"), \
 503        WM5100_MIXER_INPUT_ROUTES(name " Input 4")
 504
 505static const char *wm5100_lhpf_mode_text[] = {
 506        "Low-pass", "High-pass"
 507};
 508
 509static SOC_ENUM_SINGLE_DECL(wm5100_lhpf1_mode,
 510                            WM5100_HPLPF1_1, WM5100_LHPF1_MODE_SHIFT,
 511                            wm5100_lhpf_mode_text);
 512
 513static SOC_ENUM_SINGLE_DECL(wm5100_lhpf2_mode,
 514                            WM5100_HPLPF2_1, WM5100_LHPF2_MODE_SHIFT,
 515                            wm5100_lhpf_mode_text);
 516
 517static SOC_ENUM_SINGLE_DECL(wm5100_lhpf3_mode,
 518                            WM5100_HPLPF3_1, WM5100_LHPF3_MODE_SHIFT,
 519                            wm5100_lhpf_mode_text);
 520
 521static SOC_ENUM_SINGLE_DECL(wm5100_lhpf4_mode,
 522                            WM5100_HPLPF4_1, WM5100_LHPF4_MODE_SHIFT,
 523                            wm5100_lhpf_mode_text);
 524
 525static const struct snd_kcontrol_new wm5100_snd_controls[] = {
 526SOC_SINGLE("IN1 High Performance Switch", WM5100_IN1L_CONTROL,
 527           WM5100_IN1_OSR_SHIFT, 1, 0),
 528SOC_SINGLE("IN2 High Performance Switch", WM5100_IN2L_CONTROL,
 529           WM5100_IN2_OSR_SHIFT, 1, 0),
 530SOC_SINGLE("IN3 High Performance Switch", WM5100_IN3L_CONTROL,
 531           WM5100_IN3_OSR_SHIFT, 1, 0),
 532SOC_SINGLE("IN4 High Performance Switch", WM5100_IN4L_CONTROL,
 533           WM5100_IN4_OSR_SHIFT, 1, 0),
 534
 535/* Only applicable for analogue inputs */
 536SOC_DOUBLE_R_TLV("IN1 Volume", WM5100_IN1L_CONTROL, WM5100_IN1R_CONTROL,
 537                 WM5100_IN1L_PGA_VOL_SHIFT, 94, 0, in_tlv),
 538SOC_DOUBLE_R_TLV("IN2 Volume", WM5100_IN2L_CONTROL, WM5100_IN2R_CONTROL,
 539                 WM5100_IN2L_PGA_VOL_SHIFT, 94, 0, in_tlv),
 540SOC_DOUBLE_R_TLV("IN3 Volume", WM5100_IN3L_CONTROL, WM5100_IN3R_CONTROL,
 541                 WM5100_IN3L_PGA_VOL_SHIFT, 94, 0, in_tlv),
 542SOC_DOUBLE_R_TLV("IN4 Volume", WM5100_IN4L_CONTROL, WM5100_IN4R_CONTROL,
 543                 WM5100_IN4L_PGA_VOL_SHIFT, 94, 0, in_tlv),
 544
 545SOC_DOUBLE_R_TLV("IN1 Digital Volume", WM5100_ADC_DIGITAL_VOLUME_1L,
 546                 WM5100_ADC_DIGITAL_VOLUME_1R, WM5100_IN1L_VOL_SHIFT, 191,
 547                 0, digital_tlv),
 548SOC_DOUBLE_R_TLV("IN2 Digital Volume", WM5100_ADC_DIGITAL_VOLUME_2L,
 549                 WM5100_ADC_DIGITAL_VOLUME_2R, WM5100_IN2L_VOL_SHIFT, 191,
 550                 0, digital_tlv),
 551SOC_DOUBLE_R_TLV("IN3 Digital Volume", WM5100_ADC_DIGITAL_VOLUME_3L,
 552                 WM5100_ADC_DIGITAL_VOLUME_3R, WM5100_IN3L_VOL_SHIFT, 191,
 553                 0, digital_tlv),
 554SOC_DOUBLE_R_TLV("IN4 Digital Volume", WM5100_ADC_DIGITAL_VOLUME_4L,
 555                 WM5100_ADC_DIGITAL_VOLUME_4R, WM5100_IN4L_VOL_SHIFT, 191,
 556                 0, digital_tlv),
 557
 558SOC_DOUBLE_R("IN1 Switch", WM5100_ADC_DIGITAL_VOLUME_1L,
 559             WM5100_ADC_DIGITAL_VOLUME_1R, WM5100_IN1L_MUTE_SHIFT, 1, 1),
 560SOC_DOUBLE_R("IN2 Switch", WM5100_ADC_DIGITAL_VOLUME_2L,
 561             WM5100_ADC_DIGITAL_VOLUME_2R, WM5100_IN2L_MUTE_SHIFT, 1, 1),
 562SOC_DOUBLE_R("IN3 Switch", WM5100_ADC_DIGITAL_VOLUME_3L,
 563             WM5100_ADC_DIGITAL_VOLUME_3R, WM5100_IN3L_MUTE_SHIFT, 1, 1),
 564SOC_DOUBLE_R("IN4 Switch", WM5100_ADC_DIGITAL_VOLUME_4L,
 565             WM5100_ADC_DIGITAL_VOLUME_4R, WM5100_IN4L_MUTE_SHIFT, 1, 1),
 566
 567SND_SOC_BYTES_MASK("EQ1 Coefficients", WM5100_EQ1_1, 20, WM5100_EQ1_ENA),
 568SND_SOC_BYTES_MASK("EQ2 Coefficients", WM5100_EQ2_1, 20, WM5100_EQ2_ENA),
 569SND_SOC_BYTES_MASK("EQ3 Coefficients", WM5100_EQ3_1, 20, WM5100_EQ3_ENA),
 570SND_SOC_BYTES_MASK("EQ4 Coefficients", WM5100_EQ4_1, 20, WM5100_EQ4_ENA),
 571
 572SND_SOC_BYTES_MASK("DRC Coefficients", WM5100_DRC1_CTRL1, 5,
 573                   WM5100_DRCL_ENA | WM5100_DRCR_ENA),
 574
 575SND_SOC_BYTES("LHPF1 Coefficeints", WM5100_HPLPF1_2, 1),
 576SND_SOC_BYTES("LHPF2 Coefficeints", WM5100_HPLPF2_2, 1),
 577SND_SOC_BYTES("LHPF3 Coefficeints", WM5100_HPLPF3_2, 1),
 578SND_SOC_BYTES("LHPF4 Coefficeints", WM5100_HPLPF4_2, 1),
 579
 580SOC_SINGLE("HPOUT1 High Performance Switch", WM5100_OUT_VOLUME_1L,
 581           WM5100_OUT1_OSR_SHIFT, 1, 0),
 582SOC_SINGLE("HPOUT2 High Performance Switch", WM5100_OUT_VOLUME_2L,
 583           WM5100_OUT2_OSR_SHIFT, 1, 0),
 584SOC_SINGLE("HPOUT3 High Performance Switch", WM5100_OUT_VOLUME_3L,
 585           WM5100_OUT3_OSR_SHIFT, 1, 0),
 586SOC_SINGLE("SPKOUT High Performance Switch", WM5100_OUT_VOLUME_4L,
 587           WM5100_OUT4_OSR_SHIFT, 1, 0),
 588SOC_SINGLE("SPKDAT1 High Performance Switch", WM5100_DAC_VOLUME_LIMIT_5L,
 589           WM5100_OUT5_OSR_SHIFT, 1, 0),
 590SOC_SINGLE("SPKDAT2 High Performance Switch", WM5100_DAC_VOLUME_LIMIT_6L,
 591           WM5100_OUT6_OSR_SHIFT, 1, 0),
 592
 593SOC_DOUBLE_R_TLV("HPOUT1 Digital Volume", WM5100_DAC_DIGITAL_VOLUME_1L,
 594                 WM5100_DAC_DIGITAL_VOLUME_1R, WM5100_OUT1L_VOL_SHIFT, 159, 0,
 595                 digital_tlv),
 596SOC_DOUBLE_R_TLV("HPOUT2 Digital Volume", WM5100_DAC_DIGITAL_VOLUME_2L,
 597                 WM5100_DAC_DIGITAL_VOLUME_2R, WM5100_OUT2L_VOL_SHIFT, 159, 0,
 598                 digital_tlv),
 599SOC_DOUBLE_R_TLV("HPOUT3 Digital Volume", WM5100_DAC_DIGITAL_VOLUME_3L,
 600                 WM5100_DAC_DIGITAL_VOLUME_3R, WM5100_OUT3L_VOL_SHIFT, 159, 0,
 601                 digital_tlv),
 602SOC_DOUBLE_R_TLV("SPKOUT Digital Volume", WM5100_DAC_DIGITAL_VOLUME_4L,
 603                 WM5100_DAC_DIGITAL_VOLUME_4R, WM5100_OUT4L_VOL_SHIFT, 159, 0,
 604                 digital_tlv),
 605SOC_DOUBLE_R_TLV("SPKDAT1 Digital Volume", WM5100_DAC_DIGITAL_VOLUME_5L,
 606                 WM5100_DAC_DIGITAL_VOLUME_5R, WM5100_OUT5L_VOL_SHIFT, 159, 0,
 607                 digital_tlv),
 608SOC_DOUBLE_R_TLV("SPKDAT2 Digital Volume", WM5100_DAC_DIGITAL_VOLUME_6L,
 609                 WM5100_DAC_DIGITAL_VOLUME_6R, WM5100_OUT6L_VOL_SHIFT, 159, 0,
 610                 digital_tlv),
 611
 612SOC_DOUBLE_R("HPOUT1 Digital Switch", WM5100_DAC_DIGITAL_VOLUME_1L,
 613             WM5100_DAC_DIGITAL_VOLUME_1R, WM5100_OUT1L_MUTE_SHIFT, 1, 1),
 614SOC_DOUBLE_R("HPOUT2 Digital Switch", WM5100_DAC_DIGITAL_VOLUME_2L,
 615             WM5100_DAC_DIGITAL_VOLUME_2R, WM5100_OUT2L_MUTE_SHIFT, 1, 1),
 616SOC_DOUBLE_R("HPOUT3 Digital Switch", WM5100_DAC_DIGITAL_VOLUME_3L,
 617             WM5100_DAC_DIGITAL_VOLUME_3R, WM5100_OUT3L_MUTE_SHIFT, 1, 1),
 618SOC_DOUBLE_R("SPKOUT Digital Switch", WM5100_DAC_DIGITAL_VOLUME_4L,
 619             WM5100_DAC_DIGITAL_VOLUME_4R, WM5100_OUT4L_MUTE_SHIFT, 1, 1),
 620SOC_DOUBLE_R("SPKDAT1 Digital Switch", WM5100_DAC_DIGITAL_VOLUME_5L,
 621             WM5100_DAC_DIGITAL_VOLUME_5R, WM5100_OUT5L_MUTE_SHIFT, 1, 1),
 622SOC_DOUBLE_R("SPKDAT2 Digital Switch", WM5100_DAC_DIGITAL_VOLUME_6L,
 623             WM5100_DAC_DIGITAL_VOLUME_6R, WM5100_OUT6L_MUTE_SHIFT, 1, 1),
 624
 625/* FIXME: Only valid from -12dB to 0dB (52-64) */
 626SOC_DOUBLE_R_TLV("HPOUT1 Volume", WM5100_OUT_VOLUME_1L, WM5100_OUT_VOLUME_1R,
 627                 WM5100_OUT1L_PGA_VOL_SHIFT, 64, 0, out_tlv),
 628SOC_DOUBLE_R_TLV("HPOUT2 Volume", WM5100_OUT_VOLUME_2L, WM5100_OUT_VOLUME_2R,
 629                 WM5100_OUT2L_PGA_VOL_SHIFT, 64, 0, out_tlv),
 630SOC_DOUBLE_R_TLV("HPOUT3 Volume", WM5100_OUT_VOLUME_3L, WM5100_OUT_VOLUME_3R,
 631                 WM5100_OUT2L_PGA_VOL_SHIFT, 64, 0, out_tlv),
 632
 633SOC_DOUBLE("SPKDAT1 Switch", WM5100_PDM_SPK1_CTRL_1, WM5100_SPK1L_MUTE_SHIFT,
 634           WM5100_SPK1R_MUTE_SHIFT, 1, 1),
 635SOC_DOUBLE("SPKDAT2 Switch", WM5100_PDM_SPK2_CTRL_1, WM5100_SPK2L_MUTE_SHIFT,
 636           WM5100_SPK2R_MUTE_SHIFT, 1, 1),
 637
 638SOC_SINGLE_TLV("EQ1 Band 1 Volume", WM5100_EQ1_1, WM5100_EQ1_B1_GAIN_SHIFT,
 639               24, 0, eq_tlv),
 640SOC_SINGLE_TLV("EQ1 Band 2 Volume", WM5100_EQ1_1, WM5100_EQ1_B2_GAIN_SHIFT,
 641               24, 0, eq_tlv),
 642SOC_SINGLE_TLV("EQ1 Band 3 Volume", WM5100_EQ1_1, WM5100_EQ1_B3_GAIN_SHIFT,
 643               24, 0, eq_tlv),
 644SOC_SINGLE_TLV("EQ1 Band 4 Volume", WM5100_EQ1_2, WM5100_EQ1_B4_GAIN_SHIFT,
 645               24, 0, eq_tlv),
 646SOC_SINGLE_TLV("EQ1 Band 5 Volume", WM5100_EQ1_2, WM5100_EQ1_B5_GAIN_SHIFT,
 647               24, 0, eq_tlv),
 648
 649SOC_SINGLE_TLV("EQ2 Band 1 Volume", WM5100_EQ2_1, WM5100_EQ2_B1_GAIN_SHIFT,
 650               24, 0, eq_tlv),
 651SOC_SINGLE_TLV("EQ2 Band 2 Volume", WM5100_EQ2_1, WM5100_EQ2_B2_GAIN_SHIFT,
 652               24, 0, eq_tlv),
 653SOC_SINGLE_TLV("EQ2 Band 3 Volume", WM5100_EQ2_1, WM5100_EQ2_B3_GAIN_SHIFT,
 654               24, 0, eq_tlv),
 655SOC_SINGLE_TLV("EQ2 Band 4 Volume", WM5100_EQ2_2, WM5100_EQ2_B4_GAIN_SHIFT,
 656               24, 0, eq_tlv),
 657SOC_SINGLE_TLV("EQ2 Band 5 Volume", WM5100_EQ2_2, WM5100_EQ2_B5_GAIN_SHIFT,
 658               24, 0, eq_tlv),
 659
 660SOC_SINGLE_TLV("EQ3 Band 1 Volume", WM5100_EQ1_1, WM5100_EQ3_B1_GAIN_SHIFT,
 661               24, 0, eq_tlv),
 662SOC_SINGLE_TLV("EQ3 Band 2 Volume", WM5100_EQ3_1, WM5100_EQ3_B2_GAIN_SHIFT,
 663               24, 0, eq_tlv),
 664SOC_SINGLE_TLV("EQ3 Band 3 Volume", WM5100_EQ3_1, WM5100_EQ3_B3_GAIN_SHIFT,
 665               24, 0, eq_tlv),
 666SOC_SINGLE_TLV("EQ3 Band 4 Volume", WM5100_EQ3_2, WM5100_EQ3_B4_GAIN_SHIFT,
 667               24, 0, eq_tlv),
 668SOC_SINGLE_TLV("EQ3 Band 5 Volume", WM5100_EQ3_2, WM5100_EQ3_B5_GAIN_SHIFT,
 669               24, 0, eq_tlv),
 670
 671SOC_SINGLE_TLV("EQ4 Band 1 Volume", WM5100_EQ4_1, WM5100_EQ4_B1_GAIN_SHIFT,
 672               24, 0, eq_tlv),
 673SOC_SINGLE_TLV("EQ4 Band 2 Volume", WM5100_EQ4_1, WM5100_EQ4_B2_GAIN_SHIFT,
 674               24, 0, eq_tlv),
 675SOC_SINGLE_TLV("EQ4 Band 3 Volume", WM5100_EQ4_1, WM5100_EQ4_B3_GAIN_SHIFT,
 676               24, 0, eq_tlv),
 677SOC_SINGLE_TLV("EQ4 Band 4 Volume", WM5100_EQ4_2, WM5100_EQ4_B4_GAIN_SHIFT,
 678               24, 0, eq_tlv),
 679SOC_SINGLE_TLV("EQ4 Band 5 Volume", WM5100_EQ4_2, WM5100_EQ4_B5_GAIN_SHIFT,
 680               24, 0, eq_tlv),
 681
 682SOC_ENUM("LHPF1 Mode", wm5100_lhpf1_mode),
 683SOC_ENUM("LHPF2 Mode", wm5100_lhpf2_mode),
 684SOC_ENUM("LHPF3 Mode", wm5100_lhpf3_mode),
 685SOC_ENUM("LHPF4 Mode", wm5100_lhpf4_mode),
 686
 687WM5100_MIXER_CONTROLS("HPOUT1L", WM5100_OUT1LMIX_INPUT_1_SOURCE),
 688WM5100_MIXER_CONTROLS("HPOUT1R", WM5100_OUT1RMIX_INPUT_1_SOURCE),
 689WM5100_MIXER_CONTROLS("HPOUT2L", WM5100_OUT2LMIX_INPUT_1_SOURCE),
 690WM5100_MIXER_CONTROLS("HPOUT2R", WM5100_OUT2RMIX_INPUT_1_SOURCE),
 691WM5100_MIXER_CONTROLS("HPOUT3L", WM5100_OUT3LMIX_INPUT_1_SOURCE),
 692WM5100_MIXER_CONTROLS("HPOUT3R", WM5100_OUT3RMIX_INPUT_1_SOURCE),
 693
 694WM5100_MIXER_CONTROLS("SPKOUTL", WM5100_OUT4LMIX_INPUT_1_SOURCE),
 695WM5100_MIXER_CONTROLS("SPKOUTR", WM5100_OUT4RMIX_INPUT_1_SOURCE),
 696WM5100_MIXER_CONTROLS("SPKDAT1L", WM5100_OUT5LMIX_INPUT_1_SOURCE),
 697WM5100_MIXER_CONTROLS("SPKDAT1R", WM5100_OUT5RMIX_INPUT_1_SOURCE),
 698WM5100_MIXER_CONTROLS("SPKDAT2L", WM5100_OUT6LMIX_INPUT_1_SOURCE),
 699WM5100_MIXER_CONTROLS("SPKDAT2R", WM5100_OUT6RMIX_INPUT_1_SOURCE),
 700
 701WM5100_MIXER_CONTROLS("PWM1", WM5100_PWM1MIX_INPUT_1_SOURCE),
 702WM5100_MIXER_CONTROLS("PWM2", WM5100_PWM2MIX_INPUT_1_SOURCE),
 703
 704WM5100_MIXER_CONTROLS("AIF1TX1", WM5100_AIF1TX1MIX_INPUT_1_SOURCE),
 705WM5100_MIXER_CONTROLS("AIF1TX2", WM5100_AIF1TX2MIX_INPUT_1_SOURCE),
 706WM5100_MIXER_CONTROLS("AIF1TX3", WM5100_AIF1TX3MIX_INPUT_1_SOURCE),
 707WM5100_MIXER_CONTROLS("AIF1TX4", WM5100_AIF1TX4MIX_INPUT_1_SOURCE),
 708WM5100_MIXER_CONTROLS("AIF1TX5", WM5100_AIF1TX5MIX_INPUT_1_SOURCE),
 709WM5100_MIXER_CONTROLS("AIF1TX6", WM5100_AIF1TX6MIX_INPUT_1_SOURCE),
 710WM5100_MIXER_CONTROLS("AIF1TX7", WM5100_AIF1TX7MIX_INPUT_1_SOURCE),
 711WM5100_MIXER_CONTROLS("AIF1TX8", WM5100_AIF1TX8MIX_INPUT_1_SOURCE),
 712
 713WM5100_MIXER_CONTROLS("AIF2TX1", WM5100_AIF2TX1MIX_INPUT_1_SOURCE),
 714WM5100_MIXER_CONTROLS("AIF2TX2", WM5100_AIF2TX2MIX_INPUT_1_SOURCE),
 715
 716WM5100_MIXER_CONTROLS("AIF3TX1", WM5100_AIF3TX1MIX_INPUT_1_SOURCE),
 717WM5100_MIXER_CONTROLS("AIF3TX2", WM5100_AIF3TX2MIX_INPUT_1_SOURCE),
 718
 719WM5100_MIXER_CONTROLS("EQ1", WM5100_EQ1MIX_INPUT_1_SOURCE),
 720WM5100_MIXER_CONTROLS("EQ2", WM5100_EQ2MIX_INPUT_1_SOURCE),
 721WM5100_MIXER_CONTROLS("EQ3", WM5100_EQ3MIX_INPUT_1_SOURCE),
 722WM5100_MIXER_CONTROLS("EQ4", WM5100_EQ4MIX_INPUT_1_SOURCE),
 723
 724WM5100_MIXER_CONTROLS("DRC1L", WM5100_DRC1LMIX_INPUT_1_SOURCE),
 725WM5100_MIXER_CONTROLS("DRC1R", WM5100_DRC1RMIX_INPUT_1_SOURCE),
 726SND_SOC_BYTES_MASK("DRC", WM5100_DRC1_CTRL1, 5,
 727                   WM5100_DRCL_ENA | WM5100_DRCR_ENA),
 728
 729WM5100_MIXER_CONTROLS("LHPF1", WM5100_HPLP1MIX_INPUT_1_SOURCE),
 730WM5100_MIXER_CONTROLS("LHPF2", WM5100_HPLP2MIX_INPUT_1_SOURCE),
 731WM5100_MIXER_CONTROLS("LHPF3", WM5100_HPLP3MIX_INPUT_1_SOURCE),
 732WM5100_MIXER_CONTROLS("LHPF4", WM5100_HPLP4MIX_INPUT_1_SOURCE),
 733};
 734
 735static void wm5100_seq_notifier(struct snd_soc_dapm_context *dapm,
 736                                enum snd_soc_dapm_type event, int subseq)
 737{
 738        struct snd_soc_codec *codec = snd_soc_dapm_to_codec(dapm);
 739        struct wm5100_priv *wm5100 = snd_soc_codec_get_drvdata(codec);
 740        u16 val, expect, i;
 741
 742        /* Wait for the outputs to flag themselves as enabled */
 743        if (wm5100->out_ena[0]) {
 744                expect = snd_soc_read(codec, WM5100_CHANNEL_ENABLES_1);
 745                for (i = 0; i < 200; i++) {
 746                        val = snd_soc_read(codec, WM5100_OUTPUT_STATUS_1);
 747                        if (val == expect) {
 748                                wm5100->out_ena[0] = false;
 749                                break;
 750                        }
 751                }
 752                if (i == 200) {
 753                        dev_err(codec->dev, "Timeout waiting for OUTPUT1 %x\n",
 754                                expect);
 755                }
 756        }
 757
 758        if (wm5100->out_ena[1]) {
 759                expect = snd_soc_read(codec, WM5100_OUTPUT_ENABLES_2);
 760                for (i = 0; i < 200; i++) {
 761                        val = snd_soc_read(codec, WM5100_OUTPUT_STATUS_2);
 762                        if (val == expect) {
 763                                wm5100->out_ena[1] = false;
 764                                break;
 765                        }
 766                }
 767                if (i == 200) {
 768                        dev_err(codec->dev, "Timeout waiting for OUTPUT2 %x\n",
 769                                expect);
 770                }
 771        }
 772}
 773
 774static int wm5100_out_ev(struct snd_soc_dapm_widget *w,
 775                         struct snd_kcontrol *kcontrol,
 776                         int event)
 777{
 778        struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
 779        struct wm5100_priv *wm5100 = snd_soc_codec_get_drvdata(codec);
 780
 781        switch (w->reg) {
 782        case WM5100_CHANNEL_ENABLES_1:
 783                wm5100->out_ena[0] = true;
 784                break;
 785        case WM5100_OUTPUT_ENABLES_2:
 786                wm5100->out_ena[0] = true;
 787                break;
 788        default:
 789                break;
 790        }
 791
 792        return 0;
 793}
 794
 795static void wm5100_log_status3(struct wm5100_priv *wm5100, int val)
 796{
 797        if (val & WM5100_SPK_SHUTDOWN_WARN_EINT)
 798                dev_crit(wm5100->dev, "Speaker shutdown warning\n");
 799        if (val & WM5100_SPK_SHUTDOWN_EINT)
 800                dev_crit(wm5100->dev, "Speaker shutdown\n");
 801        if (val & WM5100_CLKGEN_ERR_EINT)
 802                dev_crit(wm5100->dev, "SYSCLK underclocked\n");
 803        if (val & WM5100_CLKGEN_ERR_ASYNC_EINT)
 804                dev_crit(wm5100->dev, "ASYNCCLK underclocked\n");
 805}
 806
 807static void wm5100_log_status4(struct wm5100_priv *wm5100, int val)
 808{
 809        if (val & WM5100_AIF3_ERR_EINT)
 810                dev_err(wm5100->dev, "AIF3 configuration error\n");
 811        if (val & WM5100_AIF2_ERR_EINT)
 812                dev_err(wm5100->dev, "AIF2 configuration error\n");
 813        if (val & WM5100_AIF1_ERR_EINT)
 814                dev_err(wm5100->dev, "AIF1 configuration error\n");
 815        if (val & WM5100_CTRLIF_ERR_EINT)
 816                dev_err(wm5100->dev, "Control interface error\n");
 817        if (val & WM5100_ISRC2_UNDERCLOCKED_EINT)
 818                dev_err(wm5100->dev, "ISRC2 underclocked\n");
 819        if (val & WM5100_ISRC1_UNDERCLOCKED_EINT)
 820                dev_err(wm5100->dev, "ISRC1 underclocked\n");
 821        if (val & WM5100_FX_UNDERCLOCKED_EINT)
 822                dev_err(wm5100->dev, "FX underclocked\n");
 823        if (val & WM5100_AIF3_UNDERCLOCKED_EINT)
 824                dev_err(wm5100->dev, "AIF3 underclocked\n");
 825        if (val & WM5100_AIF2_UNDERCLOCKED_EINT)
 826                dev_err(wm5100->dev, "AIF2 underclocked\n");
 827        if (val & WM5100_AIF1_UNDERCLOCKED_EINT)
 828                dev_err(wm5100->dev, "AIF1 underclocked\n");
 829        if (val & WM5100_ASRC_UNDERCLOCKED_EINT)
 830                dev_err(wm5100->dev, "ASRC underclocked\n");
 831        if (val & WM5100_DAC_UNDERCLOCKED_EINT)
 832                dev_err(wm5100->dev, "DAC underclocked\n");
 833        if (val & WM5100_ADC_UNDERCLOCKED_EINT)
 834                dev_err(wm5100->dev, "ADC underclocked\n");
 835        if (val & WM5100_MIXER_UNDERCLOCKED_EINT)
 836                dev_err(wm5100->dev, "Mixer underclocked\n");
 837}
 838
 839static int wm5100_post_ev(struct snd_soc_dapm_widget *w,
 840                          struct snd_kcontrol *kcontrol,
 841                          int event)
 842{
 843        struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
 844        struct wm5100_priv *wm5100 = snd_soc_codec_get_drvdata(codec);
 845        int ret;
 846
 847        ret = snd_soc_read(codec, WM5100_INTERRUPT_RAW_STATUS_3);
 848        ret &= WM5100_SPK_SHUTDOWN_WARN_STS |
 849                WM5100_SPK_SHUTDOWN_STS | WM5100_CLKGEN_ERR_STS |
 850                WM5100_CLKGEN_ERR_ASYNC_STS;
 851        wm5100_log_status3(wm5100, ret);
 852
 853        ret = snd_soc_read(codec, WM5100_INTERRUPT_RAW_STATUS_4);
 854        wm5100_log_status4(wm5100, ret);
 855
 856        return 0;
 857}
 858
 859static const struct snd_soc_dapm_widget wm5100_dapm_widgets[] = {
 860SND_SOC_DAPM_SUPPLY("SYSCLK", WM5100_CLOCKING_3, WM5100_SYSCLK_ENA_SHIFT, 0,
 861                    NULL, 0),
 862SND_SOC_DAPM_SUPPLY("ASYNCCLK", WM5100_CLOCKING_6, WM5100_ASYNC_CLK_ENA_SHIFT,
 863                    0, NULL, 0),
 864
 865SND_SOC_DAPM_REGULATOR_SUPPLY("CPVDD", 20, 0),
 866SND_SOC_DAPM_REGULATOR_SUPPLY("DBVDD2", 0, 0),
 867SND_SOC_DAPM_REGULATOR_SUPPLY("DBVDD3", 0, 0),
 868
 869SND_SOC_DAPM_SUPPLY("CP1", WM5100_HP_CHARGE_PUMP_1, WM5100_CP1_ENA_SHIFT, 0,
 870                    NULL, 0),
 871SND_SOC_DAPM_SUPPLY("CP2", WM5100_MIC_CHARGE_PUMP_1, WM5100_CP2_ENA_SHIFT, 0,
 872                    NULL, 0),
 873SND_SOC_DAPM_SUPPLY("CP2 Active", WM5100_MIC_CHARGE_PUMP_1,
 874                    WM5100_CP2_BYPASS_SHIFT, 1, NULL, 0),
 875
 876SND_SOC_DAPM_SUPPLY("MICBIAS1", WM5100_MIC_BIAS_CTRL_1, WM5100_MICB1_ENA_SHIFT,
 877                    0, NULL, 0),
 878SND_SOC_DAPM_SUPPLY("MICBIAS2", WM5100_MIC_BIAS_CTRL_2, WM5100_MICB2_ENA_SHIFT,
 879                    0, NULL, 0),
 880SND_SOC_DAPM_SUPPLY("MICBIAS3", WM5100_MIC_BIAS_CTRL_3, WM5100_MICB3_ENA_SHIFT,
 881                    0, NULL, 0),
 882
 883SND_SOC_DAPM_INPUT("IN1L"),
 884SND_SOC_DAPM_INPUT("IN1R"),
 885SND_SOC_DAPM_INPUT("IN2L"),
 886SND_SOC_DAPM_INPUT("IN2R"),
 887SND_SOC_DAPM_INPUT("IN3L"),
 888SND_SOC_DAPM_INPUT("IN3R"),
 889SND_SOC_DAPM_INPUT("IN4L"),
 890SND_SOC_DAPM_INPUT("IN4R"),
 891SND_SOC_DAPM_SIGGEN("TONE"),
 892
 893SND_SOC_DAPM_PGA_E("IN1L PGA", WM5100_INPUT_ENABLES, WM5100_IN1L_ENA_SHIFT, 0,
 894                   NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
 895SND_SOC_DAPM_PGA_E("IN1R PGA", WM5100_INPUT_ENABLES, WM5100_IN1R_ENA_SHIFT, 0,
 896                   NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
 897SND_SOC_DAPM_PGA_E("IN2L PGA", WM5100_INPUT_ENABLES, WM5100_IN2L_ENA_SHIFT, 0,
 898                   NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
 899SND_SOC_DAPM_PGA_E("IN2R PGA", WM5100_INPUT_ENABLES, WM5100_IN2R_ENA_SHIFT, 0,
 900                   NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
 901SND_SOC_DAPM_PGA_E("IN3L PGA", WM5100_INPUT_ENABLES, WM5100_IN3L_ENA_SHIFT, 0,
 902                   NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
 903SND_SOC_DAPM_PGA_E("IN3R PGA", WM5100_INPUT_ENABLES, WM5100_IN3R_ENA_SHIFT, 0,
 904                   NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
 905SND_SOC_DAPM_PGA_E("IN4L PGA", WM5100_INPUT_ENABLES, WM5100_IN4L_ENA_SHIFT, 0,
 906                   NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
 907SND_SOC_DAPM_PGA_E("IN4R PGA", WM5100_INPUT_ENABLES, WM5100_IN4R_ENA_SHIFT, 0,
 908                   NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
 909
 910SND_SOC_DAPM_PGA("Tone Generator 1", WM5100_TONE_GENERATOR_1,
 911                 WM5100_TONE1_ENA_SHIFT, 0, NULL, 0),
 912SND_SOC_DAPM_PGA("Tone Generator 2", WM5100_TONE_GENERATOR_1,
 913                 WM5100_TONE2_ENA_SHIFT, 0, NULL, 0),
 914
 915SND_SOC_DAPM_AIF_IN("AIF1RX1", "AIF1 Playback", 0,
 916                    WM5100_AUDIO_IF_1_27, WM5100_AIF1RX1_ENA_SHIFT, 0),
 917SND_SOC_DAPM_AIF_IN("AIF1RX2", "AIF1 Playback", 1,
 918                    WM5100_AUDIO_IF_1_27, WM5100_AIF1RX2_ENA_SHIFT, 0),
 919SND_SOC_DAPM_AIF_IN("AIF1RX3", "AIF1 Playback", 2,
 920                    WM5100_AUDIO_IF_1_27, WM5100_AIF1RX3_ENA_SHIFT, 0),
 921SND_SOC_DAPM_AIF_IN("AIF1RX4", "AIF1 Playback", 3,
 922                    WM5100_AUDIO_IF_1_27, WM5100_AIF1RX4_ENA_SHIFT, 0),
 923SND_SOC_DAPM_AIF_IN("AIF1RX5", "AIF1 Playback", 4,
 924                    WM5100_AUDIO_IF_1_27, WM5100_AIF1RX5_ENA_SHIFT, 0),
 925SND_SOC_DAPM_AIF_IN("AIF1RX6", "AIF1 Playback", 5,
 926                    WM5100_AUDIO_IF_1_27, WM5100_AIF1RX6_ENA_SHIFT, 0),
 927SND_SOC_DAPM_AIF_IN("AIF1RX7", "AIF1 Playback", 6,
 928                    WM5100_AUDIO_IF_1_27, WM5100_AIF1RX7_ENA_SHIFT, 0),
 929SND_SOC_DAPM_AIF_IN("AIF1RX8", "AIF1 Playback", 7,
 930                    WM5100_AUDIO_IF_1_27, WM5100_AIF1RX8_ENA_SHIFT, 0),
 931
 932SND_SOC_DAPM_AIF_IN("AIF2RX1", "AIF2 Playback", 0,
 933                    WM5100_AUDIO_IF_2_27, WM5100_AIF2RX1_ENA_SHIFT, 0),
 934SND_SOC_DAPM_AIF_IN("AIF2RX2", "AIF2 Playback", 1,
 935                    WM5100_AUDIO_IF_2_27, WM5100_AIF2RX2_ENA_SHIFT, 0),
 936
 937SND_SOC_DAPM_AIF_IN("AIF3RX1", "AIF3 Playback", 0,
 938                    WM5100_AUDIO_IF_3_27, WM5100_AIF3RX1_ENA_SHIFT, 0),
 939SND_SOC_DAPM_AIF_IN("AIF3RX2", "AIF3 Playback", 1,
 940                    WM5100_AUDIO_IF_3_27, WM5100_AIF3RX2_ENA_SHIFT, 0),
 941
 942SND_SOC_DAPM_AIF_OUT("AIF1TX1", "AIF1 Capture", 0,
 943                    WM5100_AUDIO_IF_1_26, WM5100_AIF1TX1_ENA_SHIFT, 0),
 944SND_SOC_DAPM_AIF_OUT("AIF1TX2", "AIF1 Capture", 1,
 945                    WM5100_AUDIO_IF_1_26, WM5100_AIF1TX2_ENA_SHIFT, 0),
 946SND_SOC_DAPM_AIF_OUT("AIF1TX3", "AIF1 Capture", 2,
 947                    WM5100_AUDIO_IF_1_26, WM5100_AIF1TX3_ENA_SHIFT, 0),
 948SND_SOC_DAPM_AIF_OUT("AIF1TX4", "AIF1 Capture", 3,
 949                    WM5100_AUDIO_IF_1_26, WM5100_AIF1TX4_ENA_SHIFT, 0),
 950SND_SOC_DAPM_AIF_OUT("AIF1TX5", "AIF1 Capture", 4,
 951                    WM5100_AUDIO_IF_1_26, WM5100_AIF1TX5_ENA_SHIFT, 0),
 952SND_SOC_DAPM_AIF_OUT("AIF1TX6", "AIF1 Capture", 5,
 953                    WM5100_AUDIO_IF_1_26, WM5100_AIF1TX6_ENA_SHIFT, 0),
 954SND_SOC_DAPM_AIF_OUT("AIF1TX7", "AIF1 Capture", 6,
 955                    WM5100_AUDIO_IF_1_26, WM5100_AIF1TX7_ENA_SHIFT, 0),
 956SND_SOC_DAPM_AIF_OUT("AIF1TX8", "AIF1 Capture", 7,
 957                    WM5100_AUDIO_IF_1_26, WM5100_AIF1TX8_ENA_SHIFT, 0),
 958
 959SND_SOC_DAPM_AIF_OUT("AIF2TX1", "AIF2 Capture", 0,
 960                    WM5100_AUDIO_IF_2_26, WM5100_AIF2TX1_ENA_SHIFT, 0),
 961SND_SOC_DAPM_AIF_OUT("AIF2TX2", "AIF2 Capture", 1,
 962                    WM5100_AUDIO_IF_2_26, WM5100_AIF2TX2_ENA_SHIFT, 0),
 963
 964SND_SOC_DAPM_AIF_OUT("AIF3TX1", "AIF3 Capture", 0,
 965                    WM5100_AUDIO_IF_3_26, WM5100_AIF3TX1_ENA_SHIFT, 0),
 966SND_SOC_DAPM_AIF_OUT("AIF3TX2", "AIF3 Capture", 1,
 967                    WM5100_AUDIO_IF_3_26, WM5100_AIF3TX2_ENA_SHIFT, 0),
 968
 969SND_SOC_DAPM_PGA_E("OUT6L", WM5100_OUTPUT_ENABLES_2, WM5100_OUT6L_ENA_SHIFT, 0,
 970                   NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
 971SND_SOC_DAPM_PGA_E("OUT6R", WM5100_OUTPUT_ENABLES_2, WM5100_OUT6R_ENA_SHIFT, 0,
 972                   NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
 973SND_SOC_DAPM_PGA_E("OUT5L", WM5100_OUTPUT_ENABLES_2, WM5100_OUT5L_ENA_SHIFT, 0,
 974                   NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
 975SND_SOC_DAPM_PGA_E("OUT5R", WM5100_OUTPUT_ENABLES_2, WM5100_OUT5R_ENA_SHIFT, 0,
 976                   NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
 977SND_SOC_DAPM_PGA_E("OUT4L", WM5100_OUTPUT_ENABLES_2, WM5100_OUT4L_ENA_SHIFT, 0,
 978                   NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
 979SND_SOC_DAPM_PGA_E("OUT4R", WM5100_OUTPUT_ENABLES_2, WM5100_OUT4R_ENA_SHIFT, 0,
 980                   NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
 981SND_SOC_DAPM_PGA_E("OUT3L", WM5100_CHANNEL_ENABLES_1, WM5100_HP3L_ENA_SHIFT, 0,
 982                   NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
 983SND_SOC_DAPM_PGA_E("OUT3R", WM5100_CHANNEL_ENABLES_1, WM5100_HP3R_ENA_SHIFT, 0,
 984                   NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
 985SND_SOC_DAPM_PGA_E("OUT2L", WM5100_CHANNEL_ENABLES_1, WM5100_HP2L_ENA_SHIFT, 0,
 986                   NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
 987SND_SOC_DAPM_PGA_E("OUT2R", WM5100_CHANNEL_ENABLES_1, WM5100_HP2R_ENA_SHIFT, 0,
 988                   NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
 989SND_SOC_DAPM_PGA_E("OUT1L", WM5100_CHANNEL_ENABLES_1, WM5100_HP1L_ENA_SHIFT, 0,
 990                   NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
 991SND_SOC_DAPM_PGA_E("OUT1R", WM5100_CHANNEL_ENABLES_1, WM5100_HP1R_ENA_SHIFT, 0,
 992                   NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
 993SND_SOC_DAPM_PGA_E("PWM1 Driver", WM5100_PWM_DRIVE_1, WM5100_PWM1_ENA_SHIFT, 0,
 994                   NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
 995SND_SOC_DAPM_PGA_E("PWM2 Driver", WM5100_PWM_DRIVE_1, WM5100_PWM2_ENA_SHIFT, 0,
 996                   NULL, 0, wm5100_out_ev, SND_SOC_DAPM_POST_PMU),
 997
 998SND_SOC_DAPM_PGA("EQ1", WM5100_EQ1_1, WM5100_EQ1_ENA_SHIFT, 0, NULL, 0),
 999SND_SOC_DAPM_PGA("EQ2", WM5100_EQ2_1, WM5100_EQ2_ENA_SHIFT, 0, NULL, 0),
1000SND_SOC_DAPM_PGA("EQ3", WM5100_EQ3_1, WM5100_EQ3_ENA_SHIFT, 0, NULL, 0),
1001SND_SOC_DAPM_PGA("EQ4", WM5100_EQ4_1, WM5100_EQ4_ENA_SHIFT, 0, NULL, 0),
1002
1003SND_SOC_DAPM_PGA("DRC1L", WM5100_DRC1_CTRL1, WM5100_DRCL_ENA_SHIFT, 0,
1004                 NULL, 0),
1005SND_SOC_DAPM_PGA("DRC1R", WM5100_DRC1_CTRL1, WM5100_DRCR_ENA_SHIFT, 0,
1006                 NULL, 0),
1007
1008SND_SOC_DAPM_PGA("LHPF1", WM5100_HPLPF1_1, WM5100_LHPF1_ENA_SHIFT, 0,
1009                 NULL, 0),
1010SND_SOC_DAPM_PGA("LHPF2", WM5100_HPLPF2_1, WM5100_LHPF2_ENA_SHIFT, 0,
1011                 NULL, 0),
1012SND_SOC_DAPM_PGA("LHPF3", WM5100_HPLPF3_1, WM5100_LHPF3_ENA_SHIFT, 0,
1013                 NULL, 0),
1014SND_SOC_DAPM_PGA("LHPF4", WM5100_HPLPF4_1, WM5100_LHPF4_ENA_SHIFT, 0,
1015                 NULL, 0),
1016
1017WM5100_MIXER_WIDGETS(EQ1, "EQ1"),
1018WM5100_MIXER_WIDGETS(EQ2, "EQ2"),
1019WM5100_MIXER_WIDGETS(EQ3, "EQ3"),
1020WM5100_MIXER_WIDGETS(EQ4, "EQ4"),
1021
1022WM5100_MIXER_WIDGETS(DRC1L, "DRC1L"),
1023WM5100_MIXER_WIDGETS(DRC1R, "DRC1R"),
1024
1025WM5100_MIXER_WIDGETS(LHPF1, "LHPF1"),
1026WM5100_MIXER_WIDGETS(LHPF2, "LHPF2"),
1027WM5100_MIXER_WIDGETS(LHPF3, "LHPF3"),
1028WM5100_MIXER_WIDGETS(LHPF4, "LHPF4"),
1029
1030WM5100_MIXER_WIDGETS(AIF1TX1, "AIF1TX1"),
1031WM5100_MIXER_WIDGETS(AIF1TX2, "AIF1TX2"),
1032WM5100_MIXER_WIDGETS(AIF1TX3, "AIF1TX3"),
1033WM5100_MIXER_WIDGETS(AIF1TX4, "AIF1TX4"),
1034WM5100_MIXER_WIDGETS(AIF1TX5, "AIF1TX5"),
1035WM5100_MIXER_WIDGETS(AIF1TX6, "AIF1TX6"),
1036WM5100_MIXER_WIDGETS(AIF1TX7, "AIF1TX7"),
1037WM5100_MIXER_WIDGETS(AIF1TX8, "AIF1TX8"),
1038
1039WM5100_MIXER_WIDGETS(AIF2TX1, "AIF2TX1"),
1040WM5100_MIXER_WIDGETS(AIF2TX2, "AIF2TX2"),
1041
1042WM5100_MIXER_WIDGETS(AIF3TX1, "AIF3TX1"),
1043WM5100_MIXER_WIDGETS(AIF3TX2, "AIF3TX2"),
1044
1045WM5100_MIXER_WIDGETS(HPOUT1L, "HPOUT1L"),
1046WM5100_MIXER_WIDGETS(HPOUT1R, "HPOUT1R"),
1047WM5100_MIXER_WIDGETS(HPOUT2L, "HPOUT2L"),
1048WM5100_MIXER_WIDGETS(HPOUT2R, "HPOUT2R"),
1049WM5100_MIXER_WIDGETS(HPOUT3L, "HPOUT3L"),
1050WM5100_MIXER_WIDGETS(HPOUT3R, "HPOUT3R"),
1051
1052WM5100_MIXER_WIDGETS(SPKOUTL, "SPKOUTL"),
1053WM5100_MIXER_WIDGETS(SPKOUTR, "SPKOUTR"),
1054WM5100_MIXER_WIDGETS(SPKDAT1L, "SPKDAT1L"),
1055WM5100_MIXER_WIDGETS(SPKDAT1R, "SPKDAT1R"),
1056WM5100_MIXER_WIDGETS(SPKDAT2L, "SPKDAT2L"),
1057WM5100_MIXER_WIDGETS(SPKDAT2R, "SPKDAT2R"),
1058
1059WM5100_MIXER_WIDGETS(PWM1, "PWM1"),
1060WM5100_MIXER_WIDGETS(PWM2, "PWM2"),
1061
1062SND_SOC_DAPM_OUTPUT("HPOUT1L"),
1063SND_SOC_DAPM_OUTPUT("HPOUT1R"),
1064SND_SOC_DAPM_OUTPUT("HPOUT2L"),
1065SND_SOC_DAPM_OUTPUT("HPOUT2R"),
1066SND_SOC_DAPM_OUTPUT("HPOUT3L"),
1067SND_SOC_DAPM_OUTPUT("HPOUT3R"),
1068SND_SOC_DAPM_OUTPUT("SPKOUTL"),
1069SND_SOC_DAPM_OUTPUT("SPKOUTR"),
1070SND_SOC_DAPM_OUTPUT("SPKDAT1"),
1071SND_SOC_DAPM_OUTPUT("SPKDAT2"),
1072SND_SOC_DAPM_OUTPUT("PWM1"),
1073SND_SOC_DAPM_OUTPUT("PWM2"),
1074};
1075
1076/* We register a _POST event if we don't have IRQ support so we can
1077 * look at the error status from the CODEC - if we've got the IRQ
1078 * hooked up then we will get prompted to look by an interrupt.
1079 */
1080static const struct snd_soc_dapm_widget wm5100_dapm_widgets_noirq[] = {
1081SND_SOC_DAPM_POST("Post", wm5100_post_ev),
1082};
1083
1084static const struct snd_soc_dapm_route wm5100_dapm_routes[] = {
1085        { "CP1", NULL, "CPVDD" },
1086        { "CP2 Active", NULL, "CPVDD" },
1087
1088        { "IN1L", NULL, "SYSCLK" },
1089        { "IN1R", NULL, "SYSCLK" },
1090        { "IN2L", NULL, "SYSCLK" },
1091        { "IN2R", NULL, "SYSCLK" },
1092        { "IN3L", NULL, "SYSCLK" },
1093        { "IN3R", NULL, "SYSCLK" },
1094        { "IN4L", NULL, "SYSCLK" },
1095        { "IN4R", NULL, "SYSCLK" },
1096
1097        { "OUT1L", NULL, "SYSCLK" },
1098        { "OUT1R", NULL, "SYSCLK" },
1099        { "OUT2L", NULL, "SYSCLK" },
1100        { "OUT2R", NULL, "SYSCLK" },
1101        { "OUT3L", NULL, "SYSCLK" },
1102        { "OUT3R", NULL, "SYSCLK" },
1103        { "OUT4L", NULL, "SYSCLK" },
1104        { "OUT4R", NULL, "SYSCLK" },
1105        { "OUT5L", NULL, "SYSCLK" },
1106        { "OUT5R", NULL, "SYSCLK" },
1107        { "OUT6L", NULL, "SYSCLK" },
1108        { "OUT6R", NULL, "SYSCLK" },
1109
1110        { "AIF1RX1", NULL, "SYSCLK" },
1111        { "AIF1RX2", NULL, "SYSCLK" },
1112        { "AIF1RX3", NULL, "SYSCLK" },
1113        { "AIF1RX4", NULL, "SYSCLK" },
1114        { "AIF1RX5", NULL, "SYSCLK" },
1115        { "AIF1RX6", NULL, "SYSCLK" },
1116        { "AIF1RX7", NULL, "SYSCLK" },
1117        { "AIF1RX8", NULL, "SYSCLK" },
1118
1119        { "AIF2RX1", NULL, "SYSCLK" },
1120        { "AIF2RX1", NULL, "DBVDD2" },
1121        { "AIF2RX2", NULL, "SYSCLK" },
1122        { "AIF2RX2", NULL, "DBVDD2" },
1123
1124        { "AIF3RX1", NULL, "SYSCLK" },
1125        { "AIF3RX1", NULL, "DBVDD3" },
1126        { "AIF3RX2", NULL, "SYSCLK" },
1127        { "AIF3RX2", NULL, "DBVDD3" },
1128
1129        { "AIF1TX1", NULL, "SYSCLK" },
1130        { "AIF1TX2", NULL, "SYSCLK" },
1131        { "AIF1TX3", NULL, "SYSCLK" },
1132        { "AIF1TX4", NULL, "SYSCLK" },
1133        { "AIF1TX5", NULL, "SYSCLK" },
1134        { "AIF1TX6", NULL, "SYSCLK" },
1135        { "AIF1TX7", NULL, "SYSCLK" },
1136        { "AIF1TX8", NULL, "SYSCLK" },
1137
1138        { "AIF2TX1", NULL, "SYSCLK" },
1139        { "AIF2TX1", NULL, "DBVDD2" },
1140        { "AIF2TX2", NULL, "SYSCLK" },
1141        { "AIF2TX2", NULL, "DBVDD2" },
1142
1143        { "AIF3TX1", NULL, "SYSCLK" },
1144        { "AIF3TX1", NULL, "DBVDD3" },
1145        { "AIF3TX2", NULL, "SYSCLK" },
1146        { "AIF3TX2", NULL, "DBVDD3" },
1147
1148        { "MICBIAS1", NULL, "CP2" },
1149        { "MICBIAS2", NULL, "CP2" },
1150        { "MICBIAS3", NULL, "CP2" },
1151
1152        { "IN1L PGA", NULL, "CP2" },
1153        { "IN1R PGA", NULL, "CP2" },
1154        { "IN2L PGA", NULL, "CP2" },
1155        { "IN2R PGA", NULL, "CP2" },
1156        { "IN3L PGA", NULL, "CP2" },
1157        { "IN3R PGA", NULL, "CP2" },
1158        { "IN4L PGA", NULL, "CP2" },
1159        { "IN4R PGA", NULL, "CP2" },
1160
1161        { "IN1L PGA", NULL, "CP2 Active" },
1162        { "IN1R PGA", NULL, "CP2 Active" },
1163        { "IN2L PGA", NULL, "CP2 Active" },
1164        { "IN2R PGA", NULL, "CP2 Active" },
1165        { "IN3L PGA", NULL, "CP2 Active" },
1166        { "IN3R PGA", NULL, "CP2 Active" },
1167        { "IN4L PGA", NULL, "CP2 Active" },
1168        { "IN4R PGA", NULL, "CP2 Active" },
1169
1170        { "OUT1L", NULL, "CP1" },
1171        { "OUT1R", NULL, "CP1" },
1172        { "OUT2L", NULL, "CP1" },
1173        { "OUT2R", NULL, "CP1" },
1174        { "OUT3L", NULL, "CP1" },
1175        { "OUT3R", NULL, "CP1" },
1176
1177        { "Tone Generator 1", NULL, "TONE" },
1178        { "Tone Generator 2", NULL, "TONE" },
1179
1180        { "IN1L PGA", NULL, "IN1L" },
1181        { "IN1R PGA", NULL, "IN1R" },
1182        { "IN2L PGA", NULL, "IN2L" },
1183        { "IN2R PGA", NULL, "IN2R" },
1184        { "IN3L PGA", NULL, "IN3L" },
1185        { "IN3R PGA", NULL, "IN3R" },
1186        { "IN4L PGA", NULL, "IN4L" },
1187        { "IN4R PGA", NULL, "IN4R" },
1188
1189        WM5100_MIXER_ROUTES("OUT1L", "HPOUT1L"),
1190        WM5100_MIXER_ROUTES("OUT1R", "HPOUT1R"),
1191        WM5100_MIXER_ROUTES("OUT2L", "HPOUT2L"),
1192        WM5100_MIXER_ROUTES("OUT2R", "HPOUT2R"),
1193        WM5100_MIXER_ROUTES("OUT3L", "HPOUT3L"),
1194        WM5100_MIXER_ROUTES("OUT3R", "HPOUT3R"),
1195
1196        WM5100_MIXER_ROUTES("OUT4L", "SPKOUTL"),
1197        WM5100_MIXER_ROUTES("OUT4R", "SPKOUTR"),
1198        WM5100_MIXER_ROUTES("OUT5L", "SPKDAT1L"),
1199        WM5100_MIXER_ROUTES("OUT5R", "SPKDAT1R"),
1200        WM5100_MIXER_ROUTES("OUT6L", "SPKDAT2L"),
1201        WM5100_MIXER_ROUTES("OUT6R", "SPKDAT2R"),
1202
1203        WM5100_MIXER_ROUTES("PWM1 Driver", "PWM1"),
1204        WM5100_MIXER_ROUTES("PWM2 Driver", "PWM2"),
1205
1206        WM5100_MIXER_ROUTES("AIF1TX1", "AIF1TX1"),
1207        WM5100_MIXER_ROUTES("AIF1TX2", "AIF1TX2"),
1208        WM5100_MIXER_ROUTES("AIF1TX3", "AIF1TX3"),
1209        WM5100_MIXER_ROUTES("AIF1TX4", "AIF1TX4"),
1210        WM5100_MIXER_ROUTES("AIF1TX5", "AIF1TX5"),
1211        WM5100_MIXER_ROUTES("AIF1TX6", "AIF1TX6"),
1212        WM5100_MIXER_ROUTES("AIF1TX7", "AIF1TX7"),
1213        WM5100_MIXER_ROUTES("AIF1TX8", "AIF1TX8"),
1214
1215        WM5100_MIXER_ROUTES("AIF2TX1", "AIF2TX1"),
1216        WM5100_MIXER_ROUTES("AIF2TX2", "AIF2TX2"),
1217
1218        WM5100_MIXER_ROUTES("AIF3TX1", "AIF3TX1"),
1219        WM5100_MIXER_ROUTES("AIF3TX2", "AIF3TX2"),
1220
1221        WM5100_MIXER_ROUTES("EQ1", "EQ1"),
1222        WM5100_MIXER_ROUTES("EQ2", "EQ2"),
1223        WM5100_MIXER_ROUTES("EQ3", "EQ3"),
1224        WM5100_MIXER_ROUTES("EQ4", "EQ4"),
1225
1226        WM5100_MIXER_ROUTES("DRC1L", "DRC1L"),
1227        WM5100_MIXER_ROUTES("DRC1R", "DRC1R"),
1228
1229        WM5100_MIXER_ROUTES("LHPF1", "LHPF1"),
1230        WM5100_MIXER_ROUTES("LHPF2", "LHPF2"),
1231        WM5100_MIXER_ROUTES("LHPF3", "LHPF3"),
1232        WM5100_MIXER_ROUTES("LHPF4", "LHPF4"),
1233
1234        { "HPOUT1L", NULL, "OUT1L" },
1235        { "HPOUT1R", NULL, "OUT1R" },
1236        { "HPOUT2L", NULL, "OUT2L" },
1237        { "HPOUT2R", NULL, "OUT2R" },
1238        { "HPOUT3L", NULL, "OUT3L" },
1239        { "HPOUT3R", NULL, "OUT3R" },
1240        { "SPKOUTL", NULL, "OUT4L" },
1241        { "SPKOUTR", NULL, "OUT4R" },
1242        { "SPKDAT1", NULL, "OUT5L" },
1243        { "SPKDAT1", NULL, "OUT5R" },
1244        { "SPKDAT2", NULL, "OUT6L" },
1245        { "SPKDAT2", NULL, "OUT6R" },
1246        { "PWM1", NULL, "PWM1 Driver" },
1247        { "PWM2", NULL, "PWM2 Driver" },
1248};
1249
1250static const struct reg_sequence wm5100_reva_patches[] = {
1251        { WM5100_AUDIO_IF_1_10, 0 },
1252        { WM5100_AUDIO_IF_1_11, 1 },
1253        { WM5100_AUDIO_IF_1_12, 2 },
1254        { WM5100_AUDIO_IF_1_13, 3 },
1255        { WM5100_AUDIO_IF_1_14, 4 },
1256        { WM5100_AUDIO_IF_1_15, 5 },
1257        { WM5100_AUDIO_IF_1_16, 6 },
1258        { WM5100_AUDIO_IF_1_17, 7 },
1259
1260        { WM5100_AUDIO_IF_1_18, 0 },
1261        { WM5100_AUDIO_IF_1_19, 1 },
1262        { WM5100_AUDIO_IF_1_20, 2 },
1263        { WM5100_AUDIO_IF_1_21, 3 },
1264        { WM5100_AUDIO_IF_1_22, 4 },
1265        { WM5100_AUDIO_IF_1_23, 5 },
1266        { WM5100_AUDIO_IF_1_24, 6 },
1267        { WM5100_AUDIO_IF_1_25, 7 },
1268
1269        { WM5100_AUDIO_IF_2_10, 0 },
1270        { WM5100_AUDIO_IF_2_11, 1 },
1271
1272        { WM5100_AUDIO_IF_2_18, 0 },
1273        { WM5100_AUDIO_IF_2_19, 1 },
1274
1275        { WM5100_AUDIO_IF_3_10, 0 },
1276        { WM5100_AUDIO_IF_3_11, 1 },
1277
1278        { WM5100_AUDIO_IF_3_18, 0 },
1279        { WM5100_AUDIO_IF_3_19, 1 },
1280};
1281
1282static int wm5100_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
1283{
1284        struct snd_soc_codec *codec = dai->codec;
1285        int lrclk, bclk, mask, base;
1286
1287        base = dai->driver->base;
1288
1289        lrclk = 0;
1290        bclk = 0;
1291
1292        switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
1293        case SND_SOC_DAIFMT_DSP_A:
1294                mask = 0;
1295                break;
1296        case SND_SOC_DAIFMT_I2S:
1297                mask = 2;
1298                break;
1299        default:
1300                dev_err(codec->dev, "Unsupported DAI format %d\n",
1301                        fmt & SND_SOC_DAIFMT_FORMAT_MASK);
1302                return -EINVAL;
1303        }
1304
1305        switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
1306        case SND_SOC_DAIFMT_CBS_CFS:
1307                break;
1308        case SND_SOC_DAIFMT_CBS_CFM:
1309                lrclk |= WM5100_AIF1TX_LRCLK_MSTR;
1310                break;
1311        case SND_SOC_DAIFMT_CBM_CFS:
1312                bclk |= WM5100_AIF1_BCLK_MSTR;
1313                break;
1314        case SND_SOC_DAIFMT_CBM_CFM:
1315                lrclk |= WM5100_AIF1TX_LRCLK_MSTR;
1316                bclk |= WM5100_AIF1_BCLK_MSTR;
1317                break;
1318        default:
1319                dev_err(codec->dev, "Unsupported master mode %d\n",
1320                        fmt & SND_SOC_DAIFMT_MASTER_MASK);
1321                return -EINVAL;
1322        }
1323
1324        switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
1325        case SND_SOC_DAIFMT_NB_NF:
1326                break;
1327        case SND_SOC_DAIFMT_IB_IF:
1328                bclk |= WM5100_AIF1_BCLK_INV;
1329                lrclk |= WM5100_AIF1TX_LRCLK_INV;
1330                break;
1331        case SND_SOC_DAIFMT_IB_NF:
1332                bclk |= WM5100_AIF1_BCLK_INV;
1333                break;
1334        case SND_SOC_DAIFMT_NB_IF:
1335                lrclk |= WM5100_AIF1TX_LRCLK_INV;
1336                break;
1337        default:
1338                return -EINVAL;
1339        }
1340
1341        snd_soc_update_bits(codec, base + 1, WM5100_AIF1_BCLK_MSTR |
1342                            WM5100_AIF1_BCLK_INV, bclk);
1343        snd_soc_update_bits(codec, base + 2, WM5100_AIF1TX_LRCLK_MSTR |
1344                            WM5100_AIF1TX_LRCLK_INV, lrclk);
1345        snd_soc_update_bits(codec, base + 3, WM5100_AIF1TX_LRCLK_MSTR |
1346                            WM5100_AIF1TX_LRCLK_INV, lrclk);
1347        snd_soc_update_bits(codec, base + 5, WM5100_AIF1_FMT_MASK, mask);
1348
1349        return 0;
1350}
1351
1352#define WM5100_NUM_BCLK_RATES 19
1353
1354static int wm5100_bclk_rates_dat[WM5100_NUM_BCLK_RATES] = {
1355        32000,
1356        48000,
1357        64000,
1358        96000,
1359        128000,
1360        192000,
1361        256000,
1362        384000,
1363        512000,
1364        768000,
1365        1024000,
1366        1536000,
1367        2048000,
1368        3072000,
1369        4096000,
1370        6144000,
1371        8192000,
1372        12288000,
1373        24576000,
1374};
1375
1376static int wm5100_bclk_rates_cd[WM5100_NUM_BCLK_RATES] = {
1377        29400,
1378        44100,
1379        58800,
1380        88200,
1381        117600,
1382        176400,
1383        235200,
1384        352800,
1385        470400,
1386        705600,
1387        940800,
1388        1411200,
1389        1881600,
1390        2882400,
1391        3763200,
1392        5644800,
1393        7526400,
1394        11289600,
1395        22579600,
1396};
1397
1398static int wm5100_hw_params(struct snd_pcm_substream *substream,
1399                            struct snd_pcm_hw_params *params,
1400                            struct snd_soc_dai *dai)
1401{
1402        struct snd_soc_codec *codec = dai->codec;
1403        struct wm5100_priv *wm5100 = snd_soc_codec_get_drvdata(codec);
1404        bool async = wm5100->aif_async[dai->id];
1405        int i, base, bclk, aif_rate, lrclk, wl, fl, sr;
1406        int *bclk_rates;
1407
1408        base = dai->driver->base;
1409
1410        /* Data sizes if not using TDM */
1411        wl = params_width(params);
1412        if (wl < 0)
1413                return wl;
1414        fl = snd_soc_params_to_frame_size(params);
1415        if (fl < 0)
1416                return fl;
1417
1418        dev_dbg(codec->dev, "Word length %d bits, frame length %d bits\n",
1419                wl, fl);
1420
1421        /* Target BCLK rate */
1422        bclk = snd_soc_params_to_bclk(params);
1423        if (bclk < 0)
1424                return bclk;
1425
1426        /* Root for BCLK depends on SYS/ASYNCCLK */
1427        if (!async) {
1428                aif_rate = wm5100->sysclk;
1429                sr = wm5100_alloc_sr(codec, params_rate(params));
1430                if (sr < 0)
1431                        return sr;
1432        } else {
1433                /* If we're in ASYNCCLK set the ASYNC sample rate */
1434                aif_rate = wm5100->asyncclk;
1435                sr = 3;
1436
1437                for (i = 0; i < ARRAY_SIZE(wm5100_sr_code); i++)
1438                        if (params_rate(params) == wm5100_sr_code[i])
1439                                break;
1440                if (i == ARRAY_SIZE(wm5100_sr_code)) {
1441                        dev_err(codec->dev, "Invalid rate %dHzn",
1442                                params_rate(params));
1443                        return -EINVAL;
1444                }
1445
1446                /* TODO: We should really check for symmetry */
1447                snd_soc_update_bits(codec, WM5100_CLOCKING_8,
1448                                    WM5100_ASYNC_SAMPLE_RATE_MASK, i);
1449        }
1450
1451        if (!aif_rate) {
1452                dev_err(codec->dev, "%s has no rate set\n",
1453                        async ? "ASYNCCLK" : "SYSCLK");
1454                return -EINVAL;
1455        }
1456
1457        dev_dbg(codec->dev, "Target BCLK is %dHz, using %dHz %s\n",
1458                bclk, aif_rate, async ? "ASYNCCLK" : "SYSCLK");
1459
1460        if (aif_rate % 4000)
1461                bclk_rates = wm5100_bclk_rates_cd;
1462        else
1463                bclk_rates = wm5100_bclk_rates_dat;
1464
1465        for (i = 0; i < WM5100_NUM_BCLK_RATES; i++)
1466                if (bclk_rates[i] >= bclk && (bclk_rates[i] % bclk == 0))
1467                        break;
1468        if (i == WM5100_NUM_BCLK_RATES) {
1469                dev_err(codec->dev,
1470                        "No valid BCLK for %dHz found from %dHz %s\n",
1471                        bclk, aif_rate, async ? "ASYNCCLK" : "SYSCLK");
1472                return -EINVAL;
1473        }
1474
1475        bclk = i;
1476        dev_dbg(codec->dev, "Setting %dHz BCLK\n", bclk_rates[bclk]);
1477        snd_soc_update_bits(codec, base + 1, WM5100_AIF1_BCLK_FREQ_MASK, bclk);
1478
1479        lrclk = bclk_rates[bclk] / params_rate(params);
1480        dev_dbg(codec->dev, "Setting %dHz LRCLK\n", bclk_rates[bclk] / lrclk);
1481        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK ||
1482            wm5100->aif_symmetric[dai->id])
1483                snd_soc_update_bits(codec, base + 7,
1484                                    WM5100_AIF1RX_BCPF_MASK, lrclk);
1485        else
1486                snd_soc_update_bits(codec, base + 6,
1487                                    WM5100_AIF1TX_BCPF_MASK, lrclk);
1488
1489        i = (wl << WM5100_AIF1TX_WL_SHIFT) | fl;
1490        if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
1491                snd_soc_update_bits(codec, base + 9,
1492                                    WM5100_AIF1RX_WL_MASK |
1493                                    WM5100_AIF1RX_SLOT_LEN_MASK, i);
1494        else
1495                snd_soc_update_bits(codec, base + 8,
1496                                    WM5100_AIF1TX_WL_MASK |
1497                                    WM5100_AIF1TX_SLOT_LEN_MASK, i);
1498
1499        snd_soc_update_bits(codec, base + 4, WM5100_AIF1_RATE_MASK, sr);
1500
1501        return 0;
1502}
1503
1504static const struct snd_soc_dai_ops wm5100_dai_ops = {
1505        .set_fmt = wm5100_set_fmt,
1506        .hw_params = wm5100_hw_params,
1507};
1508
1509static int wm5100_set_sysclk(struct snd_soc_codec *codec, int clk_id,
1510                             int source, unsigned int freq, int dir)
1511{
1512        struct wm5100_priv *wm5100 = snd_soc_codec_get_drvdata(codec);
1513        int *rate_store;
1514        int fval, audio_rate, ret, reg;
1515
1516        switch (clk_id) {
1517        case WM5100_CLK_SYSCLK:
1518                reg = WM5100_CLOCKING_3;
1519                rate_store = &wm5100->sysclk;
1520                break;
1521        case WM5100_CLK_ASYNCCLK:
1522                reg = WM5100_CLOCKING_7;
1523                rate_store = &wm5100->asyncclk;
1524                break;
1525        case WM5100_CLK_32KHZ:
1526                /* The 32kHz clock is slightly different to the others */
1527                switch (source) {
1528                case WM5100_CLKSRC_MCLK1:
1529                case WM5100_CLKSRC_MCLK2:
1530                case WM5100_CLKSRC_SYSCLK:
1531                        snd_soc_update_bits(codec, WM5100_CLOCKING_1,
1532                                            WM5100_CLK_32K_SRC_MASK,
1533                                            source);
1534                        break;
1535                default:
1536                        return -EINVAL;
1537                }
1538                return 0;
1539
1540        case WM5100_CLK_AIF1:
1541        case WM5100_CLK_AIF2:
1542        case WM5100_CLK_AIF3:
1543                /* Not real clocks, record which clock domain they're in */
1544                switch (source) {
1545                case WM5100_CLKSRC_SYSCLK:
1546                        wm5100->aif_async[clk_id - 1] = false;
1547                        break;
1548                case WM5100_CLKSRC_ASYNCCLK:
1549                        wm5100->aif_async[clk_id - 1] = true;
1550                        break;
1551                default:
1552                        dev_err(codec->dev, "Invalid source %d\n", source);
1553                        return -EINVAL;
1554                }       
1555                return 0;
1556
1557        case WM5100_CLK_OPCLK:
1558                switch (freq) {
1559                case 5644800:
1560                case 6144000:
1561                        snd_soc_update_bits(codec, WM5100_MISC_GPIO_1,
1562                                            WM5100_OPCLK_SEL_MASK, 0);
1563                        break;
1564                case 11289600:
1565                case 12288000:
1566                        snd_soc_update_bits(codec, WM5100_MISC_GPIO_1,
1567                                            WM5100_OPCLK_SEL_MASK, 0);
1568                        break;
1569                case 22579200:
1570                case 24576000:
1571                        snd_soc_update_bits(codec, WM5100_MISC_GPIO_1,
1572                                            WM5100_OPCLK_SEL_MASK, 0);
1573                        break;
1574                default:
1575                        dev_err(codec->dev, "Unsupported OPCLK %dHz\n",
1576                                freq);
1577                        return -EINVAL;
1578                }
1579                return 0;
1580
1581        default:
1582                dev_err(codec->dev, "Unknown clock %d\n", clk_id);
1583                return -EINVAL;
1584        }
1585
1586        switch (source) {
1587        case WM5100_CLKSRC_SYSCLK:
1588        case WM5100_CLKSRC_ASYNCCLK:
1589                dev_err(codec->dev, "Invalid source %d\n", source);
1590                return -EINVAL;
1591        }
1592
1593        switch (freq) {
1594        case 5644800:
1595        case 6144000:
1596                fval = 0;
1597                break;
1598        case 11289600:
1599        case 12288000:
1600                fval = 1;
1601                break;
1602        case 22579200:
1603        case 24576000:
1604                fval = 2;
1605                break;
1606        default:
1607                dev_err(codec->dev, "Invalid clock rate: %d\n", freq);
1608                return -EINVAL;
1609        }
1610
1611        switch (freq) {
1612        case 5644800:
1613        case 11289600:
1614        case 22579200:
1615                audio_rate = 44100;
1616                break;
1617
1618        case 6144000:
1619        case 12288000:
1620        case 24576000:
1621                audio_rate = 48000;
1622                break;
1623
1624        default:
1625                BUG();
1626                audio_rate = 0;
1627                break;
1628        }
1629
1630        /* TODO: Check if MCLKs are in use and enable/disable pulls to
1631         * match.
1632         */
1633
1634        snd_soc_update_bits(codec, reg, WM5100_SYSCLK_FREQ_MASK |
1635                            WM5100_SYSCLK_SRC_MASK,
1636                            fval << WM5100_SYSCLK_FREQ_SHIFT | source);
1637
1638        /* If this is SYSCLK then configure the clock rate for the
1639         * internal audio functions to the natural sample rate for
1640         * this clock rate.
1641         */
1642        if (clk_id == WM5100_CLK_SYSCLK) {
1643                dev_dbg(codec->dev, "Setting primary audio rate to %dHz",
1644                        audio_rate);
1645                if (0 && *rate_store)
1646                        wm5100_free_sr(codec, audio_rate);
1647                ret = wm5100_alloc_sr(codec, audio_rate);
1648                if (ret != 0)
1649                        dev_warn(codec->dev, "Primary audio slot is %d\n",
1650                                 ret);
1651        }
1652
1653        *rate_store = freq;
1654
1655        return 0;
1656}
1657
1658struct _fll_div {
1659        u16 fll_fratio;
1660        u16 fll_outdiv;
1661        u16 fll_refclk_div;
1662        u16 n;
1663        u16 theta;
1664        u16 lambda;
1665};
1666
1667static struct {
1668        unsigned int min;
1669        unsigned int max;
1670        u16 fll_fratio;
1671        int ratio;
1672} fll_fratios[] = {
1673        {       0,    64000, 4, 16 },
1674        {   64000,   128000, 3,  8 },
1675        {  128000,   256000, 2,  4 },
1676        {  256000,  1000000, 1,  2 },
1677        { 1000000, 13500000, 0,  1 },
1678};
1679
1680static int fll_factors(struct _fll_div *fll_div, unsigned int Fref,
1681                       unsigned int Fout)
1682{
1683        unsigned int target;
1684        unsigned int div;
1685        unsigned int fratio, gcd_fll;
1686        int i;
1687
1688        /* Fref must be <=13.5MHz */
1689        div = 1;
1690        fll_div->fll_refclk_div = 0;
1691        while ((Fref / div) > 13500000) {
1692                div *= 2;
1693                fll_div->fll_refclk_div++;
1694
1695                if (div > 8) {
1696                        pr_err("Can't scale %dMHz input down to <=13.5MHz\n",
1697                               Fref);
1698                        return -EINVAL;
1699                }
1700        }
1701
1702        pr_debug("FLL Fref=%u Fout=%u\n", Fref, Fout);
1703
1704        /* Apply the division for our remaining calculations */
1705        Fref /= div;
1706
1707        /* Fvco should be 90-100MHz; don't check the upper bound */
1708        div = 2;
1709        while (Fout * div < 90000000) {
1710                div++;
1711                if (div > 64) {
1712                        pr_err("Unable to find FLL_OUTDIV for Fout=%uHz\n",
1713                               Fout);
1714                        return -EINVAL;
1715                }
1716        }
1717        target = Fout * div;
1718        fll_div->fll_outdiv = div - 1;
1719
1720        pr_debug("FLL Fvco=%dHz\n", target);
1721
1722        /* Find an appropraite FLL_FRATIO and factor it out of the target */
1723        for (i = 0; i < ARRAY_SIZE(fll_fratios); i++) {
1724                if (fll_fratios[i].min <= Fref && Fref <= fll_fratios[i].max) {
1725                        fll_div->fll_fratio = fll_fratios[i].fll_fratio;
1726                        fratio = fll_fratios[i].ratio;
1727                        break;
1728                }
1729        }
1730        if (i == ARRAY_SIZE(fll_fratios)) {
1731                pr_err("Unable to find FLL_FRATIO for Fref=%uHz\n", Fref);
1732                return -EINVAL;
1733        }
1734
1735        fll_div->n = target / (fratio * Fref);
1736
1737        if (target % Fref == 0) {
1738                fll_div->theta = 0;
1739                fll_div->lambda = 0;
1740        } else {
1741                gcd_fll = gcd(target, fratio * Fref);
1742
1743                fll_div->theta = (target - (fll_div->n * fratio * Fref))
1744                        / gcd_fll;
1745                fll_div->lambda = (fratio * Fref) / gcd_fll;
1746        }
1747
1748        pr_debug("FLL N=%x THETA=%x LAMBDA=%x\n",
1749                 fll_div->n, fll_div->theta, fll_div->lambda);
1750        pr_debug("FLL_FRATIO=%x(%d) FLL_OUTDIV=%x FLL_REFCLK_DIV=%x\n",
1751                 fll_div->fll_fratio, fratio, fll_div->fll_outdiv,
1752                 fll_div->fll_refclk_div);
1753
1754        return 0;
1755}
1756
1757static int wm5100_set_fll(struct snd_soc_codec *codec, int fll_id, int source,
1758                          unsigned int Fref, unsigned int Fout)
1759{
1760        struct i2c_client *i2c = to_i2c_client(codec->dev);
1761        struct wm5100_priv *wm5100 = snd_soc_codec_get_drvdata(codec);
1762        struct _fll_div factors;
1763        struct wm5100_fll *fll;
1764        int ret, base, lock, i, timeout;
1765        unsigned long time_left;
1766
1767        switch (fll_id) {
1768        case WM5100_FLL1:
1769                fll = &wm5100->fll[0];
1770                base = WM5100_FLL1_CONTROL_1 - 1;
1771                lock = WM5100_FLL1_LOCK_STS;
1772                break;
1773        case WM5100_FLL2:
1774                fll = &wm5100->fll[1];
1775                base = WM5100_FLL2_CONTROL_2 - 1;
1776                lock = WM5100_FLL2_LOCK_STS;
1777                break;
1778        default:
1779                dev_err(codec->dev, "Unknown FLL %d\n",fll_id);
1780                return -EINVAL;
1781        }
1782
1783        if (!Fout) {
1784                dev_dbg(codec->dev, "FLL%d disabled", fll_id);
1785                if (fll->fout)
1786                        pm_runtime_put(codec->dev);
1787                fll->fout = 0;
1788                snd_soc_update_bits(codec, base + 1, WM5100_FLL1_ENA, 0);
1789                return 0;
1790        }
1791
1792        switch (source) {
1793        case WM5100_FLL_SRC_MCLK1:
1794        case WM5100_FLL_SRC_MCLK2:
1795        case WM5100_FLL_SRC_FLL1:
1796        case WM5100_FLL_SRC_FLL2:
1797        case WM5100_FLL_SRC_AIF1BCLK:
1798        case WM5100_FLL_SRC_AIF2BCLK:
1799        case WM5100_FLL_SRC_AIF3BCLK:
1800                break;
1801        default:
1802                dev_err(codec->dev, "Invalid FLL source %d\n", source);
1803                return -EINVAL;
1804        }
1805
1806        ret = fll_factors(&factors, Fref, Fout);
1807        if (ret < 0)
1808                return ret;
1809
1810        /* Disable the FLL while we reconfigure */
1811        snd_soc_update_bits(codec, base + 1, WM5100_FLL1_ENA, 0);
1812
1813        snd_soc_update_bits(codec, base + 2,
1814                            WM5100_FLL1_OUTDIV_MASK | WM5100_FLL1_FRATIO_MASK,
1815                            (factors.fll_outdiv << WM5100_FLL1_OUTDIV_SHIFT) |
1816                            factors.fll_fratio);
1817        snd_soc_update_bits(codec, base + 3, WM5100_FLL1_THETA_MASK,
1818                            factors.theta);
1819        snd_soc_update_bits(codec, base + 5, WM5100_FLL1_N_MASK, factors.n);
1820        snd_soc_update_bits(codec, base + 6,
1821                            WM5100_FLL1_REFCLK_DIV_MASK |
1822                            WM5100_FLL1_REFCLK_SRC_MASK,
1823                            (factors.fll_refclk_div
1824                             << WM5100_FLL1_REFCLK_DIV_SHIFT) | source);
1825        snd_soc_update_bits(codec, base + 7, WM5100_FLL1_LAMBDA_MASK,
1826                            factors.lambda);
1827
1828        /* Clear any pending completions */
1829        try_wait_for_completion(&fll->lock);
1830
1831        pm_runtime_get_sync(codec->dev);
1832
1833        snd_soc_update_bits(codec, base + 1, WM5100_FLL1_ENA, WM5100_FLL1_ENA);
1834
1835        if (i2c->irq)
1836                timeout = 2;
1837        else
1838                timeout = 50;
1839
1840        snd_soc_update_bits(codec, WM5100_CLOCKING_3, WM5100_SYSCLK_ENA,
1841                            WM5100_SYSCLK_ENA);
1842
1843        /* Poll for the lock; will use interrupt when we can test */
1844        for (i = 0; i < timeout; i++) {
1845                if (i2c->irq) {
1846                        time_left = wait_for_completion_timeout(&fll->lock,
1847                                                        msecs_to_jiffies(25));
1848                        if (time_left > 0)
1849                                break;
1850                } else {
1851                        msleep(1);
1852                }
1853
1854                ret = snd_soc_read(codec,
1855                                   WM5100_INTERRUPT_RAW_STATUS_3);
1856                if (ret < 0) {
1857                        dev_err(codec->dev,
1858                                "Failed to read FLL status: %d\n",
1859                                ret);
1860                        continue;
1861                }
1862                if (ret & lock)
1863                        break;
1864        }
1865        if (i == timeout) {
1866                dev_err(codec->dev, "FLL%d lock timed out\n", fll_id);
1867                pm_runtime_put(codec->dev);
1868                return -ETIMEDOUT;
1869        }
1870
1871        fll->src = source;
1872        fll->fref = Fref;
1873        fll->fout = Fout;
1874
1875        dev_dbg(codec->dev, "FLL%d running %dHz->%dHz\n", fll_id,
1876                Fref, Fout);
1877
1878        return 0;
1879}
1880
1881/* Actually go much higher */
1882#define WM5100_RATES SNDRV_PCM_RATE_8000_192000
1883
1884#define WM5100_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
1885                        SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
1886
1887static struct snd_soc_dai_driver wm5100_dai[] = {
1888        {
1889                .name = "wm5100-aif1",
1890                .base = WM5100_AUDIO_IF_1_1 - 1,
1891                .playback = {
1892                        .stream_name = "AIF1 Playback",
1893                        .channels_min = 2,
1894                        .channels_max = 2,
1895                        .rates = WM5100_RATES,
1896                        .formats = WM5100_FORMATS,
1897                },
1898                .capture = {
1899                         .stream_name = "AIF1 Capture",
1900                         .channels_min = 2,
1901                         .channels_max = 2,
1902                         .rates = WM5100_RATES,
1903                         .formats = WM5100_FORMATS,
1904                 },
1905                .ops = &wm5100_dai_ops,
1906        },
1907        {
1908                .name = "wm5100-aif2",
1909                .id = 1,
1910                .base = WM5100_AUDIO_IF_2_1 - 1,
1911                .playback = {
1912                        .stream_name = "AIF2 Playback",
1913                        .channels_min = 2,
1914                        .channels_max = 2,
1915                        .rates = WM5100_RATES,
1916                        .formats = WM5100_FORMATS,
1917                },
1918                .capture = {
1919                         .stream_name = "AIF2 Capture",
1920                         .channels_min = 2,
1921                         .channels_max = 2,
1922                         .rates = WM5100_RATES,
1923                         .formats = WM5100_FORMATS,
1924                 },
1925                .ops = &wm5100_dai_ops,
1926        },
1927        {
1928                .name = "wm5100-aif3",
1929                .id = 2,
1930                .base = WM5100_AUDIO_IF_3_1 - 1,
1931                .playback = {
1932                        .stream_name = "AIF3 Playback",
1933                        .channels_min = 2,
1934                        .channels_max = 2,
1935                        .rates = WM5100_RATES,
1936                        .formats = WM5100_FORMATS,
1937                },
1938                .capture = {
1939                         .stream_name = "AIF3 Capture",
1940                         .channels_min = 2,
1941                         .channels_max = 2,
1942                         .rates = WM5100_RATES,
1943                         .formats = WM5100_FORMATS,
1944                 },
1945                .ops = &wm5100_dai_ops,
1946        },
1947};
1948
1949static int wm5100_dig_vu[] = {
1950        WM5100_ADC_DIGITAL_VOLUME_1L,
1951        WM5100_ADC_DIGITAL_VOLUME_1R,
1952        WM5100_ADC_DIGITAL_VOLUME_2L,
1953        WM5100_ADC_DIGITAL_VOLUME_2R,
1954        WM5100_ADC_DIGITAL_VOLUME_3L,
1955        WM5100_ADC_DIGITAL_VOLUME_3R,
1956        WM5100_ADC_DIGITAL_VOLUME_4L,
1957        WM5100_ADC_DIGITAL_VOLUME_4R,
1958
1959        WM5100_DAC_DIGITAL_VOLUME_1L,
1960        WM5100_DAC_DIGITAL_VOLUME_1R,
1961        WM5100_DAC_DIGITAL_VOLUME_2L,
1962        WM5100_DAC_DIGITAL_VOLUME_2R,
1963        WM5100_DAC_DIGITAL_VOLUME_3L,
1964        WM5100_DAC_DIGITAL_VOLUME_3R,
1965        WM5100_DAC_DIGITAL_VOLUME_4L,
1966        WM5100_DAC_DIGITAL_VOLUME_4R,
1967        WM5100_DAC_DIGITAL_VOLUME_5L,
1968        WM5100_DAC_DIGITAL_VOLUME_5R,
1969        WM5100_DAC_DIGITAL_VOLUME_6L,
1970        WM5100_DAC_DIGITAL_VOLUME_6R,
1971};
1972
1973static void wm5100_set_detect_mode(struct wm5100_priv *wm5100, int the_mode)
1974{
1975        struct wm5100_jack_mode *mode = &wm5100->pdata.jack_modes[the_mode];
1976
1977        if (WARN_ON(the_mode >= ARRAY_SIZE(wm5100->pdata.jack_modes)))
1978                return;
1979
1980        gpio_set_value_cansleep(wm5100->pdata.hp_pol, mode->hp_pol);
1981        regmap_update_bits(wm5100->regmap, WM5100_ACCESSORY_DETECT_MODE_1,
1982                           WM5100_ACCDET_BIAS_SRC_MASK |
1983                           WM5100_ACCDET_SRC,
1984                           (mode->bias << WM5100_ACCDET_BIAS_SRC_SHIFT) |
1985                           mode->micd_src << WM5100_ACCDET_SRC_SHIFT);
1986        regmap_update_bits(wm5100->regmap, WM5100_MISC_CONTROL,
1987                           WM5100_HPCOM_SRC,
1988                           mode->micd_src << WM5100_HPCOM_SRC_SHIFT);
1989
1990        wm5100->jack_mode = the_mode;
1991
1992        dev_dbg(wm5100->dev, "Set microphone polarity to %d\n",
1993                wm5100->jack_mode);
1994}
1995
1996static void wm5100_report_headphone(struct wm5100_priv *wm5100)
1997{
1998        dev_dbg(wm5100->dev, "Headphone detected\n");
1999        wm5100->jack_detecting = false;
2000        snd_soc_jack_report(wm5100->jack, SND_JACK_HEADPHONE,
2001                            SND_JACK_HEADPHONE);
2002
2003        /* Increase the detection rate a bit for responsiveness. */
2004        regmap_update_bits(wm5100->regmap, WM5100_MIC_DETECT_1,
2005                           WM5100_ACCDET_RATE_MASK,
2006                           7 << WM5100_ACCDET_RATE_SHIFT);
2007}
2008
2009static void wm5100_micd_irq(struct wm5100_priv *wm5100)
2010{
2011        unsigned int val;
2012        int ret;
2013
2014        ret = regmap_read(wm5100->regmap, WM5100_MIC_DETECT_3, &val);
2015        if (ret != 0) {
2016                dev_err(wm5100->dev, "Failed to read micropone status: %d\n",
2017                        ret);
2018                return;
2019        }
2020
2021        dev_dbg(wm5100->dev, "Microphone event: %x\n", val);
2022
2023        if (!(val & WM5100_ACCDET_VALID)) {
2024                dev_warn(wm5100->dev, "Microphone detection state invalid\n");
2025                return;
2026        }
2027
2028        /* No accessory, reset everything and report removal */
2029        if (!(val & WM5100_ACCDET_STS)) {
2030                dev_dbg(wm5100->dev, "Jack removal detected\n");
2031                wm5100->jack_mic = false;
2032                wm5100->jack_detecting = true;
2033                wm5100->jack_flips = 0;
2034                snd_soc_jack_report(wm5100->jack, 0,
2035                                    SND_JACK_LINEOUT | SND_JACK_HEADSET |
2036                                    SND_JACK_BTN_0);
2037
2038                regmap_update_bits(wm5100->regmap, WM5100_MIC_DETECT_1,
2039                                   WM5100_ACCDET_RATE_MASK,
2040                                   WM5100_ACCDET_RATE_MASK);
2041                return;
2042        }
2043
2044        /* If the measurement is very high we've got a microphone,
2045         * either we just detected one or if we already reported then
2046         * we've got a button release event.
2047         */
2048        if (val & 0x400) {
2049                if (wm5100->jack_detecting) {
2050                        dev_dbg(wm5100->dev, "Microphone detected\n");
2051                        wm5100->jack_mic = true;
2052                        wm5100->jack_detecting = false;
2053                        snd_soc_jack_report(wm5100->jack,
2054                                            SND_JACK_HEADSET,
2055                                            SND_JACK_HEADSET | SND_JACK_BTN_0);
2056
2057                        /* Increase poll rate to give better responsiveness
2058                         * for buttons */
2059                        regmap_update_bits(wm5100->regmap, WM5100_MIC_DETECT_1,
2060                                           WM5100_ACCDET_RATE_MASK,
2061                                           5 << WM5100_ACCDET_RATE_SHIFT);
2062                } else {
2063                        dev_dbg(wm5100->dev, "Mic button up\n");
2064                        snd_soc_jack_report(wm5100->jack, 0, SND_JACK_BTN_0);
2065                }
2066
2067                return;
2068        }
2069
2070        /* If we detected a lower impedence during initial startup
2071         * then we probably have the wrong polarity, flip it.  Don't
2072         * do this for the lowest impedences to speed up detection of
2073         * plain headphones and give up if neither polarity looks
2074         * sensible.
2075         */
2076        if (wm5100->jack_detecting && (val & 0x3f8)) {
2077                wm5100->jack_flips++;
2078
2079                if (wm5100->jack_flips > 1)
2080                        wm5100_report_headphone(wm5100);
2081                else
2082                        wm5100_set_detect_mode(wm5100, !wm5100->jack_mode);
2083
2084                return;
2085        }
2086
2087        /* Don't distinguish between buttons, just report any low
2088         * impedence as BTN_0.
2089         */
2090        if (val & 0x3fc) {
2091                if (wm5100->jack_mic) {
2092                        dev_dbg(wm5100->dev, "Mic button detected\n");
2093                        snd_soc_jack_report(wm5100->jack, SND_JACK_BTN_0,
2094                                            SND_JACK_BTN_0);
2095                } else if (wm5100->jack_detecting) {
2096                        wm5100_report_headphone(wm5100);
2097                }
2098        }
2099}
2100
2101int wm5100_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack)
2102{
2103        struct wm5100_priv *wm5100 = snd_soc_codec_get_drvdata(codec);
2104        struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
2105
2106        if (jack) {
2107                wm5100->jack = jack;
2108                wm5100->jack_detecting = true;
2109                wm5100->jack_flips = 0;
2110
2111                wm5100_set_detect_mode(wm5100, 0);
2112
2113                /* Slowest detection rate, gives debounce for initial
2114                 * detection */
2115                snd_soc_update_bits(codec, WM5100_MIC_DETECT_1,
2116                                    WM5100_ACCDET_BIAS_STARTTIME_MASK |
2117                                    WM5100_ACCDET_RATE_MASK,
2118                                    (7 << WM5100_ACCDET_BIAS_STARTTIME_SHIFT) |
2119                                    WM5100_ACCDET_RATE_MASK);
2120
2121                /* We need the charge pump to power MICBIAS */
2122                snd_soc_dapm_mutex_lock(dapm);
2123
2124                snd_soc_dapm_force_enable_pin_unlocked(dapm, "CP2");
2125                snd_soc_dapm_force_enable_pin_unlocked(dapm, "SYSCLK");
2126
2127                snd_soc_dapm_sync_unlocked(dapm);
2128
2129                snd_soc_dapm_mutex_unlock(dapm);
2130
2131                /* We start off just enabling microphone detection - even a
2132                 * plain headphone will trigger detection.
2133                 */
2134                snd_soc_update_bits(codec, WM5100_MIC_DETECT_1,
2135                                    WM5100_ACCDET_ENA, WM5100_ACCDET_ENA);
2136
2137                snd_soc_update_bits(codec, WM5100_INTERRUPT_STATUS_3_MASK,
2138                                    WM5100_IM_ACCDET_EINT, 0);
2139        } else {
2140                snd_soc_update_bits(codec, WM5100_INTERRUPT_STATUS_3_MASK,
2141                                    WM5100_IM_HPDET_EINT |
2142                                    WM5100_IM_ACCDET_EINT,
2143                                    WM5100_IM_HPDET_EINT |
2144                                    WM5100_IM_ACCDET_EINT);
2145                snd_soc_update_bits(codec, WM5100_MIC_DETECT_1,
2146                                    WM5100_ACCDET_ENA, 0);
2147                wm5100->jack = NULL;
2148        }
2149
2150        return 0;
2151}
2152EXPORT_SYMBOL_GPL(wm5100_detect);
2153
2154static irqreturn_t wm5100_irq(int irq, void *data)
2155{
2156        struct wm5100_priv *wm5100 = data;
2157        irqreturn_t status = IRQ_NONE;
2158        unsigned int irq_val, mask_val;
2159        int ret;
2160
2161        ret = regmap_read(wm5100->regmap, WM5100_INTERRUPT_STATUS_3, &irq_val);
2162        if (ret < 0) {
2163                dev_err(wm5100->dev, "Failed to read IRQ status 3: %d\n",
2164                        ret);
2165                irq_val = 0;
2166        }
2167
2168        ret = regmap_read(wm5100->regmap, WM5100_INTERRUPT_STATUS_3_MASK,
2169                          &mask_val);
2170        if (ret < 0) {
2171                dev_err(wm5100->dev, "Failed to read IRQ mask 3: %d\n",
2172                        ret);
2173                mask_val = 0xffff;
2174        }
2175
2176        irq_val &= ~mask_val;
2177
2178        regmap_write(wm5100->regmap, WM5100_INTERRUPT_STATUS_3, irq_val);
2179
2180        if (irq_val)
2181                status = IRQ_HANDLED;
2182
2183        wm5100_log_status3(wm5100, irq_val);
2184
2185        if (irq_val & WM5100_FLL1_LOCK_EINT) {
2186                dev_dbg(wm5100->dev, "FLL1 locked\n");
2187                complete(&wm5100->fll[0].lock);
2188        }
2189        if (irq_val & WM5100_FLL2_LOCK_EINT) {
2190                dev_dbg(wm5100->dev, "FLL2 locked\n");
2191                complete(&wm5100->fll[1].lock);
2192        }
2193
2194        if (irq_val & WM5100_ACCDET_EINT)
2195                wm5100_micd_irq(wm5100);
2196
2197        ret = regmap_read(wm5100->regmap, WM5100_INTERRUPT_STATUS_4, &irq_val);
2198        if (ret < 0) {
2199                dev_err(wm5100->dev, "Failed to read IRQ status 4: %d\n",
2200                        ret);
2201                irq_val = 0;
2202        }
2203
2204        ret = regmap_read(wm5100->regmap, WM5100_INTERRUPT_STATUS_4_MASK,
2205                          &mask_val);
2206        if (ret < 0) {
2207                dev_err(wm5100->dev, "Failed to read IRQ mask 4: %d\n",
2208                        ret);
2209                mask_val = 0xffff;
2210        }
2211
2212        irq_val &= ~mask_val;
2213
2214        if (irq_val)
2215                status = IRQ_HANDLED;
2216
2217        regmap_write(wm5100->regmap, WM5100_INTERRUPT_STATUS_4, irq_val);
2218
2219        wm5100_log_status4(wm5100, irq_val);
2220
2221        return status;
2222}
2223
2224static irqreturn_t wm5100_edge_irq(int irq, void *data)
2225{
2226        irqreturn_t ret = IRQ_NONE;
2227        irqreturn_t val;
2228
2229        do {
2230                val = wm5100_irq(irq, data);
2231                if (val != IRQ_NONE)
2232                        ret = val;
2233        } while (val != IRQ_NONE);
2234
2235        return ret;
2236}
2237
2238#ifdef CONFIG_GPIOLIB
2239static inline struct wm5100_priv *gpio_to_wm5100(struct gpio_chip *chip)
2240{
2241        return container_of(chip, struct wm5100_priv, gpio_chip);
2242}
2243
2244static void wm5100_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
2245{
2246        struct wm5100_priv *wm5100 = gpio_to_wm5100(chip);
2247
2248        regmap_update_bits(wm5100->regmap, WM5100_GPIO_CTRL_1 + offset,
2249                           WM5100_GP1_LVL, !!value << WM5100_GP1_LVL_SHIFT);
2250}
2251
2252static int wm5100_gpio_direction_out(struct gpio_chip *chip,
2253                                     unsigned offset, int value)
2254{
2255        struct wm5100_priv *wm5100 = gpio_to_wm5100(chip);
2256        int val, ret;
2257
2258        val = (1 << WM5100_GP1_FN_SHIFT) | (!!value << WM5100_GP1_LVL_SHIFT);
2259
2260        ret = regmap_update_bits(wm5100->regmap, WM5100_GPIO_CTRL_1 + offset,
2261                                 WM5100_GP1_FN_MASK | WM5100_GP1_DIR |
2262                                 WM5100_GP1_LVL, val);
2263        if (ret < 0)
2264                return ret;
2265        else
2266                return 0;
2267}
2268
2269static int wm5100_gpio_get(struct gpio_chip *chip, unsigned offset)
2270{
2271        struct wm5100_priv *wm5100 = gpio_to_wm5100(chip);
2272        unsigned int reg;
2273        int ret;
2274
2275        ret = regmap_read(wm5100->regmap, WM5100_GPIO_CTRL_1 + offset, &reg);
2276        if (ret < 0)
2277                return ret;
2278
2279        return (reg & WM5100_GP1_LVL) != 0;
2280}
2281
2282static int wm5100_gpio_direction_in(struct gpio_chip *chip, unsigned offset)
2283{
2284        struct wm5100_priv *wm5100 = gpio_to_wm5100(chip);
2285
2286        return regmap_update_bits(wm5100->regmap, WM5100_GPIO_CTRL_1 + offset,
2287                                  WM5100_GP1_FN_MASK | WM5100_GP1_DIR,
2288                                  (1 << WM5100_GP1_FN_SHIFT) |
2289                                  (1 << WM5100_GP1_DIR_SHIFT));
2290}
2291
2292static struct gpio_chip wm5100_template_chip = {
2293        .label                  = "wm5100",
2294        .owner                  = THIS_MODULE,
2295        .direction_output       = wm5100_gpio_direction_out,
2296        .set                    = wm5100_gpio_set,
2297        .direction_input        = wm5100_gpio_direction_in,
2298        .get                    = wm5100_gpio_get,
2299        .can_sleep              = 1,
2300};
2301
2302static void wm5100_init_gpio(struct i2c_client *i2c)
2303{
2304        struct wm5100_priv *wm5100 = i2c_get_clientdata(i2c);
2305        int ret;
2306
2307        wm5100->gpio_chip = wm5100_template_chip;
2308        wm5100->gpio_chip.ngpio = 6;
2309        wm5100->gpio_chip.parent = &i2c->dev;
2310
2311        if (wm5100->pdata.gpio_base)
2312                wm5100->gpio_chip.base = wm5100->pdata.gpio_base;
2313        else
2314                wm5100->gpio_chip.base = -1;
2315
2316        ret = gpiochip_add(&wm5100->gpio_chip);
2317        if (ret != 0)
2318                dev_err(&i2c->dev, "Failed to add GPIOs: %d\n", ret);
2319}
2320
2321static void wm5100_free_gpio(struct i2c_client *i2c)
2322{
2323        struct wm5100_priv *wm5100 = i2c_get_clientdata(i2c);
2324
2325        gpiochip_remove(&wm5100->gpio_chip);
2326}
2327#else
2328static void wm5100_init_gpio(struct i2c_client *i2c)
2329{
2330}
2331
2332static void wm5100_free_gpio(struct i2c_client *i2c)
2333{
2334}
2335#endif
2336
2337static int wm5100_probe(struct snd_soc_codec *codec)
2338{
2339        struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
2340        struct i2c_client *i2c = to_i2c_client(codec->dev);
2341        struct wm5100_priv *wm5100 = snd_soc_codec_get_drvdata(codec);
2342        int ret, i;
2343
2344        wm5100->codec = codec;
2345
2346        for (i = 0; i < ARRAY_SIZE(wm5100_dig_vu); i++)
2347                snd_soc_update_bits(codec, wm5100_dig_vu[i], WM5100_OUT_VU,
2348                                    WM5100_OUT_VU);
2349
2350        /* Don't debounce interrupts to support use of SYSCLK only */
2351        snd_soc_write(codec, WM5100_IRQ_DEBOUNCE_1, 0);
2352        snd_soc_write(codec, WM5100_IRQ_DEBOUNCE_2, 0);
2353
2354        /* TODO: check if we're symmetric */
2355
2356        if (i2c->irq)
2357                snd_soc_dapm_new_controls(dapm, wm5100_dapm_widgets_noirq,
2358                                          ARRAY_SIZE(wm5100_dapm_widgets_noirq));
2359
2360        if (wm5100->pdata.hp_pol) {
2361                ret = gpio_request_one(wm5100->pdata.hp_pol,
2362                                       GPIOF_OUT_INIT_HIGH, "WM5100 HP_POL");
2363                if (ret < 0) {
2364                        dev_err(&i2c->dev, "Failed to request HP_POL %d: %d\n",
2365                                wm5100->pdata.hp_pol, ret);
2366                        goto err_gpio;
2367                }
2368        }
2369
2370        return 0;
2371
2372err_gpio:
2373
2374        return ret;
2375}
2376
2377static int wm5100_remove(struct snd_soc_codec *codec)
2378{
2379        struct wm5100_priv *wm5100 = snd_soc_codec_get_drvdata(codec);
2380
2381        if (wm5100->pdata.hp_pol) {
2382                gpio_free(wm5100->pdata.hp_pol);
2383        }
2384
2385        return 0;
2386}
2387
2388static struct snd_soc_codec_driver soc_codec_dev_wm5100 = {
2389        .probe =        wm5100_probe,
2390        .remove =       wm5100_remove,
2391
2392        .set_sysclk = wm5100_set_sysclk,
2393        .set_pll = wm5100_set_fll,
2394        .idle_bias_off = 1,
2395
2396        .seq_notifier = wm5100_seq_notifier,
2397        .controls = wm5100_snd_controls,
2398        .num_controls = ARRAY_SIZE(wm5100_snd_controls),
2399        .dapm_widgets = wm5100_dapm_widgets,
2400        .num_dapm_widgets = ARRAY_SIZE(wm5100_dapm_widgets),
2401        .dapm_routes = wm5100_dapm_routes,
2402        .num_dapm_routes = ARRAY_SIZE(wm5100_dapm_routes),
2403};
2404
2405static const struct regmap_config wm5100_regmap = {
2406        .reg_bits = 16,
2407        .val_bits = 16,
2408
2409        .max_register = WM5100_MAX_REGISTER,
2410        .reg_defaults = wm5100_reg_defaults,
2411        .num_reg_defaults = ARRAY_SIZE(wm5100_reg_defaults),
2412        .volatile_reg = wm5100_volatile_register,
2413        .readable_reg = wm5100_readable_register,
2414        .cache_type = REGCACHE_RBTREE,
2415};
2416
2417static const unsigned int wm5100_mic_ctrl_reg[] = {
2418        WM5100_IN1L_CONTROL,
2419        WM5100_IN2L_CONTROL,
2420        WM5100_IN3L_CONTROL,
2421        WM5100_IN4L_CONTROL,
2422};
2423
2424static int wm5100_i2c_probe(struct i2c_client *i2c,
2425                            const struct i2c_device_id *id)
2426{
2427        struct wm5100_pdata *pdata = dev_get_platdata(&i2c->dev);
2428        struct wm5100_priv *wm5100;
2429        unsigned int reg;
2430        int ret, i, irq_flags;
2431
2432        wm5100 = devm_kzalloc(&i2c->dev, sizeof(struct wm5100_priv),
2433                              GFP_KERNEL);
2434        if (wm5100 == NULL)
2435                return -ENOMEM;
2436
2437        wm5100->dev = &i2c->dev;
2438
2439        wm5100->regmap = devm_regmap_init_i2c(i2c, &wm5100_regmap);
2440        if (IS_ERR(wm5100->regmap)) {
2441                ret = PTR_ERR(wm5100->regmap);
2442                dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
2443                        ret);
2444                goto err;
2445        }
2446
2447        for (i = 0; i < ARRAY_SIZE(wm5100->fll); i++)
2448                init_completion(&wm5100->fll[i].lock);
2449
2450        if (pdata)
2451                wm5100->pdata = *pdata;
2452
2453        i2c_set_clientdata(i2c, wm5100);
2454
2455        for (i = 0; i < ARRAY_SIZE(wm5100->core_supplies); i++)
2456                wm5100->core_supplies[i].supply = wm5100_core_supply_names[i];
2457
2458        ret = devm_regulator_bulk_get(&i2c->dev,
2459                                      ARRAY_SIZE(wm5100->core_supplies),
2460                                      wm5100->core_supplies);
2461        if (ret != 0) {
2462                dev_err(&i2c->dev, "Failed to request core supplies: %d\n",
2463                        ret);
2464                goto err;
2465        }
2466
2467        ret = regulator_bulk_enable(ARRAY_SIZE(wm5100->core_supplies),
2468                                    wm5100->core_supplies);
2469        if (ret != 0) {
2470                dev_err(&i2c->dev, "Failed to enable core supplies: %d\n",
2471                        ret);
2472                goto err;
2473        }
2474
2475        if (wm5100->pdata.ldo_ena) {
2476                ret = gpio_request_one(wm5100->pdata.ldo_ena,
2477                                       GPIOF_OUT_INIT_HIGH, "WM5100 LDOENA");
2478                if (ret < 0) {
2479                        dev_err(&i2c->dev, "Failed to request LDOENA %d: %d\n",
2480                                wm5100->pdata.ldo_ena, ret);
2481                        goto err_enable;
2482                }
2483                msleep(2);
2484        }
2485
2486        if (wm5100->pdata.reset) {
2487                ret = gpio_request_one(wm5100->pdata.reset,
2488                                       GPIOF_OUT_INIT_HIGH, "WM5100 /RESET");
2489                if (ret < 0) {
2490                        dev_err(&i2c->dev, "Failed to request /RESET %d: %d\n",
2491                                wm5100->pdata.reset, ret);
2492                        goto err_ldo;
2493                }
2494        }
2495
2496        ret = regmap_read(wm5100->regmap, WM5100_SOFTWARE_RESET, &reg);
2497        if (ret < 0) {
2498                dev_err(&i2c->dev, "Failed to read ID register: %d\n", ret);
2499                goto err_reset;
2500        }
2501        switch (reg) {
2502        case 0x8997:
2503        case 0x5100:
2504                break;
2505
2506        default:
2507                dev_err(&i2c->dev, "Device is not a WM5100, ID is %x\n", reg);
2508                ret = -EINVAL;
2509                goto err_reset;
2510        }
2511
2512        ret = regmap_read(wm5100->regmap, WM5100_DEVICE_REVISION, &reg);
2513        if (ret < 0) {
2514                dev_err(&i2c->dev, "Failed to read revision register\n");
2515                goto err_reset;
2516        }
2517        wm5100->rev = reg & WM5100_DEVICE_REVISION_MASK;
2518
2519        dev_info(&i2c->dev, "revision %c\n", wm5100->rev + 'A');
2520
2521        ret = wm5100_reset(wm5100);
2522        if (ret < 0) {
2523                dev_err(&i2c->dev, "Failed to issue reset\n");
2524                goto err_reset;
2525        }
2526
2527        switch (wm5100->rev) {
2528        case 0:
2529                ret = regmap_register_patch(wm5100->regmap,
2530                                            wm5100_reva_patches,
2531                                            ARRAY_SIZE(wm5100_reva_patches));
2532                if (ret != 0) {
2533                        dev_err(&i2c->dev, "Failed to register patches: %d\n",
2534                                ret);
2535                        goto err_reset;
2536                }
2537                break;
2538        default:
2539                break;
2540        }
2541
2542
2543        wm5100_init_gpio(i2c);
2544
2545        for (i = 0; i < ARRAY_SIZE(wm5100->pdata.gpio_defaults); i++) {
2546                if (!wm5100->pdata.gpio_defaults[i])
2547                        continue;
2548
2549                regmap_write(wm5100->regmap, WM5100_GPIO_CTRL_1 + i,
2550                             wm5100->pdata.gpio_defaults[i]);
2551        }
2552
2553        for (i = 0; i < ARRAY_SIZE(wm5100->pdata.in_mode); i++) {
2554                regmap_update_bits(wm5100->regmap, wm5100_mic_ctrl_reg[i],
2555                                   WM5100_IN1_MODE_MASK |
2556                                   WM5100_IN1_DMIC_SUP_MASK,
2557                                   (wm5100->pdata.in_mode[i] <<
2558                                    WM5100_IN1_MODE_SHIFT) |
2559                                   (wm5100->pdata.dmic_sup[i] <<
2560                                    WM5100_IN1_DMIC_SUP_SHIFT));
2561        }
2562
2563        if (i2c->irq) {
2564                if (wm5100->pdata.irq_flags)
2565                        irq_flags = wm5100->pdata.irq_flags;
2566                else
2567                        irq_flags = IRQF_TRIGGER_LOW;
2568
2569                irq_flags |= IRQF_ONESHOT;
2570
2571                if (irq_flags & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING))
2572                        ret = request_threaded_irq(i2c->irq, NULL,
2573                                                   wm5100_edge_irq, irq_flags,
2574                                                   "wm5100", wm5100);
2575                else
2576                        ret = request_threaded_irq(i2c->irq, NULL, wm5100_irq,
2577                                                   irq_flags, "wm5100",
2578                                                   wm5100);
2579
2580                if (ret != 0) {
2581                        dev_err(&i2c->dev, "Failed to request IRQ %d: %d\n",
2582                                i2c->irq, ret);
2583                } else {
2584                        /* Enable default interrupts */
2585                        regmap_update_bits(wm5100->regmap,
2586                                           WM5100_INTERRUPT_STATUS_3_MASK,
2587                                           WM5100_IM_SPK_SHUTDOWN_WARN_EINT |
2588                                           WM5100_IM_SPK_SHUTDOWN_EINT |
2589                                           WM5100_IM_ASRC2_LOCK_EINT |
2590                                           WM5100_IM_ASRC1_LOCK_EINT |
2591                                           WM5100_IM_FLL2_LOCK_EINT |
2592                                           WM5100_IM_FLL1_LOCK_EINT |
2593                                           WM5100_CLKGEN_ERR_EINT |
2594                                           WM5100_CLKGEN_ERR_ASYNC_EINT, 0);
2595
2596                        regmap_update_bits(wm5100->regmap,
2597                                           WM5100_INTERRUPT_STATUS_4_MASK,
2598                                           WM5100_AIF3_ERR_EINT |
2599                                           WM5100_AIF2_ERR_EINT |
2600                                           WM5100_AIF1_ERR_EINT |
2601                                           WM5100_CTRLIF_ERR_EINT |
2602                                           WM5100_ISRC2_UNDERCLOCKED_EINT |
2603                                           WM5100_ISRC1_UNDERCLOCKED_EINT |
2604                                           WM5100_FX_UNDERCLOCKED_EINT |
2605                                           WM5100_AIF3_UNDERCLOCKED_EINT |
2606                                           WM5100_AIF2_UNDERCLOCKED_EINT |
2607                                           WM5100_AIF1_UNDERCLOCKED_EINT |
2608                                           WM5100_ASRC_UNDERCLOCKED_EINT |
2609                                           WM5100_DAC_UNDERCLOCKED_EINT |
2610                                           WM5100_ADC_UNDERCLOCKED_EINT |
2611                                           WM5100_MIXER_UNDERCLOCKED_EINT, 0);
2612                }
2613        }
2614
2615        pm_runtime_set_active(&i2c->dev);
2616        pm_runtime_enable(&i2c->dev);
2617        pm_request_idle(&i2c->dev);
2618
2619        ret = snd_soc_register_codec(&i2c->dev,
2620                                     &soc_codec_dev_wm5100, wm5100_dai,
2621                                     ARRAY_SIZE(wm5100_dai));
2622        if (ret < 0) {
2623                dev_err(&i2c->dev, "Failed to register WM5100: %d\n", ret);
2624                goto err_reset;
2625        }
2626
2627        return ret;
2628
2629err_reset:
2630        if (i2c->irq)
2631                free_irq(i2c->irq, wm5100);
2632        wm5100_free_gpio(i2c);
2633        if (wm5100->pdata.reset) {
2634                gpio_set_value_cansleep(wm5100->pdata.reset, 0);
2635                gpio_free(wm5100->pdata.reset);
2636        }
2637err_ldo:
2638        if (wm5100->pdata.ldo_ena) {
2639                gpio_set_value_cansleep(wm5100->pdata.ldo_ena, 0);
2640                gpio_free(wm5100->pdata.ldo_ena);
2641        }
2642err_enable:
2643        regulator_bulk_disable(ARRAY_SIZE(wm5100->core_supplies),
2644                               wm5100->core_supplies);
2645err:
2646        return ret;
2647}
2648
2649static int wm5100_i2c_remove(struct i2c_client *i2c)
2650{
2651        struct wm5100_priv *wm5100 = i2c_get_clientdata(i2c);
2652
2653        snd_soc_unregister_codec(&i2c->dev);
2654        if (i2c->irq)
2655                free_irq(i2c->irq, wm5100);
2656        wm5100_free_gpio(i2c);
2657        if (wm5100->pdata.reset) {
2658                gpio_set_value_cansleep(wm5100->pdata.reset, 0);
2659                gpio_free(wm5100->pdata.reset);
2660        }
2661        if (wm5100->pdata.ldo_ena) {
2662                gpio_set_value_cansleep(wm5100->pdata.ldo_ena, 0);
2663                gpio_free(wm5100->pdata.ldo_ena);
2664        }
2665
2666        return 0;
2667}
2668
2669#ifdef CONFIG_PM
2670static int wm5100_runtime_suspend(struct device *dev)
2671{
2672        struct wm5100_priv *wm5100 = dev_get_drvdata(dev);
2673
2674        regcache_cache_only(wm5100->regmap, true);
2675        regcache_mark_dirty(wm5100->regmap);
2676        if (wm5100->pdata.ldo_ena)
2677                gpio_set_value_cansleep(wm5100->pdata.ldo_ena, 0);
2678        regulator_bulk_disable(ARRAY_SIZE(wm5100->core_supplies),
2679                               wm5100->core_supplies);
2680
2681        return 0;
2682}
2683
2684static int wm5100_runtime_resume(struct device *dev)
2685{
2686        struct wm5100_priv *wm5100 = dev_get_drvdata(dev);
2687        int ret;
2688
2689        ret = regulator_bulk_enable(ARRAY_SIZE(wm5100->core_supplies),
2690                                    wm5100->core_supplies);
2691        if (ret != 0) {
2692                dev_err(dev, "Failed to enable supplies: %d\n",
2693                        ret);
2694                return ret;
2695        }
2696
2697        if (wm5100->pdata.ldo_ena) {
2698                gpio_set_value_cansleep(wm5100->pdata.ldo_ena, 1);
2699                msleep(2);
2700        }
2701
2702        regcache_cache_only(wm5100->regmap, false);
2703        regcache_sync(wm5100->regmap);
2704
2705        return 0;
2706}
2707#endif
2708
2709static const struct dev_pm_ops wm5100_pm = {
2710        SET_RUNTIME_PM_OPS(wm5100_runtime_suspend, wm5100_runtime_resume,
2711                           NULL)
2712};
2713
2714static const struct i2c_device_id wm5100_i2c_id[] = {
2715        { "wm5100", 0 },
2716        { }
2717};
2718MODULE_DEVICE_TABLE(i2c, wm5100_i2c_id);
2719
2720static struct i2c_driver wm5100_i2c_driver = {
2721        .driver = {
2722                .name = "wm5100",
2723                .pm = &wm5100_pm,
2724        },
2725        .probe =    wm5100_i2c_probe,
2726        .remove =   wm5100_i2c_remove,
2727        .id_table = wm5100_i2c_id,
2728};
2729
2730module_i2c_driver(wm5100_i2c_driver);
2731
2732MODULE_DESCRIPTION("ASoC WM5100 driver");
2733MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
2734MODULE_LICENSE("GPL");
2735