162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * wm2200.c  --  WM2200 ALSA SoC Audio driver
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright 2012 Wolfson Microelectronics plc
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include <linux/module.h>
1162306a36Sopenharmony_ci#include <linux/moduleparam.h>
1262306a36Sopenharmony_ci#include <linux/init.h>
1362306a36Sopenharmony_ci#include <linux/delay.h>
1462306a36Sopenharmony_ci#include <linux/pm.h>
1562306a36Sopenharmony_ci#include <linux/firmware.h>
1662306a36Sopenharmony_ci#include <linux/gcd.h>
1762306a36Sopenharmony_ci#include <linux/gpio.h>
1862306a36Sopenharmony_ci#include <linux/i2c.h>
1962306a36Sopenharmony_ci#include <linux/pm_runtime.h>
2062306a36Sopenharmony_ci#include <linux/regulator/consumer.h>
2162306a36Sopenharmony_ci#include <linux/regulator/fixed.h>
2262306a36Sopenharmony_ci#include <linux/slab.h>
2362306a36Sopenharmony_ci#include <sound/core.h>
2462306a36Sopenharmony_ci#include <sound/pcm.h>
2562306a36Sopenharmony_ci#include <sound/pcm_params.h>
2662306a36Sopenharmony_ci#include <sound/soc.h>
2762306a36Sopenharmony_ci#include <sound/jack.h>
2862306a36Sopenharmony_ci#include <sound/initval.h>
2962306a36Sopenharmony_ci#include <sound/tlv.h>
3062306a36Sopenharmony_ci#include <sound/wm2200.h>
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci#include "wm2200.h"
3362306a36Sopenharmony_ci#include "wm_adsp.h"
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci#define WM2200_DSP_CONTROL_1                   0x00
3662306a36Sopenharmony_ci#define WM2200_DSP_CONTROL_2                   0x02
3762306a36Sopenharmony_ci#define WM2200_DSP_CONTROL_3                   0x03
3862306a36Sopenharmony_ci#define WM2200_DSP_CONTROL_4                   0x04
3962306a36Sopenharmony_ci#define WM2200_DSP_CONTROL_5                   0x06
4062306a36Sopenharmony_ci#define WM2200_DSP_CONTROL_6                   0x07
4162306a36Sopenharmony_ci#define WM2200_DSP_CONTROL_7                   0x08
4262306a36Sopenharmony_ci#define WM2200_DSP_CONTROL_8                   0x09
4362306a36Sopenharmony_ci#define WM2200_DSP_CONTROL_9                   0x0A
4462306a36Sopenharmony_ci#define WM2200_DSP_CONTROL_10                  0x0B
4562306a36Sopenharmony_ci#define WM2200_DSP_CONTROL_11                  0x0C
4662306a36Sopenharmony_ci#define WM2200_DSP_CONTROL_12                  0x0D
4762306a36Sopenharmony_ci#define WM2200_DSP_CONTROL_13                  0x0F
4862306a36Sopenharmony_ci#define WM2200_DSP_CONTROL_14                  0x10
4962306a36Sopenharmony_ci#define WM2200_DSP_CONTROL_15                  0x11
5062306a36Sopenharmony_ci#define WM2200_DSP_CONTROL_16                  0x12
5162306a36Sopenharmony_ci#define WM2200_DSP_CONTROL_17                  0x13
5262306a36Sopenharmony_ci#define WM2200_DSP_CONTROL_18                  0x14
5362306a36Sopenharmony_ci#define WM2200_DSP_CONTROL_19                  0x16
5462306a36Sopenharmony_ci#define WM2200_DSP_CONTROL_20                  0x17
5562306a36Sopenharmony_ci#define WM2200_DSP_CONTROL_21                  0x18
5662306a36Sopenharmony_ci#define WM2200_DSP_CONTROL_22                  0x1A
5762306a36Sopenharmony_ci#define WM2200_DSP_CONTROL_23                  0x1B
5862306a36Sopenharmony_ci#define WM2200_DSP_CONTROL_24                  0x1C
5962306a36Sopenharmony_ci#define WM2200_DSP_CONTROL_25                  0x1E
6062306a36Sopenharmony_ci#define WM2200_DSP_CONTROL_26                  0x20
6162306a36Sopenharmony_ci#define WM2200_DSP_CONTROL_27                  0x21
6262306a36Sopenharmony_ci#define WM2200_DSP_CONTROL_28                  0x22
6362306a36Sopenharmony_ci#define WM2200_DSP_CONTROL_29                  0x23
6462306a36Sopenharmony_ci#define WM2200_DSP_CONTROL_30                  0x24
6562306a36Sopenharmony_ci#define WM2200_DSP_CONTROL_31                  0x26
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci/* The code assumes DCVDD is generated internally */
6862306a36Sopenharmony_ci#define WM2200_NUM_CORE_SUPPLIES 2
6962306a36Sopenharmony_cistatic const char *wm2200_core_supply_names[WM2200_NUM_CORE_SUPPLIES] = {
7062306a36Sopenharmony_ci	"DBVDD",
7162306a36Sopenharmony_ci	"LDOVDD",
7262306a36Sopenharmony_ci};
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci/* codec private data */
7562306a36Sopenharmony_cistruct wm2200_priv {
7662306a36Sopenharmony_ci	struct wm_adsp dsp[2];
7762306a36Sopenharmony_ci	struct regmap *regmap;
7862306a36Sopenharmony_ci	struct device *dev;
7962306a36Sopenharmony_ci	struct snd_soc_component *component;
8062306a36Sopenharmony_ci	struct wm2200_pdata pdata;
8162306a36Sopenharmony_ci	struct regulator_bulk_data core_supplies[WM2200_NUM_CORE_SUPPLIES];
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci	struct completion fll_lock;
8462306a36Sopenharmony_ci	int fll_fout;
8562306a36Sopenharmony_ci	int fll_fref;
8662306a36Sopenharmony_ci	int fll_src;
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci	int rev;
8962306a36Sopenharmony_ci	int sysclk;
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci	unsigned int symmetric_rates:1;
9262306a36Sopenharmony_ci};
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci#define WM2200_DSP_RANGE_BASE (WM2200_MAX_REGISTER + 1)
9562306a36Sopenharmony_ci#define WM2200_DSP_SPACING 12288
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci#define WM2200_DSP1_DM_BASE (WM2200_DSP_RANGE_BASE + (0 * WM2200_DSP_SPACING))
9862306a36Sopenharmony_ci#define WM2200_DSP1_PM_BASE (WM2200_DSP_RANGE_BASE + (1 * WM2200_DSP_SPACING))
9962306a36Sopenharmony_ci#define WM2200_DSP1_ZM_BASE (WM2200_DSP_RANGE_BASE + (2 * WM2200_DSP_SPACING))
10062306a36Sopenharmony_ci#define WM2200_DSP2_DM_BASE (WM2200_DSP_RANGE_BASE + (3 * WM2200_DSP_SPACING))
10162306a36Sopenharmony_ci#define WM2200_DSP2_PM_BASE (WM2200_DSP_RANGE_BASE + (4 * WM2200_DSP_SPACING))
10262306a36Sopenharmony_ci#define WM2200_DSP2_ZM_BASE (WM2200_DSP_RANGE_BASE + (5 * WM2200_DSP_SPACING))
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_cistatic const struct regmap_range_cfg wm2200_ranges[] = {
10562306a36Sopenharmony_ci	{ .name = "DSP1DM", .range_min = WM2200_DSP1_DM_BASE,
10662306a36Sopenharmony_ci	  .range_max = WM2200_DSP1_DM_BASE + 12287,
10762306a36Sopenharmony_ci	  .selector_reg = WM2200_DSP1_CONTROL_3,
10862306a36Sopenharmony_ci	  .selector_mask = WM2200_DSP1_PAGE_BASE_DM_0_MASK,
10962306a36Sopenharmony_ci	  .selector_shift = WM2200_DSP1_PAGE_BASE_DM_0_SHIFT,
11062306a36Sopenharmony_ci	  .window_start = WM2200_DSP1_DM_0, .window_len = 2048, },
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci	{ .name = "DSP1PM", .range_min = WM2200_DSP1_PM_BASE,
11362306a36Sopenharmony_ci	  .range_max = WM2200_DSP1_PM_BASE + 12287,
11462306a36Sopenharmony_ci	  .selector_reg = WM2200_DSP1_CONTROL_2,
11562306a36Sopenharmony_ci	  .selector_mask = WM2200_DSP1_PAGE_BASE_PM_0_MASK,
11662306a36Sopenharmony_ci	  .selector_shift = WM2200_DSP1_PAGE_BASE_PM_0_SHIFT,
11762306a36Sopenharmony_ci	  .window_start = WM2200_DSP1_PM_0, .window_len = 768, },
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci	{ .name = "DSP1ZM", .range_min = WM2200_DSP1_ZM_BASE,
12062306a36Sopenharmony_ci	  .range_max = WM2200_DSP1_ZM_BASE + 2047,
12162306a36Sopenharmony_ci	  .selector_reg = WM2200_DSP1_CONTROL_4,
12262306a36Sopenharmony_ci	  .selector_mask = WM2200_DSP1_PAGE_BASE_ZM_0_MASK,
12362306a36Sopenharmony_ci	  .selector_shift = WM2200_DSP1_PAGE_BASE_ZM_0_SHIFT,
12462306a36Sopenharmony_ci	  .window_start = WM2200_DSP1_ZM_0, .window_len = 1024, },
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_ci	{ .name = "DSP2DM", .range_min = WM2200_DSP2_DM_BASE,
12762306a36Sopenharmony_ci	  .range_max = WM2200_DSP2_DM_BASE + 4095,
12862306a36Sopenharmony_ci	  .selector_reg = WM2200_DSP2_CONTROL_3,
12962306a36Sopenharmony_ci	  .selector_mask = WM2200_DSP2_PAGE_BASE_DM_0_MASK,
13062306a36Sopenharmony_ci	  .selector_shift = WM2200_DSP2_PAGE_BASE_DM_0_SHIFT,
13162306a36Sopenharmony_ci	  .window_start = WM2200_DSP2_DM_0, .window_len = 2048, },
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci	{ .name = "DSP2PM", .range_min = WM2200_DSP2_PM_BASE,
13462306a36Sopenharmony_ci	  .range_max = WM2200_DSP2_PM_BASE + 11287,
13562306a36Sopenharmony_ci	  .selector_reg = WM2200_DSP2_CONTROL_2,
13662306a36Sopenharmony_ci	  .selector_mask = WM2200_DSP2_PAGE_BASE_PM_0_MASK,
13762306a36Sopenharmony_ci	  .selector_shift = WM2200_DSP2_PAGE_BASE_PM_0_SHIFT,
13862306a36Sopenharmony_ci	  .window_start = WM2200_DSP2_PM_0, .window_len = 768, },
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_ci	{ .name = "DSP2ZM", .range_min = WM2200_DSP2_ZM_BASE,
14162306a36Sopenharmony_ci	  .range_max = WM2200_DSP2_ZM_BASE + 2047,
14262306a36Sopenharmony_ci	  .selector_reg = WM2200_DSP2_CONTROL_4,
14362306a36Sopenharmony_ci	  .selector_mask = WM2200_DSP2_PAGE_BASE_ZM_0_MASK,
14462306a36Sopenharmony_ci	  .selector_shift = WM2200_DSP2_PAGE_BASE_ZM_0_SHIFT,
14562306a36Sopenharmony_ci	  .window_start = WM2200_DSP2_ZM_0, .window_len = 1024, },
14662306a36Sopenharmony_ci};
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_cistatic const struct cs_dsp_region wm2200_dsp1_regions[] = {
14962306a36Sopenharmony_ci	{ .type = WMFW_ADSP1_PM, .base = WM2200_DSP1_PM_BASE },
15062306a36Sopenharmony_ci	{ .type = WMFW_ADSP1_DM, .base = WM2200_DSP1_DM_BASE },
15162306a36Sopenharmony_ci	{ .type = WMFW_ADSP1_ZM, .base = WM2200_DSP1_ZM_BASE },
15262306a36Sopenharmony_ci};
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_cistatic const struct cs_dsp_region wm2200_dsp2_regions[] = {
15562306a36Sopenharmony_ci	{ .type = WMFW_ADSP1_PM, .base = WM2200_DSP2_PM_BASE },
15662306a36Sopenharmony_ci	{ .type = WMFW_ADSP1_DM, .base = WM2200_DSP2_DM_BASE },
15762306a36Sopenharmony_ci	{ .type = WMFW_ADSP1_ZM, .base = WM2200_DSP2_ZM_BASE },
15862306a36Sopenharmony_ci};
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_cistatic const struct reg_default wm2200_reg_defaults[] = {
16162306a36Sopenharmony_ci	{ 0x000B, 0x0000 },   /* R11    - Tone Generator 1 */
16262306a36Sopenharmony_ci	{ 0x0102, 0x0000 },   /* R258   - Clocking 3 */
16362306a36Sopenharmony_ci	{ 0x0103, 0x0011 },   /* R259   - Clocking 4 */
16462306a36Sopenharmony_ci	{ 0x0111, 0x0000 },   /* R273   - FLL Control 1 */
16562306a36Sopenharmony_ci	{ 0x0112, 0x0000 },   /* R274   - FLL Control 2 */
16662306a36Sopenharmony_ci	{ 0x0113, 0x0000 },   /* R275   - FLL Control 3 */
16762306a36Sopenharmony_ci	{ 0x0114, 0x0000 },   /* R276   - FLL Control 4 */
16862306a36Sopenharmony_ci	{ 0x0116, 0x0177 },   /* R278   - FLL Control 6 */
16962306a36Sopenharmony_ci	{ 0x0117, 0x0004 },   /* R279   - FLL Control 7 */
17062306a36Sopenharmony_ci	{ 0x0119, 0x0000 },   /* R281   - FLL EFS 1 */
17162306a36Sopenharmony_ci	{ 0x011A, 0x0002 },   /* R282   - FLL EFS 2 */
17262306a36Sopenharmony_ci	{ 0x0200, 0x0000 },   /* R512   - Mic Charge Pump 1 */
17362306a36Sopenharmony_ci	{ 0x0201, 0x03FF },   /* R513   - Mic Charge Pump 2 */
17462306a36Sopenharmony_ci	{ 0x0202, 0x9BDE },   /* R514   - DM Charge Pump 1 */
17562306a36Sopenharmony_ci	{ 0x020C, 0x0000 },   /* R524   - Mic Bias Ctrl 1 */
17662306a36Sopenharmony_ci	{ 0x020D, 0x0000 },   /* R525   - Mic Bias Ctrl 2 */
17762306a36Sopenharmony_ci	{ 0x020F, 0x0000 },   /* R527   - Ear Piece Ctrl 1 */
17862306a36Sopenharmony_ci	{ 0x0210, 0x0000 },   /* R528   - Ear Piece Ctrl 2 */
17962306a36Sopenharmony_ci	{ 0x0301, 0x0000 },   /* R769   - Input Enables */
18062306a36Sopenharmony_ci	{ 0x0302, 0x2240 },   /* R770   - IN1L Control */
18162306a36Sopenharmony_ci	{ 0x0303, 0x0040 },   /* R771   - IN1R Control */
18262306a36Sopenharmony_ci	{ 0x0304, 0x2240 },   /* R772   - IN2L Control */
18362306a36Sopenharmony_ci	{ 0x0305, 0x0040 },   /* R773   - IN2R Control */
18462306a36Sopenharmony_ci	{ 0x0306, 0x2240 },   /* R774   - IN3L Control */
18562306a36Sopenharmony_ci	{ 0x0307, 0x0040 },   /* R775   - IN3R Control */
18662306a36Sopenharmony_ci	{ 0x030A, 0x0000 },   /* R778   - RXANC_SRC */
18762306a36Sopenharmony_ci	{ 0x030B, 0x0022 },   /* R779   - Input Volume Ramp */
18862306a36Sopenharmony_ci	{ 0x030C, 0x0180 },   /* R780   - ADC Digital Volume 1L */
18962306a36Sopenharmony_ci	{ 0x030D, 0x0180 },   /* R781   - ADC Digital Volume 1R */
19062306a36Sopenharmony_ci	{ 0x030E, 0x0180 },   /* R782   - ADC Digital Volume 2L */
19162306a36Sopenharmony_ci	{ 0x030F, 0x0180 },   /* R783   - ADC Digital Volume 2R */
19262306a36Sopenharmony_ci	{ 0x0310, 0x0180 },   /* R784   - ADC Digital Volume 3L */
19362306a36Sopenharmony_ci	{ 0x0311, 0x0180 },   /* R785   - ADC Digital Volume 3R */
19462306a36Sopenharmony_ci	{ 0x0400, 0x0000 },   /* R1024  - Output Enables */
19562306a36Sopenharmony_ci	{ 0x0401, 0x0000 },   /* R1025  - DAC Volume Limit 1L */
19662306a36Sopenharmony_ci	{ 0x0402, 0x0000 },   /* R1026  - DAC Volume Limit 1R */
19762306a36Sopenharmony_ci	{ 0x0403, 0x0000 },   /* R1027  - DAC Volume Limit 2L */
19862306a36Sopenharmony_ci	{ 0x0404, 0x0000 },   /* R1028  - DAC Volume Limit 2R */
19962306a36Sopenharmony_ci	{ 0x0409, 0x0000 },   /* R1033  - DAC AEC Control 1 */
20062306a36Sopenharmony_ci	{ 0x040A, 0x0022 },   /* R1034  - Output Volume Ramp */
20162306a36Sopenharmony_ci	{ 0x040B, 0x0180 },   /* R1035  - DAC Digital Volume 1L */
20262306a36Sopenharmony_ci	{ 0x040C, 0x0180 },   /* R1036  - DAC Digital Volume 1R */
20362306a36Sopenharmony_ci	{ 0x040D, 0x0180 },   /* R1037  - DAC Digital Volume 2L */
20462306a36Sopenharmony_ci	{ 0x040E, 0x0180 },   /* R1038  - DAC Digital Volume 2R */
20562306a36Sopenharmony_ci	{ 0x0417, 0x0069 },   /* R1047  - PDM 1 */
20662306a36Sopenharmony_ci	{ 0x0418, 0x0000 },   /* R1048  - PDM 2 */
20762306a36Sopenharmony_ci	{ 0x0500, 0x0000 },   /* R1280  - Audio IF 1_1 */
20862306a36Sopenharmony_ci	{ 0x0501, 0x0008 },   /* R1281  - Audio IF 1_2 */
20962306a36Sopenharmony_ci	{ 0x0502, 0x0000 },   /* R1282  - Audio IF 1_3 */
21062306a36Sopenharmony_ci	{ 0x0503, 0x0000 },   /* R1283  - Audio IF 1_4 */
21162306a36Sopenharmony_ci	{ 0x0504, 0x0000 },   /* R1284  - Audio IF 1_5 */
21262306a36Sopenharmony_ci	{ 0x0505, 0x0001 },   /* R1285  - Audio IF 1_6 */
21362306a36Sopenharmony_ci	{ 0x0506, 0x0001 },   /* R1286  - Audio IF 1_7 */
21462306a36Sopenharmony_ci	{ 0x0507, 0x0000 },   /* R1287  - Audio IF 1_8 */
21562306a36Sopenharmony_ci	{ 0x0508, 0x0000 },   /* R1288  - Audio IF 1_9 */
21662306a36Sopenharmony_ci	{ 0x0509, 0x0000 },   /* R1289  - Audio IF 1_10 */
21762306a36Sopenharmony_ci	{ 0x050A, 0x0000 },   /* R1290  - Audio IF 1_11 */
21862306a36Sopenharmony_ci	{ 0x050B, 0x0000 },   /* R1291  - Audio IF 1_12 */
21962306a36Sopenharmony_ci	{ 0x050C, 0x0000 },   /* R1292  - Audio IF 1_13 */
22062306a36Sopenharmony_ci	{ 0x050D, 0x0000 },   /* R1293  - Audio IF 1_14 */
22162306a36Sopenharmony_ci	{ 0x050E, 0x0000 },   /* R1294  - Audio IF 1_15 */
22262306a36Sopenharmony_ci	{ 0x050F, 0x0000 },   /* R1295  - Audio IF 1_16 */
22362306a36Sopenharmony_ci	{ 0x0510, 0x0000 },   /* R1296  - Audio IF 1_17 */
22462306a36Sopenharmony_ci	{ 0x0511, 0x0000 },   /* R1297  - Audio IF 1_18 */
22562306a36Sopenharmony_ci	{ 0x0512, 0x0000 },   /* R1298  - Audio IF 1_19 */
22662306a36Sopenharmony_ci	{ 0x0513, 0x0000 },   /* R1299  - Audio IF 1_20 */
22762306a36Sopenharmony_ci	{ 0x0514, 0x0000 },   /* R1300  - Audio IF 1_21 */
22862306a36Sopenharmony_ci	{ 0x0515, 0x0001 },   /* R1301  - Audio IF 1_22 */
22962306a36Sopenharmony_ci	{ 0x0600, 0x0000 },   /* R1536  - OUT1LMIX Input 1 Source */
23062306a36Sopenharmony_ci	{ 0x0601, 0x0080 },   /* R1537  - OUT1LMIX Input 1 Volume */
23162306a36Sopenharmony_ci	{ 0x0602, 0x0000 },   /* R1538  - OUT1LMIX Input 2 Source */
23262306a36Sopenharmony_ci	{ 0x0603, 0x0080 },   /* R1539  - OUT1LMIX Input 2 Volume */
23362306a36Sopenharmony_ci	{ 0x0604, 0x0000 },   /* R1540  - OUT1LMIX Input 3 Source */
23462306a36Sopenharmony_ci	{ 0x0605, 0x0080 },   /* R1541  - OUT1LMIX Input 3 Volume */
23562306a36Sopenharmony_ci	{ 0x0606, 0x0000 },   /* R1542  - OUT1LMIX Input 4 Source */
23662306a36Sopenharmony_ci	{ 0x0607, 0x0080 },   /* R1543  - OUT1LMIX Input 4 Volume */
23762306a36Sopenharmony_ci	{ 0x0608, 0x0000 },   /* R1544  - OUT1RMIX Input 1 Source */
23862306a36Sopenharmony_ci	{ 0x0609, 0x0080 },   /* R1545  - OUT1RMIX Input 1 Volume */
23962306a36Sopenharmony_ci	{ 0x060A, 0x0000 },   /* R1546  - OUT1RMIX Input 2 Source */
24062306a36Sopenharmony_ci	{ 0x060B, 0x0080 },   /* R1547  - OUT1RMIX Input 2 Volume */
24162306a36Sopenharmony_ci	{ 0x060C, 0x0000 },   /* R1548  - OUT1RMIX Input 3 Source */
24262306a36Sopenharmony_ci	{ 0x060D, 0x0080 },   /* R1549  - OUT1RMIX Input 3 Volume */
24362306a36Sopenharmony_ci	{ 0x060E, 0x0000 },   /* R1550  - OUT1RMIX Input 4 Source */
24462306a36Sopenharmony_ci	{ 0x060F, 0x0080 },   /* R1551  - OUT1RMIX Input 4 Volume */
24562306a36Sopenharmony_ci	{ 0x0610, 0x0000 },   /* R1552  - OUT2LMIX Input 1 Source */
24662306a36Sopenharmony_ci	{ 0x0611, 0x0080 },   /* R1553  - OUT2LMIX Input 1 Volume */
24762306a36Sopenharmony_ci	{ 0x0612, 0x0000 },   /* R1554  - OUT2LMIX Input 2 Source */
24862306a36Sopenharmony_ci	{ 0x0613, 0x0080 },   /* R1555  - OUT2LMIX Input 2 Volume */
24962306a36Sopenharmony_ci	{ 0x0614, 0x0000 },   /* R1556  - OUT2LMIX Input 3 Source */
25062306a36Sopenharmony_ci	{ 0x0615, 0x0080 },   /* R1557  - OUT2LMIX Input 3 Volume */
25162306a36Sopenharmony_ci	{ 0x0616, 0x0000 },   /* R1558  - OUT2LMIX Input 4 Source */
25262306a36Sopenharmony_ci	{ 0x0617, 0x0080 },   /* R1559  - OUT2LMIX Input 4 Volume */
25362306a36Sopenharmony_ci	{ 0x0618, 0x0000 },   /* R1560  - OUT2RMIX Input 1 Source */
25462306a36Sopenharmony_ci	{ 0x0619, 0x0080 },   /* R1561  - OUT2RMIX Input 1 Volume */
25562306a36Sopenharmony_ci	{ 0x061A, 0x0000 },   /* R1562  - OUT2RMIX Input 2 Source */
25662306a36Sopenharmony_ci	{ 0x061B, 0x0080 },   /* R1563  - OUT2RMIX Input 2 Volume */
25762306a36Sopenharmony_ci	{ 0x061C, 0x0000 },   /* R1564  - OUT2RMIX Input 3 Source */
25862306a36Sopenharmony_ci	{ 0x061D, 0x0080 },   /* R1565  - OUT2RMIX Input 3 Volume */
25962306a36Sopenharmony_ci	{ 0x061E, 0x0000 },   /* R1566  - OUT2RMIX Input 4 Source */
26062306a36Sopenharmony_ci	{ 0x061F, 0x0080 },   /* R1567  - OUT2RMIX Input 4 Volume */
26162306a36Sopenharmony_ci	{ 0x0620, 0x0000 },   /* R1568  - AIF1TX1MIX Input 1 Source */
26262306a36Sopenharmony_ci	{ 0x0621, 0x0080 },   /* R1569  - AIF1TX1MIX Input 1 Volume */
26362306a36Sopenharmony_ci	{ 0x0622, 0x0000 },   /* R1570  - AIF1TX1MIX Input 2 Source */
26462306a36Sopenharmony_ci	{ 0x0623, 0x0080 },   /* R1571  - AIF1TX1MIX Input 2 Volume */
26562306a36Sopenharmony_ci	{ 0x0624, 0x0000 },   /* R1572  - AIF1TX1MIX Input 3 Source */
26662306a36Sopenharmony_ci	{ 0x0625, 0x0080 },   /* R1573  - AIF1TX1MIX Input 3 Volume */
26762306a36Sopenharmony_ci	{ 0x0626, 0x0000 },   /* R1574  - AIF1TX1MIX Input 4 Source */
26862306a36Sopenharmony_ci	{ 0x0627, 0x0080 },   /* R1575  - AIF1TX1MIX Input 4 Volume */
26962306a36Sopenharmony_ci	{ 0x0628, 0x0000 },   /* R1576  - AIF1TX2MIX Input 1 Source */
27062306a36Sopenharmony_ci	{ 0x0629, 0x0080 },   /* R1577  - AIF1TX2MIX Input 1 Volume */
27162306a36Sopenharmony_ci	{ 0x062A, 0x0000 },   /* R1578  - AIF1TX2MIX Input 2 Source */
27262306a36Sopenharmony_ci	{ 0x062B, 0x0080 },   /* R1579  - AIF1TX2MIX Input 2 Volume */
27362306a36Sopenharmony_ci	{ 0x062C, 0x0000 },   /* R1580  - AIF1TX2MIX Input 3 Source */
27462306a36Sopenharmony_ci	{ 0x062D, 0x0080 },   /* R1581  - AIF1TX2MIX Input 3 Volume */
27562306a36Sopenharmony_ci	{ 0x062E, 0x0000 },   /* R1582  - AIF1TX2MIX Input 4 Source */
27662306a36Sopenharmony_ci	{ 0x062F, 0x0080 },   /* R1583  - AIF1TX2MIX Input 4 Volume */
27762306a36Sopenharmony_ci	{ 0x0630, 0x0000 },   /* R1584  - AIF1TX3MIX Input 1 Source */
27862306a36Sopenharmony_ci	{ 0x0631, 0x0080 },   /* R1585  - AIF1TX3MIX Input 1 Volume */
27962306a36Sopenharmony_ci	{ 0x0632, 0x0000 },   /* R1586  - AIF1TX3MIX Input 2 Source */
28062306a36Sopenharmony_ci	{ 0x0633, 0x0080 },   /* R1587  - AIF1TX3MIX Input 2 Volume */
28162306a36Sopenharmony_ci	{ 0x0634, 0x0000 },   /* R1588  - AIF1TX3MIX Input 3 Source */
28262306a36Sopenharmony_ci	{ 0x0635, 0x0080 },   /* R1589  - AIF1TX3MIX Input 3 Volume */
28362306a36Sopenharmony_ci	{ 0x0636, 0x0000 },   /* R1590  - AIF1TX3MIX Input 4 Source */
28462306a36Sopenharmony_ci	{ 0x0637, 0x0080 },   /* R1591  - AIF1TX3MIX Input 4 Volume */
28562306a36Sopenharmony_ci	{ 0x0638, 0x0000 },   /* R1592  - AIF1TX4MIX Input 1 Source */
28662306a36Sopenharmony_ci	{ 0x0639, 0x0080 },   /* R1593  - AIF1TX4MIX Input 1 Volume */
28762306a36Sopenharmony_ci	{ 0x063A, 0x0000 },   /* R1594  - AIF1TX4MIX Input 2 Source */
28862306a36Sopenharmony_ci	{ 0x063B, 0x0080 },   /* R1595  - AIF1TX4MIX Input 2 Volume */
28962306a36Sopenharmony_ci	{ 0x063C, 0x0000 },   /* R1596  - AIF1TX4MIX Input 3 Source */
29062306a36Sopenharmony_ci	{ 0x063D, 0x0080 },   /* R1597  - AIF1TX4MIX Input 3 Volume */
29162306a36Sopenharmony_ci	{ 0x063E, 0x0000 },   /* R1598  - AIF1TX4MIX Input 4 Source */
29262306a36Sopenharmony_ci	{ 0x063F, 0x0080 },   /* R1599  - AIF1TX4MIX Input 4 Volume */
29362306a36Sopenharmony_ci	{ 0x0640, 0x0000 },   /* R1600  - AIF1TX5MIX Input 1 Source */
29462306a36Sopenharmony_ci	{ 0x0641, 0x0080 },   /* R1601  - AIF1TX5MIX Input 1 Volume */
29562306a36Sopenharmony_ci	{ 0x0642, 0x0000 },   /* R1602  - AIF1TX5MIX Input 2 Source */
29662306a36Sopenharmony_ci	{ 0x0643, 0x0080 },   /* R1603  - AIF1TX5MIX Input 2 Volume */
29762306a36Sopenharmony_ci	{ 0x0644, 0x0000 },   /* R1604  - AIF1TX5MIX Input 3 Source */
29862306a36Sopenharmony_ci	{ 0x0645, 0x0080 },   /* R1605  - AIF1TX5MIX Input 3 Volume */
29962306a36Sopenharmony_ci	{ 0x0646, 0x0000 },   /* R1606  - AIF1TX5MIX Input 4 Source */
30062306a36Sopenharmony_ci	{ 0x0647, 0x0080 },   /* R1607  - AIF1TX5MIX Input 4 Volume */
30162306a36Sopenharmony_ci	{ 0x0648, 0x0000 },   /* R1608  - AIF1TX6MIX Input 1 Source */
30262306a36Sopenharmony_ci	{ 0x0649, 0x0080 },   /* R1609  - AIF1TX6MIX Input 1 Volume */
30362306a36Sopenharmony_ci	{ 0x064A, 0x0000 },   /* R1610  - AIF1TX6MIX Input 2 Source */
30462306a36Sopenharmony_ci	{ 0x064B, 0x0080 },   /* R1611  - AIF1TX6MIX Input 2 Volume */
30562306a36Sopenharmony_ci	{ 0x064C, 0x0000 },   /* R1612  - AIF1TX6MIX Input 3 Source */
30662306a36Sopenharmony_ci	{ 0x064D, 0x0080 },   /* R1613  - AIF1TX6MIX Input 3 Volume */
30762306a36Sopenharmony_ci	{ 0x064E, 0x0000 },   /* R1614  - AIF1TX6MIX Input 4 Source */
30862306a36Sopenharmony_ci	{ 0x064F, 0x0080 },   /* R1615  - AIF1TX6MIX Input 4 Volume */
30962306a36Sopenharmony_ci	{ 0x0650, 0x0000 },   /* R1616  - EQLMIX Input 1 Source */
31062306a36Sopenharmony_ci	{ 0x0651, 0x0080 },   /* R1617  - EQLMIX Input 1 Volume */
31162306a36Sopenharmony_ci	{ 0x0652, 0x0000 },   /* R1618  - EQLMIX Input 2 Source */
31262306a36Sopenharmony_ci	{ 0x0653, 0x0080 },   /* R1619  - EQLMIX Input 2 Volume */
31362306a36Sopenharmony_ci	{ 0x0654, 0x0000 },   /* R1620  - EQLMIX Input 3 Source */
31462306a36Sopenharmony_ci	{ 0x0655, 0x0080 },   /* R1621  - EQLMIX Input 3 Volume */
31562306a36Sopenharmony_ci	{ 0x0656, 0x0000 },   /* R1622  - EQLMIX Input 4 Source */
31662306a36Sopenharmony_ci	{ 0x0657, 0x0080 },   /* R1623  - EQLMIX Input 4 Volume */
31762306a36Sopenharmony_ci	{ 0x0658, 0x0000 },   /* R1624  - EQRMIX Input 1 Source */
31862306a36Sopenharmony_ci	{ 0x0659, 0x0080 },   /* R1625  - EQRMIX Input 1 Volume */
31962306a36Sopenharmony_ci	{ 0x065A, 0x0000 },   /* R1626  - EQRMIX Input 2 Source */
32062306a36Sopenharmony_ci	{ 0x065B, 0x0080 },   /* R1627  - EQRMIX Input 2 Volume */
32162306a36Sopenharmony_ci	{ 0x065C, 0x0000 },   /* R1628  - EQRMIX Input 3 Source */
32262306a36Sopenharmony_ci	{ 0x065D, 0x0080 },   /* R1629  - EQRMIX Input 3 Volume */
32362306a36Sopenharmony_ci	{ 0x065E, 0x0000 },   /* R1630  - EQRMIX Input 4 Source */
32462306a36Sopenharmony_ci	{ 0x065F, 0x0080 },   /* R1631  - EQRMIX Input 4 Volume */
32562306a36Sopenharmony_ci	{ 0x0660, 0x0000 },   /* R1632  - LHPF1MIX Input 1 Source */
32662306a36Sopenharmony_ci	{ 0x0661, 0x0080 },   /* R1633  - LHPF1MIX Input 1 Volume */
32762306a36Sopenharmony_ci	{ 0x0662, 0x0000 },   /* R1634  - LHPF1MIX Input 2 Source */
32862306a36Sopenharmony_ci	{ 0x0663, 0x0080 },   /* R1635  - LHPF1MIX Input 2 Volume */
32962306a36Sopenharmony_ci	{ 0x0664, 0x0000 },   /* R1636  - LHPF1MIX Input 3 Source */
33062306a36Sopenharmony_ci	{ 0x0665, 0x0080 },   /* R1637  - LHPF1MIX Input 3 Volume */
33162306a36Sopenharmony_ci	{ 0x0666, 0x0000 },   /* R1638  - LHPF1MIX Input 4 Source */
33262306a36Sopenharmony_ci	{ 0x0667, 0x0080 },   /* R1639  - LHPF1MIX Input 4 Volume */
33362306a36Sopenharmony_ci	{ 0x0668, 0x0000 },   /* R1640  - LHPF2MIX Input 1 Source */
33462306a36Sopenharmony_ci	{ 0x0669, 0x0080 },   /* R1641  - LHPF2MIX Input 1 Volume */
33562306a36Sopenharmony_ci	{ 0x066A, 0x0000 },   /* R1642  - LHPF2MIX Input 2 Source */
33662306a36Sopenharmony_ci	{ 0x066B, 0x0080 },   /* R1643  - LHPF2MIX Input 2 Volume */
33762306a36Sopenharmony_ci	{ 0x066C, 0x0000 },   /* R1644  - LHPF2MIX Input 3 Source */
33862306a36Sopenharmony_ci	{ 0x066D, 0x0080 },   /* R1645  - LHPF2MIX Input 3 Volume */
33962306a36Sopenharmony_ci	{ 0x066E, 0x0000 },   /* R1646  - LHPF2MIX Input 4 Source */
34062306a36Sopenharmony_ci	{ 0x066F, 0x0080 },   /* R1647  - LHPF2MIX Input 4 Volume */
34162306a36Sopenharmony_ci	{ 0x0670, 0x0000 },   /* R1648  - DSP1LMIX Input 1 Source */
34262306a36Sopenharmony_ci	{ 0x0671, 0x0080 },   /* R1649  - DSP1LMIX Input 1 Volume */
34362306a36Sopenharmony_ci	{ 0x0672, 0x0000 },   /* R1650  - DSP1LMIX Input 2 Source */
34462306a36Sopenharmony_ci	{ 0x0673, 0x0080 },   /* R1651  - DSP1LMIX Input 2 Volume */
34562306a36Sopenharmony_ci	{ 0x0674, 0x0000 },   /* R1652  - DSP1LMIX Input 3 Source */
34662306a36Sopenharmony_ci	{ 0x0675, 0x0080 },   /* R1653  - DSP1LMIX Input 3 Volume */
34762306a36Sopenharmony_ci	{ 0x0676, 0x0000 },   /* R1654  - DSP1LMIX Input 4 Source */
34862306a36Sopenharmony_ci	{ 0x0677, 0x0080 },   /* R1655  - DSP1LMIX Input 4 Volume */
34962306a36Sopenharmony_ci	{ 0x0678, 0x0000 },   /* R1656  - DSP1RMIX Input 1 Source */
35062306a36Sopenharmony_ci	{ 0x0679, 0x0080 },   /* R1657  - DSP1RMIX Input 1 Volume */
35162306a36Sopenharmony_ci	{ 0x067A, 0x0000 },   /* R1658  - DSP1RMIX Input 2 Source */
35262306a36Sopenharmony_ci	{ 0x067B, 0x0080 },   /* R1659  - DSP1RMIX Input 2 Volume */
35362306a36Sopenharmony_ci	{ 0x067C, 0x0000 },   /* R1660  - DSP1RMIX Input 3 Source */
35462306a36Sopenharmony_ci	{ 0x067D, 0x0080 },   /* R1661  - DSP1RMIX Input 3 Volume */
35562306a36Sopenharmony_ci	{ 0x067E, 0x0000 },   /* R1662  - DSP1RMIX Input 4 Source */
35662306a36Sopenharmony_ci	{ 0x067F, 0x0080 },   /* R1663  - DSP1RMIX Input 4 Volume */
35762306a36Sopenharmony_ci	{ 0x0680, 0x0000 },   /* R1664  - DSP1AUX1MIX Input 1 Source */
35862306a36Sopenharmony_ci	{ 0x0681, 0x0000 },   /* R1665  - DSP1AUX2MIX Input 1 Source */
35962306a36Sopenharmony_ci	{ 0x0682, 0x0000 },   /* R1666  - DSP1AUX3MIX Input 1 Source */
36062306a36Sopenharmony_ci	{ 0x0683, 0x0000 },   /* R1667  - DSP1AUX4MIX Input 1 Source */
36162306a36Sopenharmony_ci	{ 0x0684, 0x0000 },   /* R1668  - DSP1AUX5MIX Input 1 Source */
36262306a36Sopenharmony_ci	{ 0x0685, 0x0000 },   /* R1669  - DSP1AUX6MIX Input 1 Source */
36362306a36Sopenharmony_ci	{ 0x0686, 0x0000 },   /* R1670  - DSP2LMIX Input 1 Source */
36462306a36Sopenharmony_ci	{ 0x0687, 0x0080 },   /* R1671  - DSP2LMIX Input 1 Volume */
36562306a36Sopenharmony_ci	{ 0x0688, 0x0000 },   /* R1672  - DSP2LMIX Input 2 Source */
36662306a36Sopenharmony_ci	{ 0x0689, 0x0080 },   /* R1673  - DSP2LMIX Input 2 Volume */
36762306a36Sopenharmony_ci	{ 0x068A, 0x0000 },   /* R1674  - DSP2LMIX Input 3 Source */
36862306a36Sopenharmony_ci	{ 0x068B, 0x0080 },   /* R1675  - DSP2LMIX Input 3 Volume */
36962306a36Sopenharmony_ci	{ 0x068C, 0x0000 },   /* R1676  - DSP2LMIX Input 4 Source */
37062306a36Sopenharmony_ci	{ 0x068D, 0x0080 },   /* R1677  - DSP2LMIX Input 4 Volume */
37162306a36Sopenharmony_ci	{ 0x068E, 0x0000 },   /* R1678  - DSP2RMIX Input 1 Source */
37262306a36Sopenharmony_ci	{ 0x068F, 0x0080 },   /* R1679  - DSP2RMIX Input 1 Volume */
37362306a36Sopenharmony_ci	{ 0x0690, 0x0000 },   /* R1680  - DSP2RMIX Input 2 Source */
37462306a36Sopenharmony_ci	{ 0x0691, 0x0080 },   /* R1681  - DSP2RMIX Input 2 Volume */
37562306a36Sopenharmony_ci	{ 0x0692, 0x0000 },   /* R1682  - DSP2RMIX Input 3 Source */
37662306a36Sopenharmony_ci	{ 0x0693, 0x0080 },   /* R1683  - DSP2RMIX Input 3 Volume */
37762306a36Sopenharmony_ci	{ 0x0694, 0x0000 },   /* R1684  - DSP2RMIX Input 4 Source */
37862306a36Sopenharmony_ci	{ 0x0695, 0x0080 },   /* R1685  - DSP2RMIX Input 4 Volume */
37962306a36Sopenharmony_ci	{ 0x0696, 0x0000 },   /* R1686  - DSP2AUX1MIX Input 1 Source */
38062306a36Sopenharmony_ci	{ 0x0697, 0x0000 },   /* R1687  - DSP2AUX2MIX Input 1 Source */
38162306a36Sopenharmony_ci	{ 0x0698, 0x0000 },   /* R1688  - DSP2AUX3MIX Input 1 Source */
38262306a36Sopenharmony_ci	{ 0x0699, 0x0000 },   /* R1689  - DSP2AUX4MIX Input 1 Source */
38362306a36Sopenharmony_ci	{ 0x069A, 0x0000 },   /* R1690  - DSP2AUX5MIX Input 1 Source */
38462306a36Sopenharmony_ci	{ 0x069B, 0x0000 },   /* R1691  - DSP2AUX6MIX Input 1 Source */
38562306a36Sopenharmony_ci	{ 0x0700, 0xA101 },   /* R1792  - GPIO CTRL 1 */
38662306a36Sopenharmony_ci	{ 0x0701, 0xA101 },   /* R1793  - GPIO CTRL 2 */
38762306a36Sopenharmony_ci	{ 0x0702, 0xA101 },   /* R1794  - GPIO CTRL 3 */
38862306a36Sopenharmony_ci	{ 0x0703, 0xA101 },   /* R1795  - GPIO CTRL 4 */
38962306a36Sopenharmony_ci	{ 0x0709, 0x0000 },   /* R1801  - Misc Pad Ctrl 1 */
39062306a36Sopenharmony_ci	{ 0x0801, 0x00FF },   /* R2049  - Interrupt Status 1 Mask */
39162306a36Sopenharmony_ci	{ 0x0804, 0xFFFF },   /* R2052  - Interrupt Status 2 Mask */
39262306a36Sopenharmony_ci	{ 0x0808, 0x0000 },   /* R2056  - Interrupt Control */
39362306a36Sopenharmony_ci	{ 0x0900, 0x0000 },   /* R2304  - EQL_1 */
39462306a36Sopenharmony_ci	{ 0x0901, 0x0000 },   /* R2305  - EQL_2 */
39562306a36Sopenharmony_ci	{ 0x0902, 0x0000 },   /* R2306  - EQL_3 */
39662306a36Sopenharmony_ci	{ 0x0903, 0x0000 },   /* R2307  - EQL_4 */
39762306a36Sopenharmony_ci	{ 0x0904, 0x0000 },   /* R2308  - EQL_5 */
39862306a36Sopenharmony_ci	{ 0x0905, 0x0000 },   /* R2309  - EQL_6 */
39962306a36Sopenharmony_ci	{ 0x0906, 0x0000 },   /* R2310  - EQL_7 */
40062306a36Sopenharmony_ci	{ 0x0907, 0x0000 },   /* R2311  - EQL_8 */
40162306a36Sopenharmony_ci	{ 0x0908, 0x0000 },   /* R2312  - EQL_9 */
40262306a36Sopenharmony_ci	{ 0x0909, 0x0000 },   /* R2313  - EQL_10 */
40362306a36Sopenharmony_ci	{ 0x090A, 0x0000 },   /* R2314  - EQL_11 */
40462306a36Sopenharmony_ci	{ 0x090B, 0x0000 },   /* R2315  - EQL_12 */
40562306a36Sopenharmony_ci	{ 0x090C, 0x0000 },   /* R2316  - EQL_13 */
40662306a36Sopenharmony_ci	{ 0x090D, 0x0000 },   /* R2317  - EQL_14 */
40762306a36Sopenharmony_ci	{ 0x090E, 0x0000 },   /* R2318  - EQL_15 */
40862306a36Sopenharmony_ci	{ 0x090F, 0x0000 },   /* R2319  - EQL_16 */
40962306a36Sopenharmony_ci	{ 0x0910, 0x0000 },   /* R2320  - EQL_17 */
41062306a36Sopenharmony_ci	{ 0x0911, 0x0000 },   /* R2321  - EQL_18 */
41162306a36Sopenharmony_ci	{ 0x0912, 0x0000 },   /* R2322  - EQL_19 */
41262306a36Sopenharmony_ci	{ 0x0913, 0x0000 },   /* R2323  - EQL_20 */
41362306a36Sopenharmony_ci	{ 0x0916, 0x0000 },   /* R2326  - EQR_1 */
41462306a36Sopenharmony_ci	{ 0x0917, 0x0000 },   /* R2327  - EQR_2 */
41562306a36Sopenharmony_ci	{ 0x0918, 0x0000 },   /* R2328  - EQR_3 */
41662306a36Sopenharmony_ci	{ 0x0919, 0x0000 },   /* R2329  - EQR_4 */
41762306a36Sopenharmony_ci	{ 0x091A, 0x0000 },   /* R2330  - EQR_5 */
41862306a36Sopenharmony_ci	{ 0x091B, 0x0000 },   /* R2331  - EQR_6 */
41962306a36Sopenharmony_ci	{ 0x091C, 0x0000 },   /* R2332  - EQR_7 */
42062306a36Sopenharmony_ci	{ 0x091D, 0x0000 },   /* R2333  - EQR_8 */
42162306a36Sopenharmony_ci	{ 0x091E, 0x0000 },   /* R2334  - EQR_9 */
42262306a36Sopenharmony_ci	{ 0x091F, 0x0000 },   /* R2335  - EQR_10 */
42362306a36Sopenharmony_ci	{ 0x0920, 0x0000 },   /* R2336  - EQR_11 */
42462306a36Sopenharmony_ci	{ 0x0921, 0x0000 },   /* R2337  - EQR_12 */
42562306a36Sopenharmony_ci	{ 0x0922, 0x0000 },   /* R2338  - EQR_13 */
42662306a36Sopenharmony_ci	{ 0x0923, 0x0000 },   /* R2339  - EQR_14 */
42762306a36Sopenharmony_ci	{ 0x0924, 0x0000 },   /* R2340  - EQR_15 */
42862306a36Sopenharmony_ci	{ 0x0925, 0x0000 },   /* R2341  - EQR_16 */
42962306a36Sopenharmony_ci	{ 0x0926, 0x0000 },   /* R2342  - EQR_17 */
43062306a36Sopenharmony_ci	{ 0x0927, 0x0000 },   /* R2343  - EQR_18 */
43162306a36Sopenharmony_ci	{ 0x0928, 0x0000 },   /* R2344  - EQR_19 */
43262306a36Sopenharmony_ci	{ 0x0929, 0x0000 },   /* R2345  - EQR_20 */
43362306a36Sopenharmony_ci	{ 0x093E, 0x0000 },   /* R2366  - HPLPF1_1 */
43462306a36Sopenharmony_ci	{ 0x093F, 0x0000 },   /* R2367  - HPLPF1_2 */
43562306a36Sopenharmony_ci	{ 0x0942, 0x0000 },   /* R2370  - HPLPF2_1 */
43662306a36Sopenharmony_ci	{ 0x0943, 0x0000 },   /* R2371  - HPLPF2_2 */
43762306a36Sopenharmony_ci	{ 0x0A00, 0x0000 },   /* R2560  - DSP1 Control 1 */
43862306a36Sopenharmony_ci	{ 0x0A02, 0x0000 },   /* R2562  - DSP1 Control 2 */
43962306a36Sopenharmony_ci	{ 0x0A03, 0x0000 },   /* R2563  - DSP1 Control 3 */
44062306a36Sopenharmony_ci	{ 0x0A04, 0x0000 },   /* R2564  - DSP1 Control 4 */
44162306a36Sopenharmony_ci	{ 0x0A06, 0x0000 },   /* R2566  - DSP1 Control 5 */
44262306a36Sopenharmony_ci	{ 0x0A07, 0x0000 },   /* R2567  - DSP1 Control 6 */
44362306a36Sopenharmony_ci	{ 0x0A08, 0x0000 },   /* R2568  - DSP1 Control 7 */
44462306a36Sopenharmony_ci	{ 0x0A09, 0x0000 },   /* R2569  - DSP1 Control 8 */
44562306a36Sopenharmony_ci	{ 0x0A0A, 0x0000 },   /* R2570  - DSP1 Control 9 */
44662306a36Sopenharmony_ci	{ 0x0A0B, 0x0000 },   /* R2571  - DSP1 Control 10 */
44762306a36Sopenharmony_ci	{ 0x0A0C, 0x0000 },   /* R2572  - DSP1 Control 11 */
44862306a36Sopenharmony_ci	{ 0x0A0D, 0x0000 },   /* R2573  - DSP1 Control 12 */
44962306a36Sopenharmony_ci	{ 0x0A0F, 0x0000 },   /* R2575  - DSP1 Control 13 */
45062306a36Sopenharmony_ci	{ 0x0A10, 0x0000 },   /* R2576  - DSP1 Control 14 */
45162306a36Sopenharmony_ci	{ 0x0A11, 0x0000 },   /* R2577  - DSP1 Control 15 */
45262306a36Sopenharmony_ci	{ 0x0A12, 0x0000 },   /* R2578  - DSP1 Control 16 */
45362306a36Sopenharmony_ci	{ 0x0A13, 0x0000 },   /* R2579  - DSP1 Control 17 */
45462306a36Sopenharmony_ci	{ 0x0A14, 0x0000 },   /* R2580  - DSP1 Control 18 */
45562306a36Sopenharmony_ci	{ 0x0A16, 0x0000 },   /* R2582  - DSP1 Control 19 */
45662306a36Sopenharmony_ci	{ 0x0A17, 0x0000 },   /* R2583  - DSP1 Control 20 */
45762306a36Sopenharmony_ci	{ 0x0A18, 0x0000 },   /* R2584  - DSP1 Control 21 */
45862306a36Sopenharmony_ci	{ 0x0A1A, 0x1800 },   /* R2586  - DSP1 Control 22 */
45962306a36Sopenharmony_ci	{ 0x0A1B, 0x1000 },   /* R2587  - DSP1 Control 23 */
46062306a36Sopenharmony_ci	{ 0x0A1C, 0x0400 },   /* R2588  - DSP1 Control 24 */
46162306a36Sopenharmony_ci	{ 0x0A1E, 0x0000 },   /* R2590  - DSP1 Control 25 */
46262306a36Sopenharmony_ci	{ 0x0A20, 0x0000 },   /* R2592  - DSP1 Control 26 */
46362306a36Sopenharmony_ci	{ 0x0A21, 0x0000 },   /* R2593  - DSP1 Control 27 */
46462306a36Sopenharmony_ci	{ 0x0A22, 0x0000 },   /* R2594  - DSP1 Control 28 */
46562306a36Sopenharmony_ci	{ 0x0A23, 0x0000 },   /* R2595  - DSP1 Control 29 */
46662306a36Sopenharmony_ci	{ 0x0A24, 0x0000 },   /* R2596  - DSP1 Control 30 */
46762306a36Sopenharmony_ci	{ 0x0A26, 0x0000 },   /* R2598  - DSP1 Control 31 */
46862306a36Sopenharmony_ci	{ 0x0B00, 0x0000 },   /* R2816  - DSP2 Control 1 */
46962306a36Sopenharmony_ci	{ 0x0B02, 0x0000 },   /* R2818  - DSP2 Control 2 */
47062306a36Sopenharmony_ci	{ 0x0B03, 0x0000 },   /* R2819  - DSP2 Control 3 */
47162306a36Sopenharmony_ci	{ 0x0B04, 0x0000 },   /* R2820  - DSP2 Control 4 */
47262306a36Sopenharmony_ci	{ 0x0B06, 0x0000 },   /* R2822  - DSP2 Control 5 */
47362306a36Sopenharmony_ci	{ 0x0B07, 0x0000 },   /* R2823  - DSP2 Control 6 */
47462306a36Sopenharmony_ci	{ 0x0B08, 0x0000 },   /* R2824  - DSP2 Control 7 */
47562306a36Sopenharmony_ci	{ 0x0B09, 0x0000 },   /* R2825  - DSP2 Control 8 */
47662306a36Sopenharmony_ci	{ 0x0B0A, 0x0000 },   /* R2826  - DSP2 Control 9 */
47762306a36Sopenharmony_ci	{ 0x0B0B, 0x0000 },   /* R2827  - DSP2 Control 10 */
47862306a36Sopenharmony_ci	{ 0x0B0C, 0x0000 },   /* R2828  - DSP2 Control 11 */
47962306a36Sopenharmony_ci	{ 0x0B0D, 0x0000 },   /* R2829  - DSP2 Control 12 */
48062306a36Sopenharmony_ci	{ 0x0B0F, 0x0000 },   /* R2831  - DSP2 Control 13 */
48162306a36Sopenharmony_ci	{ 0x0B10, 0x0000 },   /* R2832  - DSP2 Control 14 */
48262306a36Sopenharmony_ci	{ 0x0B11, 0x0000 },   /* R2833  - DSP2 Control 15 */
48362306a36Sopenharmony_ci	{ 0x0B12, 0x0000 },   /* R2834  - DSP2 Control 16 */
48462306a36Sopenharmony_ci	{ 0x0B13, 0x0000 },   /* R2835  - DSP2 Control 17 */
48562306a36Sopenharmony_ci	{ 0x0B14, 0x0000 },   /* R2836  - DSP2 Control 18 */
48662306a36Sopenharmony_ci	{ 0x0B16, 0x0000 },   /* R2838  - DSP2 Control 19 */
48762306a36Sopenharmony_ci	{ 0x0B17, 0x0000 },   /* R2839  - DSP2 Control 20 */
48862306a36Sopenharmony_ci	{ 0x0B18, 0x0000 },   /* R2840  - DSP2 Control 21 */
48962306a36Sopenharmony_ci	{ 0x0B1A, 0x0800 },   /* R2842  - DSP2 Control 22 */
49062306a36Sopenharmony_ci	{ 0x0B1B, 0x1000 },   /* R2843  - DSP2 Control 23 */
49162306a36Sopenharmony_ci	{ 0x0B1C, 0x0400 },   /* R2844  - DSP2 Control 24 */
49262306a36Sopenharmony_ci	{ 0x0B1E, 0x0000 },   /* R2846  - DSP2 Control 25 */
49362306a36Sopenharmony_ci	{ 0x0B20, 0x0000 },   /* R2848  - DSP2 Control 26 */
49462306a36Sopenharmony_ci	{ 0x0B21, 0x0000 },   /* R2849  - DSP2 Control 27 */
49562306a36Sopenharmony_ci	{ 0x0B22, 0x0000 },   /* R2850  - DSP2 Control 28 */
49662306a36Sopenharmony_ci	{ 0x0B23, 0x0000 },   /* R2851  - DSP2 Control 29 */
49762306a36Sopenharmony_ci	{ 0x0B24, 0x0000 },   /* R2852  - DSP2 Control 30 */
49862306a36Sopenharmony_ci	{ 0x0B26, 0x0000 },   /* R2854  - DSP2 Control 31 */
49962306a36Sopenharmony_ci};
50062306a36Sopenharmony_ci
50162306a36Sopenharmony_cistatic bool wm2200_volatile_register(struct device *dev, unsigned int reg)
50262306a36Sopenharmony_ci{
50362306a36Sopenharmony_ci	int i;
50462306a36Sopenharmony_ci
50562306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(wm2200_ranges); i++)
50662306a36Sopenharmony_ci		if ((reg >= wm2200_ranges[i].window_start &&
50762306a36Sopenharmony_ci		     reg <= wm2200_ranges[i].window_start +
50862306a36Sopenharmony_ci		     wm2200_ranges[i].window_len) ||
50962306a36Sopenharmony_ci		    (reg >= wm2200_ranges[i].range_min &&
51062306a36Sopenharmony_ci		     reg <= wm2200_ranges[i].range_max))
51162306a36Sopenharmony_ci			return true;
51262306a36Sopenharmony_ci
51362306a36Sopenharmony_ci	switch (reg) {
51462306a36Sopenharmony_ci	case WM2200_SOFTWARE_RESET:
51562306a36Sopenharmony_ci	case WM2200_DEVICE_REVISION:
51662306a36Sopenharmony_ci	case WM2200_ADPS1_IRQ0:
51762306a36Sopenharmony_ci	case WM2200_ADPS1_IRQ1:
51862306a36Sopenharmony_ci	case WM2200_INTERRUPT_STATUS_1:
51962306a36Sopenharmony_ci	case WM2200_INTERRUPT_STATUS_2:
52062306a36Sopenharmony_ci	case WM2200_INTERRUPT_RAW_STATUS_2:
52162306a36Sopenharmony_ci		return true;
52262306a36Sopenharmony_ci	default:
52362306a36Sopenharmony_ci		return false;
52462306a36Sopenharmony_ci	}
52562306a36Sopenharmony_ci}
52662306a36Sopenharmony_ci
52762306a36Sopenharmony_cistatic bool wm2200_readable_register(struct device *dev, unsigned int reg)
52862306a36Sopenharmony_ci{
52962306a36Sopenharmony_ci	int i;
53062306a36Sopenharmony_ci
53162306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(wm2200_ranges); i++)
53262306a36Sopenharmony_ci		if ((reg >= wm2200_ranges[i].window_start &&
53362306a36Sopenharmony_ci		     reg <= wm2200_ranges[i].window_start +
53462306a36Sopenharmony_ci		     wm2200_ranges[i].window_len) ||
53562306a36Sopenharmony_ci		    (reg >= wm2200_ranges[i].range_min &&
53662306a36Sopenharmony_ci		     reg <= wm2200_ranges[i].range_max))
53762306a36Sopenharmony_ci			return true;
53862306a36Sopenharmony_ci
53962306a36Sopenharmony_ci	switch (reg) {
54062306a36Sopenharmony_ci	case WM2200_SOFTWARE_RESET:
54162306a36Sopenharmony_ci	case WM2200_DEVICE_REVISION:
54262306a36Sopenharmony_ci	case WM2200_TONE_GENERATOR_1:
54362306a36Sopenharmony_ci	case WM2200_CLOCKING_3:
54462306a36Sopenharmony_ci	case WM2200_CLOCKING_4:
54562306a36Sopenharmony_ci	case WM2200_FLL_CONTROL_1:
54662306a36Sopenharmony_ci	case WM2200_FLL_CONTROL_2:
54762306a36Sopenharmony_ci	case WM2200_FLL_CONTROL_3:
54862306a36Sopenharmony_ci	case WM2200_FLL_CONTROL_4:
54962306a36Sopenharmony_ci	case WM2200_FLL_CONTROL_6:
55062306a36Sopenharmony_ci	case WM2200_FLL_CONTROL_7:
55162306a36Sopenharmony_ci	case WM2200_FLL_EFS_1:
55262306a36Sopenharmony_ci	case WM2200_FLL_EFS_2:
55362306a36Sopenharmony_ci	case WM2200_MIC_CHARGE_PUMP_1:
55462306a36Sopenharmony_ci	case WM2200_MIC_CHARGE_PUMP_2:
55562306a36Sopenharmony_ci	case WM2200_DM_CHARGE_PUMP_1:
55662306a36Sopenharmony_ci	case WM2200_MIC_BIAS_CTRL_1:
55762306a36Sopenharmony_ci	case WM2200_MIC_BIAS_CTRL_2:
55862306a36Sopenharmony_ci	case WM2200_EAR_PIECE_CTRL_1:
55962306a36Sopenharmony_ci	case WM2200_EAR_PIECE_CTRL_2:
56062306a36Sopenharmony_ci	case WM2200_INPUT_ENABLES:
56162306a36Sopenharmony_ci	case WM2200_IN1L_CONTROL:
56262306a36Sopenharmony_ci	case WM2200_IN1R_CONTROL:
56362306a36Sopenharmony_ci	case WM2200_IN2L_CONTROL:
56462306a36Sopenharmony_ci	case WM2200_IN2R_CONTROL:
56562306a36Sopenharmony_ci	case WM2200_IN3L_CONTROL:
56662306a36Sopenharmony_ci	case WM2200_IN3R_CONTROL:
56762306a36Sopenharmony_ci	case WM2200_RXANC_SRC:
56862306a36Sopenharmony_ci	case WM2200_INPUT_VOLUME_RAMP:
56962306a36Sopenharmony_ci	case WM2200_ADC_DIGITAL_VOLUME_1L:
57062306a36Sopenharmony_ci	case WM2200_ADC_DIGITAL_VOLUME_1R:
57162306a36Sopenharmony_ci	case WM2200_ADC_DIGITAL_VOLUME_2L:
57262306a36Sopenharmony_ci	case WM2200_ADC_DIGITAL_VOLUME_2R:
57362306a36Sopenharmony_ci	case WM2200_ADC_DIGITAL_VOLUME_3L:
57462306a36Sopenharmony_ci	case WM2200_ADC_DIGITAL_VOLUME_3R:
57562306a36Sopenharmony_ci	case WM2200_OUTPUT_ENABLES:
57662306a36Sopenharmony_ci	case WM2200_DAC_VOLUME_LIMIT_1L:
57762306a36Sopenharmony_ci	case WM2200_DAC_VOLUME_LIMIT_1R:
57862306a36Sopenharmony_ci	case WM2200_DAC_VOLUME_LIMIT_2L:
57962306a36Sopenharmony_ci	case WM2200_DAC_VOLUME_LIMIT_2R:
58062306a36Sopenharmony_ci	case WM2200_DAC_AEC_CONTROL_1:
58162306a36Sopenharmony_ci	case WM2200_OUTPUT_VOLUME_RAMP:
58262306a36Sopenharmony_ci	case WM2200_DAC_DIGITAL_VOLUME_1L:
58362306a36Sopenharmony_ci	case WM2200_DAC_DIGITAL_VOLUME_1R:
58462306a36Sopenharmony_ci	case WM2200_DAC_DIGITAL_VOLUME_2L:
58562306a36Sopenharmony_ci	case WM2200_DAC_DIGITAL_VOLUME_2R:
58662306a36Sopenharmony_ci	case WM2200_PDM_1:
58762306a36Sopenharmony_ci	case WM2200_PDM_2:
58862306a36Sopenharmony_ci	case WM2200_AUDIO_IF_1_1:
58962306a36Sopenharmony_ci	case WM2200_AUDIO_IF_1_2:
59062306a36Sopenharmony_ci	case WM2200_AUDIO_IF_1_3:
59162306a36Sopenharmony_ci	case WM2200_AUDIO_IF_1_4:
59262306a36Sopenharmony_ci	case WM2200_AUDIO_IF_1_5:
59362306a36Sopenharmony_ci	case WM2200_AUDIO_IF_1_6:
59462306a36Sopenharmony_ci	case WM2200_AUDIO_IF_1_7:
59562306a36Sopenharmony_ci	case WM2200_AUDIO_IF_1_8:
59662306a36Sopenharmony_ci	case WM2200_AUDIO_IF_1_9:
59762306a36Sopenharmony_ci	case WM2200_AUDIO_IF_1_10:
59862306a36Sopenharmony_ci	case WM2200_AUDIO_IF_1_11:
59962306a36Sopenharmony_ci	case WM2200_AUDIO_IF_1_12:
60062306a36Sopenharmony_ci	case WM2200_AUDIO_IF_1_13:
60162306a36Sopenharmony_ci	case WM2200_AUDIO_IF_1_14:
60262306a36Sopenharmony_ci	case WM2200_AUDIO_IF_1_15:
60362306a36Sopenharmony_ci	case WM2200_AUDIO_IF_1_16:
60462306a36Sopenharmony_ci	case WM2200_AUDIO_IF_1_17:
60562306a36Sopenharmony_ci	case WM2200_AUDIO_IF_1_18:
60662306a36Sopenharmony_ci	case WM2200_AUDIO_IF_1_19:
60762306a36Sopenharmony_ci	case WM2200_AUDIO_IF_1_20:
60862306a36Sopenharmony_ci	case WM2200_AUDIO_IF_1_21:
60962306a36Sopenharmony_ci	case WM2200_AUDIO_IF_1_22:
61062306a36Sopenharmony_ci	case WM2200_OUT1LMIX_INPUT_1_SOURCE:
61162306a36Sopenharmony_ci	case WM2200_OUT1LMIX_INPUT_1_VOLUME:
61262306a36Sopenharmony_ci	case WM2200_OUT1LMIX_INPUT_2_SOURCE:
61362306a36Sopenharmony_ci	case WM2200_OUT1LMIX_INPUT_2_VOLUME:
61462306a36Sopenharmony_ci	case WM2200_OUT1LMIX_INPUT_3_SOURCE:
61562306a36Sopenharmony_ci	case WM2200_OUT1LMIX_INPUT_3_VOLUME:
61662306a36Sopenharmony_ci	case WM2200_OUT1LMIX_INPUT_4_SOURCE:
61762306a36Sopenharmony_ci	case WM2200_OUT1LMIX_INPUT_4_VOLUME:
61862306a36Sopenharmony_ci	case WM2200_OUT1RMIX_INPUT_1_SOURCE:
61962306a36Sopenharmony_ci	case WM2200_OUT1RMIX_INPUT_1_VOLUME:
62062306a36Sopenharmony_ci	case WM2200_OUT1RMIX_INPUT_2_SOURCE:
62162306a36Sopenharmony_ci	case WM2200_OUT1RMIX_INPUT_2_VOLUME:
62262306a36Sopenharmony_ci	case WM2200_OUT1RMIX_INPUT_3_SOURCE:
62362306a36Sopenharmony_ci	case WM2200_OUT1RMIX_INPUT_3_VOLUME:
62462306a36Sopenharmony_ci	case WM2200_OUT1RMIX_INPUT_4_SOURCE:
62562306a36Sopenharmony_ci	case WM2200_OUT1RMIX_INPUT_4_VOLUME:
62662306a36Sopenharmony_ci	case WM2200_OUT2LMIX_INPUT_1_SOURCE:
62762306a36Sopenharmony_ci	case WM2200_OUT2LMIX_INPUT_1_VOLUME:
62862306a36Sopenharmony_ci	case WM2200_OUT2LMIX_INPUT_2_SOURCE:
62962306a36Sopenharmony_ci	case WM2200_OUT2LMIX_INPUT_2_VOLUME:
63062306a36Sopenharmony_ci	case WM2200_OUT2LMIX_INPUT_3_SOURCE:
63162306a36Sopenharmony_ci	case WM2200_OUT2LMIX_INPUT_3_VOLUME:
63262306a36Sopenharmony_ci	case WM2200_OUT2LMIX_INPUT_4_SOURCE:
63362306a36Sopenharmony_ci	case WM2200_OUT2LMIX_INPUT_4_VOLUME:
63462306a36Sopenharmony_ci	case WM2200_OUT2RMIX_INPUT_1_SOURCE:
63562306a36Sopenharmony_ci	case WM2200_OUT2RMIX_INPUT_1_VOLUME:
63662306a36Sopenharmony_ci	case WM2200_OUT2RMIX_INPUT_2_SOURCE:
63762306a36Sopenharmony_ci	case WM2200_OUT2RMIX_INPUT_2_VOLUME:
63862306a36Sopenharmony_ci	case WM2200_OUT2RMIX_INPUT_3_SOURCE:
63962306a36Sopenharmony_ci	case WM2200_OUT2RMIX_INPUT_3_VOLUME:
64062306a36Sopenharmony_ci	case WM2200_OUT2RMIX_INPUT_4_SOURCE:
64162306a36Sopenharmony_ci	case WM2200_OUT2RMIX_INPUT_4_VOLUME:
64262306a36Sopenharmony_ci	case WM2200_AIF1TX1MIX_INPUT_1_SOURCE:
64362306a36Sopenharmony_ci	case WM2200_AIF1TX1MIX_INPUT_1_VOLUME:
64462306a36Sopenharmony_ci	case WM2200_AIF1TX1MIX_INPUT_2_SOURCE:
64562306a36Sopenharmony_ci	case WM2200_AIF1TX1MIX_INPUT_2_VOLUME:
64662306a36Sopenharmony_ci	case WM2200_AIF1TX1MIX_INPUT_3_SOURCE:
64762306a36Sopenharmony_ci	case WM2200_AIF1TX1MIX_INPUT_3_VOLUME:
64862306a36Sopenharmony_ci	case WM2200_AIF1TX1MIX_INPUT_4_SOURCE:
64962306a36Sopenharmony_ci	case WM2200_AIF1TX1MIX_INPUT_4_VOLUME:
65062306a36Sopenharmony_ci	case WM2200_AIF1TX2MIX_INPUT_1_SOURCE:
65162306a36Sopenharmony_ci	case WM2200_AIF1TX2MIX_INPUT_1_VOLUME:
65262306a36Sopenharmony_ci	case WM2200_AIF1TX2MIX_INPUT_2_SOURCE:
65362306a36Sopenharmony_ci	case WM2200_AIF1TX2MIX_INPUT_2_VOLUME:
65462306a36Sopenharmony_ci	case WM2200_AIF1TX2MIX_INPUT_3_SOURCE:
65562306a36Sopenharmony_ci	case WM2200_AIF1TX2MIX_INPUT_3_VOLUME:
65662306a36Sopenharmony_ci	case WM2200_AIF1TX2MIX_INPUT_4_SOURCE:
65762306a36Sopenharmony_ci	case WM2200_AIF1TX2MIX_INPUT_4_VOLUME:
65862306a36Sopenharmony_ci	case WM2200_AIF1TX3MIX_INPUT_1_SOURCE:
65962306a36Sopenharmony_ci	case WM2200_AIF1TX3MIX_INPUT_1_VOLUME:
66062306a36Sopenharmony_ci	case WM2200_AIF1TX3MIX_INPUT_2_SOURCE:
66162306a36Sopenharmony_ci	case WM2200_AIF1TX3MIX_INPUT_2_VOLUME:
66262306a36Sopenharmony_ci	case WM2200_AIF1TX3MIX_INPUT_3_SOURCE:
66362306a36Sopenharmony_ci	case WM2200_AIF1TX3MIX_INPUT_3_VOLUME:
66462306a36Sopenharmony_ci	case WM2200_AIF1TX3MIX_INPUT_4_SOURCE:
66562306a36Sopenharmony_ci	case WM2200_AIF1TX3MIX_INPUT_4_VOLUME:
66662306a36Sopenharmony_ci	case WM2200_AIF1TX4MIX_INPUT_1_SOURCE:
66762306a36Sopenharmony_ci	case WM2200_AIF1TX4MIX_INPUT_1_VOLUME:
66862306a36Sopenharmony_ci	case WM2200_AIF1TX4MIX_INPUT_2_SOURCE:
66962306a36Sopenharmony_ci	case WM2200_AIF1TX4MIX_INPUT_2_VOLUME:
67062306a36Sopenharmony_ci	case WM2200_AIF1TX4MIX_INPUT_3_SOURCE:
67162306a36Sopenharmony_ci	case WM2200_AIF1TX4MIX_INPUT_3_VOLUME:
67262306a36Sopenharmony_ci	case WM2200_AIF1TX4MIX_INPUT_4_SOURCE:
67362306a36Sopenharmony_ci	case WM2200_AIF1TX4MIX_INPUT_4_VOLUME:
67462306a36Sopenharmony_ci	case WM2200_AIF1TX5MIX_INPUT_1_SOURCE:
67562306a36Sopenharmony_ci	case WM2200_AIF1TX5MIX_INPUT_1_VOLUME:
67662306a36Sopenharmony_ci	case WM2200_AIF1TX5MIX_INPUT_2_SOURCE:
67762306a36Sopenharmony_ci	case WM2200_AIF1TX5MIX_INPUT_2_VOLUME:
67862306a36Sopenharmony_ci	case WM2200_AIF1TX5MIX_INPUT_3_SOURCE:
67962306a36Sopenharmony_ci	case WM2200_AIF1TX5MIX_INPUT_3_VOLUME:
68062306a36Sopenharmony_ci	case WM2200_AIF1TX5MIX_INPUT_4_SOURCE:
68162306a36Sopenharmony_ci	case WM2200_AIF1TX5MIX_INPUT_4_VOLUME:
68262306a36Sopenharmony_ci	case WM2200_AIF1TX6MIX_INPUT_1_SOURCE:
68362306a36Sopenharmony_ci	case WM2200_AIF1TX6MIX_INPUT_1_VOLUME:
68462306a36Sopenharmony_ci	case WM2200_AIF1TX6MIX_INPUT_2_SOURCE:
68562306a36Sopenharmony_ci	case WM2200_AIF1TX6MIX_INPUT_2_VOLUME:
68662306a36Sopenharmony_ci	case WM2200_AIF1TX6MIX_INPUT_3_SOURCE:
68762306a36Sopenharmony_ci	case WM2200_AIF1TX6MIX_INPUT_3_VOLUME:
68862306a36Sopenharmony_ci	case WM2200_AIF1TX6MIX_INPUT_4_SOURCE:
68962306a36Sopenharmony_ci	case WM2200_AIF1TX6MIX_INPUT_4_VOLUME:
69062306a36Sopenharmony_ci	case WM2200_EQLMIX_INPUT_1_SOURCE:
69162306a36Sopenharmony_ci	case WM2200_EQLMIX_INPUT_1_VOLUME:
69262306a36Sopenharmony_ci	case WM2200_EQLMIX_INPUT_2_SOURCE:
69362306a36Sopenharmony_ci	case WM2200_EQLMIX_INPUT_2_VOLUME:
69462306a36Sopenharmony_ci	case WM2200_EQLMIX_INPUT_3_SOURCE:
69562306a36Sopenharmony_ci	case WM2200_EQLMIX_INPUT_3_VOLUME:
69662306a36Sopenharmony_ci	case WM2200_EQLMIX_INPUT_4_SOURCE:
69762306a36Sopenharmony_ci	case WM2200_EQLMIX_INPUT_4_VOLUME:
69862306a36Sopenharmony_ci	case WM2200_EQRMIX_INPUT_1_SOURCE:
69962306a36Sopenharmony_ci	case WM2200_EQRMIX_INPUT_1_VOLUME:
70062306a36Sopenharmony_ci	case WM2200_EQRMIX_INPUT_2_SOURCE:
70162306a36Sopenharmony_ci	case WM2200_EQRMIX_INPUT_2_VOLUME:
70262306a36Sopenharmony_ci	case WM2200_EQRMIX_INPUT_3_SOURCE:
70362306a36Sopenharmony_ci	case WM2200_EQRMIX_INPUT_3_VOLUME:
70462306a36Sopenharmony_ci	case WM2200_EQRMIX_INPUT_4_SOURCE:
70562306a36Sopenharmony_ci	case WM2200_EQRMIX_INPUT_4_VOLUME:
70662306a36Sopenharmony_ci	case WM2200_LHPF1MIX_INPUT_1_SOURCE:
70762306a36Sopenharmony_ci	case WM2200_LHPF1MIX_INPUT_1_VOLUME:
70862306a36Sopenharmony_ci	case WM2200_LHPF1MIX_INPUT_2_SOURCE:
70962306a36Sopenharmony_ci	case WM2200_LHPF1MIX_INPUT_2_VOLUME:
71062306a36Sopenharmony_ci	case WM2200_LHPF1MIX_INPUT_3_SOURCE:
71162306a36Sopenharmony_ci	case WM2200_LHPF1MIX_INPUT_3_VOLUME:
71262306a36Sopenharmony_ci	case WM2200_LHPF1MIX_INPUT_4_SOURCE:
71362306a36Sopenharmony_ci	case WM2200_LHPF1MIX_INPUT_4_VOLUME:
71462306a36Sopenharmony_ci	case WM2200_LHPF2MIX_INPUT_1_SOURCE:
71562306a36Sopenharmony_ci	case WM2200_LHPF2MIX_INPUT_1_VOLUME:
71662306a36Sopenharmony_ci	case WM2200_LHPF2MIX_INPUT_2_SOURCE:
71762306a36Sopenharmony_ci	case WM2200_LHPF2MIX_INPUT_2_VOLUME:
71862306a36Sopenharmony_ci	case WM2200_LHPF2MIX_INPUT_3_SOURCE:
71962306a36Sopenharmony_ci	case WM2200_LHPF2MIX_INPUT_3_VOLUME:
72062306a36Sopenharmony_ci	case WM2200_LHPF2MIX_INPUT_4_SOURCE:
72162306a36Sopenharmony_ci	case WM2200_LHPF2MIX_INPUT_4_VOLUME:
72262306a36Sopenharmony_ci	case WM2200_DSP1LMIX_INPUT_1_SOURCE:
72362306a36Sopenharmony_ci	case WM2200_DSP1LMIX_INPUT_1_VOLUME:
72462306a36Sopenharmony_ci	case WM2200_DSP1LMIX_INPUT_2_SOURCE:
72562306a36Sopenharmony_ci	case WM2200_DSP1LMIX_INPUT_2_VOLUME:
72662306a36Sopenharmony_ci	case WM2200_DSP1LMIX_INPUT_3_SOURCE:
72762306a36Sopenharmony_ci	case WM2200_DSP1LMIX_INPUT_3_VOLUME:
72862306a36Sopenharmony_ci	case WM2200_DSP1LMIX_INPUT_4_SOURCE:
72962306a36Sopenharmony_ci	case WM2200_DSP1LMIX_INPUT_4_VOLUME:
73062306a36Sopenharmony_ci	case WM2200_DSP1RMIX_INPUT_1_SOURCE:
73162306a36Sopenharmony_ci	case WM2200_DSP1RMIX_INPUT_1_VOLUME:
73262306a36Sopenharmony_ci	case WM2200_DSP1RMIX_INPUT_2_SOURCE:
73362306a36Sopenharmony_ci	case WM2200_DSP1RMIX_INPUT_2_VOLUME:
73462306a36Sopenharmony_ci	case WM2200_DSP1RMIX_INPUT_3_SOURCE:
73562306a36Sopenharmony_ci	case WM2200_DSP1RMIX_INPUT_3_VOLUME:
73662306a36Sopenharmony_ci	case WM2200_DSP1RMIX_INPUT_4_SOURCE:
73762306a36Sopenharmony_ci	case WM2200_DSP1RMIX_INPUT_4_VOLUME:
73862306a36Sopenharmony_ci	case WM2200_DSP1AUX1MIX_INPUT_1_SOURCE:
73962306a36Sopenharmony_ci	case WM2200_DSP1AUX2MIX_INPUT_1_SOURCE:
74062306a36Sopenharmony_ci	case WM2200_DSP1AUX3MIX_INPUT_1_SOURCE:
74162306a36Sopenharmony_ci	case WM2200_DSP1AUX4MIX_INPUT_1_SOURCE:
74262306a36Sopenharmony_ci	case WM2200_DSP1AUX5MIX_INPUT_1_SOURCE:
74362306a36Sopenharmony_ci	case WM2200_DSP1AUX6MIX_INPUT_1_SOURCE:
74462306a36Sopenharmony_ci	case WM2200_DSP2LMIX_INPUT_1_SOURCE:
74562306a36Sopenharmony_ci	case WM2200_DSP2LMIX_INPUT_1_VOLUME:
74662306a36Sopenharmony_ci	case WM2200_DSP2LMIX_INPUT_2_SOURCE:
74762306a36Sopenharmony_ci	case WM2200_DSP2LMIX_INPUT_2_VOLUME:
74862306a36Sopenharmony_ci	case WM2200_DSP2LMIX_INPUT_3_SOURCE:
74962306a36Sopenharmony_ci	case WM2200_DSP2LMIX_INPUT_3_VOLUME:
75062306a36Sopenharmony_ci	case WM2200_DSP2LMIX_INPUT_4_SOURCE:
75162306a36Sopenharmony_ci	case WM2200_DSP2LMIX_INPUT_4_VOLUME:
75262306a36Sopenharmony_ci	case WM2200_DSP2RMIX_INPUT_1_SOURCE:
75362306a36Sopenharmony_ci	case WM2200_DSP2RMIX_INPUT_1_VOLUME:
75462306a36Sopenharmony_ci	case WM2200_DSP2RMIX_INPUT_2_SOURCE:
75562306a36Sopenharmony_ci	case WM2200_DSP2RMIX_INPUT_2_VOLUME:
75662306a36Sopenharmony_ci	case WM2200_DSP2RMIX_INPUT_3_SOURCE:
75762306a36Sopenharmony_ci	case WM2200_DSP2RMIX_INPUT_3_VOLUME:
75862306a36Sopenharmony_ci	case WM2200_DSP2RMIX_INPUT_4_SOURCE:
75962306a36Sopenharmony_ci	case WM2200_DSP2RMIX_INPUT_4_VOLUME:
76062306a36Sopenharmony_ci	case WM2200_DSP2AUX1MIX_INPUT_1_SOURCE:
76162306a36Sopenharmony_ci	case WM2200_DSP2AUX2MIX_INPUT_1_SOURCE:
76262306a36Sopenharmony_ci	case WM2200_DSP2AUX3MIX_INPUT_1_SOURCE:
76362306a36Sopenharmony_ci	case WM2200_DSP2AUX4MIX_INPUT_1_SOURCE:
76462306a36Sopenharmony_ci	case WM2200_DSP2AUX5MIX_INPUT_1_SOURCE:
76562306a36Sopenharmony_ci	case WM2200_DSP2AUX6MIX_INPUT_1_SOURCE:
76662306a36Sopenharmony_ci	case WM2200_GPIO_CTRL_1:
76762306a36Sopenharmony_ci	case WM2200_GPIO_CTRL_2:
76862306a36Sopenharmony_ci	case WM2200_GPIO_CTRL_3:
76962306a36Sopenharmony_ci	case WM2200_GPIO_CTRL_4:
77062306a36Sopenharmony_ci	case WM2200_ADPS1_IRQ0:
77162306a36Sopenharmony_ci	case WM2200_ADPS1_IRQ1:
77262306a36Sopenharmony_ci	case WM2200_MISC_PAD_CTRL_1:
77362306a36Sopenharmony_ci	case WM2200_INTERRUPT_STATUS_1:
77462306a36Sopenharmony_ci	case WM2200_INTERRUPT_STATUS_1_MASK:
77562306a36Sopenharmony_ci	case WM2200_INTERRUPT_STATUS_2:
77662306a36Sopenharmony_ci	case WM2200_INTERRUPT_RAW_STATUS_2:
77762306a36Sopenharmony_ci	case WM2200_INTERRUPT_STATUS_2_MASK:
77862306a36Sopenharmony_ci	case WM2200_INTERRUPT_CONTROL:
77962306a36Sopenharmony_ci	case WM2200_EQL_1:
78062306a36Sopenharmony_ci	case WM2200_EQL_2:
78162306a36Sopenharmony_ci	case WM2200_EQL_3:
78262306a36Sopenharmony_ci	case WM2200_EQL_4:
78362306a36Sopenharmony_ci	case WM2200_EQL_5:
78462306a36Sopenharmony_ci	case WM2200_EQL_6:
78562306a36Sopenharmony_ci	case WM2200_EQL_7:
78662306a36Sopenharmony_ci	case WM2200_EQL_8:
78762306a36Sopenharmony_ci	case WM2200_EQL_9:
78862306a36Sopenharmony_ci	case WM2200_EQL_10:
78962306a36Sopenharmony_ci	case WM2200_EQL_11:
79062306a36Sopenharmony_ci	case WM2200_EQL_12:
79162306a36Sopenharmony_ci	case WM2200_EQL_13:
79262306a36Sopenharmony_ci	case WM2200_EQL_14:
79362306a36Sopenharmony_ci	case WM2200_EQL_15:
79462306a36Sopenharmony_ci	case WM2200_EQL_16:
79562306a36Sopenharmony_ci	case WM2200_EQL_17:
79662306a36Sopenharmony_ci	case WM2200_EQL_18:
79762306a36Sopenharmony_ci	case WM2200_EQL_19:
79862306a36Sopenharmony_ci	case WM2200_EQL_20:
79962306a36Sopenharmony_ci	case WM2200_EQR_1:
80062306a36Sopenharmony_ci	case WM2200_EQR_2:
80162306a36Sopenharmony_ci	case WM2200_EQR_3:
80262306a36Sopenharmony_ci	case WM2200_EQR_4:
80362306a36Sopenharmony_ci	case WM2200_EQR_5:
80462306a36Sopenharmony_ci	case WM2200_EQR_6:
80562306a36Sopenharmony_ci	case WM2200_EQR_7:
80662306a36Sopenharmony_ci	case WM2200_EQR_8:
80762306a36Sopenharmony_ci	case WM2200_EQR_9:
80862306a36Sopenharmony_ci	case WM2200_EQR_10:
80962306a36Sopenharmony_ci	case WM2200_EQR_11:
81062306a36Sopenharmony_ci	case WM2200_EQR_12:
81162306a36Sopenharmony_ci	case WM2200_EQR_13:
81262306a36Sopenharmony_ci	case WM2200_EQR_14:
81362306a36Sopenharmony_ci	case WM2200_EQR_15:
81462306a36Sopenharmony_ci	case WM2200_EQR_16:
81562306a36Sopenharmony_ci	case WM2200_EQR_17:
81662306a36Sopenharmony_ci	case WM2200_EQR_18:
81762306a36Sopenharmony_ci	case WM2200_EQR_19:
81862306a36Sopenharmony_ci	case WM2200_EQR_20:
81962306a36Sopenharmony_ci	case WM2200_HPLPF1_1:
82062306a36Sopenharmony_ci	case WM2200_HPLPF1_2:
82162306a36Sopenharmony_ci	case WM2200_HPLPF2_1:
82262306a36Sopenharmony_ci	case WM2200_HPLPF2_2:
82362306a36Sopenharmony_ci	case WM2200_DSP1_CONTROL_1:
82462306a36Sopenharmony_ci	case WM2200_DSP1_CONTROL_2:
82562306a36Sopenharmony_ci	case WM2200_DSP1_CONTROL_3:
82662306a36Sopenharmony_ci	case WM2200_DSP1_CONTROL_4:
82762306a36Sopenharmony_ci	case WM2200_DSP1_CONTROL_5:
82862306a36Sopenharmony_ci	case WM2200_DSP1_CONTROL_6:
82962306a36Sopenharmony_ci	case WM2200_DSP1_CONTROL_7:
83062306a36Sopenharmony_ci	case WM2200_DSP1_CONTROL_8:
83162306a36Sopenharmony_ci	case WM2200_DSP1_CONTROL_9:
83262306a36Sopenharmony_ci	case WM2200_DSP1_CONTROL_10:
83362306a36Sopenharmony_ci	case WM2200_DSP1_CONTROL_11:
83462306a36Sopenharmony_ci	case WM2200_DSP1_CONTROL_12:
83562306a36Sopenharmony_ci	case WM2200_DSP1_CONTROL_13:
83662306a36Sopenharmony_ci	case WM2200_DSP1_CONTROL_14:
83762306a36Sopenharmony_ci	case WM2200_DSP1_CONTROL_15:
83862306a36Sopenharmony_ci	case WM2200_DSP1_CONTROL_16:
83962306a36Sopenharmony_ci	case WM2200_DSP1_CONTROL_17:
84062306a36Sopenharmony_ci	case WM2200_DSP1_CONTROL_18:
84162306a36Sopenharmony_ci	case WM2200_DSP1_CONTROL_19:
84262306a36Sopenharmony_ci	case WM2200_DSP1_CONTROL_20:
84362306a36Sopenharmony_ci	case WM2200_DSP1_CONTROL_21:
84462306a36Sopenharmony_ci	case WM2200_DSP1_CONTROL_22:
84562306a36Sopenharmony_ci	case WM2200_DSP1_CONTROL_23:
84662306a36Sopenharmony_ci	case WM2200_DSP1_CONTROL_24:
84762306a36Sopenharmony_ci	case WM2200_DSP1_CONTROL_25:
84862306a36Sopenharmony_ci	case WM2200_DSP1_CONTROL_26:
84962306a36Sopenharmony_ci	case WM2200_DSP1_CONTROL_27:
85062306a36Sopenharmony_ci	case WM2200_DSP1_CONTROL_28:
85162306a36Sopenharmony_ci	case WM2200_DSP1_CONTROL_29:
85262306a36Sopenharmony_ci	case WM2200_DSP1_CONTROL_30:
85362306a36Sopenharmony_ci	case WM2200_DSP1_CONTROL_31:
85462306a36Sopenharmony_ci	case WM2200_DSP2_CONTROL_1:
85562306a36Sopenharmony_ci	case WM2200_DSP2_CONTROL_2:
85662306a36Sopenharmony_ci	case WM2200_DSP2_CONTROL_3:
85762306a36Sopenharmony_ci	case WM2200_DSP2_CONTROL_4:
85862306a36Sopenharmony_ci	case WM2200_DSP2_CONTROL_5:
85962306a36Sopenharmony_ci	case WM2200_DSP2_CONTROL_6:
86062306a36Sopenharmony_ci	case WM2200_DSP2_CONTROL_7:
86162306a36Sopenharmony_ci	case WM2200_DSP2_CONTROL_8:
86262306a36Sopenharmony_ci	case WM2200_DSP2_CONTROL_9:
86362306a36Sopenharmony_ci	case WM2200_DSP2_CONTROL_10:
86462306a36Sopenharmony_ci	case WM2200_DSP2_CONTROL_11:
86562306a36Sopenharmony_ci	case WM2200_DSP2_CONTROL_12:
86662306a36Sopenharmony_ci	case WM2200_DSP2_CONTROL_13:
86762306a36Sopenharmony_ci	case WM2200_DSP2_CONTROL_14:
86862306a36Sopenharmony_ci	case WM2200_DSP2_CONTROL_15:
86962306a36Sopenharmony_ci	case WM2200_DSP2_CONTROL_16:
87062306a36Sopenharmony_ci	case WM2200_DSP2_CONTROL_17:
87162306a36Sopenharmony_ci	case WM2200_DSP2_CONTROL_18:
87262306a36Sopenharmony_ci	case WM2200_DSP2_CONTROL_19:
87362306a36Sopenharmony_ci	case WM2200_DSP2_CONTROL_20:
87462306a36Sopenharmony_ci	case WM2200_DSP2_CONTROL_21:
87562306a36Sopenharmony_ci	case WM2200_DSP2_CONTROL_22:
87662306a36Sopenharmony_ci	case WM2200_DSP2_CONTROL_23:
87762306a36Sopenharmony_ci	case WM2200_DSP2_CONTROL_24:
87862306a36Sopenharmony_ci	case WM2200_DSP2_CONTROL_25:
87962306a36Sopenharmony_ci	case WM2200_DSP2_CONTROL_26:
88062306a36Sopenharmony_ci	case WM2200_DSP2_CONTROL_27:
88162306a36Sopenharmony_ci	case WM2200_DSP2_CONTROL_28:
88262306a36Sopenharmony_ci	case WM2200_DSP2_CONTROL_29:
88362306a36Sopenharmony_ci	case WM2200_DSP2_CONTROL_30:
88462306a36Sopenharmony_ci	case WM2200_DSP2_CONTROL_31:
88562306a36Sopenharmony_ci		return true;
88662306a36Sopenharmony_ci	default:
88762306a36Sopenharmony_ci		return false;
88862306a36Sopenharmony_ci	}
88962306a36Sopenharmony_ci}
89062306a36Sopenharmony_ci
89162306a36Sopenharmony_cistatic const struct reg_sequence wm2200_reva_patch[] = {
89262306a36Sopenharmony_ci	{ 0x07, 0x0003 },
89362306a36Sopenharmony_ci	{ 0x102, 0x0200 },
89462306a36Sopenharmony_ci	{ 0x203, 0x0084 },
89562306a36Sopenharmony_ci	{ 0x201, 0x83FF },
89662306a36Sopenharmony_ci	{ 0x20C, 0x0062 },
89762306a36Sopenharmony_ci	{ 0x20D, 0x0062 },
89862306a36Sopenharmony_ci	{ 0x207, 0x2002 },
89962306a36Sopenharmony_ci	{ 0x208, 0x20C0 },
90062306a36Sopenharmony_ci	{ 0x21D, 0x01C0 },
90162306a36Sopenharmony_ci	{ 0x50A, 0x0001 },
90262306a36Sopenharmony_ci	{ 0x50B, 0x0002 },
90362306a36Sopenharmony_ci	{ 0x50C, 0x0003 },
90462306a36Sopenharmony_ci	{ 0x50D, 0x0004 },
90562306a36Sopenharmony_ci	{ 0x50E, 0x0005 },
90662306a36Sopenharmony_ci	{ 0x510, 0x0001 },
90762306a36Sopenharmony_ci	{ 0x511, 0x0002 },
90862306a36Sopenharmony_ci	{ 0x512, 0x0003 },
90962306a36Sopenharmony_ci	{ 0x513, 0x0004 },
91062306a36Sopenharmony_ci	{ 0x514, 0x0005 },
91162306a36Sopenharmony_ci	{ 0x515, 0x0000 },
91262306a36Sopenharmony_ci	{ 0x201, 0x8084 },
91362306a36Sopenharmony_ci	{ 0x202, 0xBBDE },
91462306a36Sopenharmony_ci	{ 0x203, 0x00EC },
91562306a36Sopenharmony_ci	{ 0x500, 0x8000 },
91662306a36Sopenharmony_ci	{ 0x507, 0x1820 },
91762306a36Sopenharmony_ci	{ 0x508, 0x1820 },
91862306a36Sopenharmony_ci	{ 0x505, 0x0300 },
91962306a36Sopenharmony_ci	{ 0x506, 0x0300 },
92062306a36Sopenharmony_ci	{ 0x302, 0x2280 },
92162306a36Sopenharmony_ci	{ 0x303, 0x0080 },
92262306a36Sopenharmony_ci	{ 0x304, 0x2280 },
92362306a36Sopenharmony_ci	{ 0x305, 0x0080 },
92462306a36Sopenharmony_ci	{ 0x306, 0x2280 },
92562306a36Sopenharmony_ci	{ 0x307, 0x0080 },
92662306a36Sopenharmony_ci	{ 0x401, 0x0080 },
92762306a36Sopenharmony_ci	{ 0x402, 0x0080 },
92862306a36Sopenharmony_ci	{ 0x417, 0x3069 },
92962306a36Sopenharmony_ci	{ 0x900, 0x6318 },
93062306a36Sopenharmony_ci	{ 0x901, 0x6300 },
93162306a36Sopenharmony_ci	{ 0x902, 0x0FC8 },
93262306a36Sopenharmony_ci	{ 0x903, 0x03FE },
93362306a36Sopenharmony_ci	{ 0x904, 0x00E0 },
93462306a36Sopenharmony_ci	{ 0x905, 0x1EC4 },
93562306a36Sopenharmony_ci	{ 0x906, 0xF136 },
93662306a36Sopenharmony_ci	{ 0x907, 0x0409 },
93762306a36Sopenharmony_ci	{ 0x908, 0x04CC },
93862306a36Sopenharmony_ci	{ 0x909, 0x1C9B },
93962306a36Sopenharmony_ci	{ 0x90A, 0xF337 },
94062306a36Sopenharmony_ci	{ 0x90B, 0x040B },
94162306a36Sopenharmony_ci	{ 0x90C, 0x0CBB },
94262306a36Sopenharmony_ci	{ 0x90D, 0x16F8 },
94362306a36Sopenharmony_ci	{ 0x90E, 0xF7D9 },
94462306a36Sopenharmony_ci	{ 0x90F, 0x040A },
94562306a36Sopenharmony_ci	{ 0x910, 0x1F14 },
94662306a36Sopenharmony_ci	{ 0x911, 0x058C },
94762306a36Sopenharmony_ci	{ 0x912, 0x0563 },
94862306a36Sopenharmony_ci	{ 0x913, 0x4000 },
94962306a36Sopenharmony_ci	{ 0x916, 0x6318 },
95062306a36Sopenharmony_ci	{ 0x917, 0x6300 },
95162306a36Sopenharmony_ci	{ 0x918, 0x0FC8 },
95262306a36Sopenharmony_ci	{ 0x919, 0x03FE },
95362306a36Sopenharmony_ci	{ 0x91A, 0x00E0 },
95462306a36Sopenharmony_ci	{ 0x91B, 0x1EC4 },
95562306a36Sopenharmony_ci	{ 0x91C, 0xF136 },
95662306a36Sopenharmony_ci	{ 0x91D, 0x0409 },
95762306a36Sopenharmony_ci	{ 0x91E, 0x04CC },
95862306a36Sopenharmony_ci	{ 0x91F, 0x1C9B },
95962306a36Sopenharmony_ci	{ 0x920, 0xF337 },
96062306a36Sopenharmony_ci	{ 0x921, 0x040B },
96162306a36Sopenharmony_ci	{ 0x922, 0x0CBB },
96262306a36Sopenharmony_ci	{ 0x923, 0x16F8 },
96362306a36Sopenharmony_ci	{ 0x924, 0xF7D9 },
96462306a36Sopenharmony_ci	{ 0x925, 0x040A },
96562306a36Sopenharmony_ci	{ 0x926, 0x1F14 },
96662306a36Sopenharmony_ci	{ 0x927, 0x058C },
96762306a36Sopenharmony_ci	{ 0x928, 0x0563 },
96862306a36Sopenharmony_ci	{ 0x929, 0x4000 },
96962306a36Sopenharmony_ci	{ 0x709, 0x2000 },
97062306a36Sopenharmony_ci	{ 0x207, 0x200E },
97162306a36Sopenharmony_ci	{ 0x208, 0x20D4 },
97262306a36Sopenharmony_ci	{ 0x20A, 0x0080 },
97362306a36Sopenharmony_ci	{ 0x07, 0x0000 },
97462306a36Sopenharmony_ci};
97562306a36Sopenharmony_ci
97662306a36Sopenharmony_cistatic int wm2200_reset(struct wm2200_priv *wm2200)
97762306a36Sopenharmony_ci{
97862306a36Sopenharmony_ci	if (wm2200->pdata.reset) {
97962306a36Sopenharmony_ci		gpio_set_value_cansleep(wm2200->pdata.reset, 0);
98062306a36Sopenharmony_ci		gpio_set_value_cansleep(wm2200->pdata.reset, 1);
98162306a36Sopenharmony_ci
98262306a36Sopenharmony_ci		return 0;
98362306a36Sopenharmony_ci	} else {
98462306a36Sopenharmony_ci		return regmap_write(wm2200->regmap, WM2200_SOFTWARE_RESET,
98562306a36Sopenharmony_ci				    0x2200);
98662306a36Sopenharmony_ci	}
98762306a36Sopenharmony_ci}
98862306a36Sopenharmony_ci
98962306a36Sopenharmony_cistatic DECLARE_TLV_DB_SCALE(in_tlv, -6300, 100, 0);
99062306a36Sopenharmony_cistatic DECLARE_TLV_DB_SCALE(digital_tlv, -6400, 50, 0);
99162306a36Sopenharmony_cistatic DECLARE_TLV_DB_SCALE(out_tlv, -6400, 100, 0);
99262306a36Sopenharmony_ci
99362306a36Sopenharmony_cistatic const char * const wm2200_mixer_texts[] = {
99462306a36Sopenharmony_ci	"None",
99562306a36Sopenharmony_ci	"Tone Generator",
99662306a36Sopenharmony_ci	"AEC Loopback",
99762306a36Sopenharmony_ci	"IN1L",
99862306a36Sopenharmony_ci	"IN1R",
99962306a36Sopenharmony_ci	"IN2L",
100062306a36Sopenharmony_ci	"IN2R",
100162306a36Sopenharmony_ci	"IN3L",
100262306a36Sopenharmony_ci	"IN3R",
100362306a36Sopenharmony_ci	"AIF1RX1",
100462306a36Sopenharmony_ci	"AIF1RX2",
100562306a36Sopenharmony_ci	"AIF1RX3",
100662306a36Sopenharmony_ci	"AIF1RX4",
100762306a36Sopenharmony_ci	"AIF1RX5",
100862306a36Sopenharmony_ci	"AIF1RX6",
100962306a36Sopenharmony_ci	"EQL",
101062306a36Sopenharmony_ci	"EQR",
101162306a36Sopenharmony_ci	"LHPF1",
101262306a36Sopenharmony_ci	"LHPF2",
101362306a36Sopenharmony_ci	"DSP1.1",
101462306a36Sopenharmony_ci	"DSP1.2",
101562306a36Sopenharmony_ci	"DSP1.3",
101662306a36Sopenharmony_ci	"DSP1.4",
101762306a36Sopenharmony_ci	"DSP1.5",
101862306a36Sopenharmony_ci	"DSP1.6",
101962306a36Sopenharmony_ci	"DSP2.1",
102062306a36Sopenharmony_ci	"DSP2.2",
102162306a36Sopenharmony_ci	"DSP2.3",
102262306a36Sopenharmony_ci	"DSP2.4",
102362306a36Sopenharmony_ci	"DSP2.5",
102462306a36Sopenharmony_ci	"DSP2.6",
102562306a36Sopenharmony_ci};
102662306a36Sopenharmony_ci
102762306a36Sopenharmony_cistatic unsigned int wm2200_mixer_values[] = {
102862306a36Sopenharmony_ci	0x00,
102962306a36Sopenharmony_ci	0x04,   /* Tone */
103062306a36Sopenharmony_ci	0x08,   /* AEC */
103162306a36Sopenharmony_ci	0x10,   /* Input */
103262306a36Sopenharmony_ci	0x11,
103362306a36Sopenharmony_ci	0x12,
103462306a36Sopenharmony_ci	0x13,
103562306a36Sopenharmony_ci	0x14,
103662306a36Sopenharmony_ci	0x15,
103762306a36Sopenharmony_ci	0x20,   /* AIF */
103862306a36Sopenharmony_ci	0x21,
103962306a36Sopenharmony_ci	0x22,
104062306a36Sopenharmony_ci	0x23,
104162306a36Sopenharmony_ci	0x24,
104262306a36Sopenharmony_ci	0x25,
104362306a36Sopenharmony_ci	0x50,   /* EQ */
104462306a36Sopenharmony_ci	0x51,
104562306a36Sopenharmony_ci	0x60,   /* LHPF1 */
104662306a36Sopenharmony_ci	0x61,   /* LHPF2 */
104762306a36Sopenharmony_ci	0x68,   /* DSP1 */
104862306a36Sopenharmony_ci	0x69,
104962306a36Sopenharmony_ci	0x6a,
105062306a36Sopenharmony_ci	0x6b,
105162306a36Sopenharmony_ci	0x6c,
105262306a36Sopenharmony_ci	0x6d,
105362306a36Sopenharmony_ci	0x70,   /* DSP2 */
105462306a36Sopenharmony_ci	0x71,
105562306a36Sopenharmony_ci	0x72,
105662306a36Sopenharmony_ci	0x73,
105762306a36Sopenharmony_ci	0x74,
105862306a36Sopenharmony_ci	0x75,
105962306a36Sopenharmony_ci};
106062306a36Sopenharmony_ci
106162306a36Sopenharmony_ci#define WM2200_MIXER_CONTROLS(name, base) \
106262306a36Sopenharmony_ci	SOC_SINGLE_TLV(name " Input 1 Volume", base + 1 , \
106362306a36Sopenharmony_ci		       WM2200_MIXER_VOL_SHIFT, 80, 0, mixer_tlv), \
106462306a36Sopenharmony_ci	SOC_SINGLE_TLV(name " Input 2 Volume", base + 3 , \
106562306a36Sopenharmony_ci		       WM2200_MIXER_VOL_SHIFT, 80, 0, mixer_tlv), \
106662306a36Sopenharmony_ci	SOC_SINGLE_TLV(name " Input 3 Volume", base + 5 , \
106762306a36Sopenharmony_ci		       WM2200_MIXER_VOL_SHIFT, 80, 0, mixer_tlv), \
106862306a36Sopenharmony_ci	SOC_SINGLE_TLV(name " Input 4 Volume", base + 7 , \
106962306a36Sopenharmony_ci		       WM2200_MIXER_VOL_SHIFT, 80, 0, mixer_tlv)
107062306a36Sopenharmony_ci
107162306a36Sopenharmony_ci#define WM2200_MUX_ENUM_DECL(name, reg) \
107262306a36Sopenharmony_ci	SOC_VALUE_ENUM_SINGLE_DECL(name, reg, 0, 0xff, 			\
107362306a36Sopenharmony_ci				   wm2200_mixer_texts, wm2200_mixer_values)
107462306a36Sopenharmony_ci
107562306a36Sopenharmony_ci#define WM2200_MUX_CTL_DECL(name) \
107662306a36Sopenharmony_ci	const struct snd_kcontrol_new name##_mux =	\
107762306a36Sopenharmony_ci		SOC_DAPM_ENUM("Route", name##_enum)
107862306a36Sopenharmony_ci
107962306a36Sopenharmony_ci#define WM2200_MIXER_ENUMS(name, base_reg) \
108062306a36Sopenharmony_ci	static WM2200_MUX_ENUM_DECL(name##_in1_enum, base_reg);	     \
108162306a36Sopenharmony_ci	static WM2200_MUX_ENUM_DECL(name##_in2_enum, base_reg + 2);  \
108262306a36Sopenharmony_ci	static WM2200_MUX_ENUM_DECL(name##_in3_enum, base_reg + 4);  \
108362306a36Sopenharmony_ci	static WM2200_MUX_ENUM_DECL(name##_in4_enum, base_reg + 6);  \
108462306a36Sopenharmony_ci	static WM2200_MUX_CTL_DECL(name##_in1); \
108562306a36Sopenharmony_ci	static WM2200_MUX_CTL_DECL(name##_in2); \
108662306a36Sopenharmony_ci	static WM2200_MUX_CTL_DECL(name##_in3); \
108762306a36Sopenharmony_ci	static WM2200_MUX_CTL_DECL(name##_in4)
108862306a36Sopenharmony_ci
108962306a36Sopenharmony_ci#define WM2200_DSP_ENUMS(name, base_reg) \
109062306a36Sopenharmony_ci	static WM2200_MUX_ENUM_DECL(name##_aux1_enum, base_reg);     \
109162306a36Sopenharmony_ci	static WM2200_MUX_ENUM_DECL(name##_aux2_enum, base_reg + 1); \
109262306a36Sopenharmony_ci	static WM2200_MUX_ENUM_DECL(name##_aux3_enum, base_reg + 2); \
109362306a36Sopenharmony_ci	static WM2200_MUX_ENUM_DECL(name##_aux4_enum, base_reg + 3); \
109462306a36Sopenharmony_ci	static WM2200_MUX_ENUM_DECL(name##_aux5_enum, base_reg + 4); \
109562306a36Sopenharmony_ci	static WM2200_MUX_ENUM_DECL(name##_aux6_enum, base_reg + 5); \
109662306a36Sopenharmony_ci	static WM2200_MUX_CTL_DECL(name##_aux1); \
109762306a36Sopenharmony_ci	static WM2200_MUX_CTL_DECL(name##_aux2); \
109862306a36Sopenharmony_ci	static WM2200_MUX_CTL_DECL(name##_aux3); \
109962306a36Sopenharmony_ci	static WM2200_MUX_CTL_DECL(name##_aux4); \
110062306a36Sopenharmony_ci	static WM2200_MUX_CTL_DECL(name##_aux5); \
110162306a36Sopenharmony_ci	static WM2200_MUX_CTL_DECL(name##_aux6);
110262306a36Sopenharmony_ci
110362306a36Sopenharmony_cistatic const char *wm2200_rxanc_input_sel_texts[] = {
110462306a36Sopenharmony_ci	"None", "IN1", "IN2", "IN3",
110562306a36Sopenharmony_ci};
110662306a36Sopenharmony_ci
110762306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(wm2200_rxanc_input_sel,
110862306a36Sopenharmony_ci			    WM2200_RXANC_SRC,
110962306a36Sopenharmony_ci			    WM2200_IN_RXANC_SEL_SHIFT,
111062306a36Sopenharmony_ci			    wm2200_rxanc_input_sel_texts);
111162306a36Sopenharmony_ci
111262306a36Sopenharmony_cistatic const struct snd_kcontrol_new wm2200_snd_controls[] = {
111362306a36Sopenharmony_ciSOC_SINGLE("IN1 High Performance Switch", WM2200_IN1L_CONTROL,
111462306a36Sopenharmony_ci	   WM2200_IN1_OSR_SHIFT, 1, 0),
111562306a36Sopenharmony_ciSOC_SINGLE("IN2 High Performance Switch", WM2200_IN2L_CONTROL,
111662306a36Sopenharmony_ci	   WM2200_IN2_OSR_SHIFT, 1, 0),
111762306a36Sopenharmony_ciSOC_SINGLE("IN3 High Performance Switch", WM2200_IN3L_CONTROL,
111862306a36Sopenharmony_ci	   WM2200_IN3_OSR_SHIFT, 1, 0),
111962306a36Sopenharmony_ci
112062306a36Sopenharmony_ciSOC_DOUBLE_R_TLV("IN1 Volume", WM2200_IN1L_CONTROL, WM2200_IN1R_CONTROL,
112162306a36Sopenharmony_ci		 WM2200_IN1L_PGA_VOL_SHIFT, 0x5f, 0, in_tlv),
112262306a36Sopenharmony_ciSOC_DOUBLE_R_TLV("IN2 Volume", WM2200_IN2L_CONTROL, WM2200_IN2R_CONTROL,
112362306a36Sopenharmony_ci		 WM2200_IN2L_PGA_VOL_SHIFT, 0x5f, 0, in_tlv),
112462306a36Sopenharmony_ciSOC_DOUBLE_R_TLV("IN3 Volume", WM2200_IN3L_CONTROL, WM2200_IN3R_CONTROL,
112562306a36Sopenharmony_ci		 WM2200_IN3L_PGA_VOL_SHIFT, 0x5f, 0, in_tlv),
112662306a36Sopenharmony_ci
112762306a36Sopenharmony_ciSOC_DOUBLE_R("IN1 Digital Switch", WM2200_ADC_DIGITAL_VOLUME_1L,
112862306a36Sopenharmony_ci	     WM2200_ADC_DIGITAL_VOLUME_1R, WM2200_IN1L_MUTE_SHIFT, 1, 1),
112962306a36Sopenharmony_ciSOC_DOUBLE_R("IN2 Digital Switch", WM2200_ADC_DIGITAL_VOLUME_2L,
113062306a36Sopenharmony_ci	     WM2200_ADC_DIGITAL_VOLUME_2R, WM2200_IN2L_MUTE_SHIFT, 1, 1),
113162306a36Sopenharmony_ciSOC_DOUBLE_R("IN3 Digital Switch", WM2200_ADC_DIGITAL_VOLUME_3L,
113262306a36Sopenharmony_ci	     WM2200_ADC_DIGITAL_VOLUME_3R, WM2200_IN3L_MUTE_SHIFT, 1, 1),
113362306a36Sopenharmony_ci
113462306a36Sopenharmony_ciSOC_DOUBLE_R_TLV("IN1 Digital Volume", WM2200_ADC_DIGITAL_VOLUME_1L,
113562306a36Sopenharmony_ci		 WM2200_ADC_DIGITAL_VOLUME_1R, WM2200_IN1L_DIG_VOL_SHIFT,
113662306a36Sopenharmony_ci		 0xbf, 0, digital_tlv),
113762306a36Sopenharmony_ciSOC_DOUBLE_R_TLV("IN2 Digital Volume", WM2200_ADC_DIGITAL_VOLUME_2L,
113862306a36Sopenharmony_ci		 WM2200_ADC_DIGITAL_VOLUME_2R, WM2200_IN2L_DIG_VOL_SHIFT,
113962306a36Sopenharmony_ci		 0xbf, 0, digital_tlv),
114062306a36Sopenharmony_ciSOC_DOUBLE_R_TLV("IN3 Digital Volume", WM2200_ADC_DIGITAL_VOLUME_3L,
114162306a36Sopenharmony_ci		 WM2200_ADC_DIGITAL_VOLUME_3R, WM2200_IN3L_DIG_VOL_SHIFT,
114262306a36Sopenharmony_ci		 0xbf, 0, digital_tlv),
114362306a36Sopenharmony_ci
114462306a36Sopenharmony_ciSND_SOC_BYTES_MASK("EQL Coefficients", WM2200_EQL_1, 20, WM2200_EQL_ENA),
114562306a36Sopenharmony_ciSND_SOC_BYTES_MASK("EQR Coefficients", WM2200_EQR_1, 20, WM2200_EQR_ENA),
114662306a36Sopenharmony_ci
114762306a36Sopenharmony_ciSND_SOC_BYTES("LHPF1 Coefficients", WM2200_HPLPF1_2, 1),
114862306a36Sopenharmony_ciSND_SOC_BYTES("LHPF2 Coefficients", WM2200_HPLPF2_2, 1),
114962306a36Sopenharmony_ci
115062306a36Sopenharmony_ciSOC_SINGLE("OUT1 High Performance Switch", WM2200_DAC_DIGITAL_VOLUME_1L,
115162306a36Sopenharmony_ci	   WM2200_OUT1_OSR_SHIFT, 1, 0),
115262306a36Sopenharmony_ciSOC_SINGLE("OUT2 High Performance Switch", WM2200_DAC_DIGITAL_VOLUME_2L,
115362306a36Sopenharmony_ci	   WM2200_OUT2_OSR_SHIFT, 1, 0),
115462306a36Sopenharmony_ci
115562306a36Sopenharmony_ciSOC_DOUBLE_R("OUT1 Digital Switch", WM2200_DAC_DIGITAL_VOLUME_1L,
115662306a36Sopenharmony_ci	     WM2200_DAC_DIGITAL_VOLUME_1R, WM2200_OUT1L_MUTE_SHIFT, 1, 1),
115762306a36Sopenharmony_ciSOC_DOUBLE_R_TLV("OUT1 Digital Volume", WM2200_DAC_DIGITAL_VOLUME_1L,
115862306a36Sopenharmony_ci		 WM2200_DAC_DIGITAL_VOLUME_1R, WM2200_OUT1L_VOL_SHIFT, 0x9f, 0,
115962306a36Sopenharmony_ci		 digital_tlv),
116062306a36Sopenharmony_ciSOC_DOUBLE_R_TLV("OUT1 Volume", WM2200_DAC_VOLUME_LIMIT_1L,
116162306a36Sopenharmony_ci		 WM2200_DAC_VOLUME_LIMIT_1R, WM2200_OUT1L_PGA_VOL_SHIFT,
116262306a36Sopenharmony_ci		 0x46, 0, out_tlv),
116362306a36Sopenharmony_ci
116462306a36Sopenharmony_ciSOC_DOUBLE_R("OUT2 Digital Switch", WM2200_DAC_DIGITAL_VOLUME_2L,
116562306a36Sopenharmony_ci	     WM2200_DAC_DIGITAL_VOLUME_2R, WM2200_OUT2L_MUTE_SHIFT, 1, 1),
116662306a36Sopenharmony_ciSOC_DOUBLE_R_TLV("OUT2 Digital Volume", WM2200_DAC_DIGITAL_VOLUME_2L,
116762306a36Sopenharmony_ci		 WM2200_DAC_DIGITAL_VOLUME_2R, WM2200_OUT2L_VOL_SHIFT, 0x9f, 0,
116862306a36Sopenharmony_ci		 digital_tlv),
116962306a36Sopenharmony_ciSOC_DOUBLE("OUT2 Switch", WM2200_PDM_1, WM2200_SPK1L_MUTE_SHIFT,
117062306a36Sopenharmony_ci	   WM2200_SPK1R_MUTE_SHIFT, 1, 1),
117162306a36Sopenharmony_ciSOC_ENUM("RxANC Src", wm2200_rxanc_input_sel),
117262306a36Sopenharmony_ci
117362306a36Sopenharmony_ciWM_ADSP_FW_CONTROL("DSP1", 0),
117462306a36Sopenharmony_ciWM_ADSP_FW_CONTROL("DSP2", 1),
117562306a36Sopenharmony_ci};
117662306a36Sopenharmony_ci
117762306a36Sopenharmony_ciWM2200_MIXER_ENUMS(OUT1L, WM2200_OUT1LMIX_INPUT_1_SOURCE);
117862306a36Sopenharmony_ciWM2200_MIXER_ENUMS(OUT1R, WM2200_OUT1RMIX_INPUT_1_SOURCE);
117962306a36Sopenharmony_ciWM2200_MIXER_ENUMS(OUT2L, WM2200_OUT2LMIX_INPUT_1_SOURCE);
118062306a36Sopenharmony_ciWM2200_MIXER_ENUMS(OUT2R, WM2200_OUT2RMIX_INPUT_1_SOURCE);
118162306a36Sopenharmony_ci
118262306a36Sopenharmony_ciWM2200_MIXER_ENUMS(AIF1TX1, WM2200_AIF1TX1MIX_INPUT_1_SOURCE);
118362306a36Sopenharmony_ciWM2200_MIXER_ENUMS(AIF1TX2, WM2200_AIF1TX2MIX_INPUT_1_SOURCE);
118462306a36Sopenharmony_ciWM2200_MIXER_ENUMS(AIF1TX3, WM2200_AIF1TX3MIX_INPUT_1_SOURCE);
118562306a36Sopenharmony_ciWM2200_MIXER_ENUMS(AIF1TX4, WM2200_AIF1TX4MIX_INPUT_1_SOURCE);
118662306a36Sopenharmony_ciWM2200_MIXER_ENUMS(AIF1TX5, WM2200_AIF1TX5MIX_INPUT_1_SOURCE);
118762306a36Sopenharmony_ciWM2200_MIXER_ENUMS(AIF1TX6, WM2200_AIF1TX6MIX_INPUT_1_SOURCE);
118862306a36Sopenharmony_ci
118962306a36Sopenharmony_ciWM2200_MIXER_ENUMS(EQL, WM2200_EQLMIX_INPUT_1_SOURCE);
119062306a36Sopenharmony_ciWM2200_MIXER_ENUMS(EQR, WM2200_EQRMIX_INPUT_1_SOURCE);
119162306a36Sopenharmony_ci
119262306a36Sopenharmony_ciWM2200_MIXER_ENUMS(DSP1L, WM2200_DSP1LMIX_INPUT_1_SOURCE);
119362306a36Sopenharmony_ciWM2200_MIXER_ENUMS(DSP1R, WM2200_DSP1RMIX_INPUT_1_SOURCE);
119462306a36Sopenharmony_ciWM2200_MIXER_ENUMS(DSP2L, WM2200_DSP2LMIX_INPUT_1_SOURCE);
119562306a36Sopenharmony_ciWM2200_MIXER_ENUMS(DSP2R, WM2200_DSP2RMIX_INPUT_1_SOURCE);
119662306a36Sopenharmony_ci
119762306a36Sopenharmony_ciWM2200_DSP_ENUMS(DSP1, WM2200_DSP1AUX1MIX_INPUT_1_SOURCE);
119862306a36Sopenharmony_ciWM2200_DSP_ENUMS(DSP2, WM2200_DSP2AUX1MIX_INPUT_1_SOURCE);
119962306a36Sopenharmony_ci
120062306a36Sopenharmony_ciWM2200_MIXER_ENUMS(LHPF1, WM2200_LHPF1MIX_INPUT_1_SOURCE);
120162306a36Sopenharmony_ciWM2200_MIXER_ENUMS(LHPF2, WM2200_LHPF2MIX_INPUT_1_SOURCE);
120262306a36Sopenharmony_ci
120362306a36Sopenharmony_ci#define WM2200_MUX(name, ctrl) \
120462306a36Sopenharmony_ci	SND_SOC_DAPM_MUX(name, SND_SOC_NOPM, 0, 0, ctrl)
120562306a36Sopenharmony_ci
120662306a36Sopenharmony_ci#define WM2200_MIXER_WIDGETS(name, name_str)	\
120762306a36Sopenharmony_ci	WM2200_MUX(name_str " Input 1", &name##_in1_mux), \
120862306a36Sopenharmony_ci	WM2200_MUX(name_str " Input 2", &name##_in2_mux), \
120962306a36Sopenharmony_ci	WM2200_MUX(name_str " Input 3", &name##_in3_mux), \
121062306a36Sopenharmony_ci	WM2200_MUX(name_str " Input 4", &name##_in4_mux), \
121162306a36Sopenharmony_ci	SND_SOC_DAPM_MIXER(name_str " Mixer", SND_SOC_NOPM, 0, 0, NULL, 0)
121262306a36Sopenharmony_ci
121362306a36Sopenharmony_ci#define WM2200_DSP_WIDGETS(name, name_str) \
121462306a36Sopenharmony_ci	WM2200_MIXER_WIDGETS(name##L, name_str "L"), \
121562306a36Sopenharmony_ci	WM2200_MIXER_WIDGETS(name##R, name_str "R"), \
121662306a36Sopenharmony_ci	WM2200_MUX(name_str " Aux 1", &name##_aux1_mux), \
121762306a36Sopenharmony_ci	WM2200_MUX(name_str " Aux 2", &name##_aux2_mux), \
121862306a36Sopenharmony_ci	WM2200_MUX(name_str " Aux 3", &name##_aux3_mux), \
121962306a36Sopenharmony_ci	WM2200_MUX(name_str " Aux 4", &name##_aux4_mux), \
122062306a36Sopenharmony_ci	WM2200_MUX(name_str " Aux 5", &name##_aux5_mux), \
122162306a36Sopenharmony_ci	WM2200_MUX(name_str " Aux 6", &name##_aux6_mux)
122262306a36Sopenharmony_ci
122362306a36Sopenharmony_ci#define WM2200_MIXER_INPUT_ROUTES(name)	\
122462306a36Sopenharmony_ci	{ name, "Tone Generator", "Tone Generator" }, \
122562306a36Sopenharmony_ci	{ name, "AEC Loopback", "AEC Loopback" }, \
122662306a36Sopenharmony_ci        { name, "IN1L", "IN1L PGA" }, \
122762306a36Sopenharmony_ci        { name, "IN1R", "IN1R PGA" }, \
122862306a36Sopenharmony_ci        { name, "IN2L", "IN2L PGA" }, \
122962306a36Sopenharmony_ci        { name, "IN2R", "IN2R PGA" }, \
123062306a36Sopenharmony_ci        { name, "IN3L", "IN3L PGA" }, \
123162306a36Sopenharmony_ci        { name, "IN3R", "IN3R PGA" }, \
123262306a36Sopenharmony_ci        { name, "DSP1.1", "DSP1" }, \
123362306a36Sopenharmony_ci        { name, "DSP1.2", "DSP1" }, \
123462306a36Sopenharmony_ci        { name, "DSP1.3", "DSP1" }, \
123562306a36Sopenharmony_ci        { name, "DSP1.4", "DSP1" }, \
123662306a36Sopenharmony_ci        { name, "DSP1.5", "DSP1" }, \
123762306a36Sopenharmony_ci        { name, "DSP1.6", "DSP1" }, \
123862306a36Sopenharmony_ci        { name, "DSP2.1", "DSP2" }, \
123962306a36Sopenharmony_ci        { name, "DSP2.2", "DSP2" }, \
124062306a36Sopenharmony_ci        { name, "DSP2.3", "DSP2" }, \
124162306a36Sopenharmony_ci        { name, "DSP2.4", "DSP2" }, \
124262306a36Sopenharmony_ci        { name, "DSP2.5", "DSP2" }, \
124362306a36Sopenharmony_ci        { name, "DSP2.6", "DSP2" }, \
124462306a36Sopenharmony_ci        { name, "AIF1RX1", "AIF1RX1" }, \
124562306a36Sopenharmony_ci        { name, "AIF1RX2", "AIF1RX2" }, \
124662306a36Sopenharmony_ci        { name, "AIF1RX3", "AIF1RX3" }, \
124762306a36Sopenharmony_ci        { name, "AIF1RX4", "AIF1RX4" }, \
124862306a36Sopenharmony_ci        { name, "AIF1RX5", "AIF1RX5" }, \
124962306a36Sopenharmony_ci        { name, "AIF1RX6", "AIF1RX6" }, \
125062306a36Sopenharmony_ci        { name, "EQL", "EQL" }, \
125162306a36Sopenharmony_ci        { name, "EQR", "EQR" }, \
125262306a36Sopenharmony_ci        { name, "LHPF1", "LHPF1" }, \
125362306a36Sopenharmony_ci        { name, "LHPF2", "LHPF2" }
125462306a36Sopenharmony_ci
125562306a36Sopenharmony_ci#define WM2200_MIXER_ROUTES(widget, name) \
125662306a36Sopenharmony_ci	{ widget, NULL, name " Mixer" },         \
125762306a36Sopenharmony_ci	{ name " Mixer", NULL, name " Input 1" }, \
125862306a36Sopenharmony_ci	{ name " Mixer", NULL, name " Input 2" }, \
125962306a36Sopenharmony_ci	{ name " Mixer", NULL, name " Input 3" }, \
126062306a36Sopenharmony_ci	{ name " Mixer", NULL, name " Input 4" }, \
126162306a36Sopenharmony_ci	WM2200_MIXER_INPUT_ROUTES(name " Input 1"), \
126262306a36Sopenharmony_ci	WM2200_MIXER_INPUT_ROUTES(name " Input 2"), \
126362306a36Sopenharmony_ci	WM2200_MIXER_INPUT_ROUTES(name " Input 3"), \
126462306a36Sopenharmony_ci	WM2200_MIXER_INPUT_ROUTES(name " Input 4")
126562306a36Sopenharmony_ci
126662306a36Sopenharmony_ci#define WM2200_DSP_AUX_ROUTES(name) \
126762306a36Sopenharmony_ci	{ name, NULL, name " Aux 1" }, \
126862306a36Sopenharmony_ci	{ name, NULL, name " Aux 2" }, \
126962306a36Sopenharmony_ci	{ name, NULL, name " Aux 3" }, \
127062306a36Sopenharmony_ci	{ name, NULL, name " Aux 4" }, \
127162306a36Sopenharmony_ci	{ name, NULL, name " Aux 5" }, \
127262306a36Sopenharmony_ci	{ name, NULL, name " Aux 6" }, \
127362306a36Sopenharmony_ci	WM2200_MIXER_INPUT_ROUTES(name " Aux 1"), \
127462306a36Sopenharmony_ci	WM2200_MIXER_INPUT_ROUTES(name " Aux 2"), \
127562306a36Sopenharmony_ci	WM2200_MIXER_INPUT_ROUTES(name " Aux 3"), \
127662306a36Sopenharmony_ci	WM2200_MIXER_INPUT_ROUTES(name " Aux 4"), \
127762306a36Sopenharmony_ci	WM2200_MIXER_INPUT_ROUTES(name " Aux 5"), \
127862306a36Sopenharmony_ci	WM2200_MIXER_INPUT_ROUTES(name " Aux 6")
127962306a36Sopenharmony_ci
128062306a36Sopenharmony_cistatic const char *wm2200_aec_loopback_texts[] = {
128162306a36Sopenharmony_ci	"OUT1L", "OUT1R", "OUT2L", "OUT2R",
128262306a36Sopenharmony_ci};
128362306a36Sopenharmony_ci
128462306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(wm2200_aec_loopback,
128562306a36Sopenharmony_ci			    WM2200_DAC_AEC_CONTROL_1,
128662306a36Sopenharmony_ci			    WM2200_AEC_LOOPBACK_SRC_SHIFT,
128762306a36Sopenharmony_ci			    wm2200_aec_loopback_texts);
128862306a36Sopenharmony_ci
128962306a36Sopenharmony_cistatic const struct snd_kcontrol_new wm2200_aec_loopback_mux =
129062306a36Sopenharmony_ci	SOC_DAPM_ENUM("AEC Loopback", wm2200_aec_loopback);
129162306a36Sopenharmony_ci
129262306a36Sopenharmony_cistatic const struct snd_soc_dapm_widget wm2200_dapm_widgets[] = {
129362306a36Sopenharmony_ciSND_SOC_DAPM_SUPPLY("SYSCLK", WM2200_CLOCKING_3, WM2200_SYSCLK_ENA_SHIFT, 0,
129462306a36Sopenharmony_ci		    NULL, 0),
129562306a36Sopenharmony_ciSND_SOC_DAPM_SUPPLY("CP1", WM2200_DM_CHARGE_PUMP_1, WM2200_CPDM_ENA_SHIFT, 0,
129662306a36Sopenharmony_ci		    NULL, 0),
129762306a36Sopenharmony_ciSND_SOC_DAPM_SUPPLY("CP2", WM2200_MIC_CHARGE_PUMP_1, WM2200_CPMIC_ENA_SHIFT, 0,
129862306a36Sopenharmony_ci		    NULL, 0),
129962306a36Sopenharmony_ciSND_SOC_DAPM_SUPPLY("MICBIAS1", WM2200_MIC_BIAS_CTRL_1, WM2200_MICB1_ENA_SHIFT,
130062306a36Sopenharmony_ci		    0, NULL, 0),
130162306a36Sopenharmony_ciSND_SOC_DAPM_SUPPLY("MICBIAS2", WM2200_MIC_BIAS_CTRL_2, WM2200_MICB2_ENA_SHIFT,
130262306a36Sopenharmony_ci		    0, NULL, 0),
130362306a36Sopenharmony_ciSND_SOC_DAPM_REGULATOR_SUPPLY("CPVDD", 20, 0),
130462306a36Sopenharmony_ciSND_SOC_DAPM_REGULATOR_SUPPLY("AVDD", 20, 0),
130562306a36Sopenharmony_ci
130662306a36Sopenharmony_ciSND_SOC_DAPM_INPUT("IN1L"),
130762306a36Sopenharmony_ciSND_SOC_DAPM_INPUT("IN1R"),
130862306a36Sopenharmony_ciSND_SOC_DAPM_INPUT("IN2L"),
130962306a36Sopenharmony_ciSND_SOC_DAPM_INPUT("IN2R"),
131062306a36Sopenharmony_ciSND_SOC_DAPM_INPUT("IN3L"),
131162306a36Sopenharmony_ciSND_SOC_DAPM_INPUT("IN3R"),
131262306a36Sopenharmony_ci
131362306a36Sopenharmony_ciSND_SOC_DAPM_SIGGEN("TONE"),
131462306a36Sopenharmony_ciSND_SOC_DAPM_PGA("Tone Generator", WM2200_TONE_GENERATOR_1,
131562306a36Sopenharmony_ci		 WM2200_TONE_ENA_SHIFT, 0, NULL, 0),
131662306a36Sopenharmony_ci
131762306a36Sopenharmony_ciSND_SOC_DAPM_PGA("IN1L PGA", WM2200_INPUT_ENABLES, WM2200_IN1L_ENA_SHIFT, 0,
131862306a36Sopenharmony_ci		 NULL, 0),
131962306a36Sopenharmony_ciSND_SOC_DAPM_PGA("IN1R PGA", WM2200_INPUT_ENABLES, WM2200_IN1R_ENA_SHIFT, 0,
132062306a36Sopenharmony_ci		 NULL, 0),
132162306a36Sopenharmony_ciSND_SOC_DAPM_PGA("IN2L PGA", WM2200_INPUT_ENABLES, WM2200_IN2L_ENA_SHIFT, 0,
132262306a36Sopenharmony_ci		 NULL, 0),
132362306a36Sopenharmony_ciSND_SOC_DAPM_PGA("IN2R PGA", WM2200_INPUT_ENABLES, WM2200_IN2R_ENA_SHIFT, 0,
132462306a36Sopenharmony_ci		 NULL, 0),
132562306a36Sopenharmony_ciSND_SOC_DAPM_PGA("IN3L PGA", WM2200_INPUT_ENABLES, WM2200_IN3L_ENA_SHIFT, 0,
132662306a36Sopenharmony_ci		 NULL, 0),
132762306a36Sopenharmony_ciSND_SOC_DAPM_PGA("IN3R PGA", WM2200_INPUT_ENABLES, WM2200_IN3R_ENA_SHIFT, 0,
132862306a36Sopenharmony_ci		 NULL, 0),
132962306a36Sopenharmony_ci
133062306a36Sopenharmony_ciSND_SOC_DAPM_AIF_IN("AIF1RX1", "Playback", 0,
133162306a36Sopenharmony_ci		    WM2200_AUDIO_IF_1_22, WM2200_AIF1RX1_ENA_SHIFT, 0),
133262306a36Sopenharmony_ciSND_SOC_DAPM_AIF_IN("AIF1RX2", "Playback", 1,
133362306a36Sopenharmony_ci		    WM2200_AUDIO_IF_1_22, WM2200_AIF1RX2_ENA_SHIFT, 0),
133462306a36Sopenharmony_ciSND_SOC_DAPM_AIF_IN("AIF1RX3", "Playback", 2,
133562306a36Sopenharmony_ci		    WM2200_AUDIO_IF_1_22, WM2200_AIF1RX3_ENA_SHIFT, 0),
133662306a36Sopenharmony_ciSND_SOC_DAPM_AIF_IN("AIF1RX4", "Playback", 3,
133762306a36Sopenharmony_ci		    WM2200_AUDIO_IF_1_22, WM2200_AIF1RX4_ENA_SHIFT, 0),
133862306a36Sopenharmony_ciSND_SOC_DAPM_AIF_IN("AIF1RX5", "Playback", 4,
133962306a36Sopenharmony_ci		    WM2200_AUDIO_IF_1_22, WM2200_AIF1RX5_ENA_SHIFT, 0),
134062306a36Sopenharmony_ciSND_SOC_DAPM_AIF_IN("AIF1RX6", "Playback", 5,
134162306a36Sopenharmony_ci		    WM2200_AUDIO_IF_1_22, WM2200_AIF1RX6_ENA_SHIFT, 0),
134262306a36Sopenharmony_ci
134362306a36Sopenharmony_ciSND_SOC_DAPM_PGA("EQL", WM2200_EQL_1, WM2200_EQL_ENA_SHIFT, 0, NULL, 0),
134462306a36Sopenharmony_ciSND_SOC_DAPM_PGA("EQR", WM2200_EQR_1, WM2200_EQR_ENA_SHIFT, 0, NULL, 0),
134562306a36Sopenharmony_ci
134662306a36Sopenharmony_ciSND_SOC_DAPM_PGA("LHPF1", WM2200_HPLPF1_1, WM2200_LHPF1_ENA_SHIFT, 0,
134762306a36Sopenharmony_ci		 NULL, 0),
134862306a36Sopenharmony_ciSND_SOC_DAPM_PGA("LHPF2", WM2200_HPLPF2_1, WM2200_LHPF2_ENA_SHIFT, 0,
134962306a36Sopenharmony_ci		 NULL, 0),
135062306a36Sopenharmony_ci
135162306a36Sopenharmony_ciWM_ADSP1("DSP1", 0),
135262306a36Sopenharmony_ciWM_ADSP1("DSP2", 1),
135362306a36Sopenharmony_ci
135462306a36Sopenharmony_ciSND_SOC_DAPM_AIF_OUT("AIF1TX1", "Capture", 0,
135562306a36Sopenharmony_ci		    WM2200_AUDIO_IF_1_22, WM2200_AIF1TX1_ENA_SHIFT, 0),
135662306a36Sopenharmony_ciSND_SOC_DAPM_AIF_OUT("AIF1TX2", "Capture", 1,
135762306a36Sopenharmony_ci		    WM2200_AUDIO_IF_1_22, WM2200_AIF1TX2_ENA_SHIFT, 0),
135862306a36Sopenharmony_ciSND_SOC_DAPM_AIF_OUT("AIF1TX3", "Capture", 2,
135962306a36Sopenharmony_ci		    WM2200_AUDIO_IF_1_22, WM2200_AIF1TX3_ENA_SHIFT, 0),
136062306a36Sopenharmony_ciSND_SOC_DAPM_AIF_OUT("AIF1TX4", "Capture", 3,
136162306a36Sopenharmony_ci		    WM2200_AUDIO_IF_1_22, WM2200_AIF1TX4_ENA_SHIFT, 0),
136262306a36Sopenharmony_ciSND_SOC_DAPM_AIF_OUT("AIF1TX5", "Capture", 4,
136362306a36Sopenharmony_ci		    WM2200_AUDIO_IF_1_22, WM2200_AIF1TX5_ENA_SHIFT, 0),
136462306a36Sopenharmony_ciSND_SOC_DAPM_AIF_OUT("AIF1TX6", "Capture", 5,
136562306a36Sopenharmony_ci		    WM2200_AUDIO_IF_1_22, WM2200_AIF1TX6_ENA_SHIFT, 0),
136662306a36Sopenharmony_ci
136762306a36Sopenharmony_ciSND_SOC_DAPM_MUX("AEC Loopback", WM2200_DAC_AEC_CONTROL_1,
136862306a36Sopenharmony_ci		 WM2200_AEC_LOOPBACK_ENA_SHIFT, 0, &wm2200_aec_loopback_mux),
136962306a36Sopenharmony_ci
137062306a36Sopenharmony_ciSND_SOC_DAPM_PGA_S("OUT1L", 0, WM2200_OUTPUT_ENABLES,
137162306a36Sopenharmony_ci		   WM2200_OUT1L_ENA_SHIFT, 0, NULL, 0),
137262306a36Sopenharmony_ciSND_SOC_DAPM_PGA_S("OUT1R", 0, WM2200_OUTPUT_ENABLES,
137362306a36Sopenharmony_ci		   WM2200_OUT1R_ENA_SHIFT, 0, NULL, 0),
137462306a36Sopenharmony_ci
137562306a36Sopenharmony_ciSND_SOC_DAPM_PGA_S("EPD_LP", 1, WM2200_EAR_PIECE_CTRL_1,
137662306a36Sopenharmony_ci		   WM2200_EPD_LP_ENA_SHIFT, 0, NULL, 0),
137762306a36Sopenharmony_ciSND_SOC_DAPM_PGA_S("EPD_OUTP_LP", 1, WM2200_EAR_PIECE_CTRL_1,
137862306a36Sopenharmony_ci		   WM2200_EPD_OUTP_LP_ENA_SHIFT, 0, NULL, 0),
137962306a36Sopenharmony_ciSND_SOC_DAPM_PGA_S("EPD_RMV_SHRT_LP", 1, WM2200_EAR_PIECE_CTRL_1,
138062306a36Sopenharmony_ci		   WM2200_EPD_RMV_SHRT_LP_SHIFT, 0, NULL, 0),
138162306a36Sopenharmony_ci
138262306a36Sopenharmony_ciSND_SOC_DAPM_PGA_S("EPD_LN", 1, WM2200_EAR_PIECE_CTRL_1,
138362306a36Sopenharmony_ci		   WM2200_EPD_LN_ENA_SHIFT, 0, NULL, 0),
138462306a36Sopenharmony_ciSND_SOC_DAPM_PGA_S("EPD_OUTP_LN", 1, WM2200_EAR_PIECE_CTRL_1,
138562306a36Sopenharmony_ci		   WM2200_EPD_OUTP_LN_ENA_SHIFT, 0, NULL, 0),
138662306a36Sopenharmony_ciSND_SOC_DAPM_PGA_S("EPD_RMV_SHRT_LN", 1, WM2200_EAR_PIECE_CTRL_1,
138762306a36Sopenharmony_ci		   WM2200_EPD_RMV_SHRT_LN_SHIFT, 0, NULL, 0),
138862306a36Sopenharmony_ci
138962306a36Sopenharmony_ciSND_SOC_DAPM_PGA_S("EPD_RP", 1, WM2200_EAR_PIECE_CTRL_2,
139062306a36Sopenharmony_ci		   WM2200_EPD_RP_ENA_SHIFT, 0, NULL, 0),
139162306a36Sopenharmony_ciSND_SOC_DAPM_PGA_S("EPD_OUTP_RP", 1, WM2200_EAR_PIECE_CTRL_2,
139262306a36Sopenharmony_ci		   WM2200_EPD_OUTP_RP_ENA_SHIFT, 0, NULL, 0),
139362306a36Sopenharmony_ciSND_SOC_DAPM_PGA_S("EPD_RMV_SHRT_RP", 1, WM2200_EAR_PIECE_CTRL_2,
139462306a36Sopenharmony_ci		   WM2200_EPD_RMV_SHRT_RP_SHIFT, 0, NULL, 0),
139562306a36Sopenharmony_ci
139662306a36Sopenharmony_ciSND_SOC_DAPM_PGA_S("EPD_RN", 1, WM2200_EAR_PIECE_CTRL_2,
139762306a36Sopenharmony_ci		   WM2200_EPD_RN_ENA_SHIFT, 0, NULL, 0),
139862306a36Sopenharmony_ciSND_SOC_DAPM_PGA_S("EPD_OUTP_RN", 1, WM2200_EAR_PIECE_CTRL_2,
139962306a36Sopenharmony_ci		   WM2200_EPD_OUTP_RN_ENA_SHIFT, 0, NULL, 0),
140062306a36Sopenharmony_ciSND_SOC_DAPM_PGA_S("EPD_RMV_SHRT_RN", 1, WM2200_EAR_PIECE_CTRL_2,
140162306a36Sopenharmony_ci		   WM2200_EPD_RMV_SHRT_RN_SHIFT, 0, NULL, 0),
140262306a36Sopenharmony_ci
140362306a36Sopenharmony_ciSND_SOC_DAPM_PGA("OUT2L", WM2200_OUTPUT_ENABLES, WM2200_OUT2L_ENA_SHIFT,
140462306a36Sopenharmony_ci		 0, NULL, 0),
140562306a36Sopenharmony_ciSND_SOC_DAPM_PGA("OUT2R", WM2200_OUTPUT_ENABLES, WM2200_OUT2R_ENA_SHIFT,
140662306a36Sopenharmony_ci		 0, NULL, 0),
140762306a36Sopenharmony_ci
140862306a36Sopenharmony_ciSND_SOC_DAPM_OUTPUT("EPOUTLN"),
140962306a36Sopenharmony_ciSND_SOC_DAPM_OUTPUT("EPOUTLP"),
141062306a36Sopenharmony_ciSND_SOC_DAPM_OUTPUT("EPOUTRN"),
141162306a36Sopenharmony_ciSND_SOC_DAPM_OUTPUT("EPOUTRP"),
141262306a36Sopenharmony_ciSND_SOC_DAPM_OUTPUT("SPK"),
141362306a36Sopenharmony_ci
141462306a36Sopenharmony_ciWM2200_MIXER_WIDGETS(EQL, "EQL"),
141562306a36Sopenharmony_ciWM2200_MIXER_WIDGETS(EQR, "EQR"),
141662306a36Sopenharmony_ci
141762306a36Sopenharmony_ciWM2200_MIXER_WIDGETS(LHPF1, "LHPF1"),
141862306a36Sopenharmony_ciWM2200_MIXER_WIDGETS(LHPF2, "LHPF2"),
141962306a36Sopenharmony_ci
142062306a36Sopenharmony_ciWM2200_DSP_WIDGETS(DSP1, "DSP1"),
142162306a36Sopenharmony_ciWM2200_DSP_WIDGETS(DSP2, "DSP2"),
142262306a36Sopenharmony_ci
142362306a36Sopenharmony_ciWM2200_MIXER_WIDGETS(AIF1TX1, "AIF1TX1"),
142462306a36Sopenharmony_ciWM2200_MIXER_WIDGETS(AIF1TX2, "AIF1TX2"),
142562306a36Sopenharmony_ciWM2200_MIXER_WIDGETS(AIF1TX3, "AIF1TX3"),
142662306a36Sopenharmony_ciWM2200_MIXER_WIDGETS(AIF1TX4, "AIF1TX4"),
142762306a36Sopenharmony_ciWM2200_MIXER_WIDGETS(AIF1TX5, "AIF1TX5"),
142862306a36Sopenharmony_ciWM2200_MIXER_WIDGETS(AIF1TX6, "AIF1TX6"),
142962306a36Sopenharmony_ci
143062306a36Sopenharmony_ciWM2200_MIXER_WIDGETS(OUT1L, "OUT1L"),
143162306a36Sopenharmony_ciWM2200_MIXER_WIDGETS(OUT1R, "OUT1R"),
143262306a36Sopenharmony_ciWM2200_MIXER_WIDGETS(OUT2L, "OUT2L"),
143362306a36Sopenharmony_ciWM2200_MIXER_WIDGETS(OUT2R, "OUT2R"),
143462306a36Sopenharmony_ci};
143562306a36Sopenharmony_ci
143662306a36Sopenharmony_cistatic const struct snd_soc_dapm_route wm2200_dapm_routes[] = {
143762306a36Sopenharmony_ci	/* Everything needs SYSCLK but only hook up things on the edge
143862306a36Sopenharmony_ci	 * of the chip */
143962306a36Sopenharmony_ci	{ "IN1L", NULL, "SYSCLK" },
144062306a36Sopenharmony_ci	{ "IN1R", NULL, "SYSCLK" },
144162306a36Sopenharmony_ci	{ "IN2L", NULL, "SYSCLK" },
144262306a36Sopenharmony_ci	{ "IN2R", NULL, "SYSCLK" },
144362306a36Sopenharmony_ci	{ "IN3L", NULL, "SYSCLK" },
144462306a36Sopenharmony_ci	{ "IN3R", NULL, "SYSCLK" },
144562306a36Sopenharmony_ci	{ "OUT1L", NULL, "SYSCLK" },
144662306a36Sopenharmony_ci	{ "OUT1R", NULL, "SYSCLK" },
144762306a36Sopenharmony_ci	{ "OUT2L", NULL, "SYSCLK" },
144862306a36Sopenharmony_ci	{ "OUT2R", NULL, "SYSCLK" },
144962306a36Sopenharmony_ci	{ "AIF1RX1", NULL, "SYSCLK" },
145062306a36Sopenharmony_ci	{ "AIF1RX2", NULL, "SYSCLK" },
145162306a36Sopenharmony_ci	{ "AIF1RX3", NULL, "SYSCLK" },
145262306a36Sopenharmony_ci	{ "AIF1RX4", NULL, "SYSCLK" },
145362306a36Sopenharmony_ci	{ "AIF1RX5", NULL, "SYSCLK" },
145462306a36Sopenharmony_ci	{ "AIF1RX6", NULL, "SYSCLK" },
145562306a36Sopenharmony_ci	{ "AIF1TX1", NULL, "SYSCLK" },
145662306a36Sopenharmony_ci	{ "AIF1TX2", NULL, "SYSCLK" },
145762306a36Sopenharmony_ci	{ "AIF1TX3", NULL, "SYSCLK" },
145862306a36Sopenharmony_ci	{ "AIF1TX4", NULL, "SYSCLK" },
145962306a36Sopenharmony_ci	{ "AIF1TX5", NULL, "SYSCLK" },
146062306a36Sopenharmony_ci	{ "AIF1TX6", NULL, "SYSCLK" },
146162306a36Sopenharmony_ci
146262306a36Sopenharmony_ci	{ "IN1L", NULL, "AVDD" },
146362306a36Sopenharmony_ci	{ "IN1R", NULL, "AVDD" },
146462306a36Sopenharmony_ci	{ "IN2L", NULL, "AVDD" },
146562306a36Sopenharmony_ci	{ "IN2R", NULL, "AVDD" },
146662306a36Sopenharmony_ci	{ "IN3L", NULL, "AVDD" },
146762306a36Sopenharmony_ci	{ "IN3R", NULL, "AVDD" },
146862306a36Sopenharmony_ci	{ "OUT1L", NULL, "AVDD" },
146962306a36Sopenharmony_ci	{ "OUT1R", NULL, "AVDD" },
147062306a36Sopenharmony_ci
147162306a36Sopenharmony_ci	{ "IN1L PGA", NULL, "IN1L" },
147262306a36Sopenharmony_ci	{ "IN1R PGA", NULL, "IN1R" },
147362306a36Sopenharmony_ci	{ "IN2L PGA", NULL, "IN2L" },
147462306a36Sopenharmony_ci	{ "IN2R PGA", NULL, "IN2R" },
147562306a36Sopenharmony_ci	{ "IN3L PGA", NULL, "IN3L" },
147662306a36Sopenharmony_ci	{ "IN3R PGA", NULL, "IN3R" },
147762306a36Sopenharmony_ci
147862306a36Sopenharmony_ci	{ "Tone Generator", NULL, "TONE" },
147962306a36Sopenharmony_ci
148062306a36Sopenharmony_ci	{ "CP2", NULL, "CPVDD" },
148162306a36Sopenharmony_ci	{ "MICBIAS1", NULL, "CP2" },
148262306a36Sopenharmony_ci	{ "MICBIAS2", NULL, "CP2" },
148362306a36Sopenharmony_ci
148462306a36Sopenharmony_ci	{ "CP1", NULL, "CPVDD" },
148562306a36Sopenharmony_ci	{ "EPD_LN", NULL, "CP1" },
148662306a36Sopenharmony_ci	{ "EPD_LP", NULL, "CP1" },
148762306a36Sopenharmony_ci	{ "EPD_RN", NULL, "CP1" },
148862306a36Sopenharmony_ci	{ "EPD_RP", NULL, "CP1" },
148962306a36Sopenharmony_ci
149062306a36Sopenharmony_ci	{ "EPD_LP", NULL, "OUT1L" },
149162306a36Sopenharmony_ci	{ "EPD_OUTP_LP", NULL, "EPD_LP" },
149262306a36Sopenharmony_ci	{ "EPD_RMV_SHRT_LP", NULL, "EPD_OUTP_LP" },
149362306a36Sopenharmony_ci	{ "EPOUTLP", NULL, "EPD_RMV_SHRT_LP" },
149462306a36Sopenharmony_ci
149562306a36Sopenharmony_ci	{ "EPD_LN", NULL, "OUT1L" },
149662306a36Sopenharmony_ci	{ "EPD_OUTP_LN", NULL, "EPD_LN" },
149762306a36Sopenharmony_ci	{ "EPD_RMV_SHRT_LN", NULL, "EPD_OUTP_LN" },
149862306a36Sopenharmony_ci	{ "EPOUTLN", NULL, "EPD_RMV_SHRT_LN" },
149962306a36Sopenharmony_ci
150062306a36Sopenharmony_ci	{ "EPD_RP", NULL, "OUT1R" },
150162306a36Sopenharmony_ci	{ "EPD_OUTP_RP", NULL, "EPD_RP" },
150262306a36Sopenharmony_ci	{ "EPD_RMV_SHRT_RP", NULL, "EPD_OUTP_RP" },
150362306a36Sopenharmony_ci	{ "EPOUTRP", NULL, "EPD_RMV_SHRT_RP" },
150462306a36Sopenharmony_ci
150562306a36Sopenharmony_ci	{ "EPD_RN", NULL, "OUT1R" },
150662306a36Sopenharmony_ci	{ "EPD_OUTP_RN", NULL, "EPD_RN" },
150762306a36Sopenharmony_ci	{ "EPD_RMV_SHRT_RN", NULL, "EPD_OUTP_RN" },
150862306a36Sopenharmony_ci	{ "EPOUTRN", NULL, "EPD_RMV_SHRT_RN" },
150962306a36Sopenharmony_ci
151062306a36Sopenharmony_ci	{ "SPK", NULL, "OUT2L" },
151162306a36Sopenharmony_ci	{ "SPK", NULL, "OUT2R" },
151262306a36Sopenharmony_ci
151362306a36Sopenharmony_ci	{ "AEC Loopback", "OUT1L", "OUT1L" },
151462306a36Sopenharmony_ci	{ "AEC Loopback", "OUT1R", "OUT1R" },
151562306a36Sopenharmony_ci	{ "AEC Loopback", "OUT2L", "OUT2L" },
151662306a36Sopenharmony_ci	{ "AEC Loopback", "OUT2R", "OUT2R" },
151762306a36Sopenharmony_ci
151862306a36Sopenharmony_ci	WM2200_MIXER_ROUTES("DSP1", "DSP1L"),
151962306a36Sopenharmony_ci	WM2200_MIXER_ROUTES("DSP1", "DSP1R"),
152062306a36Sopenharmony_ci	WM2200_MIXER_ROUTES("DSP2", "DSP2L"),
152162306a36Sopenharmony_ci	WM2200_MIXER_ROUTES("DSP2", "DSP2R"),
152262306a36Sopenharmony_ci
152362306a36Sopenharmony_ci	WM2200_DSP_AUX_ROUTES("DSP1"),
152462306a36Sopenharmony_ci	WM2200_DSP_AUX_ROUTES("DSP2"),
152562306a36Sopenharmony_ci
152662306a36Sopenharmony_ci	WM2200_MIXER_ROUTES("OUT1L", "OUT1L"),
152762306a36Sopenharmony_ci	WM2200_MIXER_ROUTES("OUT1R", "OUT1R"),
152862306a36Sopenharmony_ci	WM2200_MIXER_ROUTES("OUT2L", "OUT2L"),
152962306a36Sopenharmony_ci	WM2200_MIXER_ROUTES("OUT2R", "OUT2R"),
153062306a36Sopenharmony_ci
153162306a36Sopenharmony_ci	WM2200_MIXER_ROUTES("AIF1TX1", "AIF1TX1"),
153262306a36Sopenharmony_ci	WM2200_MIXER_ROUTES("AIF1TX2", "AIF1TX2"),
153362306a36Sopenharmony_ci	WM2200_MIXER_ROUTES("AIF1TX3", "AIF1TX3"),
153462306a36Sopenharmony_ci	WM2200_MIXER_ROUTES("AIF1TX4", "AIF1TX4"),
153562306a36Sopenharmony_ci	WM2200_MIXER_ROUTES("AIF1TX5", "AIF1TX5"),
153662306a36Sopenharmony_ci	WM2200_MIXER_ROUTES("AIF1TX6", "AIF1TX6"),
153762306a36Sopenharmony_ci
153862306a36Sopenharmony_ci	WM2200_MIXER_ROUTES("EQL", "EQL"),
153962306a36Sopenharmony_ci	WM2200_MIXER_ROUTES("EQR", "EQR"),
154062306a36Sopenharmony_ci
154162306a36Sopenharmony_ci	WM2200_MIXER_ROUTES("LHPF1", "LHPF1"),
154262306a36Sopenharmony_ci	WM2200_MIXER_ROUTES("LHPF2", "LHPF2"),
154362306a36Sopenharmony_ci};
154462306a36Sopenharmony_ci
154562306a36Sopenharmony_cistatic int wm2200_probe(struct snd_soc_component *component)
154662306a36Sopenharmony_ci{
154762306a36Sopenharmony_ci	struct wm2200_priv *wm2200 = snd_soc_component_get_drvdata(component);
154862306a36Sopenharmony_ci
154962306a36Sopenharmony_ci	wm2200->component = component;
155062306a36Sopenharmony_ci
155162306a36Sopenharmony_ci	return 0;
155262306a36Sopenharmony_ci}
155362306a36Sopenharmony_ci
155462306a36Sopenharmony_cistatic int wm2200_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
155562306a36Sopenharmony_ci{
155662306a36Sopenharmony_ci	struct snd_soc_component *component = dai->component;
155762306a36Sopenharmony_ci	int lrclk, bclk, fmt_val;
155862306a36Sopenharmony_ci
155962306a36Sopenharmony_ci	lrclk = 0;
156062306a36Sopenharmony_ci	bclk = 0;
156162306a36Sopenharmony_ci
156262306a36Sopenharmony_ci	switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
156362306a36Sopenharmony_ci	case SND_SOC_DAIFMT_DSP_A:
156462306a36Sopenharmony_ci		fmt_val = 0;
156562306a36Sopenharmony_ci		break;
156662306a36Sopenharmony_ci	case SND_SOC_DAIFMT_I2S:
156762306a36Sopenharmony_ci		fmt_val = 2;
156862306a36Sopenharmony_ci		break;
156962306a36Sopenharmony_ci	default:
157062306a36Sopenharmony_ci		dev_err(component->dev, "Unsupported DAI format %d\n",
157162306a36Sopenharmony_ci			fmt & SND_SOC_DAIFMT_FORMAT_MASK);
157262306a36Sopenharmony_ci		return -EINVAL;
157362306a36Sopenharmony_ci	}
157462306a36Sopenharmony_ci
157562306a36Sopenharmony_ci	switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
157662306a36Sopenharmony_ci	case SND_SOC_DAIFMT_CBS_CFS:
157762306a36Sopenharmony_ci		break;
157862306a36Sopenharmony_ci	case SND_SOC_DAIFMT_CBS_CFM:
157962306a36Sopenharmony_ci		lrclk |= WM2200_AIF1TX_LRCLK_MSTR;
158062306a36Sopenharmony_ci		break;
158162306a36Sopenharmony_ci	case SND_SOC_DAIFMT_CBM_CFS:
158262306a36Sopenharmony_ci		bclk |= WM2200_AIF1_BCLK_MSTR;
158362306a36Sopenharmony_ci		break;
158462306a36Sopenharmony_ci	case SND_SOC_DAIFMT_CBM_CFM:
158562306a36Sopenharmony_ci		lrclk |= WM2200_AIF1TX_LRCLK_MSTR;
158662306a36Sopenharmony_ci		bclk |= WM2200_AIF1_BCLK_MSTR;
158762306a36Sopenharmony_ci		break;
158862306a36Sopenharmony_ci	default:
158962306a36Sopenharmony_ci		dev_err(component->dev, "Unsupported master mode %d\n",
159062306a36Sopenharmony_ci			fmt & SND_SOC_DAIFMT_MASTER_MASK);
159162306a36Sopenharmony_ci		return -EINVAL;
159262306a36Sopenharmony_ci	}
159362306a36Sopenharmony_ci
159462306a36Sopenharmony_ci	switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
159562306a36Sopenharmony_ci	case SND_SOC_DAIFMT_NB_NF:
159662306a36Sopenharmony_ci		break;
159762306a36Sopenharmony_ci	case SND_SOC_DAIFMT_IB_IF:
159862306a36Sopenharmony_ci		bclk |= WM2200_AIF1_BCLK_INV;
159962306a36Sopenharmony_ci		lrclk |= WM2200_AIF1TX_LRCLK_INV;
160062306a36Sopenharmony_ci		break;
160162306a36Sopenharmony_ci	case SND_SOC_DAIFMT_IB_NF:
160262306a36Sopenharmony_ci		bclk |= WM2200_AIF1_BCLK_INV;
160362306a36Sopenharmony_ci		break;
160462306a36Sopenharmony_ci	case SND_SOC_DAIFMT_NB_IF:
160562306a36Sopenharmony_ci		lrclk |= WM2200_AIF1TX_LRCLK_INV;
160662306a36Sopenharmony_ci		break;
160762306a36Sopenharmony_ci	default:
160862306a36Sopenharmony_ci		return -EINVAL;
160962306a36Sopenharmony_ci	}
161062306a36Sopenharmony_ci
161162306a36Sopenharmony_ci	snd_soc_component_update_bits(component, WM2200_AUDIO_IF_1_1, WM2200_AIF1_BCLK_MSTR |
161262306a36Sopenharmony_ci			    WM2200_AIF1_BCLK_INV, bclk);
161362306a36Sopenharmony_ci	snd_soc_component_update_bits(component, WM2200_AUDIO_IF_1_2,
161462306a36Sopenharmony_ci			    WM2200_AIF1TX_LRCLK_MSTR | WM2200_AIF1TX_LRCLK_INV,
161562306a36Sopenharmony_ci			    lrclk);
161662306a36Sopenharmony_ci	snd_soc_component_update_bits(component, WM2200_AUDIO_IF_1_3,
161762306a36Sopenharmony_ci			    WM2200_AIF1TX_LRCLK_MSTR | WM2200_AIF1TX_LRCLK_INV,
161862306a36Sopenharmony_ci			    lrclk);
161962306a36Sopenharmony_ci	snd_soc_component_update_bits(component, WM2200_AUDIO_IF_1_5,
162062306a36Sopenharmony_ci			    WM2200_AIF1_FMT_MASK, fmt_val);
162162306a36Sopenharmony_ci
162262306a36Sopenharmony_ci	return 0;
162362306a36Sopenharmony_ci}
162462306a36Sopenharmony_ci
162562306a36Sopenharmony_cistatic int wm2200_sr_code[] = {
162662306a36Sopenharmony_ci	0,
162762306a36Sopenharmony_ci	12000,
162862306a36Sopenharmony_ci	24000,
162962306a36Sopenharmony_ci	48000,
163062306a36Sopenharmony_ci	96000,
163162306a36Sopenharmony_ci	192000,
163262306a36Sopenharmony_ci	384000,
163362306a36Sopenharmony_ci	768000,
163462306a36Sopenharmony_ci	0,
163562306a36Sopenharmony_ci	11025,
163662306a36Sopenharmony_ci	22050,
163762306a36Sopenharmony_ci	44100,
163862306a36Sopenharmony_ci	88200,
163962306a36Sopenharmony_ci	176400,
164062306a36Sopenharmony_ci	352800,
164162306a36Sopenharmony_ci	705600,
164262306a36Sopenharmony_ci	4000,
164362306a36Sopenharmony_ci	8000,
164462306a36Sopenharmony_ci	16000,
164562306a36Sopenharmony_ci	32000,
164662306a36Sopenharmony_ci	64000,
164762306a36Sopenharmony_ci	128000,
164862306a36Sopenharmony_ci	256000,
164962306a36Sopenharmony_ci	512000,
165062306a36Sopenharmony_ci};
165162306a36Sopenharmony_ci
165262306a36Sopenharmony_ci#define WM2200_NUM_BCLK_RATES 12
165362306a36Sopenharmony_ci
165462306a36Sopenharmony_cistatic int wm2200_bclk_rates_dat[WM2200_NUM_BCLK_RATES] = {
165562306a36Sopenharmony_ci	6144000,
165662306a36Sopenharmony_ci	3072000,
165762306a36Sopenharmony_ci	2048000,
165862306a36Sopenharmony_ci	1536000,
165962306a36Sopenharmony_ci	768000,
166062306a36Sopenharmony_ci	512000,
166162306a36Sopenharmony_ci	384000,
166262306a36Sopenharmony_ci	256000,
166362306a36Sopenharmony_ci	192000,
166462306a36Sopenharmony_ci	128000,
166562306a36Sopenharmony_ci	96000,
166662306a36Sopenharmony_ci	64000,
166762306a36Sopenharmony_ci};
166862306a36Sopenharmony_ci
166962306a36Sopenharmony_cistatic int wm2200_bclk_rates_cd[WM2200_NUM_BCLK_RATES] = {
167062306a36Sopenharmony_ci	5644800,
167162306a36Sopenharmony_ci	3763200,
167262306a36Sopenharmony_ci	2882400,
167362306a36Sopenharmony_ci	1881600,
167462306a36Sopenharmony_ci	1411200,
167562306a36Sopenharmony_ci	705600,
167662306a36Sopenharmony_ci	470400,
167762306a36Sopenharmony_ci	352800,
167862306a36Sopenharmony_ci	176400,
167962306a36Sopenharmony_ci	117600,
168062306a36Sopenharmony_ci	88200,
168162306a36Sopenharmony_ci	58800,
168262306a36Sopenharmony_ci};
168362306a36Sopenharmony_ci
168462306a36Sopenharmony_cistatic int wm2200_hw_params(struct snd_pcm_substream *substream,
168562306a36Sopenharmony_ci			    struct snd_pcm_hw_params *params,
168662306a36Sopenharmony_ci			    struct snd_soc_dai *dai)
168762306a36Sopenharmony_ci{
168862306a36Sopenharmony_ci	struct snd_soc_component *component = dai->component;
168962306a36Sopenharmony_ci	struct wm2200_priv *wm2200 = snd_soc_component_get_drvdata(component);
169062306a36Sopenharmony_ci	int i, bclk, lrclk, wl, fl, sr_code;
169162306a36Sopenharmony_ci	int *bclk_rates;
169262306a36Sopenharmony_ci
169362306a36Sopenharmony_ci	/* Data sizes if not using TDM */
169462306a36Sopenharmony_ci	wl = params_width(params);
169562306a36Sopenharmony_ci	if (wl < 0)
169662306a36Sopenharmony_ci		return wl;
169762306a36Sopenharmony_ci	fl = snd_soc_params_to_frame_size(params);
169862306a36Sopenharmony_ci	if (fl < 0)
169962306a36Sopenharmony_ci		return fl;
170062306a36Sopenharmony_ci
170162306a36Sopenharmony_ci	dev_dbg(component->dev, "Word length %d bits, frame length %d bits\n",
170262306a36Sopenharmony_ci		wl, fl);
170362306a36Sopenharmony_ci
170462306a36Sopenharmony_ci	/* Target BCLK rate */
170562306a36Sopenharmony_ci	bclk = snd_soc_params_to_bclk(params);
170662306a36Sopenharmony_ci	if (bclk < 0)
170762306a36Sopenharmony_ci		return bclk;
170862306a36Sopenharmony_ci
170962306a36Sopenharmony_ci	if (!wm2200->sysclk) {
171062306a36Sopenharmony_ci		dev_err(component->dev, "SYSCLK has no rate set\n");
171162306a36Sopenharmony_ci		return -EINVAL;
171262306a36Sopenharmony_ci	}
171362306a36Sopenharmony_ci
171462306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(wm2200_sr_code); i++)
171562306a36Sopenharmony_ci		if (wm2200_sr_code[i] == params_rate(params))
171662306a36Sopenharmony_ci			break;
171762306a36Sopenharmony_ci	if (i == ARRAY_SIZE(wm2200_sr_code)) {
171862306a36Sopenharmony_ci		dev_err(component->dev, "Unsupported sample rate: %dHz\n",
171962306a36Sopenharmony_ci			params_rate(params));
172062306a36Sopenharmony_ci		return -EINVAL;
172162306a36Sopenharmony_ci	}
172262306a36Sopenharmony_ci	sr_code = i;
172362306a36Sopenharmony_ci
172462306a36Sopenharmony_ci	dev_dbg(component->dev, "Target BCLK is %dHz, using %dHz SYSCLK\n",
172562306a36Sopenharmony_ci		bclk, wm2200->sysclk);
172662306a36Sopenharmony_ci
172762306a36Sopenharmony_ci	if (wm2200->sysclk % 4000)
172862306a36Sopenharmony_ci		bclk_rates = wm2200_bclk_rates_cd;
172962306a36Sopenharmony_ci	else
173062306a36Sopenharmony_ci		bclk_rates = wm2200_bclk_rates_dat;
173162306a36Sopenharmony_ci
173262306a36Sopenharmony_ci	for (i = 0; i < WM2200_NUM_BCLK_RATES; i++)
173362306a36Sopenharmony_ci		if (bclk_rates[i] >= bclk && (bclk_rates[i] % bclk == 0))
173462306a36Sopenharmony_ci			break;
173562306a36Sopenharmony_ci	if (i == WM2200_NUM_BCLK_RATES) {
173662306a36Sopenharmony_ci		dev_err(component->dev,
173762306a36Sopenharmony_ci			"No valid BCLK for %dHz found from %dHz SYSCLK\n",
173862306a36Sopenharmony_ci			bclk, wm2200->sysclk);
173962306a36Sopenharmony_ci		return -EINVAL;
174062306a36Sopenharmony_ci	}
174162306a36Sopenharmony_ci
174262306a36Sopenharmony_ci	bclk = i;
174362306a36Sopenharmony_ci	dev_dbg(component->dev, "Setting %dHz BCLK\n", bclk_rates[bclk]);
174462306a36Sopenharmony_ci	snd_soc_component_update_bits(component, WM2200_AUDIO_IF_1_1,
174562306a36Sopenharmony_ci			    WM2200_AIF1_BCLK_DIV_MASK, bclk);
174662306a36Sopenharmony_ci
174762306a36Sopenharmony_ci	lrclk = bclk_rates[bclk] / params_rate(params);
174862306a36Sopenharmony_ci	dev_dbg(component->dev, "Setting %dHz LRCLK\n", bclk_rates[bclk] / lrclk);
174962306a36Sopenharmony_ci	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK ||
175062306a36Sopenharmony_ci	    wm2200->symmetric_rates)
175162306a36Sopenharmony_ci		snd_soc_component_update_bits(component, WM2200_AUDIO_IF_1_7,
175262306a36Sopenharmony_ci				    WM2200_AIF1RX_BCPF_MASK, lrclk);
175362306a36Sopenharmony_ci	else
175462306a36Sopenharmony_ci		snd_soc_component_update_bits(component, WM2200_AUDIO_IF_1_6,
175562306a36Sopenharmony_ci				    WM2200_AIF1TX_BCPF_MASK, lrclk);
175662306a36Sopenharmony_ci
175762306a36Sopenharmony_ci	i = (wl << WM2200_AIF1TX_WL_SHIFT) | wl;
175862306a36Sopenharmony_ci	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
175962306a36Sopenharmony_ci		snd_soc_component_update_bits(component, WM2200_AUDIO_IF_1_9,
176062306a36Sopenharmony_ci				    WM2200_AIF1RX_WL_MASK |
176162306a36Sopenharmony_ci				    WM2200_AIF1RX_SLOT_LEN_MASK, i);
176262306a36Sopenharmony_ci	else
176362306a36Sopenharmony_ci		snd_soc_component_update_bits(component, WM2200_AUDIO_IF_1_8,
176462306a36Sopenharmony_ci				    WM2200_AIF1TX_WL_MASK |
176562306a36Sopenharmony_ci				    WM2200_AIF1TX_SLOT_LEN_MASK, i);
176662306a36Sopenharmony_ci
176762306a36Sopenharmony_ci	snd_soc_component_update_bits(component, WM2200_CLOCKING_4,
176862306a36Sopenharmony_ci			    WM2200_SAMPLE_RATE_1_MASK, sr_code);
176962306a36Sopenharmony_ci
177062306a36Sopenharmony_ci	return 0;
177162306a36Sopenharmony_ci}
177262306a36Sopenharmony_ci
177362306a36Sopenharmony_cistatic int wm2200_set_sysclk(struct snd_soc_component *component, int clk_id,
177462306a36Sopenharmony_ci			     int source, unsigned int freq, int dir)
177562306a36Sopenharmony_ci{
177662306a36Sopenharmony_ci	struct wm2200_priv *wm2200 = snd_soc_component_get_drvdata(component);
177762306a36Sopenharmony_ci	int fval;
177862306a36Sopenharmony_ci
177962306a36Sopenharmony_ci	switch (clk_id) {
178062306a36Sopenharmony_ci	case WM2200_CLK_SYSCLK:
178162306a36Sopenharmony_ci		break;
178262306a36Sopenharmony_ci
178362306a36Sopenharmony_ci	default:
178462306a36Sopenharmony_ci		dev_err(component->dev, "Unknown clock %d\n", clk_id);
178562306a36Sopenharmony_ci		return -EINVAL;
178662306a36Sopenharmony_ci	}
178762306a36Sopenharmony_ci
178862306a36Sopenharmony_ci	switch (source) {
178962306a36Sopenharmony_ci	case WM2200_CLKSRC_MCLK1:
179062306a36Sopenharmony_ci	case WM2200_CLKSRC_MCLK2:
179162306a36Sopenharmony_ci	case WM2200_CLKSRC_FLL:
179262306a36Sopenharmony_ci	case WM2200_CLKSRC_BCLK1:
179362306a36Sopenharmony_ci		break;
179462306a36Sopenharmony_ci	default:
179562306a36Sopenharmony_ci		dev_err(component->dev, "Invalid source %d\n", source);
179662306a36Sopenharmony_ci		return -EINVAL;
179762306a36Sopenharmony_ci	}
179862306a36Sopenharmony_ci
179962306a36Sopenharmony_ci	switch (freq) {
180062306a36Sopenharmony_ci	case 22579200:
180162306a36Sopenharmony_ci	case 24576000:
180262306a36Sopenharmony_ci		fval = 2;
180362306a36Sopenharmony_ci		break;
180462306a36Sopenharmony_ci	default:
180562306a36Sopenharmony_ci		dev_err(component->dev, "Invalid clock rate: %d\n", freq);
180662306a36Sopenharmony_ci		return -EINVAL;
180762306a36Sopenharmony_ci	}
180862306a36Sopenharmony_ci
180962306a36Sopenharmony_ci	/* TODO: Check if MCLKs are in use and enable/disable pulls to
181062306a36Sopenharmony_ci	 * match.
181162306a36Sopenharmony_ci	 */
181262306a36Sopenharmony_ci
181362306a36Sopenharmony_ci	snd_soc_component_update_bits(component, WM2200_CLOCKING_3, WM2200_SYSCLK_FREQ_MASK |
181462306a36Sopenharmony_ci			    WM2200_SYSCLK_SRC_MASK,
181562306a36Sopenharmony_ci			    fval << WM2200_SYSCLK_FREQ_SHIFT | source);
181662306a36Sopenharmony_ci
181762306a36Sopenharmony_ci	wm2200->sysclk = freq;
181862306a36Sopenharmony_ci
181962306a36Sopenharmony_ci	return 0;
182062306a36Sopenharmony_ci}
182162306a36Sopenharmony_ci
182262306a36Sopenharmony_cistruct _fll_div {
182362306a36Sopenharmony_ci	u16 fll_fratio;
182462306a36Sopenharmony_ci	u16 fll_outdiv;
182562306a36Sopenharmony_ci	u16 fll_refclk_div;
182662306a36Sopenharmony_ci	u16 n;
182762306a36Sopenharmony_ci	u16 theta;
182862306a36Sopenharmony_ci	u16 lambda;
182962306a36Sopenharmony_ci};
183062306a36Sopenharmony_ci
183162306a36Sopenharmony_cistatic struct {
183262306a36Sopenharmony_ci	unsigned int min;
183362306a36Sopenharmony_ci	unsigned int max;
183462306a36Sopenharmony_ci	u16 fll_fratio;
183562306a36Sopenharmony_ci	int ratio;
183662306a36Sopenharmony_ci} fll_fratios[] = {
183762306a36Sopenharmony_ci	{       0,    64000, 4, 16 },
183862306a36Sopenharmony_ci	{   64000,   128000, 3,  8 },
183962306a36Sopenharmony_ci	{  128000,   256000, 2,  4 },
184062306a36Sopenharmony_ci	{  256000,  1000000, 1,  2 },
184162306a36Sopenharmony_ci	{ 1000000, 13500000, 0,  1 },
184262306a36Sopenharmony_ci};
184362306a36Sopenharmony_ci
184462306a36Sopenharmony_cistatic int fll_factors(struct _fll_div *fll_div, unsigned int Fref,
184562306a36Sopenharmony_ci		       unsigned int Fout)
184662306a36Sopenharmony_ci{
184762306a36Sopenharmony_ci	unsigned int target;
184862306a36Sopenharmony_ci	unsigned int div;
184962306a36Sopenharmony_ci	unsigned int fratio, gcd_fll;
185062306a36Sopenharmony_ci	int i;
185162306a36Sopenharmony_ci
185262306a36Sopenharmony_ci	/* Fref must be <=13.5MHz */
185362306a36Sopenharmony_ci	div = 1;
185462306a36Sopenharmony_ci	fll_div->fll_refclk_div = 0;
185562306a36Sopenharmony_ci	while ((Fref / div) > 13500000) {
185662306a36Sopenharmony_ci		div *= 2;
185762306a36Sopenharmony_ci		fll_div->fll_refclk_div++;
185862306a36Sopenharmony_ci
185962306a36Sopenharmony_ci		if (div > 8) {
186062306a36Sopenharmony_ci			pr_err("Can't scale %dMHz input down to <=13.5MHz\n",
186162306a36Sopenharmony_ci			       Fref);
186262306a36Sopenharmony_ci			return -EINVAL;
186362306a36Sopenharmony_ci		}
186462306a36Sopenharmony_ci	}
186562306a36Sopenharmony_ci
186662306a36Sopenharmony_ci	pr_debug("FLL Fref=%u Fout=%u\n", Fref, Fout);
186762306a36Sopenharmony_ci
186862306a36Sopenharmony_ci	/* Apply the division for our remaining calculations */
186962306a36Sopenharmony_ci	Fref /= div;
187062306a36Sopenharmony_ci
187162306a36Sopenharmony_ci	/* Fvco should be 90-100MHz; don't check the upper bound */
187262306a36Sopenharmony_ci	div = 2;
187362306a36Sopenharmony_ci	while (Fout * div < 90000000) {
187462306a36Sopenharmony_ci		div++;
187562306a36Sopenharmony_ci		if (div > 64) {
187662306a36Sopenharmony_ci			pr_err("Unable to find FLL_OUTDIV for Fout=%uHz\n",
187762306a36Sopenharmony_ci			       Fout);
187862306a36Sopenharmony_ci			return -EINVAL;
187962306a36Sopenharmony_ci		}
188062306a36Sopenharmony_ci	}
188162306a36Sopenharmony_ci	target = Fout * div;
188262306a36Sopenharmony_ci	fll_div->fll_outdiv = div - 1;
188362306a36Sopenharmony_ci
188462306a36Sopenharmony_ci	pr_debug("FLL Fvco=%dHz\n", target);
188562306a36Sopenharmony_ci
188662306a36Sopenharmony_ci	/* Find an appropraite FLL_FRATIO and factor it out of the target */
188762306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(fll_fratios); i++) {
188862306a36Sopenharmony_ci		if (fll_fratios[i].min <= Fref && Fref <= fll_fratios[i].max) {
188962306a36Sopenharmony_ci			fll_div->fll_fratio = fll_fratios[i].fll_fratio;
189062306a36Sopenharmony_ci			fratio = fll_fratios[i].ratio;
189162306a36Sopenharmony_ci			break;
189262306a36Sopenharmony_ci		}
189362306a36Sopenharmony_ci	}
189462306a36Sopenharmony_ci	if (i == ARRAY_SIZE(fll_fratios)) {
189562306a36Sopenharmony_ci		pr_err("Unable to find FLL_FRATIO for Fref=%uHz\n", Fref);
189662306a36Sopenharmony_ci		return -EINVAL;
189762306a36Sopenharmony_ci	}
189862306a36Sopenharmony_ci
189962306a36Sopenharmony_ci	fll_div->n = target / (fratio * Fref);
190062306a36Sopenharmony_ci
190162306a36Sopenharmony_ci	if (target % Fref == 0) {
190262306a36Sopenharmony_ci		fll_div->theta = 0;
190362306a36Sopenharmony_ci		fll_div->lambda = 0;
190462306a36Sopenharmony_ci	} else {
190562306a36Sopenharmony_ci		gcd_fll = gcd(target, fratio * Fref);
190662306a36Sopenharmony_ci
190762306a36Sopenharmony_ci		fll_div->theta = (target - (fll_div->n * fratio * Fref))
190862306a36Sopenharmony_ci			/ gcd_fll;
190962306a36Sopenharmony_ci		fll_div->lambda = (fratio * Fref) / gcd_fll;
191062306a36Sopenharmony_ci	}
191162306a36Sopenharmony_ci
191262306a36Sopenharmony_ci	pr_debug("FLL N=%x THETA=%x LAMBDA=%x\n",
191362306a36Sopenharmony_ci		 fll_div->n, fll_div->theta, fll_div->lambda);
191462306a36Sopenharmony_ci	pr_debug("FLL_FRATIO=%x(%d) FLL_OUTDIV=%x FLL_REFCLK_DIV=%x\n",
191562306a36Sopenharmony_ci		 fll_div->fll_fratio, fratio, fll_div->fll_outdiv,
191662306a36Sopenharmony_ci		 fll_div->fll_refclk_div);
191762306a36Sopenharmony_ci
191862306a36Sopenharmony_ci	return 0;
191962306a36Sopenharmony_ci}
192062306a36Sopenharmony_ci
192162306a36Sopenharmony_cistatic int wm2200_set_fll(struct snd_soc_component *component, int fll_id, int source,
192262306a36Sopenharmony_ci			  unsigned int Fref, unsigned int Fout)
192362306a36Sopenharmony_ci{
192462306a36Sopenharmony_ci	struct i2c_client *i2c = to_i2c_client(component->dev);
192562306a36Sopenharmony_ci	struct wm2200_priv *wm2200 = snd_soc_component_get_drvdata(component);
192662306a36Sopenharmony_ci	struct _fll_div factors;
192762306a36Sopenharmony_ci	int ret, i, timeout;
192862306a36Sopenharmony_ci	unsigned long time_left;
192962306a36Sopenharmony_ci
193062306a36Sopenharmony_ci	if (!Fout) {
193162306a36Sopenharmony_ci		dev_dbg(component->dev, "FLL disabled");
193262306a36Sopenharmony_ci
193362306a36Sopenharmony_ci		if (wm2200->fll_fout)
193462306a36Sopenharmony_ci			pm_runtime_put(component->dev);
193562306a36Sopenharmony_ci
193662306a36Sopenharmony_ci		wm2200->fll_fout = 0;
193762306a36Sopenharmony_ci		snd_soc_component_update_bits(component, WM2200_FLL_CONTROL_1,
193862306a36Sopenharmony_ci				    WM2200_FLL_ENA, 0);
193962306a36Sopenharmony_ci		return 0;
194062306a36Sopenharmony_ci	}
194162306a36Sopenharmony_ci
194262306a36Sopenharmony_ci	switch (source) {
194362306a36Sopenharmony_ci	case WM2200_FLL_SRC_MCLK1:
194462306a36Sopenharmony_ci	case WM2200_FLL_SRC_MCLK2:
194562306a36Sopenharmony_ci	case WM2200_FLL_SRC_BCLK:
194662306a36Sopenharmony_ci		break;
194762306a36Sopenharmony_ci	default:
194862306a36Sopenharmony_ci		dev_err(component->dev, "Invalid FLL source %d\n", source);
194962306a36Sopenharmony_ci		return -EINVAL;
195062306a36Sopenharmony_ci	}
195162306a36Sopenharmony_ci
195262306a36Sopenharmony_ci	ret = fll_factors(&factors, Fref, Fout);
195362306a36Sopenharmony_ci	if (ret < 0)
195462306a36Sopenharmony_ci		return ret;
195562306a36Sopenharmony_ci
195662306a36Sopenharmony_ci	/* Disable the FLL while we reconfigure */
195762306a36Sopenharmony_ci	snd_soc_component_update_bits(component, WM2200_FLL_CONTROL_1, WM2200_FLL_ENA, 0);
195862306a36Sopenharmony_ci
195962306a36Sopenharmony_ci	snd_soc_component_update_bits(component, WM2200_FLL_CONTROL_2,
196062306a36Sopenharmony_ci			    WM2200_FLL_OUTDIV_MASK | WM2200_FLL_FRATIO_MASK,
196162306a36Sopenharmony_ci			    (factors.fll_outdiv << WM2200_FLL_OUTDIV_SHIFT) |
196262306a36Sopenharmony_ci			    factors.fll_fratio);
196362306a36Sopenharmony_ci	if (factors.theta) {
196462306a36Sopenharmony_ci		snd_soc_component_update_bits(component, WM2200_FLL_CONTROL_3,
196562306a36Sopenharmony_ci				    WM2200_FLL_FRACN_ENA,
196662306a36Sopenharmony_ci				    WM2200_FLL_FRACN_ENA);
196762306a36Sopenharmony_ci		snd_soc_component_update_bits(component, WM2200_FLL_EFS_2,
196862306a36Sopenharmony_ci				    WM2200_FLL_EFS_ENA,
196962306a36Sopenharmony_ci				    WM2200_FLL_EFS_ENA);
197062306a36Sopenharmony_ci	} else {
197162306a36Sopenharmony_ci		snd_soc_component_update_bits(component, WM2200_FLL_CONTROL_3,
197262306a36Sopenharmony_ci				    WM2200_FLL_FRACN_ENA, 0);
197362306a36Sopenharmony_ci		snd_soc_component_update_bits(component, WM2200_FLL_EFS_2,
197462306a36Sopenharmony_ci				    WM2200_FLL_EFS_ENA, 0);
197562306a36Sopenharmony_ci	}
197662306a36Sopenharmony_ci
197762306a36Sopenharmony_ci	snd_soc_component_update_bits(component, WM2200_FLL_CONTROL_4, WM2200_FLL_THETA_MASK,
197862306a36Sopenharmony_ci			    factors.theta);
197962306a36Sopenharmony_ci	snd_soc_component_update_bits(component, WM2200_FLL_CONTROL_6, WM2200_FLL_N_MASK,
198062306a36Sopenharmony_ci			    factors.n);
198162306a36Sopenharmony_ci	snd_soc_component_update_bits(component, WM2200_FLL_CONTROL_7,
198262306a36Sopenharmony_ci			    WM2200_FLL_CLK_REF_DIV_MASK |
198362306a36Sopenharmony_ci			    WM2200_FLL_CLK_REF_SRC_MASK,
198462306a36Sopenharmony_ci			    (factors.fll_refclk_div
198562306a36Sopenharmony_ci			     << WM2200_FLL_CLK_REF_DIV_SHIFT) | source);
198662306a36Sopenharmony_ci	snd_soc_component_update_bits(component, WM2200_FLL_EFS_1,
198762306a36Sopenharmony_ci			    WM2200_FLL_LAMBDA_MASK, factors.lambda);
198862306a36Sopenharmony_ci
198962306a36Sopenharmony_ci	/* Clear any pending completions */
199062306a36Sopenharmony_ci	try_wait_for_completion(&wm2200->fll_lock);
199162306a36Sopenharmony_ci
199262306a36Sopenharmony_ci	pm_runtime_get_sync(component->dev);
199362306a36Sopenharmony_ci
199462306a36Sopenharmony_ci	snd_soc_component_update_bits(component, WM2200_FLL_CONTROL_1,
199562306a36Sopenharmony_ci			    WM2200_FLL_ENA, WM2200_FLL_ENA);
199662306a36Sopenharmony_ci
199762306a36Sopenharmony_ci	if (i2c->irq)
199862306a36Sopenharmony_ci		timeout = 2;
199962306a36Sopenharmony_ci	else
200062306a36Sopenharmony_ci		timeout = 50;
200162306a36Sopenharmony_ci
200262306a36Sopenharmony_ci	snd_soc_component_update_bits(component, WM2200_CLOCKING_3, WM2200_SYSCLK_ENA,
200362306a36Sopenharmony_ci			    WM2200_SYSCLK_ENA);
200462306a36Sopenharmony_ci
200562306a36Sopenharmony_ci	/* Poll for the lock; will use the interrupt to exit quickly */
200662306a36Sopenharmony_ci	for (i = 0; i < timeout; i++) {
200762306a36Sopenharmony_ci		if (i2c->irq) {
200862306a36Sopenharmony_ci			time_left = wait_for_completion_timeout(
200962306a36Sopenharmony_ci							&wm2200->fll_lock,
201062306a36Sopenharmony_ci							msecs_to_jiffies(25));
201162306a36Sopenharmony_ci			if (time_left > 0)
201262306a36Sopenharmony_ci				break;
201362306a36Sopenharmony_ci		} else {
201462306a36Sopenharmony_ci			msleep(1);
201562306a36Sopenharmony_ci		}
201662306a36Sopenharmony_ci
201762306a36Sopenharmony_ci		ret = snd_soc_component_read(component,
201862306a36Sopenharmony_ci				   WM2200_INTERRUPT_RAW_STATUS_2);
201962306a36Sopenharmony_ci		if (ret < 0) {
202062306a36Sopenharmony_ci			dev_err(component->dev,
202162306a36Sopenharmony_ci				"Failed to read FLL status: %d\n",
202262306a36Sopenharmony_ci				ret);
202362306a36Sopenharmony_ci			continue;
202462306a36Sopenharmony_ci		}
202562306a36Sopenharmony_ci		if (ret & WM2200_FLL_LOCK_STS)
202662306a36Sopenharmony_ci			break;
202762306a36Sopenharmony_ci	}
202862306a36Sopenharmony_ci	if (i == timeout) {
202962306a36Sopenharmony_ci		dev_err(component->dev, "FLL lock timed out\n");
203062306a36Sopenharmony_ci		pm_runtime_put(component->dev);
203162306a36Sopenharmony_ci		return -ETIMEDOUT;
203262306a36Sopenharmony_ci	}
203362306a36Sopenharmony_ci
203462306a36Sopenharmony_ci	wm2200->fll_src = source;
203562306a36Sopenharmony_ci	wm2200->fll_fref = Fref;
203662306a36Sopenharmony_ci	wm2200->fll_fout = Fout;
203762306a36Sopenharmony_ci
203862306a36Sopenharmony_ci	dev_dbg(component->dev, "FLL running %dHz->%dHz\n", Fref, Fout);
203962306a36Sopenharmony_ci
204062306a36Sopenharmony_ci	return 0;
204162306a36Sopenharmony_ci}
204262306a36Sopenharmony_ci
204362306a36Sopenharmony_cistatic int wm2200_dai_probe(struct snd_soc_dai *dai)
204462306a36Sopenharmony_ci{
204562306a36Sopenharmony_ci	struct snd_soc_component *component = dai->component;
204662306a36Sopenharmony_ci	struct wm2200_priv *wm2200 = snd_soc_component_get_drvdata(component);
204762306a36Sopenharmony_ci	unsigned int val = 0;
204862306a36Sopenharmony_ci	int ret;
204962306a36Sopenharmony_ci
205062306a36Sopenharmony_ci	ret = snd_soc_component_read(component, WM2200_GPIO_CTRL_1);
205162306a36Sopenharmony_ci	if (ret >= 0) {
205262306a36Sopenharmony_ci		if ((ret & WM2200_GP1_FN_MASK) != 0) {
205362306a36Sopenharmony_ci			wm2200->symmetric_rates = true;
205462306a36Sopenharmony_ci			val = WM2200_AIF1TX_LRCLK_SRC;
205562306a36Sopenharmony_ci		}
205662306a36Sopenharmony_ci	} else {
205762306a36Sopenharmony_ci		dev_err(component->dev, "Failed to read GPIO 1 config: %d\n", ret);
205862306a36Sopenharmony_ci	}
205962306a36Sopenharmony_ci
206062306a36Sopenharmony_ci	snd_soc_component_update_bits(component, WM2200_AUDIO_IF_1_2,
206162306a36Sopenharmony_ci			    WM2200_AIF1TX_LRCLK_SRC, val);
206262306a36Sopenharmony_ci
206362306a36Sopenharmony_ci	return 0;
206462306a36Sopenharmony_ci}
206562306a36Sopenharmony_ci
206662306a36Sopenharmony_cistatic const struct snd_soc_dai_ops wm2200_dai_ops = {
206762306a36Sopenharmony_ci	.probe = wm2200_dai_probe,
206862306a36Sopenharmony_ci	.set_fmt = wm2200_set_fmt,
206962306a36Sopenharmony_ci	.hw_params = wm2200_hw_params,
207062306a36Sopenharmony_ci};
207162306a36Sopenharmony_ci
207262306a36Sopenharmony_ci#define WM2200_RATES SNDRV_PCM_RATE_8000_48000
207362306a36Sopenharmony_ci
207462306a36Sopenharmony_ci#define WM2200_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
207562306a36Sopenharmony_ci			SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
207662306a36Sopenharmony_ci
207762306a36Sopenharmony_cistatic struct snd_soc_dai_driver wm2200_dai = {
207862306a36Sopenharmony_ci	.name = "wm2200",
207962306a36Sopenharmony_ci	.playback = {
208062306a36Sopenharmony_ci		.stream_name = "Playback",
208162306a36Sopenharmony_ci		.channels_min = 2,
208262306a36Sopenharmony_ci		.channels_max = 2,
208362306a36Sopenharmony_ci		.rates = WM2200_RATES,
208462306a36Sopenharmony_ci		.formats = WM2200_FORMATS,
208562306a36Sopenharmony_ci	},
208662306a36Sopenharmony_ci	.capture = {
208762306a36Sopenharmony_ci		 .stream_name = "Capture",
208862306a36Sopenharmony_ci		 .channels_min = 2,
208962306a36Sopenharmony_ci		 .channels_max = 2,
209062306a36Sopenharmony_ci		 .rates = WM2200_RATES,
209162306a36Sopenharmony_ci		 .formats = WM2200_FORMATS,
209262306a36Sopenharmony_ci	 },
209362306a36Sopenharmony_ci	.ops = &wm2200_dai_ops,
209462306a36Sopenharmony_ci};
209562306a36Sopenharmony_ci
209662306a36Sopenharmony_cistatic const struct snd_soc_component_driver soc_component_wm2200 = {
209762306a36Sopenharmony_ci	.probe			= wm2200_probe,
209862306a36Sopenharmony_ci	.set_sysclk		= wm2200_set_sysclk,
209962306a36Sopenharmony_ci	.set_pll		= wm2200_set_fll,
210062306a36Sopenharmony_ci	.controls		= wm2200_snd_controls,
210162306a36Sopenharmony_ci	.num_controls		= ARRAY_SIZE(wm2200_snd_controls),
210262306a36Sopenharmony_ci	.dapm_widgets		= wm2200_dapm_widgets,
210362306a36Sopenharmony_ci	.num_dapm_widgets	= ARRAY_SIZE(wm2200_dapm_widgets),
210462306a36Sopenharmony_ci	.dapm_routes		= wm2200_dapm_routes,
210562306a36Sopenharmony_ci	.num_dapm_routes	= ARRAY_SIZE(wm2200_dapm_routes),
210662306a36Sopenharmony_ci	.endianness		= 1,
210762306a36Sopenharmony_ci};
210862306a36Sopenharmony_ci
210962306a36Sopenharmony_cistatic irqreturn_t wm2200_irq(int irq, void *data)
211062306a36Sopenharmony_ci{
211162306a36Sopenharmony_ci	struct wm2200_priv *wm2200 = data;
211262306a36Sopenharmony_ci	unsigned int val, mask;
211362306a36Sopenharmony_ci	int ret;
211462306a36Sopenharmony_ci
211562306a36Sopenharmony_ci	ret = regmap_read(wm2200->regmap, WM2200_INTERRUPT_STATUS_2, &val);
211662306a36Sopenharmony_ci	if (ret != 0) {
211762306a36Sopenharmony_ci		dev_err(wm2200->dev, "Failed to read IRQ status: %d\n", ret);
211862306a36Sopenharmony_ci		return IRQ_NONE;
211962306a36Sopenharmony_ci	}
212062306a36Sopenharmony_ci
212162306a36Sopenharmony_ci	ret = regmap_read(wm2200->regmap, WM2200_INTERRUPT_STATUS_2_MASK,
212262306a36Sopenharmony_ci			   &mask);
212362306a36Sopenharmony_ci	if (ret != 0) {
212462306a36Sopenharmony_ci		dev_warn(wm2200->dev, "Failed to read IRQ mask: %d\n", ret);
212562306a36Sopenharmony_ci		mask = 0;
212662306a36Sopenharmony_ci	}
212762306a36Sopenharmony_ci
212862306a36Sopenharmony_ci	val &= ~mask;
212962306a36Sopenharmony_ci
213062306a36Sopenharmony_ci	if (val & WM2200_FLL_LOCK_EINT) {
213162306a36Sopenharmony_ci		dev_dbg(wm2200->dev, "FLL locked\n");
213262306a36Sopenharmony_ci		complete(&wm2200->fll_lock);
213362306a36Sopenharmony_ci	}
213462306a36Sopenharmony_ci
213562306a36Sopenharmony_ci	if (val) {
213662306a36Sopenharmony_ci		regmap_write(wm2200->regmap, WM2200_INTERRUPT_STATUS_2, val);
213762306a36Sopenharmony_ci
213862306a36Sopenharmony_ci		return IRQ_HANDLED;
213962306a36Sopenharmony_ci	} else {
214062306a36Sopenharmony_ci		return IRQ_NONE;
214162306a36Sopenharmony_ci	}
214262306a36Sopenharmony_ci}
214362306a36Sopenharmony_ci
214462306a36Sopenharmony_cistatic const struct regmap_config wm2200_regmap = {
214562306a36Sopenharmony_ci	.reg_bits = 16,
214662306a36Sopenharmony_ci	.val_bits = 16,
214762306a36Sopenharmony_ci
214862306a36Sopenharmony_ci	.max_register = WM2200_MAX_REGISTER + (ARRAY_SIZE(wm2200_ranges) *
214962306a36Sopenharmony_ci					       WM2200_DSP_SPACING),
215062306a36Sopenharmony_ci	.reg_defaults = wm2200_reg_defaults,
215162306a36Sopenharmony_ci	.num_reg_defaults = ARRAY_SIZE(wm2200_reg_defaults),
215262306a36Sopenharmony_ci	.volatile_reg = wm2200_volatile_register,
215362306a36Sopenharmony_ci	.readable_reg = wm2200_readable_register,
215462306a36Sopenharmony_ci	.cache_type = REGCACHE_MAPLE,
215562306a36Sopenharmony_ci	.ranges = wm2200_ranges,
215662306a36Sopenharmony_ci	.num_ranges = ARRAY_SIZE(wm2200_ranges),
215762306a36Sopenharmony_ci};
215862306a36Sopenharmony_ci
215962306a36Sopenharmony_cistatic const unsigned int wm2200_dig_vu[] = {
216062306a36Sopenharmony_ci	WM2200_DAC_DIGITAL_VOLUME_1L,
216162306a36Sopenharmony_ci	WM2200_DAC_DIGITAL_VOLUME_1R,
216262306a36Sopenharmony_ci	WM2200_DAC_DIGITAL_VOLUME_2L,
216362306a36Sopenharmony_ci	WM2200_DAC_DIGITAL_VOLUME_2R,
216462306a36Sopenharmony_ci	WM2200_ADC_DIGITAL_VOLUME_1L,
216562306a36Sopenharmony_ci	WM2200_ADC_DIGITAL_VOLUME_1R,
216662306a36Sopenharmony_ci	WM2200_ADC_DIGITAL_VOLUME_2L,
216762306a36Sopenharmony_ci	WM2200_ADC_DIGITAL_VOLUME_2R,
216862306a36Sopenharmony_ci	WM2200_ADC_DIGITAL_VOLUME_3L,
216962306a36Sopenharmony_ci	WM2200_ADC_DIGITAL_VOLUME_3R,
217062306a36Sopenharmony_ci};
217162306a36Sopenharmony_ci
217262306a36Sopenharmony_cistatic const unsigned int wm2200_mic_ctrl_reg[] = {
217362306a36Sopenharmony_ci	WM2200_IN1L_CONTROL,
217462306a36Sopenharmony_ci	WM2200_IN2L_CONTROL,
217562306a36Sopenharmony_ci	WM2200_IN3L_CONTROL,
217662306a36Sopenharmony_ci};
217762306a36Sopenharmony_ci
217862306a36Sopenharmony_cistatic int wm2200_i2c_probe(struct i2c_client *i2c)
217962306a36Sopenharmony_ci{
218062306a36Sopenharmony_ci	struct wm2200_pdata *pdata = dev_get_platdata(&i2c->dev);
218162306a36Sopenharmony_ci	struct wm2200_priv *wm2200;
218262306a36Sopenharmony_ci	unsigned int reg;
218362306a36Sopenharmony_ci	int ret, i;
218462306a36Sopenharmony_ci	int val;
218562306a36Sopenharmony_ci
218662306a36Sopenharmony_ci	wm2200 = devm_kzalloc(&i2c->dev, sizeof(struct wm2200_priv),
218762306a36Sopenharmony_ci			      GFP_KERNEL);
218862306a36Sopenharmony_ci	if (wm2200 == NULL)
218962306a36Sopenharmony_ci		return -ENOMEM;
219062306a36Sopenharmony_ci
219162306a36Sopenharmony_ci	wm2200->dev = &i2c->dev;
219262306a36Sopenharmony_ci	init_completion(&wm2200->fll_lock);
219362306a36Sopenharmony_ci
219462306a36Sopenharmony_ci	wm2200->regmap = devm_regmap_init_i2c(i2c, &wm2200_regmap);
219562306a36Sopenharmony_ci	if (IS_ERR(wm2200->regmap)) {
219662306a36Sopenharmony_ci		ret = PTR_ERR(wm2200->regmap);
219762306a36Sopenharmony_ci		dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
219862306a36Sopenharmony_ci			ret);
219962306a36Sopenharmony_ci		return ret;
220062306a36Sopenharmony_ci	}
220162306a36Sopenharmony_ci
220262306a36Sopenharmony_ci	for (i = 0; i < 2; i++) {
220362306a36Sopenharmony_ci		wm2200->dsp[i].cs_dsp.type = WMFW_ADSP1;
220462306a36Sopenharmony_ci		wm2200->dsp[i].part = "wm2200";
220562306a36Sopenharmony_ci		wm2200->dsp[i].cs_dsp.num = i + 1;
220662306a36Sopenharmony_ci		wm2200->dsp[i].cs_dsp.dev = &i2c->dev;
220762306a36Sopenharmony_ci		wm2200->dsp[i].cs_dsp.regmap = wm2200->regmap;
220862306a36Sopenharmony_ci		wm2200->dsp[i].cs_dsp.sysclk_reg = WM2200_CLOCKING_3;
220962306a36Sopenharmony_ci		wm2200->dsp[i].cs_dsp.sysclk_mask = WM2200_SYSCLK_FREQ_MASK;
221062306a36Sopenharmony_ci		wm2200->dsp[i].cs_dsp.sysclk_shift =  WM2200_SYSCLK_FREQ_SHIFT;
221162306a36Sopenharmony_ci	}
221262306a36Sopenharmony_ci
221362306a36Sopenharmony_ci	wm2200->dsp[0].cs_dsp.base = WM2200_DSP1_CONTROL_1;
221462306a36Sopenharmony_ci	wm2200->dsp[0].cs_dsp.mem = wm2200_dsp1_regions;
221562306a36Sopenharmony_ci	wm2200->dsp[0].cs_dsp.num_mems = ARRAY_SIZE(wm2200_dsp1_regions);
221662306a36Sopenharmony_ci
221762306a36Sopenharmony_ci	wm2200->dsp[1].cs_dsp.base = WM2200_DSP2_CONTROL_1;
221862306a36Sopenharmony_ci	wm2200->dsp[1].cs_dsp.mem = wm2200_dsp2_regions;
221962306a36Sopenharmony_ci	wm2200->dsp[1].cs_dsp.num_mems = ARRAY_SIZE(wm2200_dsp2_regions);
222062306a36Sopenharmony_ci
222162306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(wm2200->dsp); i++)
222262306a36Sopenharmony_ci		wm_adsp1_init(&wm2200->dsp[i]);
222362306a36Sopenharmony_ci
222462306a36Sopenharmony_ci	if (pdata)
222562306a36Sopenharmony_ci		wm2200->pdata = *pdata;
222662306a36Sopenharmony_ci
222762306a36Sopenharmony_ci	i2c_set_clientdata(i2c, wm2200);
222862306a36Sopenharmony_ci
222962306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(wm2200->core_supplies); i++)
223062306a36Sopenharmony_ci		wm2200->core_supplies[i].supply = wm2200_core_supply_names[i];
223162306a36Sopenharmony_ci
223262306a36Sopenharmony_ci	ret = devm_regulator_bulk_get(&i2c->dev,
223362306a36Sopenharmony_ci				      ARRAY_SIZE(wm2200->core_supplies),
223462306a36Sopenharmony_ci				      wm2200->core_supplies);
223562306a36Sopenharmony_ci	if (ret != 0) {
223662306a36Sopenharmony_ci		dev_err(&i2c->dev, "Failed to request core supplies: %d\n",
223762306a36Sopenharmony_ci			ret);
223862306a36Sopenharmony_ci		return ret;
223962306a36Sopenharmony_ci	}
224062306a36Sopenharmony_ci
224162306a36Sopenharmony_ci	ret = regulator_bulk_enable(ARRAY_SIZE(wm2200->core_supplies),
224262306a36Sopenharmony_ci				    wm2200->core_supplies);
224362306a36Sopenharmony_ci	if (ret != 0) {
224462306a36Sopenharmony_ci		dev_err(&i2c->dev, "Failed to enable core supplies: %d\n",
224562306a36Sopenharmony_ci			ret);
224662306a36Sopenharmony_ci		return ret;
224762306a36Sopenharmony_ci	}
224862306a36Sopenharmony_ci
224962306a36Sopenharmony_ci	if (wm2200->pdata.ldo_ena) {
225062306a36Sopenharmony_ci		ret = devm_gpio_request_one(&i2c->dev, wm2200->pdata.ldo_ena,
225162306a36Sopenharmony_ci					    GPIOF_OUT_INIT_HIGH,
225262306a36Sopenharmony_ci					    "WM2200 LDOENA");
225362306a36Sopenharmony_ci		if (ret < 0) {
225462306a36Sopenharmony_ci			dev_err(&i2c->dev, "Failed to request LDOENA %d: %d\n",
225562306a36Sopenharmony_ci				wm2200->pdata.ldo_ena, ret);
225662306a36Sopenharmony_ci			goto err_enable;
225762306a36Sopenharmony_ci		}
225862306a36Sopenharmony_ci		msleep(2);
225962306a36Sopenharmony_ci	}
226062306a36Sopenharmony_ci
226162306a36Sopenharmony_ci	if (wm2200->pdata.reset) {
226262306a36Sopenharmony_ci		ret = devm_gpio_request_one(&i2c->dev, wm2200->pdata.reset,
226362306a36Sopenharmony_ci					    GPIOF_OUT_INIT_HIGH,
226462306a36Sopenharmony_ci					    "WM2200 /RESET");
226562306a36Sopenharmony_ci		if (ret < 0) {
226662306a36Sopenharmony_ci			dev_err(&i2c->dev, "Failed to request /RESET %d: %d\n",
226762306a36Sopenharmony_ci				wm2200->pdata.reset, ret);
226862306a36Sopenharmony_ci			goto err_ldo;
226962306a36Sopenharmony_ci		}
227062306a36Sopenharmony_ci	}
227162306a36Sopenharmony_ci
227262306a36Sopenharmony_ci	ret = regmap_read(wm2200->regmap, WM2200_SOFTWARE_RESET, &reg);
227362306a36Sopenharmony_ci	if (ret < 0) {
227462306a36Sopenharmony_ci		dev_err(&i2c->dev, "Failed to read ID register: %d\n", ret);
227562306a36Sopenharmony_ci		goto err_reset;
227662306a36Sopenharmony_ci	}
227762306a36Sopenharmony_ci	switch (reg) {
227862306a36Sopenharmony_ci	case 0x2200:
227962306a36Sopenharmony_ci		break;
228062306a36Sopenharmony_ci
228162306a36Sopenharmony_ci	default:
228262306a36Sopenharmony_ci		dev_err(&i2c->dev, "Device is not a WM2200, ID is %x\n", reg);
228362306a36Sopenharmony_ci		ret = -EINVAL;
228462306a36Sopenharmony_ci		goto err_reset;
228562306a36Sopenharmony_ci	}
228662306a36Sopenharmony_ci
228762306a36Sopenharmony_ci	ret = regmap_read(wm2200->regmap, WM2200_DEVICE_REVISION, &reg);
228862306a36Sopenharmony_ci	if (ret < 0) {
228962306a36Sopenharmony_ci		dev_err(&i2c->dev, "Failed to read revision register\n");
229062306a36Sopenharmony_ci		goto err_reset;
229162306a36Sopenharmony_ci	}
229262306a36Sopenharmony_ci
229362306a36Sopenharmony_ci	wm2200->rev = reg & WM2200_DEVICE_REVISION_MASK;
229462306a36Sopenharmony_ci
229562306a36Sopenharmony_ci	dev_info(&i2c->dev, "revision %c\n", wm2200->rev + 'A');
229662306a36Sopenharmony_ci
229762306a36Sopenharmony_ci	switch (wm2200->rev) {
229862306a36Sopenharmony_ci	case 0:
229962306a36Sopenharmony_ci	case 1:
230062306a36Sopenharmony_ci		ret = regmap_register_patch(wm2200->regmap, wm2200_reva_patch,
230162306a36Sopenharmony_ci					    ARRAY_SIZE(wm2200_reva_patch));
230262306a36Sopenharmony_ci		if (ret != 0) {
230362306a36Sopenharmony_ci			dev_err(&i2c->dev, "Failed to register patch: %d\n",
230462306a36Sopenharmony_ci				ret);
230562306a36Sopenharmony_ci		}
230662306a36Sopenharmony_ci		break;
230762306a36Sopenharmony_ci	default:
230862306a36Sopenharmony_ci		break;
230962306a36Sopenharmony_ci	}
231062306a36Sopenharmony_ci
231162306a36Sopenharmony_ci	ret = wm2200_reset(wm2200);
231262306a36Sopenharmony_ci	if (ret < 0) {
231362306a36Sopenharmony_ci		dev_err(&i2c->dev, "Failed to issue reset\n");
231462306a36Sopenharmony_ci		goto err_reset;
231562306a36Sopenharmony_ci	}
231662306a36Sopenharmony_ci
231762306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(wm2200->pdata.gpio_defaults); i++) {
231862306a36Sopenharmony_ci		if (!wm2200->pdata.gpio_defaults[i])
231962306a36Sopenharmony_ci			continue;
232062306a36Sopenharmony_ci
232162306a36Sopenharmony_ci		regmap_write(wm2200->regmap, WM2200_GPIO_CTRL_1 + i,
232262306a36Sopenharmony_ci			     wm2200->pdata.gpio_defaults[i]);
232362306a36Sopenharmony_ci	}
232462306a36Sopenharmony_ci
232562306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(wm2200_dig_vu); i++)
232662306a36Sopenharmony_ci		regmap_update_bits(wm2200->regmap, wm2200_dig_vu[i],
232762306a36Sopenharmony_ci				   WM2200_OUT_VU, WM2200_OUT_VU);
232862306a36Sopenharmony_ci
232962306a36Sopenharmony_ci	/* Assign slots 1-6 to channels 1-6 for both TX and RX */
233062306a36Sopenharmony_ci	for (i = 0; i < 6; i++) {
233162306a36Sopenharmony_ci		regmap_write(wm2200->regmap, WM2200_AUDIO_IF_1_10 + i, i);
233262306a36Sopenharmony_ci		regmap_write(wm2200->regmap, WM2200_AUDIO_IF_1_16 + i, i);
233362306a36Sopenharmony_ci	}
233462306a36Sopenharmony_ci
233562306a36Sopenharmony_ci	for (i = 0; i < WM2200_MAX_MICBIAS; i++) {
233662306a36Sopenharmony_ci		if (!wm2200->pdata.micbias[i].mb_lvl &&
233762306a36Sopenharmony_ci		    !wm2200->pdata.micbias[i].bypass)
233862306a36Sopenharmony_ci			continue;
233962306a36Sopenharmony_ci
234062306a36Sopenharmony_ci		/* Apply default for bypass mode */
234162306a36Sopenharmony_ci		if (!wm2200->pdata.micbias[i].mb_lvl)
234262306a36Sopenharmony_ci			wm2200->pdata.micbias[i].mb_lvl
234362306a36Sopenharmony_ci					= WM2200_MBIAS_LVL_1V5;
234462306a36Sopenharmony_ci
234562306a36Sopenharmony_ci		val = (wm2200->pdata.micbias[i].mb_lvl -1)
234662306a36Sopenharmony_ci					<< WM2200_MICB1_LVL_SHIFT;
234762306a36Sopenharmony_ci
234862306a36Sopenharmony_ci		if (wm2200->pdata.micbias[i].discharge)
234962306a36Sopenharmony_ci			val |= WM2200_MICB1_DISCH;
235062306a36Sopenharmony_ci
235162306a36Sopenharmony_ci		if (wm2200->pdata.micbias[i].fast_start)
235262306a36Sopenharmony_ci			val |= WM2200_MICB1_RATE;
235362306a36Sopenharmony_ci
235462306a36Sopenharmony_ci		if (wm2200->pdata.micbias[i].bypass)
235562306a36Sopenharmony_ci			val |= WM2200_MICB1_MODE;
235662306a36Sopenharmony_ci
235762306a36Sopenharmony_ci		regmap_update_bits(wm2200->regmap,
235862306a36Sopenharmony_ci				   WM2200_MIC_BIAS_CTRL_1 + i,
235962306a36Sopenharmony_ci				   WM2200_MICB1_LVL_MASK |
236062306a36Sopenharmony_ci				   WM2200_MICB1_DISCH |
236162306a36Sopenharmony_ci				   WM2200_MICB1_MODE |
236262306a36Sopenharmony_ci				   WM2200_MICB1_RATE, val);
236362306a36Sopenharmony_ci	}
236462306a36Sopenharmony_ci
236562306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(wm2200->pdata.in_mode); i++) {
236662306a36Sopenharmony_ci		regmap_update_bits(wm2200->regmap, wm2200_mic_ctrl_reg[i],
236762306a36Sopenharmony_ci				   WM2200_IN1_MODE_MASK |
236862306a36Sopenharmony_ci				   WM2200_IN1_DMIC_SUP_MASK,
236962306a36Sopenharmony_ci				   (wm2200->pdata.in_mode[i] <<
237062306a36Sopenharmony_ci				    WM2200_IN1_MODE_SHIFT) |
237162306a36Sopenharmony_ci				   (wm2200->pdata.dmic_sup[i] <<
237262306a36Sopenharmony_ci				    WM2200_IN1_DMIC_SUP_SHIFT));
237362306a36Sopenharmony_ci	}
237462306a36Sopenharmony_ci
237562306a36Sopenharmony_ci	if (i2c->irq) {
237662306a36Sopenharmony_ci		ret = request_threaded_irq(i2c->irq, NULL, wm2200_irq,
237762306a36Sopenharmony_ci					   IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
237862306a36Sopenharmony_ci					   "wm2200", wm2200);
237962306a36Sopenharmony_ci		if (ret == 0)
238062306a36Sopenharmony_ci			regmap_update_bits(wm2200->regmap,
238162306a36Sopenharmony_ci					   WM2200_INTERRUPT_STATUS_2_MASK,
238262306a36Sopenharmony_ci					   WM2200_FLL_LOCK_EINT, 0);
238362306a36Sopenharmony_ci		else
238462306a36Sopenharmony_ci			dev_err(&i2c->dev, "Failed to request IRQ %d: %d\n",
238562306a36Sopenharmony_ci				i2c->irq, ret);
238662306a36Sopenharmony_ci	}
238762306a36Sopenharmony_ci
238862306a36Sopenharmony_ci	pm_runtime_set_active(&i2c->dev);
238962306a36Sopenharmony_ci	pm_runtime_enable(&i2c->dev);
239062306a36Sopenharmony_ci	pm_request_idle(&i2c->dev);
239162306a36Sopenharmony_ci
239262306a36Sopenharmony_ci	ret = devm_snd_soc_register_component(&i2c->dev, &soc_component_wm2200,
239362306a36Sopenharmony_ci				     &wm2200_dai, 1);
239462306a36Sopenharmony_ci	if (ret != 0) {
239562306a36Sopenharmony_ci		dev_err(&i2c->dev, "Failed to register CODEC: %d\n", ret);
239662306a36Sopenharmony_ci		goto err_pm_runtime;
239762306a36Sopenharmony_ci	}
239862306a36Sopenharmony_ci
239962306a36Sopenharmony_ci	return 0;
240062306a36Sopenharmony_ci
240162306a36Sopenharmony_cierr_pm_runtime:
240262306a36Sopenharmony_ci	pm_runtime_disable(&i2c->dev);
240362306a36Sopenharmony_ci	if (i2c->irq)
240462306a36Sopenharmony_ci		free_irq(i2c->irq, wm2200);
240562306a36Sopenharmony_cierr_reset:
240662306a36Sopenharmony_ci	if (wm2200->pdata.reset)
240762306a36Sopenharmony_ci		gpio_set_value_cansleep(wm2200->pdata.reset, 0);
240862306a36Sopenharmony_cierr_ldo:
240962306a36Sopenharmony_ci	if (wm2200->pdata.ldo_ena)
241062306a36Sopenharmony_ci		gpio_set_value_cansleep(wm2200->pdata.ldo_ena, 0);
241162306a36Sopenharmony_cierr_enable:
241262306a36Sopenharmony_ci	regulator_bulk_disable(ARRAY_SIZE(wm2200->core_supplies),
241362306a36Sopenharmony_ci			       wm2200->core_supplies);
241462306a36Sopenharmony_ci	return ret;
241562306a36Sopenharmony_ci}
241662306a36Sopenharmony_ci
241762306a36Sopenharmony_cistatic void wm2200_i2c_remove(struct i2c_client *i2c)
241862306a36Sopenharmony_ci{
241962306a36Sopenharmony_ci	struct wm2200_priv *wm2200 = i2c_get_clientdata(i2c);
242062306a36Sopenharmony_ci
242162306a36Sopenharmony_ci	pm_runtime_disable(&i2c->dev);
242262306a36Sopenharmony_ci	if (i2c->irq)
242362306a36Sopenharmony_ci		free_irq(i2c->irq, wm2200);
242462306a36Sopenharmony_ci	if (wm2200->pdata.reset)
242562306a36Sopenharmony_ci		gpio_set_value_cansleep(wm2200->pdata.reset, 0);
242662306a36Sopenharmony_ci	if (wm2200->pdata.ldo_ena)
242762306a36Sopenharmony_ci		gpio_set_value_cansleep(wm2200->pdata.ldo_ena, 0);
242862306a36Sopenharmony_ci	regulator_bulk_disable(ARRAY_SIZE(wm2200->core_supplies),
242962306a36Sopenharmony_ci			       wm2200->core_supplies);
243062306a36Sopenharmony_ci}
243162306a36Sopenharmony_ci
243262306a36Sopenharmony_ci#ifdef CONFIG_PM
243362306a36Sopenharmony_cistatic int wm2200_runtime_suspend(struct device *dev)
243462306a36Sopenharmony_ci{
243562306a36Sopenharmony_ci	struct wm2200_priv *wm2200 = dev_get_drvdata(dev);
243662306a36Sopenharmony_ci
243762306a36Sopenharmony_ci	regcache_cache_only(wm2200->regmap, true);
243862306a36Sopenharmony_ci	regcache_mark_dirty(wm2200->regmap);
243962306a36Sopenharmony_ci	if (wm2200->pdata.ldo_ena)
244062306a36Sopenharmony_ci		gpio_set_value_cansleep(wm2200->pdata.ldo_ena, 0);
244162306a36Sopenharmony_ci	regulator_bulk_disable(ARRAY_SIZE(wm2200->core_supplies),
244262306a36Sopenharmony_ci			       wm2200->core_supplies);
244362306a36Sopenharmony_ci
244462306a36Sopenharmony_ci	return 0;
244562306a36Sopenharmony_ci}
244662306a36Sopenharmony_ci
244762306a36Sopenharmony_cistatic int wm2200_runtime_resume(struct device *dev)
244862306a36Sopenharmony_ci{
244962306a36Sopenharmony_ci	struct wm2200_priv *wm2200 = dev_get_drvdata(dev);
245062306a36Sopenharmony_ci	int ret;
245162306a36Sopenharmony_ci
245262306a36Sopenharmony_ci	ret = regulator_bulk_enable(ARRAY_SIZE(wm2200->core_supplies),
245362306a36Sopenharmony_ci				    wm2200->core_supplies);
245462306a36Sopenharmony_ci	if (ret != 0) {
245562306a36Sopenharmony_ci		dev_err(dev, "Failed to enable supplies: %d\n",
245662306a36Sopenharmony_ci			ret);
245762306a36Sopenharmony_ci		return ret;
245862306a36Sopenharmony_ci	}
245962306a36Sopenharmony_ci
246062306a36Sopenharmony_ci	if (wm2200->pdata.ldo_ena) {
246162306a36Sopenharmony_ci		gpio_set_value_cansleep(wm2200->pdata.ldo_ena, 1);
246262306a36Sopenharmony_ci		msleep(2);
246362306a36Sopenharmony_ci	}
246462306a36Sopenharmony_ci
246562306a36Sopenharmony_ci	regcache_cache_only(wm2200->regmap, false);
246662306a36Sopenharmony_ci	regcache_sync(wm2200->regmap);
246762306a36Sopenharmony_ci
246862306a36Sopenharmony_ci	return 0;
246962306a36Sopenharmony_ci}
247062306a36Sopenharmony_ci#endif
247162306a36Sopenharmony_ci
247262306a36Sopenharmony_cistatic const struct dev_pm_ops wm2200_pm = {
247362306a36Sopenharmony_ci	SET_RUNTIME_PM_OPS(wm2200_runtime_suspend, wm2200_runtime_resume,
247462306a36Sopenharmony_ci			   NULL)
247562306a36Sopenharmony_ci};
247662306a36Sopenharmony_ci
247762306a36Sopenharmony_cistatic const struct i2c_device_id wm2200_i2c_id[] = {
247862306a36Sopenharmony_ci	{ "wm2200", 0 },
247962306a36Sopenharmony_ci	{ }
248062306a36Sopenharmony_ci};
248162306a36Sopenharmony_ciMODULE_DEVICE_TABLE(i2c, wm2200_i2c_id);
248262306a36Sopenharmony_ci
248362306a36Sopenharmony_cistatic struct i2c_driver wm2200_i2c_driver = {
248462306a36Sopenharmony_ci	.driver = {
248562306a36Sopenharmony_ci		.name = "wm2200",
248662306a36Sopenharmony_ci		.pm = &wm2200_pm,
248762306a36Sopenharmony_ci	},
248862306a36Sopenharmony_ci	.probe =    wm2200_i2c_probe,
248962306a36Sopenharmony_ci	.remove =   wm2200_i2c_remove,
249062306a36Sopenharmony_ci	.id_table = wm2200_i2c_id,
249162306a36Sopenharmony_ci};
249262306a36Sopenharmony_ci
249362306a36Sopenharmony_cimodule_i2c_driver(wm2200_i2c_driver);
249462306a36Sopenharmony_ci
249562306a36Sopenharmony_ciMODULE_DESCRIPTION("ASoC WM2200 driver");
249662306a36Sopenharmony_ciMODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
249762306a36Sopenharmony_ciMODULE_LICENSE("GPL");
2498