162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * rt5663.c -- RT5663 ALSA SoC audio codec driver 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright 2016 Realtek Semiconductor Corp. 662306a36Sopenharmony_ci * Author: Jack Yu <jack.yu@realtek.com> 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci#include <linux/module.h> 962306a36Sopenharmony_ci#include <linux/moduleparam.h> 1062306a36Sopenharmony_ci#include <linux/init.h> 1162306a36Sopenharmony_ci#include <linux/delay.h> 1262306a36Sopenharmony_ci#include <linux/pm.h> 1362306a36Sopenharmony_ci#include <linux/i2c.h> 1462306a36Sopenharmony_ci#include <linux/platform_device.h> 1562306a36Sopenharmony_ci#include <linux/spi/spi.h> 1662306a36Sopenharmony_ci#include <linux/acpi.h> 1762306a36Sopenharmony_ci#include <linux/regulator/consumer.h> 1862306a36Sopenharmony_ci#include <linux/workqueue.h> 1962306a36Sopenharmony_ci#include <sound/core.h> 2062306a36Sopenharmony_ci#include <sound/pcm.h> 2162306a36Sopenharmony_ci#include <sound/pcm_params.h> 2262306a36Sopenharmony_ci#include <sound/jack.h> 2362306a36Sopenharmony_ci#include <sound/soc.h> 2462306a36Sopenharmony_ci#include <sound/soc-dapm.h> 2562306a36Sopenharmony_ci#include <sound/initval.h> 2662306a36Sopenharmony_ci#include <sound/tlv.h> 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci#include "rt5663.h" 2962306a36Sopenharmony_ci#include "rl6231.h" 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci#define RT5663_DEVICE_ID_2 0x6451 3262306a36Sopenharmony_ci#define RT5663_DEVICE_ID_1 0x6406 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci#define RT5663_POWER_ON_DELAY_MS 300 3562306a36Sopenharmony_ci#define RT5663_SUPPLY_CURRENT_UA 500000 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_cienum { 3862306a36Sopenharmony_ci CODEC_VER_1, 3962306a36Sopenharmony_ci CODEC_VER_0, 4062306a36Sopenharmony_ci}; 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_cistruct impedance_mapping_table { 4362306a36Sopenharmony_ci unsigned int imp_min; 4462306a36Sopenharmony_ci unsigned int imp_max; 4562306a36Sopenharmony_ci unsigned int vol; 4662306a36Sopenharmony_ci unsigned int dc_offset_l_manual; 4762306a36Sopenharmony_ci unsigned int dc_offset_r_manual; 4862306a36Sopenharmony_ci unsigned int dc_offset_l_manual_mic; 4962306a36Sopenharmony_ci unsigned int dc_offset_r_manual_mic; 5062306a36Sopenharmony_ci}; 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_cistatic const char *const rt5663_supply_names[] = { 5362306a36Sopenharmony_ci "avdd", 5462306a36Sopenharmony_ci "cpvdd", 5562306a36Sopenharmony_ci}; 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_cistruct rt5663_priv { 5862306a36Sopenharmony_ci struct snd_soc_component *component; 5962306a36Sopenharmony_ci struct rt5663_platform_data pdata; 6062306a36Sopenharmony_ci struct regmap *regmap; 6162306a36Sopenharmony_ci struct delayed_work jack_detect_work, jd_unplug_work; 6262306a36Sopenharmony_ci struct snd_soc_jack *hs_jack; 6362306a36Sopenharmony_ci struct timer_list btn_check_timer; 6462306a36Sopenharmony_ci struct impedance_mapping_table *imp_table; 6562306a36Sopenharmony_ci struct regulator_bulk_data supplies[ARRAY_SIZE(rt5663_supply_names)]; 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci int codec_ver; 6862306a36Sopenharmony_ci int sysclk; 6962306a36Sopenharmony_ci int sysclk_src; 7062306a36Sopenharmony_ci int lrck; 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci int pll_src; 7362306a36Sopenharmony_ci int pll_in; 7462306a36Sopenharmony_ci int pll_out; 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci int jack_type; 7762306a36Sopenharmony_ci}; 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_cistatic const struct reg_sequence rt5663_patch_list[] = { 8062306a36Sopenharmony_ci { 0x002a, 0x8020 }, 8162306a36Sopenharmony_ci { 0x0086, 0x0028 }, 8262306a36Sopenharmony_ci { 0x0100, 0xa020 }, 8362306a36Sopenharmony_ci { 0x0117, 0x0f28 }, 8462306a36Sopenharmony_ci { 0x02fb, 0x8089 }, 8562306a36Sopenharmony_ci}; 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_cistatic const struct reg_default rt5663_v2_reg[] = { 8862306a36Sopenharmony_ci { 0x0000, 0x0000 }, 8962306a36Sopenharmony_ci { 0x0001, 0xc8c8 }, 9062306a36Sopenharmony_ci { 0x0002, 0x8080 }, 9162306a36Sopenharmony_ci { 0x0003, 0x8000 }, 9262306a36Sopenharmony_ci { 0x0004, 0xc80a }, 9362306a36Sopenharmony_ci { 0x0005, 0x0000 }, 9462306a36Sopenharmony_ci { 0x0006, 0x0000 }, 9562306a36Sopenharmony_ci { 0x0007, 0x0000 }, 9662306a36Sopenharmony_ci { 0x000a, 0x0000 }, 9762306a36Sopenharmony_ci { 0x000b, 0x0000 }, 9862306a36Sopenharmony_ci { 0x000c, 0x0000 }, 9962306a36Sopenharmony_ci { 0x000d, 0x0000 }, 10062306a36Sopenharmony_ci { 0x000f, 0x0808 }, 10162306a36Sopenharmony_ci { 0x0010, 0x4000 }, 10262306a36Sopenharmony_ci { 0x0011, 0x0000 }, 10362306a36Sopenharmony_ci { 0x0012, 0x1404 }, 10462306a36Sopenharmony_ci { 0x0013, 0x1000 }, 10562306a36Sopenharmony_ci { 0x0014, 0xa00a }, 10662306a36Sopenharmony_ci { 0x0015, 0x0404 }, 10762306a36Sopenharmony_ci { 0x0016, 0x0404 }, 10862306a36Sopenharmony_ci { 0x0017, 0x0011 }, 10962306a36Sopenharmony_ci { 0x0018, 0xafaf }, 11062306a36Sopenharmony_ci { 0x0019, 0xafaf }, 11162306a36Sopenharmony_ci { 0x001a, 0xafaf }, 11262306a36Sopenharmony_ci { 0x001b, 0x0011 }, 11362306a36Sopenharmony_ci { 0x001c, 0x2f2f }, 11462306a36Sopenharmony_ci { 0x001d, 0x2f2f }, 11562306a36Sopenharmony_ci { 0x001e, 0x2f2f }, 11662306a36Sopenharmony_ci { 0x001f, 0x0000 }, 11762306a36Sopenharmony_ci { 0x0020, 0x0000 }, 11862306a36Sopenharmony_ci { 0x0021, 0x0000 }, 11962306a36Sopenharmony_ci { 0x0022, 0x5757 }, 12062306a36Sopenharmony_ci { 0x0023, 0x0039 }, 12162306a36Sopenharmony_ci { 0x0024, 0x000b }, 12262306a36Sopenharmony_ci { 0x0026, 0xc0c0 }, 12362306a36Sopenharmony_ci { 0x0027, 0xc0c0 }, 12462306a36Sopenharmony_ci { 0x0028, 0xc0c0 }, 12562306a36Sopenharmony_ci { 0x0029, 0x8080 }, 12662306a36Sopenharmony_ci { 0x002a, 0xaaaa }, 12762306a36Sopenharmony_ci { 0x002b, 0xaaaa }, 12862306a36Sopenharmony_ci { 0x002c, 0xaba8 }, 12962306a36Sopenharmony_ci { 0x002d, 0x0000 }, 13062306a36Sopenharmony_ci { 0x002e, 0x0000 }, 13162306a36Sopenharmony_ci { 0x002f, 0x0000 }, 13262306a36Sopenharmony_ci { 0x0030, 0x0000 }, 13362306a36Sopenharmony_ci { 0x0031, 0x5000 }, 13462306a36Sopenharmony_ci { 0x0032, 0x0000 }, 13562306a36Sopenharmony_ci { 0x0033, 0x0000 }, 13662306a36Sopenharmony_ci { 0x0034, 0x0000 }, 13762306a36Sopenharmony_ci { 0x0035, 0x0000 }, 13862306a36Sopenharmony_ci { 0x003a, 0x0000 }, 13962306a36Sopenharmony_ci { 0x003b, 0x0000 }, 14062306a36Sopenharmony_ci { 0x003c, 0x00ff }, 14162306a36Sopenharmony_ci { 0x003d, 0x0000 }, 14262306a36Sopenharmony_ci { 0x003e, 0x00ff }, 14362306a36Sopenharmony_ci { 0x003f, 0x0000 }, 14462306a36Sopenharmony_ci { 0x0040, 0x0000 }, 14562306a36Sopenharmony_ci { 0x0041, 0x00ff }, 14662306a36Sopenharmony_ci { 0x0042, 0x0000 }, 14762306a36Sopenharmony_ci { 0x0043, 0x00ff }, 14862306a36Sopenharmony_ci { 0x0044, 0x0c0c }, 14962306a36Sopenharmony_ci { 0x0049, 0xc00b }, 15062306a36Sopenharmony_ci { 0x004a, 0x0000 }, 15162306a36Sopenharmony_ci { 0x004b, 0x031f }, 15262306a36Sopenharmony_ci { 0x004d, 0x0000 }, 15362306a36Sopenharmony_ci { 0x004e, 0x001f }, 15462306a36Sopenharmony_ci { 0x004f, 0x0000 }, 15562306a36Sopenharmony_ci { 0x0050, 0x001f }, 15662306a36Sopenharmony_ci { 0x0052, 0xf000 }, 15762306a36Sopenharmony_ci { 0x0061, 0x0000 }, 15862306a36Sopenharmony_ci { 0x0062, 0x0000 }, 15962306a36Sopenharmony_ci { 0x0063, 0x003e }, 16062306a36Sopenharmony_ci { 0x0064, 0x0000 }, 16162306a36Sopenharmony_ci { 0x0065, 0x0000 }, 16262306a36Sopenharmony_ci { 0x0066, 0x003f }, 16362306a36Sopenharmony_ci { 0x0067, 0x0000 }, 16462306a36Sopenharmony_ci { 0x006b, 0x0000 }, 16562306a36Sopenharmony_ci { 0x006d, 0xff00 }, 16662306a36Sopenharmony_ci { 0x006e, 0x2808 }, 16762306a36Sopenharmony_ci { 0x006f, 0x000a }, 16862306a36Sopenharmony_ci { 0x0070, 0x8000 }, 16962306a36Sopenharmony_ci { 0x0071, 0x8000 }, 17062306a36Sopenharmony_ci { 0x0072, 0x8000 }, 17162306a36Sopenharmony_ci { 0x0073, 0x7000 }, 17262306a36Sopenharmony_ci { 0x0074, 0x7770 }, 17362306a36Sopenharmony_ci { 0x0075, 0x0002 }, 17462306a36Sopenharmony_ci { 0x0076, 0x0001 }, 17562306a36Sopenharmony_ci { 0x0078, 0x00f0 }, 17662306a36Sopenharmony_ci { 0x0079, 0x0000 }, 17762306a36Sopenharmony_ci { 0x007a, 0x0000 }, 17862306a36Sopenharmony_ci { 0x007b, 0x0000 }, 17962306a36Sopenharmony_ci { 0x007c, 0x0000 }, 18062306a36Sopenharmony_ci { 0x007d, 0x0123 }, 18162306a36Sopenharmony_ci { 0x007e, 0x4500 }, 18262306a36Sopenharmony_ci { 0x007f, 0x8003 }, 18362306a36Sopenharmony_ci { 0x0080, 0x0000 }, 18462306a36Sopenharmony_ci { 0x0081, 0x0000 }, 18562306a36Sopenharmony_ci { 0x0082, 0x0000 }, 18662306a36Sopenharmony_ci { 0x0083, 0x0000 }, 18762306a36Sopenharmony_ci { 0x0084, 0x0000 }, 18862306a36Sopenharmony_ci { 0x0085, 0x0000 }, 18962306a36Sopenharmony_ci { 0x0086, 0x0008 }, 19062306a36Sopenharmony_ci { 0x0087, 0x0000 }, 19162306a36Sopenharmony_ci { 0x0088, 0x0000 }, 19262306a36Sopenharmony_ci { 0x0089, 0x0000 }, 19362306a36Sopenharmony_ci { 0x008a, 0x0000 }, 19462306a36Sopenharmony_ci { 0x008b, 0x0000 }, 19562306a36Sopenharmony_ci { 0x008c, 0x0003 }, 19662306a36Sopenharmony_ci { 0x008e, 0x0060 }, 19762306a36Sopenharmony_ci { 0x008f, 0x1000 }, 19862306a36Sopenharmony_ci { 0x0091, 0x0c26 }, 19962306a36Sopenharmony_ci { 0x0092, 0x0073 }, 20062306a36Sopenharmony_ci { 0x0093, 0x0000 }, 20162306a36Sopenharmony_ci { 0x0094, 0x0080 }, 20262306a36Sopenharmony_ci { 0x0098, 0x0000 }, 20362306a36Sopenharmony_ci { 0x0099, 0x0000 }, 20462306a36Sopenharmony_ci { 0x009a, 0x0007 }, 20562306a36Sopenharmony_ci { 0x009f, 0x0000 }, 20662306a36Sopenharmony_ci { 0x00a0, 0x0000 }, 20762306a36Sopenharmony_ci { 0x00a1, 0x0002 }, 20862306a36Sopenharmony_ci { 0x00a2, 0x0001 }, 20962306a36Sopenharmony_ci { 0x00a3, 0x0002 }, 21062306a36Sopenharmony_ci { 0x00a4, 0x0001 }, 21162306a36Sopenharmony_ci { 0x00ae, 0x2040 }, 21262306a36Sopenharmony_ci { 0x00af, 0x0000 }, 21362306a36Sopenharmony_ci { 0x00b6, 0x0000 }, 21462306a36Sopenharmony_ci { 0x00b7, 0x0000 }, 21562306a36Sopenharmony_ci { 0x00b8, 0x0000 }, 21662306a36Sopenharmony_ci { 0x00b9, 0x0000 }, 21762306a36Sopenharmony_ci { 0x00ba, 0x0002 }, 21862306a36Sopenharmony_ci { 0x00bb, 0x0000 }, 21962306a36Sopenharmony_ci { 0x00be, 0x0000 }, 22062306a36Sopenharmony_ci { 0x00c0, 0x0000 }, 22162306a36Sopenharmony_ci { 0x00c1, 0x0aaa }, 22262306a36Sopenharmony_ci { 0x00c2, 0xaa80 }, 22362306a36Sopenharmony_ci { 0x00c3, 0x0003 }, 22462306a36Sopenharmony_ci { 0x00c4, 0x0000 }, 22562306a36Sopenharmony_ci { 0x00d0, 0x0000 }, 22662306a36Sopenharmony_ci { 0x00d1, 0x2244 }, 22762306a36Sopenharmony_ci { 0x00d2, 0x0000 }, 22862306a36Sopenharmony_ci { 0x00d3, 0x3300 }, 22962306a36Sopenharmony_ci { 0x00d4, 0x2200 }, 23062306a36Sopenharmony_ci { 0x00d9, 0x0809 }, 23162306a36Sopenharmony_ci { 0x00da, 0x0000 }, 23262306a36Sopenharmony_ci { 0x00db, 0x0008 }, 23362306a36Sopenharmony_ci { 0x00dc, 0x00c0 }, 23462306a36Sopenharmony_ci { 0x00dd, 0x6724 }, 23562306a36Sopenharmony_ci { 0x00de, 0x3131 }, 23662306a36Sopenharmony_ci { 0x00df, 0x0008 }, 23762306a36Sopenharmony_ci { 0x00e0, 0x4000 }, 23862306a36Sopenharmony_ci { 0x00e1, 0x3131 }, 23962306a36Sopenharmony_ci { 0x00e2, 0x600c }, 24062306a36Sopenharmony_ci { 0x00ea, 0xb320 }, 24162306a36Sopenharmony_ci { 0x00eb, 0x0000 }, 24262306a36Sopenharmony_ci { 0x00ec, 0xb300 }, 24362306a36Sopenharmony_ci { 0x00ed, 0x0000 }, 24462306a36Sopenharmony_ci { 0x00ee, 0xb320 }, 24562306a36Sopenharmony_ci { 0x00ef, 0x0000 }, 24662306a36Sopenharmony_ci { 0x00f0, 0x0201 }, 24762306a36Sopenharmony_ci { 0x00f1, 0x0ddd }, 24862306a36Sopenharmony_ci { 0x00f2, 0x0ddd }, 24962306a36Sopenharmony_ci { 0x00f6, 0x0000 }, 25062306a36Sopenharmony_ci { 0x00f7, 0x0000 }, 25162306a36Sopenharmony_ci { 0x00f8, 0x0000 }, 25262306a36Sopenharmony_ci { 0x00fa, 0x0000 }, 25362306a36Sopenharmony_ci { 0x00fb, 0x0000 }, 25462306a36Sopenharmony_ci { 0x00fc, 0x0000 }, 25562306a36Sopenharmony_ci { 0x00fd, 0x0000 }, 25662306a36Sopenharmony_ci { 0x00fe, 0x10ec }, 25762306a36Sopenharmony_ci { 0x00ff, 0x6451 }, 25862306a36Sopenharmony_ci { 0x0100, 0xaaaa }, 25962306a36Sopenharmony_ci { 0x0101, 0x000a }, 26062306a36Sopenharmony_ci { 0x010a, 0xaaaa }, 26162306a36Sopenharmony_ci { 0x010b, 0xa0a0 }, 26262306a36Sopenharmony_ci { 0x010c, 0xaeae }, 26362306a36Sopenharmony_ci { 0x010d, 0xaaaa }, 26462306a36Sopenharmony_ci { 0x010e, 0xaaaa }, 26562306a36Sopenharmony_ci { 0x010f, 0xaaaa }, 26662306a36Sopenharmony_ci { 0x0110, 0xe002 }, 26762306a36Sopenharmony_ci { 0x0111, 0xa602 }, 26862306a36Sopenharmony_ci { 0x0112, 0xaaaa }, 26962306a36Sopenharmony_ci { 0x0113, 0x2000 }, 27062306a36Sopenharmony_ci { 0x0117, 0x0f00 }, 27162306a36Sopenharmony_ci { 0x0125, 0x0420 }, 27262306a36Sopenharmony_ci { 0x0132, 0x0000 }, 27362306a36Sopenharmony_ci { 0x0133, 0x0000 }, 27462306a36Sopenharmony_ci { 0x0136, 0x5555 }, 27562306a36Sopenharmony_ci { 0x0137, 0x5540 }, 27662306a36Sopenharmony_ci { 0x0138, 0x3700 }, 27762306a36Sopenharmony_ci { 0x0139, 0x79a1 }, 27862306a36Sopenharmony_ci { 0x013a, 0x2020 }, 27962306a36Sopenharmony_ci { 0x013b, 0x2020 }, 28062306a36Sopenharmony_ci { 0x013c, 0x2005 }, 28162306a36Sopenharmony_ci { 0x013f, 0x0000 }, 28262306a36Sopenharmony_ci { 0x0145, 0x0002 }, 28362306a36Sopenharmony_ci { 0x0146, 0x0000 }, 28462306a36Sopenharmony_ci { 0x0147, 0x0000 }, 28562306a36Sopenharmony_ci { 0x0148, 0x0000 }, 28662306a36Sopenharmony_ci { 0x0160, 0x4ec0 }, 28762306a36Sopenharmony_ci { 0x0161, 0x0080 }, 28862306a36Sopenharmony_ci { 0x0162, 0x0200 }, 28962306a36Sopenharmony_ci { 0x0163, 0x0800 }, 29062306a36Sopenharmony_ci { 0x0164, 0x0000 }, 29162306a36Sopenharmony_ci { 0x0165, 0x0000 }, 29262306a36Sopenharmony_ci { 0x0166, 0x0000 }, 29362306a36Sopenharmony_ci { 0x0167, 0x000f }, 29462306a36Sopenharmony_ci { 0x0168, 0x000f }, 29562306a36Sopenharmony_ci { 0x0170, 0x4e80 }, 29662306a36Sopenharmony_ci { 0x0171, 0x0080 }, 29762306a36Sopenharmony_ci { 0x0172, 0x0200 }, 29862306a36Sopenharmony_ci { 0x0173, 0x0800 }, 29962306a36Sopenharmony_ci { 0x0174, 0x00ff }, 30062306a36Sopenharmony_ci { 0x0175, 0x0000 }, 30162306a36Sopenharmony_ci { 0x0190, 0x4131 }, 30262306a36Sopenharmony_ci { 0x0191, 0x4131 }, 30362306a36Sopenharmony_ci { 0x0192, 0x4131 }, 30462306a36Sopenharmony_ci { 0x0193, 0x4131 }, 30562306a36Sopenharmony_ci { 0x0194, 0x0000 }, 30662306a36Sopenharmony_ci { 0x0195, 0x0000 }, 30762306a36Sopenharmony_ci { 0x0196, 0x0000 }, 30862306a36Sopenharmony_ci { 0x0197, 0x0000 }, 30962306a36Sopenharmony_ci { 0x0198, 0x0000 }, 31062306a36Sopenharmony_ci { 0x0199, 0x0000 }, 31162306a36Sopenharmony_ci { 0x01a0, 0x1e64 }, 31262306a36Sopenharmony_ci { 0x01a1, 0x06a3 }, 31362306a36Sopenharmony_ci { 0x01a2, 0x0000 }, 31462306a36Sopenharmony_ci { 0x01a3, 0x0000 }, 31562306a36Sopenharmony_ci { 0x01a4, 0x0000 }, 31662306a36Sopenharmony_ci { 0x01a5, 0x0000 }, 31762306a36Sopenharmony_ci { 0x01a6, 0x0000 }, 31862306a36Sopenharmony_ci { 0x01a7, 0x0000 }, 31962306a36Sopenharmony_ci { 0x01a8, 0x0000 }, 32062306a36Sopenharmony_ci { 0x01a9, 0x0000 }, 32162306a36Sopenharmony_ci { 0x01aa, 0x0000 }, 32262306a36Sopenharmony_ci { 0x01ab, 0x0000 }, 32362306a36Sopenharmony_ci { 0x01b5, 0x0000 }, 32462306a36Sopenharmony_ci { 0x01b6, 0x01c3 }, 32562306a36Sopenharmony_ci { 0x01b7, 0x02a0 }, 32662306a36Sopenharmony_ci { 0x01b8, 0x03e9 }, 32762306a36Sopenharmony_ci { 0x01b9, 0x1389 }, 32862306a36Sopenharmony_ci { 0x01ba, 0xc351 }, 32962306a36Sopenharmony_ci { 0x01bb, 0x0009 }, 33062306a36Sopenharmony_ci { 0x01bc, 0x0018 }, 33162306a36Sopenharmony_ci { 0x01bd, 0x002a }, 33262306a36Sopenharmony_ci { 0x01be, 0x004c }, 33362306a36Sopenharmony_ci { 0x01bf, 0x0097 }, 33462306a36Sopenharmony_ci { 0x01c0, 0x433d }, 33562306a36Sopenharmony_ci { 0x01c1, 0x0000 }, 33662306a36Sopenharmony_ci { 0x01c2, 0x0000 }, 33762306a36Sopenharmony_ci { 0x01c3, 0x0000 }, 33862306a36Sopenharmony_ci { 0x01c4, 0x0000 }, 33962306a36Sopenharmony_ci { 0x01c5, 0x0000 }, 34062306a36Sopenharmony_ci { 0x01c6, 0x0000 }, 34162306a36Sopenharmony_ci { 0x01c7, 0x0000 }, 34262306a36Sopenharmony_ci { 0x01c8, 0x40af }, 34362306a36Sopenharmony_ci { 0x01c9, 0x0702 }, 34462306a36Sopenharmony_ci { 0x01ca, 0x0000 }, 34562306a36Sopenharmony_ci { 0x01cb, 0x0000 }, 34662306a36Sopenharmony_ci { 0x01cc, 0x5757 }, 34762306a36Sopenharmony_ci { 0x01cd, 0x5757 }, 34862306a36Sopenharmony_ci { 0x01ce, 0x5757 }, 34962306a36Sopenharmony_ci { 0x01cf, 0x5757 }, 35062306a36Sopenharmony_ci { 0x01d0, 0x5757 }, 35162306a36Sopenharmony_ci { 0x01d1, 0x5757 }, 35262306a36Sopenharmony_ci { 0x01d2, 0x5757 }, 35362306a36Sopenharmony_ci { 0x01d3, 0x5757 }, 35462306a36Sopenharmony_ci { 0x01d4, 0x5757 }, 35562306a36Sopenharmony_ci { 0x01d5, 0x5757 }, 35662306a36Sopenharmony_ci { 0x01d6, 0x003c }, 35762306a36Sopenharmony_ci { 0x01da, 0x0000 }, 35862306a36Sopenharmony_ci { 0x01db, 0x0000 }, 35962306a36Sopenharmony_ci { 0x01dc, 0x0000 }, 36062306a36Sopenharmony_ci { 0x01de, 0x7c00 }, 36162306a36Sopenharmony_ci { 0x01df, 0x0320 }, 36262306a36Sopenharmony_ci { 0x01e0, 0x06a1 }, 36362306a36Sopenharmony_ci { 0x01e1, 0x0000 }, 36462306a36Sopenharmony_ci { 0x01e2, 0x0000 }, 36562306a36Sopenharmony_ci { 0x01e3, 0x0000 }, 36662306a36Sopenharmony_ci { 0x01e4, 0x0000 }, 36762306a36Sopenharmony_ci { 0x01e5, 0x0000 }, 36862306a36Sopenharmony_ci { 0x01e6, 0x0001 }, 36962306a36Sopenharmony_ci { 0x01e7, 0x0000 }, 37062306a36Sopenharmony_ci { 0x01e8, 0x0000 }, 37162306a36Sopenharmony_ci { 0x01ea, 0x0000 }, 37262306a36Sopenharmony_ci { 0x01eb, 0x0000 }, 37362306a36Sopenharmony_ci { 0x01ec, 0x0000 }, 37462306a36Sopenharmony_ci { 0x01ed, 0x0000 }, 37562306a36Sopenharmony_ci { 0x01ee, 0x0000 }, 37662306a36Sopenharmony_ci { 0x01ef, 0x0000 }, 37762306a36Sopenharmony_ci { 0x01f0, 0x0000 }, 37862306a36Sopenharmony_ci { 0x01f1, 0x0000 }, 37962306a36Sopenharmony_ci { 0x01f2, 0x0000 }, 38062306a36Sopenharmony_ci { 0x01f3, 0x0000 }, 38162306a36Sopenharmony_ci { 0x01f4, 0x0000 }, 38262306a36Sopenharmony_ci { 0x0200, 0x0000 }, 38362306a36Sopenharmony_ci { 0x0201, 0x0000 }, 38462306a36Sopenharmony_ci { 0x0202, 0x0000 }, 38562306a36Sopenharmony_ci { 0x0203, 0x0000 }, 38662306a36Sopenharmony_ci { 0x0204, 0x0000 }, 38762306a36Sopenharmony_ci { 0x0205, 0x0000 }, 38862306a36Sopenharmony_ci { 0x0206, 0x0000 }, 38962306a36Sopenharmony_ci { 0x0207, 0x0000 }, 39062306a36Sopenharmony_ci { 0x0208, 0x0000 }, 39162306a36Sopenharmony_ci { 0x0210, 0x60b1 }, 39262306a36Sopenharmony_ci { 0x0211, 0xa000 }, 39362306a36Sopenharmony_ci { 0x0212, 0x024c }, 39462306a36Sopenharmony_ci { 0x0213, 0xf7ff }, 39562306a36Sopenharmony_ci { 0x0214, 0x024c }, 39662306a36Sopenharmony_ci { 0x0215, 0x0102 }, 39762306a36Sopenharmony_ci { 0x0216, 0x00a3 }, 39862306a36Sopenharmony_ci { 0x0217, 0x0048 }, 39962306a36Sopenharmony_ci { 0x0218, 0x92c0 }, 40062306a36Sopenharmony_ci { 0x0219, 0x0000 }, 40162306a36Sopenharmony_ci { 0x021a, 0x00c8 }, 40262306a36Sopenharmony_ci { 0x021b, 0x0020 }, 40362306a36Sopenharmony_ci { 0x02fa, 0x0000 }, 40462306a36Sopenharmony_ci { 0x02fb, 0x0000 }, 40562306a36Sopenharmony_ci { 0x02fc, 0x0000 }, 40662306a36Sopenharmony_ci { 0x02ff, 0x0110 }, 40762306a36Sopenharmony_ci { 0x0300, 0x001f }, 40862306a36Sopenharmony_ci { 0x0301, 0x032c }, 40962306a36Sopenharmony_ci { 0x0302, 0x5f21 }, 41062306a36Sopenharmony_ci { 0x0303, 0x4000 }, 41162306a36Sopenharmony_ci { 0x0304, 0x4000 }, 41262306a36Sopenharmony_ci { 0x0305, 0x06d5 }, 41362306a36Sopenharmony_ci { 0x0306, 0x8000 }, 41462306a36Sopenharmony_ci { 0x0307, 0x0700 }, 41562306a36Sopenharmony_ci { 0x0310, 0x4560 }, 41662306a36Sopenharmony_ci { 0x0311, 0xa4a8 }, 41762306a36Sopenharmony_ci { 0x0312, 0x7418 }, 41862306a36Sopenharmony_ci { 0x0313, 0x0000 }, 41962306a36Sopenharmony_ci { 0x0314, 0x0006 }, 42062306a36Sopenharmony_ci { 0x0315, 0xffff }, 42162306a36Sopenharmony_ci { 0x0316, 0xc400 }, 42262306a36Sopenharmony_ci { 0x0317, 0x0000 }, 42362306a36Sopenharmony_ci { 0x0330, 0x00a6 }, 42462306a36Sopenharmony_ci { 0x0331, 0x04c3 }, 42562306a36Sopenharmony_ci { 0x0332, 0x27c8 }, 42662306a36Sopenharmony_ci { 0x0333, 0xbf50 }, 42762306a36Sopenharmony_ci { 0x0334, 0x0045 }, 42862306a36Sopenharmony_ci { 0x0335, 0x0007 }, 42962306a36Sopenharmony_ci { 0x0336, 0x7418 }, 43062306a36Sopenharmony_ci { 0x0337, 0x0501 }, 43162306a36Sopenharmony_ci { 0x0338, 0x0000 }, 43262306a36Sopenharmony_ci { 0x0339, 0x0010 }, 43362306a36Sopenharmony_ci { 0x033a, 0x1010 }, 43462306a36Sopenharmony_ci { 0x03c0, 0x7e00 }, 43562306a36Sopenharmony_ci { 0x03c1, 0x8000 }, 43662306a36Sopenharmony_ci { 0x03c2, 0x8000 }, 43762306a36Sopenharmony_ci { 0x03c3, 0x8000 }, 43862306a36Sopenharmony_ci { 0x03c4, 0x8000 }, 43962306a36Sopenharmony_ci { 0x03c5, 0x8000 }, 44062306a36Sopenharmony_ci { 0x03c6, 0x8000 }, 44162306a36Sopenharmony_ci { 0x03c7, 0x8000 }, 44262306a36Sopenharmony_ci { 0x03c8, 0x8000 }, 44362306a36Sopenharmony_ci { 0x03c9, 0x8000 }, 44462306a36Sopenharmony_ci { 0x03ca, 0x8000 }, 44562306a36Sopenharmony_ci { 0x03cb, 0x8000 }, 44662306a36Sopenharmony_ci { 0x03cc, 0x8000 }, 44762306a36Sopenharmony_ci { 0x03d0, 0x0000 }, 44862306a36Sopenharmony_ci { 0x03d1, 0x0000 }, 44962306a36Sopenharmony_ci { 0x03d2, 0x0000 }, 45062306a36Sopenharmony_ci { 0x03d3, 0x0000 }, 45162306a36Sopenharmony_ci { 0x03d4, 0x2000 }, 45262306a36Sopenharmony_ci { 0x03d5, 0x2000 }, 45362306a36Sopenharmony_ci { 0x03d6, 0x0000 }, 45462306a36Sopenharmony_ci { 0x03d7, 0x0000 }, 45562306a36Sopenharmony_ci { 0x03d8, 0x2000 }, 45662306a36Sopenharmony_ci { 0x03d9, 0x2000 }, 45762306a36Sopenharmony_ci { 0x03da, 0x2000 }, 45862306a36Sopenharmony_ci { 0x03db, 0x2000 }, 45962306a36Sopenharmony_ci { 0x03dc, 0x0000 }, 46062306a36Sopenharmony_ci { 0x03dd, 0x0000 }, 46162306a36Sopenharmony_ci { 0x03de, 0x0000 }, 46262306a36Sopenharmony_ci { 0x03df, 0x2000 }, 46362306a36Sopenharmony_ci { 0x03e0, 0x0000 }, 46462306a36Sopenharmony_ci { 0x03e1, 0x0000 }, 46562306a36Sopenharmony_ci { 0x03e2, 0x0000 }, 46662306a36Sopenharmony_ci { 0x03e3, 0x0000 }, 46762306a36Sopenharmony_ci { 0x03e4, 0x0000 }, 46862306a36Sopenharmony_ci { 0x03e5, 0x0000 }, 46962306a36Sopenharmony_ci { 0x03e6, 0x0000 }, 47062306a36Sopenharmony_ci { 0x03e7, 0x0000 }, 47162306a36Sopenharmony_ci { 0x03e8, 0x0000 }, 47262306a36Sopenharmony_ci { 0x03e9, 0x0000 }, 47362306a36Sopenharmony_ci { 0x03ea, 0x0000 }, 47462306a36Sopenharmony_ci { 0x03eb, 0x0000 }, 47562306a36Sopenharmony_ci { 0x03ec, 0x0000 }, 47662306a36Sopenharmony_ci { 0x03ed, 0x0000 }, 47762306a36Sopenharmony_ci { 0x03ee, 0x0000 }, 47862306a36Sopenharmony_ci { 0x03ef, 0x0000 }, 47962306a36Sopenharmony_ci { 0x03f0, 0x0800 }, 48062306a36Sopenharmony_ci { 0x03f1, 0x0800 }, 48162306a36Sopenharmony_ci { 0x03f2, 0x0800 }, 48262306a36Sopenharmony_ci { 0x03f3, 0x0800 }, 48362306a36Sopenharmony_ci { 0x03fe, 0x0000 }, 48462306a36Sopenharmony_ci { 0x03ff, 0x0000 }, 48562306a36Sopenharmony_ci { 0x07f0, 0x0000 }, 48662306a36Sopenharmony_ci { 0x07fa, 0x0000 }, 48762306a36Sopenharmony_ci}; 48862306a36Sopenharmony_ci 48962306a36Sopenharmony_cistatic const struct reg_default rt5663_reg[] = { 49062306a36Sopenharmony_ci { 0x0000, 0x0000 }, 49162306a36Sopenharmony_ci { 0x0002, 0x0008 }, 49262306a36Sopenharmony_ci { 0x0005, 0x1000 }, 49362306a36Sopenharmony_ci { 0x0006, 0x1000 }, 49462306a36Sopenharmony_ci { 0x000a, 0x0000 }, 49562306a36Sopenharmony_ci { 0x0010, 0x000f }, 49662306a36Sopenharmony_ci { 0x0015, 0x42f1 }, 49762306a36Sopenharmony_ci { 0x0016, 0x0000 }, 49862306a36Sopenharmony_ci { 0x0018, 0x000b }, 49962306a36Sopenharmony_ci { 0x0019, 0xafaf }, 50062306a36Sopenharmony_ci { 0x001c, 0x2f2f }, 50162306a36Sopenharmony_ci { 0x001f, 0x0000 }, 50262306a36Sopenharmony_ci { 0x0022, 0x5757 }, 50362306a36Sopenharmony_ci { 0x0023, 0x0039 }, 50462306a36Sopenharmony_ci { 0x0026, 0xc0c0 }, 50562306a36Sopenharmony_ci { 0x0029, 0x8080 }, 50662306a36Sopenharmony_ci { 0x002a, 0x8020 }, 50762306a36Sopenharmony_ci { 0x002c, 0x000c }, 50862306a36Sopenharmony_ci { 0x002d, 0x0000 }, 50962306a36Sopenharmony_ci { 0x0040, 0x0808 }, 51062306a36Sopenharmony_ci { 0x0061, 0x0000 }, 51162306a36Sopenharmony_ci { 0x0062, 0x0000 }, 51262306a36Sopenharmony_ci { 0x0063, 0x003e }, 51362306a36Sopenharmony_ci { 0x0064, 0x0000 }, 51462306a36Sopenharmony_ci { 0x0065, 0x0000 }, 51562306a36Sopenharmony_ci { 0x0066, 0x0000 }, 51662306a36Sopenharmony_ci { 0x006b, 0x0000 }, 51762306a36Sopenharmony_ci { 0x006e, 0x0000 }, 51862306a36Sopenharmony_ci { 0x006f, 0x0000 }, 51962306a36Sopenharmony_ci { 0x0070, 0x8020 }, 52062306a36Sopenharmony_ci { 0x0073, 0x1000 }, 52162306a36Sopenharmony_ci { 0x0074, 0xe400 }, 52262306a36Sopenharmony_ci { 0x0075, 0x0002 }, 52362306a36Sopenharmony_ci { 0x0076, 0x0001 }, 52462306a36Sopenharmony_ci { 0x0077, 0x00f0 }, 52562306a36Sopenharmony_ci { 0x0078, 0x0000 }, 52662306a36Sopenharmony_ci { 0x0079, 0x0000 }, 52762306a36Sopenharmony_ci { 0x007a, 0x0123 }, 52862306a36Sopenharmony_ci { 0x007b, 0x8003 }, 52962306a36Sopenharmony_ci { 0x0080, 0x0000 }, 53062306a36Sopenharmony_ci { 0x0081, 0x0000 }, 53162306a36Sopenharmony_ci { 0x0082, 0x0000 }, 53262306a36Sopenharmony_ci { 0x0083, 0x0000 }, 53362306a36Sopenharmony_ci { 0x0084, 0x0000 }, 53462306a36Sopenharmony_ci { 0x0086, 0x0028 }, 53562306a36Sopenharmony_ci { 0x0087, 0x0000 }, 53662306a36Sopenharmony_ci { 0x008a, 0x0000 }, 53762306a36Sopenharmony_ci { 0x008b, 0x0000 }, 53862306a36Sopenharmony_ci { 0x008c, 0x0003 }, 53962306a36Sopenharmony_ci { 0x008e, 0x0008 }, 54062306a36Sopenharmony_ci { 0x008f, 0x1000 }, 54162306a36Sopenharmony_ci { 0x0090, 0x0646 }, 54262306a36Sopenharmony_ci { 0x0091, 0x0e3e }, 54362306a36Sopenharmony_ci { 0x0092, 0x1071 }, 54462306a36Sopenharmony_ci { 0x0093, 0x0000 }, 54562306a36Sopenharmony_ci { 0x0094, 0x0080 }, 54662306a36Sopenharmony_ci { 0x0097, 0x0000 }, 54762306a36Sopenharmony_ci { 0x0098, 0x0000 }, 54862306a36Sopenharmony_ci { 0x009a, 0x0000 }, 54962306a36Sopenharmony_ci { 0x009f, 0x0000 }, 55062306a36Sopenharmony_ci { 0x00ae, 0x6000 }, 55162306a36Sopenharmony_ci { 0x00af, 0x0000 }, 55262306a36Sopenharmony_ci { 0x00b6, 0x0000 }, 55362306a36Sopenharmony_ci { 0x00b7, 0x0000 }, 55462306a36Sopenharmony_ci { 0x00b8, 0x0000 }, 55562306a36Sopenharmony_ci { 0x00ba, 0x0000 }, 55662306a36Sopenharmony_ci { 0x00bb, 0x0000 }, 55762306a36Sopenharmony_ci { 0x00be, 0x0000 }, 55862306a36Sopenharmony_ci { 0x00bf, 0x0000 }, 55962306a36Sopenharmony_ci { 0x00c0, 0x0000 }, 56062306a36Sopenharmony_ci { 0x00c1, 0x0000 }, 56162306a36Sopenharmony_ci { 0x00c5, 0x0000 }, 56262306a36Sopenharmony_ci { 0x00cb, 0xa02f }, 56362306a36Sopenharmony_ci { 0x00cc, 0x0000 }, 56462306a36Sopenharmony_ci { 0x00cd, 0x0e02 }, 56562306a36Sopenharmony_ci { 0x00d9, 0x08f9 }, 56662306a36Sopenharmony_ci { 0x00db, 0x0008 }, 56762306a36Sopenharmony_ci { 0x00dc, 0x00c0 }, 56862306a36Sopenharmony_ci { 0x00dd, 0x6729 }, 56962306a36Sopenharmony_ci { 0x00de, 0x3131 }, 57062306a36Sopenharmony_ci { 0x00df, 0x0008 }, 57162306a36Sopenharmony_ci { 0x00e0, 0x4000 }, 57262306a36Sopenharmony_ci { 0x00e1, 0x3131 }, 57362306a36Sopenharmony_ci { 0x00e2, 0x0043 }, 57462306a36Sopenharmony_ci { 0x00e4, 0x400b }, 57562306a36Sopenharmony_ci { 0x00e5, 0x8031 }, 57662306a36Sopenharmony_ci { 0x00e6, 0x3080 }, 57762306a36Sopenharmony_ci { 0x00e7, 0x4100 }, 57862306a36Sopenharmony_ci { 0x00e8, 0x1400 }, 57962306a36Sopenharmony_ci { 0x00e9, 0xe00a }, 58062306a36Sopenharmony_ci { 0x00ea, 0x0404 }, 58162306a36Sopenharmony_ci { 0x00eb, 0x0404 }, 58262306a36Sopenharmony_ci { 0x00ec, 0xb320 }, 58362306a36Sopenharmony_ci { 0x00ed, 0x0000 }, 58462306a36Sopenharmony_ci { 0x00f4, 0x0000 }, 58562306a36Sopenharmony_ci { 0x00f6, 0x0000 }, 58662306a36Sopenharmony_ci { 0x00f8, 0x0000 }, 58762306a36Sopenharmony_ci { 0x00fa, 0x8000 }, 58862306a36Sopenharmony_ci { 0x00fd, 0x0001 }, 58962306a36Sopenharmony_ci { 0x00fe, 0x10ec }, 59062306a36Sopenharmony_ci { 0x00ff, 0x6406 }, 59162306a36Sopenharmony_ci { 0x0100, 0xa020 }, 59262306a36Sopenharmony_ci { 0x0108, 0x4444 }, 59362306a36Sopenharmony_ci { 0x0109, 0x4444 }, 59462306a36Sopenharmony_ci { 0x010a, 0xaaaa }, 59562306a36Sopenharmony_ci { 0x010b, 0x00a0 }, 59662306a36Sopenharmony_ci { 0x010c, 0x8aaa }, 59762306a36Sopenharmony_ci { 0x010d, 0xaaaa }, 59862306a36Sopenharmony_ci { 0x010e, 0x2aaa }, 59962306a36Sopenharmony_ci { 0x010f, 0x002a }, 60062306a36Sopenharmony_ci { 0x0110, 0xa0a4 }, 60162306a36Sopenharmony_ci { 0x0111, 0x4602 }, 60262306a36Sopenharmony_ci { 0x0112, 0x0101 }, 60362306a36Sopenharmony_ci { 0x0113, 0x2000 }, 60462306a36Sopenharmony_ci { 0x0114, 0x0000 }, 60562306a36Sopenharmony_ci { 0x0116, 0x0000 }, 60662306a36Sopenharmony_ci { 0x0117, 0x0f28 }, 60762306a36Sopenharmony_ci { 0x0118, 0x0006 }, 60862306a36Sopenharmony_ci { 0x0125, 0x2424 }, 60962306a36Sopenharmony_ci { 0x0126, 0x5550 }, 61062306a36Sopenharmony_ci { 0x0127, 0x0400 }, 61162306a36Sopenharmony_ci { 0x0128, 0x7711 }, 61262306a36Sopenharmony_ci { 0x0132, 0x0004 }, 61362306a36Sopenharmony_ci { 0x0137, 0x5441 }, 61462306a36Sopenharmony_ci { 0x0139, 0x79a1 }, 61562306a36Sopenharmony_ci { 0x013a, 0x30c0 }, 61662306a36Sopenharmony_ci { 0x013b, 0x2000 }, 61762306a36Sopenharmony_ci { 0x013c, 0x2005 }, 61862306a36Sopenharmony_ci { 0x013d, 0x30c0 }, 61962306a36Sopenharmony_ci { 0x013e, 0x0000 }, 62062306a36Sopenharmony_ci { 0x0140, 0x3700 }, 62162306a36Sopenharmony_ci { 0x0141, 0x1f00 }, 62262306a36Sopenharmony_ci { 0x0144, 0x0000 }, 62362306a36Sopenharmony_ci { 0x0145, 0x0002 }, 62462306a36Sopenharmony_ci { 0x0146, 0x0000 }, 62562306a36Sopenharmony_ci { 0x0160, 0x0e80 }, 62662306a36Sopenharmony_ci { 0x0161, 0x0080 }, 62762306a36Sopenharmony_ci { 0x0162, 0x0200 }, 62862306a36Sopenharmony_ci { 0x0163, 0x0800 }, 62962306a36Sopenharmony_ci { 0x0164, 0x0000 }, 63062306a36Sopenharmony_ci { 0x0165, 0x0000 }, 63162306a36Sopenharmony_ci { 0x0166, 0x0000 }, 63262306a36Sopenharmony_ci { 0x0167, 0x1417 }, 63362306a36Sopenharmony_ci { 0x0168, 0x0017 }, 63462306a36Sopenharmony_ci { 0x0169, 0x0017 }, 63562306a36Sopenharmony_ci { 0x0180, 0x2000 }, 63662306a36Sopenharmony_ci { 0x0181, 0x0000 }, 63762306a36Sopenharmony_ci { 0x0182, 0x0000 }, 63862306a36Sopenharmony_ci { 0x0183, 0x2000 }, 63962306a36Sopenharmony_ci { 0x0184, 0x0000 }, 64062306a36Sopenharmony_ci { 0x0185, 0x0000 }, 64162306a36Sopenharmony_ci { 0x01b0, 0x4b30 }, 64262306a36Sopenharmony_ci { 0x01b1, 0x0000 }, 64362306a36Sopenharmony_ci { 0x01b2, 0xd870 }, 64462306a36Sopenharmony_ci { 0x01b3, 0x0000 }, 64562306a36Sopenharmony_ci { 0x01b4, 0x0030 }, 64662306a36Sopenharmony_ci { 0x01b5, 0x5757 }, 64762306a36Sopenharmony_ci { 0x01b6, 0x5757 }, 64862306a36Sopenharmony_ci { 0x01b7, 0x5757 }, 64962306a36Sopenharmony_ci { 0x01b8, 0x5757 }, 65062306a36Sopenharmony_ci { 0x01c0, 0x433d }, 65162306a36Sopenharmony_ci { 0x01c1, 0x0540 }, 65262306a36Sopenharmony_ci { 0x01c2, 0x0000 }, 65362306a36Sopenharmony_ci { 0x01c3, 0x0000 }, 65462306a36Sopenharmony_ci { 0x01c4, 0x0000 }, 65562306a36Sopenharmony_ci { 0x01c5, 0x0009 }, 65662306a36Sopenharmony_ci { 0x01c6, 0x0018 }, 65762306a36Sopenharmony_ci { 0x01c7, 0x002a }, 65862306a36Sopenharmony_ci { 0x01c8, 0x004c }, 65962306a36Sopenharmony_ci { 0x01c9, 0x0097 }, 66062306a36Sopenharmony_ci { 0x01ca, 0x01c3 }, 66162306a36Sopenharmony_ci { 0x01cb, 0x03e9 }, 66262306a36Sopenharmony_ci { 0x01cc, 0x1389 }, 66362306a36Sopenharmony_ci { 0x01cd, 0xc351 }, 66462306a36Sopenharmony_ci { 0x01ce, 0x0000 }, 66562306a36Sopenharmony_ci { 0x01cf, 0x0000 }, 66662306a36Sopenharmony_ci { 0x01d0, 0x0000 }, 66762306a36Sopenharmony_ci { 0x01d1, 0x0000 }, 66862306a36Sopenharmony_ci { 0x01d2, 0x0000 }, 66962306a36Sopenharmony_ci { 0x01d3, 0x003c }, 67062306a36Sopenharmony_ci { 0x01d4, 0x5757 }, 67162306a36Sopenharmony_ci { 0x01d5, 0x5757 }, 67262306a36Sopenharmony_ci { 0x01d6, 0x5757 }, 67362306a36Sopenharmony_ci { 0x01d7, 0x5757 }, 67462306a36Sopenharmony_ci { 0x01d8, 0x5757 }, 67562306a36Sopenharmony_ci { 0x01d9, 0x5757 }, 67662306a36Sopenharmony_ci { 0x01da, 0x0000 }, 67762306a36Sopenharmony_ci { 0x01db, 0x0000 }, 67862306a36Sopenharmony_ci { 0x01dd, 0x0009 }, 67962306a36Sopenharmony_ci { 0x01de, 0x7f00 }, 68062306a36Sopenharmony_ci { 0x01df, 0x00c8 }, 68162306a36Sopenharmony_ci { 0x01e0, 0x0691 }, 68262306a36Sopenharmony_ci { 0x01e1, 0x0000 }, 68362306a36Sopenharmony_ci { 0x01e2, 0x0000 }, 68462306a36Sopenharmony_ci { 0x01e3, 0x0000 }, 68562306a36Sopenharmony_ci { 0x01e4, 0x0000 }, 68662306a36Sopenharmony_ci { 0x01e5, 0x0040 }, 68762306a36Sopenharmony_ci { 0x01e6, 0x0000 }, 68862306a36Sopenharmony_ci { 0x01e7, 0x0000 }, 68962306a36Sopenharmony_ci { 0x01e8, 0x0000 }, 69062306a36Sopenharmony_ci { 0x01ea, 0x0000 }, 69162306a36Sopenharmony_ci { 0x01eb, 0x0000 }, 69262306a36Sopenharmony_ci { 0x01ec, 0x0000 }, 69362306a36Sopenharmony_ci { 0x01ed, 0x0000 }, 69462306a36Sopenharmony_ci { 0x01ee, 0x0000 }, 69562306a36Sopenharmony_ci { 0x01ef, 0x0000 }, 69662306a36Sopenharmony_ci { 0x01f0, 0x0000 }, 69762306a36Sopenharmony_ci { 0x01f1, 0x0000 }, 69862306a36Sopenharmony_ci { 0x01f2, 0x0000 }, 69962306a36Sopenharmony_ci { 0x0200, 0x0000 }, 70062306a36Sopenharmony_ci { 0x0201, 0x2244 }, 70162306a36Sopenharmony_ci { 0x0202, 0xaaaa }, 70262306a36Sopenharmony_ci { 0x0250, 0x8010 }, 70362306a36Sopenharmony_ci { 0x0251, 0x0000 }, 70462306a36Sopenharmony_ci { 0x0252, 0x028a }, 70562306a36Sopenharmony_ci { 0x02fa, 0x0000 }, 70662306a36Sopenharmony_ci { 0x02fb, 0x8089 }, 70762306a36Sopenharmony_ci { 0x02fc, 0x0300 }, 70862306a36Sopenharmony_ci { 0x0300, 0x0000 }, 70962306a36Sopenharmony_ci { 0x03d0, 0x0000 }, 71062306a36Sopenharmony_ci { 0x03d1, 0x0000 }, 71162306a36Sopenharmony_ci { 0x03d2, 0x0000 }, 71262306a36Sopenharmony_ci { 0x03d3, 0x0000 }, 71362306a36Sopenharmony_ci { 0x03d4, 0x2000 }, 71462306a36Sopenharmony_ci { 0x03d5, 0x2000 }, 71562306a36Sopenharmony_ci { 0x03d6, 0x0000 }, 71662306a36Sopenharmony_ci { 0x03d7, 0x0000 }, 71762306a36Sopenharmony_ci { 0x03d8, 0x2000 }, 71862306a36Sopenharmony_ci { 0x03d9, 0x2000 }, 71962306a36Sopenharmony_ci { 0x03da, 0x2000 }, 72062306a36Sopenharmony_ci { 0x03db, 0x2000 }, 72162306a36Sopenharmony_ci { 0x03dc, 0x0000 }, 72262306a36Sopenharmony_ci { 0x03dd, 0x0000 }, 72362306a36Sopenharmony_ci { 0x03de, 0x0000 }, 72462306a36Sopenharmony_ci { 0x03df, 0x2000 }, 72562306a36Sopenharmony_ci { 0x03e0, 0x0000 }, 72662306a36Sopenharmony_ci { 0x03e1, 0x0000 }, 72762306a36Sopenharmony_ci { 0x03e2, 0x0000 }, 72862306a36Sopenharmony_ci { 0x03e3, 0x0000 }, 72962306a36Sopenharmony_ci { 0x03e4, 0x0000 }, 73062306a36Sopenharmony_ci { 0x03e5, 0x0000 }, 73162306a36Sopenharmony_ci { 0x03e6, 0x0000 }, 73262306a36Sopenharmony_ci { 0x03e7, 0x0000 }, 73362306a36Sopenharmony_ci { 0x03e8, 0x0000 }, 73462306a36Sopenharmony_ci { 0x03e9, 0x0000 }, 73562306a36Sopenharmony_ci { 0x03ea, 0x0000 }, 73662306a36Sopenharmony_ci { 0x03eb, 0x0000 }, 73762306a36Sopenharmony_ci { 0x03ec, 0x0000 }, 73862306a36Sopenharmony_ci { 0x03ed, 0x0000 }, 73962306a36Sopenharmony_ci { 0x03ee, 0x0000 }, 74062306a36Sopenharmony_ci { 0x03ef, 0x0000 }, 74162306a36Sopenharmony_ci { 0x03f0, 0x0800 }, 74262306a36Sopenharmony_ci { 0x03f1, 0x0800 }, 74362306a36Sopenharmony_ci { 0x03f2, 0x0800 }, 74462306a36Sopenharmony_ci { 0x03f3, 0x0800 }, 74562306a36Sopenharmony_ci}; 74662306a36Sopenharmony_ci 74762306a36Sopenharmony_cistatic bool rt5663_volatile_register(struct device *dev, unsigned int reg) 74862306a36Sopenharmony_ci{ 74962306a36Sopenharmony_ci switch (reg) { 75062306a36Sopenharmony_ci case RT5663_RESET: 75162306a36Sopenharmony_ci case RT5663_SIL_DET_CTL: 75262306a36Sopenharmony_ci case RT5663_HP_IMP_GAIN_2: 75362306a36Sopenharmony_ci case RT5663_AD_DA_MIXER: 75462306a36Sopenharmony_ci case RT5663_FRAC_DIV_2: 75562306a36Sopenharmony_ci case RT5663_MICBIAS_1: 75662306a36Sopenharmony_ci case RT5663_ASRC_11_2: 75762306a36Sopenharmony_ci case RT5663_ADC_EQ_1: 75862306a36Sopenharmony_ci case RT5663_INT_ST_1: 75962306a36Sopenharmony_ci case RT5663_INT_ST_2: 76062306a36Sopenharmony_ci case RT5663_GPIO_STA1: 76162306a36Sopenharmony_ci case RT5663_SIN_GEN_1: 76262306a36Sopenharmony_ci case RT5663_IL_CMD_1: 76362306a36Sopenharmony_ci case RT5663_IL_CMD_5: 76462306a36Sopenharmony_ci case RT5663_IL_CMD_PWRSAV1: 76562306a36Sopenharmony_ci case RT5663_EM_JACK_TYPE_1: 76662306a36Sopenharmony_ci case RT5663_EM_JACK_TYPE_2: 76762306a36Sopenharmony_ci case RT5663_EM_JACK_TYPE_3: 76862306a36Sopenharmony_ci case RT5663_JD_CTRL2: 76962306a36Sopenharmony_ci case RT5663_VENDOR_ID: 77062306a36Sopenharmony_ci case RT5663_VENDOR_ID_1: 77162306a36Sopenharmony_ci case RT5663_VENDOR_ID_2: 77262306a36Sopenharmony_ci case RT5663_PLL_INT_REG: 77362306a36Sopenharmony_ci case RT5663_SOFT_RAMP: 77462306a36Sopenharmony_ci case RT5663_STO_DRE_1: 77562306a36Sopenharmony_ci case RT5663_STO_DRE_5: 77662306a36Sopenharmony_ci case RT5663_STO_DRE_6: 77762306a36Sopenharmony_ci case RT5663_STO_DRE_7: 77862306a36Sopenharmony_ci case RT5663_MIC_DECRO_1: 77962306a36Sopenharmony_ci case RT5663_MIC_DECRO_4: 78062306a36Sopenharmony_ci case RT5663_HP_IMP_SEN_1: 78162306a36Sopenharmony_ci case RT5663_HP_IMP_SEN_3: 78262306a36Sopenharmony_ci case RT5663_HP_IMP_SEN_4: 78362306a36Sopenharmony_ci case RT5663_HP_IMP_SEN_5: 78462306a36Sopenharmony_ci case RT5663_HP_CALIB_1_1: 78562306a36Sopenharmony_ci case RT5663_HP_CALIB_9: 78662306a36Sopenharmony_ci case RT5663_HP_CALIB_ST1: 78762306a36Sopenharmony_ci case RT5663_HP_CALIB_ST2: 78862306a36Sopenharmony_ci case RT5663_HP_CALIB_ST3: 78962306a36Sopenharmony_ci case RT5663_HP_CALIB_ST4: 79062306a36Sopenharmony_ci case RT5663_HP_CALIB_ST5: 79162306a36Sopenharmony_ci case RT5663_HP_CALIB_ST6: 79262306a36Sopenharmony_ci case RT5663_HP_CALIB_ST7: 79362306a36Sopenharmony_ci case RT5663_HP_CALIB_ST8: 79462306a36Sopenharmony_ci case RT5663_HP_CALIB_ST9: 79562306a36Sopenharmony_ci case RT5663_ANA_JD: 79662306a36Sopenharmony_ci return true; 79762306a36Sopenharmony_ci default: 79862306a36Sopenharmony_ci return false; 79962306a36Sopenharmony_ci } 80062306a36Sopenharmony_ci} 80162306a36Sopenharmony_ci 80262306a36Sopenharmony_cistatic bool rt5663_readable_register(struct device *dev, unsigned int reg) 80362306a36Sopenharmony_ci{ 80462306a36Sopenharmony_ci switch (reg) { 80562306a36Sopenharmony_ci case RT5663_RESET: 80662306a36Sopenharmony_ci case RT5663_HP_OUT_EN: 80762306a36Sopenharmony_ci case RT5663_HP_LCH_DRE: 80862306a36Sopenharmony_ci case RT5663_HP_RCH_DRE: 80962306a36Sopenharmony_ci case RT5663_CALIB_BST: 81062306a36Sopenharmony_ci case RT5663_RECMIX: 81162306a36Sopenharmony_ci case RT5663_SIL_DET_CTL: 81262306a36Sopenharmony_ci case RT5663_PWR_SAV_SILDET: 81362306a36Sopenharmony_ci case RT5663_SIDETONE_CTL: 81462306a36Sopenharmony_ci case RT5663_STO1_DAC_DIG_VOL: 81562306a36Sopenharmony_ci case RT5663_STO1_ADC_DIG_VOL: 81662306a36Sopenharmony_ci case RT5663_STO1_BOOST: 81762306a36Sopenharmony_ci case RT5663_HP_IMP_GAIN_1: 81862306a36Sopenharmony_ci case RT5663_HP_IMP_GAIN_2: 81962306a36Sopenharmony_ci case RT5663_STO1_ADC_MIXER: 82062306a36Sopenharmony_ci case RT5663_AD_DA_MIXER: 82162306a36Sopenharmony_ci case RT5663_STO_DAC_MIXER: 82262306a36Sopenharmony_ci case RT5663_DIG_SIDE_MIXER: 82362306a36Sopenharmony_ci case RT5663_BYPASS_STO_DAC: 82462306a36Sopenharmony_ci case RT5663_CALIB_REC_MIX: 82562306a36Sopenharmony_ci case RT5663_PWR_DIG_1: 82662306a36Sopenharmony_ci case RT5663_PWR_DIG_2: 82762306a36Sopenharmony_ci case RT5663_PWR_ANLG_1: 82862306a36Sopenharmony_ci case RT5663_PWR_ANLG_2: 82962306a36Sopenharmony_ci case RT5663_PWR_ANLG_3: 83062306a36Sopenharmony_ci case RT5663_PWR_MIXER: 83162306a36Sopenharmony_ci case RT5663_SIG_CLK_DET: 83262306a36Sopenharmony_ci case RT5663_PRE_DIV_GATING_1: 83362306a36Sopenharmony_ci case RT5663_PRE_DIV_GATING_2: 83462306a36Sopenharmony_ci case RT5663_I2S1_SDP: 83562306a36Sopenharmony_ci case RT5663_ADDA_CLK_1: 83662306a36Sopenharmony_ci case RT5663_ADDA_RST: 83762306a36Sopenharmony_ci case RT5663_FRAC_DIV_1: 83862306a36Sopenharmony_ci case RT5663_FRAC_DIV_2: 83962306a36Sopenharmony_ci case RT5663_TDM_1: 84062306a36Sopenharmony_ci case RT5663_TDM_2: 84162306a36Sopenharmony_ci case RT5663_TDM_3: 84262306a36Sopenharmony_ci case RT5663_TDM_4: 84362306a36Sopenharmony_ci case RT5663_TDM_5: 84462306a36Sopenharmony_ci case RT5663_GLB_CLK: 84562306a36Sopenharmony_ci case RT5663_PLL_1: 84662306a36Sopenharmony_ci case RT5663_PLL_2: 84762306a36Sopenharmony_ci case RT5663_ASRC_1: 84862306a36Sopenharmony_ci case RT5663_ASRC_2: 84962306a36Sopenharmony_ci case RT5663_ASRC_4: 85062306a36Sopenharmony_ci case RT5663_DUMMY_REG: 85162306a36Sopenharmony_ci case RT5663_ASRC_8: 85262306a36Sopenharmony_ci case RT5663_ASRC_9: 85362306a36Sopenharmony_ci case RT5663_ASRC_11: 85462306a36Sopenharmony_ci case RT5663_DEPOP_1: 85562306a36Sopenharmony_ci case RT5663_DEPOP_2: 85662306a36Sopenharmony_ci case RT5663_DEPOP_3: 85762306a36Sopenharmony_ci case RT5663_HP_CHARGE_PUMP_1: 85862306a36Sopenharmony_ci case RT5663_HP_CHARGE_PUMP_2: 85962306a36Sopenharmony_ci case RT5663_MICBIAS_1: 86062306a36Sopenharmony_ci case RT5663_RC_CLK: 86162306a36Sopenharmony_ci case RT5663_ASRC_11_2: 86262306a36Sopenharmony_ci case RT5663_DUMMY_REG_2: 86362306a36Sopenharmony_ci case RT5663_REC_PATH_GAIN: 86462306a36Sopenharmony_ci case RT5663_AUTO_1MRC_CLK: 86562306a36Sopenharmony_ci case RT5663_ADC_EQ_1: 86662306a36Sopenharmony_ci case RT5663_ADC_EQ_2: 86762306a36Sopenharmony_ci case RT5663_IRQ_1: 86862306a36Sopenharmony_ci case RT5663_IRQ_2: 86962306a36Sopenharmony_ci case RT5663_IRQ_3: 87062306a36Sopenharmony_ci case RT5663_IRQ_4: 87162306a36Sopenharmony_ci case RT5663_IRQ_5: 87262306a36Sopenharmony_ci case RT5663_INT_ST_1: 87362306a36Sopenharmony_ci case RT5663_INT_ST_2: 87462306a36Sopenharmony_ci case RT5663_GPIO_1: 87562306a36Sopenharmony_ci case RT5663_GPIO_2: 87662306a36Sopenharmony_ci case RT5663_GPIO_STA1: 87762306a36Sopenharmony_ci case RT5663_SIN_GEN_1: 87862306a36Sopenharmony_ci case RT5663_SIN_GEN_2: 87962306a36Sopenharmony_ci case RT5663_SIN_GEN_3: 88062306a36Sopenharmony_ci case RT5663_SOF_VOL_ZC1: 88162306a36Sopenharmony_ci case RT5663_IL_CMD_1: 88262306a36Sopenharmony_ci case RT5663_IL_CMD_2: 88362306a36Sopenharmony_ci case RT5663_IL_CMD_3: 88462306a36Sopenharmony_ci case RT5663_IL_CMD_4: 88562306a36Sopenharmony_ci case RT5663_IL_CMD_5: 88662306a36Sopenharmony_ci case RT5663_IL_CMD_6: 88762306a36Sopenharmony_ci case RT5663_IL_CMD_7: 88862306a36Sopenharmony_ci case RT5663_IL_CMD_8: 88962306a36Sopenharmony_ci case RT5663_IL_CMD_PWRSAV1: 89062306a36Sopenharmony_ci case RT5663_IL_CMD_PWRSAV2: 89162306a36Sopenharmony_ci case RT5663_EM_JACK_TYPE_1: 89262306a36Sopenharmony_ci case RT5663_EM_JACK_TYPE_2: 89362306a36Sopenharmony_ci case RT5663_EM_JACK_TYPE_3: 89462306a36Sopenharmony_ci case RT5663_EM_JACK_TYPE_4: 89562306a36Sopenharmony_ci case RT5663_EM_JACK_TYPE_5: 89662306a36Sopenharmony_ci case RT5663_EM_JACK_TYPE_6: 89762306a36Sopenharmony_ci case RT5663_STO1_HPF_ADJ1: 89862306a36Sopenharmony_ci case RT5663_STO1_HPF_ADJ2: 89962306a36Sopenharmony_ci case RT5663_FAST_OFF_MICBIAS: 90062306a36Sopenharmony_ci case RT5663_JD_CTRL1: 90162306a36Sopenharmony_ci case RT5663_JD_CTRL2: 90262306a36Sopenharmony_ci case RT5663_DIG_MISC: 90362306a36Sopenharmony_ci case RT5663_VENDOR_ID: 90462306a36Sopenharmony_ci case RT5663_VENDOR_ID_1: 90562306a36Sopenharmony_ci case RT5663_VENDOR_ID_2: 90662306a36Sopenharmony_ci case RT5663_DIG_VOL_ZCD: 90762306a36Sopenharmony_ci case RT5663_ANA_BIAS_CUR_1: 90862306a36Sopenharmony_ci case RT5663_ANA_BIAS_CUR_2: 90962306a36Sopenharmony_ci case RT5663_ANA_BIAS_CUR_3: 91062306a36Sopenharmony_ci case RT5663_ANA_BIAS_CUR_4: 91162306a36Sopenharmony_ci case RT5663_ANA_BIAS_CUR_5: 91262306a36Sopenharmony_ci case RT5663_ANA_BIAS_CUR_6: 91362306a36Sopenharmony_ci case RT5663_BIAS_CUR_5: 91462306a36Sopenharmony_ci case RT5663_BIAS_CUR_6: 91562306a36Sopenharmony_ci case RT5663_BIAS_CUR_7: 91662306a36Sopenharmony_ci case RT5663_BIAS_CUR_8: 91762306a36Sopenharmony_ci case RT5663_DACREF_LDO: 91862306a36Sopenharmony_ci case RT5663_DUMMY_REG_3: 91962306a36Sopenharmony_ci case RT5663_BIAS_CUR_9: 92062306a36Sopenharmony_ci case RT5663_DUMMY_REG_4: 92162306a36Sopenharmony_ci case RT5663_VREFADJ_OP: 92262306a36Sopenharmony_ci case RT5663_VREF_RECMIX: 92362306a36Sopenharmony_ci case RT5663_CHARGE_PUMP_1: 92462306a36Sopenharmony_ci case RT5663_CHARGE_PUMP_1_2: 92562306a36Sopenharmony_ci case RT5663_CHARGE_PUMP_1_3: 92662306a36Sopenharmony_ci case RT5663_CHARGE_PUMP_2: 92762306a36Sopenharmony_ci case RT5663_DIG_IN_PIN1: 92862306a36Sopenharmony_ci case RT5663_PAD_DRV_CTL: 92962306a36Sopenharmony_ci case RT5663_PLL_INT_REG: 93062306a36Sopenharmony_ci case RT5663_CHOP_DAC_L: 93162306a36Sopenharmony_ci case RT5663_CHOP_ADC: 93262306a36Sopenharmony_ci case RT5663_CALIB_ADC: 93362306a36Sopenharmony_ci case RT5663_CHOP_DAC_R: 93462306a36Sopenharmony_ci case RT5663_DUMMY_CTL_DACLR: 93562306a36Sopenharmony_ci case RT5663_DUMMY_REG_5: 93662306a36Sopenharmony_ci case RT5663_SOFT_RAMP: 93762306a36Sopenharmony_ci case RT5663_TEST_MODE_1: 93862306a36Sopenharmony_ci case RT5663_TEST_MODE_2: 93962306a36Sopenharmony_ci case RT5663_TEST_MODE_3: 94062306a36Sopenharmony_ci case RT5663_STO_DRE_1: 94162306a36Sopenharmony_ci case RT5663_STO_DRE_2: 94262306a36Sopenharmony_ci case RT5663_STO_DRE_3: 94362306a36Sopenharmony_ci case RT5663_STO_DRE_4: 94462306a36Sopenharmony_ci case RT5663_STO_DRE_5: 94562306a36Sopenharmony_ci case RT5663_STO_DRE_6: 94662306a36Sopenharmony_ci case RT5663_STO_DRE_7: 94762306a36Sopenharmony_ci case RT5663_STO_DRE_8: 94862306a36Sopenharmony_ci case RT5663_STO_DRE_9: 94962306a36Sopenharmony_ci case RT5663_STO_DRE_10: 95062306a36Sopenharmony_ci case RT5663_MIC_DECRO_1: 95162306a36Sopenharmony_ci case RT5663_MIC_DECRO_2: 95262306a36Sopenharmony_ci case RT5663_MIC_DECRO_3: 95362306a36Sopenharmony_ci case RT5663_MIC_DECRO_4: 95462306a36Sopenharmony_ci case RT5663_MIC_DECRO_5: 95562306a36Sopenharmony_ci case RT5663_MIC_DECRO_6: 95662306a36Sopenharmony_ci case RT5663_HP_DECRO_1: 95762306a36Sopenharmony_ci case RT5663_HP_DECRO_2: 95862306a36Sopenharmony_ci case RT5663_HP_DECRO_3: 95962306a36Sopenharmony_ci case RT5663_HP_DECRO_4: 96062306a36Sopenharmony_ci case RT5663_HP_DECOUP: 96162306a36Sopenharmony_ci case RT5663_HP_IMP_SEN_MAP8: 96262306a36Sopenharmony_ci case RT5663_HP_IMP_SEN_MAP9: 96362306a36Sopenharmony_ci case RT5663_HP_IMP_SEN_MAP10: 96462306a36Sopenharmony_ci case RT5663_HP_IMP_SEN_MAP11: 96562306a36Sopenharmony_ci case RT5663_HP_IMP_SEN_1: 96662306a36Sopenharmony_ci case RT5663_HP_IMP_SEN_2: 96762306a36Sopenharmony_ci case RT5663_HP_IMP_SEN_3: 96862306a36Sopenharmony_ci case RT5663_HP_IMP_SEN_4: 96962306a36Sopenharmony_ci case RT5663_HP_IMP_SEN_5: 97062306a36Sopenharmony_ci case RT5663_HP_IMP_SEN_6: 97162306a36Sopenharmony_ci case RT5663_HP_IMP_SEN_7: 97262306a36Sopenharmony_ci case RT5663_HP_IMP_SEN_8: 97362306a36Sopenharmony_ci case RT5663_HP_IMP_SEN_9: 97462306a36Sopenharmony_ci case RT5663_HP_IMP_SEN_10: 97562306a36Sopenharmony_ci case RT5663_HP_IMP_SEN_11: 97662306a36Sopenharmony_ci case RT5663_HP_IMP_SEN_12: 97762306a36Sopenharmony_ci case RT5663_HP_IMP_SEN_13: 97862306a36Sopenharmony_ci case RT5663_HP_IMP_SEN_14: 97962306a36Sopenharmony_ci case RT5663_HP_IMP_SEN_15: 98062306a36Sopenharmony_ci case RT5663_HP_IMP_SEN_16: 98162306a36Sopenharmony_ci case RT5663_HP_IMP_SEN_17: 98262306a36Sopenharmony_ci case RT5663_HP_IMP_SEN_18: 98362306a36Sopenharmony_ci case RT5663_HP_IMP_SEN_19: 98462306a36Sopenharmony_ci case RT5663_HP_IMPSEN_DIG5: 98562306a36Sopenharmony_ci case RT5663_HP_IMPSEN_MAP1: 98662306a36Sopenharmony_ci case RT5663_HP_IMPSEN_MAP2: 98762306a36Sopenharmony_ci case RT5663_HP_IMPSEN_MAP3: 98862306a36Sopenharmony_ci case RT5663_HP_IMPSEN_MAP4: 98962306a36Sopenharmony_ci case RT5663_HP_IMPSEN_MAP5: 99062306a36Sopenharmony_ci case RT5663_HP_IMPSEN_MAP7: 99162306a36Sopenharmony_ci case RT5663_HP_LOGIC_1: 99262306a36Sopenharmony_ci case RT5663_HP_LOGIC_2: 99362306a36Sopenharmony_ci case RT5663_HP_CALIB_1: 99462306a36Sopenharmony_ci case RT5663_HP_CALIB_1_1: 99562306a36Sopenharmony_ci case RT5663_HP_CALIB_2: 99662306a36Sopenharmony_ci case RT5663_HP_CALIB_3: 99762306a36Sopenharmony_ci case RT5663_HP_CALIB_4: 99862306a36Sopenharmony_ci case RT5663_HP_CALIB_5: 99962306a36Sopenharmony_ci case RT5663_HP_CALIB_5_1: 100062306a36Sopenharmony_ci case RT5663_HP_CALIB_6: 100162306a36Sopenharmony_ci case RT5663_HP_CALIB_7: 100262306a36Sopenharmony_ci case RT5663_HP_CALIB_9: 100362306a36Sopenharmony_ci case RT5663_HP_CALIB_10: 100462306a36Sopenharmony_ci case RT5663_HP_CALIB_11: 100562306a36Sopenharmony_ci case RT5663_HP_CALIB_ST1: 100662306a36Sopenharmony_ci case RT5663_HP_CALIB_ST2: 100762306a36Sopenharmony_ci case RT5663_HP_CALIB_ST3: 100862306a36Sopenharmony_ci case RT5663_HP_CALIB_ST4: 100962306a36Sopenharmony_ci case RT5663_HP_CALIB_ST5: 101062306a36Sopenharmony_ci case RT5663_HP_CALIB_ST6: 101162306a36Sopenharmony_ci case RT5663_HP_CALIB_ST7: 101262306a36Sopenharmony_ci case RT5663_HP_CALIB_ST8: 101362306a36Sopenharmony_ci case RT5663_HP_CALIB_ST9: 101462306a36Sopenharmony_ci case RT5663_HP_AMP_DET: 101562306a36Sopenharmony_ci case RT5663_DUMMY_REG_6: 101662306a36Sopenharmony_ci case RT5663_HP_BIAS: 101762306a36Sopenharmony_ci case RT5663_CBJ_1: 101862306a36Sopenharmony_ci case RT5663_CBJ_2: 101962306a36Sopenharmony_ci case RT5663_CBJ_3: 102062306a36Sopenharmony_ci case RT5663_DUMMY_1: 102162306a36Sopenharmony_ci case RT5663_DUMMY_2: 102262306a36Sopenharmony_ci case RT5663_DUMMY_3: 102362306a36Sopenharmony_ci case RT5663_ANA_JD: 102462306a36Sopenharmony_ci case RT5663_ADC_LCH_LPF1_A1: 102562306a36Sopenharmony_ci case RT5663_ADC_RCH_LPF1_A1: 102662306a36Sopenharmony_ci case RT5663_ADC_LCH_LPF1_H0: 102762306a36Sopenharmony_ci case RT5663_ADC_RCH_LPF1_H0: 102862306a36Sopenharmony_ci case RT5663_ADC_LCH_BPF1_A1: 102962306a36Sopenharmony_ci case RT5663_ADC_RCH_BPF1_A1: 103062306a36Sopenharmony_ci case RT5663_ADC_LCH_BPF1_A2: 103162306a36Sopenharmony_ci case RT5663_ADC_RCH_BPF1_A2: 103262306a36Sopenharmony_ci case RT5663_ADC_LCH_BPF1_H0: 103362306a36Sopenharmony_ci case RT5663_ADC_RCH_BPF1_H0: 103462306a36Sopenharmony_ci case RT5663_ADC_LCH_BPF2_A1: 103562306a36Sopenharmony_ci case RT5663_ADC_RCH_BPF2_A1: 103662306a36Sopenharmony_ci case RT5663_ADC_LCH_BPF2_A2: 103762306a36Sopenharmony_ci case RT5663_ADC_RCH_BPF2_A2: 103862306a36Sopenharmony_ci case RT5663_ADC_LCH_BPF2_H0: 103962306a36Sopenharmony_ci case RT5663_ADC_RCH_BPF2_H0: 104062306a36Sopenharmony_ci case RT5663_ADC_LCH_BPF3_A1: 104162306a36Sopenharmony_ci case RT5663_ADC_RCH_BPF3_A1: 104262306a36Sopenharmony_ci case RT5663_ADC_LCH_BPF3_A2: 104362306a36Sopenharmony_ci case RT5663_ADC_RCH_BPF3_A2: 104462306a36Sopenharmony_ci case RT5663_ADC_LCH_BPF3_H0: 104562306a36Sopenharmony_ci case RT5663_ADC_RCH_BPF3_H0: 104662306a36Sopenharmony_ci case RT5663_ADC_LCH_BPF4_A1: 104762306a36Sopenharmony_ci case RT5663_ADC_RCH_BPF4_A1: 104862306a36Sopenharmony_ci case RT5663_ADC_LCH_BPF4_A2: 104962306a36Sopenharmony_ci case RT5663_ADC_RCH_BPF4_A2: 105062306a36Sopenharmony_ci case RT5663_ADC_LCH_BPF4_H0: 105162306a36Sopenharmony_ci case RT5663_ADC_RCH_BPF4_H0: 105262306a36Sopenharmony_ci case RT5663_ADC_LCH_HPF1_A1: 105362306a36Sopenharmony_ci case RT5663_ADC_RCH_HPF1_A1: 105462306a36Sopenharmony_ci case RT5663_ADC_LCH_HPF1_H0: 105562306a36Sopenharmony_ci case RT5663_ADC_RCH_HPF1_H0: 105662306a36Sopenharmony_ci case RT5663_ADC_EQ_PRE_VOL_L: 105762306a36Sopenharmony_ci case RT5663_ADC_EQ_PRE_VOL_R: 105862306a36Sopenharmony_ci case RT5663_ADC_EQ_POST_VOL_L: 105962306a36Sopenharmony_ci case RT5663_ADC_EQ_POST_VOL_R: 106062306a36Sopenharmony_ci return true; 106162306a36Sopenharmony_ci default: 106262306a36Sopenharmony_ci return false; 106362306a36Sopenharmony_ci } 106462306a36Sopenharmony_ci} 106562306a36Sopenharmony_ci 106662306a36Sopenharmony_cistatic bool rt5663_v2_volatile_register(struct device *dev, unsigned int reg) 106762306a36Sopenharmony_ci{ 106862306a36Sopenharmony_ci switch (reg) { 106962306a36Sopenharmony_ci case RT5663_RESET: 107062306a36Sopenharmony_ci case RT5663_CBJ_TYPE_2: 107162306a36Sopenharmony_ci case RT5663_PDM_OUT_CTL: 107262306a36Sopenharmony_ci case RT5663_PDM_I2C_DATA_CTL1: 107362306a36Sopenharmony_ci case RT5663_PDM_I2C_DATA_CTL4: 107462306a36Sopenharmony_ci case RT5663_ALC_BK_GAIN: 107562306a36Sopenharmony_ci case RT5663_PLL_2: 107662306a36Sopenharmony_ci case RT5663_MICBIAS_1: 107762306a36Sopenharmony_ci case RT5663_ADC_EQ_1: 107862306a36Sopenharmony_ci case RT5663_INT_ST_1: 107962306a36Sopenharmony_ci case RT5663_GPIO_STA2: 108062306a36Sopenharmony_ci case RT5663_IL_CMD_1: 108162306a36Sopenharmony_ci case RT5663_IL_CMD_5: 108262306a36Sopenharmony_ci case RT5663_A_JD_CTRL: 108362306a36Sopenharmony_ci case RT5663_JD_CTRL2: 108462306a36Sopenharmony_ci case RT5663_VENDOR_ID: 108562306a36Sopenharmony_ci case RT5663_VENDOR_ID_1: 108662306a36Sopenharmony_ci case RT5663_VENDOR_ID_2: 108762306a36Sopenharmony_ci case RT5663_STO_DRE_1: 108862306a36Sopenharmony_ci case RT5663_STO_DRE_5: 108962306a36Sopenharmony_ci case RT5663_STO_DRE_6: 109062306a36Sopenharmony_ci case RT5663_STO_DRE_7: 109162306a36Sopenharmony_ci case RT5663_MONO_DYNA_6: 109262306a36Sopenharmony_ci case RT5663_STO1_SIL_DET: 109362306a36Sopenharmony_ci case RT5663_MONOL_SIL_DET: 109462306a36Sopenharmony_ci case RT5663_MONOR_SIL_DET: 109562306a36Sopenharmony_ci case RT5663_STO2_DAC_SIL: 109662306a36Sopenharmony_ci case RT5663_MONO_AMP_CAL_ST1: 109762306a36Sopenharmony_ci case RT5663_MONO_AMP_CAL_ST2: 109862306a36Sopenharmony_ci case RT5663_MONO_AMP_CAL_ST3: 109962306a36Sopenharmony_ci case RT5663_MONO_AMP_CAL_ST4: 110062306a36Sopenharmony_ci case RT5663_HP_IMP_SEN_2: 110162306a36Sopenharmony_ci case RT5663_HP_IMP_SEN_3: 110262306a36Sopenharmony_ci case RT5663_HP_IMP_SEN_4: 110362306a36Sopenharmony_ci case RT5663_HP_IMP_SEN_10: 110462306a36Sopenharmony_ci case RT5663_HP_CALIB_1: 110562306a36Sopenharmony_ci case RT5663_HP_CALIB_10: 110662306a36Sopenharmony_ci case RT5663_HP_CALIB_ST1: 110762306a36Sopenharmony_ci case RT5663_HP_CALIB_ST4: 110862306a36Sopenharmony_ci case RT5663_HP_CALIB_ST5: 110962306a36Sopenharmony_ci case RT5663_HP_CALIB_ST6: 111062306a36Sopenharmony_ci case RT5663_HP_CALIB_ST7: 111162306a36Sopenharmony_ci case RT5663_HP_CALIB_ST8: 111262306a36Sopenharmony_ci case RT5663_HP_CALIB_ST9: 111362306a36Sopenharmony_ci case RT5663_HP_CALIB_ST10: 111462306a36Sopenharmony_ci case RT5663_HP_CALIB_ST11: 111562306a36Sopenharmony_ci return true; 111662306a36Sopenharmony_ci default: 111762306a36Sopenharmony_ci return false; 111862306a36Sopenharmony_ci } 111962306a36Sopenharmony_ci} 112062306a36Sopenharmony_ci 112162306a36Sopenharmony_cistatic bool rt5663_v2_readable_register(struct device *dev, unsigned int reg) 112262306a36Sopenharmony_ci{ 112362306a36Sopenharmony_ci switch (reg) { 112462306a36Sopenharmony_ci case RT5663_LOUT_CTRL: 112562306a36Sopenharmony_ci case RT5663_HP_AMP_2: 112662306a36Sopenharmony_ci case RT5663_MONO_OUT: 112762306a36Sopenharmony_ci case RT5663_MONO_GAIN: 112862306a36Sopenharmony_ci case RT5663_AEC_BST: 112962306a36Sopenharmony_ci case RT5663_IN1_IN2: 113062306a36Sopenharmony_ci case RT5663_IN3_IN4: 113162306a36Sopenharmony_ci case RT5663_INL1_INR1: 113262306a36Sopenharmony_ci case RT5663_CBJ_TYPE_2: 113362306a36Sopenharmony_ci case RT5663_CBJ_TYPE_3: 113462306a36Sopenharmony_ci case RT5663_CBJ_TYPE_4: 113562306a36Sopenharmony_ci case RT5663_CBJ_TYPE_5: 113662306a36Sopenharmony_ci case RT5663_CBJ_TYPE_8: 113762306a36Sopenharmony_ci case RT5663_DAC3_DIG_VOL: 113862306a36Sopenharmony_ci case RT5663_DAC3_CTRL: 113962306a36Sopenharmony_ci case RT5663_MONO_ADC_DIG_VOL: 114062306a36Sopenharmony_ci case RT5663_STO2_ADC_DIG_VOL: 114162306a36Sopenharmony_ci case RT5663_MONO_ADC_BST_GAIN: 114262306a36Sopenharmony_ci case RT5663_STO2_ADC_BST_GAIN: 114362306a36Sopenharmony_ci case RT5663_SIDETONE_CTRL: 114462306a36Sopenharmony_ci case RT5663_MONO1_ADC_MIXER: 114562306a36Sopenharmony_ci case RT5663_STO2_ADC_MIXER: 114662306a36Sopenharmony_ci case RT5663_MONO_DAC_MIXER: 114762306a36Sopenharmony_ci case RT5663_DAC2_SRC_CTRL: 114862306a36Sopenharmony_ci case RT5663_IF_3_4_DATA_CTL: 114962306a36Sopenharmony_ci case RT5663_IF_5_DATA_CTL: 115062306a36Sopenharmony_ci case RT5663_PDM_OUT_CTL: 115162306a36Sopenharmony_ci case RT5663_PDM_I2C_DATA_CTL1: 115262306a36Sopenharmony_ci case RT5663_PDM_I2C_DATA_CTL2: 115362306a36Sopenharmony_ci case RT5663_PDM_I2C_DATA_CTL3: 115462306a36Sopenharmony_ci case RT5663_PDM_I2C_DATA_CTL4: 115562306a36Sopenharmony_ci case RT5663_RECMIX1_NEW: 115662306a36Sopenharmony_ci case RT5663_RECMIX1L_0: 115762306a36Sopenharmony_ci case RT5663_RECMIX1L: 115862306a36Sopenharmony_ci case RT5663_RECMIX1R_0: 115962306a36Sopenharmony_ci case RT5663_RECMIX1R: 116062306a36Sopenharmony_ci case RT5663_RECMIX2_NEW: 116162306a36Sopenharmony_ci case RT5663_RECMIX2_L_2: 116262306a36Sopenharmony_ci case RT5663_RECMIX2_R: 116362306a36Sopenharmony_ci case RT5663_RECMIX2_R_2: 116462306a36Sopenharmony_ci case RT5663_CALIB_REC_LR: 116562306a36Sopenharmony_ci case RT5663_ALC_BK_GAIN: 116662306a36Sopenharmony_ci case RT5663_MONOMIX_GAIN: 116762306a36Sopenharmony_ci case RT5663_MONOMIX_IN_GAIN: 116862306a36Sopenharmony_ci case RT5663_OUT_MIXL_GAIN: 116962306a36Sopenharmony_ci case RT5663_OUT_LMIX_IN_GAIN: 117062306a36Sopenharmony_ci case RT5663_OUT_RMIX_IN_GAIN: 117162306a36Sopenharmony_ci case RT5663_OUT_RMIX_IN_GAIN1: 117262306a36Sopenharmony_ci case RT5663_LOUT_MIXER_CTRL: 117362306a36Sopenharmony_ci case RT5663_PWR_VOL: 117462306a36Sopenharmony_ci case RT5663_ADCDAC_RST: 117562306a36Sopenharmony_ci case RT5663_I2S34_SDP: 117662306a36Sopenharmony_ci case RT5663_I2S5_SDP: 117762306a36Sopenharmony_ci case RT5663_TDM_6: 117862306a36Sopenharmony_ci case RT5663_TDM_7: 117962306a36Sopenharmony_ci case RT5663_TDM_8: 118062306a36Sopenharmony_ci case RT5663_TDM_9: 118162306a36Sopenharmony_ci case RT5663_ASRC_3: 118262306a36Sopenharmony_ci case RT5663_ASRC_6: 118362306a36Sopenharmony_ci case RT5663_ASRC_7: 118462306a36Sopenharmony_ci case RT5663_PLL_TRK_13: 118562306a36Sopenharmony_ci case RT5663_I2S_M_CLK_CTL: 118662306a36Sopenharmony_ci case RT5663_FDIV_I2S34_M_CLK: 118762306a36Sopenharmony_ci case RT5663_FDIV_I2S34_M_CLK2: 118862306a36Sopenharmony_ci case RT5663_FDIV_I2S5_M_CLK: 118962306a36Sopenharmony_ci case RT5663_FDIV_I2S5_M_CLK2: 119062306a36Sopenharmony_ci case RT5663_V2_IRQ_4: 119162306a36Sopenharmony_ci case RT5663_GPIO_3: 119262306a36Sopenharmony_ci case RT5663_GPIO_4: 119362306a36Sopenharmony_ci case RT5663_GPIO_STA2: 119462306a36Sopenharmony_ci case RT5663_HP_AMP_DET1: 119562306a36Sopenharmony_ci case RT5663_HP_AMP_DET2: 119662306a36Sopenharmony_ci case RT5663_HP_AMP_DET3: 119762306a36Sopenharmony_ci case RT5663_MID_BD_HP_AMP: 119862306a36Sopenharmony_ci case RT5663_LOW_BD_HP_AMP: 119962306a36Sopenharmony_ci case RT5663_SOF_VOL_ZC2: 120062306a36Sopenharmony_ci case RT5663_ADC_STO2_ADJ1: 120162306a36Sopenharmony_ci case RT5663_ADC_STO2_ADJ2: 120262306a36Sopenharmony_ci case RT5663_A_JD_CTRL: 120362306a36Sopenharmony_ci case RT5663_JD1_TRES_CTRL: 120462306a36Sopenharmony_ci case RT5663_JD2_TRES_CTRL: 120562306a36Sopenharmony_ci case RT5663_V2_JD_CTRL2: 120662306a36Sopenharmony_ci case RT5663_DUM_REG_2: 120762306a36Sopenharmony_ci case RT5663_DUM_REG_3: 120862306a36Sopenharmony_ci case RT5663_VENDOR_ID: 120962306a36Sopenharmony_ci case RT5663_VENDOR_ID_1: 121062306a36Sopenharmony_ci case RT5663_VENDOR_ID_2: 121162306a36Sopenharmony_ci case RT5663_DACADC_DIG_VOL2: 121262306a36Sopenharmony_ci case RT5663_DIG_IN_PIN2: 121362306a36Sopenharmony_ci case RT5663_PAD_DRV_CTL1: 121462306a36Sopenharmony_ci case RT5663_SOF_RAM_DEPOP: 121562306a36Sopenharmony_ci case RT5663_VOL_TEST: 121662306a36Sopenharmony_ci case RT5663_TEST_MODE_4: 121762306a36Sopenharmony_ci case RT5663_TEST_MODE_5: 121862306a36Sopenharmony_ci case RT5663_STO_DRE_9: 121962306a36Sopenharmony_ci case RT5663_MONO_DYNA_1: 122062306a36Sopenharmony_ci case RT5663_MONO_DYNA_2: 122162306a36Sopenharmony_ci case RT5663_MONO_DYNA_3: 122262306a36Sopenharmony_ci case RT5663_MONO_DYNA_4: 122362306a36Sopenharmony_ci case RT5663_MONO_DYNA_5: 122462306a36Sopenharmony_ci case RT5663_MONO_DYNA_6: 122562306a36Sopenharmony_ci case RT5663_STO1_SIL_DET: 122662306a36Sopenharmony_ci case RT5663_MONOL_SIL_DET: 122762306a36Sopenharmony_ci case RT5663_MONOR_SIL_DET: 122862306a36Sopenharmony_ci case RT5663_STO2_DAC_SIL: 122962306a36Sopenharmony_ci case RT5663_PWR_SAV_CTL1: 123062306a36Sopenharmony_ci case RT5663_PWR_SAV_CTL2: 123162306a36Sopenharmony_ci case RT5663_PWR_SAV_CTL3: 123262306a36Sopenharmony_ci case RT5663_PWR_SAV_CTL4: 123362306a36Sopenharmony_ci case RT5663_PWR_SAV_CTL5: 123462306a36Sopenharmony_ci case RT5663_PWR_SAV_CTL6: 123562306a36Sopenharmony_ci case RT5663_MONO_AMP_CAL1: 123662306a36Sopenharmony_ci case RT5663_MONO_AMP_CAL2: 123762306a36Sopenharmony_ci case RT5663_MONO_AMP_CAL3: 123862306a36Sopenharmony_ci case RT5663_MONO_AMP_CAL4: 123962306a36Sopenharmony_ci case RT5663_MONO_AMP_CAL5: 124062306a36Sopenharmony_ci case RT5663_MONO_AMP_CAL6: 124162306a36Sopenharmony_ci case RT5663_MONO_AMP_CAL7: 124262306a36Sopenharmony_ci case RT5663_MONO_AMP_CAL_ST1: 124362306a36Sopenharmony_ci case RT5663_MONO_AMP_CAL_ST2: 124462306a36Sopenharmony_ci case RT5663_MONO_AMP_CAL_ST3: 124562306a36Sopenharmony_ci case RT5663_MONO_AMP_CAL_ST4: 124662306a36Sopenharmony_ci case RT5663_MONO_AMP_CAL_ST5: 124762306a36Sopenharmony_ci case RT5663_V2_HP_IMP_SEN_13: 124862306a36Sopenharmony_ci case RT5663_V2_HP_IMP_SEN_14: 124962306a36Sopenharmony_ci case RT5663_V2_HP_IMP_SEN_6: 125062306a36Sopenharmony_ci case RT5663_V2_HP_IMP_SEN_7: 125162306a36Sopenharmony_ci case RT5663_V2_HP_IMP_SEN_8: 125262306a36Sopenharmony_ci case RT5663_V2_HP_IMP_SEN_9: 125362306a36Sopenharmony_ci case RT5663_V2_HP_IMP_SEN_10: 125462306a36Sopenharmony_ci case RT5663_HP_LOGIC_3: 125562306a36Sopenharmony_ci case RT5663_HP_CALIB_ST10: 125662306a36Sopenharmony_ci case RT5663_HP_CALIB_ST11: 125762306a36Sopenharmony_ci case RT5663_PRO_REG_TBL_4: 125862306a36Sopenharmony_ci case RT5663_PRO_REG_TBL_5: 125962306a36Sopenharmony_ci case RT5663_PRO_REG_TBL_6: 126062306a36Sopenharmony_ci case RT5663_PRO_REG_TBL_7: 126162306a36Sopenharmony_ci case RT5663_PRO_REG_TBL_8: 126262306a36Sopenharmony_ci case RT5663_PRO_REG_TBL_9: 126362306a36Sopenharmony_ci case RT5663_SAR_ADC_INL_1: 126462306a36Sopenharmony_ci case RT5663_SAR_ADC_INL_2: 126562306a36Sopenharmony_ci case RT5663_SAR_ADC_INL_3: 126662306a36Sopenharmony_ci case RT5663_SAR_ADC_INL_4: 126762306a36Sopenharmony_ci case RT5663_SAR_ADC_INL_5: 126862306a36Sopenharmony_ci case RT5663_SAR_ADC_INL_6: 126962306a36Sopenharmony_ci case RT5663_SAR_ADC_INL_7: 127062306a36Sopenharmony_ci case RT5663_SAR_ADC_INL_8: 127162306a36Sopenharmony_ci case RT5663_SAR_ADC_INL_9: 127262306a36Sopenharmony_ci case RT5663_SAR_ADC_INL_10: 127362306a36Sopenharmony_ci case RT5663_SAR_ADC_INL_11: 127462306a36Sopenharmony_ci case RT5663_SAR_ADC_INL_12: 127562306a36Sopenharmony_ci case RT5663_DRC_CTRL_1: 127662306a36Sopenharmony_ci case RT5663_DRC1_CTRL_2: 127762306a36Sopenharmony_ci case RT5663_DRC1_CTRL_3: 127862306a36Sopenharmony_ci case RT5663_DRC1_CTRL_4: 127962306a36Sopenharmony_ci case RT5663_DRC1_CTRL_5: 128062306a36Sopenharmony_ci case RT5663_DRC1_CTRL_6: 128162306a36Sopenharmony_ci case RT5663_DRC1_HD_CTRL_1: 128262306a36Sopenharmony_ci case RT5663_DRC1_HD_CTRL_2: 128362306a36Sopenharmony_ci case RT5663_DRC1_PRI_REG_1: 128462306a36Sopenharmony_ci case RT5663_DRC1_PRI_REG_2: 128562306a36Sopenharmony_ci case RT5663_DRC1_PRI_REG_3: 128662306a36Sopenharmony_ci case RT5663_DRC1_PRI_REG_4: 128762306a36Sopenharmony_ci case RT5663_DRC1_PRI_REG_5: 128862306a36Sopenharmony_ci case RT5663_DRC1_PRI_REG_6: 128962306a36Sopenharmony_ci case RT5663_DRC1_PRI_REG_7: 129062306a36Sopenharmony_ci case RT5663_DRC1_PRI_REG_8: 129162306a36Sopenharmony_ci case RT5663_ALC_PGA_CTL_1: 129262306a36Sopenharmony_ci case RT5663_ALC_PGA_CTL_2: 129362306a36Sopenharmony_ci case RT5663_ALC_PGA_CTL_3: 129462306a36Sopenharmony_ci case RT5663_ALC_PGA_CTL_4: 129562306a36Sopenharmony_ci case RT5663_ALC_PGA_CTL_5: 129662306a36Sopenharmony_ci case RT5663_ALC_PGA_CTL_6: 129762306a36Sopenharmony_ci case RT5663_ALC_PGA_CTL_7: 129862306a36Sopenharmony_ci case RT5663_ALC_PGA_CTL_8: 129962306a36Sopenharmony_ci case RT5663_ALC_PGA_REG_1: 130062306a36Sopenharmony_ci case RT5663_ALC_PGA_REG_2: 130162306a36Sopenharmony_ci case RT5663_ALC_PGA_REG_3: 130262306a36Sopenharmony_ci case RT5663_ADC_EQ_RECOV_1: 130362306a36Sopenharmony_ci case RT5663_ADC_EQ_RECOV_2: 130462306a36Sopenharmony_ci case RT5663_ADC_EQ_RECOV_3: 130562306a36Sopenharmony_ci case RT5663_ADC_EQ_RECOV_4: 130662306a36Sopenharmony_ci case RT5663_ADC_EQ_RECOV_5: 130762306a36Sopenharmony_ci case RT5663_ADC_EQ_RECOV_6: 130862306a36Sopenharmony_ci case RT5663_ADC_EQ_RECOV_7: 130962306a36Sopenharmony_ci case RT5663_ADC_EQ_RECOV_8: 131062306a36Sopenharmony_ci case RT5663_ADC_EQ_RECOV_9: 131162306a36Sopenharmony_ci case RT5663_ADC_EQ_RECOV_10: 131262306a36Sopenharmony_ci case RT5663_ADC_EQ_RECOV_11: 131362306a36Sopenharmony_ci case RT5663_ADC_EQ_RECOV_12: 131462306a36Sopenharmony_ci case RT5663_ADC_EQ_RECOV_13: 131562306a36Sopenharmony_ci case RT5663_VID_HIDDEN: 131662306a36Sopenharmony_ci case RT5663_VID_CUSTOMER: 131762306a36Sopenharmony_ci case RT5663_SCAN_MODE: 131862306a36Sopenharmony_ci case RT5663_I2C_BYPA: 131962306a36Sopenharmony_ci return true; 132062306a36Sopenharmony_ci case RT5663_TDM_1: 132162306a36Sopenharmony_ci case RT5663_DEPOP_3: 132262306a36Sopenharmony_ci case RT5663_ASRC_11_2: 132362306a36Sopenharmony_ci case RT5663_INT_ST_2: 132462306a36Sopenharmony_ci case RT5663_GPIO_STA1: 132562306a36Sopenharmony_ci case RT5663_SIN_GEN_1: 132662306a36Sopenharmony_ci case RT5663_SIN_GEN_2: 132762306a36Sopenharmony_ci case RT5663_SIN_GEN_3: 132862306a36Sopenharmony_ci case RT5663_IL_CMD_PWRSAV1: 132962306a36Sopenharmony_ci case RT5663_IL_CMD_PWRSAV2: 133062306a36Sopenharmony_ci case RT5663_EM_JACK_TYPE_1: 133162306a36Sopenharmony_ci case RT5663_EM_JACK_TYPE_2: 133262306a36Sopenharmony_ci case RT5663_EM_JACK_TYPE_3: 133362306a36Sopenharmony_ci case RT5663_EM_JACK_TYPE_4: 133462306a36Sopenharmony_ci case RT5663_FAST_OFF_MICBIAS: 133562306a36Sopenharmony_ci case RT5663_ANA_BIAS_CUR_1: 133662306a36Sopenharmony_ci case RT5663_ANA_BIAS_CUR_2: 133762306a36Sopenharmony_ci case RT5663_BIAS_CUR_9: 133862306a36Sopenharmony_ci case RT5663_DUMMY_REG_4: 133962306a36Sopenharmony_ci case RT5663_VREF_RECMIX: 134062306a36Sopenharmony_ci case RT5663_CHARGE_PUMP_1_2: 134162306a36Sopenharmony_ci case RT5663_CHARGE_PUMP_1_3: 134262306a36Sopenharmony_ci case RT5663_CHARGE_PUMP_2: 134362306a36Sopenharmony_ci case RT5663_CHOP_DAC_R: 134462306a36Sopenharmony_ci case RT5663_DUMMY_CTL_DACLR: 134562306a36Sopenharmony_ci case RT5663_DUMMY_REG_5: 134662306a36Sopenharmony_ci case RT5663_SOFT_RAMP: 134762306a36Sopenharmony_ci case RT5663_TEST_MODE_1: 134862306a36Sopenharmony_ci case RT5663_STO_DRE_10: 134962306a36Sopenharmony_ci case RT5663_MIC_DECRO_1: 135062306a36Sopenharmony_ci case RT5663_MIC_DECRO_2: 135162306a36Sopenharmony_ci case RT5663_MIC_DECRO_3: 135262306a36Sopenharmony_ci case RT5663_MIC_DECRO_4: 135362306a36Sopenharmony_ci case RT5663_MIC_DECRO_5: 135462306a36Sopenharmony_ci case RT5663_MIC_DECRO_6: 135562306a36Sopenharmony_ci case RT5663_HP_DECRO_1: 135662306a36Sopenharmony_ci case RT5663_HP_DECRO_2: 135762306a36Sopenharmony_ci case RT5663_HP_DECRO_3: 135862306a36Sopenharmony_ci case RT5663_HP_DECRO_4: 135962306a36Sopenharmony_ci case RT5663_HP_DECOUP: 136062306a36Sopenharmony_ci case RT5663_HP_IMPSEN_MAP4: 136162306a36Sopenharmony_ci case RT5663_HP_IMPSEN_MAP5: 136262306a36Sopenharmony_ci case RT5663_HP_IMPSEN_MAP7: 136362306a36Sopenharmony_ci case RT5663_HP_CALIB_1: 136462306a36Sopenharmony_ci case RT5663_CBJ_1: 136562306a36Sopenharmony_ci case RT5663_CBJ_2: 136662306a36Sopenharmony_ci case RT5663_CBJ_3: 136762306a36Sopenharmony_ci return false; 136862306a36Sopenharmony_ci default: 136962306a36Sopenharmony_ci return rt5663_readable_register(dev, reg); 137062306a36Sopenharmony_ci } 137162306a36Sopenharmony_ci} 137262306a36Sopenharmony_ci 137362306a36Sopenharmony_cistatic const DECLARE_TLV_DB_SCALE(rt5663_hp_vol_tlv, -2400, 150, 0); 137462306a36Sopenharmony_cistatic const DECLARE_TLV_DB_SCALE(rt5663_v2_hp_vol_tlv, -2250, 150, 0); 137562306a36Sopenharmony_cistatic const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -6525, 75, 0); 137662306a36Sopenharmony_cistatic const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -1725, 75, 0); 137762306a36Sopenharmony_ci 137862306a36Sopenharmony_ci/* {0, +20, +24, +30, +35, +40, +44, +50, +52} dB */ 137962306a36Sopenharmony_cistatic const DECLARE_TLV_DB_RANGE(in_bst_tlv, 138062306a36Sopenharmony_ci 0, 0, TLV_DB_SCALE_ITEM(0, 0, 0), 138162306a36Sopenharmony_ci 1, 1, TLV_DB_SCALE_ITEM(2000, 0, 0), 138262306a36Sopenharmony_ci 2, 2, TLV_DB_SCALE_ITEM(2400, 0, 0), 138362306a36Sopenharmony_ci 3, 5, TLV_DB_SCALE_ITEM(3000, 500, 0), 138462306a36Sopenharmony_ci 6, 6, TLV_DB_SCALE_ITEM(4400, 0, 0), 138562306a36Sopenharmony_ci 7, 7, TLV_DB_SCALE_ITEM(5000, 0, 0), 138662306a36Sopenharmony_ci 8, 8, TLV_DB_SCALE_ITEM(5200, 0, 0) 138762306a36Sopenharmony_ci); 138862306a36Sopenharmony_ci 138962306a36Sopenharmony_ci/* Interface data select */ 139062306a36Sopenharmony_cistatic const char * const rt5663_if1_adc_data_select[] = { 139162306a36Sopenharmony_ci "L/R", "R/L", "L/L", "R/R" 139262306a36Sopenharmony_ci}; 139362306a36Sopenharmony_ci 139462306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5663_if1_adc_enum, RT5663_TDM_2, 139562306a36Sopenharmony_ci RT5663_DATA_SWAP_ADCDAT1_SHIFT, rt5663_if1_adc_data_select); 139662306a36Sopenharmony_ci 139762306a36Sopenharmony_cistatic void rt5663_enable_push_button_irq(struct snd_soc_component *component, 139862306a36Sopenharmony_ci bool enable) 139962306a36Sopenharmony_ci{ 140062306a36Sopenharmony_ci struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); 140162306a36Sopenharmony_ci 140262306a36Sopenharmony_ci if (enable) { 140362306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_IL_CMD_6, 140462306a36Sopenharmony_ci RT5663_EN_4BTN_INL_MASK, RT5663_EN_4BTN_INL_EN); 140562306a36Sopenharmony_ci /* reset in-line command */ 140662306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_IL_CMD_6, 140762306a36Sopenharmony_ci RT5663_RESET_4BTN_INL_MASK, 140862306a36Sopenharmony_ci RT5663_RESET_4BTN_INL_RESET); 140962306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_IL_CMD_6, 141062306a36Sopenharmony_ci RT5663_RESET_4BTN_INL_MASK, 141162306a36Sopenharmony_ci RT5663_RESET_4BTN_INL_NOR); 141262306a36Sopenharmony_ci switch (rt5663->codec_ver) { 141362306a36Sopenharmony_ci case CODEC_VER_1: 141462306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_IRQ_3, 141562306a36Sopenharmony_ci RT5663_V2_EN_IRQ_INLINE_MASK, 141662306a36Sopenharmony_ci RT5663_V2_EN_IRQ_INLINE_NOR); 141762306a36Sopenharmony_ci break; 141862306a36Sopenharmony_ci case CODEC_VER_0: 141962306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_IRQ_2, 142062306a36Sopenharmony_ci RT5663_EN_IRQ_INLINE_MASK, 142162306a36Sopenharmony_ci RT5663_EN_IRQ_INLINE_NOR); 142262306a36Sopenharmony_ci break; 142362306a36Sopenharmony_ci default: 142462306a36Sopenharmony_ci dev_err(component->dev, "Unknown CODEC Version\n"); 142562306a36Sopenharmony_ci } 142662306a36Sopenharmony_ci } else { 142762306a36Sopenharmony_ci switch (rt5663->codec_ver) { 142862306a36Sopenharmony_ci case CODEC_VER_1: 142962306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_IRQ_3, 143062306a36Sopenharmony_ci RT5663_V2_EN_IRQ_INLINE_MASK, 143162306a36Sopenharmony_ci RT5663_V2_EN_IRQ_INLINE_BYP); 143262306a36Sopenharmony_ci break; 143362306a36Sopenharmony_ci case CODEC_VER_0: 143462306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_IRQ_2, 143562306a36Sopenharmony_ci RT5663_EN_IRQ_INLINE_MASK, 143662306a36Sopenharmony_ci RT5663_EN_IRQ_INLINE_BYP); 143762306a36Sopenharmony_ci break; 143862306a36Sopenharmony_ci default: 143962306a36Sopenharmony_ci dev_err(component->dev, "Unknown CODEC Version\n"); 144062306a36Sopenharmony_ci } 144162306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_IL_CMD_6, 144262306a36Sopenharmony_ci RT5663_EN_4BTN_INL_MASK, RT5663_EN_4BTN_INL_DIS); 144362306a36Sopenharmony_ci /* reset in-line command */ 144462306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_IL_CMD_6, 144562306a36Sopenharmony_ci RT5663_RESET_4BTN_INL_MASK, 144662306a36Sopenharmony_ci RT5663_RESET_4BTN_INL_RESET); 144762306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_IL_CMD_6, 144862306a36Sopenharmony_ci RT5663_RESET_4BTN_INL_MASK, 144962306a36Sopenharmony_ci RT5663_RESET_4BTN_INL_NOR); 145062306a36Sopenharmony_ci } 145162306a36Sopenharmony_ci} 145262306a36Sopenharmony_ci 145362306a36Sopenharmony_ci/** 145462306a36Sopenharmony_ci * rt5663_v2_jack_detect - Detect headset. 145562306a36Sopenharmony_ci * @component: SoC audio component device. 145662306a36Sopenharmony_ci * @jack_insert: Jack insert or not. 145762306a36Sopenharmony_ci * 145862306a36Sopenharmony_ci * Detect whether is headset or not when jack inserted. 145962306a36Sopenharmony_ci * 146062306a36Sopenharmony_ci * Returns detect status. 146162306a36Sopenharmony_ci */ 146262306a36Sopenharmony_ci 146362306a36Sopenharmony_cistatic int rt5663_v2_jack_detect(struct snd_soc_component *component, int jack_insert) 146462306a36Sopenharmony_ci{ 146562306a36Sopenharmony_ci struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); 146662306a36Sopenharmony_ci struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); 146762306a36Sopenharmony_ci int val, i = 0, sleep_time[5] = {300, 150, 100, 50, 30}; 146862306a36Sopenharmony_ci 146962306a36Sopenharmony_ci dev_dbg(component->dev, "%s jack_insert:%d\n", __func__, jack_insert); 147062306a36Sopenharmony_ci if (jack_insert) { 147162306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_CBJ_TYPE_2, 0x8040); 147262306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_CBJ_TYPE_3, 0x1484); 147362306a36Sopenharmony_ci 147462306a36Sopenharmony_ci snd_soc_dapm_force_enable_pin(dapm, "MICBIAS1"); 147562306a36Sopenharmony_ci snd_soc_dapm_force_enable_pin(dapm, "MICBIAS2"); 147662306a36Sopenharmony_ci snd_soc_dapm_force_enable_pin(dapm, "Mic Det Power"); 147762306a36Sopenharmony_ci snd_soc_dapm_force_enable_pin(dapm, "CBJ Power"); 147862306a36Sopenharmony_ci snd_soc_dapm_sync(dapm); 147962306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_RC_CLK, 148062306a36Sopenharmony_ci RT5663_DIG_1M_CLK_MASK, RT5663_DIG_1M_CLK_EN); 148162306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_RECMIX, 0x8, 0x8); 148262306a36Sopenharmony_ci 148362306a36Sopenharmony_ci while (i < 5) { 148462306a36Sopenharmony_ci msleep(sleep_time[i]); 148562306a36Sopenharmony_ci val = snd_soc_component_read(component, RT5663_CBJ_TYPE_2) & 0x0003; 148662306a36Sopenharmony_ci if (val == 0x1 || val == 0x2 || val == 0x3) 148762306a36Sopenharmony_ci break; 148862306a36Sopenharmony_ci dev_dbg(component->dev, "%s: MX-0011 val=%x sleep %d\n", 148962306a36Sopenharmony_ci __func__, val, sleep_time[i]); 149062306a36Sopenharmony_ci i++; 149162306a36Sopenharmony_ci } 149262306a36Sopenharmony_ci dev_dbg(component->dev, "%s val = %d\n", __func__, val); 149362306a36Sopenharmony_ci switch (val) { 149462306a36Sopenharmony_ci case 1: 149562306a36Sopenharmony_ci case 2: 149662306a36Sopenharmony_ci rt5663->jack_type = SND_JACK_HEADSET; 149762306a36Sopenharmony_ci rt5663_enable_push_button_irq(component, true); 149862306a36Sopenharmony_ci break; 149962306a36Sopenharmony_ci default: 150062306a36Sopenharmony_ci snd_soc_dapm_disable_pin(dapm, "MICBIAS1"); 150162306a36Sopenharmony_ci snd_soc_dapm_disable_pin(dapm, "MICBIAS2"); 150262306a36Sopenharmony_ci snd_soc_dapm_disable_pin(dapm, "Mic Det Power"); 150362306a36Sopenharmony_ci snd_soc_dapm_disable_pin(dapm, "CBJ Power"); 150462306a36Sopenharmony_ci snd_soc_dapm_sync(dapm); 150562306a36Sopenharmony_ci rt5663->jack_type = SND_JACK_HEADPHONE; 150662306a36Sopenharmony_ci break; 150762306a36Sopenharmony_ci } 150862306a36Sopenharmony_ci } else { 150962306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_RECMIX, 0x8, 0x0); 151062306a36Sopenharmony_ci 151162306a36Sopenharmony_ci if (rt5663->jack_type == SND_JACK_HEADSET) { 151262306a36Sopenharmony_ci rt5663_enable_push_button_irq(component, false); 151362306a36Sopenharmony_ci snd_soc_dapm_disable_pin(dapm, "MICBIAS1"); 151462306a36Sopenharmony_ci snd_soc_dapm_disable_pin(dapm, "MICBIAS2"); 151562306a36Sopenharmony_ci snd_soc_dapm_disable_pin(dapm, "Mic Det Power"); 151662306a36Sopenharmony_ci snd_soc_dapm_disable_pin(dapm, "CBJ Power"); 151762306a36Sopenharmony_ci snd_soc_dapm_sync(dapm); 151862306a36Sopenharmony_ci } 151962306a36Sopenharmony_ci rt5663->jack_type = 0; 152062306a36Sopenharmony_ci } 152162306a36Sopenharmony_ci 152262306a36Sopenharmony_ci dev_dbg(component->dev, "jack_type = %d\n", rt5663->jack_type); 152362306a36Sopenharmony_ci return rt5663->jack_type; 152462306a36Sopenharmony_ci} 152562306a36Sopenharmony_ci 152662306a36Sopenharmony_ci/** 152762306a36Sopenharmony_ci * rt5663_jack_detect - Detect headset. 152862306a36Sopenharmony_ci * @component: SoC audio component device. 152962306a36Sopenharmony_ci * @jack_insert: Jack insert or not. 153062306a36Sopenharmony_ci * 153162306a36Sopenharmony_ci * Detect whether is headset or not when jack inserted. 153262306a36Sopenharmony_ci * 153362306a36Sopenharmony_ci * Returns detect status. 153462306a36Sopenharmony_ci */ 153562306a36Sopenharmony_cistatic int rt5663_jack_detect(struct snd_soc_component *component, int jack_insert) 153662306a36Sopenharmony_ci{ 153762306a36Sopenharmony_ci struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); 153862306a36Sopenharmony_ci int val, i = 0; 153962306a36Sopenharmony_ci 154062306a36Sopenharmony_ci dev_dbg(component->dev, "%s jack_insert:%d\n", __func__, jack_insert); 154162306a36Sopenharmony_ci 154262306a36Sopenharmony_ci if (jack_insert) { 154362306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_DIG_MISC, 154462306a36Sopenharmony_ci RT5663_DIG_GATE_CTRL_MASK, RT5663_DIG_GATE_CTRL_EN); 154562306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_HP_CHARGE_PUMP_1, 154662306a36Sopenharmony_ci RT5663_SI_HP_MASK | RT5663_OSW_HP_L_MASK | 154762306a36Sopenharmony_ci RT5663_OSW_HP_R_MASK, RT5663_SI_HP_EN | 154862306a36Sopenharmony_ci RT5663_OSW_HP_L_DIS | RT5663_OSW_HP_R_DIS); 154962306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_DUMMY_1, 155062306a36Sopenharmony_ci RT5663_EMB_CLK_MASK | RT5663_HPA_CPL_BIAS_MASK | 155162306a36Sopenharmony_ci RT5663_HPA_CPR_BIAS_MASK, RT5663_EMB_CLK_EN | 155262306a36Sopenharmony_ci RT5663_HPA_CPL_BIAS_1 | RT5663_HPA_CPR_BIAS_1); 155362306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_CBJ_1, 155462306a36Sopenharmony_ci RT5663_INBUF_CBJ_BST1_MASK | RT5663_CBJ_SENSE_BST1_MASK, 155562306a36Sopenharmony_ci RT5663_INBUF_CBJ_BST1_ON | RT5663_CBJ_SENSE_BST1_L); 155662306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_IL_CMD_2, 155762306a36Sopenharmony_ci RT5663_PWR_MIC_DET_MASK, RT5663_PWR_MIC_DET_ON); 155862306a36Sopenharmony_ci /* BST1 power on for JD */ 155962306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_PWR_ANLG_2, 156062306a36Sopenharmony_ci RT5663_PWR_BST1_MASK, RT5663_PWR_BST1_ON); 156162306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_EM_JACK_TYPE_1, 156262306a36Sopenharmony_ci RT5663_CBJ_DET_MASK | RT5663_EXT_JD_MASK | 156362306a36Sopenharmony_ci RT5663_POL_EXT_JD_MASK, RT5663_CBJ_DET_EN | 156462306a36Sopenharmony_ci RT5663_EXT_JD_EN | RT5663_POL_EXT_JD_EN); 156562306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_PWR_ANLG_1, 156662306a36Sopenharmony_ci RT5663_PWR_MB_MASK | RT5663_LDO1_DVO_MASK | 156762306a36Sopenharmony_ci RT5663_AMP_HP_MASK, RT5663_PWR_MB | 156862306a36Sopenharmony_ci RT5663_LDO1_DVO_0_9V | RT5663_AMP_HP_3X); 156962306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_PWR_ANLG_1, 157062306a36Sopenharmony_ci RT5663_PWR_VREF1_MASK | RT5663_PWR_VREF2_MASK | 157162306a36Sopenharmony_ci RT5663_PWR_FV1_MASK | RT5663_PWR_FV2_MASK, 157262306a36Sopenharmony_ci RT5663_PWR_VREF1 | RT5663_PWR_VREF2); 157362306a36Sopenharmony_ci msleep(20); 157462306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_PWR_ANLG_1, 157562306a36Sopenharmony_ci RT5663_PWR_FV1_MASK | RT5663_PWR_FV2_MASK, 157662306a36Sopenharmony_ci RT5663_PWR_FV1 | RT5663_PWR_FV2); 157762306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_AUTO_1MRC_CLK, 157862306a36Sopenharmony_ci RT5663_IRQ_POW_SAV_MASK, RT5663_IRQ_POW_SAV_EN); 157962306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_IRQ_1, 158062306a36Sopenharmony_ci RT5663_EN_IRQ_JD1_MASK, RT5663_EN_IRQ_JD1_EN); 158162306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_EM_JACK_TYPE_1, 158262306a36Sopenharmony_ci RT5663_EM_JD_MASK, RT5663_EM_JD_RST); 158362306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_EM_JACK_TYPE_1, 158462306a36Sopenharmony_ci RT5663_EM_JD_MASK, RT5663_EM_JD_NOR); 158562306a36Sopenharmony_ci 158662306a36Sopenharmony_ci while (true) { 158762306a36Sopenharmony_ci regmap_read(rt5663->regmap, RT5663_INT_ST_2, &val); 158862306a36Sopenharmony_ci if (!(val & 0x80)) 158962306a36Sopenharmony_ci usleep_range(10000, 10005); 159062306a36Sopenharmony_ci else 159162306a36Sopenharmony_ci break; 159262306a36Sopenharmony_ci 159362306a36Sopenharmony_ci if (i > 200) 159462306a36Sopenharmony_ci break; 159562306a36Sopenharmony_ci i++; 159662306a36Sopenharmony_ci } 159762306a36Sopenharmony_ci 159862306a36Sopenharmony_ci val = snd_soc_component_read(component, RT5663_EM_JACK_TYPE_2) & 0x0003; 159962306a36Sopenharmony_ci dev_dbg(component->dev, "%s val = %d\n", __func__, val); 160062306a36Sopenharmony_ci 160162306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_HP_CHARGE_PUMP_1, 160262306a36Sopenharmony_ci RT5663_OSW_HP_L_MASK | RT5663_OSW_HP_R_MASK, 160362306a36Sopenharmony_ci RT5663_OSW_HP_L_EN | RT5663_OSW_HP_R_EN); 160462306a36Sopenharmony_ci 160562306a36Sopenharmony_ci switch (val) { 160662306a36Sopenharmony_ci case 1: 160762306a36Sopenharmony_ci case 2: 160862306a36Sopenharmony_ci rt5663->jack_type = SND_JACK_HEADSET; 160962306a36Sopenharmony_ci rt5663_enable_push_button_irq(component, true); 161062306a36Sopenharmony_ci 161162306a36Sopenharmony_ci if (rt5663->pdata.impedance_sensing_num) 161262306a36Sopenharmony_ci break; 161362306a36Sopenharmony_ci 161462306a36Sopenharmony_ci if (rt5663->pdata.dc_offset_l_manual_mic) { 161562306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_MIC_DECRO_2, 161662306a36Sopenharmony_ci rt5663->pdata.dc_offset_l_manual_mic >> 161762306a36Sopenharmony_ci 16); 161862306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_MIC_DECRO_3, 161962306a36Sopenharmony_ci rt5663->pdata.dc_offset_l_manual_mic & 162062306a36Sopenharmony_ci 0xffff); 162162306a36Sopenharmony_ci } 162262306a36Sopenharmony_ci 162362306a36Sopenharmony_ci if (rt5663->pdata.dc_offset_r_manual_mic) { 162462306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_MIC_DECRO_5, 162562306a36Sopenharmony_ci rt5663->pdata.dc_offset_r_manual_mic >> 162662306a36Sopenharmony_ci 16); 162762306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_MIC_DECRO_6, 162862306a36Sopenharmony_ci rt5663->pdata.dc_offset_r_manual_mic & 162962306a36Sopenharmony_ci 0xffff); 163062306a36Sopenharmony_ci } 163162306a36Sopenharmony_ci break; 163262306a36Sopenharmony_ci default: 163362306a36Sopenharmony_ci rt5663->jack_type = SND_JACK_HEADPHONE; 163462306a36Sopenharmony_ci snd_soc_component_update_bits(component, 163562306a36Sopenharmony_ci RT5663_PWR_ANLG_1, 163662306a36Sopenharmony_ci RT5663_PWR_MB_MASK | RT5663_PWR_VREF1_MASK | 163762306a36Sopenharmony_ci RT5663_PWR_VREF2_MASK, 0); 163862306a36Sopenharmony_ci if (rt5663->pdata.impedance_sensing_num) 163962306a36Sopenharmony_ci break; 164062306a36Sopenharmony_ci 164162306a36Sopenharmony_ci if (rt5663->pdata.dc_offset_l_manual) { 164262306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_MIC_DECRO_2, 164362306a36Sopenharmony_ci rt5663->pdata.dc_offset_l_manual >> 16); 164462306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_MIC_DECRO_3, 164562306a36Sopenharmony_ci rt5663->pdata.dc_offset_l_manual & 164662306a36Sopenharmony_ci 0xffff); 164762306a36Sopenharmony_ci } 164862306a36Sopenharmony_ci 164962306a36Sopenharmony_ci if (rt5663->pdata.dc_offset_r_manual) { 165062306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_MIC_DECRO_5, 165162306a36Sopenharmony_ci rt5663->pdata.dc_offset_r_manual >> 16); 165262306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_MIC_DECRO_6, 165362306a36Sopenharmony_ci rt5663->pdata.dc_offset_r_manual & 165462306a36Sopenharmony_ci 0xffff); 165562306a36Sopenharmony_ci } 165662306a36Sopenharmony_ci break; 165762306a36Sopenharmony_ci } 165862306a36Sopenharmony_ci } else { 165962306a36Sopenharmony_ci if (rt5663->jack_type == SND_JACK_HEADSET) 166062306a36Sopenharmony_ci rt5663_enable_push_button_irq(component, false); 166162306a36Sopenharmony_ci rt5663->jack_type = 0; 166262306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_PWR_ANLG_1, 166362306a36Sopenharmony_ci RT5663_PWR_MB_MASK | RT5663_PWR_VREF1_MASK | 166462306a36Sopenharmony_ci RT5663_PWR_VREF2_MASK, 0); 166562306a36Sopenharmony_ci } 166662306a36Sopenharmony_ci 166762306a36Sopenharmony_ci dev_dbg(component->dev, "jack_type = %d\n", rt5663->jack_type); 166862306a36Sopenharmony_ci return rt5663->jack_type; 166962306a36Sopenharmony_ci} 167062306a36Sopenharmony_ci 167162306a36Sopenharmony_cistatic int rt5663_impedance_sensing(struct snd_soc_component *component) 167262306a36Sopenharmony_ci{ 167362306a36Sopenharmony_ci struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); 167462306a36Sopenharmony_ci unsigned int value, i, reg84, reg26, reg2fa, reg91, reg10, reg80; 167562306a36Sopenharmony_ci 167662306a36Sopenharmony_ci for (i = 0; i < rt5663->pdata.impedance_sensing_num; i++) { 167762306a36Sopenharmony_ci if (rt5663->imp_table[i].vol == 7) 167862306a36Sopenharmony_ci break; 167962306a36Sopenharmony_ci } 168062306a36Sopenharmony_ci 168162306a36Sopenharmony_ci if (rt5663->jack_type == SND_JACK_HEADSET) { 168262306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_MIC_DECRO_2, 168362306a36Sopenharmony_ci rt5663->imp_table[i].dc_offset_l_manual_mic >> 16); 168462306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_MIC_DECRO_3, 168562306a36Sopenharmony_ci rt5663->imp_table[i].dc_offset_l_manual_mic & 0xffff); 168662306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_MIC_DECRO_5, 168762306a36Sopenharmony_ci rt5663->imp_table[i].dc_offset_r_manual_mic >> 16); 168862306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_MIC_DECRO_6, 168962306a36Sopenharmony_ci rt5663->imp_table[i].dc_offset_r_manual_mic & 0xffff); 169062306a36Sopenharmony_ci } else { 169162306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_MIC_DECRO_2, 169262306a36Sopenharmony_ci rt5663->imp_table[i].dc_offset_l_manual >> 16); 169362306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_MIC_DECRO_3, 169462306a36Sopenharmony_ci rt5663->imp_table[i].dc_offset_l_manual & 0xffff); 169562306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_MIC_DECRO_5, 169662306a36Sopenharmony_ci rt5663->imp_table[i].dc_offset_r_manual >> 16); 169762306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_MIC_DECRO_6, 169862306a36Sopenharmony_ci rt5663->imp_table[i].dc_offset_r_manual & 0xffff); 169962306a36Sopenharmony_ci } 170062306a36Sopenharmony_ci 170162306a36Sopenharmony_ci reg84 = snd_soc_component_read(component, RT5663_ASRC_2); 170262306a36Sopenharmony_ci reg26 = snd_soc_component_read(component, RT5663_STO1_ADC_MIXER); 170362306a36Sopenharmony_ci reg2fa = snd_soc_component_read(component, RT5663_DUMMY_1); 170462306a36Sopenharmony_ci reg91 = snd_soc_component_read(component, RT5663_HP_CHARGE_PUMP_1); 170562306a36Sopenharmony_ci reg10 = snd_soc_component_read(component, RT5663_RECMIX); 170662306a36Sopenharmony_ci reg80 = snd_soc_component_read(component, RT5663_GLB_CLK); 170762306a36Sopenharmony_ci 170862306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_STO_DRE_1, 0x8000, 0); 170962306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_ASRC_2, 0); 171062306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_STO1_ADC_MIXER, 0x4040); 171162306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_PWR_ANLG_1, 171262306a36Sopenharmony_ci RT5663_PWR_VREF1_MASK | RT5663_PWR_VREF2_MASK | 171362306a36Sopenharmony_ci RT5663_PWR_FV1_MASK | RT5663_PWR_FV2_MASK, 171462306a36Sopenharmony_ci RT5663_PWR_VREF1 | RT5663_PWR_VREF2); 171562306a36Sopenharmony_ci usleep_range(10000, 10005); 171662306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_PWR_ANLG_1, 171762306a36Sopenharmony_ci RT5663_PWR_FV1_MASK | RT5663_PWR_FV2_MASK, 171862306a36Sopenharmony_ci RT5663_PWR_FV1 | RT5663_PWR_FV2); 171962306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_GLB_CLK, RT5663_SCLK_SRC_MASK, 172062306a36Sopenharmony_ci RT5663_SCLK_SRC_RCCLK); 172162306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_RC_CLK, RT5663_DIG_25M_CLK_MASK, 172262306a36Sopenharmony_ci RT5663_DIG_25M_CLK_EN); 172362306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_ADDA_CLK_1, RT5663_I2S_PD1_MASK, 0); 172462306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_PRE_DIV_GATING_1, 0xff00); 172562306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_PRE_DIV_GATING_2, 0xfffc); 172662306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_HP_CHARGE_PUMP_1, 0x1232); 172762306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_HP_LOGIC_2, 0x0005); 172862306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_DEPOP_2, 0x3003); 172962306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_DEPOP_1, 0x0030, 0x0030); 173062306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_DEPOP_1, 0x0003, 0x0003); 173162306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_PWR_DIG_2, 173262306a36Sopenharmony_ci RT5663_PWR_ADC_S1F | RT5663_PWR_DAC_S1F, 173362306a36Sopenharmony_ci RT5663_PWR_ADC_S1F | RT5663_PWR_DAC_S1F); 173462306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_PWR_DIG_1, 173562306a36Sopenharmony_ci RT5663_PWR_DAC_L1 | RT5663_PWR_DAC_R1 | 173662306a36Sopenharmony_ci RT5663_PWR_LDO_DACREF_MASK | RT5663_PWR_ADC_L1 | 173762306a36Sopenharmony_ci RT5663_PWR_ADC_R1, 173862306a36Sopenharmony_ci RT5663_PWR_DAC_L1 | RT5663_PWR_DAC_R1 | 173962306a36Sopenharmony_ci RT5663_PWR_LDO_DACREF_ON | RT5663_PWR_ADC_L1 | 174062306a36Sopenharmony_ci RT5663_PWR_ADC_R1); 174162306a36Sopenharmony_ci msleep(40); 174262306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_PWR_ANLG_2, 174362306a36Sopenharmony_ci RT5663_PWR_RECMIX1 | RT5663_PWR_RECMIX2, 174462306a36Sopenharmony_ci RT5663_PWR_RECMIX1 | RT5663_PWR_RECMIX2); 174562306a36Sopenharmony_ci msleep(30); 174662306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_HP_CHARGE_PUMP_2, 0x1371); 174762306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_STO_DAC_MIXER, 0); 174862306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_BYPASS_STO_DAC, 0x000c); 174962306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_HP_BIAS, 0xafaa); 175062306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_CHARGE_PUMP_1, 0x2224); 175162306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_HP_OUT_EN, 0x8088); 175262306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_CHOP_ADC, 0x3000); 175362306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_ADDA_RST, 0xc000); 175462306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_STO1_HPF_ADJ1, 0x3320); 175562306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_HP_CALIB_2, 0x00c9); 175662306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_DUMMY_1, 0x004c); 175762306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_ANA_BIAS_CUR_1, 0x7733); 175862306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_CHARGE_PUMP_2, 0x7777); 175962306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_STO_DRE_9, 0x0007); 176062306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_STO_DRE_10, 0x0007); 176162306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_DUMMY_2, 0x02a4); 176262306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_RECMIX, 0x0005); 176362306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_HP_IMP_SEN_1, 0x4334); 176462306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_IRQ_3, 0x0004, 0x0004); 176562306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_HP_LOGIC_1, 0x2200); 176662306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_DEPOP_1, 0x3000, 0x3000); 176762306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_HP_LOGIC_1, 0x6200); 176862306a36Sopenharmony_ci 176962306a36Sopenharmony_ci for (i = 0; i < 100; i++) { 177062306a36Sopenharmony_ci msleep(20); 177162306a36Sopenharmony_ci if (snd_soc_component_read(component, RT5663_INT_ST_1) & 0x2) 177262306a36Sopenharmony_ci break; 177362306a36Sopenharmony_ci } 177462306a36Sopenharmony_ci 177562306a36Sopenharmony_ci value = snd_soc_component_read(component, RT5663_HP_IMP_SEN_4); 177662306a36Sopenharmony_ci 177762306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_DEPOP_1, 0x3000, 0); 177862306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_INT_ST_1, 0); 177962306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_HP_LOGIC_1, 0); 178062306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_RC_CLK, RT5663_DIG_25M_CLK_MASK, 178162306a36Sopenharmony_ci RT5663_DIG_25M_CLK_DIS); 178262306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_GLB_CLK, reg80); 178362306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_RECMIX, reg10); 178462306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_DUMMY_2, 0x00a4); 178562306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_DUMMY_1, reg2fa); 178662306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_HP_CALIB_2, 0x00c8); 178762306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_STO1_HPF_ADJ1, 0xb320); 178862306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_ADDA_RST, 0xe400); 178962306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_CHOP_ADC, 0x2000); 179062306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_HP_OUT_EN, 0x0008); 179162306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_PWR_ANLG_2, 179262306a36Sopenharmony_ci RT5663_PWR_RECMIX1 | RT5663_PWR_RECMIX2, 0); 179362306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_PWR_DIG_1, 179462306a36Sopenharmony_ci RT5663_PWR_DAC_L1 | RT5663_PWR_DAC_R1 | 179562306a36Sopenharmony_ci RT5663_PWR_LDO_DACREF_MASK | RT5663_PWR_ADC_L1 | 179662306a36Sopenharmony_ci RT5663_PWR_ADC_R1, 0); 179762306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_PWR_DIG_2, 179862306a36Sopenharmony_ci RT5663_PWR_ADC_S1F | RT5663_PWR_DAC_S1F, 0); 179962306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_DEPOP_1, 0x0003, 0); 180062306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_DEPOP_1, 0x0030, 0); 180162306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_HP_LOGIC_2, 0); 180262306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_HP_CHARGE_PUMP_1, reg91); 180362306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_PWR_ANLG_1, 180462306a36Sopenharmony_ci RT5663_PWR_VREF1_MASK | RT5663_PWR_VREF2_MASK, 0); 180562306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_STO1_ADC_MIXER, reg26); 180662306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_ASRC_2, reg84); 180762306a36Sopenharmony_ci 180862306a36Sopenharmony_ci for (i = 0; i < rt5663->pdata.impedance_sensing_num; i++) { 180962306a36Sopenharmony_ci if (value >= rt5663->imp_table[i].imp_min && 181062306a36Sopenharmony_ci value <= rt5663->imp_table[i].imp_max) 181162306a36Sopenharmony_ci break; 181262306a36Sopenharmony_ci } 181362306a36Sopenharmony_ci 181462306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_STO_DRE_9, RT5663_DRE_GAIN_HP_MASK, 181562306a36Sopenharmony_ci rt5663->imp_table[i].vol); 181662306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_STO_DRE_10, RT5663_DRE_GAIN_HP_MASK, 181762306a36Sopenharmony_ci rt5663->imp_table[i].vol); 181862306a36Sopenharmony_ci 181962306a36Sopenharmony_ci if (rt5663->jack_type == SND_JACK_HEADSET) { 182062306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_MIC_DECRO_2, 182162306a36Sopenharmony_ci rt5663->imp_table[i].dc_offset_l_manual_mic >> 16); 182262306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_MIC_DECRO_3, 182362306a36Sopenharmony_ci rt5663->imp_table[i].dc_offset_l_manual_mic & 0xffff); 182462306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_MIC_DECRO_5, 182562306a36Sopenharmony_ci rt5663->imp_table[i].dc_offset_r_manual_mic >> 16); 182662306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_MIC_DECRO_6, 182762306a36Sopenharmony_ci rt5663->imp_table[i].dc_offset_r_manual_mic & 0xffff); 182862306a36Sopenharmony_ci } else { 182962306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_MIC_DECRO_2, 183062306a36Sopenharmony_ci rt5663->imp_table[i].dc_offset_l_manual >> 16); 183162306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_MIC_DECRO_3, 183262306a36Sopenharmony_ci rt5663->imp_table[i].dc_offset_l_manual & 0xffff); 183362306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_MIC_DECRO_5, 183462306a36Sopenharmony_ci rt5663->imp_table[i].dc_offset_r_manual >> 16); 183562306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_MIC_DECRO_6, 183662306a36Sopenharmony_ci rt5663->imp_table[i].dc_offset_r_manual & 0xffff); 183762306a36Sopenharmony_ci } 183862306a36Sopenharmony_ci 183962306a36Sopenharmony_ci return 0; 184062306a36Sopenharmony_ci} 184162306a36Sopenharmony_ci 184262306a36Sopenharmony_cistatic int rt5663_button_detect(struct snd_soc_component *component) 184362306a36Sopenharmony_ci{ 184462306a36Sopenharmony_ci int btn_type, val; 184562306a36Sopenharmony_ci 184662306a36Sopenharmony_ci val = snd_soc_component_read(component, RT5663_IL_CMD_5); 184762306a36Sopenharmony_ci dev_dbg(component->dev, "%s: val=0x%x\n", __func__, val); 184862306a36Sopenharmony_ci btn_type = val & 0xfff0; 184962306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_IL_CMD_5, val); 185062306a36Sopenharmony_ci 185162306a36Sopenharmony_ci return btn_type; 185262306a36Sopenharmony_ci} 185362306a36Sopenharmony_ci 185462306a36Sopenharmony_cistatic irqreturn_t rt5663_irq(int irq, void *data) 185562306a36Sopenharmony_ci{ 185662306a36Sopenharmony_ci struct rt5663_priv *rt5663 = data; 185762306a36Sopenharmony_ci 185862306a36Sopenharmony_ci dev_dbg(regmap_get_device(rt5663->regmap), "%s IRQ queue work\n", 185962306a36Sopenharmony_ci __func__); 186062306a36Sopenharmony_ci 186162306a36Sopenharmony_ci queue_delayed_work(system_wq, &rt5663->jack_detect_work, 186262306a36Sopenharmony_ci msecs_to_jiffies(250)); 186362306a36Sopenharmony_ci 186462306a36Sopenharmony_ci return IRQ_HANDLED; 186562306a36Sopenharmony_ci} 186662306a36Sopenharmony_ci 186762306a36Sopenharmony_cistatic int rt5663_set_jack_detect(struct snd_soc_component *component, 186862306a36Sopenharmony_ci struct snd_soc_jack *hs_jack, void *data) 186962306a36Sopenharmony_ci{ 187062306a36Sopenharmony_ci struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); 187162306a36Sopenharmony_ci 187262306a36Sopenharmony_ci rt5663->hs_jack = hs_jack; 187362306a36Sopenharmony_ci 187462306a36Sopenharmony_ci rt5663_irq(0, rt5663); 187562306a36Sopenharmony_ci 187662306a36Sopenharmony_ci return 0; 187762306a36Sopenharmony_ci} 187862306a36Sopenharmony_ci 187962306a36Sopenharmony_cistatic bool rt5663_check_jd_status(struct snd_soc_component *component) 188062306a36Sopenharmony_ci{ 188162306a36Sopenharmony_ci struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); 188262306a36Sopenharmony_ci int val = snd_soc_component_read(component, RT5663_INT_ST_1); 188362306a36Sopenharmony_ci 188462306a36Sopenharmony_ci dev_dbg(component->dev, "%s val=%x\n", __func__, val); 188562306a36Sopenharmony_ci 188662306a36Sopenharmony_ci /* JD1 */ 188762306a36Sopenharmony_ci switch (rt5663->codec_ver) { 188862306a36Sopenharmony_ci case CODEC_VER_1: 188962306a36Sopenharmony_ci return !(val & 0x2000); 189062306a36Sopenharmony_ci case CODEC_VER_0: 189162306a36Sopenharmony_ci return !(val & 0x1000); 189262306a36Sopenharmony_ci default: 189362306a36Sopenharmony_ci dev_err(component->dev, "Unknown CODEC Version\n"); 189462306a36Sopenharmony_ci } 189562306a36Sopenharmony_ci 189662306a36Sopenharmony_ci return false; 189762306a36Sopenharmony_ci} 189862306a36Sopenharmony_ci 189962306a36Sopenharmony_cistatic void rt5663_jack_detect_work(struct work_struct *work) 190062306a36Sopenharmony_ci{ 190162306a36Sopenharmony_ci struct rt5663_priv *rt5663 = 190262306a36Sopenharmony_ci container_of(work, struct rt5663_priv, jack_detect_work.work); 190362306a36Sopenharmony_ci struct snd_soc_component *component = rt5663->component; 190462306a36Sopenharmony_ci int btn_type, report = 0; 190562306a36Sopenharmony_ci 190662306a36Sopenharmony_ci if (!component) 190762306a36Sopenharmony_ci return; 190862306a36Sopenharmony_ci 190962306a36Sopenharmony_ci if (rt5663_check_jd_status(component)) { 191062306a36Sopenharmony_ci /* jack in */ 191162306a36Sopenharmony_ci if (rt5663->jack_type == 0) { 191262306a36Sopenharmony_ci /* jack was out, report jack type */ 191362306a36Sopenharmony_ci switch (rt5663->codec_ver) { 191462306a36Sopenharmony_ci case CODEC_VER_1: 191562306a36Sopenharmony_ci report = rt5663_v2_jack_detect( 191662306a36Sopenharmony_ci rt5663->component, 1); 191762306a36Sopenharmony_ci break; 191862306a36Sopenharmony_ci case CODEC_VER_0: 191962306a36Sopenharmony_ci report = rt5663_jack_detect(rt5663->component, 1); 192062306a36Sopenharmony_ci if (rt5663->pdata.impedance_sensing_num) 192162306a36Sopenharmony_ci rt5663_impedance_sensing(rt5663->component); 192262306a36Sopenharmony_ci break; 192362306a36Sopenharmony_ci default: 192462306a36Sopenharmony_ci dev_err(component->dev, "Unknown CODEC Version\n"); 192562306a36Sopenharmony_ci } 192662306a36Sopenharmony_ci 192762306a36Sopenharmony_ci /* Delay the jack insert report to avoid pop noise */ 192862306a36Sopenharmony_ci msleep(30); 192962306a36Sopenharmony_ci } else { 193062306a36Sopenharmony_ci /* jack is already in, report button event */ 193162306a36Sopenharmony_ci report = SND_JACK_HEADSET; 193262306a36Sopenharmony_ci btn_type = rt5663_button_detect(rt5663->component); 193362306a36Sopenharmony_ci /** 193462306a36Sopenharmony_ci * rt5663 can report three kinds of button behavior, 193562306a36Sopenharmony_ci * one click, double click and hold. However, 193662306a36Sopenharmony_ci * currently we will report button pressed/released 193762306a36Sopenharmony_ci * event. So all the three button behaviors are 193862306a36Sopenharmony_ci * treated as button pressed. 193962306a36Sopenharmony_ci */ 194062306a36Sopenharmony_ci switch (btn_type) { 194162306a36Sopenharmony_ci case 0x8000: 194262306a36Sopenharmony_ci case 0x4000: 194362306a36Sopenharmony_ci case 0x2000: 194462306a36Sopenharmony_ci report |= SND_JACK_BTN_0; 194562306a36Sopenharmony_ci break; 194662306a36Sopenharmony_ci case 0x1000: 194762306a36Sopenharmony_ci case 0x0800: 194862306a36Sopenharmony_ci case 0x0400: 194962306a36Sopenharmony_ci report |= SND_JACK_BTN_1; 195062306a36Sopenharmony_ci break; 195162306a36Sopenharmony_ci case 0x0200: 195262306a36Sopenharmony_ci case 0x0100: 195362306a36Sopenharmony_ci case 0x0080: 195462306a36Sopenharmony_ci report |= SND_JACK_BTN_2; 195562306a36Sopenharmony_ci break; 195662306a36Sopenharmony_ci case 0x0040: 195762306a36Sopenharmony_ci case 0x0020: 195862306a36Sopenharmony_ci case 0x0010: 195962306a36Sopenharmony_ci report |= SND_JACK_BTN_3; 196062306a36Sopenharmony_ci break; 196162306a36Sopenharmony_ci case 0x0000: /* unpressed */ 196262306a36Sopenharmony_ci break; 196362306a36Sopenharmony_ci default: 196462306a36Sopenharmony_ci btn_type = 0; 196562306a36Sopenharmony_ci dev_err(rt5663->component->dev, 196662306a36Sopenharmony_ci "Unexpected button code 0x%04x\n", 196762306a36Sopenharmony_ci btn_type); 196862306a36Sopenharmony_ci break; 196962306a36Sopenharmony_ci } 197062306a36Sopenharmony_ci /* button release or spurious interrput*/ 197162306a36Sopenharmony_ci if (btn_type == 0) { 197262306a36Sopenharmony_ci report = rt5663->jack_type; 197362306a36Sopenharmony_ci cancel_delayed_work_sync( 197462306a36Sopenharmony_ci &rt5663->jd_unplug_work); 197562306a36Sopenharmony_ci } else { 197662306a36Sopenharmony_ci queue_delayed_work(system_wq, 197762306a36Sopenharmony_ci &rt5663->jd_unplug_work, 197862306a36Sopenharmony_ci msecs_to_jiffies(500)); 197962306a36Sopenharmony_ci } 198062306a36Sopenharmony_ci } 198162306a36Sopenharmony_ci } else { 198262306a36Sopenharmony_ci /* jack out */ 198362306a36Sopenharmony_ci switch (rt5663->codec_ver) { 198462306a36Sopenharmony_ci case CODEC_VER_1: 198562306a36Sopenharmony_ci report = rt5663_v2_jack_detect(rt5663->component, 0); 198662306a36Sopenharmony_ci break; 198762306a36Sopenharmony_ci case CODEC_VER_0: 198862306a36Sopenharmony_ci report = rt5663_jack_detect(rt5663->component, 0); 198962306a36Sopenharmony_ci break; 199062306a36Sopenharmony_ci default: 199162306a36Sopenharmony_ci dev_err(component->dev, "Unknown CODEC Version\n"); 199262306a36Sopenharmony_ci } 199362306a36Sopenharmony_ci } 199462306a36Sopenharmony_ci dev_dbg(component->dev, "%s jack report: 0x%04x\n", __func__, report); 199562306a36Sopenharmony_ci snd_soc_jack_report(rt5663->hs_jack, report, SND_JACK_HEADSET | 199662306a36Sopenharmony_ci SND_JACK_BTN_0 | SND_JACK_BTN_1 | 199762306a36Sopenharmony_ci SND_JACK_BTN_2 | SND_JACK_BTN_3); 199862306a36Sopenharmony_ci} 199962306a36Sopenharmony_ci 200062306a36Sopenharmony_cistatic void rt5663_jd_unplug_work(struct work_struct *work) 200162306a36Sopenharmony_ci{ 200262306a36Sopenharmony_ci struct rt5663_priv *rt5663 = 200362306a36Sopenharmony_ci container_of(work, struct rt5663_priv, jd_unplug_work.work); 200462306a36Sopenharmony_ci struct snd_soc_component *component = rt5663->component; 200562306a36Sopenharmony_ci 200662306a36Sopenharmony_ci if (!component) 200762306a36Sopenharmony_ci return; 200862306a36Sopenharmony_ci 200962306a36Sopenharmony_ci if (!rt5663_check_jd_status(component)) { 201062306a36Sopenharmony_ci /* jack out */ 201162306a36Sopenharmony_ci switch (rt5663->codec_ver) { 201262306a36Sopenharmony_ci case CODEC_VER_1: 201362306a36Sopenharmony_ci rt5663_v2_jack_detect(rt5663->component, 0); 201462306a36Sopenharmony_ci break; 201562306a36Sopenharmony_ci case CODEC_VER_0: 201662306a36Sopenharmony_ci rt5663_jack_detect(rt5663->component, 0); 201762306a36Sopenharmony_ci break; 201862306a36Sopenharmony_ci default: 201962306a36Sopenharmony_ci dev_err(component->dev, "Unknown CODEC Version\n"); 202062306a36Sopenharmony_ci } 202162306a36Sopenharmony_ci 202262306a36Sopenharmony_ci snd_soc_jack_report(rt5663->hs_jack, 0, SND_JACK_HEADSET | 202362306a36Sopenharmony_ci SND_JACK_BTN_0 | SND_JACK_BTN_1 | 202462306a36Sopenharmony_ci SND_JACK_BTN_2 | SND_JACK_BTN_3); 202562306a36Sopenharmony_ci } else { 202662306a36Sopenharmony_ci queue_delayed_work(system_wq, &rt5663->jd_unplug_work, 202762306a36Sopenharmony_ci msecs_to_jiffies(500)); 202862306a36Sopenharmony_ci } 202962306a36Sopenharmony_ci} 203062306a36Sopenharmony_ci 203162306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5663_snd_controls[] = { 203262306a36Sopenharmony_ci /* DAC Digital Volume */ 203362306a36Sopenharmony_ci SOC_DOUBLE_TLV("DAC Playback Volume", RT5663_STO1_DAC_DIG_VOL, 203462306a36Sopenharmony_ci RT5663_DAC_L1_VOL_SHIFT + 1, RT5663_DAC_R1_VOL_SHIFT + 1, 203562306a36Sopenharmony_ci 87, 0, dac_vol_tlv), 203662306a36Sopenharmony_ci /* ADC Digital Volume Control */ 203762306a36Sopenharmony_ci SOC_DOUBLE("ADC Capture Switch", RT5663_STO1_ADC_DIG_VOL, 203862306a36Sopenharmony_ci RT5663_ADC_L_MUTE_SHIFT, RT5663_ADC_R_MUTE_SHIFT, 1, 1), 203962306a36Sopenharmony_ci SOC_DOUBLE_TLV("ADC Capture Volume", RT5663_STO1_ADC_DIG_VOL, 204062306a36Sopenharmony_ci RT5663_ADC_L_VOL_SHIFT + 1, RT5663_ADC_R_VOL_SHIFT + 1, 204162306a36Sopenharmony_ci 63, 0, adc_vol_tlv), 204262306a36Sopenharmony_ci}; 204362306a36Sopenharmony_ci 204462306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5663_v2_specific_controls[] = { 204562306a36Sopenharmony_ci /* Headphone Output Volume */ 204662306a36Sopenharmony_ci SOC_DOUBLE_R_TLV("Headphone Playback Volume", RT5663_HP_LCH_DRE, 204762306a36Sopenharmony_ci RT5663_HP_RCH_DRE, RT5663_GAIN_HP_SHIFT, 15, 1, 204862306a36Sopenharmony_ci rt5663_v2_hp_vol_tlv), 204962306a36Sopenharmony_ci /* Mic Boost Volume */ 205062306a36Sopenharmony_ci SOC_SINGLE_TLV("IN1 Capture Volume", RT5663_AEC_BST, 205162306a36Sopenharmony_ci RT5663_GAIN_CBJ_SHIFT, 8, 0, in_bst_tlv), 205262306a36Sopenharmony_ci}; 205362306a36Sopenharmony_ci 205462306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5663_specific_controls[] = { 205562306a36Sopenharmony_ci /* Mic Boost Volume*/ 205662306a36Sopenharmony_ci SOC_SINGLE_TLV("IN1 Capture Volume", RT5663_CBJ_2, 205762306a36Sopenharmony_ci RT5663_GAIN_BST1_SHIFT, 8, 0, in_bst_tlv), 205862306a36Sopenharmony_ci /* Data Swap for Slot0/1 in ADCDAT1 */ 205962306a36Sopenharmony_ci SOC_ENUM("IF1 ADC Data Swap", rt5663_if1_adc_enum), 206062306a36Sopenharmony_ci}; 206162306a36Sopenharmony_ci 206262306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5663_hpvol_controls[] = { 206362306a36Sopenharmony_ci /* Headphone Output Volume */ 206462306a36Sopenharmony_ci SOC_DOUBLE_R_TLV("Headphone Playback Volume", RT5663_STO_DRE_9, 206562306a36Sopenharmony_ci RT5663_STO_DRE_10, RT5663_DRE_GAIN_HP_SHIFT, 23, 1, 206662306a36Sopenharmony_ci rt5663_hp_vol_tlv), 206762306a36Sopenharmony_ci}; 206862306a36Sopenharmony_ci 206962306a36Sopenharmony_cistatic int rt5663_is_sys_clk_from_pll(struct snd_soc_dapm_widget *w, 207062306a36Sopenharmony_ci struct snd_soc_dapm_widget *sink) 207162306a36Sopenharmony_ci{ 207262306a36Sopenharmony_ci unsigned int val; 207362306a36Sopenharmony_ci struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 207462306a36Sopenharmony_ci 207562306a36Sopenharmony_ci val = snd_soc_component_read(component, RT5663_GLB_CLK); 207662306a36Sopenharmony_ci val &= RT5663_SCLK_SRC_MASK; 207762306a36Sopenharmony_ci if (val == RT5663_SCLK_SRC_PLL1) 207862306a36Sopenharmony_ci return 1; 207962306a36Sopenharmony_ci else 208062306a36Sopenharmony_ci return 0; 208162306a36Sopenharmony_ci} 208262306a36Sopenharmony_ci 208362306a36Sopenharmony_cistatic int rt5663_is_using_asrc(struct snd_soc_dapm_widget *w, 208462306a36Sopenharmony_ci struct snd_soc_dapm_widget *sink) 208562306a36Sopenharmony_ci{ 208662306a36Sopenharmony_ci unsigned int reg, shift, val; 208762306a36Sopenharmony_ci struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 208862306a36Sopenharmony_ci struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); 208962306a36Sopenharmony_ci 209062306a36Sopenharmony_ci if (rt5663->codec_ver == CODEC_VER_1) { 209162306a36Sopenharmony_ci switch (w->shift) { 209262306a36Sopenharmony_ci case RT5663_ADC_STO1_ASRC_SHIFT: 209362306a36Sopenharmony_ci reg = RT5663_ASRC_3; 209462306a36Sopenharmony_ci shift = RT5663_V2_AD_STO1_TRACK_SHIFT; 209562306a36Sopenharmony_ci break; 209662306a36Sopenharmony_ci case RT5663_DAC_STO1_ASRC_SHIFT: 209762306a36Sopenharmony_ci reg = RT5663_ASRC_2; 209862306a36Sopenharmony_ci shift = RT5663_DA_STO1_TRACK_SHIFT; 209962306a36Sopenharmony_ci break; 210062306a36Sopenharmony_ci default: 210162306a36Sopenharmony_ci return 0; 210262306a36Sopenharmony_ci } 210362306a36Sopenharmony_ci } else { 210462306a36Sopenharmony_ci switch (w->shift) { 210562306a36Sopenharmony_ci case RT5663_ADC_STO1_ASRC_SHIFT: 210662306a36Sopenharmony_ci reg = RT5663_ASRC_2; 210762306a36Sopenharmony_ci shift = RT5663_AD_STO1_TRACK_SHIFT; 210862306a36Sopenharmony_ci break; 210962306a36Sopenharmony_ci case RT5663_DAC_STO1_ASRC_SHIFT: 211062306a36Sopenharmony_ci reg = RT5663_ASRC_2; 211162306a36Sopenharmony_ci shift = RT5663_DA_STO1_TRACK_SHIFT; 211262306a36Sopenharmony_ci break; 211362306a36Sopenharmony_ci default: 211462306a36Sopenharmony_ci return 0; 211562306a36Sopenharmony_ci } 211662306a36Sopenharmony_ci } 211762306a36Sopenharmony_ci 211862306a36Sopenharmony_ci val = (snd_soc_component_read(component, reg) >> shift) & 0x7; 211962306a36Sopenharmony_ci 212062306a36Sopenharmony_ci if (val) 212162306a36Sopenharmony_ci return 1; 212262306a36Sopenharmony_ci 212362306a36Sopenharmony_ci return 0; 212462306a36Sopenharmony_ci} 212562306a36Sopenharmony_ci 212662306a36Sopenharmony_cistatic int rt5663_i2s_use_asrc(struct snd_soc_dapm_widget *source, 212762306a36Sopenharmony_ci struct snd_soc_dapm_widget *sink) 212862306a36Sopenharmony_ci{ 212962306a36Sopenharmony_ci struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); 213062306a36Sopenharmony_ci struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); 213162306a36Sopenharmony_ci int da_asrc_en, ad_asrc_en; 213262306a36Sopenharmony_ci 213362306a36Sopenharmony_ci da_asrc_en = (snd_soc_component_read(component, RT5663_ASRC_2) & 213462306a36Sopenharmony_ci RT5663_DA_STO1_TRACK_MASK) ? 1 : 0; 213562306a36Sopenharmony_ci switch (rt5663->codec_ver) { 213662306a36Sopenharmony_ci case CODEC_VER_1: 213762306a36Sopenharmony_ci ad_asrc_en = (snd_soc_component_read(component, RT5663_ASRC_3) & 213862306a36Sopenharmony_ci RT5663_V2_AD_STO1_TRACK_MASK) ? 1 : 0; 213962306a36Sopenharmony_ci break; 214062306a36Sopenharmony_ci case CODEC_VER_0: 214162306a36Sopenharmony_ci ad_asrc_en = (snd_soc_component_read(component, RT5663_ASRC_2) & 214262306a36Sopenharmony_ci RT5663_AD_STO1_TRACK_MASK) ? 1 : 0; 214362306a36Sopenharmony_ci break; 214462306a36Sopenharmony_ci default: 214562306a36Sopenharmony_ci dev_err(component->dev, "Unknown CODEC Version\n"); 214662306a36Sopenharmony_ci return 1; 214762306a36Sopenharmony_ci } 214862306a36Sopenharmony_ci 214962306a36Sopenharmony_ci if (da_asrc_en || ad_asrc_en) 215062306a36Sopenharmony_ci if (rt5663->sysclk > rt5663->lrck * 384) 215162306a36Sopenharmony_ci return 1; 215262306a36Sopenharmony_ci 215362306a36Sopenharmony_ci dev_err(component->dev, "sysclk < 384 x fs, disable i2s asrc\n"); 215462306a36Sopenharmony_ci 215562306a36Sopenharmony_ci return 0; 215662306a36Sopenharmony_ci} 215762306a36Sopenharmony_ci 215862306a36Sopenharmony_ci/** 215962306a36Sopenharmony_ci * rt5663_sel_asrc_clk_src - select ASRC clock source for a set of filters 216062306a36Sopenharmony_ci * @component: SoC audio component device. 216162306a36Sopenharmony_ci * @filter_mask: mask of filters. 216262306a36Sopenharmony_ci * @clk_src: clock source 216362306a36Sopenharmony_ci * 216462306a36Sopenharmony_ci * The ASRC function is for asynchronous MCLK and LRCK. Also, since RT5663 can 216562306a36Sopenharmony_ci * only support standard 32fs or 64fs i2s format, ASRC should be enabled to 216662306a36Sopenharmony_ci * support special i2s clock format such as Intel's 100fs(100 * sampling rate). 216762306a36Sopenharmony_ci * ASRC function will track i2s clock and generate a corresponding system clock 216862306a36Sopenharmony_ci * for codec. This function provides an API to select the clock source for a 216962306a36Sopenharmony_ci * set of filters specified by the mask. And the codec driver will turn on ASRC 217062306a36Sopenharmony_ci * for these filters if ASRC is selected as their clock source. 217162306a36Sopenharmony_ci */ 217262306a36Sopenharmony_ciint rt5663_sel_asrc_clk_src(struct snd_soc_component *component, 217362306a36Sopenharmony_ci unsigned int filter_mask, unsigned int clk_src) 217462306a36Sopenharmony_ci{ 217562306a36Sopenharmony_ci struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); 217662306a36Sopenharmony_ci unsigned int asrc2_mask = 0; 217762306a36Sopenharmony_ci unsigned int asrc2_value = 0; 217862306a36Sopenharmony_ci unsigned int asrc3_mask = 0; 217962306a36Sopenharmony_ci unsigned int asrc3_value = 0; 218062306a36Sopenharmony_ci 218162306a36Sopenharmony_ci switch (clk_src) { 218262306a36Sopenharmony_ci case RT5663_CLK_SEL_SYS: 218362306a36Sopenharmony_ci case RT5663_CLK_SEL_I2S1_ASRC: 218462306a36Sopenharmony_ci break; 218562306a36Sopenharmony_ci 218662306a36Sopenharmony_ci default: 218762306a36Sopenharmony_ci return -EINVAL; 218862306a36Sopenharmony_ci } 218962306a36Sopenharmony_ci 219062306a36Sopenharmony_ci if (filter_mask & RT5663_DA_STEREO_FILTER) { 219162306a36Sopenharmony_ci asrc2_mask |= RT5663_DA_STO1_TRACK_MASK; 219262306a36Sopenharmony_ci asrc2_value |= clk_src << RT5663_DA_STO1_TRACK_SHIFT; 219362306a36Sopenharmony_ci } 219462306a36Sopenharmony_ci 219562306a36Sopenharmony_ci if (filter_mask & RT5663_AD_STEREO_FILTER) { 219662306a36Sopenharmony_ci switch (rt5663->codec_ver) { 219762306a36Sopenharmony_ci case CODEC_VER_1: 219862306a36Sopenharmony_ci asrc3_mask |= RT5663_V2_AD_STO1_TRACK_MASK; 219962306a36Sopenharmony_ci asrc3_value |= clk_src << RT5663_V2_AD_STO1_TRACK_SHIFT; 220062306a36Sopenharmony_ci break; 220162306a36Sopenharmony_ci case CODEC_VER_0: 220262306a36Sopenharmony_ci asrc2_mask |= RT5663_AD_STO1_TRACK_MASK; 220362306a36Sopenharmony_ci asrc2_value |= clk_src << RT5663_AD_STO1_TRACK_SHIFT; 220462306a36Sopenharmony_ci break; 220562306a36Sopenharmony_ci default: 220662306a36Sopenharmony_ci dev_err(component->dev, "Unknown CODEC Version\n"); 220762306a36Sopenharmony_ci } 220862306a36Sopenharmony_ci } 220962306a36Sopenharmony_ci 221062306a36Sopenharmony_ci if (asrc2_mask) 221162306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_ASRC_2, asrc2_mask, 221262306a36Sopenharmony_ci asrc2_value); 221362306a36Sopenharmony_ci 221462306a36Sopenharmony_ci if (asrc3_mask) 221562306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_ASRC_3, asrc3_mask, 221662306a36Sopenharmony_ci asrc3_value); 221762306a36Sopenharmony_ci 221862306a36Sopenharmony_ci return 0; 221962306a36Sopenharmony_ci} 222062306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(rt5663_sel_asrc_clk_src); 222162306a36Sopenharmony_ci 222262306a36Sopenharmony_ci/* Analog Mixer */ 222362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5663_recmix1l[] = { 222462306a36Sopenharmony_ci SOC_DAPM_SINGLE("BST2 Switch", RT5663_RECMIX1L, 222562306a36Sopenharmony_ci RT5663_RECMIX1L_BST2_SHIFT, 1, 1), 222662306a36Sopenharmony_ci SOC_DAPM_SINGLE("BST1 CBJ Switch", RT5663_RECMIX1L, 222762306a36Sopenharmony_ci RT5663_RECMIX1L_BST1_CBJ_SHIFT, 1, 1), 222862306a36Sopenharmony_ci}; 222962306a36Sopenharmony_ci 223062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5663_recmix1r[] = { 223162306a36Sopenharmony_ci SOC_DAPM_SINGLE("BST2 Switch", RT5663_RECMIX1R, 223262306a36Sopenharmony_ci RT5663_RECMIX1R_BST2_SHIFT, 1, 1), 223362306a36Sopenharmony_ci}; 223462306a36Sopenharmony_ci 223562306a36Sopenharmony_ci/* Digital Mixer */ 223662306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5663_sto1_adc_l_mix[] = { 223762306a36Sopenharmony_ci SOC_DAPM_SINGLE("ADC1 Switch", RT5663_STO1_ADC_MIXER, 223862306a36Sopenharmony_ci RT5663_M_STO1_ADC_L1_SHIFT, 1, 1), 223962306a36Sopenharmony_ci SOC_DAPM_SINGLE("ADC2 Switch", RT5663_STO1_ADC_MIXER, 224062306a36Sopenharmony_ci RT5663_M_STO1_ADC_L2_SHIFT, 1, 1), 224162306a36Sopenharmony_ci}; 224262306a36Sopenharmony_ci 224362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5663_sto1_adc_r_mix[] = { 224462306a36Sopenharmony_ci SOC_DAPM_SINGLE("ADC1 Switch", RT5663_STO1_ADC_MIXER, 224562306a36Sopenharmony_ci RT5663_M_STO1_ADC_R1_SHIFT, 1, 1), 224662306a36Sopenharmony_ci SOC_DAPM_SINGLE("ADC2 Switch", RT5663_STO1_ADC_MIXER, 224762306a36Sopenharmony_ci RT5663_M_STO1_ADC_R2_SHIFT, 1, 1), 224862306a36Sopenharmony_ci}; 224962306a36Sopenharmony_ci 225062306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5663_adda_l_mix[] = { 225162306a36Sopenharmony_ci SOC_DAPM_SINGLE("ADC L Switch", RT5663_AD_DA_MIXER, 225262306a36Sopenharmony_ci RT5663_M_ADCMIX_L_SHIFT, 1, 1), 225362306a36Sopenharmony_ci SOC_DAPM_SINGLE("DAC L Switch", RT5663_AD_DA_MIXER, 225462306a36Sopenharmony_ci RT5663_M_DAC1_L_SHIFT, 1, 1), 225562306a36Sopenharmony_ci}; 225662306a36Sopenharmony_ci 225762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5663_adda_r_mix[] = { 225862306a36Sopenharmony_ci SOC_DAPM_SINGLE("ADC R Switch", RT5663_AD_DA_MIXER, 225962306a36Sopenharmony_ci RT5663_M_ADCMIX_R_SHIFT, 1, 1), 226062306a36Sopenharmony_ci SOC_DAPM_SINGLE("DAC R Switch", RT5663_AD_DA_MIXER, 226162306a36Sopenharmony_ci RT5663_M_DAC1_R_SHIFT, 1, 1), 226262306a36Sopenharmony_ci}; 226362306a36Sopenharmony_ci 226462306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5663_sto1_dac_l_mix[] = { 226562306a36Sopenharmony_ci SOC_DAPM_SINGLE("DAC L Switch", RT5663_STO_DAC_MIXER, 226662306a36Sopenharmony_ci RT5663_M_DAC_L1_STO_L_SHIFT, 1, 1), 226762306a36Sopenharmony_ci}; 226862306a36Sopenharmony_ci 226962306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5663_sto1_dac_r_mix[] = { 227062306a36Sopenharmony_ci SOC_DAPM_SINGLE("DAC R Switch", RT5663_STO_DAC_MIXER, 227162306a36Sopenharmony_ci RT5663_M_DAC_R1_STO_R_SHIFT, 1, 1), 227262306a36Sopenharmony_ci}; 227362306a36Sopenharmony_ci 227462306a36Sopenharmony_ci/* Out Switch */ 227562306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5663_hpo_switch = 227662306a36Sopenharmony_ci SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5663_HP_AMP_2, 227762306a36Sopenharmony_ci RT5663_EN_DAC_HPO_SHIFT, 1, 0); 227862306a36Sopenharmony_ci 227962306a36Sopenharmony_ci/* Stereo ADC source */ 228062306a36Sopenharmony_cistatic const char * const rt5663_sto1_adc_src[] = { 228162306a36Sopenharmony_ci "ADC L", "ADC R" 228262306a36Sopenharmony_ci}; 228362306a36Sopenharmony_ci 228462306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5663_sto1_adcl_enum, RT5663_STO1_ADC_MIXER, 228562306a36Sopenharmony_ci RT5663_STO1_ADC_L_SRC_SHIFT, rt5663_sto1_adc_src); 228662306a36Sopenharmony_ci 228762306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5663_sto1_adcl_mux = 228862306a36Sopenharmony_ci SOC_DAPM_ENUM("STO1 ADC L Mux", rt5663_sto1_adcl_enum); 228962306a36Sopenharmony_ci 229062306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5663_sto1_adcr_enum, RT5663_STO1_ADC_MIXER, 229162306a36Sopenharmony_ci RT5663_STO1_ADC_R_SRC_SHIFT, rt5663_sto1_adc_src); 229262306a36Sopenharmony_ci 229362306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5663_sto1_adcr_mux = 229462306a36Sopenharmony_ci SOC_DAPM_ENUM("STO1 ADC R Mux", rt5663_sto1_adcr_enum); 229562306a36Sopenharmony_ci 229662306a36Sopenharmony_ci/* RT5663: Analog DACL1 input source */ 229762306a36Sopenharmony_cistatic const char * const rt5663_alg_dacl_src[] = { 229862306a36Sopenharmony_ci "DAC L", "STO DAC MIXL" 229962306a36Sopenharmony_ci}; 230062306a36Sopenharmony_ci 230162306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5663_alg_dacl_enum, RT5663_BYPASS_STO_DAC, 230262306a36Sopenharmony_ci RT5663_DACL1_SRC_SHIFT, rt5663_alg_dacl_src); 230362306a36Sopenharmony_ci 230462306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5663_alg_dacl_mux = 230562306a36Sopenharmony_ci SOC_DAPM_ENUM("DAC L Mux", rt5663_alg_dacl_enum); 230662306a36Sopenharmony_ci 230762306a36Sopenharmony_ci/* RT5663: Analog DACR1 input source */ 230862306a36Sopenharmony_cistatic const char * const rt5663_alg_dacr_src[] = { 230962306a36Sopenharmony_ci "DAC R", "STO DAC MIXR" 231062306a36Sopenharmony_ci}; 231162306a36Sopenharmony_ci 231262306a36Sopenharmony_cistatic SOC_ENUM_SINGLE_DECL(rt5663_alg_dacr_enum, RT5663_BYPASS_STO_DAC, 231362306a36Sopenharmony_ci RT5663_DACR1_SRC_SHIFT, rt5663_alg_dacr_src); 231462306a36Sopenharmony_ci 231562306a36Sopenharmony_cistatic const struct snd_kcontrol_new rt5663_alg_dacr_mux = 231662306a36Sopenharmony_ci SOC_DAPM_ENUM("DAC R Mux", rt5663_alg_dacr_enum); 231762306a36Sopenharmony_ci 231862306a36Sopenharmony_cistatic int rt5663_hp_event(struct snd_soc_dapm_widget *w, 231962306a36Sopenharmony_ci struct snd_kcontrol *kcontrol, int event) 232062306a36Sopenharmony_ci{ 232162306a36Sopenharmony_ci struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 232262306a36Sopenharmony_ci struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); 232362306a36Sopenharmony_ci 232462306a36Sopenharmony_ci switch (event) { 232562306a36Sopenharmony_ci case SND_SOC_DAPM_POST_PMU: 232662306a36Sopenharmony_ci if (rt5663->codec_ver == CODEC_VER_1) { 232762306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_HP_CHARGE_PUMP_1, 232862306a36Sopenharmony_ci RT5663_SEL_PM_HP_SHIFT, RT5663_SEL_PM_HP_HIGH); 232962306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_HP_LOGIC_2, 233062306a36Sopenharmony_ci RT5663_HP_SIG_SRC1_MASK, 233162306a36Sopenharmony_ci RT5663_HP_SIG_SRC1_SILENCE); 233262306a36Sopenharmony_ci } else { 233362306a36Sopenharmony_ci snd_soc_component_update_bits(component, 233462306a36Sopenharmony_ci RT5663_DACREF_LDO, 0x3e0e, 0x3a0a); 233562306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_DEPOP_2, 0x3003); 233662306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_HP_CHARGE_PUMP_1, 233762306a36Sopenharmony_ci RT5663_OVCD_HP_MASK, RT5663_OVCD_HP_DIS); 233862306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_HP_CHARGE_PUMP_2, 0x1371); 233962306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_HP_BIAS, 0xabba); 234062306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_CHARGE_PUMP_1, 0x2224); 234162306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_ANA_BIAS_CUR_1, 0x7766); 234262306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_HP_BIAS, 0xafaa); 234362306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_CHARGE_PUMP_2, 0x7777); 234462306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_STO_DRE_1, 0x8000, 234562306a36Sopenharmony_ci 0x8000); 234662306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_DEPOP_1, 0x3000, 234762306a36Sopenharmony_ci 0x3000); 234862306a36Sopenharmony_ci snd_soc_component_update_bits(component, 234962306a36Sopenharmony_ci RT5663_DIG_VOL_ZCD, 0x00c0, 0x0080); 235062306a36Sopenharmony_ci } 235162306a36Sopenharmony_ci break; 235262306a36Sopenharmony_ci 235362306a36Sopenharmony_ci case SND_SOC_DAPM_PRE_PMD: 235462306a36Sopenharmony_ci if (rt5663->codec_ver == CODEC_VER_1) { 235562306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_HP_LOGIC_2, 235662306a36Sopenharmony_ci RT5663_HP_SIG_SRC1_MASK, 235762306a36Sopenharmony_ci RT5663_HP_SIG_SRC1_REG); 235862306a36Sopenharmony_ci } else { 235962306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_DEPOP_1, 0x3000, 0x0); 236062306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_HP_CHARGE_PUMP_1, 236162306a36Sopenharmony_ci RT5663_OVCD_HP_MASK, RT5663_OVCD_HP_EN); 236262306a36Sopenharmony_ci snd_soc_component_update_bits(component, 236362306a36Sopenharmony_ci RT5663_DACREF_LDO, 0x3e0e, 0); 236462306a36Sopenharmony_ci snd_soc_component_update_bits(component, 236562306a36Sopenharmony_ci RT5663_DIG_VOL_ZCD, 0x00c0, 0); 236662306a36Sopenharmony_ci } 236762306a36Sopenharmony_ci break; 236862306a36Sopenharmony_ci 236962306a36Sopenharmony_ci default: 237062306a36Sopenharmony_ci return 0; 237162306a36Sopenharmony_ci } 237262306a36Sopenharmony_ci 237362306a36Sopenharmony_ci return 0; 237462306a36Sopenharmony_ci} 237562306a36Sopenharmony_ci 237662306a36Sopenharmony_cistatic int rt5663_charge_pump_event(struct snd_soc_dapm_widget *w, 237762306a36Sopenharmony_ci struct snd_kcontrol *kcontrol, int event) 237862306a36Sopenharmony_ci{ 237962306a36Sopenharmony_ci struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 238062306a36Sopenharmony_ci struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); 238162306a36Sopenharmony_ci 238262306a36Sopenharmony_ci switch (event) { 238362306a36Sopenharmony_ci case SND_SOC_DAPM_PRE_PMU: 238462306a36Sopenharmony_ci if (rt5663->codec_ver == CODEC_VER_0) { 238562306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_DEPOP_1, 0x0030, 238662306a36Sopenharmony_ci 0x0030); 238762306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_DEPOP_1, 0x0003, 238862306a36Sopenharmony_ci 0x0003); 238962306a36Sopenharmony_ci } 239062306a36Sopenharmony_ci break; 239162306a36Sopenharmony_ci 239262306a36Sopenharmony_ci case SND_SOC_DAPM_POST_PMD: 239362306a36Sopenharmony_ci if (rt5663->codec_ver == CODEC_VER_0) { 239462306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_DEPOP_1, 0x0003, 0); 239562306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_DEPOP_1, 0x0030, 0); 239662306a36Sopenharmony_ci } 239762306a36Sopenharmony_ci break; 239862306a36Sopenharmony_ci 239962306a36Sopenharmony_ci default: 240062306a36Sopenharmony_ci return 0; 240162306a36Sopenharmony_ci } 240262306a36Sopenharmony_ci 240362306a36Sopenharmony_ci return 0; 240462306a36Sopenharmony_ci} 240562306a36Sopenharmony_ci 240662306a36Sopenharmony_cistatic int rt5663_bst2_power(struct snd_soc_dapm_widget *w, 240762306a36Sopenharmony_ci struct snd_kcontrol *kcontrol, int event) 240862306a36Sopenharmony_ci{ 240962306a36Sopenharmony_ci struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 241062306a36Sopenharmony_ci 241162306a36Sopenharmony_ci switch (event) { 241262306a36Sopenharmony_ci case SND_SOC_DAPM_POST_PMU: 241362306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_PWR_ANLG_2, 241462306a36Sopenharmony_ci RT5663_PWR_BST2_MASK | RT5663_PWR_BST2_OP_MASK, 241562306a36Sopenharmony_ci RT5663_PWR_BST2 | RT5663_PWR_BST2_OP); 241662306a36Sopenharmony_ci break; 241762306a36Sopenharmony_ci 241862306a36Sopenharmony_ci case SND_SOC_DAPM_PRE_PMD: 241962306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_PWR_ANLG_2, 242062306a36Sopenharmony_ci RT5663_PWR_BST2_MASK | RT5663_PWR_BST2_OP_MASK, 0); 242162306a36Sopenharmony_ci break; 242262306a36Sopenharmony_ci 242362306a36Sopenharmony_ci default: 242462306a36Sopenharmony_ci return 0; 242562306a36Sopenharmony_ci } 242662306a36Sopenharmony_ci 242762306a36Sopenharmony_ci return 0; 242862306a36Sopenharmony_ci} 242962306a36Sopenharmony_ci 243062306a36Sopenharmony_cistatic int rt5663_pre_div_power(struct snd_soc_dapm_widget *w, 243162306a36Sopenharmony_ci struct snd_kcontrol *kcontrol, int event) 243262306a36Sopenharmony_ci{ 243362306a36Sopenharmony_ci struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); 243462306a36Sopenharmony_ci 243562306a36Sopenharmony_ci switch (event) { 243662306a36Sopenharmony_ci case SND_SOC_DAPM_POST_PMU: 243762306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_PRE_DIV_GATING_1, 0xff00); 243862306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_PRE_DIV_GATING_2, 0xfffc); 243962306a36Sopenharmony_ci break; 244062306a36Sopenharmony_ci 244162306a36Sopenharmony_ci case SND_SOC_DAPM_PRE_PMD: 244262306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_PRE_DIV_GATING_1, 0x0000); 244362306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_PRE_DIV_GATING_2, 0x0000); 244462306a36Sopenharmony_ci break; 244562306a36Sopenharmony_ci 244662306a36Sopenharmony_ci default: 244762306a36Sopenharmony_ci return 0; 244862306a36Sopenharmony_ci } 244962306a36Sopenharmony_ci 245062306a36Sopenharmony_ci return 0; 245162306a36Sopenharmony_ci} 245262306a36Sopenharmony_ci 245362306a36Sopenharmony_cistatic const struct snd_soc_dapm_widget rt5663_dapm_widgets[] = { 245462306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("PLL", RT5663_PWR_ANLG_3, RT5663_PWR_PLL_SHIFT, 0, 245562306a36Sopenharmony_ci NULL, 0), 245662306a36Sopenharmony_ci 245762306a36Sopenharmony_ci /* micbias */ 245862306a36Sopenharmony_ci SND_SOC_DAPM_MICBIAS("MICBIAS1", RT5663_PWR_ANLG_2, 245962306a36Sopenharmony_ci RT5663_PWR_MB1_SHIFT, 0), 246062306a36Sopenharmony_ci SND_SOC_DAPM_MICBIAS("MICBIAS2", RT5663_PWR_ANLG_2, 246162306a36Sopenharmony_ci RT5663_PWR_MB2_SHIFT, 0), 246262306a36Sopenharmony_ci 246362306a36Sopenharmony_ci /* Input Lines */ 246462306a36Sopenharmony_ci SND_SOC_DAPM_INPUT("IN1P"), 246562306a36Sopenharmony_ci SND_SOC_DAPM_INPUT("IN1N"), 246662306a36Sopenharmony_ci 246762306a36Sopenharmony_ci /* REC Mixer Power */ 246862306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("RECMIX1L Power", RT5663_PWR_ANLG_2, 246962306a36Sopenharmony_ci RT5663_PWR_RECMIX1_SHIFT, 0, NULL, 0), 247062306a36Sopenharmony_ci 247162306a36Sopenharmony_ci /* ADCs */ 247262306a36Sopenharmony_ci SND_SOC_DAPM_ADC("ADC L", NULL, SND_SOC_NOPM, 0, 0), 247362306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("ADC L Power", RT5663_PWR_DIG_1, 247462306a36Sopenharmony_ci RT5663_PWR_ADC_L1_SHIFT, 0, NULL, 0), 247562306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("ADC Clock", RT5663_CHOP_ADC, 247662306a36Sopenharmony_ci RT5663_CKGEN_ADCC_SHIFT, 0, NULL, 0), 247762306a36Sopenharmony_ci 247862306a36Sopenharmony_ci /* ADC Mixer */ 247962306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("STO1 ADC MIXL", SND_SOC_NOPM, 248062306a36Sopenharmony_ci 0, 0, rt5663_sto1_adc_l_mix, 248162306a36Sopenharmony_ci ARRAY_SIZE(rt5663_sto1_adc_l_mix)), 248262306a36Sopenharmony_ci 248362306a36Sopenharmony_ci /* ADC Filter Power */ 248462306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("STO1 ADC Filter", RT5663_PWR_DIG_2, 248562306a36Sopenharmony_ci RT5663_PWR_ADC_S1F_SHIFT, 0, NULL, 0), 248662306a36Sopenharmony_ci 248762306a36Sopenharmony_ci /* Digital Interface */ 248862306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("I2S", RT5663_PWR_DIG_1, RT5663_PWR_I2S1_SHIFT, 0, 248962306a36Sopenharmony_ci NULL, 0), 249062306a36Sopenharmony_ci SND_SOC_DAPM_PGA("IF DAC", SND_SOC_NOPM, 0, 0, NULL, 0), 249162306a36Sopenharmony_ci SND_SOC_DAPM_PGA("IF1 DAC1 L", SND_SOC_NOPM, 0, 0, NULL, 0), 249262306a36Sopenharmony_ci SND_SOC_DAPM_PGA("IF1 DAC1 R", SND_SOC_NOPM, 0, 0, NULL, 0), 249362306a36Sopenharmony_ci SND_SOC_DAPM_PGA("IF1 ADC1", SND_SOC_NOPM, 0, 0, NULL, 0), 249462306a36Sopenharmony_ci SND_SOC_DAPM_PGA("IF ADC", SND_SOC_NOPM, 0, 0, NULL, 0), 249562306a36Sopenharmony_ci 249662306a36Sopenharmony_ci /* Audio Interface */ 249762306a36Sopenharmony_ci SND_SOC_DAPM_AIF_IN("AIFRX", "AIF Playback", 0, SND_SOC_NOPM, 0, 0), 249862306a36Sopenharmony_ci SND_SOC_DAPM_AIF_OUT("AIFTX", "AIF Capture", 0, SND_SOC_NOPM, 0, 0), 249962306a36Sopenharmony_ci 250062306a36Sopenharmony_ci /* DAC mixer before sound effect */ 250162306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("ADDA MIXL", SND_SOC_NOPM, 0, 0, rt5663_adda_l_mix, 250262306a36Sopenharmony_ci ARRAY_SIZE(rt5663_adda_l_mix)), 250362306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("ADDA MIXR", SND_SOC_NOPM, 0, 0, rt5663_adda_r_mix, 250462306a36Sopenharmony_ci ARRAY_SIZE(rt5663_adda_r_mix)), 250562306a36Sopenharmony_ci SND_SOC_DAPM_PGA("DAC L1", SND_SOC_NOPM, 0, 0, NULL, 0), 250662306a36Sopenharmony_ci SND_SOC_DAPM_PGA("DAC R1", SND_SOC_NOPM, 0, 0, NULL, 0), 250762306a36Sopenharmony_ci 250862306a36Sopenharmony_ci /* DAC Mixer */ 250962306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("STO1 DAC Filter", RT5663_PWR_DIG_2, 251062306a36Sopenharmony_ci RT5663_PWR_DAC_S1F_SHIFT, 0, NULL, 0), 251162306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("STO1 DAC MIXL", SND_SOC_NOPM, 0, 0, 251262306a36Sopenharmony_ci rt5663_sto1_dac_l_mix, ARRAY_SIZE(rt5663_sto1_dac_l_mix)), 251362306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("STO1 DAC MIXR", SND_SOC_NOPM, 0, 0, 251462306a36Sopenharmony_ci rt5663_sto1_dac_r_mix, ARRAY_SIZE(rt5663_sto1_dac_r_mix)), 251562306a36Sopenharmony_ci 251662306a36Sopenharmony_ci /* DACs */ 251762306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("STO1 DAC L Power", RT5663_PWR_DIG_1, 251862306a36Sopenharmony_ci RT5663_PWR_DAC_L1_SHIFT, 0, NULL, 0), 251962306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("STO1 DAC R Power", RT5663_PWR_DIG_1, 252062306a36Sopenharmony_ci RT5663_PWR_DAC_R1_SHIFT, 0, NULL, 0), 252162306a36Sopenharmony_ci SND_SOC_DAPM_DAC("DAC L", NULL, SND_SOC_NOPM, 0, 0), 252262306a36Sopenharmony_ci SND_SOC_DAPM_DAC("DAC R", NULL, SND_SOC_NOPM, 0, 0), 252362306a36Sopenharmony_ci 252462306a36Sopenharmony_ci /* Headphone*/ 252562306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("HP Charge Pump", SND_SOC_NOPM, 0, 0, 252662306a36Sopenharmony_ci rt5663_charge_pump_event, SND_SOC_DAPM_PRE_PMU | 252762306a36Sopenharmony_ci SND_SOC_DAPM_POST_PMD), 252862306a36Sopenharmony_ci SND_SOC_DAPM_PGA_S("HP Amp", 1, SND_SOC_NOPM, 0, 0, rt5663_hp_event, 252962306a36Sopenharmony_ci SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMU), 253062306a36Sopenharmony_ci 253162306a36Sopenharmony_ci /* Output Lines */ 253262306a36Sopenharmony_ci SND_SOC_DAPM_OUTPUT("HPOL"), 253362306a36Sopenharmony_ci SND_SOC_DAPM_OUTPUT("HPOR"), 253462306a36Sopenharmony_ci}; 253562306a36Sopenharmony_ci 253662306a36Sopenharmony_cistatic const struct snd_soc_dapm_widget rt5663_v2_specific_dapm_widgets[] = { 253762306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("LDO2", RT5663_PWR_ANLG_3, 253862306a36Sopenharmony_ci RT5663_PWR_LDO2_SHIFT, 0, NULL, 0), 253962306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("Mic Det Power", RT5663_PWR_VOL, 254062306a36Sopenharmony_ci RT5663_V2_PWR_MIC_DET_SHIFT, 0, NULL, 0), 254162306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("LDO DAC", RT5663_PWR_DIG_1, 254262306a36Sopenharmony_ci RT5663_PWR_LDO_DACREF_SHIFT, 0, NULL, 0), 254362306a36Sopenharmony_ci 254462306a36Sopenharmony_ci /* ASRC */ 254562306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("I2S ASRC", RT5663_ASRC_1, 254662306a36Sopenharmony_ci RT5663_I2S1_ASRC_SHIFT, 0, NULL, 0), 254762306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("DAC ASRC", RT5663_ASRC_1, 254862306a36Sopenharmony_ci RT5663_DAC_STO1_ASRC_SHIFT, 0, NULL, 0), 254962306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("ADC ASRC", RT5663_ASRC_1, 255062306a36Sopenharmony_ci RT5663_ADC_STO1_ASRC_SHIFT, 0, NULL, 0), 255162306a36Sopenharmony_ci 255262306a36Sopenharmony_ci /* Input Lines */ 255362306a36Sopenharmony_ci SND_SOC_DAPM_INPUT("IN2P"), 255462306a36Sopenharmony_ci SND_SOC_DAPM_INPUT("IN2N"), 255562306a36Sopenharmony_ci 255662306a36Sopenharmony_ci /* Boost */ 255762306a36Sopenharmony_ci SND_SOC_DAPM_PGA("BST1 CBJ", SND_SOC_NOPM, 0, 0, NULL, 0), 255862306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("CBJ Power", RT5663_PWR_ANLG_3, 255962306a36Sopenharmony_ci RT5663_PWR_CBJ_SHIFT, 0, NULL, 0), 256062306a36Sopenharmony_ci SND_SOC_DAPM_PGA("BST2", SND_SOC_NOPM, 0, 0, NULL, 0), 256162306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("BST2 Power", SND_SOC_NOPM, 0, 0, 256262306a36Sopenharmony_ci rt5663_bst2_power, SND_SOC_DAPM_PRE_PMD | 256362306a36Sopenharmony_ci SND_SOC_DAPM_POST_PMU), 256462306a36Sopenharmony_ci 256562306a36Sopenharmony_ci /* REC Mixer */ 256662306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("RECMIX1L", SND_SOC_NOPM, 0, 0, rt5663_recmix1l, 256762306a36Sopenharmony_ci ARRAY_SIZE(rt5663_recmix1l)), 256862306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("RECMIX1R", SND_SOC_NOPM, 0, 0, rt5663_recmix1r, 256962306a36Sopenharmony_ci ARRAY_SIZE(rt5663_recmix1r)), 257062306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("RECMIX1R Power", RT5663_PWR_ANLG_2, 257162306a36Sopenharmony_ci RT5663_PWR_RECMIX2_SHIFT, 0, NULL, 0), 257262306a36Sopenharmony_ci 257362306a36Sopenharmony_ci /* ADC */ 257462306a36Sopenharmony_ci SND_SOC_DAPM_ADC("ADC R", NULL, SND_SOC_NOPM, 0, 0), 257562306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("ADC R Power", RT5663_PWR_DIG_1, 257662306a36Sopenharmony_ci RT5663_PWR_ADC_R1_SHIFT, 0, NULL, 0), 257762306a36Sopenharmony_ci 257862306a36Sopenharmony_ci /* ADC Mux */ 257962306a36Sopenharmony_ci SND_SOC_DAPM_PGA("STO1 ADC L1", RT5663_STO1_ADC_MIXER, 258062306a36Sopenharmony_ci RT5663_STO1_ADC_L1_SRC_SHIFT, 0, NULL, 0), 258162306a36Sopenharmony_ci SND_SOC_DAPM_PGA("STO1 ADC R1", RT5663_STO1_ADC_MIXER, 258262306a36Sopenharmony_ci RT5663_STO1_ADC_R1_SRC_SHIFT, 0, NULL, 0), 258362306a36Sopenharmony_ci SND_SOC_DAPM_PGA("STO1 ADC L2", RT5663_STO1_ADC_MIXER, 258462306a36Sopenharmony_ci RT5663_STO1_ADC_L2_SRC_SHIFT, 1, NULL, 0), 258562306a36Sopenharmony_ci SND_SOC_DAPM_PGA("STO1 ADC R2", RT5663_STO1_ADC_MIXER, 258662306a36Sopenharmony_ci RT5663_STO1_ADC_R2_SRC_SHIFT, 1, NULL, 0), 258762306a36Sopenharmony_ci 258862306a36Sopenharmony_ci SND_SOC_DAPM_MUX("STO1 ADC L Mux", SND_SOC_NOPM, 0, 0, 258962306a36Sopenharmony_ci &rt5663_sto1_adcl_mux), 259062306a36Sopenharmony_ci SND_SOC_DAPM_MUX("STO1 ADC R Mux", SND_SOC_NOPM, 0, 0, 259162306a36Sopenharmony_ci &rt5663_sto1_adcr_mux), 259262306a36Sopenharmony_ci 259362306a36Sopenharmony_ci /* ADC Mix */ 259462306a36Sopenharmony_ci SND_SOC_DAPM_MIXER("STO1 ADC MIXR", SND_SOC_NOPM, 0, 0, 259562306a36Sopenharmony_ci rt5663_sto1_adc_r_mix, ARRAY_SIZE(rt5663_sto1_adc_r_mix)), 259662306a36Sopenharmony_ci 259762306a36Sopenharmony_ci /* Analog DAC Clock */ 259862306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("DAC Clock", RT5663_CHOP_DAC_L, 259962306a36Sopenharmony_ci RT5663_CKGEN_DAC1_SHIFT, 0, NULL, 0), 260062306a36Sopenharmony_ci 260162306a36Sopenharmony_ci /* Headphone out */ 260262306a36Sopenharmony_ci SND_SOC_DAPM_SWITCH("HPO Playback", SND_SOC_NOPM, 0, 0, 260362306a36Sopenharmony_ci &rt5663_hpo_switch), 260462306a36Sopenharmony_ci}; 260562306a36Sopenharmony_ci 260662306a36Sopenharmony_cistatic const struct snd_soc_dapm_widget rt5663_specific_dapm_widgets[] = { 260762306a36Sopenharmony_ci /* System Clock Pre Divider Gating */ 260862306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("Pre Div Power", SND_SOC_NOPM, 0, 0, 260962306a36Sopenharmony_ci rt5663_pre_div_power, SND_SOC_DAPM_POST_PMU | 261062306a36Sopenharmony_ci SND_SOC_DAPM_PRE_PMD), 261162306a36Sopenharmony_ci 261262306a36Sopenharmony_ci /* LDO */ 261362306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("LDO ADC", RT5663_PWR_DIG_1, 261462306a36Sopenharmony_ci RT5663_PWR_LDO_DACREF_SHIFT, 0, NULL, 0), 261562306a36Sopenharmony_ci 261662306a36Sopenharmony_ci /* ASRC */ 261762306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("I2S ASRC", RT5663_ASRC_1, 261862306a36Sopenharmony_ci RT5663_I2S1_ASRC_SHIFT, 0, NULL, 0), 261962306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("DAC ASRC", RT5663_ASRC_1, 262062306a36Sopenharmony_ci RT5663_DAC_STO1_ASRC_SHIFT, 0, NULL, 0), 262162306a36Sopenharmony_ci SND_SOC_DAPM_SUPPLY("ADC ASRC", RT5663_ASRC_1, 262262306a36Sopenharmony_ci RT5663_ADC_STO1_ASRC_SHIFT, 0, NULL, 0), 262362306a36Sopenharmony_ci 262462306a36Sopenharmony_ci /* Boost */ 262562306a36Sopenharmony_ci SND_SOC_DAPM_PGA("BST1", SND_SOC_NOPM, 0, 0, NULL, 0), 262662306a36Sopenharmony_ci 262762306a36Sopenharmony_ci /* STO ADC */ 262862306a36Sopenharmony_ci SND_SOC_DAPM_PGA("STO1 ADC L1", SND_SOC_NOPM, 0, 0, NULL, 0), 262962306a36Sopenharmony_ci SND_SOC_DAPM_PGA("STO1 ADC L2", SND_SOC_NOPM, 0, 0, NULL, 0), 263062306a36Sopenharmony_ci 263162306a36Sopenharmony_ci /* Analog DAC source */ 263262306a36Sopenharmony_ci SND_SOC_DAPM_MUX("DAC L Mux", SND_SOC_NOPM, 0, 0, &rt5663_alg_dacl_mux), 263362306a36Sopenharmony_ci SND_SOC_DAPM_MUX("DAC R Mux", SND_SOC_NOPM, 0, 0, &rt5663_alg_dacr_mux), 263462306a36Sopenharmony_ci}; 263562306a36Sopenharmony_ci 263662306a36Sopenharmony_cistatic const struct snd_soc_dapm_route rt5663_dapm_routes[] = { 263762306a36Sopenharmony_ci /* PLL */ 263862306a36Sopenharmony_ci { "I2S", NULL, "PLL", rt5663_is_sys_clk_from_pll }, 263962306a36Sopenharmony_ci 264062306a36Sopenharmony_ci /* ASRC */ 264162306a36Sopenharmony_ci { "STO1 ADC Filter", NULL, "ADC ASRC", rt5663_is_using_asrc }, 264262306a36Sopenharmony_ci { "STO1 DAC Filter", NULL, "DAC ASRC", rt5663_is_using_asrc }, 264362306a36Sopenharmony_ci { "I2S", NULL, "I2S ASRC", rt5663_i2s_use_asrc }, 264462306a36Sopenharmony_ci 264562306a36Sopenharmony_ci { "ADC L", NULL, "ADC L Power" }, 264662306a36Sopenharmony_ci { "ADC L", NULL, "ADC Clock" }, 264762306a36Sopenharmony_ci 264862306a36Sopenharmony_ci { "STO1 ADC L2", NULL, "STO1 DAC MIXL" }, 264962306a36Sopenharmony_ci 265062306a36Sopenharmony_ci { "STO1 ADC MIXL", "ADC1 Switch", "STO1 ADC L1" }, 265162306a36Sopenharmony_ci { "STO1 ADC MIXL", "ADC2 Switch", "STO1 ADC L2" }, 265262306a36Sopenharmony_ci { "STO1 ADC MIXL", NULL, "STO1 ADC Filter" }, 265362306a36Sopenharmony_ci 265462306a36Sopenharmony_ci { "IF1 ADC1", NULL, "STO1 ADC MIXL" }, 265562306a36Sopenharmony_ci { "IF ADC", NULL, "IF1 ADC1" }, 265662306a36Sopenharmony_ci { "AIFTX", NULL, "IF ADC" }, 265762306a36Sopenharmony_ci { "AIFTX", NULL, "I2S" }, 265862306a36Sopenharmony_ci 265962306a36Sopenharmony_ci { "AIFRX", NULL, "I2S" }, 266062306a36Sopenharmony_ci { "IF DAC", NULL, "AIFRX" }, 266162306a36Sopenharmony_ci { "IF1 DAC1 L", NULL, "IF DAC" }, 266262306a36Sopenharmony_ci { "IF1 DAC1 R", NULL, "IF DAC" }, 266362306a36Sopenharmony_ci 266462306a36Sopenharmony_ci { "ADDA MIXL", "ADC L Switch", "STO1 ADC MIXL" }, 266562306a36Sopenharmony_ci { "ADDA MIXL", "DAC L Switch", "IF1 DAC1 L" }, 266662306a36Sopenharmony_ci { "ADDA MIXL", NULL, "STO1 DAC Filter" }, 266762306a36Sopenharmony_ci { "ADDA MIXL", NULL, "STO1 DAC L Power" }, 266862306a36Sopenharmony_ci { "ADDA MIXR", "DAC R Switch", "IF1 DAC1 R" }, 266962306a36Sopenharmony_ci { "ADDA MIXR", NULL, "STO1 DAC Filter" }, 267062306a36Sopenharmony_ci { "ADDA MIXR", NULL, "STO1 DAC R Power" }, 267162306a36Sopenharmony_ci 267262306a36Sopenharmony_ci { "DAC L1", NULL, "ADDA MIXL" }, 267362306a36Sopenharmony_ci { "DAC R1", NULL, "ADDA MIXR" }, 267462306a36Sopenharmony_ci 267562306a36Sopenharmony_ci { "STO1 DAC MIXL", "DAC L Switch", "DAC L1" }, 267662306a36Sopenharmony_ci { "STO1 DAC MIXL", NULL, "STO1 DAC L Power" }, 267762306a36Sopenharmony_ci { "STO1 DAC MIXL", NULL, "STO1 DAC Filter" }, 267862306a36Sopenharmony_ci { "STO1 DAC MIXR", "DAC R Switch", "DAC R1" }, 267962306a36Sopenharmony_ci { "STO1 DAC MIXR", NULL, "STO1 DAC R Power" }, 268062306a36Sopenharmony_ci { "STO1 DAC MIXR", NULL, "STO1 DAC Filter" }, 268162306a36Sopenharmony_ci 268262306a36Sopenharmony_ci { "HP Amp", NULL, "HP Charge Pump" }, 268362306a36Sopenharmony_ci { "HP Amp", NULL, "DAC L" }, 268462306a36Sopenharmony_ci { "HP Amp", NULL, "DAC R" }, 268562306a36Sopenharmony_ci}; 268662306a36Sopenharmony_ci 268762306a36Sopenharmony_cistatic const struct snd_soc_dapm_route rt5663_v2_specific_dapm_routes[] = { 268862306a36Sopenharmony_ci { "MICBIAS1", NULL, "LDO2" }, 268962306a36Sopenharmony_ci { "MICBIAS2", NULL, "LDO2" }, 269062306a36Sopenharmony_ci 269162306a36Sopenharmony_ci { "BST1 CBJ", NULL, "IN1P" }, 269262306a36Sopenharmony_ci { "BST1 CBJ", NULL, "IN1N" }, 269362306a36Sopenharmony_ci { "BST1 CBJ", NULL, "CBJ Power" }, 269462306a36Sopenharmony_ci 269562306a36Sopenharmony_ci { "BST2", NULL, "IN2P" }, 269662306a36Sopenharmony_ci { "BST2", NULL, "IN2N" }, 269762306a36Sopenharmony_ci { "BST2", NULL, "BST2 Power" }, 269862306a36Sopenharmony_ci 269962306a36Sopenharmony_ci { "RECMIX1L", "BST2 Switch", "BST2" }, 270062306a36Sopenharmony_ci { "RECMIX1L", "BST1 CBJ Switch", "BST1 CBJ" }, 270162306a36Sopenharmony_ci { "RECMIX1L", NULL, "RECMIX1L Power" }, 270262306a36Sopenharmony_ci { "RECMIX1R", "BST2 Switch", "BST2" }, 270362306a36Sopenharmony_ci { "RECMIX1R", NULL, "RECMIX1R Power" }, 270462306a36Sopenharmony_ci 270562306a36Sopenharmony_ci { "ADC L", NULL, "RECMIX1L" }, 270662306a36Sopenharmony_ci { "ADC R", NULL, "RECMIX1R" }, 270762306a36Sopenharmony_ci { "ADC R", NULL, "ADC R Power" }, 270862306a36Sopenharmony_ci { "ADC R", NULL, "ADC Clock" }, 270962306a36Sopenharmony_ci 271062306a36Sopenharmony_ci { "STO1 ADC L Mux", "ADC L", "ADC L" }, 271162306a36Sopenharmony_ci { "STO1 ADC L Mux", "ADC R", "ADC R" }, 271262306a36Sopenharmony_ci { "STO1 ADC L1", NULL, "STO1 ADC L Mux" }, 271362306a36Sopenharmony_ci 271462306a36Sopenharmony_ci { "STO1 ADC R Mux", "ADC L", "ADC L" }, 271562306a36Sopenharmony_ci { "STO1 ADC R Mux", "ADC R", "ADC R" }, 271662306a36Sopenharmony_ci { "STO1 ADC R1", NULL, "STO1 ADC R Mux" }, 271762306a36Sopenharmony_ci { "STO1 ADC R2", NULL, "STO1 DAC MIXR" }, 271862306a36Sopenharmony_ci 271962306a36Sopenharmony_ci { "STO1 ADC MIXR", "ADC1 Switch", "STO1 ADC R1" }, 272062306a36Sopenharmony_ci { "STO1 ADC MIXR", "ADC2 Switch", "STO1 ADC R2" }, 272162306a36Sopenharmony_ci { "STO1 ADC MIXR", NULL, "STO1 ADC Filter" }, 272262306a36Sopenharmony_ci 272362306a36Sopenharmony_ci { "IF1 ADC1", NULL, "STO1 ADC MIXR" }, 272462306a36Sopenharmony_ci 272562306a36Sopenharmony_ci { "ADDA MIXR", "ADC R Switch", "STO1 ADC MIXR" }, 272662306a36Sopenharmony_ci 272762306a36Sopenharmony_ci { "DAC L", NULL, "STO1 DAC MIXL" }, 272862306a36Sopenharmony_ci { "DAC L", NULL, "LDO DAC" }, 272962306a36Sopenharmony_ci { "DAC L", NULL, "DAC Clock" }, 273062306a36Sopenharmony_ci { "DAC R", NULL, "STO1 DAC MIXR" }, 273162306a36Sopenharmony_ci { "DAC R", NULL, "LDO DAC" }, 273262306a36Sopenharmony_ci { "DAC R", NULL, "DAC Clock" }, 273362306a36Sopenharmony_ci 273462306a36Sopenharmony_ci { "HPO Playback", "Switch", "HP Amp" }, 273562306a36Sopenharmony_ci { "HPOL", NULL, "HPO Playback" }, 273662306a36Sopenharmony_ci { "HPOR", NULL, "HPO Playback" }, 273762306a36Sopenharmony_ci}; 273862306a36Sopenharmony_ci 273962306a36Sopenharmony_cistatic const struct snd_soc_dapm_route rt5663_specific_dapm_routes[] = { 274062306a36Sopenharmony_ci { "I2S", NULL, "Pre Div Power" }, 274162306a36Sopenharmony_ci 274262306a36Sopenharmony_ci { "BST1", NULL, "IN1P" }, 274362306a36Sopenharmony_ci { "BST1", NULL, "IN1N" }, 274462306a36Sopenharmony_ci { "BST1", NULL, "RECMIX1L Power" }, 274562306a36Sopenharmony_ci 274662306a36Sopenharmony_ci { "ADC L", NULL, "BST1" }, 274762306a36Sopenharmony_ci 274862306a36Sopenharmony_ci { "STO1 ADC L1", NULL, "ADC L" }, 274962306a36Sopenharmony_ci 275062306a36Sopenharmony_ci { "DAC L Mux", "DAC L", "DAC L1" }, 275162306a36Sopenharmony_ci { "DAC L Mux", "STO DAC MIXL", "STO1 DAC MIXL" }, 275262306a36Sopenharmony_ci { "DAC R Mux", "DAC R", "DAC R1"}, 275362306a36Sopenharmony_ci { "DAC R Mux", "STO DAC MIXR", "STO1 DAC MIXR" }, 275462306a36Sopenharmony_ci 275562306a36Sopenharmony_ci { "DAC L", NULL, "DAC L Mux" }, 275662306a36Sopenharmony_ci { "DAC R", NULL, "DAC R Mux" }, 275762306a36Sopenharmony_ci 275862306a36Sopenharmony_ci { "HPOL", NULL, "HP Amp" }, 275962306a36Sopenharmony_ci { "HPOR", NULL, "HP Amp" }, 276062306a36Sopenharmony_ci}; 276162306a36Sopenharmony_ci 276262306a36Sopenharmony_cistatic int rt5663_hw_params(struct snd_pcm_substream *substream, 276362306a36Sopenharmony_ci struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) 276462306a36Sopenharmony_ci{ 276562306a36Sopenharmony_ci struct snd_soc_component *component = dai->component; 276662306a36Sopenharmony_ci struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); 276762306a36Sopenharmony_ci unsigned int val_len = 0; 276862306a36Sopenharmony_ci int pre_div; 276962306a36Sopenharmony_ci 277062306a36Sopenharmony_ci rt5663->lrck = params_rate(params); 277162306a36Sopenharmony_ci 277262306a36Sopenharmony_ci dev_dbg(dai->dev, "bclk is %dHz and sysclk is %dHz\n", 277362306a36Sopenharmony_ci rt5663->lrck, rt5663->sysclk); 277462306a36Sopenharmony_ci 277562306a36Sopenharmony_ci pre_div = rl6231_get_clk_info(rt5663->sysclk, rt5663->lrck); 277662306a36Sopenharmony_ci if (pre_div < 0) { 277762306a36Sopenharmony_ci dev_err(component->dev, "Unsupported clock setting %d for DAI %d\n", 277862306a36Sopenharmony_ci rt5663->lrck, dai->id); 277962306a36Sopenharmony_ci return -EINVAL; 278062306a36Sopenharmony_ci } 278162306a36Sopenharmony_ci 278262306a36Sopenharmony_ci dev_dbg(dai->dev, "pre_div is %d for iis %d\n", pre_div, dai->id); 278362306a36Sopenharmony_ci 278462306a36Sopenharmony_ci switch (params_width(params)) { 278562306a36Sopenharmony_ci case 8: 278662306a36Sopenharmony_ci val_len = RT5663_I2S_DL_8; 278762306a36Sopenharmony_ci break; 278862306a36Sopenharmony_ci case 16: 278962306a36Sopenharmony_ci val_len = RT5663_I2S_DL_16; 279062306a36Sopenharmony_ci break; 279162306a36Sopenharmony_ci case 20: 279262306a36Sopenharmony_ci val_len = RT5663_I2S_DL_20; 279362306a36Sopenharmony_ci break; 279462306a36Sopenharmony_ci case 24: 279562306a36Sopenharmony_ci val_len = RT5663_I2S_DL_24; 279662306a36Sopenharmony_ci break; 279762306a36Sopenharmony_ci default: 279862306a36Sopenharmony_ci return -EINVAL; 279962306a36Sopenharmony_ci } 280062306a36Sopenharmony_ci 280162306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_I2S1_SDP, 280262306a36Sopenharmony_ci RT5663_I2S_DL_MASK, val_len); 280362306a36Sopenharmony_ci 280462306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_ADDA_CLK_1, 280562306a36Sopenharmony_ci RT5663_I2S_PD1_MASK, pre_div << RT5663_I2S_PD1_SHIFT); 280662306a36Sopenharmony_ci 280762306a36Sopenharmony_ci return 0; 280862306a36Sopenharmony_ci} 280962306a36Sopenharmony_ci 281062306a36Sopenharmony_cistatic int rt5663_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt) 281162306a36Sopenharmony_ci{ 281262306a36Sopenharmony_ci struct snd_soc_component *component = dai->component; 281362306a36Sopenharmony_ci unsigned int reg_val = 0; 281462306a36Sopenharmony_ci 281562306a36Sopenharmony_ci switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { 281662306a36Sopenharmony_ci case SND_SOC_DAIFMT_CBM_CFM: 281762306a36Sopenharmony_ci break; 281862306a36Sopenharmony_ci case SND_SOC_DAIFMT_CBS_CFS: 281962306a36Sopenharmony_ci reg_val |= RT5663_I2S_MS_S; 282062306a36Sopenharmony_ci break; 282162306a36Sopenharmony_ci default: 282262306a36Sopenharmony_ci return -EINVAL; 282362306a36Sopenharmony_ci } 282462306a36Sopenharmony_ci 282562306a36Sopenharmony_ci switch (fmt & SND_SOC_DAIFMT_INV_MASK) { 282662306a36Sopenharmony_ci case SND_SOC_DAIFMT_NB_NF: 282762306a36Sopenharmony_ci break; 282862306a36Sopenharmony_ci case SND_SOC_DAIFMT_IB_NF: 282962306a36Sopenharmony_ci reg_val |= RT5663_I2S_BP_INV; 283062306a36Sopenharmony_ci break; 283162306a36Sopenharmony_ci default: 283262306a36Sopenharmony_ci return -EINVAL; 283362306a36Sopenharmony_ci } 283462306a36Sopenharmony_ci 283562306a36Sopenharmony_ci switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { 283662306a36Sopenharmony_ci case SND_SOC_DAIFMT_I2S: 283762306a36Sopenharmony_ci break; 283862306a36Sopenharmony_ci case SND_SOC_DAIFMT_LEFT_J: 283962306a36Sopenharmony_ci reg_val |= RT5663_I2S_DF_LEFT; 284062306a36Sopenharmony_ci break; 284162306a36Sopenharmony_ci case SND_SOC_DAIFMT_DSP_A: 284262306a36Sopenharmony_ci reg_val |= RT5663_I2S_DF_PCM_A; 284362306a36Sopenharmony_ci break; 284462306a36Sopenharmony_ci case SND_SOC_DAIFMT_DSP_B: 284562306a36Sopenharmony_ci reg_val |= RT5663_I2S_DF_PCM_B; 284662306a36Sopenharmony_ci break; 284762306a36Sopenharmony_ci default: 284862306a36Sopenharmony_ci return -EINVAL; 284962306a36Sopenharmony_ci } 285062306a36Sopenharmony_ci 285162306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_I2S1_SDP, RT5663_I2S_MS_MASK | 285262306a36Sopenharmony_ci RT5663_I2S_BP_MASK | RT5663_I2S_DF_MASK, reg_val); 285362306a36Sopenharmony_ci 285462306a36Sopenharmony_ci return 0; 285562306a36Sopenharmony_ci} 285662306a36Sopenharmony_ci 285762306a36Sopenharmony_cistatic int rt5663_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id, 285862306a36Sopenharmony_ci unsigned int freq, int dir) 285962306a36Sopenharmony_ci{ 286062306a36Sopenharmony_ci struct snd_soc_component *component = dai->component; 286162306a36Sopenharmony_ci struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); 286262306a36Sopenharmony_ci unsigned int reg_val = 0; 286362306a36Sopenharmony_ci 286462306a36Sopenharmony_ci if (freq == rt5663->sysclk && clk_id == rt5663->sysclk_src) 286562306a36Sopenharmony_ci return 0; 286662306a36Sopenharmony_ci 286762306a36Sopenharmony_ci switch (clk_id) { 286862306a36Sopenharmony_ci case RT5663_SCLK_S_MCLK: 286962306a36Sopenharmony_ci reg_val |= RT5663_SCLK_SRC_MCLK; 287062306a36Sopenharmony_ci break; 287162306a36Sopenharmony_ci case RT5663_SCLK_S_PLL1: 287262306a36Sopenharmony_ci reg_val |= RT5663_SCLK_SRC_PLL1; 287362306a36Sopenharmony_ci break; 287462306a36Sopenharmony_ci case RT5663_SCLK_S_RCCLK: 287562306a36Sopenharmony_ci reg_val |= RT5663_SCLK_SRC_RCCLK; 287662306a36Sopenharmony_ci break; 287762306a36Sopenharmony_ci default: 287862306a36Sopenharmony_ci dev_err(component->dev, "Invalid clock id (%d)\n", clk_id); 287962306a36Sopenharmony_ci return -EINVAL; 288062306a36Sopenharmony_ci } 288162306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_GLB_CLK, RT5663_SCLK_SRC_MASK, 288262306a36Sopenharmony_ci reg_val); 288362306a36Sopenharmony_ci rt5663->sysclk = freq; 288462306a36Sopenharmony_ci rt5663->sysclk_src = clk_id; 288562306a36Sopenharmony_ci 288662306a36Sopenharmony_ci dev_dbg(component->dev, "Sysclk is %dHz and clock id is %d\n", 288762306a36Sopenharmony_ci freq, clk_id); 288862306a36Sopenharmony_ci 288962306a36Sopenharmony_ci return 0; 289062306a36Sopenharmony_ci} 289162306a36Sopenharmony_ci 289262306a36Sopenharmony_cistatic int rt5663_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source, 289362306a36Sopenharmony_ci unsigned int freq_in, unsigned int freq_out) 289462306a36Sopenharmony_ci{ 289562306a36Sopenharmony_ci struct snd_soc_component *component = dai->component; 289662306a36Sopenharmony_ci struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); 289762306a36Sopenharmony_ci struct rl6231_pll_code pll_code; 289862306a36Sopenharmony_ci int ret; 289962306a36Sopenharmony_ci int mask, shift, val; 290062306a36Sopenharmony_ci 290162306a36Sopenharmony_ci if (source == rt5663->pll_src && freq_in == rt5663->pll_in && 290262306a36Sopenharmony_ci freq_out == rt5663->pll_out) 290362306a36Sopenharmony_ci return 0; 290462306a36Sopenharmony_ci 290562306a36Sopenharmony_ci if (!freq_in || !freq_out) { 290662306a36Sopenharmony_ci dev_dbg(component->dev, "PLL disabled\n"); 290762306a36Sopenharmony_ci 290862306a36Sopenharmony_ci rt5663->pll_in = 0; 290962306a36Sopenharmony_ci rt5663->pll_out = 0; 291062306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_GLB_CLK, 291162306a36Sopenharmony_ci RT5663_SCLK_SRC_MASK, RT5663_SCLK_SRC_MCLK); 291262306a36Sopenharmony_ci return 0; 291362306a36Sopenharmony_ci } 291462306a36Sopenharmony_ci 291562306a36Sopenharmony_ci switch (rt5663->codec_ver) { 291662306a36Sopenharmony_ci case CODEC_VER_1: 291762306a36Sopenharmony_ci mask = RT5663_V2_PLL1_SRC_MASK; 291862306a36Sopenharmony_ci shift = RT5663_V2_PLL1_SRC_SHIFT; 291962306a36Sopenharmony_ci break; 292062306a36Sopenharmony_ci case CODEC_VER_0: 292162306a36Sopenharmony_ci mask = RT5663_PLL1_SRC_MASK; 292262306a36Sopenharmony_ci shift = RT5663_PLL1_SRC_SHIFT; 292362306a36Sopenharmony_ci break; 292462306a36Sopenharmony_ci default: 292562306a36Sopenharmony_ci dev_err(component->dev, "Unknown CODEC Version\n"); 292662306a36Sopenharmony_ci return -EINVAL; 292762306a36Sopenharmony_ci } 292862306a36Sopenharmony_ci 292962306a36Sopenharmony_ci switch (source) { 293062306a36Sopenharmony_ci case RT5663_PLL1_S_MCLK: 293162306a36Sopenharmony_ci val = 0x0; 293262306a36Sopenharmony_ci break; 293362306a36Sopenharmony_ci case RT5663_PLL1_S_BCLK1: 293462306a36Sopenharmony_ci val = 0x1; 293562306a36Sopenharmony_ci break; 293662306a36Sopenharmony_ci default: 293762306a36Sopenharmony_ci dev_err(component->dev, "Unknown PLL source %d\n", source); 293862306a36Sopenharmony_ci return -EINVAL; 293962306a36Sopenharmony_ci } 294062306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_GLB_CLK, mask, (val << shift)); 294162306a36Sopenharmony_ci 294262306a36Sopenharmony_ci ret = rl6231_pll_calc(freq_in, freq_out, &pll_code); 294362306a36Sopenharmony_ci if (ret < 0) { 294462306a36Sopenharmony_ci dev_err(component->dev, "Unsupported input clock %d\n", freq_in); 294562306a36Sopenharmony_ci return ret; 294662306a36Sopenharmony_ci } 294762306a36Sopenharmony_ci 294862306a36Sopenharmony_ci dev_dbg(component->dev, "bypass=%d m=%d n=%d k=%d\n", pll_code.m_bp, 294962306a36Sopenharmony_ci (pll_code.m_bp ? 0 : pll_code.m_code), pll_code.n_code, 295062306a36Sopenharmony_ci pll_code.k_code); 295162306a36Sopenharmony_ci 295262306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_PLL_1, 295362306a36Sopenharmony_ci pll_code.n_code << RT5663_PLL_N_SHIFT | pll_code.k_code); 295462306a36Sopenharmony_ci snd_soc_component_write(component, RT5663_PLL_2, 295562306a36Sopenharmony_ci ((pll_code.m_bp ? 0 : pll_code.m_code) << RT5663_PLL_M_SHIFT) | 295662306a36Sopenharmony_ci (pll_code.m_bp << RT5663_PLL_M_BP_SHIFT)); 295762306a36Sopenharmony_ci 295862306a36Sopenharmony_ci rt5663->pll_in = freq_in; 295962306a36Sopenharmony_ci rt5663->pll_out = freq_out; 296062306a36Sopenharmony_ci rt5663->pll_src = source; 296162306a36Sopenharmony_ci 296262306a36Sopenharmony_ci return 0; 296362306a36Sopenharmony_ci} 296462306a36Sopenharmony_ci 296562306a36Sopenharmony_cistatic int rt5663_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, 296662306a36Sopenharmony_ci unsigned int rx_mask, int slots, int slot_width) 296762306a36Sopenharmony_ci{ 296862306a36Sopenharmony_ci struct snd_soc_component *component = dai->component; 296962306a36Sopenharmony_ci struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); 297062306a36Sopenharmony_ci unsigned int val = 0, reg; 297162306a36Sopenharmony_ci 297262306a36Sopenharmony_ci if (rx_mask || tx_mask) 297362306a36Sopenharmony_ci val |= RT5663_TDM_MODE_TDM; 297462306a36Sopenharmony_ci 297562306a36Sopenharmony_ci switch (slots) { 297662306a36Sopenharmony_ci case 4: 297762306a36Sopenharmony_ci val |= RT5663_TDM_IN_CH_4; 297862306a36Sopenharmony_ci val |= RT5663_TDM_OUT_CH_4; 297962306a36Sopenharmony_ci break; 298062306a36Sopenharmony_ci case 6: 298162306a36Sopenharmony_ci val |= RT5663_TDM_IN_CH_6; 298262306a36Sopenharmony_ci val |= RT5663_TDM_OUT_CH_6; 298362306a36Sopenharmony_ci break; 298462306a36Sopenharmony_ci case 8: 298562306a36Sopenharmony_ci val |= RT5663_TDM_IN_CH_8; 298662306a36Sopenharmony_ci val |= RT5663_TDM_OUT_CH_8; 298762306a36Sopenharmony_ci break; 298862306a36Sopenharmony_ci case 2: 298962306a36Sopenharmony_ci break; 299062306a36Sopenharmony_ci default: 299162306a36Sopenharmony_ci return -EINVAL; 299262306a36Sopenharmony_ci } 299362306a36Sopenharmony_ci 299462306a36Sopenharmony_ci switch (slot_width) { 299562306a36Sopenharmony_ci case 20: 299662306a36Sopenharmony_ci val |= RT5663_TDM_IN_LEN_20; 299762306a36Sopenharmony_ci val |= RT5663_TDM_OUT_LEN_20; 299862306a36Sopenharmony_ci break; 299962306a36Sopenharmony_ci case 24: 300062306a36Sopenharmony_ci val |= RT5663_TDM_IN_LEN_24; 300162306a36Sopenharmony_ci val |= RT5663_TDM_OUT_LEN_24; 300262306a36Sopenharmony_ci break; 300362306a36Sopenharmony_ci case 32: 300462306a36Sopenharmony_ci val |= RT5663_TDM_IN_LEN_32; 300562306a36Sopenharmony_ci val |= RT5663_TDM_OUT_LEN_32; 300662306a36Sopenharmony_ci break; 300762306a36Sopenharmony_ci case 16: 300862306a36Sopenharmony_ci break; 300962306a36Sopenharmony_ci default: 301062306a36Sopenharmony_ci return -EINVAL; 301162306a36Sopenharmony_ci } 301262306a36Sopenharmony_ci 301362306a36Sopenharmony_ci switch (rt5663->codec_ver) { 301462306a36Sopenharmony_ci case CODEC_VER_1: 301562306a36Sopenharmony_ci reg = RT5663_TDM_2; 301662306a36Sopenharmony_ci break; 301762306a36Sopenharmony_ci case CODEC_VER_0: 301862306a36Sopenharmony_ci reg = RT5663_TDM_1; 301962306a36Sopenharmony_ci break; 302062306a36Sopenharmony_ci default: 302162306a36Sopenharmony_ci dev_err(component->dev, "Unknown CODEC Version\n"); 302262306a36Sopenharmony_ci return -EINVAL; 302362306a36Sopenharmony_ci } 302462306a36Sopenharmony_ci 302562306a36Sopenharmony_ci snd_soc_component_update_bits(component, reg, RT5663_TDM_MODE_MASK | 302662306a36Sopenharmony_ci RT5663_TDM_IN_CH_MASK | RT5663_TDM_OUT_CH_MASK | 302762306a36Sopenharmony_ci RT5663_TDM_IN_LEN_MASK | RT5663_TDM_OUT_LEN_MASK, val); 302862306a36Sopenharmony_ci 302962306a36Sopenharmony_ci return 0; 303062306a36Sopenharmony_ci} 303162306a36Sopenharmony_ci 303262306a36Sopenharmony_cistatic int rt5663_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio) 303362306a36Sopenharmony_ci{ 303462306a36Sopenharmony_ci struct snd_soc_component *component = dai->component; 303562306a36Sopenharmony_ci struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); 303662306a36Sopenharmony_ci unsigned int reg; 303762306a36Sopenharmony_ci 303862306a36Sopenharmony_ci dev_dbg(component->dev, "%s ratio = %d\n", __func__, ratio); 303962306a36Sopenharmony_ci 304062306a36Sopenharmony_ci if (rt5663->codec_ver == CODEC_VER_1) 304162306a36Sopenharmony_ci reg = RT5663_TDM_9; 304262306a36Sopenharmony_ci else 304362306a36Sopenharmony_ci reg = RT5663_TDM_5; 304462306a36Sopenharmony_ci 304562306a36Sopenharmony_ci switch (ratio) { 304662306a36Sopenharmony_ci case 32: 304762306a36Sopenharmony_ci snd_soc_component_update_bits(component, reg, 304862306a36Sopenharmony_ci RT5663_TDM_LENGTN_MASK, 304962306a36Sopenharmony_ci RT5663_TDM_LENGTN_16); 305062306a36Sopenharmony_ci break; 305162306a36Sopenharmony_ci case 40: 305262306a36Sopenharmony_ci snd_soc_component_update_bits(component, reg, 305362306a36Sopenharmony_ci RT5663_TDM_LENGTN_MASK, 305462306a36Sopenharmony_ci RT5663_TDM_LENGTN_20); 305562306a36Sopenharmony_ci break; 305662306a36Sopenharmony_ci case 48: 305762306a36Sopenharmony_ci snd_soc_component_update_bits(component, reg, 305862306a36Sopenharmony_ci RT5663_TDM_LENGTN_MASK, 305962306a36Sopenharmony_ci RT5663_TDM_LENGTN_24); 306062306a36Sopenharmony_ci break; 306162306a36Sopenharmony_ci case 64: 306262306a36Sopenharmony_ci snd_soc_component_update_bits(component, reg, 306362306a36Sopenharmony_ci RT5663_TDM_LENGTN_MASK, 306462306a36Sopenharmony_ci RT5663_TDM_LENGTN_32); 306562306a36Sopenharmony_ci break; 306662306a36Sopenharmony_ci default: 306762306a36Sopenharmony_ci dev_err(component->dev, "Invalid ratio!\n"); 306862306a36Sopenharmony_ci return -EINVAL; 306962306a36Sopenharmony_ci } 307062306a36Sopenharmony_ci 307162306a36Sopenharmony_ci return 0; 307262306a36Sopenharmony_ci} 307362306a36Sopenharmony_ci 307462306a36Sopenharmony_cistatic int rt5663_set_bias_level(struct snd_soc_component *component, 307562306a36Sopenharmony_ci enum snd_soc_bias_level level) 307662306a36Sopenharmony_ci{ 307762306a36Sopenharmony_ci struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); 307862306a36Sopenharmony_ci 307962306a36Sopenharmony_ci switch (level) { 308062306a36Sopenharmony_ci case SND_SOC_BIAS_ON: 308162306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_PWR_ANLG_1, 308262306a36Sopenharmony_ci RT5663_PWR_FV1_MASK | RT5663_PWR_FV2_MASK, 308362306a36Sopenharmony_ci RT5663_PWR_FV1 | RT5663_PWR_FV2); 308462306a36Sopenharmony_ci break; 308562306a36Sopenharmony_ci 308662306a36Sopenharmony_ci case SND_SOC_BIAS_PREPARE: 308762306a36Sopenharmony_ci if (rt5663->codec_ver == CODEC_VER_1) { 308862306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_DIG_MISC, 308962306a36Sopenharmony_ci RT5663_DIG_GATE_CTRL_MASK, 309062306a36Sopenharmony_ci RT5663_DIG_GATE_CTRL_EN); 309162306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_SIG_CLK_DET, 309262306a36Sopenharmony_ci RT5663_EN_ANA_CLK_DET_MASK | 309362306a36Sopenharmony_ci RT5663_PWR_CLK_DET_MASK, 309462306a36Sopenharmony_ci RT5663_EN_ANA_CLK_DET_AUTO | 309562306a36Sopenharmony_ci RT5663_PWR_CLK_DET_EN); 309662306a36Sopenharmony_ci } 309762306a36Sopenharmony_ci break; 309862306a36Sopenharmony_ci 309962306a36Sopenharmony_ci case SND_SOC_BIAS_STANDBY: 310062306a36Sopenharmony_ci if (rt5663->codec_ver == CODEC_VER_1) 310162306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_DIG_MISC, 310262306a36Sopenharmony_ci RT5663_DIG_GATE_CTRL_MASK, 310362306a36Sopenharmony_ci RT5663_DIG_GATE_CTRL_DIS); 310462306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_PWR_ANLG_1, 310562306a36Sopenharmony_ci RT5663_PWR_VREF1_MASK | RT5663_PWR_VREF2_MASK | 310662306a36Sopenharmony_ci RT5663_PWR_FV1_MASK | RT5663_PWR_FV2_MASK | 310762306a36Sopenharmony_ci RT5663_PWR_MB_MASK, RT5663_PWR_VREF1 | 310862306a36Sopenharmony_ci RT5663_PWR_VREF2 | RT5663_PWR_MB); 310962306a36Sopenharmony_ci usleep_range(10000, 10005); 311062306a36Sopenharmony_ci if (rt5663->codec_ver == CODEC_VER_1) { 311162306a36Sopenharmony_ci snd_soc_component_update_bits(component, RT5663_SIG_CLK_DET, 311262306a36Sopenharmony_ci RT5663_EN_ANA_CLK_DET_MASK | 311362306a36Sopenharmony_ci RT5663_PWR_CLK_DET_MASK, 311462306a36Sopenharmony_ci RT5663_EN_ANA_CLK_DET_DIS | 311562306a36Sopenharmony_ci RT5663_PWR_CLK_DET_DIS); 311662306a36Sopenharmony_ci } 311762306a36Sopenharmony_ci break; 311862306a36Sopenharmony_ci 311962306a36Sopenharmony_ci case SND_SOC_BIAS_OFF: 312062306a36Sopenharmony_ci if (rt5663->jack_type != SND_JACK_HEADSET) 312162306a36Sopenharmony_ci snd_soc_component_update_bits(component, 312262306a36Sopenharmony_ci RT5663_PWR_ANLG_1, 312362306a36Sopenharmony_ci RT5663_PWR_VREF1_MASK | RT5663_PWR_VREF2_MASK | 312462306a36Sopenharmony_ci RT5663_PWR_FV1 | RT5663_PWR_FV2 | 312562306a36Sopenharmony_ci RT5663_PWR_MB_MASK, 0); 312662306a36Sopenharmony_ci else 312762306a36Sopenharmony_ci snd_soc_component_update_bits(component, 312862306a36Sopenharmony_ci RT5663_PWR_ANLG_1, 312962306a36Sopenharmony_ci RT5663_PWR_FV1_MASK | RT5663_PWR_FV2_MASK, 313062306a36Sopenharmony_ci RT5663_PWR_FV1 | RT5663_PWR_FV2); 313162306a36Sopenharmony_ci break; 313262306a36Sopenharmony_ci 313362306a36Sopenharmony_ci default: 313462306a36Sopenharmony_ci break; 313562306a36Sopenharmony_ci } 313662306a36Sopenharmony_ci 313762306a36Sopenharmony_ci return 0; 313862306a36Sopenharmony_ci} 313962306a36Sopenharmony_ci 314062306a36Sopenharmony_cistatic int rt5663_probe(struct snd_soc_component *component) 314162306a36Sopenharmony_ci{ 314262306a36Sopenharmony_ci struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component); 314362306a36Sopenharmony_ci struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); 314462306a36Sopenharmony_ci 314562306a36Sopenharmony_ci rt5663->component = component; 314662306a36Sopenharmony_ci 314762306a36Sopenharmony_ci switch (rt5663->codec_ver) { 314862306a36Sopenharmony_ci case CODEC_VER_1: 314962306a36Sopenharmony_ci snd_soc_dapm_new_controls(dapm, 315062306a36Sopenharmony_ci rt5663_v2_specific_dapm_widgets, 315162306a36Sopenharmony_ci ARRAY_SIZE(rt5663_v2_specific_dapm_widgets)); 315262306a36Sopenharmony_ci snd_soc_dapm_add_routes(dapm, 315362306a36Sopenharmony_ci rt5663_v2_specific_dapm_routes, 315462306a36Sopenharmony_ci ARRAY_SIZE(rt5663_v2_specific_dapm_routes)); 315562306a36Sopenharmony_ci snd_soc_add_component_controls(component, rt5663_v2_specific_controls, 315662306a36Sopenharmony_ci ARRAY_SIZE(rt5663_v2_specific_controls)); 315762306a36Sopenharmony_ci break; 315862306a36Sopenharmony_ci case CODEC_VER_0: 315962306a36Sopenharmony_ci snd_soc_dapm_new_controls(dapm, 316062306a36Sopenharmony_ci rt5663_specific_dapm_widgets, 316162306a36Sopenharmony_ci ARRAY_SIZE(rt5663_specific_dapm_widgets)); 316262306a36Sopenharmony_ci snd_soc_dapm_add_routes(dapm, 316362306a36Sopenharmony_ci rt5663_specific_dapm_routes, 316462306a36Sopenharmony_ci ARRAY_SIZE(rt5663_specific_dapm_routes)); 316562306a36Sopenharmony_ci snd_soc_add_component_controls(component, rt5663_specific_controls, 316662306a36Sopenharmony_ci ARRAY_SIZE(rt5663_specific_controls)); 316762306a36Sopenharmony_ci 316862306a36Sopenharmony_ci if (!rt5663->imp_table) 316962306a36Sopenharmony_ci snd_soc_add_component_controls(component, rt5663_hpvol_controls, 317062306a36Sopenharmony_ci ARRAY_SIZE(rt5663_hpvol_controls)); 317162306a36Sopenharmony_ci break; 317262306a36Sopenharmony_ci } 317362306a36Sopenharmony_ci 317462306a36Sopenharmony_ci return 0; 317562306a36Sopenharmony_ci} 317662306a36Sopenharmony_ci 317762306a36Sopenharmony_cistatic void rt5663_remove(struct snd_soc_component *component) 317862306a36Sopenharmony_ci{ 317962306a36Sopenharmony_ci struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); 318062306a36Sopenharmony_ci 318162306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_RESET, 0); 318262306a36Sopenharmony_ci} 318362306a36Sopenharmony_ci 318462306a36Sopenharmony_ci#ifdef CONFIG_PM 318562306a36Sopenharmony_cistatic int rt5663_suspend(struct snd_soc_component *component) 318662306a36Sopenharmony_ci{ 318762306a36Sopenharmony_ci struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); 318862306a36Sopenharmony_ci 318962306a36Sopenharmony_ci regcache_cache_only(rt5663->regmap, true); 319062306a36Sopenharmony_ci regcache_mark_dirty(rt5663->regmap); 319162306a36Sopenharmony_ci 319262306a36Sopenharmony_ci return 0; 319362306a36Sopenharmony_ci} 319462306a36Sopenharmony_ci 319562306a36Sopenharmony_cistatic int rt5663_resume(struct snd_soc_component *component) 319662306a36Sopenharmony_ci{ 319762306a36Sopenharmony_ci struct rt5663_priv *rt5663 = snd_soc_component_get_drvdata(component); 319862306a36Sopenharmony_ci 319962306a36Sopenharmony_ci regcache_cache_only(rt5663->regmap, false); 320062306a36Sopenharmony_ci regcache_sync(rt5663->regmap); 320162306a36Sopenharmony_ci 320262306a36Sopenharmony_ci rt5663_irq(0, rt5663); 320362306a36Sopenharmony_ci 320462306a36Sopenharmony_ci return 0; 320562306a36Sopenharmony_ci} 320662306a36Sopenharmony_ci#else 320762306a36Sopenharmony_ci#define rt5663_suspend NULL 320862306a36Sopenharmony_ci#define rt5663_resume NULL 320962306a36Sopenharmony_ci#endif 321062306a36Sopenharmony_ci 321162306a36Sopenharmony_ci#define RT5663_STEREO_RATES SNDRV_PCM_RATE_8000_192000 321262306a36Sopenharmony_ci#define RT5663_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \ 321362306a36Sopenharmony_ci SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S8) 321462306a36Sopenharmony_ci 321562306a36Sopenharmony_cistatic const struct snd_soc_dai_ops rt5663_aif_dai_ops = { 321662306a36Sopenharmony_ci .hw_params = rt5663_hw_params, 321762306a36Sopenharmony_ci .set_fmt = rt5663_set_dai_fmt, 321862306a36Sopenharmony_ci .set_sysclk = rt5663_set_dai_sysclk, 321962306a36Sopenharmony_ci .set_pll = rt5663_set_dai_pll, 322062306a36Sopenharmony_ci .set_tdm_slot = rt5663_set_tdm_slot, 322162306a36Sopenharmony_ci .set_bclk_ratio = rt5663_set_bclk_ratio, 322262306a36Sopenharmony_ci}; 322362306a36Sopenharmony_ci 322462306a36Sopenharmony_cistatic struct snd_soc_dai_driver rt5663_dai[] = { 322562306a36Sopenharmony_ci { 322662306a36Sopenharmony_ci .name = "rt5663-aif", 322762306a36Sopenharmony_ci .id = RT5663_AIF, 322862306a36Sopenharmony_ci .playback = { 322962306a36Sopenharmony_ci .stream_name = "AIF Playback", 323062306a36Sopenharmony_ci .channels_min = 1, 323162306a36Sopenharmony_ci .channels_max = 2, 323262306a36Sopenharmony_ci .rates = RT5663_STEREO_RATES, 323362306a36Sopenharmony_ci .formats = RT5663_FORMATS, 323462306a36Sopenharmony_ci }, 323562306a36Sopenharmony_ci .capture = { 323662306a36Sopenharmony_ci .stream_name = "AIF Capture", 323762306a36Sopenharmony_ci .channels_min = 1, 323862306a36Sopenharmony_ci .channels_max = 2, 323962306a36Sopenharmony_ci .rates = RT5663_STEREO_RATES, 324062306a36Sopenharmony_ci .formats = RT5663_FORMATS, 324162306a36Sopenharmony_ci }, 324262306a36Sopenharmony_ci .ops = &rt5663_aif_dai_ops, 324362306a36Sopenharmony_ci }, 324462306a36Sopenharmony_ci}; 324562306a36Sopenharmony_ci 324662306a36Sopenharmony_cistatic const struct snd_soc_component_driver soc_component_dev_rt5663 = { 324762306a36Sopenharmony_ci .probe = rt5663_probe, 324862306a36Sopenharmony_ci .remove = rt5663_remove, 324962306a36Sopenharmony_ci .suspend = rt5663_suspend, 325062306a36Sopenharmony_ci .resume = rt5663_resume, 325162306a36Sopenharmony_ci .set_bias_level = rt5663_set_bias_level, 325262306a36Sopenharmony_ci .controls = rt5663_snd_controls, 325362306a36Sopenharmony_ci .num_controls = ARRAY_SIZE(rt5663_snd_controls), 325462306a36Sopenharmony_ci .dapm_widgets = rt5663_dapm_widgets, 325562306a36Sopenharmony_ci .num_dapm_widgets = ARRAY_SIZE(rt5663_dapm_widgets), 325662306a36Sopenharmony_ci .dapm_routes = rt5663_dapm_routes, 325762306a36Sopenharmony_ci .num_dapm_routes = ARRAY_SIZE(rt5663_dapm_routes), 325862306a36Sopenharmony_ci .set_jack = rt5663_set_jack_detect, 325962306a36Sopenharmony_ci .use_pmdown_time = 1, 326062306a36Sopenharmony_ci .endianness = 1, 326162306a36Sopenharmony_ci}; 326262306a36Sopenharmony_ci 326362306a36Sopenharmony_cistatic const struct regmap_config rt5663_v2_regmap = { 326462306a36Sopenharmony_ci .reg_bits = 16, 326562306a36Sopenharmony_ci .val_bits = 16, 326662306a36Sopenharmony_ci .use_single_read = true, 326762306a36Sopenharmony_ci .use_single_write = true, 326862306a36Sopenharmony_ci .max_register = 0x07fa, 326962306a36Sopenharmony_ci .volatile_reg = rt5663_v2_volatile_register, 327062306a36Sopenharmony_ci .readable_reg = rt5663_v2_readable_register, 327162306a36Sopenharmony_ci .cache_type = REGCACHE_MAPLE, 327262306a36Sopenharmony_ci .reg_defaults = rt5663_v2_reg, 327362306a36Sopenharmony_ci .num_reg_defaults = ARRAY_SIZE(rt5663_v2_reg), 327462306a36Sopenharmony_ci}; 327562306a36Sopenharmony_ci 327662306a36Sopenharmony_cistatic const struct regmap_config rt5663_regmap = { 327762306a36Sopenharmony_ci .reg_bits = 16, 327862306a36Sopenharmony_ci .val_bits = 16, 327962306a36Sopenharmony_ci .use_single_read = true, 328062306a36Sopenharmony_ci .use_single_write = true, 328162306a36Sopenharmony_ci .max_register = 0x03f3, 328262306a36Sopenharmony_ci .volatile_reg = rt5663_volatile_register, 328362306a36Sopenharmony_ci .readable_reg = rt5663_readable_register, 328462306a36Sopenharmony_ci .cache_type = REGCACHE_MAPLE, 328562306a36Sopenharmony_ci .reg_defaults = rt5663_reg, 328662306a36Sopenharmony_ci .num_reg_defaults = ARRAY_SIZE(rt5663_reg), 328762306a36Sopenharmony_ci}; 328862306a36Sopenharmony_ci 328962306a36Sopenharmony_cistatic const struct regmap_config temp_regmap = { 329062306a36Sopenharmony_ci .name = "nocache", 329162306a36Sopenharmony_ci .reg_bits = 16, 329262306a36Sopenharmony_ci .val_bits = 16, 329362306a36Sopenharmony_ci .use_single_read = true, 329462306a36Sopenharmony_ci .use_single_write = true, 329562306a36Sopenharmony_ci .max_register = 0x03f3, 329662306a36Sopenharmony_ci .cache_type = REGCACHE_NONE, 329762306a36Sopenharmony_ci}; 329862306a36Sopenharmony_ci 329962306a36Sopenharmony_cistatic const struct i2c_device_id rt5663_i2c_id[] = { 330062306a36Sopenharmony_ci { "rt5663", 0 }, 330162306a36Sopenharmony_ci {} 330262306a36Sopenharmony_ci}; 330362306a36Sopenharmony_ciMODULE_DEVICE_TABLE(i2c, rt5663_i2c_id); 330462306a36Sopenharmony_ci 330562306a36Sopenharmony_ci#if defined(CONFIG_OF) 330662306a36Sopenharmony_cistatic const struct of_device_id rt5663_of_match[] = { 330762306a36Sopenharmony_ci { .compatible = "realtek,rt5663", }, 330862306a36Sopenharmony_ci {}, 330962306a36Sopenharmony_ci}; 331062306a36Sopenharmony_ciMODULE_DEVICE_TABLE(of, rt5663_of_match); 331162306a36Sopenharmony_ci#endif 331262306a36Sopenharmony_ci 331362306a36Sopenharmony_ci#ifdef CONFIG_ACPI 331462306a36Sopenharmony_cistatic const struct acpi_device_id rt5663_acpi_match[] = { 331562306a36Sopenharmony_ci { "10EC5663", 0}, 331662306a36Sopenharmony_ci {}, 331762306a36Sopenharmony_ci}; 331862306a36Sopenharmony_ciMODULE_DEVICE_TABLE(acpi, rt5663_acpi_match); 331962306a36Sopenharmony_ci#endif 332062306a36Sopenharmony_ci 332162306a36Sopenharmony_cistatic void rt5663_v2_calibrate(struct rt5663_priv *rt5663) 332262306a36Sopenharmony_ci{ 332362306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_BIAS_CUR_8, 0xa402); 332462306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_PWR_DIG_1, 0x0100); 332562306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_RECMIX, 0x4040); 332662306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_DIG_MISC, 0x0001); 332762306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_RC_CLK, 0x0380); 332862306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_GLB_CLK, 0x8000); 332962306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_ADDA_CLK_1, 0x1000); 333062306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_CHOP_DAC_L, 0x3030); 333162306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_CALIB_ADC, 0x3c05); 333262306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_PWR_ANLG_1, 0xa23e); 333362306a36Sopenharmony_ci msleep(40); 333462306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_PWR_ANLG_1, 0xf23e); 333562306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_HP_CALIB_2, 0x0321); 333662306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_HP_CALIB_1, 0xfc00); 333762306a36Sopenharmony_ci msleep(500); 333862306a36Sopenharmony_ci} 333962306a36Sopenharmony_ci 334062306a36Sopenharmony_cistatic void rt5663_calibrate(struct rt5663_priv *rt5663) 334162306a36Sopenharmony_ci{ 334262306a36Sopenharmony_ci int value, count; 334362306a36Sopenharmony_ci 334462306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_RESET, 0x0000); 334562306a36Sopenharmony_ci msleep(20); 334662306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_ANA_BIAS_CUR_4, 0x00a1); 334762306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_RC_CLK, 0x0380); 334862306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_GLB_CLK, 0x8000); 334962306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_ADDA_CLK_1, 0x1000); 335062306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_VREF_RECMIX, 0x0032); 335162306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_HP_IMP_SEN_19, 0x000c); 335262306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_DUMMY_1, 0x0324); 335362306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_DIG_MISC, 0x8001); 335462306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_VREFADJ_OP, 0x0f28); 335562306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_PWR_ANLG_1, 0xa23b); 335662306a36Sopenharmony_ci msleep(30); 335762306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_PWR_ANLG_1, 0xf23b); 335862306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_PWR_ANLG_2, 0x8000); 335962306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_PWR_ANLG_3, 0x0008); 336062306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_PRE_DIV_GATING_1, 0xffff); 336162306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_PRE_DIV_GATING_2, 0xffff); 336262306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_CBJ_1, 0x8c10); 336362306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_IL_CMD_2, 0x00c1); 336462306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_EM_JACK_TYPE_1, 0xb880); 336562306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_EM_JACK_TYPE_2, 0x4110); 336662306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_EM_JACK_TYPE_2, 0x4118); 336762306a36Sopenharmony_ci 336862306a36Sopenharmony_ci count = 0; 336962306a36Sopenharmony_ci while (true) { 337062306a36Sopenharmony_ci regmap_read(rt5663->regmap, RT5663_INT_ST_2, &value); 337162306a36Sopenharmony_ci if (!(value & 0x80)) 337262306a36Sopenharmony_ci usleep_range(10000, 10005); 337362306a36Sopenharmony_ci else 337462306a36Sopenharmony_ci break; 337562306a36Sopenharmony_ci 337662306a36Sopenharmony_ci if (++count > 200) 337762306a36Sopenharmony_ci break; 337862306a36Sopenharmony_ci } 337962306a36Sopenharmony_ci 338062306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_HP_IMP_SEN_19, 0x0000); 338162306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_DEPOP_2, 0x3003); 338262306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_DEPOP_1, 0x0038); 338362306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_DEPOP_1, 0x003b); 338462306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_PWR_DIG_2, 0x8400); 338562306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_PWR_DIG_1, 0x8df8); 338662306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_PWR_ANLG_2, 0x8003); 338762306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_PWR_ANLG_3, 0x018c); 338862306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_HP_CHARGE_PUMP_1, 0x1e32); 338962306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_DUMMY_2, 0x8089); 339062306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_DACREF_LDO, 0x3b0b); 339162306a36Sopenharmony_ci msleep(40); 339262306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_STO_DAC_MIXER, 0x0000); 339362306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_BYPASS_STO_DAC, 0x000c); 339462306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_HP_BIAS, 0xafaa); 339562306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_CHARGE_PUMP_1, 0x2224); 339662306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_HP_OUT_EN, 0x8088); 339762306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_STO_DRE_9, 0x0017); 339862306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_STO_DRE_10, 0x0017); 339962306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_STO1_ADC_MIXER, 0x4040); 340062306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_CHOP_ADC, 0x3000); 340162306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_RECMIX, 0x0005); 340262306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_ADDA_RST, 0xc000); 340362306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_STO1_HPF_ADJ1, 0x3320); 340462306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_HP_CALIB_2, 0x00c9); 340562306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_DUMMY_1, 0x004c); 340662306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_ANA_BIAS_CUR_1, 0x1111); 340762306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_BIAS_CUR_8, 0x4402); 340862306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_CHARGE_PUMP_2, 0x3311); 340962306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_HP_CALIB_1, 0x0069); 341062306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_HP_CALIB_3, 0x06ce); 341162306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_HP_CALIB_1_1, 0x6800); 341262306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_CHARGE_PUMP_2, 0x1100); 341362306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_HP_CALIB_7, 0x0057); 341462306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_HP_CALIB_1_1, 0xe800); 341562306a36Sopenharmony_ci 341662306a36Sopenharmony_ci count = 0; 341762306a36Sopenharmony_ci while (true) { 341862306a36Sopenharmony_ci regmap_read(rt5663->regmap, RT5663_HP_CALIB_1_1, &value); 341962306a36Sopenharmony_ci if (value & 0x8000) 342062306a36Sopenharmony_ci usleep_range(10000, 10005); 342162306a36Sopenharmony_ci else 342262306a36Sopenharmony_ci break; 342362306a36Sopenharmony_ci 342462306a36Sopenharmony_ci if (count > 200) 342562306a36Sopenharmony_ci return; 342662306a36Sopenharmony_ci count++; 342762306a36Sopenharmony_ci } 342862306a36Sopenharmony_ci 342962306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_HP_CALIB_1_1, 0x6200); 343062306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_HP_CALIB_7, 0x0059); 343162306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_HP_CALIB_1_1, 0xe200); 343262306a36Sopenharmony_ci 343362306a36Sopenharmony_ci count = 0; 343462306a36Sopenharmony_ci while (true) { 343562306a36Sopenharmony_ci regmap_read(rt5663->regmap, RT5663_HP_CALIB_1_1, &value); 343662306a36Sopenharmony_ci if (value & 0x8000) 343762306a36Sopenharmony_ci usleep_range(10000, 10005); 343862306a36Sopenharmony_ci else 343962306a36Sopenharmony_ci break; 344062306a36Sopenharmony_ci 344162306a36Sopenharmony_ci if (count > 200) 344262306a36Sopenharmony_ci return; 344362306a36Sopenharmony_ci count++; 344462306a36Sopenharmony_ci } 344562306a36Sopenharmony_ci 344662306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_EM_JACK_TYPE_1, 0xb8e0); 344762306a36Sopenharmony_ci usleep_range(10000, 10005); 344862306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_PWR_ANLG_1, 0x003b); 344962306a36Sopenharmony_ci usleep_range(10000, 10005); 345062306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_PWR_DIG_1, 0x0000); 345162306a36Sopenharmony_ci usleep_range(10000, 10005); 345262306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_DEPOP_1, 0x000b); 345362306a36Sopenharmony_ci usleep_range(10000, 10005); 345462306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_DEPOP_1, 0x0008); 345562306a36Sopenharmony_ci usleep_range(10000, 10005); 345662306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_PWR_ANLG_2, 0x0000); 345762306a36Sopenharmony_ci usleep_range(10000, 10005); 345862306a36Sopenharmony_ci} 345962306a36Sopenharmony_ci 346062306a36Sopenharmony_cistatic int rt5663_parse_dp(struct rt5663_priv *rt5663, struct device *dev) 346162306a36Sopenharmony_ci{ 346262306a36Sopenharmony_ci int table_size; 346362306a36Sopenharmony_ci int ret; 346462306a36Sopenharmony_ci 346562306a36Sopenharmony_ci device_property_read_u32(dev, "realtek,dc_offset_l_manual", 346662306a36Sopenharmony_ci &rt5663->pdata.dc_offset_l_manual); 346762306a36Sopenharmony_ci device_property_read_u32(dev, "realtek,dc_offset_r_manual", 346862306a36Sopenharmony_ci &rt5663->pdata.dc_offset_r_manual); 346962306a36Sopenharmony_ci device_property_read_u32(dev, "realtek,dc_offset_l_manual_mic", 347062306a36Sopenharmony_ci &rt5663->pdata.dc_offset_l_manual_mic); 347162306a36Sopenharmony_ci device_property_read_u32(dev, "realtek,dc_offset_r_manual_mic", 347262306a36Sopenharmony_ci &rt5663->pdata.dc_offset_r_manual_mic); 347362306a36Sopenharmony_ci device_property_read_u32(dev, "realtek,impedance_sensing_num", 347462306a36Sopenharmony_ci &rt5663->pdata.impedance_sensing_num); 347562306a36Sopenharmony_ci 347662306a36Sopenharmony_ci if (rt5663->pdata.impedance_sensing_num) { 347762306a36Sopenharmony_ci table_size = sizeof(struct impedance_mapping_table) * 347862306a36Sopenharmony_ci rt5663->pdata.impedance_sensing_num; 347962306a36Sopenharmony_ci rt5663->imp_table = devm_kzalloc(dev, table_size, GFP_KERNEL); 348062306a36Sopenharmony_ci if (!rt5663->imp_table) 348162306a36Sopenharmony_ci return -ENOMEM; 348262306a36Sopenharmony_ci ret = device_property_read_u32_array(dev, 348362306a36Sopenharmony_ci "realtek,impedance_sensing_table", 348462306a36Sopenharmony_ci (u32 *)rt5663->imp_table, table_size); 348562306a36Sopenharmony_ci if (ret) 348662306a36Sopenharmony_ci return ret; 348762306a36Sopenharmony_ci } 348862306a36Sopenharmony_ci 348962306a36Sopenharmony_ci return 0; 349062306a36Sopenharmony_ci} 349162306a36Sopenharmony_ci 349262306a36Sopenharmony_cistatic int rt5663_i2c_probe(struct i2c_client *i2c) 349362306a36Sopenharmony_ci{ 349462306a36Sopenharmony_ci struct rt5663_platform_data *pdata = dev_get_platdata(&i2c->dev); 349562306a36Sopenharmony_ci struct rt5663_priv *rt5663; 349662306a36Sopenharmony_ci int ret, i; 349762306a36Sopenharmony_ci unsigned int val; 349862306a36Sopenharmony_ci struct regmap *regmap; 349962306a36Sopenharmony_ci 350062306a36Sopenharmony_ci rt5663 = devm_kzalloc(&i2c->dev, sizeof(struct rt5663_priv), 350162306a36Sopenharmony_ci GFP_KERNEL); 350262306a36Sopenharmony_ci 350362306a36Sopenharmony_ci if (rt5663 == NULL) 350462306a36Sopenharmony_ci return -ENOMEM; 350562306a36Sopenharmony_ci 350662306a36Sopenharmony_ci i2c_set_clientdata(i2c, rt5663); 350762306a36Sopenharmony_ci 350862306a36Sopenharmony_ci if (pdata) 350962306a36Sopenharmony_ci rt5663->pdata = *pdata; 351062306a36Sopenharmony_ci else { 351162306a36Sopenharmony_ci ret = rt5663_parse_dp(rt5663, &i2c->dev); 351262306a36Sopenharmony_ci if (ret) 351362306a36Sopenharmony_ci return ret; 351462306a36Sopenharmony_ci } 351562306a36Sopenharmony_ci 351662306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(rt5663->supplies); i++) 351762306a36Sopenharmony_ci rt5663->supplies[i].supply = rt5663_supply_names[i]; 351862306a36Sopenharmony_ci 351962306a36Sopenharmony_ci ret = devm_regulator_bulk_get(&i2c->dev, 352062306a36Sopenharmony_ci ARRAY_SIZE(rt5663->supplies), 352162306a36Sopenharmony_ci rt5663->supplies); 352262306a36Sopenharmony_ci if (ret) { 352362306a36Sopenharmony_ci dev_err(&i2c->dev, "Failed to request supplies: %d\n", ret); 352462306a36Sopenharmony_ci return ret; 352562306a36Sopenharmony_ci } 352662306a36Sopenharmony_ci 352762306a36Sopenharmony_ci /* Set load for regulator. */ 352862306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(rt5663->supplies); i++) { 352962306a36Sopenharmony_ci ret = regulator_set_load(rt5663->supplies[i].consumer, 353062306a36Sopenharmony_ci RT5663_SUPPLY_CURRENT_UA); 353162306a36Sopenharmony_ci if (ret < 0) { 353262306a36Sopenharmony_ci dev_err(&i2c->dev, 353362306a36Sopenharmony_ci "Failed to set regulator load on %s, ret: %d\n", 353462306a36Sopenharmony_ci rt5663->supplies[i].supply, ret); 353562306a36Sopenharmony_ci return ret; 353662306a36Sopenharmony_ci } 353762306a36Sopenharmony_ci } 353862306a36Sopenharmony_ci 353962306a36Sopenharmony_ci ret = regulator_bulk_enable(ARRAY_SIZE(rt5663->supplies), 354062306a36Sopenharmony_ci rt5663->supplies); 354162306a36Sopenharmony_ci 354262306a36Sopenharmony_ci if (ret) { 354362306a36Sopenharmony_ci dev_err(&i2c->dev, "Failed to enable supplies: %d\n", ret); 354462306a36Sopenharmony_ci return ret; 354562306a36Sopenharmony_ci } 354662306a36Sopenharmony_ci msleep(RT5663_POWER_ON_DELAY_MS); 354762306a36Sopenharmony_ci 354862306a36Sopenharmony_ci regmap = devm_regmap_init_i2c(i2c, &temp_regmap); 354962306a36Sopenharmony_ci if (IS_ERR(regmap)) { 355062306a36Sopenharmony_ci ret = PTR_ERR(regmap); 355162306a36Sopenharmony_ci dev_err(&i2c->dev, "Failed to allocate temp register map: %d\n", 355262306a36Sopenharmony_ci ret); 355362306a36Sopenharmony_ci goto err_enable; 355462306a36Sopenharmony_ci } 355562306a36Sopenharmony_ci 355662306a36Sopenharmony_ci ret = regmap_read(regmap, RT5663_VENDOR_ID_2, &val); 355762306a36Sopenharmony_ci if (ret || (val != RT5663_DEVICE_ID_2 && val != RT5663_DEVICE_ID_1)) { 355862306a36Sopenharmony_ci dev_err(&i2c->dev, 355962306a36Sopenharmony_ci "Device with ID register %#x is not rt5663, retry one time.\n", 356062306a36Sopenharmony_ci val); 356162306a36Sopenharmony_ci msleep(100); 356262306a36Sopenharmony_ci regmap_read(regmap, RT5663_VENDOR_ID_2, &val); 356362306a36Sopenharmony_ci } 356462306a36Sopenharmony_ci 356562306a36Sopenharmony_ci switch (val) { 356662306a36Sopenharmony_ci case RT5663_DEVICE_ID_2: 356762306a36Sopenharmony_ci rt5663->regmap = devm_regmap_init_i2c(i2c, &rt5663_v2_regmap); 356862306a36Sopenharmony_ci rt5663->codec_ver = CODEC_VER_1; 356962306a36Sopenharmony_ci break; 357062306a36Sopenharmony_ci case RT5663_DEVICE_ID_1: 357162306a36Sopenharmony_ci rt5663->regmap = devm_regmap_init_i2c(i2c, &rt5663_regmap); 357262306a36Sopenharmony_ci rt5663->codec_ver = CODEC_VER_0; 357362306a36Sopenharmony_ci break; 357462306a36Sopenharmony_ci default: 357562306a36Sopenharmony_ci dev_err(&i2c->dev, 357662306a36Sopenharmony_ci "Device with ID register %#x is not rt5663\n", 357762306a36Sopenharmony_ci val); 357862306a36Sopenharmony_ci ret = -ENODEV; 357962306a36Sopenharmony_ci goto err_enable; 358062306a36Sopenharmony_ci } 358162306a36Sopenharmony_ci 358262306a36Sopenharmony_ci if (IS_ERR(rt5663->regmap)) { 358362306a36Sopenharmony_ci ret = PTR_ERR(rt5663->regmap); 358462306a36Sopenharmony_ci dev_err(&i2c->dev, "Failed to allocate register map: %d\n", 358562306a36Sopenharmony_ci ret); 358662306a36Sopenharmony_ci goto err_enable; 358762306a36Sopenharmony_ci } 358862306a36Sopenharmony_ci 358962306a36Sopenharmony_ci /* reset and calibrate */ 359062306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_RESET, 0); 359162306a36Sopenharmony_ci regcache_cache_bypass(rt5663->regmap, true); 359262306a36Sopenharmony_ci switch (rt5663->codec_ver) { 359362306a36Sopenharmony_ci case CODEC_VER_1: 359462306a36Sopenharmony_ci rt5663_v2_calibrate(rt5663); 359562306a36Sopenharmony_ci break; 359662306a36Sopenharmony_ci case CODEC_VER_0: 359762306a36Sopenharmony_ci rt5663_calibrate(rt5663); 359862306a36Sopenharmony_ci break; 359962306a36Sopenharmony_ci default: 360062306a36Sopenharmony_ci dev_err(&i2c->dev, "%s:Unknown codec type\n", __func__); 360162306a36Sopenharmony_ci } 360262306a36Sopenharmony_ci regcache_cache_bypass(rt5663->regmap, false); 360362306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_RESET, 0); 360462306a36Sopenharmony_ci dev_dbg(&i2c->dev, "calibrate done\n"); 360562306a36Sopenharmony_ci 360662306a36Sopenharmony_ci switch (rt5663->codec_ver) { 360762306a36Sopenharmony_ci case CODEC_VER_1: 360862306a36Sopenharmony_ci break; 360962306a36Sopenharmony_ci case CODEC_VER_0: 361062306a36Sopenharmony_ci ret = regmap_register_patch(rt5663->regmap, rt5663_patch_list, 361162306a36Sopenharmony_ci ARRAY_SIZE(rt5663_patch_list)); 361262306a36Sopenharmony_ci if (ret != 0) 361362306a36Sopenharmony_ci dev_warn(&i2c->dev, 361462306a36Sopenharmony_ci "Failed to apply regmap patch: %d\n", ret); 361562306a36Sopenharmony_ci break; 361662306a36Sopenharmony_ci default: 361762306a36Sopenharmony_ci dev_err(&i2c->dev, "%s:Unknown codec type\n", __func__); 361862306a36Sopenharmony_ci } 361962306a36Sopenharmony_ci 362062306a36Sopenharmony_ci /* GPIO1 as IRQ */ 362162306a36Sopenharmony_ci regmap_update_bits(rt5663->regmap, RT5663_GPIO_1, RT5663_GP1_PIN_MASK, 362262306a36Sopenharmony_ci RT5663_GP1_PIN_IRQ); 362362306a36Sopenharmony_ci /* 4btn inline command debounce */ 362462306a36Sopenharmony_ci regmap_update_bits(rt5663->regmap, RT5663_IL_CMD_5, 362562306a36Sopenharmony_ci RT5663_4BTN_CLK_DEB_MASK, RT5663_4BTN_CLK_DEB_65MS); 362662306a36Sopenharmony_ci 362762306a36Sopenharmony_ci switch (rt5663->codec_ver) { 362862306a36Sopenharmony_ci case CODEC_VER_1: 362962306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_BIAS_CUR_8, 0xa402); 363062306a36Sopenharmony_ci /* JD1 */ 363162306a36Sopenharmony_ci regmap_update_bits(rt5663->regmap, RT5663_AUTO_1MRC_CLK, 363262306a36Sopenharmony_ci RT5663_IRQ_POW_SAV_MASK | RT5663_IRQ_POW_SAV_JD1_MASK, 363362306a36Sopenharmony_ci RT5663_IRQ_POW_SAV_EN | RT5663_IRQ_POW_SAV_JD1_EN); 363462306a36Sopenharmony_ci regmap_update_bits(rt5663->regmap, RT5663_PWR_ANLG_2, 363562306a36Sopenharmony_ci RT5663_PWR_JD1_MASK, RT5663_PWR_JD1); 363662306a36Sopenharmony_ci regmap_update_bits(rt5663->regmap, RT5663_IRQ_1, 363762306a36Sopenharmony_ci RT5663_EN_CB_JD_MASK, RT5663_EN_CB_JD_EN); 363862306a36Sopenharmony_ci 363962306a36Sopenharmony_ci regmap_update_bits(rt5663->regmap, RT5663_HP_LOGIC_2, 364062306a36Sopenharmony_ci RT5663_HP_SIG_SRC1_MASK, RT5663_HP_SIG_SRC1_REG); 364162306a36Sopenharmony_ci regmap_update_bits(rt5663->regmap, RT5663_RECMIX, 364262306a36Sopenharmony_ci RT5663_VREF_BIAS_MASK | RT5663_CBJ_DET_MASK | 364362306a36Sopenharmony_ci RT5663_DET_TYPE_MASK, RT5663_VREF_BIAS_REG | 364462306a36Sopenharmony_ci RT5663_CBJ_DET_EN | RT5663_DET_TYPE_QFN); 364562306a36Sopenharmony_ci /* Set GPIO4 and GPIO8 as input for combo jack */ 364662306a36Sopenharmony_ci regmap_update_bits(rt5663->regmap, RT5663_GPIO_2, 364762306a36Sopenharmony_ci RT5663_GP4_PIN_CONF_MASK, RT5663_GP4_PIN_CONF_INPUT); 364862306a36Sopenharmony_ci regmap_update_bits(rt5663->regmap, RT5663_GPIO_3, 364962306a36Sopenharmony_ci RT5663_GP8_PIN_CONF_MASK, RT5663_GP8_PIN_CONF_INPUT); 365062306a36Sopenharmony_ci regmap_update_bits(rt5663->regmap, RT5663_PWR_ANLG_1, 365162306a36Sopenharmony_ci RT5663_LDO1_DVO_MASK | RT5663_AMP_HP_MASK, 365262306a36Sopenharmony_ci RT5663_LDO1_DVO_0_9V | RT5663_AMP_HP_3X); 365362306a36Sopenharmony_ci break; 365462306a36Sopenharmony_ci case CODEC_VER_0: 365562306a36Sopenharmony_ci regmap_update_bits(rt5663->regmap, RT5663_DIG_MISC, 365662306a36Sopenharmony_ci RT5663_DIG_GATE_CTRL_MASK, RT5663_DIG_GATE_CTRL_EN); 365762306a36Sopenharmony_ci regmap_update_bits(rt5663->regmap, RT5663_AUTO_1MRC_CLK, 365862306a36Sopenharmony_ci RT5663_IRQ_MANUAL_MASK, RT5663_IRQ_MANUAL_EN); 365962306a36Sopenharmony_ci regmap_update_bits(rt5663->regmap, RT5663_IRQ_1, 366062306a36Sopenharmony_ci RT5663_EN_IRQ_JD1_MASK, RT5663_EN_IRQ_JD1_EN); 366162306a36Sopenharmony_ci regmap_update_bits(rt5663->regmap, RT5663_GPIO_1, 366262306a36Sopenharmony_ci RT5663_GPIO1_TYPE_MASK, RT5663_GPIO1_TYPE_EN); 366362306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_VREF_RECMIX, 0x0032); 366462306a36Sopenharmony_ci regmap_update_bits(rt5663->regmap, RT5663_GPIO_2, 366562306a36Sopenharmony_ci RT5663_GP1_PIN_CONF_MASK | RT5663_SEL_GPIO1_MASK, 366662306a36Sopenharmony_ci RT5663_GP1_PIN_CONF_OUTPUT | RT5663_SEL_GPIO1_EN); 366762306a36Sopenharmony_ci regmap_update_bits(rt5663->regmap, RT5663_RECMIX, 366862306a36Sopenharmony_ci RT5663_RECMIX1_BST1_MASK, RT5663_RECMIX1_BST1_ON); 366962306a36Sopenharmony_ci regmap_update_bits(rt5663->regmap, RT5663_TDM_2, 367062306a36Sopenharmony_ci RT5663_DATA_SWAP_ADCDAT1_MASK, 367162306a36Sopenharmony_ci RT5663_DATA_SWAP_ADCDAT1_LL); 367262306a36Sopenharmony_ci break; 367362306a36Sopenharmony_ci default: 367462306a36Sopenharmony_ci dev_err(&i2c->dev, "%s:Unknown codec type\n", __func__); 367562306a36Sopenharmony_ci } 367662306a36Sopenharmony_ci 367762306a36Sopenharmony_ci INIT_DELAYED_WORK(&rt5663->jack_detect_work, rt5663_jack_detect_work); 367862306a36Sopenharmony_ci INIT_DELAYED_WORK(&rt5663->jd_unplug_work, rt5663_jd_unplug_work); 367962306a36Sopenharmony_ci 368062306a36Sopenharmony_ci if (i2c->irq) { 368162306a36Sopenharmony_ci ret = request_irq(i2c->irq, rt5663_irq, 368262306a36Sopenharmony_ci IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING 368362306a36Sopenharmony_ci | IRQF_ONESHOT, "rt5663", rt5663); 368462306a36Sopenharmony_ci if (ret) { 368562306a36Sopenharmony_ci dev_err(&i2c->dev, "%s Failed to reguest IRQ: %d\n", 368662306a36Sopenharmony_ci __func__, ret); 368762306a36Sopenharmony_ci goto err_enable; 368862306a36Sopenharmony_ci } 368962306a36Sopenharmony_ci } 369062306a36Sopenharmony_ci 369162306a36Sopenharmony_ci ret = devm_snd_soc_register_component(&i2c->dev, 369262306a36Sopenharmony_ci &soc_component_dev_rt5663, 369362306a36Sopenharmony_ci rt5663_dai, ARRAY_SIZE(rt5663_dai)); 369462306a36Sopenharmony_ci 369562306a36Sopenharmony_ci if (ret) 369662306a36Sopenharmony_ci goto err_enable; 369762306a36Sopenharmony_ci 369862306a36Sopenharmony_ci return 0; 369962306a36Sopenharmony_ci 370062306a36Sopenharmony_ci 370162306a36Sopenharmony_ci /* 370262306a36Sopenharmony_ci * Error after enabling regulators should goto err_enable 370362306a36Sopenharmony_ci * to disable regulators. 370462306a36Sopenharmony_ci */ 370562306a36Sopenharmony_cierr_enable: 370662306a36Sopenharmony_ci if (i2c->irq) 370762306a36Sopenharmony_ci free_irq(i2c->irq, rt5663); 370862306a36Sopenharmony_ci 370962306a36Sopenharmony_ci regulator_bulk_disable(ARRAY_SIZE(rt5663->supplies), rt5663->supplies); 371062306a36Sopenharmony_ci return ret; 371162306a36Sopenharmony_ci} 371262306a36Sopenharmony_ci 371362306a36Sopenharmony_cistatic void rt5663_i2c_remove(struct i2c_client *i2c) 371462306a36Sopenharmony_ci{ 371562306a36Sopenharmony_ci struct rt5663_priv *rt5663 = i2c_get_clientdata(i2c); 371662306a36Sopenharmony_ci 371762306a36Sopenharmony_ci if (i2c->irq) 371862306a36Sopenharmony_ci free_irq(i2c->irq, rt5663); 371962306a36Sopenharmony_ci 372062306a36Sopenharmony_ci regulator_bulk_disable(ARRAY_SIZE(rt5663->supplies), rt5663->supplies); 372162306a36Sopenharmony_ci} 372262306a36Sopenharmony_ci 372362306a36Sopenharmony_cistatic void rt5663_i2c_shutdown(struct i2c_client *client) 372462306a36Sopenharmony_ci{ 372562306a36Sopenharmony_ci struct rt5663_priv *rt5663 = i2c_get_clientdata(client); 372662306a36Sopenharmony_ci 372762306a36Sopenharmony_ci regmap_write(rt5663->regmap, RT5663_RESET, 0); 372862306a36Sopenharmony_ci} 372962306a36Sopenharmony_ci 373062306a36Sopenharmony_cistatic struct i2c_driver rt5663_i2c_driver = { 373162306a36Sopenharmony_ci .driver = { 373262306a36Sopenharmony_ci .name = "rt5663", 373362306a36Sopenharmony_ci .acpi_match_table = ACPI_PTR(rt5663_acpi_match), 373462306a36Sopenharmony_ci .of_match_table = of_match_ptr(rt5663_of_match), 373562306a36Sopenharmony_ci }, 373662306a36Sopenharmony_ci .probe = rt5663_i2c_probe, 373762306a36Sopenharmony_ci .remove = rt5663_i2c_remove, 373862306a36Sopenharmony_ci .shutdown = rt5663_i2c_shutdown, 373962306a36Sopenharmony_ci .id_table = rt5663_i2c_id, 374062306a36Sopenharmony_ci}; 374162306a36Sopenharmony_cimodule_i2c_driver(rt5663_i2c_driver); 374262306a36Sopenharmony_ci 374362306a36Sopenharmony_ciMODULE_DESCRIPTION("ASoC RT5663 driver"); 374462306a36Sopenharmony_ciMODULE_AUTHOR("Jack Yu <jack.yu@realtek.com>"); 374562306a36Sopenharmony_ciMODULE_LICENSE("GPL v2"); 3746