]> Pileus Git - ~andy/linux/commitdiff
Merge tag 'v3.13-rc1' into asoc-arizona
authorMark Brown <broonie@linaro.org>
Sun, 24 Nov 2013 14:35:18 +0000 (14:35 +0000)
committerMark Brown <broonie@linaro.org>
Sun, 24 Nov 2013 14:35:18 +0000 (14:35 +0000)
Linux 3.13-rc1

1  2 
drivers/mfd/wm5110-tables.c
include/linux/mfd/arizona/registers.h
sound/soc/codecs/arizona.c
sound/soc/codecs/wm5110.c

index 3b079f6b021eac1318e687fd30ec800499da6cf3,bf8b3b5ad1fe65d03eb067881599c5cbc1418a32..d433e285f1f169367da039eb58685184d57c734e
@@@ -14,7 -14,6 +14,7 @@@
  
  #include <linux/mfd/arizona/core.h>
  #include <linux/mfd/arizona/registers.h>
 +#include <linux/device.h>
  
  #include "arizona.h"
  
@@@ -244,6 -243,12 +244,12 @@@ int wm5110_patch(struct arizona *arizon
  EXPORT_SYMBOL_GPL(wm5110_patch);
  
  static const struct regmap_irq wm5110_aod_irqs[ARIZONA_NUM_IRQ] = {
+       [ARIZONA_IRQ_MICD_CLAMP_FALL] = {
+               .mask = ARIZONA_MICD_CLAMP_FALL_EINT1
+       },
+       [ARIZONA_IRQ_MICD_CLAMP_RISE] = {
+               .mask = ARIZONA_MICD_CLAMP_RISE_EINT1
+       },
        [ARIZONA_IRQ_GP5_FALL] = { .mask = ARIZONA_GP5_FALL_EINT1 },
        [ARIZONA_IRQ_GP5_RISE] = { .mask = ARIZONA_GP5_RISE_EINT1 },
        [ARIZONA_IRQ_JD_FALL] = { .mask = ARIZONA_JD1_FALL_EINT1 },
@@@ -506,6 -511,7 +512,7 @@@ static const struct reg_default wm5110_
        { 0x00000293, 0x0000 },    /* R659   - Accessory Detect Mode 1 */
        { 0x0000029B, 0x0020 },    /* R667   - Headphone Detect 1 */
        { 0x0000029C, 0x0000 },    /* R668   - Headphone Detect 2 */
+       { 0x000002A2, 0x0000 },    /* R674   - Micd clamp control */
        { 0x000002A3, 0x1102 },    /* R675   - Mic Detect 1 */
        { 0x000002A4, 0x009F },    /* R676   - Mic Detect 2 */
        { 0x000002A5, 0x0000 },    /* R677   - Mic Detect 3 */
        { 0x00000300, 0x0000 },    /* R768   - Input Enables */
        { 0x00000308, 0x0000 },    /* R776   - Input Rate */
        { 0x00000309, 0x0022 },    /* R777   - Input Volume Ramp */
 +      { 0x0000030C, 0x0002 },    /* R780   - HPF Control */
        { 0x00000310, 0x2080 },    /* R784   - IN1L Control */
        { 0x00000311, 0x0180 },    /* R785   - ADC Digital Volume 1L */
        { 0x00000312, 0x0000 },    /* R786   - DMIC1L Control */
        { 0x00000328, 0x2000 },    /* R808   - IN4L Control */
        { 0x00000329, 0x0180 },    /* R809   - ADC Digital Volume 4L */
        { 0x0000032A, 0x0000 },    /* R810   - DMIC4L Control */
 +      { 0x0000032C, 0x0000 },    /* R812   - IN4R Control */
        { 0x0000032D, 0x0180 },    /* R813   - ADC Digital Volume 4R */
        { 0x0000032E, 0x0000 },    /* R814   - DMIC4R Control */
        { 0x00000400, 0x0000 },    /* R1024  - Output Enables 1 */
        { 0x0000043E, 0x0080 },    /* R1086  - DAC Volume Limit 6R */
        { 0x0000043F, 0x0800 },    /* R1087  - Noise Gate Select 6R */
        { 0x00000450, 0x0000 },    /* R1104  - DAC AEC Control 1 */
-       { 0x00000458, 0x0001 },    /* R1112  - Noise Gate Control */
+       { 0x00000458, 0x0000 },    /* R1112  - Noise Gate Control */
        { 0x00000480, 0x0040 },    /* R1152  - Class W ANC Threshold 1 */
        { 0x00000481, 0x0040 },    /* R1153  - Class W ANC Threshold 2 */
        { 0x00000490, 0x0069 },    /* R1168  - PDM SPK1 CTRL 1 */
        { 0x00000D1B, 0xFFFF },    /* R3355  - IRQ2 Status 4 Mask */
        { 0x00000D1C, 0xFFFF },    /* R3356  - IRQ2 Status 5 Mask */
        { 0x00000D1F, 0x0000 },    /* R3359  - IRQ2 Control */
-       { 0x00000D50, 0x0000 },    /* R3408  - AOD wkup and trig */
        { 0x00000D53, 0xFFFF },    /* R3411  - AOD IRQ Mask IRQ1 */
        { 0x00000D54, 0xFFFF },    /* R3412  - AOD IRQ Mask IRQ2 */
        { 0x00000D56, 0x0000 },    /* R3414  - Jack detect debounce */
        { 0x00001404, 0x0000 },    /* R5124  - DSP4 Status 1 */
  };
  
 +static bool wm5110_is_rev_b_adsp_memory(unsigned int reg)
 +{
 +      if ((reg >= 0x100000 && reg < 0x103000) ||
 +          (reg >= 0x180000 && reg < 0x181000) ||
 +          (reg >= 0x190000 && reg < 0x192000) ||
 +          (reg >= 0x1a8000 && reg < 0x1a9000) ||
 +          (reg >= 0x200000 && reg < 0x209000) ||
 +          (reg >= 0x280000 && reg < 0x281000) ||
 +          (reg >= 0x290000 && reg < 0x29a000) ||
 +          (reg >= 0x2a8000 && reg < 0x2aa000) ||
 +          (reg >= 0x300000 && reg < 0x30f000) ||
 +          (reg >= 0x380000 && reg < 0x382000) ||
 +          (reg >= 0x390000 && reg < 0x39e000) ||
 +          (reg >= 0x3a8000 && reg < 0x3b6000) ||
 +          (reg >= 0x400000 && reg < 0x403000) ||
 +          (reg >= 0x480000 && reg < 0x481000) ||
 +          (reg >= 0x490000 && reg < 0x492000) ||
 +          (reg >= 0x4a8000 && reg < 0x4a9000))
 +              return true;
 +      else
 +              return false;
 +}
 +
 +static bool wm5110_is_rev_d_adsp_memory(unsigned int reg)
 +{
 +      if ((reg >= 0x100000 && reg < 0x106000) ||
 +          (reg >= 0x180000 && reg < 0x182000) ||
 +          (reg >= 0x190000 && reg < 0x198000) ||
 +          (reg >= 0x1a8000 && reg < 0x1aa000) ||
 +          (reg >= 0x200000 && reg < 0x20f000) ||
 +          (reg >= 0x280000 && reg < 0x282000) ||
 +          (reg >= 0x290000 && reg < 0x29c000) ||
 +          (reg >= 0x2a6000 && reg < 0x2b4000) ||
 +          (reg >= 0x300000 && reg < 0x30f000) ||
 +          (reg >= 0x380000 && reg < 0x382000) ||
 +          (reg >= 0x390000 && reg < 0x3a2000) ||
 +          (reg >= 0x3a6000 && reg < 0x3b4000) ||
 +          (reg >= 0x400000 && reg < 0x406000) ||
 +          (reg >= 0x480000 && reg < 0x482000) ||
 +          (reg >= 0x490000 && reg < 0x498000) ||
 +          (reg >= 0x4a8000 && reg < 0x4aa000))
 +              return true;
 +      else
 +              return false;
 +}
 +
 +static bool wm5110_is_adsp_memory(struct device *dev, unsigned int reg)
 +{
 +      struct arizona *arizona = dev_get_drvdata(dev);
 +
 +      switch (arizona->rev) {
 +      case 0 ... 2:
 +              return wm5110_is_rev_b_adsp_memory(reg);
 +      default:
 +              return wm5110_is_rev_d_adsp_memory(reg);
 +      }
 +}
 +
  static bool wm5110_readable_register(struct device *dev, unsigned int reg)
  {
        switch (reg) {
        case ARIZONA_ACCESSORY_DETECT_MODE_1:
        case ARIZONA_HEADPHONE_DETECT_1:
        case ARIZONA_HEADPHONE_DETECT_2:
+       case ARIZONA_MICD_CLAMP_CONTROL:
        case ARIZONA_MIC_DETECT_1:
        case ARIZONA_MIC_DETECT_2:
        case ARIZONA_MIC_DETECT_3:
        case ARIZONA_INPUT_ENABLES_STATUS:
        case ARIZONA_INPUT_RATE:
        case ARIZONA_INPUT_VOLUME_RAMP:
 +      case ARIZONA_HPF_CONTROL:
        case ARIZONA_IN1L_CONTROL:
        case ARIZONA_ADC_DIGITAL_VOLUME_1L:
        case ARIZONA_DMIC1L_CONTROL:
        case ARIZONA_IN4L_CONTROL:
        case ARIZONA_ADC_DIGITAL_VOLUME_4L:
        case ARIZONA_DMIC4L_CONTROL:
 +      case ARIZONA_IN4R_CONTROL:
        case ARIZONA_ADC_DIGITAL_VOLUME_4R:
        case ARIZONA_DMIC4R_CONTROL:
        case ARIZONA_OUTPUT_ENABLES_1:
        case ARIZONA_DSP1_STATUS_1:
        case ARIZONA_DSP1_STATUS_2:
        case ARIZONA_DSP1_STATUS_3:
+       case ARIZONA_DSP1_SCRATCH_0:
+       case ARIZONA_DSP1_SCRATCH_1:
+       case ARIZONA_DSP1_SCRATCH_2:
+       case ARIZONA_DSP1_SCRATCH_3:
        case ARIZONA_DSP2_CONTROL_1:
        case ARIZONA_DSP2_CLOCKING_1:
        case ARIZONA_DSP2_STATUS_1:
        case ARIZONA_DSP2_STATUS_2:
        case ARIZONA_DSP2_STATUS_3:
+       case ARIZONA_DSP2_SCRATCH_0:
+       case ARIZONA_DSP2_SCRATCH_1:
+       case ARIZONA_DSP2_SCRATCH_2:
+       case ARIZONA_DSP2_SCRATCH_3:
        case ARIZONA_DSP3_CONTROL_1:
        case ARIZONA_DSP3_CLOCKING_1:
        case ARIZONA_DSP3_STATUS_1:
        case ARIZONA_DSP3_STATUS_2:
        case ARIZONA_DSP3_STATUS_3:
+       case ARIZONA_DSP3_SCRATCH_0:
+       case ARIZONA_DSP3_SCRATCH_1:
+       case ARIZONA_DSP3_SCRATCH_2:
+       case ARIZONA_DSP3_SCRATCH_3:
        case ARIZONA_DSP4_CONTROL_1:
        case ARIZONA_DSP4_CLOCKING_1:
        case ARIZONA_DSP4_STATUS_1:
        case ARIZONA_DSP4_STATUS_2:
        case ARIZONA_DSP4_STATUS_3:
+       case ARIZONA_DSP4_SCRATCH_0:
+       case ARIZONA_DSP4_SCRATCH_1:
+       case ARIZONA_DSP4_SCRATCH_2:
+       case ARIZONA_DSP4_SCRATCH_3:
                return true;
        default:
 -              return false;
 +              return wm5110_is_adsp_memory(dev, reg);
        }
  }
  
@@@ -2410,39 -2370,53 +2433,55 @@@ static bool wm5110_volatile_register(st
        case ARIZONA_INTERRUPT_RAW_STATUS_7:
        case ARIZONA_INTERRUPT_RAW_STATUS_8:
        case ARIZONA_IRQ_PIN_STATUS:
+       case ARIZONA_AOD_WKUP_AND_TRIG:
        case ARIZONA_AOD_IRQ1:
        case ARIZONA_AOD_IRQ2:
+       case ARIZONA_AOD_IRQ_RAW_STATUS:
        case ARIZONA_FX_CTRL2:
        case ARIZONA_ASRC_STATUS:
        case ARIZONA_DSP_STATUS:
-       case ARIZONA_DSP1_CONTROL_1:
-       case ARIZONA_DSP1_CLOCKING_1:
        case ARIZONA_DSP1_STATUS_1:
        case ARIZONA_DSP1_STATUS_2:
        case ARIZONA_DSP1_STATUS_3:
+       case ARIZONA_DSP1_SCRATCH_0:
+       case ARIZONA_DSP1_SCRATCH_1:
+       case ARIZONA_DSP1_SCRATCH_2:
+       case ARIZONA_DSP1_SCRATCH_3:
        case ARIZONA_DSP2_STATUS_1:
        case ARIZONA_DSP2_STATUS_2:
        case ARIZONA_DSP2_STATUS_3:
+       case ARIZONA_DSP2_SCRATCH_0:
+       case ARIZONA_DSP2_SCRATCH_1:
+       case ARIZONA_DSP2_SCRATCH_2:
+       case ARIZONA_DSP2_SCRATCH_3:
        case ARIZONA_DSP3_STATUS_1:
        case ARIZONA_DSP3_STATUS_2:
        case ARIZONA_DSP3_STATUS_3:
+       case ARIZONA_DSP3_SCRATCH_0:
+       case ARIZONA_DSP3_SCRATCH_1:
+       case ARIZONA_DSP3_SCRATCH_2:
+       case ARIZONA_DSP3_SCRATCH_3:
        case ARIZONA_DSP4_STATUS_1:
        case ARIZONA_DSP4_STATUS_2:
        case ARIZONA_DSP4_STATUS_3:
+       case ARIZONA_DSP4_SCRATCH_0:
+       case ARIZONA_DSP4_SCRATCH_1:
+       case ARIZONA_DSP4_SCRATCH_2:
+       case ARIZONA_DSP4_SCRATCH_3:
                return true;
        default:
 -              return false;
 +              return wm5110_is_adsp_memory(dev, reg);
        }
  }
  
 +#define WM5110_MAX_REGISTER 0x4a9fff
 +
  const struct regmap_config wm5110_spi_regmap = {
        .reg_bits = 32,
        .pad_bits = 16,
        .val_bits = 16,
  
 -      .max_register = ARIZONA_DSP1_STATUS_2,
 +      .max_register = WM5110_MAX_REGISTER,
        .readable_reg = wm5110_readable_register,
        .volatile_reg = wm5110_volatile_register,
  
@@@ -2456,7 -2430,7 +2495,7 @@@ const struct regmap_config wm5110_i2c_r
        .reg_bits = 32,
        .val_bits = 16,
  
 -      .max_register = ARIZONA_DSP1_STATUS_2,
 +      .max_register = WM5110_MAX_REGISTER,
        .readable_reg = wm5110_readable_register,
        .volatile_reg = wm5110_volatile_register,
  
index f1088c2a9d244fef7283be9acb29e45af47efa35,cb49417f8ba9261ba436fef11851274f9df977d0..89878149a43f60d78de29c23de76ca47f8b5a006
  #define ARIZONA_INPUT_ENABLES_STATUS             0x301
  #define ARIZONA_INPUT_RATE                       0x308
  #define ARIZONA_INPUT_VOLUME_RAMP                0x309
 +#define ARIZONA_HPF_CONTROL                      0x30C
  #define ARIZONA_IN1L_CONTROL                     0x310
  #define ARIZONA_ADC_DIGITAL_VOLUME_1L            0x311
  #define ARIZONA_DMIC1L_CONTROL                   0x312
  #define ARIZONA_IN4L_CONTROL                     0x328
  #define ARIZONA_ADC_DIGITAL_VOLUME_4L            0x329
  #define ARIZONA_DMIC4L_CONTROL                   0x32A
 +#define ARIZONA_IN4R_CONTROL                     0x32C
  #define ARIZONA_ADC_DIGITAL_VOLUME_4R            0x32D
  #define ARIZONA_DMIC4R_CONTROL                   0x32E
  #define ARIZONA_OUTPUT_ENABLES_1                 0x400
  #define ARIZONA_AIF2TX2MIX_INPUT_3_VOLUME        0x74D
  #define ARIZONA_AIF2TX2MIX_INPUT_4_SOURCE        0x74E
  #define ARIZONA_AIF2TX2MIX_INPUT_4_VOLUME        0x74F
 +#define ARIZONA_AIF2TX3MIX_INPUT_1_SOURCE        0x750
 +#define ARIZONA_AIF2TX3MIX_INPUT_1_VOLUME        0x751
 +#define ARIZONA_AIF2TX3MIX_INPUT_2_SOURCE        0x752
 +#define ARIZONA_AIF2TX3MIX_INPUT_2_VOLUME        0x753
 +#define ARIZONA_AIF2TX3MIX_INPUT_3_SOURCE        0x754
 +#define ARIZONA_AIF2TX3MIX_INPUT_3_VOLUME        0x755
 +#define ARIZONA_AIF2TX3MIX_INPUT_4_SOURCE        0x756
 +#define ARIZONA_AIF2TX3MIX_INPUT_4_VOLUME        0x757
 +#define ARIZONA_AIF2TX4MIX_INPUT_1_SOURCE        0x758
 +#define ARIZONA_AIF2TX4MIX_INPUT_1_VOLUME        0x759
 +#define ARIZONA_AIF2TX4MIX_INPUT_2_SOURCE        0x75A
 +#define ARIZONA_AIF2TX4MIX_INPUT_2_VOLUME        0x75B
 +#define ARIZONA_AIF2TX4MIX_INPUT_3_SOURCE        0x75C
 +#define ARIZONA_AIF2TX4MIX_INPUT_3_VOLUME        0x75D
 +#define ARIZONA_AIF2TX4MIX_INPUT_4_SOURCE        0x75E
 +#define ARIZONA_AIF2TX4MIX_INPUT_4_VOLUME        0x75F
 +#define ARIZONA_AIF2TX5MIX_INPUT_1_SOURCE        0x760
 +#define ARIZONA_AIF2TX5MIX_INPUT_1_VOLUME        0x761
 +#define ARIZONA_AIF2TX5MIX_INPUT_2_SOURCE        0x762
 +#define ARIZONA_AIF2TX5MIX_INPUT_2_VOLUME        0x763
 +#define ARIZONA_AIF2TX5MIX_INPUT_3_SOURCE        0x764
 +#define ARIZONA_AIF2TX5MIX_INPUT_3_VOLUME        0x765
 +#define ARIZONA_AIF2TX5MIX_INPUT_4_SOURCE        0x766
 +#define ARIZONA_AIF2TX5MIX_INPUT_4_VOLUME        0x767
 +#define ARIZONA_AIF2TX6MIX_INPUT_1_SOURCE        0x768
 +#define ARIZONA_AIF2TX6MIX_INPUT_1_VOLUME        0x769
 +#define ARIZONA_AIF2TX6MIX_INPUT_2_SOURCE        0x76A
 +#define ARIZONA_AIF2TX6MIX_INPUT_2_VOLUME        0x76B
 +#define ARIZONA_AIF2TX6MIX_INPUT_3_SOURCE        0x76C
 +#define ARIZONA_AIF2TX6MIX_INPUT_3_VOLUME        0x76D
 +#define ARIZONA_AIF2TX6MIX_INPUT_4_SOURCE        0x76E
 +#define ARIZONA_AIF2TX6MIX_INPUT_4_VOLUME        0x76F
  #define ARIZONA_AIF3TX1MIX_INPUT_1_SOURCE        0x780
  #define ARIZONA_AIF3TX1MIX_INPUT_1_VOLUME        0x781
  #define ARIZONA_AIF3TX1MIX_INPUT_2_SOURCE        0x782
  #define ARIZONA_FLL2_SYNC_GAIN_MASK              0x003c  /* FLL2_SYNC_GAIN */
  #define ARIZONA_FLL2_SYNC_GAIN_SHIFT                  2  /* FLL2_SYNC_GAIN */
  #define ARIZONA_FLL2_SYNC_GAIN_WIDTH                  4  /* FLL2_SYNC_GAIN */
- #define ARIZONA_FLL2_SYNC_BW_MASK                0x0001  /* FLL2_SYNC_BW */
+ #define ARIZONA_FLL2_SYNC_BW                     0x0001  /* FLL2_SYNC_BW */
  #define ARIZONA_FLL2_SYNC_BW_MASK                0x0001  /* FLL2_SYNC_BW */
  #define ARIZONA_FLL2_SYNC_BW_SHIFT                    0  /* FLL2_SYNC_BW */
  #define ARIZONA_FLL2_SYNC_BW_WIDTH                    1  /* FLL2_SYNC_BW */
  #define ARIZONA_IN_VI_RAMP_SHIFT                      0  /* IN_VI_RAMP - [2:0] */
  #define ARIZONA_IN_VI_RAMP_WIDTH                      3  /* IN_VI_RAMP - [2:0] */
  
 +/*
 + * R780 (0x30C) - HPF Control
 + */
 +#define ARIZONA_IN_HPF_CUT_MASK                  0x0007  /* IN_HPF_CUT [2:0] */
 +#define ARIZONA_IN_HPF_CUT_SHIFT                      0  /* IN_HPF_CUT [2:0] */
 +#define ARIZONA_IN_HPF_CUT_WIDTH                      3  /* IN_HPF_CUT [2:0] */
 +
  /*
   * R784 (0x310) - IN1L Control
   */
 +#define ARIZONA_IN1L_HPF_MASK                    0x8000  /* IN1L_HPF - [15] */
 +#define ARIZONA_IN1L_HPF_SHIFT                       15  /* IN1L_HPF - [15] */
 +#define ARIZONA_IN1L_HPF_WIDTH                        1  /* IN1L_HPF - [15] */
  #define ARIZONA_IN1_OSR_MASK                     0x6000  /* IN1_OSR - [14:13] */
  #define ARIZONA_IN1_OSR_SHIFT                        13  /* IN1_OSR - [14:13] */
  #define ARIZONA_IN1_OSR_WIDTH                         2  /* IN1_OSR - [14:13] */
  /*
   * R788 (0x314) - IN1R Control
   */
 +#define ARIZONA_IN1R_HPF_MASK                    0x8000  /* IN1R_HPF - [15] */
 +#define ARIZONA_IN1R_HPF_SHIFT                       15  /* IN1R_HPF - [15] */
 +#define ARIZONA_IN1R_HPF_WIDTH                        1  /* IN1R_HPF - [15] */
  #define ARIZONA_IN1R_PGA_VOL_MASK                0x00FE  /* IN1R_PGA_VOL - [7:1] */
  #define ARIZONA_IN1R_PGA_VOL_SHIFT                    1  /* IN1R_PGA_VOL - [7:1] */
  #define ARIZONA_IN1R_PGA_VOL_WIDTH                    7  /* IN1R_PGA_VOL - [7:1] */
  /*
   * R792 (0x318) - IN2L Control
   */
 +#define ARIZONA_IN2L_HPF_MASK                    0x8000  /* IN2L_HPF - [15] */
 +#define ARIZONA_IN2L_HPF_SHIFT                       15  /* IN2L_HPF - [15] */
 +#define ARIZONA_IN2L_HPF_WIDTH                        1  /* IN2L_HPF - [15] */
  #define ARIZONA_IN2_OSR_MASK                     0x6000  /* IN2_OSR - [14:13] */
  #define ARIZONA_IN2_OSR_SHIFT                        13  /* IN2_OSR - [14:13] */
  #define ARIZONA_IN2_OSR_WIDTH                         2  /* IN2_OSR - [14:13] */
  /*
   * R796 (0x31C) - IN2R Control
   */
 +#define ARIZONA_IN2R_HPF_MASK                    0x8000  /* IN2R_HPF - [15] */
 +#define ARIZONA_IN2R_HPF_SHIFT                       15  /* IN2R_HPF - [15] */
 +#define ARIZONA_IN2R_HPF_WIDTH                        1  /* IN2R_HPF - [15] */
  #define ARIZONA_IN2R_PGA_VOL_MASK                0x00FE  /* IN2R_PGA_VOL - [7:1] */
  #define ARIZONA_IN2R_PGA_VOL_SHIFT                    1  /* IN2R_PGA_VOL - [7:1] */
  #define ARIZONA_IN2R_PGA_VOL_WIDTH                    7  /* IN2R_PGA_VOL - [7:1] */
  /*
   * R800 (0x320) - IN3L Control
   */
 +#define ARIZONA_IN3L_HPF_MASK                    0x8000  /* IN3L_HPF - [15] */
 +#define ARIZONA_IN3L_HPF_SHIFT                       15  /* IN3L_HPF - [15] */
 +#define ARIZONA_IN3L_HPF_WIDTH                        1  /* IN3L_HPF - [15] */
  #define ARIZONA_IN3_OSR_MASK                     0x6000  /* IN3_OSR - [14:13] */
  #define ARIZONA_IN3_OSR_SHIFT                        13  /* IN3_OSR - [14:13] */
  #define ARIZONA_IN3_OSR_WIDTH                         2  /* IN3_OSR - [14:13] */
  /*
   * R804 (0x324) - IN3R Control
   */
 +#define ARIZONA_IN3R_HPF_MASK                    0x8000  /* IN3R_HPF - [15] */
 +#define ARIZONA_IN3R_HPF_SHIFT                       15  /* IN3R_HPF - [15] */
 +#define ARIZONA_IN3R_HPF_WIDTH                        1  /* IN3R_HPF - [15] */
  #define ARIZONA_IN3R_PGA_VOL_MASK                0x00FE  /* IN3R_PGA_VOL - [7:1] */
  #define ARIZONA_IN3R_PGA_VOL_SHIFT                    1  /* IN3R_PGA_VOL - [7:1] */
  #define ARIZONA_IN3R_PGA_VOL_WIDTH                    7  /* IN3R_PGA_VOL - [7:1] */
  /*
   * R808 (0x328) - IN4 Control
   */
 +#define ARIZONA_IN4L_HPF_MASK                    0x8000  /* IN4L_HPF - [15] */
 +#define ARIZONA_IN4L_HPF_SHIFT                       15  /* IN4L_HPF - [15] */
 +#define ARIZONA_IN4L_HPF_WIDTH                        1  /* IN4L_HPF - [15] */
  #define ARIZONA_IN4_OSR_MASK                     0x6000  /* IN4_OSR - [14:13] */
  #define ARIZONA_IN4_OSR_SHIFT                        13  /* IN4_OSR - [14:13] */
  #define ARIZONA_IN4_OSR_WIDTH                         2  /* IN4_OSR - [14:13] */
  #define ARIZONA_IN4L_DMIC_DLY_SHIFT                   0  /* IN4L_DMIC_DLY - [5:0] */
  #define ARIZONA_IN4L_DMIC_DLY_WIDTH                   6  /* IN4L_DMIC_DLY - [5:0] */
  
 +/*
 + * R812 (0x32C) - IN4R Control
 + */
 +#define ARIZONA_IN4R_HPF_MASK                    0x8000  /* IN4R_HPF - [15] */
 +#define ARIZONA_IN4R_HPF_SHIFT                       15  /* IN4R_HPF - [15] */
 +#define ARIZONA_IN4R_HPF_WIDTH                        1  /* IN4R_HPF - [15] */
 +
  /*
   * R813 (0x32D) - ADC Digital Volume 4R
   */
  #define ARIZONA_AIF2TX2_SLOT_SHIFT                    0  /* AIF2TX2_SLOT - [5:0] */
  #define ARIZONA_AIF2TX2_SLOT_WIDTH                    6  /* AIF2TX2_SLOT - [5:0] */
  
 +/*
 + * R1355 (0x54B) - AIF2 Frame Ctrl 5
 + */
 +#define ARIZONA_AIF2TX3_SLOT_MASK                0x003F  /* AIF2TX3_SLOT - [5:0] */
 +#define ARIZONA_AIF2TX3_SLOT_SHIFT                    0  /* AIF2TX3_SLOT - [5:0] */
 +#define ARIZONA_AIF2TX3_SLOT_WIDTH                    6  /* AIF2TX3_SLOT - [5:0] */
 +
 +/*
 + * R1356 (0x54C) - AIF2 Frame Ctrl 6
 + */
 +#define ARIZONA_AIF2TX4_SLOT_MASK                0x003F  /* AIF2TX4_SLOT - [5:0] */
 +#define ARIZONA_AIF2TX4_SLOT_SHIFT                    0  /* AIF2TX4_SLOT - [5:0] */
 +#define ARIZONA_AIF2TX4_SLOT_WIDTH                    6  /* AIF2TX4_SLOT - [5:0] */
 +
 +
 +/*
 + * R1357 (0x54D) - AIF2 Frame Ctrl 7
 + */
 +#define ARIZONA_AIF2TX5_SLOT_MASK                0x003F  /* AIF2TX5_SLOT - [5:0] */
 +#define ARIZONA_AIF2TX5_SLOT_SHIFT                    0  /* AIF2TX5_SLOT - [5:0] */
 +#define ARIZONA_AIF2TX5_SLOT_WIDTH                    6  /* AIF2TX5_SLOT - [5:0] */
 +
 +/*
 + * R1358 (0x54E) - AIF2 Frame Ctrl 8
 + */
 +#define ARIZONA_AIF2TX6_SLOT_MASK                0x003F  /* AIF2TX6_SLOT - [5:0] */
 +#define ARIZONA_AIF2TX6_SLOT_SHIFT                    0  /* AIF2TX6_SLOT - [5:0] */
 +#define ARIZONA_AIF2TX6_SLOT_WIDTH                    6  /* AIF2TX6_SLOT - [5:0] */
 +
  /*
   * R1361 (0x551) - AIF2 Frame Ctrl 11
   */
  #define ARIZONA_AIF2RX2_SLOT_SHIFT                    0  /* AIF2RX2_SLOT - [5:0] */
  #define ARIZONA_AIF2RX2_SLOT_WIDTH                    6  /* AIF2RX2_SLOT - [5:0] */
  
 +/*
 + * R1363 (0x553) - AIF2 Frame Ctrl 13
 + */
 +#define ARIZONA_AIF2RX3_SLOT_MASK                0x003F  /* AIF2RX3_SLOT - [5:0] */
 +#define ARIZONA_AIF2RX3_SLOT_SHIFT                    0  /* AIF2RX3_SLOT - [5:0] */
 +#define ARIZONA_AIF2RX3_SLOT_WIDTH                    6  /* AIF2RX3_SLOT - [5:0] */
 +
 +/*
 + * R1364 (0x554) - AIF2 Frame Ctrl 14
 + */
 +#define ARIZONA_AIF2RX4_SLOT_MASK                0x003F  /* AIF2RX4_SLOT - [5:0] */
 +#define ARIZONA_AIF2RX4_SLOT_SHIFT                    0  /* AIF2RX4_SLOT - [5:0] */
 +#define ARIZONA_AIF2RX4_SLOT_WIDTH                    6  /* AIF2RX4_SLOT - [5:0] */
 +
 +/*
 + * R1365 (0x555) - AIF2 Frame Ctrl 15
 + */
 +#define ARIZONA_AIF2RX5_SLOT_MASK                0x003F  /* AIF2RX5_SLOT - [5:0] */
 +#define ARIZONA_AIF2RX5_SLOT_SHIFT                    0  /* AIF2RX5_SLOT - [5:0] */
 +#define ARIZONA_AIF2RX5_SLOT_WIDTH                    6  /* AIF2RX5_SLOT - [5:0] */
 +
 +/*
 + * R1366 (0x556) - AIF2 Frame Ctrl 16
 + */
 +#define ARIZONA_AIF2RX6_SLOT_MASK                0x003F  /* AIF2RX6_SLOT - [5:0] */
 +#define ARIZONA_AIF2RX6_SLOT_SHIFT                    0  /* AIF2RX6_SLOT - [5:0] */
 +#define ARIZONA_AIF2RX6_SLOT_WIDTH                    6  /* AIF2RX6_SLOT - [5:0] */
 +
  /*
   * R1369 (0x559) - AIF2 Tx Enables
   */
 +#define ARIZONA_AIF2TX6_ENA                      0x0020  /* AIF2TX6_ENA */
 +#define ARIZONA_AIF2TX6_ENA_MASK                 0x0020  /* AIF2TX6_ENA */
 +#define ARIZONA_AIF2TX6_ENA_SHIFT                     5  /* AIF2TX6_ENA */
 +#define ARIZONA_AIF2TX6_ENA_WIDTH                     1  /* AIF2TX6_ENA */
 +#define ARIZONA_AIF2TX5_ENA                      0x0010  /* AIF2TX5_ENA */
 +#define ARIZONA_AIF2TX5_ENA_MASK                 0x0010  /* AIF2TX5_ENA */
 +#define ARIZONA_AIF2TX5_ENA_SHIFT                     4  /* AIF2TX5_ENA */
 +#define ARIZONA_AIF2TX5_ENA_WIDTH                     1  /* AIF2TX5_ENA */
 +#define ARIZONA_AIF2TX4_ENA                      0x0008  /* AIF2TX4_ENA */
 +#define ARIZONA_AIF2TX4_ENA_MASK                 0x0008  /* AIF2TX4_ENA */
 +#define ARIZONA_AIF2TX4_ENA_SHIFT                     3  /* AIF2TX4_ENA */
 +#define ARIZONA_AIF2TX4_ENA_WIDTH                     1  /* AIF2TX4_ENA */
 +#define ARIZONA_AIF2TX3_ENA                      0x0004  /* AIF2TX3_ENA */
 +#define ARIZONA_AIF2TX3_ENA_MASK                 0x0004  /* AIF2TX3_ENA */
 +#define ARIZONA_AIF2TX3_ENA_SHIFT                     2  /* AIF2TX3_ENA */
 +#define ARIZONA_AIF2TX3_ENA_WIDTH                     1  /* AIF2TX3_ENA */
  #define ARIZONA_AIF2TX2_ENA                      0x0002  /* AIF2TX2_ENA */
  #define ARIZONA_AIF2TX2_ENA_MASK                 0x0002  /* AIF2TX2_ENA */
  #define ARIZONA_AIF2TX2_ENA_SHIFT                     1  /* AIF2TX2_ENA */
  /*
   * R1370 (0x55A) - AIF2 Rx Enables
   */
 +#define ARIZONA_AIF2RX6_ENA                      0x0020  /* AIF2RX6_ENA */
 +#define ARIZONA_AIF2RX6_ENA_MASK                 0x0020  /* AIF2RX6_ENA */
 +#define ARIZONA_AIF2RX6_ENA_SHIFT                     5  /* AIF2RX6_ENA */
 +#define ARIZONA_AIF2RX6_ENA_WIDTH                     1  /* AIF2RX6_ENA */
 +#define ARIZONA_AIF2RX5_ENA                      0x0010  /* AIF2RX5_ENA */
 +#define ARIZONA_AIF2RX5_ENA_MASK                 0x0010  /* AIF2RX5_ENA */
 +#define ARIZONA_AIF2RX5_ENA_SHIFT                     4  /* AIF2RX5_ENA */
 +#define ARIZONA_AIF2RX5_ENA_WIDTH                     1  /* AIF2RX5_ENA */
 +#define ARIZONA_AIF2RX4_ENA                      0x0008  /* AIF2RX4_ENA */
 +#define ARIZONA_AIF2RX4_ENA_MASK                 0x0008  /* AIF2RX4_ENA */
 +#define ARIZONA_AIF2RX4_ENA_SHIFT                     3  /* AIF2RX4_ENA */
 +#define ARIZONA_AIF2RX4_ENA_WIDTH                     1  /* AIF2RX4_ENA */
 +#define ARIZONA_AIF2RX3_ENA                      0x0004  /* AIF2RX3_ENA */
 +#define ARIZONA_AIF2RX3_ENA_MASK                 0x0004  /* AIF2RX3_ENA */
 +#define ARIZONA_AIF2RX3_ENA_SHIFT                     2  /* AIF2RX3_ENA */
 +#define ARIZONA_AIF2RX3_ENA_WIDTH                     1  /* AIF2RX3_ENA */
  #define ARIZONA_AIF2RX2_ENA                      0x0002  /* AIF2RX2_ENA */
  #define ARIZONA_AIF2RX2_ENA_MASK                 0x0002  /* AIF2RX2_ENA */
  #define ARIZONA_AIF2RX2_ENA_SHIFT                     1  /* AIF2RX2_ENA */
index 2bf0d237e0a239c97f38119daa6ad293a02390ea,fea991031be18a05eab28e4922b10a2e472b5ea9..eb9f5d4d8928aee386cebfb0fbeddd0ed74654bc
@@@ -292,10 -292,6 +292,10 @@@ const char *arizona_mixer_texts[ARIZONA
        "AIF1RX8",
        "AIF2RX1",
        "AIF2RX2",
 +      "AIF2RX3",
 +      "AIF2RX4",
 +      "AIF2RX5",
 +      "AIF2RX6",
        "AIF3RX1",
        "AIF3RX2",
        "SLIMRX1",
@@@ -399,10 -395,6 +399,10 @@@ int arizona_mixer_values[ARIZONA_NUM_MI
        0x27,
        0x28,  /* AIF2RX1 */
        0x29,
 +      0x2a,
 +      0x2b,
 +      0x2c,
 +      0x2d,
        0x30,  /* AIF3RX1 */
        0x31,
        0x38,  /* SLIMRX1 */
@@@ -568,16 -560,6 +568,16 @@@ const struct soc_enum arizona_ng_hold 
                        4, arizona_ng_hold_text);
  EXPORT_SYMBOL_GPL(arizona_ng_hold);
  
 +static const char * const arizona_in_hpf_cut_text[] = {
 +      "2.5Hz", "5Hz", "10Hz", "20Hz", "40Hz"
 +};
 +
 +const struct soc_enum arizona_in_hpf_cut_enum =
 +      SOC_ENUM_SINGLE(ARIZONA_HPF_CONTROL, ARIZONA_IN_HPF_CUT_SHIFT,
 +                      ARRAY_SIZE(arizona_in_hpf_cut_text),
 +                      arizona_in_hpf_cut_text);
 +EXPORT_SYMBOL_GPL(arizona_in_hpf_cut_enum);
 +
  static const char * const arizona_in_dmic_osr_text[] = {
        "1.536MHz", "3.072MHz", "6.144MHz",
  };
@@@ -1546,6 -1528,8 +1546,8 @@@ static void arizona_enable_fll(struct a
        /* Clear any pending completions */
        try_wait_for_completion(&fll->ok);
  
+       regmap_update_bits(arizona->regmap, fll->base + 1,
+                          ARIZONA_FLL1_FREERUN, 0);
        regmap_update_bits(arizona->regmap, fll->base + 1,
                           ARIZONA_FLL1_ENA, ARIZONA_FLL1_ENA);
        if (use_sync)
@@@ -1564,6 -1548,8 +1566,8 @@@ static void arizona_disable_fll(struct 
        struct arizona *arizona = fll->arizona;
        bool change;
  
+       regmap_update_bits(arizona->regmap, fll->base + 1,
+                          ARIZONA_FLL1_FREERUN, ARIZONA_FLL1_FREERUN);
        regmap_update_bits_check(arizona->regmap, fll->base + 1,
                                 ARIZONA_FLL1_ENA, 0, &change);
        regmap_update_bits(arizona->regmap, fll->base + 0x11,
index e248e1570de4a0e17d910077dbaff1676512ec61,c3c7396a618115d06171bb87314b363cc8ac9f6d..c6dbc1ddaf7fb752bb4ec0b2148c2cb3e93802e3
@@@ -37,6 -37,47 +37,47 @@@ struct wm5110_priv 
        struct arizona_fll fll[2];
  };
  
+ static const struct reg_default wm5110_sysclk_revd_patch[] = {
+       { 0x3093, 0x1001 },
+       { 0x30E3, 0x1301 },
+       { 0x3133, 0x1201 },
+       { 0x3183, 0x1501 },
+       { 0x31D3, 0x1401 },
+ };
+ static int wm5110_sysclk_ev(struct snd_soc_dapm_widget *w,
+                           struct snd_kcontrol *kcontrol, int event)
+ {
+       struct snd_soc_codec *codec = w->codec;
+       struct arizona *arizona = dev_get_drvdata(codec->dev->parent);
+       struct regmap *regmap = codec->control_data;
+       const struct reg_default *patch = NULL;
+       int i, patch_size;
+       switch (arizona->rev) {
+       case 3:
+               patch = wm5110_sysclk_revd_patch;
+               patch_size = ARRAY_SIZE(wm5110_sysclk_revd_patch);
+               break;
+       default:
+               return 0;
+       }
+       switch (event) {
+       case SND_SOC_DAPM_POST_PMU:
+               if (patch)
+                       for (i = 0; i < patch_size; i++)
+                               regmap_write(regmap, patch[i].reg,
+                                            patch[i].def);
+               break;
+       default:
+               break;
+       }
+       return 0;
+ }
  static DECLARE_TLV_DB_SCALE(ana_tlv, 0, 100, 0);
  static DECLARE_TLV_DB_SCALE(eq_tlv, -1200, 100, 0);
  static DECLARE_TLV_DB_SCALE(digital_tlv, -6400, 50, 0);
@@@ -76,25 -117,6 +117,25 @@@ SOC_SINGLE_RANGE_TLV("IN3L Volume", ARI
  SOC_SINGLE_RANGE_TLV("IN3R Volume", ARIZONA_IN3R_CONTROL,
                     ARIZONA_IN3R_PGA_VOL_SHIFT, 0x40, 0x5f, 0, ana_tlv),
  
 +SOC_ENUM("IN HPF Cutoff Frequency", arizona_in_hpf_cut_enum),
 +
 +SOC_SINGLE("IN1L HPF Switch", ARIZONA_IN1L_CONTROL,
 +         ARIZONA_IN1L_HPF_SHIFT, 1, 0),
 +SOC_SINGLE("IN1R HPF Switch", ARIZONA_IN1R_CONTROL,
 +         ARIZONA_IN1R_HPF_SHIFT, 1, 0),
 +SOC_SINGLE("IN2L HPF Switch", ARIZONA_IN2L_CONTROL,
 +         ARIZONA_IN2L_HPF_SHIFT, 1, 0),
 +SOC_SINGLE("IN2R HPF Switch", ARIZONA_IN2R_CONTROL,
 +         ARIZONA_IN2R_HPF_SHIFT, 1, 0),
 +SOC_SINGLE("IN3L HPF Switch", ARIZONA_IN3L_CONTROL,
 +         ARIZONA_IN3L_HPF_SHIFT, 1, 0),
 +SOC_SINGLE("IN3R HPF Switch", ARIZONA_IN3R_CONTROL,
 +         ARIZONA_IN3R_HPF_SHIFT, 1, 0),
 +SOC_SINGLE("IN4L HPF Switch", ARIZONA_IN4L_CONTROL,
 +         ARIZONA_IN4L_HPF_SHIFT, 1, 0),
 +SOC_SINGLE("IN4R HPF Switch", ARIZONA_IN4R_CONTROL,
 +         ARIZONA_IN4R_HPF_SHIFT, 1, 0),
 +
  SOC_SINGLE_TLV("IN1L Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_1L,
               ARIZONA_IN1L_DIG_VOL_SHIFT, 0xbf, 0, digital_tlv),
  SOC_SINGLE_TLV("IN1R Digital Volume", ARIZONA_ADC_DIGITAL_VOLUME_1R,
@@@ -120,13 -142,13 +161,13 @@@ ARIZONA_MIXER_CONTROLS("EQ2", ARIZONA_E
  ARIZONA_MIXER_CONTROLS("EQ3", ARIZONA_EQ3MIX_INPUT_1_SOURCE),
  ARIZONA_MIXER_CONTROLS("EQ4", ARIZONA_EQ4MIX_INPUT_1_SOURCE),
  
- SND_SOC_BYTES_MASK("EQ1 Coefficeints", ARIZONA_EQ1_1, 21,
+ SND_SOC_BYTES_MASK("EQ1 Coefficients", ARIZONA_EQ1_1, 21,
                   ARIZONA_EQ1_ENA_MASK),
- SND_SOC_BYTES_MASK("EQ2 Coefficeints", ARIZONA_EQ2_1, 21,
+ SND_SOC_BYTES_MASK("EQ2 Coefficients", ARIZONA_EQ2_1, 21,
                   ARIZONA_EQ2_ENA_MASK),
- SND_SOC_BYTES_MASK("EQ3 Coefficeints", ARIZONA_EQ3_1, 21,
+ SND_SOC_BYTES_MASK("EQ3 Coefficients", ARIZONA_EQ3_1, 21,
                   ARIZONA_EQ3_ENA_MASK),
- SND_SOC_BYTES_MASK("EQ4 Coefficeints", ARIZONA_EQ4_1, 21,
+ SND_SOC_BYTES_MASK("EQ4 Coefficients", ARIZONA_EQ4_1, 21,
                   ARIZONA_EQ4_ENA_MASK),
  
  SOC_SINGLE_TLV("EQ1 B1 Volume", ARIZONA_EQ1_1, ARIZONA_EQ1_B1_GAIN_SHIFT,
@@@ -321,10 -343,6 +362,10 @@@ ARIZONA_MIXER_CONTROLS("AIF1TX8", ARIZO
  
  ARIZONA_MIXER_CONTROLS("AIF2TX1", ARIZONA_AIF2TX1MIX_INPUT_1_SOURCE),
  ARIZONA_MIXER_CONTROLS("AIF2TX2", ARIZONA_AIF2TX2MIX_INPUT_1_SOURCE),
 +ARIZONA_MIXER_CONTROLS("AIF2TX3", ARIZONA_AIF2TX3MIX_INPUT_1_SOURCE),
 +ARIZONA_MIXER_CONTROLS("AIF2TX4", ARIZONA_AIF2TX4MIX_INPUT_1_SOURCE),
 +ARIZONA_MIXER_CONTROLS("AIF2TX5", ARIZONA_AIF2TX5MIX_INPUT_1_SOURCE),
 +ARIZONA_MIXER_CONTROLS("AIF2TX6", ARIZONA_AIF2TX6MIX_INPUT_1_SOURCE),
  
  ARIZONA_MIXER_CONTROLS("AIF3TX1", ARIZONA_AIF3TX1MIX_INPUT_1_SOURCE),
  ARIZONA_MIXER_CONTROLS("AIF3TX2", ARIZONA_AIF3TX2MIX_INPUT_1_SOURCE),
@@@ -384,10 -402,6 +425,10 @@@ ARIZONA_MIXER_ENUMS(AIF1TX8, ARIZONA_AI
  
  ARIZONA_MIXER_ENUMS(AIF2TX1, ARIZONA_AIF2TX1MIX_INPUT_1_SOURCE);
  ARIZONA_MIXER_ENUMS(AIF2TX2, ARIZONA_AIF2TX2MIX_INPUT_1_SOURCE);
 +ARIZONA_MIXER_ENUMS(AIF2TX3, ARIZONA_AIF2TX3MIX_INPUT_1_SOURCE);
 +ARIZONA_MIXER_ENUMS(AIF2TX4, ARIZONA_AIF2TX4MIX_INPUT_1_SOURCE);
 +ARIZONA_MIXER_ENUMS(AIF2TX5, ARIZONA_AIF2TX5MIX_INPUT_1_SOURCE);
 +ARIZONA_MIXER_ENUMS(AIF2TX6, ARIZONA_AIF2TX6MIX_INPUT_1_SOURCE);
  
  ARIZONA_MIXER_ENUMS(AIF3TX1, ARIZONA_AIF3TX1MIX_INPUT_1_SOURCE);
  ARIZONA_MIXER_ENUMS(AIF3TX2, ARIZONA_AIF3TX2MIX_INPUT_1_SOURCE);
@@@ -427,7 -441,7 +468,7 @@@ static const struct snd_kcontrol_new wm
  
  static const struct snd_soc_dapm_widget wm5110_dapm_widgets[] = {
  SND_SOC_DAPM_SUPPLY("SYSCLK", ARIZONA_SYSTEM_CLOCK_1, ARIZONA_SYSCLK_ENA_SHIFT,
-                   0, NULL, 0),
+                   0, wm5110_sysclk_ev, SND_SOC_DAPM_POST_PMU),
  SND_SOC_DAPM_SUPPLY("ASYNCCLK", ARIZONA_ASYNC_CLOCK_1,
                    ARIZONA_ASYNC_CLK_ENA_SHIFT, 0, NULL, 0),
  SND_SOC_DAPM_SUPPLY("OPCLK", ARIZONA_OUTPUT_SYSTEM_CLOCK,
@@@ -588,27 -602,11 +629,27 @@@ SND_SOC_DAPM_AIF_OUT("AIF2TX1", NULL, 0
                     ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX1_ENA_SHIFT, 0),
  SND_SOC_DAPM_AIF_OUT("AIF2TX2", NULL, 0,
                     ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX2_ENA_SHIFT, 0),
 +SND_SOC_DAPM_AIF_OUT("AIF2TX3", NULL, 0,
 +                   ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX3_ENA_SHIFT, 0),
 +SND_SOC_DAPM_AIF_OUT("AIF2TX4", NULL, 0,
 +                   ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX4_ENA_SHIFT, 0),
 +SND_SOC_DAPM_AIF_OUT("AIF2TX5", NULL, 0,
 +                   ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX5_ENA_SHIFT, 0),
 +SND_SOC_DAPM_AIF_OUT("AIF2TX6", NULL, 0,
 +                   ARIZONA_AIF2_TX_ENABLES, ARIZONA_AIF2TX6_ENA_SHIFT, 0),
  
  SND_SOC_DAPM_AIF_IN("AIF2RX1", NULL, 0,
                    ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX1_ENA_SHIFT, 0),
  SND_SOC_DAPM_AIF_IN("AIF2RX2", NULL, 0,
                    ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX2_ENA_SHIFT, 0),
 +SND_SOC_DAPM_AIF_IN("AIF2RX3", NULL, 0,
 +                  ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX3_ENA_SHIFT, 0),
 +SND_SOC_DAPM_AIF_IN("AIF2RX4", NULL, 0,
 +                  ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX4_ENA_SHIFT, 0),
 +SND_SOC_DAPM_AIF_IN("AIF2RX5", NULL, 0,
 +                  ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX5_ENA_SHIFT, 0),
 +SND_SOC_DAPM_AIF_IN("AIF2RX6", NULL, 0,
 +                  ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX6_ENA_SHIFT, 0),
  
  SND_SOC_DAPM_AIF_IN("SLIMRX1", NULL, 0,
                    ARIZONA_SLIMBUS_RX_CHANNEL_ENABLE,
@@@ -746,10 -744,6 +787,10 @@@ ARIZONA_MIXER_WIDGETS(AIF1TX8, "AIF1TX8
  
  ARIZONA_MIXER_WIDGETS(AIF2TX1, "AIF2TX1"),
  ARIZONA_MIXER_WIDGETS(AIF2TX2, "AIF2TX2"),
 +ARIZONA_MIXER_WIDGETS(AIF2TX3, "AIF2TX3"),
 +ARIZONA_MIXER_WIDGETS(AIF2TX4, "AIF2TX4"),
 +ARIZONA_MIXER_WIDGETS(AIF2TX5, "AIF2TX5"),
 +ARIZONA_MIXER_WIDGETS(AIF2TX6, "AIF2TX6"),
  
  ARIZONA_MIXER_WIDGETS(AIF3TX1, "AIF3TX1"),
  ARIZONA_MIXER_WIDGETS(AIF3TX2, "AIF3TX2"),
@@@ -811,10 -805,6 +852,10 @@@ SND_SOC_DAPM_OUTPUT("MICSUPP")
        { name, "AIF1RX8", "AIF1RX8" }, \
        { name, "AIF2RX1", "AIF2RX1" }, \
        { name, "AIF2RX2", "AIF2RX2" }, \
 +      { name, "AIF2RX3", "AIF2RX3" }, \
 +      { name, "AIF2RX4", "AIF2RX4" }, \
 +      { name, "AIF2RX5", "AIF2RX5" }, \
 +      { name, "AIF2RX6", "AIF2RX6" }, \
        { name, "AIF3RX1", "AIF3RX1" }, \
        { name, "AIF3RX2", "AIF3RX2" }, \
        { name, "SLIMRX1", "SLIMRX1" }, \
@@@ -912,17 -902,9 +953,17 @@@ static const struct snd_soc_dapm_route 
  
        { "AIF2 Capture", NULL, "AIF2TX1" },
        { "AIF2 Capture", NULL, "AIF2TX2" },
 +      { "AIF2 Capture", NULL, "AIF2TX3" },
 +      { "AIF2 Capture", NULL, "AIF2TX4" },
 +      { "AIF2 Capture", NULL, "AIF2TX5" },
 +      { "AIF2 Capture", NULL, "AIF2TX6" },
  
        { "AIF2RX1", NULL, "AIF2 Playback" },
        { "AIF2RX2", NULL, "AIF2 Playback" },
 +      { "AIF2RX3", NULL, "AIF2 Playback" },
 +      { "AIF2RX4", NULL, "AIF2 Playback" },
 +      { "AIF2RX5", NULL, "AIF2 Playback" },
 +      { "AIF2RX6", NULL, "AIF2 Playback" },
  
        { "AIF3 Capture", NULL, "AIF3TX1" },
        { "AIF3 Capture", NULL, "AIF3TX2" },
  
        ARIZONA_MIXER_ROUTES("AIF2TX1", "AIF2TX1"),
        ARIZONA_MIXER_ROUTES("AIF2TX2", "AIF2TX2"),
 +      ARIZONA_MIXER_ROUTES("AIF2TX3", "AIF2TX3"),
 +      ARIZONA_MIXER_ROUTES("AIF2TX4", "AIF2TX4"),
 +      ARIZONA_MIXER_ROUTES("AIF2TX5", "AIF2TX5"),
 +      ARIZONA_MIXER_ROUTES("AIF2TX6", "AIF2TX6"),
  
        ARIZONA_MIXER_ROUTES("AIF3TX1", "AIF3TX1"),
        ARIZONA_MIXER_ROUTES("AIF3TX2", "AIF3TX2"),
        ARIZONA_MUX_ROUTES("ASRC2L", "ASRC2L"),
        ARIZONA_MUX_ROUTES("ASRC2R", "ASRC2R"),
  
+       { "AEC Loopback", "HPOUT1L", "OUT1L" },
+       { "AEC Loopback", "HPOUT1R", "OUT1R" },
        { "HPOUT1L", NULL, "OUT1L" },
        { "HPOUT1R", NULL, "OUT1R" },
  
+       { "AEC Loopback", "HPOUT2L", "OUT2L" },
+       { "AEC Loopback", "HPOUT2R", "OUT2R" },
        { "HPOUT2L", NULL, "OUT2L" },
        { "HPOUT2R", NULL, "OUT2R" },
  
+       { "AEC Loopback", "HPOUT3L", "OUT3L" },
+       { "AEC Loopback", "HPOUT3R", "OUT3R" },
        { "HPOUT3L", NULL, "OUT3L" },
        { "HPOUT3R", NULL, "OUT3L" },
  
+       { "AEC Loopback", "SPKOUTL", "OUT4L" },
        { "SPKOUTLN", NULL, "OUT4L" },
        { "SPKOUTLP", NULL, "OUT4L" },
  
+       { "AEC Loopback", "SPKOUTR", "OUT4R" },
        { "SPKOUTRN", NULL, "OUT4R" },
        { "SPKOUTRP", NULL, "OUT4R" },
  
+       { "AEC Loopback", "SPKDAT1L", "OUT5L" },
+       { "AEC Loopback", "SPKDAT1R", "OUT5R" },
        { "SPKDAT1L", NULL, "OUT5L" },
        { "SPKDAT1R", NULL, "OUT5R" },
  
+       { "AEC Loopback", "SPKDAT2L", "OUT6L" },
+       { "AEC Loopback", "SPKDAT2R", "OUT6R" },
        { "SPKDAT2L", NULL, "OUT6L" },
        { "SPKDAT2R", NULL, "OUT6R" },
  
@@@ -1130,14 -1120,14 +1183,14 @@@ static struct snd_soc_dai_driver wm5110
                .playback = {
                        .stream_name = "AIF2 Playback",
                        .channels_min = 1,
 -                      .channels_max = 2,
 +                      .channels_max = 6,
                        .rates = WM5110_RATES,
                        .formats = WM5110_FORMATS,
                },
                .capture = {
                         .stream_name = "AIF2 Capture",
                         .channels_min = 1,
 -                       .channels_max = 2,
 +                       .channels_max = 6,
                         .rates = WM5110_RATES,
                         .formats = WM5110_FORMATS,
                 },